Skip to content

Commit 187e988

Browse files
authored
Merge pull request #14641 from cxp484/FireX
FireX FDS: Merge with firemodels/master
2 parents a7eb808 + 2140f8a commit 187e988

File tree

1 file changed

+121
-10
lines changed

1 file changed

+121
-10
lines changed

Source/geom.f90

Lines changed: 121 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ MODULE COMPLEX_GEOMETRY
4242
REAL(EB), PARAMETER :: MIN_VOL_FACTOR = 5.E-4_EB
4343
REAL(EB), PARAMETER :: ADIFF_INFO_FACTOR= 1.E-1_EB
4444
REAL(EB), PARAMETER :: SNAP_DIST_FACTOR = 1.E-5_EB
45+
REAL(EB), PARAMETER :: MIN_LENGTH_FACTOR= 1.E-2_EB
4546

4647
INTEGER, SAVE :: NGUARD = 5 ! Layers of guard-cells.
4748
INTEGER, SAVE :: CCGUARD= 5 - 2 ! Layers of guard cut-cells.
@@ -107,12 +108,12 @@ MODULE COMPLEX_GEOMETRY
107108
INTEGER, PARAMETER :: CC_ETYPE_CFINB = 2 ! An INBOUNDARY cut-edge.
108109

109110
! Cut-faces types in FACE_LIST of CUT_CELL:
110-
INTEGER, PARAMETER :: CC_FTYPE_RGGAS = 0 ! This face of a cut-cell is a regular GASPHASE face.
111+
INTEGER, PARAMETER :: CC_FTYPE_RGGAS = 0 ! This face is a regular GASPHASE face.
111112
INTEGER, PARAMETER :: CC_FTYPE_CFGAS = 1 ! A GASPHASE cut-face or cell.
112113
INTEGER, PARAMETER :: CC_FTYPE_CFINB = 2 ! An INBOUNDARY cut-face.
113114
INTEGER, PARAMETER :: CC_FTYPE_SVERT = 3 ! A SOLID Vertex.
114115
! Extra tagging parameters, for RESTRICT_EP:
115-
INTEGER, PARAMETER :: CC_FTYPE_RCGAS = 4 ! A Face between a regular cell and a cut-cell.
116+
INTEGER, PARAMETER :: CC_FTYPE_RCGAS = 4 ! A gas Face between a regular cell and a cut-cell.
116117
INTEGER, PARAMETER :: CC_FTYPE_CCGAS = 5 ! A regular gas cut-cell.
117118
INTEGER, PARAMETER :: CC_ETYPE_SCINB =12
118119
INTEGER, PARAMETER :: CC_ETYPE_RCGAS =14 ! A regular edge next to a cut-face and a regular gasphase face.
@@ -8225,22 +8226,50 @@ SUBROUTINE GET_CELL_LINK_INFO(NM)
82258226

82268227
! Local Variables:
82278228
INTEGER :: ICC,JCC,ICC2,JCC2,JCC_LNK,I,J,K,I_LNK,J_LNK,K_LNK,IFC,IFC2,IFACE,IFACE2,IFACE3,IBOD,IWSEL,VAL_UNKZ,&
8228-
LINK_ITER,INGH,JNGH,KNGH,X1AXIS,ILH,INRM(1:3),DUM,LNK_LEV,ULINK_COUNT,LINK_LEV_UP
8229-
REAL(EB):: AREA,AF,NRML(IAXIS:KAXIS),VAL_CVOL,CCVOL_THRES
8230-
LOGICAL :: QUITLINK_FLG,CRTCELL_FLG,MASK(IAXIS:KAXIS)
8229+
LINK_ITER,INGH,JNGH,KNGH,X1AXIS,ILH,INRM(1:3),DUM,LNK_LEV,ULINK_COUNT,LINK_LEV_UP,AX_MIN,AX_OTHERS(2)
8230+
REAL(EB):: AREA,AF,NRML(IAXIS:KAXIS),VAL_CVOL,CCVOL_THRES, XYZCELL(IAXIS:KAXIS,LOW_IND:HIGH_IND),&
8231+
MINMAX_XYZ_CC(IAXIS:KAXIS,LOW_IND:HIGH_IND),CELL_DELTA(IAXIS:KAXIS)
8232+
LOGICAL :: QUITLINK_FLG,CRTCELL_FLG,MASK(IAXIS:KAXIS),BLOCK_SLIM_IF,SOLID_FACES
82318233
CHARACTER(MESSAGE_LENGTH) :: UNLINKED_FILE
82328234
INTEGER, SAVE :: LU_UNLNK
82338235
LOGICAL, SAVE :: UNLINKED_1ST_CALL=.TRUE.
82348236
TYPE (MESH_TYPE), POINTER :: M
8237+
TYPE (CC_CUTCELL_TYPE), POINTER :: CC
82358238

