Skip to content

Commit 1eb8a54

Browse files
committed
FDS Source : address highly distorted cut-cells.
1 parent f09872a commit 1eb8a54

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
@@ -38,6 +38,7 @@ MODULE COMPLEX_GEOMETRY
3838
REAL(EB), PARAMETER :: MIN_VOL_FACTOR = 5.E-4_EB
3939
REAL(EB), PARAMETER :: ADIFF_INFO_FACTOR= 1.E-1_EB
4040
REAL(EB), PARAMETER :: SNAP_DIST_FACTOR = 1.E-5_EB
41+
REAL(EB), PARAMETER :: MIN_LENGTH_FACTOR= 1.E-2_EB
4142

4243
INTEGER, SAVE :: NGUARD = 5 ! Layers of guard-cells.
4344
INTEGER, SAVE :: CCGUARD= 5 - 2 ! Layers of guard cut-cells.
@@ -103,12 +104,12 @@ MODULE COMPLEX_GEOMETRY
103104
INTEGER, PARAMETER :: CC_ETYPE_CFINB = 2 ! An INBOUNDARY cut-edge.
104105

105106
! Cut-faces types in FACE_LIST of CUT_CELL:
106-
INTEGER, PARAMETER :: CC_FTYPE_RGGAS = 0 ! This face of a cut-cell is a regular GASPHASE face.
107+
INTEGER, PARAMETER :: CC_FTYPE_RGGAS = 0 ! This face is a regular GASPHASE face.
107108
INTEGER, PARAMETER :: CC_FTYPE_CFGAS = 1 ! A GASPHASE cut-face or cell.
108109
INTEGER, PARAMETER :: CC_FTYPE_CFINB = 2 ! An INBOUNDARY cut-face.
109110
INTEGER, PARAMETER :: CC_FTYPE_SVERT = 3 ! A SOLID Vertex.
110111
! Extra tagging parameters, for RESTRICT_EP:
111-
INTEGER, PARAMETER :: CC_FTYPE_RCGAS = 4 ! A Face between a regular cell and a cut-cell.
112+
INTEGER, PARAMETER :: CC_FTYPE_RCGAS = 4 ! A gas Face between a regular cell and a cut-cell.
112113
INTEGER, PARAMETER :: CC_FTYPE_CCGAS = 5 ! A regular gas cut-cell.
113114
INTEGER, PARAMETER :: CC_ETYPE_SCINB =12
114115
INTEGER, PARAMETER :: CC_ETYPE_RCGAS =14 ! A regular edge next to a cut-face and a regular gasphase face.
@@ -8209,22 +8210,50 @@ SUBROUTINE GET_CELL_LINK_INFO(NM)
82098210

82108211
! Local Variables:
82118212
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,&
8212-
LINK_ITER,INGH,JNGH,KNGH,X1AXIS,ILH,INRM(1:3),DUM,LNK_LEV,ULINK_COUNT,LINK_LEV_UP
8213-
REAL(EB):: AREA,AF,NRML(IAXIS:KAXIS),VAL_CVOL,CCVOL_THRES
8214-
LOGICAL :: QUITLINK_FLG,CRTCELL_FLG,MASK(IAXIS:KAXIS)
8213+
LINK_ITER,INGH,JNGH,KNGH,X1AXIS,ILH,INRM(1:3),DUM,LNK_LEV,ULINK_COUNT,LINK_LEV_UP,AX_MIN,AX_OTHERS(2)
8214+
REAL(EB):: AREA,AF,NRML(IAXIS:KAXIS),VAL_CVOL,CCVOL_THRES, XYZCELL(IAXIS:KAXIS,LOW_IND:HIGH_IND),&
8215+
MINMAX_XYZ_CC(IAXIS:KAXIS,LOW_IND:HIGH_IND),CELL_DELTA(IAXIS:KAXIS)
8216+
LOGICAL :: QUITLINK_FLG,CRTCELL_FLG,MASK(IAXIS:KAXIS),BLOCK_SLIM_IF,SOLID_FACES
82158217
CHARACTER(MESSAGE_LENGTH) :: UNLINKED_FILE
82168218
INTEGER, SAVE :: LU_UNLNK
82178219
LOGICAL, SAVE :: UNLINKED_1ST_CALL=.TRUE.
82188220
TYPE (MESH_TYPE), POINTER :: M
8221+
TYPE (CC_CUTCELL_TYPE), POINTER :: CC
82198222

82208223
M => MESHES(NM)
82218224

