MFIX  2016-1
functions.inc
Go to the documentation of this file.
1 ! This file is included by functions_mod.f
2 
3 ! These function are are defined in this file so it can be included by
4 ! individual subprograms in order to inline the (short) functions
5 ! defined in this file.
6 
7 ! All functions that may benefits from inlining should be defined in this file.
8 
9 ! For code that is not performance-critical, do:
10 
11 ! SUBROUTINE subname
12 ! USE functions
13 ! ...
14 ! END SUBROUTINE subname
15 
16 ! For code that is performance-critical, do:
17 
18 ! SUBROUTINE subname
19 ! ...
20 ! CONTAINS
21 ! INCLUDE 'functions.inc'
22 ! END SUBROUTINE subname
23 
24 !---------------------------------------------------------------------//
25 ! Functions for generating the LOCAL 3-D array index IJK from the
26 ! 1-D indices I, J, and K.
27 !//FUNIJK is moved to compar for debugging purposes - Sreekanth-10/26/99
28 ! FUNIJK (LI, LJ, LK) = c0 + LI + (LJ-jstart3_all(myPE))*c1 + (LK-kstart3_all(myPE))* c2
29 ! funijk(li,lj,lk) = lj + c0 + li*c1 + lk*c2
30  INTEGER FUNCTION funijk(li,lj,lk)
31  USE compar
32  IMPLICIT NONE
33  INTEGER, INTENT(IN) :: LI, LJ, LK
34  funijk = IJK_ARRAY_OF(li,lj,lk)
35  END FUNCTION funijk
36 
37  INTEGER FUNCTION funijk_0(li,lj,lk)
38  USE compar
39  IMPLICIT NONE
40  INTEGER, INTENT(IN) :: LI, LJ, LK
41  funijk_0 = lj + c0 + li*c1 + lk*c2
42  END FUNCTION funijk_0
43 
44 ! Function for generating the LOCAL 3-D array index IJK from the
45 ! the 1-D indices I, J, K and IPROC.
46 ! FUNIJK_PROC(LI, LJ, LK, LIPROC) = 1 + (LI - istart3_all(LIPROC))+ &
47 ! (LJ-jstart3_all(LIPROC))*(iend3_all(LIPROC)-istart3_all(LIPROC)+1) &
48 ! + (LK-kstart3_all(LIPROC))*(jend3_all(LIPROC)-jstart3_all(LIPROC)+1)* &
49 ! (iend3_all(LIPROC)-istart3_all(LIPROC)+1)
50  INTEGER FUNCTION FUNIJK_PROC(LI, LJ, LK, LIPROC)
51  USE compar
52  IMPLICIT NONE
53  INTEGER, INTENT(IN) :: LI, LJ, LK, LIPROC
54  FUNIJK_PROC = 1 + (LJ - jstart3_all(LIPROC))+ &
55  (LI-Istart3_all(LIPROC))*(jend3_all(LIPROC)-jstart3_all(LIPROC)+1) &
56  + (LK-kstart3_all(LIPROC))*(jend3_all(LIPROC)-jstart3_all(LIPROC)+1)* &
57  (iend3_all(LIPROC)-istart3_all(LIPROC)+1)
58  END FUNCTION FUNIJK_PROC
59 
60 ! Function for generating the GLOBAL 3-D array index IJK from the
61 ! 1-D indices I, J, and K.
62 ! FUNIJK_GL (LI, LJ, LK) = 1 + (LI - imin3) + (LJ-jmin3)*(imax3-imin3+1) &
63 ! + (LK-kmin3)*(jmax3-jmin3+1)*(imax3-imin3+1)
64  INTEGER FUNCTION FUNIJK_GL (LI, LJ, LK)
65  USE geometry
66  IMPLICIT NONE
67  INTEGER, INTENT(IN) :: LI, LJ, LK
68  FUNIJK_GL = 1 + (LJ - jmin3) + (LI-imin3)*(jmax3-jmin3+1) &
69  + (LK-kmin3)*(jmax3-jmin3+1)*(imax3-imin3+1)
70  END FUNCTION FUNIJK_GL
71 
72 ! Function for generating the 3-D array index IJK from the 1-D indices
73 ! I, J, and K in IO format
74  INTEGER FUNCTION FUNIJK_IO (LI, LJ, LK)
75  USE geometry
76  IMPLICIT NONE
77  INTEGER, INTENT(IN) :: LI, LJ, LK
78  FUNIJK_IO = 1 + (LI - imin2) + (LJ-jmin2)*(imax2-imin2+1) &
79  + (LK-kmin2)*(jmax2-jmin2+1)*(imax2-imin2+1)
80  END FUNCTION FUNIJK_IO
81 
82 !----------------------------------------------------------------------!
83 ! Function: IS_ON_myPE_OWNS !
84 ! !
85 ! Purpose: Returns TRUE if the I,J,K values point to a computational !
86 ! cell that is OWNED by the current process. !
87 ! !
88 ! o Ownership is defined as belonging to the current PE's domain but !
89 ! as a cell in any of the PE's ghost layers. !
90 ! !
91 ! o Each computational cell is owned by one -and only one- PE. !
92 !----------------------------------------------------------------------!
93  LOGICAL FUNCTION IS_ON_myPE_OWNS(LI, LJ, LK)
94  USE compar
95  IMPLICIT NONE
96 
97  INTEGER, INTENT(IN) :: LI, LJ, LK
98 
99  IS_ON_MYPE_OWNS = &
100  LI >= ISTART .AND. LI <= IEND .AND. &
101  LJ >= JSTART .AND. LJ <= JEND .AND. &
102  LK >= KSTART .AND. LK <= KEND
103 
104  RETURN
105  END FUNCTION IS_ON_MYPE_OWNS
106 
107 !----------------------------------------------------------------------!
108 ! Function: IS_ON_myPE_WOBND !
109 ! !
110 ! Purpose: Returns TRUE if the I,J,K values point to a computational !
111 ! cell that is OWNED by the current process and not a exterior ghost !
112 ! cell. !
113 ! !
114 ! o This is a subset of IS_ON_myPE_OWNS. !
115 ! !
116 ! o Exterior ghost cells are those in cells surrounding the domain. !
117 ! These are cells created to fully define boundary conditions !
118 ! (e.g., I == 1 where X_E(1) == ZERO). !
119 ! !
120 !----------------------------------------------------------------------!
121  LOGICAL FUNCTION IS_ON_myPE_wobnd (LI, LJ, LK)
122  USE compar
123  IMPLICIT NONE
124 
125  INTEGER, INTENT(IN) :: LI, LJ, LK
126 
127  IS_ON_MYPE_WOBND = &
128  LI >= ISTART1 .AND. LI <= IEND1 .AND. &
129  LJ >= JSTART1 .AND. LJ <= JEND1 .AND. &
130  LK >= KSTART1 .AND. LK <= KEND1
131 
132  RETURN
133  END FUNCTION IS_ON_myPE_wobnd
134 
135 !----------------------------------------------------------------------!
136 ! Function: IS_ON_myPE_Plus1Layer !
137 ! !
138 ! Purpose: Returns TRUE if the I,J,K values point to a computational !
139 ! cell that is OWNED by the current process or contained in the fisrt !
140 ! layer of ghost cells seen by the current PE. !
141 ! !
142 ! o This is a superset of IS_ON_myPE_OWNS. !
143 ! !
144 !----------------------------------------------------------------------!
145  LOGICAL FUNCTION IS_ON_myPE_plus1layer (LI, LJ, LK)
146  USE compar
147  IMPLICIT NONE
148 
149  INTEGER, INTENT(IN) :: LI, LJ, LK
150 
151  IS_ON_MYPE_PLUS1LAYER = &
152  LI >= ISTART2 .AND. LI <= IEND2 .AND. &
153  LJ >= JSTART2 .AND. LJ <= JEND2 .AND. &
154  LK >= KSTART2 .AND. LK <= KEND2
155 
156  RETURN
157  END FUNCTION IS_ON_myPE_plus1layer
158 
159 !----------------------------------------------------------------------!
160 ! Function: IS_ON_myPE_Plus2Layer !
161 ! !
162 ! Purpose: Returns TRUE if the I,J,K values point to a computational !
163 ! cell that is OWNED by the current process or contained in the fisrt !
164 ! two layers of ghost cells seen by the current PE. !
165 ! !
166 ! o This is a superset of IS_ON_Plus1Layer. !
167 ! !
168 !----------------------------------------------------------------------!
169  LOGICAL FUNCTION IS_ON_myPE_plus2layers (LI, LJ, LK)
170  USE compar
171  IMPLICIT NONE
172 
173  INTEGER, INTENT(IN) :: LI, LJ, LK
174 
175  IS_ON_MYPE_PLUS2LAYERS = &
176  LI >= ISTART3 .AND. LI <= IEND3 .AND. &
177  LJ >= JSTART3 .AND. LJ <= JEND3 .AND. &
178  LK >= KSTART3 .AND. LK <= KEND3
179 
180  RETURN
181  END FUNCTION IS_ON_myPE_plus2layers
182 
183 !---------------------------------------------------------------------//
184 ! WEST_OF (IJK) = IJK + INCREMENT_FOR_w (CELL_CLASS(IJK))
185 ! EAST_OF (IJK) = IJK + INCREMENT_FOR_e (CELL_CLASS(IJK))
186 ! SOUTH_OF (IJK) = IJK + INCREMENT_FOR_s (CELL_CLASS(IJK))
187 ! NORTH_OF (IJK) = IJK + INCREMENT_FOR_n (CELL_CLASS(IJK))
188 ! BOTTOM_OF(IJK) = IJK + INCREMENT_FOR_b (CELL_CLASS(IJK))
189 ! TOP_OF (IJK) = IJK + INCREMENT_FOR_t (CELL_CLASS(IJK))
190 
191 ! WEST_OF (IJK) = WEST_ARRAY_OF(IJK)
192 ! EAST_OF (IJK) = EAST_ARRAY_OF(IJK)
193 ! SOUTH_OF (IJK) = SOUTH_ARRAY_OF(IJK)
194 ! NORTH_OF (IJK) = NORTH_ARRAY_OF(IJK)
195 ! BOTTOM_OF (IJK) = BOTTOM_ARRAY_OF(IJK)
196 ! TOP_OF (IJK) = TOP_ARRAY_OF(IJK)
197 
198 ! Function for calculating IJKE: EAST_OF, EAST_OF_0
199 ! Returns IPJK if IPJK is not a wall cell else IJK
200  INTEGER FUNCTION EAST_OF (IJK)
202  IMPLICIT NONE
203  INTEGER, INTENT(IN) :: IJK
204  EAST_OF = IJK + INCREMENT_FOR_NB (1,CELL_CLASS(IJK))
205  END FUNCTION EAST_OF
206 
207 ! Function for calculating IJKW: WEST_OF, WEST_OF_0
208 ! Returns IMJK if IMJK is not a wall cell else IJK
209  INTEGER FUNCTION WEST_OF (IJK)
210  USE indices, only: increment_for_nb, cell_class
211  IMPLICIT NONE
212  INTEGER, INTENT(IN) :: IJK
213  WEST_OF = IJK + INCREMENT_FOR_NB (2,CELL_CLASS(IJK))
214  END FUNCTION WEST_OF
215 
216 ! Function for calculating IJKN: NORTH_OF, NORTH_OF_0
217 ! Returns IJPK if IJPK is not a wall cell else IJK
218  INTEGER FUNCTION NORTH_OF (IJK)
219  USE indices, only: increment_for_nb, cell_class
220  IMPLICIT NONE
221  INTEGER, INTENT(IN) :: IJK
222  NORTH_OF = IJK + INCREMENT_FOR_NB (4,CELL_CLASS(IJK))
223  END FUNCTION NORTH_OF
224 
225 ! Function for calculating IJKS: SOUTH_OF, SOUTH_OF_0
226 ! Returns IJMK if IJMK is not a wall cell else IJK
227  INTEGER FUNCTION SOUTH_OF (IJK)
228  USE indices, only: increment_for_nb, cell_class
229  IMPLICIT NONE
230  INTEGER, INTENT(IN) :: IJK
231  SOUTH_OF = IJK + INCREMENT_FOR_NB (3,CELL_CLASS(IJK))
232  END FUNCTION SOUTH_OF
233 
234 ! Function for calculating IJKT: TOP_OF, TOP_OF_0
235 ! Returns IJKP if IJKP is not a wall cell else IJK
236  INTEGER FUNCTION TOP_OF (IJK)
237  USE indices, only: increment_for_nb, cell_class
238  IMPLICIT NONE
239  INTEGER, INTENT(IN) :: IJK
240  TOP_OF = IJK + INCREMENT_FOR_NB (6,CELL_CLASS(IJK))
241  END FUNCTION TOP_OF
242 
243 ! Function for calculating IJKB: BOTTOM_OF, BOTTOM_OF_0
244 ! Returns IJKM if IJKM is not a wall cell else IJK
245  INTEGER FUNCTION BOTTOM_OF(IJK)
246  USE indices, only: increment_for_nb, cell_class
247  IMPLICIT NONE
248  INTEGER, INTENT(IN) :: IJK
249  BOTTOM_OF = IJK + INCREMENT_FOR_NB (5,CELL_CLASS(IJK))
250  END FUNCTION BOTTOM_OF
251 
252 
253  INTEGER FUNCTION WEST_OF_0 (IJK)
254  USE indices, only: increment_for_w, cell_class
255  IMPLICIT NONE
256  INTEGER, INTENT(IN) :: IJK
257  WEST_OF_0 = IJK + INCREMENT_FOR_w (CELL_CLASS(IJK))
258  END FUNCTION WEST_OF_0
259 
260  INTEGER FUNCTION EAST_OF_0 (IJK)
261  USE indices
262  IMPLICIT NONE
263  INTEGER IJK
264  EAST_OF_0 = IJK + INCREMENT_FOR_e (CELL_CLASS(IJK))
265  END FUNCTION EAST_OF_0
266 
267  INTEGER FUNCTION SOUTH_OF_0 (IJK)
268  USE indices
269  IMPLICIT NONE
270  INTEGER IJK
271  SOUTH_OF_0 = IJK + INCREMENT_FOR_s (CELL_CLASS(IJK))
272  END FUNCTION SOUTH_OF_0
273 
274  INTEGER FUNCTION NORTH_OF_0 (IJK)
275  USE indices
276  IMPLICIT NONE
277  INTEGER IJK
278  NORTH_OF_0 = IJK + INCREMENT_FOR_n (CELL_CLASS(IJK))
279  END FUNCTION NORTH_OF_0
280 
281  INTEGER FUNCTION BOTTOM_OF_0(IJK)
282  USE indices
283  IMPLICIT NONE
284  INTEGER IJK
285  BOTTOM_OF_0 = IJK + INCREMENT_FOR_b (CELL_CLASS(IJK))
286  END FUNCTION BOTTOM_OF_0
287 
288  INTEGER FUNCTION TOP_OF_0 (IJK)
289  USE indices
290  IMPLICIT NONE
291  INTEGER IJK
292  TOP_OF_0 = IJK + INCREMENT_FOR_t (CELL_CLASS(IJK))
293  END FUNCTION TOP_OF_0
294 
295 !---------------------------------------------------------------------//
296 ! IM_OF (IJK) = IJK + INCREMENT_FOR_im(CELL_CLASS(IJK))
297 ! IP_OF (IJK) = IJK + INCREMENT_FOR_ip(CELL_CLASS(IJK))
298 ! JM_OF (IJK) = IJK + INCREMENT_FOR_jm(CELL_CLASS(IJK))
299 ! JP_OF (IJK) = IJK + INCREMENT_FOR_jp(CELL_CLASS(IJK))
300 ! KM_OF(IJK) = IJK + INCREMENT_FOR_km(CELL_CLASS(IJK))
301 ! KP_OF (IJK) = IJK + INCREMENT_FOR_kp(CELL_CLASS(IJK))
302 ! IM_OF (IJK) = IM_ARRAY_OF(IJK)
303 ! IP_OF (IJK) = IP_ARRAY_OF(IJK)
304 ! JM_OF (IJK) = JM_ARRAY_OF(IJK)
305 ! JP_OF (IJK) = JP_ARRAY_OF(IJK)
306 ! KM_OF (IJK) = KM_ARRAY_OF(IJK)
307 ! KP_OF (IJK) = KP_ARRAY_OF(IJK)
308 
309 ! Function for calculating IMJK: IM_OF, IM_OF_0
310 ! Returns composite ijk index for i-1, j, k
311  INTEGER FUNCTION IM_OF (IJK)
312  USE indices, only: increment_for_mp, cell_class
313  IMPLICIT NONE
314  INTEGER, INTENT(IN) :: IJK
315  IM_OF = IJK + INCREMENT_FOR_MP(1,CELL_CLASS(IJK))
316  END FUNCTION IM_OF
317 
318 ! Function for calculating IPJK: IP_OF, IP_OF_0
319 ! Returns composite ijk index for i+1, j, k
320  INTEGER FUNCTION IP_OF (IJK)
321  USE indices, only: increment_for_mp, cell_class
322  IMPLICIT NONE
323  INTEGER, INTENT(IN) :: IJK
324  IP_OF = IJK + INCREMENT_FOR_MP(2,CELL_CLASS(IJK))
325  END FUNCTION IP_OF
326 
327 ! Function for calculating IJMK: JM_OF, JM_OF_0
328 ! Returns composite ijk index for i, j-1, k
329  INTEGER FUNCTION JM_OF (IJK)
330  USE indices, only: increment_for_mp, cell_class
331  IMPLICIT NONE
332  INTEGER, INTENT(IN) :: IJK
333  JM_OF = IJK + INCREMENT_FOR_MP(3,CELL_CLASS(IJK))
334  END FUNCTION JM_OF
335 
336 ! Function for calculating IJPK: JP_OF, JP_OF_0
337 ! Returns composite ijk index for i, j+1, k
338  INTEGER FUNCTION JP_OF (IJK)
339  USE indices, only: increment_for_mp, cell_class
340  IMPLICIT NONE
341  INTEGER, INTENT(IN) :: IJK
342  JP_OF = IJK + INCREMENT_FOR_MP(4,CELL_CLASS(IJK))
343  END FUNCTION JP_OF
344 
345 ! Function for calculating IJKM: KM_OF, KM_OF_0
346 ! Returns composite ijk index for i, j, k-1
347  INTEGER FUNCTION KM_OF(IJK)
348  USE indices, only: increment_for_mp, cell_class
349  IMPLICIT NONE
350  INTEGER, INTENT(IN) :: IJK
351  KM_OF = IJK + INCREMENT_FOR_MP(5,CELL_CLASS(IJK))
352  END FUNCTION KM_OF
353 
354 ! Function for calculating IJKP: KP_OF, KP_OF_0
355 ! Returns composite ijk index for i, j, k+1
356  INTEGER FUNCTION KP_OF (IJK)
357  USE indices, only: increment_for_mp, cell_class
358  IMPLICIT NONE
359  INTEGER, INTENT(IN) :: IJK
360  KP_OF = IJK + INCREMENT_FOR_MP(6,CELL_CLASS(IJK))
361  END FUNCTION KP_OF
362 
363  INTEGER FUNCTION IM_OF_0 (IJK)
364  USE indices
365  IMPLICIT NONE
366  INTEGER IJK
367  IM_OF_0 = IJK + INCREMENT_FOR_im(CELL_CLASS(IJK))
368  END FUNCTION IM_OF_0
369 
370  INTEGER FUNCTION IP_OF_0 (IJK)
371  USE indices
372  IMPLICIT NONE
373  INTEGER IJK
374  IP_OF_0 = IJK + INCREMENT_FOR_ip(CELL_CLASS(IJK))
375  END FUNCTION IP_OF_0
376 
377  INTEGER FUNCTION JM_OF_0 (IJK)
378  USE indices
379  IMPLICIT NONE
380  INTEGER IJK
381  JM_OF_0 = IJK + INCREMENT_FOR_jm(CELL_CLASS(IJK))
382  END FUNCTION JM_OF_0
383 
384  INTEGER FUNCTION JP_OF_0 (IJK)
385  USE indices
386  IMPLICIT NONE
387  INTEGER IJK
388  JP_OF_0 = IJK + INCREMENT_FOR_jp(CELL_CLASS(IJK))
389  END FUNCTION JP_OF_0
390 
391  INTEGER FUNCTION KM_OF_0(IJK)
392  USE indices
393  IMPLICIT NONE
394  INTEGER IJK
395  KM_OF_0 = IJK + INCREMENT_FOR_km(CELL_CLASS(IJK))
396  END FUNCTION KM_OF_0
397 
398  INTEGER FUNCTION KP_OF_0 (IJK)
399  USE indices
400  IMPLICIT NONE
401  INTEGER IJK
402  KP_OF_0 = IJK + INCREMENT_FOR_kp(CELL_CLASS(IJK))
403  END FUNCTION KP_OF_0
404 
405 
406 ! logical function to identify various fluid/flow cells
407 !---------------------------------------------------------------------//
408 ! logical function to identify a fluid cell
409  LOGICAL FUNCTION FLUID_AT(IJK)
410  USE geometry, only: flag
411  IMPLICIT NONE
412  INTEGER, INTENT(IN) :: IJK
413  FLUID_AT = FLAG(IJK) .EQ. 1
414  END FUNCTION FLUID_AT
415 
416 ! logical function to identify a specified pressure inflow cell
417  LOGICAL FUNCTION P_FLOW_AT(IJK)
418  USE geometry
419  IMPLICIT NONE
420  INTEGER IJK
421  P_FLOW_AT = FLAG(IJK) .EQ. 10 .OR. &
422  FLAG(IJK) .EQ. 11
423  END FUNCTION P_FLOW_AT
424 
425 ! logical function to identify a specified pressure outflow cell
426  LOGICAL FUNCTION P_OUTFLOW_AT(IJK)
427  USE geometry
428  IMPLICIT NONE
429  INTEGER IJK
430  P_OUTFLOW_AT= FLAG(IJK) .EQ. 11
431  END FUNCTION P_OUTFLOW_AT
432 
433 ! logical function to identify either a specified pressure inflow
434 ! or outflow cell or a fluid cell (simplified check)
435 ! FLUID_AT or P_FLOW_AT (simplified check)
436  LOGICAL FUNCTION FLUIDorP_FLOW_AT(IJK)
437  USE geometry
438  IMPLICIT NONE
439  INTEGER IJK
440  FLUIDorP_FLOW_AT = FLAG(IJK) .LE. 11
441  END FUNCTION FLUIDorP_FLOW_AT
442 
443 ! logical function to identify a specified mass outflow cell
444  LOGICAL FUNCTION MASS_OUTFLOW_AT(IJK)
445  USE geometry
446  IMPLICIT NONE
447  INTEGER IJK
448  MASS_OUTFLOW_AT= FLAG(IJK) .EQ. 21
449  END FUNCTION MASS_OUTFLOW_AT
450 
451 ! logical function to identify a specified outflow cell
452  LOGICAL FUNCTION OUTFLOW_AT(IJK)
453  USE geometry
454  IMPLICIT NONE
455  INTEGER IJK
456  OUTFLOW_AT = FLAG(IJK) .EQ. 31
457  END FUNCTION OUTFLOW_AT
458 
459 ! logical function to identify any type of flow in/out at cell
460 ! pressure inflow/outflow, mass inflow/outflow or outflow
461  LOGICAL FUNCTION FLOW_AT(IJK)
462  USE geometry
463  IMPLICIT NONE
464  INTEGER IJK
465  FLOW_AT = FLAG(IJK) .GE. 10 .AND. FLAG(IJK) .LE. 31
466  END FUNCTION FLOW_AT
467 
468 ! Logical function to identify default walls
469  LOGICAL FUNCTION WALL_AT(IJK)
470  USE geometry
471  IMPLICIT NONE
472  INTEGER IJK
473  WALL_AT = FLAG(IJK) .GE. 100
474  END FUNCTION WALL_AT
475 
476 ! Logical function to identify a No-slip wall cell
477  LOGICAL FUNCTION NS_WALL_AT(IJK)
478  USE geometry
479  IMPLICIT NONE
480  INTEGER IJK
481  NS_WALL_AT = FLAG(IJK) .EQ. 100
482  END FUNCTION NS_WALL_AT
483 
484 ! Logical function to identify a Free-slip wall cell
485  LOGICAL FUNCTION FS_WALL_AT(IJK)
486  USE geometry
487  IMPLICIT NONE
488  INTEGER IJK
489  FS_WALL_AT = FLAG(IJK) .EQ. 101
490  END FUNCTION FS_WALL_AT
491 
492 ! Logical function to identify a Partial-slip wall cell
493  LOGICAL FUNCTION PS_WALL_AT(IJK)
494  USE geometry
495  IMPLICIT NONE
496  INTEGER IJK
497  PS_WALL_AT = FLAG(IJK) .EQ. 102
498  END FUNCTION PS_WALL_AT
499 
500 ! Logical function to identify wall ICBC_FLAG
501  LOGICAL FUNCTION WALL_ICBC_FLAG(IJK)
502  USE geometry
503  IMPLICIT NONE
504  INTEGER, INTENT(IN) :: IJK
505  WALL_ICBC_FLAG = ICBC_FLAG(IJK)(1:1) .EQ. 'W' .OR. &
506  ICBC_FLAG(IJK)(1:1) .EQ. 'S' .OR. &
507  ICBC_FLAG(IJK)(1:1) .EQ. 's' .OR. &
508  ICBC_FLAG(IJK)(1:1) .EQ. 'c' .OR. &
509  ICBC_FLAG(IJK)(1:1) .EQ. 'C'
510  END FUNCTION WALL_ICBC_FLAG
511 
512  LOGICAL FUNCTION DEFAULT_WALL_AT(IJK)
513  USE geometry
514  IMPLICIT NONE
515  INTEGER, INTENT(IN) :: IJK
516  DEFAULT_WALL_AT = ICBC_FLAG(IJK)(2:3) .EQ. '--' .AND. &
517  (ICBC_FLAG(IJK)(1:1) .NE. 'c' .AND. &
518  ICBC_FLAG(IJK)(1:1) .NE. 'C')
519  END FUNCTION DEFAULT_WALL_AT
520 
521 
522 ! Cyclic
523 !---------------------------------------------------------------------//
524  LOGICAL FUNCTION CYCLIC_AT(IJK)
525  USE geometry
526  IMPLICIT NONE
527  INTEGER IJK
528  CYCLIC_AT = FLAG(IJK) .EQ. 106 .OR. &
529  FLAG(IJK) .EQ. 107
530  END FUNCTION CYCLIC_AT
531 
532 ! logical function to identify cyclic condition at east boundary
533  LOGICAL FUNCTION CYCLIC_AT_E(IJK)
534  USE geometry, only: flag_e
535  IMPLICIT NONE
536  INTEGER, INTENT(IN) :: IJK
537  CYCLIC_AT_E = FLAG_E(IJK) .EQ. 2000
538  END FUNCTION CYCLIC_AT_E
539 
540 ! logical function to identify cyclic condition at north boundary
541  LOGICAL FUNCTION CYCLIC_AT_N(IJK)
542  USE geometry, only: flag_n
543  IMPLICIT NONE
544  INTEGER, INTENT(IN) :: IJK
545  CYCLIC_AT_N = FLAG_N(IJK) .EQ. 2000
546  END FUNCTION CYCLIC_AT_N
547 
548 ! logical function to identify cyclic condition at top boundary
549  LOGICAL FUNCTION CYCLIC_AT_T(IJK)
550  USE geometry, only: flag_t
551  IMPLICIT NONE
552  INTEGER, INTENT(IN) :: IJK
553  CYCLIC_AT_T = FLAG_T(IJK) .EQ. 2000
554  END FUNCTION CYCLIC_AT_T
555 
556 
557 ! Flow boundaries
558 !---------------------------------------------------------------------//
559 ! identify flow at east boundary
560  LOGICAL FUNCTION FLOW_AT_E(IJK)
561  USE geometry
562  IMPLICIT NONE
563  INTEGER IJK
564  FLOW_AT_E = FLAG_E(IJK) .GE. 2000 .AND.&
565  FLAG_E(IJK) .LE. 2011
566  END FUNCTION FLOW_AT_E
567 
568 ! identify specified flow north boundary
569  LOGICAL FUNCTION FLOW_AT_N(IJK)
570  USE geometry
571  IMPLICIT NONE
572  INTEGER IJK
573  FLOW_AT_N = FLAG_N(IJK) .GE. 2000 .AND.&
574  FLAG_N(IJK) .LE. 2011
575  END FUNCTION FLOW_AT_N
576 
577 ! identify specified flow top boundary
578  LOGICAL FUNCTION FLOW_AT_T(IJK)
579  USE geometry
580  IMPLICIT NONE
581  INTEGER IJK
582  FLOW_AT_T = FLAG_T(IJK) .GE. 2000 .AND.&
583  FLAG_T(IJK) .LE. 2011
584  END FUNCTION FLOW_AT_T
585 
586 ! identify const. pressure flow top boundary
587  LOGICAL FUNCTION PFLOW_AT_E(IJK)
588  USE geometry
589  IMPLICIT NONE
590  INTEGER IJK
591  PFLOW_AT_E = FLAG_E(IJK) .EQ. 2010 .OR.&
592  FLAG_E(IJK) .EQ. 2011
593  END FUNCTION PFLOW_AT_E
594 
595 ! identify const. pressure flow north boundary
596  LOGICAL FUNCTION PFLOW_AT_N(IJK)
597  USE geometry
598  IMPLICIT NONE
599  INTEGER IJK
600  PFLOW_AT_N = FLAG_N(IJK) .EQ. 2010 .OR.&
601  FLAG_N(IJK) .EQ. 2011
602  END FUNCTION PFLOW_AT_N
603 
604 ! identify const. pressure flow east boundary
605  LOGICAL FUNCTION PFLOW_AT_T(IJK)
606  USE geometry
607  IMPLICIT NONE
608  INTEGER IJK
609  PFLOW_AT_T = FLAG_T(IJK) .EQ. 2010 .OR.&
610  FLAG_T(IJK) .EQ. 2011
611  END FUNCTION PFLOW_AT_T
612 
613 ! identify specified flow east boundary
614  LOGICAL FUNCTION MFLOW_AT_E(IJK)
615  USE geometry
616  IMPLICIT NONE
617  INTEGER IJK
618  MFLOW_AT_E = FLAG_E(IJK) .EQ. 2020 .OR. &
619  FLAG_E(IJK) .EQ. 2021 .OR. &
620  FLAG_E(IJK) .EQ. 2031
621  END FUNCTION MFLOW_AT_E
622 
623 ! identify specified flow north boundary
624  LOGICAL FUNCTION MFLOW_AT_N(IJK)
625  USE geometry
626  IMPLICIT NONE
627  INTEGER IJK
628  MFLOW_AT_N = FLAG_N(IJK) .EQ. 2020 .OR. &
629  FLAG_N(IJK) .EQ. 2021 .OR. &
630  FLAG_N(IJK) .EQ. 2031
631  END FUNCTION MFLOW_AT_N
632 
633 ! identify specified flow top boundary
634  LOGICAL FUNCTION MFLOW_AT_T(IJK)
635  USE geometry
636  IMPLICIT NONE
637  INTEGER IJK
638  MFLOW_AT_T = FLAG_T(IJK) .EQ. 2020 .OR. &
639  FLAG_T(IJK) .EQ. 2021 .OR. &
640  FLAG_T(IJK) .EQ. 2031
641  END FUNCTION MFLOW_AT_T
642 
643 
644 ! Functions to identify a impermeable and/or semi-permeable surface at
645 ! indicated boundary (specific type of internal surface)
646 !---------------------------------------------------------------------//
647 ! Logical function to identify IP (impermeable surface) at East
648 ! of the cell
649  LOGICAL FUNCTION IP_AT_E(IJK)
650  USE geometry
651  IMPLICIT NONE
652  INTEGER IJK
653  IP_AT_E = FLAG_E(IJK) .LT. 1000
654  END FUNCTION IP_AT_E
655 
656 ! Logical function to identify IP (impermeable surface) at North
657 ! of the cell
658  LOGICAL FUNCTION IP_AT_N(IJK)
659  USE geometry
660  IMPLICIT NONE
661  INTEGER IJK
662  IP_AT_N = FLAG_N(IJK) .LT. 1000
663  END FUNCTION IP_AT_N
664 
665 ! Logical function to identify IP (impermeable surface) at Top
666 ! of the cell
667  LOGICAL FUNCTION IP_AT_T(IJK)
668  USE geometry
669  IMPLICIT NONE
670  INTEGER IJK
671  IP_AT_T = FLAG_T(IJK) .LT. 1000
672  END FUNCTION IP_AT_T
673 
674 ! Logical function to identify SP or IP (semi or impermeable surface)
675 ! at east of the cell
676  LOGICAL FUNCTION SIP_AT_E(IJK)
677  USE geometry
678  IMPLICIT NONE
679  INTEGER IJK
680  SIP_AT_E = (FLAG_E(IJK) .LT. 2000)
681  END FUNCTION SIP_AT_E
682 
683 ! Logical function to identify SP or IP (semi or impermeable surface)
684 ! at north of the cell
685  LOGICAL FUNCTION SIP_AT_N(IJK)
686  USE geometry
687  IMPLICIT NONE
688  INTEGER IJK
689  SIP_AT_N = (FLAG_N(IJK) .LT. 2000)
690  END FUNCTION SIP_AT_N
691 
692 ! Logical function to identify SP or IP (semi or impermeable surface)
693 ! at top of the cell
694  LOGICAL FUNCTION SIP_AT_T(IJK)
695  USE geometry
696  IMPLICIT NONE
697  INTEGER IJK
698  SIP_AT_T = (FLAG_T(IJK) .LT. 2000)
699  END FUNCTION SIP_AT_T
700 
701 ! Logical function to identify SP (semi-permeable surface) at east
702 ! of cell
703  LOGICAL FUNCTION SP_AT_E(IJK)
704  USE geometry
705  IMPLICIT NONE
706  INTEGER IJK
707  SP_AT_E = (FLAG_E(IJK) .LT. 2000) .AND. &
708  (FLAG_E(IJK) .GE. 1000)
709  END FUNCTION SP_AT_E
710 
711 ! Logical function to identify SP (semi-permeable surface) at north
712 ! of cell
713  LOGICAL FUNCTION SP_AT_N(IJK)
714  USE geometry
715  IMPLICIT NONE
716  INTEGER IJK
717  SP_AT_N = (FLAG_N(IJK) .LT. 2000) .AND. &
718  (FLAG_N(IJK) .GE. 1000)
719  END FUNCTION SP_AT_N
720 
721 ! Logical function to identify SP (semi-permeable surface) at top
722 ! of cell
723  LOGICAL FUNCTION SP_AT_T(IJK)
724  USE geometry
725  IMPLICIT NONE
726  INTEGER IJK
727  SP_AT_T = (FLAG_T(IJK) .LT. 2000) .AND. &
728  (FLAG_T(IJK) .GE. 1000)
729  END FUNCTION SP_AT_T
730 
731 
732 ! Logical functions concerning general internal surfaces
733 ! Integer functions to return internal surface ID
734 !---------------------------------------------------------------------//
735 ! Internal surface ID for east face
736  INTEGER FUNCTION IS_ID_AT_E(IJK)
737  USE geometry
738  IMPLICIT NONE
739  INTEGER IJK
740  IS_ID_AT_E = FLAG_E(IJK) - 1000
741  END FUNCTION IS_ID_AT_E
742 
743 ! Internal surface ID for north face
744  INTEGER FUNCTION IS_ID_AT_N(IJK)
745  USE geometry
746  IMPLICIT NONE
747  INTEGER IJK
748  IS_ID_AT_N = FLAG_N(IJK) - 1000
749  END FUNCTION IS_ID_AT_N
750 
751 ! Internal surface ID for top face
752  INTEGER FUNCTION IS_ID_AT_T(IJK)
753  USE geometry
754  IMPLICIT NONE
755  INTEGER IJK
756  IS_ID_AT_T = FLAG_T(IJK) - 1000
757  END FUNCTION IS_ID_AT_T
758 
759 ! Logical function to identify IS at East of the cell
760  LOGICAL FUNCTION IS_AT_E(IJK)
761  USE geometry
762  IMPLICIT NONE
763  INTEGER IJK
764  IS_AT_E = FLAG_E(IJK) .LT. 2000
765  END FUNCTION IS_AT_E
766 
767 ! Logical function to identify IS at North of the cell
768  LOGICAL FUNCTION IS_AT_N(IJK)
769  USE geometry
770  IMPLICIT NONE
771  INTEGER IJK
772  IS_AT_N = FLAG_N(IJK) .LT. 2000
773  END FUNCTION IS_AT_N
774 
775 ! Logical function to identify IS at Top of the cell
776  LOGICAL FUNCTION IS_AT_T(IJK)
777  USE geometry
778  IMPLICIT NONE
779  INTEGER IJK
780  IS_AT_T = FLAG_T(IJK) .LT. 2000
781  END FUNCTION IS_AT_T
782 
783 ! Logical function to identify No IS at East of the cell
784  LOGICAL FUNCTION NO_IS_AT_E(IJK)
785  USE geometry
786  IMPLICIT NONE
787  INTEGER IJK
788  NO_IS_AT_E = FLAG_E(IJK) .GE. 2000
789  END FUNCTION NO_IS_AT_E
790 
791 ! Logical function to identify No IS at North of the cell
792  LOGICAL FUNCTION NO_IS_AT_N(IJK)
793  USE geometry
794  IMPLICIT NONE
795  INTEGER IJK
796  NO_IS_AT_N = FLAG_N(IJK) .GE. 2000
797  END FUNCTION NO_IS_AT_N
798 
799 ! Logical function to identify No IS at Top of the cell
800  LOGICAL FUNCTION NO_IS_AT_T(IJK)
801  USE geometry
802  IMPLICIT NONE
803  INTEGER IJK
804  NO_IS_AT_T = FLAG_T(IJK) .GE. 2000
805  END FUNCTION NO_IS_AT_T
806 
807 ! Misc
808 !---------------------------------------------------------------------//
809 ! Function for generating the index for the entries to the upper
810 ! triangle (excluding the diagonal) of an (L,M) matrix.
811  INTEGER FUNCTION FUNLM (L1, L2)
812  USE indices, only: store_lm
813  IMPLICIT NONE
814  INTEGER, INTENT(IN) :: L1, L2
815  FUNLM = STORE_LM (L1, L2)
816  END FUNCTION FUNLM
817 
818 ! Function that returns the maximum of zero or input
819  DOUBLE PRECISION FUNCTION ZMAX(XXX)
820  USE param1, only: zero
821  IMPLICIT NONE
822  DOUBLE PRECISION XXX
823  ZMAX = MAX(XXX, ZERO)
824  END FUNCTION ZMAX
825 
826  LOGICAL FUNCTION IS_NONEXISTENT(PP)
827  USE discretelement, ONLY: PARTICLE_STATE, NONEXISTENT
828  INTEGER, INTENT(IN) :: PP
829  IS_NONEXISTENT = (PARTICLE_STATE(PP)==NONEXISTENT)
830  END FUNCTION IS_NONEXISTENT
831 
832  LOGICAL FUNCTION IS_NORMAL(PP)
833  USE discretelement, ONLY: PARTICLE_STATE, NORMAL_PARTICLE
834  INTEGER, INTENT(IN) :: PP
835  IS_NORMAL = (PARTICLE_STATE(PP)==NORMAL_PARTICLE)
836  END FUNCTION IS_NORMAL
837 
838  LOGICAL FUNCTION IS_ENTERING(PP)
839  USE discretelement, ONLY: PARTICLE_STATE, ENTERING_PARTICLE
840  INTEGER, INTENT(IN) :: PP
841  IS_ENTERING = (PARTICLE_STATE(PP)==ENTERING_PARTICLE)
842  END FUNCTION IS_ENTERING
843 
844  LOGICAL FUNCTION IS_EXITING(PP)
845  USE discretelement, ONLY: PARTICLE_STATE, EXITING_PARTICLE
846  INTEGER, INTENT(IN) :: PP
847  IS_EXITING = (PARTICLE_STATE(PP)==EXITING_PARTICLE)
848  END FUNCTION IS_EXITING
849 
850  LOGICAL FUNCTION IS_GHOST(PP)
851  USE discretelement, ONLY: PARTICLE_STATE, NORMAL_GHOST
852  INTEGER, INTENT(IN) :: PP
853  IS_GHOST = (PARTICLE_STATE(PP)==NORMAL_GHOST)
854  END FUNCTION IS_GHOST
855 
856  LOGICAL FUNCTION IS_ENTERING_GHOST(PP)
857  USE discretelement, ONLY: PARTICLE_STATE, ENTERING_GHOST
858  INTEGER, INTENT(IN) :: PP
859  IS_ENTERING_GHOST = (PARTICLE_STATE(PP)==ENTERING_GHOST)
860  END FUNCTION IS_ENTERING_GHOST
861 
862  LOGICAL FUNCTION IS_EXITING_GHOST(PP)
863  USE discretelement, ONLY: PARTICLE_STATE, EXITING_GHOST
864  INTEGER, INTENT(IN) :: PP
865  IS_EXITING_GHOST = (PARTICLE_STATE(PP)==EXITING_GHOST)
866  END FUNCTION IS_EXITING_GHOST
867 
868  LOGICAL FUNCTION IS_ANY_GHOST(PP)
869  USE discretelement, ONLY: PARTICLE_STATE, NORMAL_GHOST
870  USE discretelement, ONLY: ENTERING_GHOST, EXITING_GHOST
871  INTEGER, INTENT(IN) :: PP
872  IS_ANY_GHOST = ((PARTICLE_STATE(PP)==NORMAL_GHOST) .OR. &
873  (PARTICLE_STATE(PP)==ENTERING_GHOST) .OR. &
874  (PARTICLE_STATE(PP)==EXITING_GHOST))
875  END FUNCTION IS_ANY_GHOST
876 
877  SUBROUTINE SET_NONEXISTENT(PP)
878  USE discretelement, ONLY: PARTICLE_STATE, NONEXISTENT
879  INTEGER, INTENT(IN) :: PP
880  PARTICLE_STATE(PP)=NONEXISTENT
881  END SUBROUTINE SET_NONEXISTENT
882 
883  SUBROUTINE SET_NORMAL(PP)
884  USE discretelement, ONLY: PARTICLE_STATE, NORMAL_PARTICLE
885  USE discretelement, ONLY: iGLOBAL_ID
886  INTEGER, INTENT(IN) :: PP
887  PARTICLE_STATE(PP)=NORMAL_PARTICLE
888  END SUBROUTINE SET_NORMAL
889 
890  SUBROUTINE SET_ENTERING(PP)
891  USE discretelement, ONLY: PARTICLE_STATE, ENTERING_PARTICLE
892  INTEGER, INTENT(IN) :: PP
893  PARTICLE_STATE(PP)=ENTERING_PARTICLE
894  END SUBROUTINE SET_ENTERING
895 
896  SUBROUTINE SET_EXITING(PP)
897  USE discretelement, ONLY: PARTICLE_STATE, EXITING_PARTICLE
898  INTEGER, INTENT(IN) :: PP
899  PARTICLE_STATE(PP)=EXITING_PARTICLE
900  END SUBROUTINE SET_EXITING
901 
902  SUBROUTINE SET_GHOST(PP)
903  USE discretelement, ONLY: PARTICLE_STATE, NORMAL_GHOST
904  INTEGER, INTENT(IN) :: PP
905  PARTICLE_STATE(PP)=NORMAL_GHOST
906  END SUBROUTINE SET_GHOST
907 
908  SUBROUTINE SET_ENTERING_GHOST(PP)
909  USE discretelement, ONLY: PARTICLE_STATE, ENTERING_GHOST
910  INTEGER, INTENT(IN) :: PP
911  PARTICLE_STATE(PP)=ENTERING_GHOST
912  END SUBROUTINE SET_ENTERING_GHOST
913 
914  SUBROUTINE SET_EXITING_GHOST(PP)
915  USE discretelement, ONLY: PARTICLE_STATE, EXITING_GHOST
916  INTEGER, INTENT(IN) :: PP
917  PARTICLE_STATE(PP)=EXITING_GHOST
918  END SUBROUTINE SET_EXITING_GHOST
919 
920  INTEGER FUNCTION BOUND_FUNIJK(pLI, pLJ, pLK)
921  USE compar, only: istart3, iend3, jstart3, jend3, kstart3, kend3
922  IMPLICIT NONE
923  INTEGER pLI, pLJ, pLK
924  BOUND_FUNIJK = FUNIJK ( MIN( IEND3, MAX (ISTART3, pLI) ),&
925  MIN( JEND3, MAX (JSTART3, pLJ) ),&
926  MIN( KEND3, MAX (KSTART3, pLK) ) )
927 
928  END FUNCTION BOUND_FUNIJK
integer iend3
Definition: compar_mod.f:80
integer imax2
Definition: geometry_mod.f:61
integer c0
Definition: compar_mod.f:104
integer jstart3
Definition: compar_mod.f:80
integer, dimension(6, max_class) increment_for_nb
Definition: indices_mod.f:28
integer imax3
Definition: geometry_mod.f:91
double precision, parameter one
Definition: param1_mod.f:29
integer, dimension(15) order
Definition: cutcell_mod.f:410
integer, dimension(:), allocatable iend3_all
Definition: compar_mod.f:65
integer kstart3
Definition: compar_mod.f:80
integer east
Definition: param_mod.f:29
integer, dimension(:,:), allocatable store_lm
Definition: indices_mod.f:39
integer jmin2
Definition: geometry_mod.f:89
integer imin3
Definition: geometry_mod.f:90
Definition: is_mod.f:11
double precision, dimension(:), allocatable a
Definition: scalars_mod.f:29
integer kend3
Definition: compar_mod.f:80
integer c2
Definition: compar_mod.f:104
integer, dimension(:), allocatable kstart3_all
Definition: compar_mod.f:65
integer, dimension(:), allocatable istart3_all
Definition: compar_mod.f:65
integer jend3
Definition: compar_mod.f:80
integer jmax2
Definition: geometry_mod.f:63
integer, dimension(6, max_class) increment_for_mp
Definition: indices_mod.f:27
integer, dimension(:), allocatable jstart3_all
Definition: compar_mod.f:65
integer, dimension(max_class) increment_for_w
Definition: indices_mod.f:17
integer jmax3
Definition: geometry_mod.f:91
integer north
Definition: param_mod.f:37
integer jmin3
Definition: geometry_mod.f:90
subroutine pressure(s, alpha, ni, n, mu, sigma, chi, T, Ti, p)
Definition: pressure.f:15
integer, dimension(:), allocatable flag_e
Definition: geometry_mod.f:103
integer, dimension(:), allocatable jend3_all
Definition: compar_mod.f:65
integer kmin3
Definition: geometry_mod.f:90
integer top
Definition: param_mod.f:45
logical cyclic
Definition: geometry_mod.f:147
integer imin2
Definition: geometry_mod.f:89
double precision, dimension(dimension_c) c
Definition: constant_mod.f:167
integer, dimension(:), allocatable flag
Definition: geometry_mod.f:99
integer istart3
Definition: compar_mod.f:80
integer, dimension(:), allocatable flag_n
Definition: geometry_mod.f:105
double precision, parameter zero
Definition: param1_mod.f:27
integer c1
Definition: compar_mod.f:104
integer, dimension(:), allocatable flag_t
Definition: geometry_mod.f:107
integer kmin2
Definition: geometry_mod.f:89
integer, dimension(:), allocatable cell_class
Definition: indices_mod.f:42