82368239
M => MESHES(NM)
82378240

82388241
! Initialize UNKZ, used here to define if cell has been noted in linking hierarchy. Assume CCVAR has been allocated:
82398242
M%CCVAR(:,:,:,CC_UNKZ) = CC_UNDEFINED
82408243
DO ICC=1,M%N_CUTCELL_MESH+M%N_GCCUTCELL_MESH
8241-
M%CUT_CELL(ICC)%UNKZ(:) = CC_UNDEFINED
8242-
DO JCC=1,M%CUT_CELL(ICC)%NCELL
8243-
IF (M%CUT_CELL(ICC)%NOADVANCE(JCC)>0) M%CUT_CELL(ICC)%IJK_LINK(1,JCC) = CC_SOLID
8244+
CC => M%CUT_CELL(ICC); I=CC%IJK(IAXIS); J=CC%IJK(JAXIS); K=CC%IJK(KAXIS)
8245+
! Test for sliver trapped cells blocking:
8246+
XYZCELL(IAXIS,LOW_IND) = XFACE(I-1); XYZCELL(IAXIS,HIGH_IND) = XFACE(I);
8247+
XYZCELL(JAXIS,LOW_IND) = YFACE(J-1); XYZCELL(JAXIS,HIGH_IND) = YFACE(J);
8248+
XYZCELL(KAXIS,LOW_IND) = ZFACE(K-1); XYZCELL(KAXIS,HIGH_IND) = ZFACE(K);
8249+
MINMAX_XYZ_CC(IAXIS:KAXIS,LOW_IND) = HUGE(EB)
8250+
MINMAX_XYZ_CC(IAXIS:KAXIS,HIGH_IND)= -HUGE(EB)
8251+
DO JCC=1,CC%NCELL
8252+
! Get cut-cell bounding box:
8253+
CALL CUT_CELL_BOUNDING_BOX(NM,ICC,JCC,XYZCELL,MINMAX_XYZ_CC)
8254+
! Perform Tests:
8255+
DO DUM=IAXIS,KAXIS
8256+
CELL_DELTA(DUM) = ABS(MINMAX_XYZ_CC(DUM,HIGH_IND)-MINMAX_XYZ_CC(DUM,LOW_IND))
8257+
ENDDO
8258+
! Axis with minimum width:
8259+
AX_MIN = MINLOC(CELL_DELTA(IAXIS:KAXIS),DIM=1)
8260+
SELECT CASE(AX_MIN)
8261+
CASE(IAXIS); AX_OTHERS(1:2) = (/ JAXIS, KAXIS /); SOLID_FACES = ALL(M%FCVAR(I-1:I,J,K,CC_FGSC,IAXIS)==CC_SOLID)
8262+
CASE(JAXIS); AX_OTHERS(1:2) = (/ IAXIS, KAXIS /); SOLID_FACES = ALL(M%FCVAR(I,J-1:J,K,CC_FGSC,JAXIS)==CC_SOLID)
8263+
CASE(KAXIS); AX_OTHERS(1:2) = (/ IAXIS, JAXIS /); SOLID_FACES = ALL(M%FCVAR(I,J,K-1:K,CC_FGSC,KAXIS)==CC_SOLID)
8264+
END SELECT
8265+
! Perform Test:
8266+
BLOCK_SLIM_IF = (CELL_DELTA(AX_MIN)<10._EB*MIN_LENGTH_FACTOR*CELL_DELTA(AX_OTHERS(1))) .AND. &
8267+
(CELL_DELTA(AX_MIN)<10._EB*MIN_LENGTH_FACTOR*CELL_DELTA(AX_OTHERS(2)))
8268+
IF(BLOCK_SLIM_IF .AND. SOLID_FACES) CC%NOADVANCE(JCC) = BLOCKED_SMALL_CELL
8269+
ENDDO
8270+
CC%UNKZ(:) = CC_UNDEFINED
8271+
DO JCC=1,CC%NCELL
8272+
IF (CC%NOADVANCE(JCC)>0) CC%IJK_LINK(1,JCC) = CC_SOLID
82448273
ENDDO
82458274
ENDDO
82468275

@@ -20355,11 +20384,13 @@ SUBROUTINE GET_CARTCELL_CUTCELLS(NM)
2035520384
REAL(EB),ALLOCATABLE, DIMENSION(:) :: VOL ! Cut-cell volumes.
2035620385
INTEGER, ALLOCATABLE, DIMENSION(:) :: NOADVANCE
2035720386