82228225
! Initialize UNKZ, used here to define if cell has been noted in linking hierarchy. Assume CCVAR has been allocated:
82238226
M%CCVAR(:,:,:,CC_UNKZ) = CC_UNDEFINED
82248227
DO ICC=1,M%N_CUTCELL_MESH+M%N_GCCUTCELL_MESH
8225-
M%CUT_CELL(ICC)%UNKZ(:) = CC_UNDEFINED
8226-
DO JCC=1,M%CUT_CELL(ICC)%NCELL
8227-
IF (M%CUT_CELL(ICC)%NOADVANCE(JCC)>0) M%CUT_CELL(ICC)%IJK_LINK(1,JCC) = CC_SOLID
8228+
CC => M%CUT_CELL(ICC); I=CC%IJK(IAXIS); J=CC%IJK(JAXIS); K=CC%IJK(KAXIS)
8229+
! Test for sliver trapped cells blocking:
8230+
XYZCELL(IAXIS,LOW_IND) = XFACE(I-1); XYZCELL(IAXIS,HIGH_IND) = XFACE(I);
8231+
XYZCELL(JAXIS,LOW_IND) = YFACE(J-1); XYZCELL(JAXIS,HIGH_IND) = YFACE(J);
8232+
XYZCELL(KAXIS,LOW_IND) = ZFACE(K-1); XYZCELL(KAXIS,HIGH_IND) = ZFACE(K);
8233+
MINMAX_XYZ_CC(IAXIS:KAXIS,LOW_IND) = HUGE(EB)
8234+
MINMAX_XYZ_CC(IAXIS:KAXIS,HIGH_IND)= -HUGE(EB)
8235+
DO JCC=1,CC%NCELL
8236+
! Get cut-cell bounding box:
8237+
CALL CUT_CELL_BOUNDING_BOX(NM,ICC,JCC,XYZCELL,MINMAX_XYZ_CC)
8238+
! Perform Tests:
8239+
DO DUM=IAXIS,KAXIS
8240+
CELL_DELTA(DUM) = ABS(MINMAX_XYZ_CC(DUM,HIGH_IND)-MINMAX_XYZ_CC(DUM,LOW_IND))
8241+
ENDDO
8242+
! Axis with minimum width:
8243+
AX_MIN = MINLOC(CELL_DELTA(IAXIS:KAXIS),DIM=1)
8244+
SELECT CASE(AX_MIN)
8245+
CASE(IAXIS); AX_OTHERS(1:2) = (/ JAXIS, KAXIS /); SOLID_FACES = ALL(M%FCVAR(I-1:I,J,K,CC_FGSC,IAXIS)==CC_SOLID)
8246+
CASE(JAXIS); AX_OTHERS(1:2) = (/ IAXIS, KAXIS /); SOLID_FACES = ALL(M%FCVAR(I,J-1:J,K,CC_FGSC,JAXIS)==CC_SOLID)
8247+
CASE(KAXIS); AX_OTHERS(1:2) = (/ IAXIS, JAXIS /); SOLID_FACES = ALL(M%FCVAR(I,J,K-1:K,CC_FGSC,KAXIS)==CC_SOLID)
8248+
END SELECT
8249+
! Perform Test:
8250+
BLOCK_SLIM_IF = (CELL_DELTA(AX_MIN)<10._EB*MIN_LENGTH_FACTOR*CELL_DELTA(AX_OTHERS(1))) .AND. &
8251+
(CELL_DELTA(AX_MIN)<10._EB*MIN_LENGTH_FACTOR*CELL_DELTA(AX_OTHERS(2)))
8252+
IF(BLOCK_SLIM_IF .AND. SOLID_FACES) CC%NOADVANCE(JCC) = BLOCKED_SMALL_CELL
8253+
ENDDO
8254+
CC%UNKZ(:) = CC_UNDEFINED
8255+
DO JCC=1,CC%NCELL
8256+
IF (CC%NOADVANCE(JCC)>0) CC%IJK_LINK(1,JCC) = CC_SOLID
82288257
ENDDO
82298258
ENDDO
82308259

@@ -20339,11 +20368,13 @@ SUBROUTINE GET_CARTCELL_CUTCELLS(NM)
2033920368
REAL(EB),ALLOCATABLE, DIMENSION(:) :: VOL ! Cut-cell volumes.
2034020369
INTEGER, ALLOCATABLE, DIMENSION(:) :: NOADVANCE
2034120370

