1 ! This file
is included by functions_mod.f
3 ! These
function are are defined in
this file so it can be included by
5 ! defined in this file.
7 ! All
functions that may benefits from inlining should be defined in this file.
9 ! For code that
is not performance-critical, do:
14 ! END SUBROUTINE subname
16 ! For code that
is performance-critical, do:
22 ! END SUBROUTINE subname
24 !---------------------------------------------------------------------
25 ! Functions for generating the LOCAL 3-D array index IJK from the
29 ! funijk(li,lj,lk) = lj +
c0 + li*
c1 + lk*
c2 30 INTEGER FUNCTION funijk(li,lj,lk)
33 INTEGER, INTENT(IN) :: LI, LJ, LK
34 funijk = IJK_ARRAY_OF(li,lj,lk)
37 INTEGER FUNCTION funijk_0(li,lj,lk)
40 INTEGER, INTENT(IN) :: LI, LJ, LK
41 funijk_0 = lj +
c0 + li*
c1 + lk*
c2 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))+ &
50 INTEGER FUNCTION FUNIJK_PROC(LI, LJ, LK, LIPROC)
53 INTEGER, INTENT(IN) :: LI, LJ, LK, LIPROC
58 END FUNCTION FUNIJK_PROC
60 ! Function for generating the GLOBAL 3-D array index IJK from the
64 INTEGER FUNCTION FUNIJK_GL (LI, LJ, LK)
67 INTEGER, INTENT(IN) :: LI, LJ, LK
70 END FUNCTION FUNIJK_GL
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)
77 INTEGER, INTENT(IN) :: LI, LJ, LK
80 END FUNCTION FUNIJK_IO
82 !----------------------------------------------------------------------!
83 ! Function: IS_ON_myPE_OWNS !
85 ! Purpose: Returns TRUE if the I,J,K values point to
a computational !
86 ! cell that
is OWNED by the current process. !
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. !
91 ! o Each computational cell
is owned by
one -and only
one- PE. !
92 !----------------------------------------------------------------------!
93 LOGICAL FUNCTION IS_ON_myPE_OWNS(LI, LJ, LK)
97 INTEGER, INTENT(IN) :: LI, LJ, LK
100 LI >= ISTART .AND. LI <= IEND .AND. &
101 LJ >= JSTART .AND. LJ <= JEND .AND. &
102 LK >= KSTART .AND. LK <= KEND
105 END FUNCTION IS_ON_MYPE_OWNS
107 !----------------------------------------------------------------------!
108 ! Function: IS_ON_myPE_WOBND !
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 !
114 ! o This
is a subset of IS_ON_myPE_OWNS. !
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). !
120 !----------------------------------------------------------------------!
121 LOGICAL FUNCTION IS_ON_myPE_wobnd (LI, LJ, LK)
125 INTEGER, INTENT(IN) :: LI, LJ, LK
128 LI >= ISTART1 .AND. LI <= IEND1 .AND. &
129 LJ >= JSTART1 .AND. LJ <= JEND1 .AND. &
130 LK >= KSTART1 .AND. LK <= KEND1
133 END FUNCTION IS_ON_myPE_wobnd
135 !----------------------------------------------------------------------!
136 ! Function: IS_ON_myPE_Plus1Layer !
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. !
142 ! o This
is a superset of IS_ON_myPE_OWNS. !
144 !----------------------------------------------------------------------!
145 LOGICAL FUNCTION IS_ON_myPE_plus1layer (LI, LJ, LK)
149 INTEGER, INTENT(IN) :: LI, LJ, LK
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
157 END FUNCTION IS_ON_myPE_plus1layer
159 !----------------------------------------------------------------------!
160 ! Function: IS_ON_myPE_Plus2Layer !
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. !
166 ! o This
is a superset of IS_ON_Plus1Layer. !
168 !----------------------------------------------------------------------!
169 LOGICAL FUNCTION IS_ON_myPE_plus2layers (LI, LJ, LK)
173 INTEGER, INTENT(IN) :: LI, LJ, LK
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
181 END FUNCTION IS_ON_myPE_plus2layers
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))
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)
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)
203 INTEGER, INTENT(IN) :: IJK
204 EAST_OF = IJK + INCREMENT_FOR_NB (1,CELL_CLASS(IJK))
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 212 INTEGER, INTENT(IN) :: IJK
213 WEST_OF = IJK + INCREMENT_FOR_NB (2,CELL_CLASS(IJK))
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 221 INTEGER, INTENT(IN) :: IJK
222 NORTH_OF = IJK + INCREMENT_FOR_NB (4,CELL_CLASS(IJK))
223 END FUNCTION NORTH_OF
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 230 INTEGER, INTENT(IN) :: IJK
231 SOUTH_OF = IJK + INCREMENT_FOR_NB (3,CELL_CLASS(IJK))
232 END FUNCTION SOUTH_OF
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 239 INTEGER, INTENT(IN) :: IJK
240 TOP_OF = IJK + INCREMENT_FOR_NB (6,CELL_CLASS(IJK))
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 248 INTEGER, INTENT(IN) :: IJK
249 BOTTOM_OF = IJK + INCREMENT_FOR_NB (5,CELL_CLASS(IJK))
250 END FUNCTION BOTTOM_OF
253 INTEGER FUNCTION WEST_OF_0 (IJK)
256 INTEGER, INTENT(IN) :: IJK
257 WEST_OF_0 = IJK + INCREMENT_FOR_w (CELL_CLASS(IJK))
258 END FUNCTION WEST_OF_0
260 INTEGER FUNCTION EAST_OF_0 (IJK)
264 EAST_OF_0 = IJK + INCREMENT_FOR_e (CELL_CLASS(IJK))
265 END FUNCTION EAST_OF_0
267 INTEGER FUNCTION SOUTH_OF_0 (IJK)
271 SOUTH_OF_0 = IJK + INCREMENT_FOR_s (CELL_CLASS(IJK))
272 END FUNCTION SOUTH_OF_0
274 INTEGER FUNCTION NORTH_OF_0 (IJK)
278 NORTH_OF_0 = IJK + INCREMENT_FOR_n (CELL_CLASS(IJK))
279 END FUNCTION NORTH_OF_0
281 INTEGER FUNCTION BOTTOM_OF_0(IJK)
285 BOTTOM_OF_0 = IJK + INCREMENT_FOR_b (CELL_CLASS(IJK))
286 END FUNCTION BOTTOM_OF_0
288 INTEGER FUNCTION TOP_OF_0 (IJK)
292 TOP_OF_0 = IJK + INCREMENT_FOR_t (CELL_CLASS(IJK))
293 END FUNCTION TOP_OF_0
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)
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)
314 INTEGER, INTENT(IN) :: IJK
315 IM_OF = IJK + INCREMENT_FOR_MP(1,CELL_CLASS(IJK))
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 323 INTEGER, INTENT(IN) :: IJK
324 IP_OF = IJK + INCREMENT_FOR_MP(2,CELL_CLASS(IJK))
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 332 INTEGER, INTENT(IN) :: IJK
333 JM_OF = IJK + INCREMENT_FOR_MP(3,CELL_CLASS(IJK))
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 341 INTEGER, INTENT(IN) :: IJK
342 JP_OF = IJK + INCREMENT_FOR_MP(4,CELL_CLASS(IJK))
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 350 INTEGER, INTENT(IN) :: IJK
351 KM_OF = IJK + INCREMENT_FOR_MP(5,CELL_CLASS(IJK))
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 359 INTEGER, INTENT(IN) :: IJK
360 KP_OF = IJK + INCREMENT_FOR_MP(6,CELL_CLASS(IJK))
363 INTEGER FUNCTION IM_OF_0 (IJK)
367 IM_OF_0 = IJK + INCREMENT_FOR_im(CELL_CLASS(IJK))
370 INTEGER FUNCTION IP_OF_0 (IJK)
374 IP_OF_0 = IJK + INCREMENT_FOR_ip(CELL_CLASS(IJK))
377 INTEGER FUNCTION JM_OF_0 (IJK)
381 JM_OF_0 = IJK + INCREMENT_FOR_jm(CELL_CLASS(IJK))
384 INTEGER FUNCTION JP_OF_0 (IJK)
388 JP_OF_0 = IJK + INCREMENT_FOR_jp(CELL_CLASS(IJK))
391 INTEGER FUNCTION KM_OF_0(IJK)
395 KM_OF_0 = IJK + INCREMENT_FOR_km(CELL_CLASS(IJK))
398 INTEGER FUNCTION KP_OF_0 (IJK)
402 KP_OF_0 = IJK + INCREMENT_FOR_kp(CELL_CLASS(IJK))
406 ! logical function to identify various fluid/flow cells
407 !---------------------------------------------------------------------
408 ! logical function to identify
a fluid cell
409 LOGICAL FUNCTION FLUID_AT(IJK)
412 INTEGER, INTENT(IN) :: IJK
413 FLUID_AT = FLAG(IJK) .EQ. 1
414 END FUNCTION FLUID_AT
416 ! logical function to identify
a specified
pressure inflow cell
417 LOGICAL FUNCTION P_FLOW_AT(IJK)
421 P_FLOW_AT = FLAG(IJK) .EQ. 10 .OR. &
423 END FUNCTION P_FLOW_AT
425 ! logical function to identify
a specified
pressure outflow cell
426 LOGICAL FUNCTION P_OUTFLOW_AT(IJK)
430 P_OUTFLOW_AT= FLAG(IJK) .EQ. 11
431 END FUNCTION P_OUTFLOW_AT
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)
440 FLUIDorP_FLOW_AT = FLAG(IJK) .LE. 11
441 END FUNCTION FLUIDorP_FLOW_AT
443 ! logical function to identify
a specified mass outflow cell
444 LOGICAL FUNCTION MASS_OUTFLOW_AT(IJK)
448 MASS_OUTFLOW_AT= FLAG(IJK) .EQ. 21
449 END FUNCTION MASS_OUTFLOW_AT
451 ! logical function to identify
a specified outflow cell
452 LOGICAL FUNCTION OUTFLOW_AT(IJK)
456 OUTFLOW_AT = FLAG(IJK) .EQ. 31
457 END FUNCTION OUTFLOW_AT
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)
465 FLOW_AT = FLAG(IJK) .GE. 10 .AND. FLAG(IJK) .LE. 31
468 ! Logical function to identify default walls
469 LOGICAL FUNCTION WALL_AT(IJK)
473 WALL_AT = FLAG(IJK) .GE. 100
476 ! Logical function to identify
a No-slip wall cell
477 LOGICAL FUNCTION NS_WALL_AT(IJK)
481 NS_WALL_AT = FLAG(IJK) .EQ. 100
482 END FUNCTION NS_WALL_AT
484 ! Logical function to identify
a Free-slip wall cell
485 LOGICAL FUNCTION FS_WALL_AT(IJK)
489 FS_WALL_AT = FLAG(IJK) .EQ. 101
490 END FUNCTION FS_WALL_AT
492 ! Logical function to identify
a Partial-slip wall cell
493 LOGICAL FUNCTION PS_WALL_AT(IJK)
497 PS_WALL_AT = FLAG(IJK) .EQ. 102
498 END FUNCTION PS_WALL_AT
500 ! Logical function to identify wall ICBC_FLAG
501 LOGICAL FUNCTION WALL_ICBC_FLAG(IJK)
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
512 LOGICAL FUNCTION DEFAULT_WALL_AT(IJK)
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
523 !---------------------------------------------------------------------
524 LOGICAL FUNCTION CYCLIC_AT(IJK)
528 CYCLIC_AT = FLAG(IJK) .EQ. 106 .OR. &
530 END FUNCTION CYCLIC_AT
532 ! logical function to identify
cyclic condition at
east boundary
533 LOGICAL FUNCTION CYCLIC_AT_E(IJK)
534 USE geometry, only:
flag_e 536 INTEGER, INTENT(IN) :: IJK
537 CYCLIC_AT_E = FLAG_E(IJK) .EQ. 2000
538 END FUNCTION CYCLIC_AT_E
540 ! logical function to identify
cyclic condition at
north boundary
541 LOGICAL FUNCTION CYCLIC_AT_N(IJK)
542 USE geometry, only:
flag_n 544 INTEGER, INTENT(IN) :: IJK
545 CYCLIC_AT_N = FLAG_N(IJK) .EQ. 2000
546 END FUNCTION CYCLIC_AT_N
548 ! logical function to identify
cyclic condition at
top boundary
549 LOGICAL FUNCTION CYCLIC_AT_T(IJK)
550 USE geometry, only:
flag_t 552 INTEGER, INTENT(IN) :: IJK
553 CYCLIC_AT_T = FLAG_T(IJK) .EQ. 2000
554 END FUNCTION CYCLIC_AT_T
558 !---------------------------------------------------------------------
559 ! identify flow at
east boundary
560 LOGICAL FUNCTION FLOW_AT_E(IJK)
564 FLOW_AT_E = FLAG_E(IJK) .GE. 2000 .AND.&
565 FLAG_E(IJK) .LE. 2011
566 END FUNCTION FLOW_AT_E
568 ! identify specified flow
north boundary
569 LOGICAL FUNCTION FLOW_AT_N(IJK)
573 FLOW_AT_N = FLAG_N(IJK) .GE. 2000 .AND.&
574 FLAG_N(IJK) .LE. 2011
575 END FUNCTION FLOW_AT_N
577 ! identify specified flow
top boundary
578 LOGICAL FUNCTION FLOW_AT_T(IJK)
582 FLOW_AT_T = FLAG_T(IJK) .GE. 2000 .AND.&
583 FLAG_T(IJK) .LE. 2011
584 END FUNCTION FLOW_AT_T
587 LOGICAL FUNCTION PFLOW_AT_E(IJK)
591 PFLOW_AT_E = FLAG_E(IJK) .EQ. 2010 .OR.&
592 FLAG_E(IJK) .EQ. 2011
593 END FUNCTION PFLOW_AT_E
596 LOGICAL FUNCTION PFLOW_AT_N(IJK)
600 PFLOW_AT_N = FLAG_N(IJK) .EQ. 2010 .OR.&
601 FLAG_N(IJK) .EQ. 2011
602 END FUNCTION PFLOW_AT_N
605 LOGICAL FUNCTION PFLOW_AT_T(IJK)
609 PFLOW_AT_T = FLAG_T(IJK) .EQ. 2010 .OR.&
610 FLAG_T(IJK) .EQ. 2011
611 END FUNCTION PFLOW_AT_T
613 ! identify specified flow
east boundary
614 LOGICAL FUNCTION MFLOW_AT_E(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
623 ! identify specified flow
north boundary
624 LOGICAL FUNCTION MFLOW_AT_N(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
633 ! identify specified flow
top boundary
634 LOGICAL FUNCTION MFLOW_AT_T(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
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
649 LOGICAL FUNCTION IP_AT_E(IJK)
653 IP_AT_E = FLAG_E(IJK) .LT. 1000
656 ! Logical function to identify IP (impermeable surface) at North
658 LOGICAL FUNCTION IP_AT_N(IJK)
662 IP_AT_N = FLAG_N(IJK) .LT. 1000
665 ! Logical function to identify IP (impermeable surface) at Top
667 LOGICAL FUNCTION IP_AT_T(IJK)
671 IP_AT_T = FLAG_T(IJK) .LT. 1000
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)
680 SIP_AT_E = (FLAG_E(IJK) .LT. 2000)
681 END FUNCTION SIP_AT_E
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)
689 SIP_AT_N = (FLAG_N(IJK) .LT. 2000)
690 END FUNCTION SIP_AT_N
692 ! Logical function to identify SP or IP (semi or impermeable surface)
694 LOGICAL FUNCTION SIP_AT_T(IJK)
698 SIP_AT_T = (FLAG_T(IJK) .LT. 2000)
699 END FUNCTION SIP_AT_T
701 ! Logical function to identify SP (semi-permeable surface) at
east 703 LOGICAL FUNCTION SP_AT_E(IJK)
707 SP_AT_E = (FLAG_E(IJK) .LT. 2000) .AND. &
708 (FLAG_E(IJK) .GE. 1000)
711 ! Logical function to identify SP (semi-permeable surface) at
north 713 LOGICAL FUNCTION SP_AT_N(IJK)
717 SP_AT_N = (FLAG_N(IJK) .LT. 2000) .AND. &
718 (FLAG_N(IJK) .GE. 1000)
721 ! Logical function to identify SP (semi-permeable surface) at
top 723 LOGICAL FUNCTION SP_AT_T(IJK)
727 SP_AT_T = (FLAG_T(IJK) .LT. 2000) .AND. &
728 (FLAG_T(IJK) .GE. 1000)
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)
740 IS_ID_AT_E = FLAG_E(IJK) - 1000
741 END FUNCTION IS_ID_AT_E
743 ! Internal surface ID for
north face
744 INTEGER FUNCTION IS_ID_AT_N(IJK)
748 IS_ID_AT_N = FLAG_N(IJK) - 1000
749 END FUNCTION IS_ID_AT_N
751 ! Internal surface ID for
top face
752 INTEGER FUNCTION IS_ID_AT_T(IJK)
756 IS_ID_AT_T = FLAG_T(IJK) - 1000
757 END FUNCTION IS_ID_AT_T
759 ! Logical function to identify IS at East of the cell
760 LOGICAL FUNCTION IS_AT_E(IJK)
764 IS_AT_E = FLAG_E(IJK) .LT. 2000
767 ! Logical function to identify IS at North of the cell
768 LOGICAL FUNCTION IS_AT_N(IJK)
772 IS_AT_N = FLAG_N(IJK) .LT. 2000
775 ! Logical function to identify IS at Top of the cell
776 LOGICAL FUNCTION IS_AT_T(IJK)
780 IS_AT_T = FLAG_T(IJK) .LT. 2000
783 ! Logical function to identify No IS at East of the cell
784 LOGICAL FUNCTION NO_IS_AT_E(IJK)
788 NO_IS_AT_E = FLAG_E(IJK) .GE. 2000
789 END FUNCTION NO_IS_AT_E
791 ! Logical function to identify No IS at North of the cell
792 LOGICAL FUNCTION NO_IS_AT_N(IJK)
796 NO_IS_AT_N = FLAG_N(IJK) .GE. 2000
797 END FUNCTION NO_IS_AT_N
799 ! Logical function to identify No IS at Top of the cell
800 LOGICAL FUNCTION NO_IS_AT_T(IJK)
804 NO_IS_AT_T = FLAG_T(IJK) .GE. 2000
805 END FUNCTION NO_IS_AT_T
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)
814 INTEGER, INTENT(IN) :: L1, L2
815 FUNLM = STORE_LM (L1, L2)
818 ! Function that returns the maximum of
zero or input
819 DOUBLE PRECISION FUNCTION ZMAX(XXX)
823 ZMAX = MAX(XXX, ZERO)
826 LOGICAL FUNCTION IS_NONEXISTENT(PP)
828 INTEGER, INTENT(IN) :: PP
829 IS_NONEXISTENT = (PARTICLE_STATE(PP)==NONEXISTENT)
830 END FUNCTION IS_NONEXISTENT
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
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
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
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
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
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
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
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
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
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
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
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
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
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
920 INTEGER FUNCTION BOUND_FUNIJK(pLI, pLJ, pLK)
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) ) )
928 END FUNCTION BOUND_FUNIJK
integer, dimension(6, max_class) increment_for_nb
double precision, parameter one
integer, dimension(15) order
integer, dimension(:), allocatable iend3_all
integer, dimension(:,:), allocatable store_lm
double precision, dimension(:), allocatable a
integer, dimension(:), allocatable kstart3_all
integer, dimension(:), allocatable istart3_all
integer, dimension(6, max_class) increment_for_mp
integer, dimension(:), allocatable jstart3_all
integer, dimension(max_class) increment_for_w
subroutine pressure(s, alpha, ni, n, mu, sigma, chi, T, Ti, p)
integer, dimension(:), allocatable flag_e
integer, dimension(:), allocatable jend3_all
double precision, dimension(dimension_c) c
integer, dimension(:), allocatable flag
integer, dimension(:), allocatable flag_n
double precision, parameter zero
integer, dimension(:), allocatable flag_t
integer, dimension(:), allocatable cell_class