20358-
INTEGER :: IFACE, IEDGE, ISEG, SEG(NOD1:NOD2), ICELL, NFACEI
20387+
REAL(EB) :: XYZCELL(IAXIS:KAXIS,LOW_IND:HIGH_IND),MINMAX_XYZ_CC(IAXIS:KAXIS,LOW_IND:HIGH_IND),CELL_DELTA(IAXIS:KAXIS)
20388+
20389+
INTEGER :: IFACE, IEDGE, ISEG, SEG(NOD1:NOD2), ICELL, NFACEI, JCC, AX_MIN, AX_OTHERS(2)
2035920390
LOGICAL :: INLIST, TEST1, TEST2, NEWFACE
2036020391
INTEGER :: NIEDGE, NEF, LOCSEG, JFACE, KFACE, NFACEK, NUM_FACE, NCUTCELL, NCFACE_CUTCELL
2036120392
INTEGER :: DFCT, CFELEM(5), CTVAL, CTVAL2, IBOD, ITRI, IDCF, MAXSEG, N_GAS_CFACES, NIBFACE, THRES, NSPCELL_LIST
20362-
LOGICAL :: CYCLE_CELL
20393+
LOGICAL :: CYCLE_CELL, BLOCK_SLIM_IF
2036320394

2036420395
INTEGER :: IBNDINT
2036520396
LOGICAL, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: IJK_COUNT
@@ -21079,6 +21110,32 @@ SUBROUTINE GET_CARTCELL_CUTCELLS(NM)
2107921110
MESHES(NM)%CUT_CELL(NCUTCELL)%XYZCEN(IAXIS:KAXIS,1:NCELL) = XYZCEN(IAXIS:KAXIS,1:NCELL)
2108021111
MESHES(NM)%CUT_CELL(NCUTCELL)%NOADVANCE(1:NCELL) = NOADVANCE(1:NCELL)
2108121112

21113+
! Test for sliver cells blocking:
21114+
XYZCELL(IAXIS,LOW_IND) = XFACE(I-1); XYZCELL(IAXIS,HIGH_IND) = XFACE(I);
21115+
XYZCELL(JAXIS,LOW_IND) = YFACE(J-1); XYZCELL(JAXIS,HIGH_IND) = YFACE(J);
21116+
XYZCELL(KAXIS,LOW_IND) = ZFACE(K-1); XYZCELL(KAXIS,HIGH_IND) = ZFACE(K);
21117+
MINMAX_XYZ_CC(IAXIS:KAXIS,LOW_IND) = HUGE(EB)
21118+
MINMAX_XYZ_CC(IAXIS:KAXIS,HIGH_IND)= -HUGE(EB)
21119+
DO JCC=1,NCELL
21120+
! Get cut-cell bounding box:
21121+
CALL CUT_CELL_BOUNDING_BOX(NM,NCUTCELL,JCC,XYZCELL,MINMAX_XYZ_CC)
21122+
! Perform Tests:
21123+
DO MYAXIS=IAXIS,KAXIS
21124+
CELL_DELTA(MYAXIS) = ABS(MINMAX_XYZ_CC(MYAXIS,HIGH_IND)-MINMAX_XYZ_CC(MYAXIS,LOW_IND))
21125+
ENDDO
21126+
! Axis with minimum width:
21127+
AX_MIN = MINLOC(CELL_DELTA(IAXIS:KAXIS),DIM=1)
21128+
SELECT CASE(AX_MIN)
21129+
CASE(IAXIS); AX_OTHERS(1:2) = (/ JAXIS, KAXIS /);
21130+
CASE(JAXIS); AX_OTHERS(1:2) = (/ IAXIS, KAXIS /);
21131+
CASE(KAXIS); AX_OTHERS(1:2) = (/ IAXIS, JAXIS /);
21132+
END SELECT
21133+
! Perform Test:
21134+
BLOCK_SLIM_IF = (CELL_DELTA(AX_MIN)<MIN_LENGTH_FACTOR*CELL_DELTA(AX_OTHERS(1))) .AND. &
21135+
(CELL_DELTA(AX_MIN)<MIN_LENGTH_FACTOR*CELL_DELTA(AX_OTHERS(2)))
21136+
IF(BLOCK_SLIM_IF) MESHES(NM)%CUT_CELL(NCUTCELL)%NOADVANCE(JCC) = BLOCKED_SMALL_CELL
21137+
ENDDO
21138+
2108221139
! IF((NM==3 .AND. I==4 .AND. J==6 .AND. K==36)) THEN
2108321140
! WRITE(LU_ERR,*) 'Found LARGE CUTCELL=',&
2108421141
! MESHES(NM)%N_CUTCELL_MESH+MESHES(NM)%N_GCCUTCELL_MESH+1,VOL(1),SIZE(XYZVERT,DIM=2)
@@ -21183,6 +21240,60 @@ END SUBROUTINE REALLOCATE_FACE_CELL_VERTS
2118321240
END SUBROUTINE GET_CARTCELL_CUTCELLS
2118421241