20342-
INTEGER :: IFACE, IEDGE, ISEG, SEG(NOD1:NOD2), ICELL, NFACEI
20371+
REAL(EB) :: XYZCELL(IAXIS:KAXIS,LOW_IND:HIGH_IND),MINMAX_XYZ_CC(IAXIS:KAXIS,LOW_IND:HIGH_IND),CELL_DELTA(IAXIS:KAXIS)
20372+
20373+
INTEGER :: IFACE, IEDGE, ISEG, SEG(NOD1:NOD2), ICELL, NFACEI, JCC, AX_MIN, AX_OTHERS(2)
2034320374
LOGICAL :: INLIST, TEST1, TEST2, NEWFACE
2034420375
INTEGER :: NIEDGE, NEF, LOCSEG, JFACE, KFACE, NFACEK, NUM_FACE, NCUTCELL, NCFACE_CUTCELL
2034520376
INTEGER :: DFCT, CFELEM(5), CTVAL, CTVAL2, IBOD, ITRI, IDCF, MAXSEG, N_GAS_CFACES, NIBFACE, THRES, NSPCELL_LIST
20346-
LOGICAL :: CYCLE_CELL
20377+
LOGICAL :: CYCLE_CELL, BLOCK_SLIM_IF
2034720378

2034820379
INTEGER :: IBNDINT
2034920380
LOGICAL, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: IJK_COUNT
@@ -21063,6 +21094,32 @@ SUBROUTINE GET_CARTCELL_CUTCELLS(NM)
2106321094
MESHES(NM)%CUT_CELL(NCUTCELL)%XYZCEN(IAXIS:KAXIS,1:NCELL) = XYZCEN(IAXIS:KAXIS,1:NCELL)
2106421095
MESHES(NM)%CUT_CELL(NCUTCELL)%NOADVANCE(1:NCELL) = NOADVANCE(1:NCELL)
2106521096

21097+
! Test for sliver cells blocking:
21098+
XYZCELL(IAXIS,LOW_IND) = XFACE(I-1); XYZCELL(IAXIS,HIGH_IND) = XFACE(I);
21099+
XYZCELL(JAXIS,LOW_IND) = YFACE(J-1); XYZCELL(JAXIS,HIGH_IND) = YFACE(J);
21100+
XYZCELL(KAXIS,LOW_IND) = ZFACE(K-1); XYZCELL(KAXIS,HIGH_IND) = ZFACE(K);
21101+
MINMAX_XYZ_CC(IAXIS:KAXIS,LOW_IND) = HUGE(EB)
21102+
MINMAX_XYZ_CC(IAXIS:KAXIS,HIGH_IND)= -HUGE(EB)
21103+
DO JCC=1,NCELL
21104+
! Get cut-cell bounding box:
21105+
CALL CUT_CELL_BOUNDING_BOX(NM,NCUTCELL,JCC,XYZCELL,MINMAX_XYZ_CC)
21106+
! Perform Tests:
21107+
DO MYAXIS=IAXIS,KAXIS
21108+
CELL_DELTA(MYAXIS) = ABS(MINMAX_XYZ_CC(MYAXIS,HIGH_IND)-MINMAX_XYZ_CC(MYAXIS,LOW_IND))
21109+
ENDDO
21110+
! Axis with minimum width:
21111+
AX_MIN = MINLOC(CELL_DELTA(IAXIS:KAXIS),DIM=1)
21112+
SELECT CASE(AX_MIN)
21113+
CASE(IAXIS); AX_OTHERS(1:2) = (/ JAXIS, KAXIS /);
21114+
CASE(JAXIS); AX_OTHERS(1:2) = (/ IAXIS, KAXIS /);
21115+
CASE(KAXIS); AX_OTHERS(1:2) = (/ IAXIS, JAXIS /);
21116+
END SELECT
21117+
! Perform Test:
21118+
BLOCK_SLIM_IF = (CELL_DELTA(AX_MIN)<MIN_LENGTH_FACTOR*CELL_DELTA(AX_OTHERS(1))) .AND. &
21119+
(CELL_DELTA(AX_MIN)<MIN_LENGTH_FACTOR*CELL_DELTA(AX_OTHERS(2)))
21120+
IF(BLOCK_SLIM_IF) MESHES(NM)%CUT_CELL(NCUTCELL)%NOADVANCE(JCC) = BLOCKED_SMALL_CELL
21121+
ENDDO
21122+
2106621123
! IF((NM==3 .AND. I==4 .AND. J==6 .AND. K==36)) THEN
2106721124
! WRITE(LU_ERR,*) 'Found LARGE CUTCELL=',&
2106821125
! MESHES(NM)%N_CUTCELL_MESH+MESHES(NM)%N_GCCUTCELL_MESH+1,VOL(1),SIZE(XYZVERT,DIM=2)
@@ -21167,6 +21224,60 @@ END SUBROUTINE REALLOCATE_FACE_CELL_VERTS
2116721224
END SUBROUTINE GET_CARTCELL_CUTCELLS
2116821225

2116921226

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

2117221283
SUBROUTINE CUT_CELL_ARRAY_REALLOC(NM,ICC)

0 commit comments

Comments
 (0)