2118521242

21243+
! ------------------------ CUT_CELL_BOUNDING_BOX ------------------------------------
21244+
21245+
SUBROUTINE CUT_CELL_BOUNDING_BOX(NM,ICC,JCC,XYZCELL,MINMAX_XYZ_JCC)
21246+
21247+
! Computes bounding box for cut-cell (ICC,JCC) in mesh NM.
21248+
! Underlaying cartesian cell bounds XYZCELL(IAXIS:KAXIS,LOW_IND:HIGH_IND) has to be provided.
21249+
21250+
INTEGER, INTENT(IN) :: NM,ICC,JCC
21251+
REAL(EB),INTENT(IN) :: XYZCELL(IAXIS:KAXIS,LOW_IND:HIGH_IND)
21252+
REAL(EB),INTENT(OUT):: MINMAX_XYZ_JCC(IAXIS:KAXIS,LOW_IND:HIGH_IND)
21253+
21254+
! Local Variables:
21255+
INTEGER :: IFC,IFACE,LOHI,HILO,X1AXIS,IFCX,JFCX,IVERT,AXIS
21256+
REAL(EB):: XYZFACE(IAXIS:KAXIS,LOW_IND:HIGH_IND),XYZ(IAXIS:KAXIS)
21257+
TYPE(CC_CUTCELL_TYPE), POINTER :: CC
21258+
TYPE(CC_CUTFACE_TYPE), POINTER :: CF
21259+
21260+
CC => MESHES(NM)%CUT_CELL(ICC)
21261+
21262+
! Get cut-cell bounding box:
21263+
MINMAX_XYZ_JCC(IAXIS:KAXIS,LOW_IND) = HUGE(EB)
21264+
MINMAX_XYZ_JCC(IAXIS:KAXIS,HIGH_IND)= -HUGE(EB)
21265+
DO IFC=1,CC%CCELEM(1,JCC) ! Loop over cut-faces boundary of this cell.
21266+
IFACE=CC%CCELEM(IFC+1,JCC)
21267+
LOHI = CC%FACE_LIST(2,IFACE)
21268+
HILO = 3-LOHI ! 2 for LOW_IND, 1 for HIGH_IND
21269+
X1AXIS = CC%FACE_LIST(3,IFACE)
21270+
IFCX = CC%FACE_LIST(4,IFACE)
21271+
JFCX = CC%FACE_LIST(5,IFACE)
21272+
21273+
SELECT CASE(CC%FACE_LIST(1,IFACE))
21274+
CASE(CC_FTYPE_RCGAS) ! Regular Gas face with a regular cell on one side and a cut-cell on the other.
21275+
XYZFACE = XYZCELL; XYZFACE(X1AXIS,HILO) = XYZFACE(X1AXIS,LOHI) ! Same location in X1AXIS for both sides of face.
21276+
DO AXIS=IAXIS,KAXIS
21277+
MINMAX_XYZ_JCC(AXIS,LOW_IND) = MIN(MINMAX_XYZ_JCC(AXIS,LOW_IND) ,XYZFACE(AXIS,LOW_IND))
21278+
MINMAX_XYZ_JCC(AXIS,HIGH_IND)= MAX(MINMAX_XYZ_JCC(AXIS,HIGH_IND),XYZFACE(AXIS,HIGH_IND))
21279+
ENDDO
21280+
21281+
CASE(CC_FTYPE_CFGAS,CC_FTYPE_CFINB) ! GAS or Boundary cut-face:
21282+
CF => MESHES(NM)%CUT_FACE(IFCX)
21283+
DO IVERT=1,CF%CFELEM(1,JFCX)
21284+
XYZ(IAXIS:KAXIS) = CF%XYZVERT(IAXIS:KAXIS,CF%CFELEM(IVERT+1,JFCX))
21285+
DO AXIS=IAXIS,KAXIS
21286+
MINMAX_XYZ_JCC(AXIS,LOW_IND) = MIN(MINMAX_XYZ_JCC(AXIS,LOW_IND) ,XYZ(AXIS))
21287+
MINMAX_XYZ_JCC(AXIS,HIGH_IND)= MAX(MINMAX_XYZ_JCC(AXIS,HIGH_IND),XYZ(AXIS))
21288+
ENDDO
21289+
ENDDO
21290+
21291+
END SELECT
21292+
ENDDO
21293+
21294+
END SUBROUTINE CUT_CELL_BOUNDING_BOX
21295+
21296+
2118621297
! -------------------------CUT_CELL_ARRAY_REALLOC------------------------------------
2118721298

2118821299
SUBROUTINE CUT_CELL_ARRAY_REALLOC(NM,ICC)

0 commit comments

Comments
 (0)