@@ -38,6 +38,7 @@ MODULE COMPLEX_GEOMETRY
3838REAL(EB), PARAMETER :: MIN_VOL_FACTOR = 5.E-4_EB
3939REAL(EB), PARAMETER :: ADIFF_INFO_FACTOR= 1.E-1_EB
4040REAL(EB), PARAMETER :: SNAP_DIST_FACTOR = 1.E-5_EB
41+ REAL(EB), PARAMETER :: MIN_LENGTH_FACTOR= 1.E-2_EB
4142
4243INTEGER, SAVE :: NGUARD = 5 ! Layers of guard-cells.
4344INTEGER, SAVE :: CCGUARD= 5 - 2 ! Layers of guard cut-cells.
@@ -103,12 +104,12 @@ MODULE COMPLEX_GEOMETRY
103104INTEGER, 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.
107108INTEGER, PARAMETER :: CC_FTYPE_CFGAS = 1 ! A GASPHASE cut-face or cell.
108109INTEGER, PARAMETER :: CC_FTYPE_CFINB = 2 ! An INBOUNDARY cut-face.
109110INTEGER, 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.
112113INTEGER, PARAMETER :: CC_FTYPE_CCGAS = 5 ! A regular gas cut-cell.
113114INTEGER, PARAMETER :: CC_ETYPE_SCINB =12
114115INTEGER, 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:
82118212INTEGER :: 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
82158217CHARACTER(MESSAGE_LENGTH) :: UNLINKED_FILE
82168218INTEGER, SAVE :: LU_UNLNK
82178219LOGICAL, SAVE :: UNLINKED_1ST_CALL=.TRUE.
82188220TYPE (MESH_TYPE), POINTER :: M
8221+ TYPE (CC_CUTCELL_TYPE), POINTER :: CC
82198222
82208223M => MESHES(NM)
82218224
82228225! Initialize UNKZ, used here to define if cell has been noted in linking hierarchy. Assume CCVAR has been allocated:
82238226M%CCVAR(:,:,:,CC_UNKZ) = CC_UNDEFINED
82248227DO 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
82298258ENDDO
82308259
@@ -20339,11 +20368,13 @@ SUBROUTINE GET_CARTCELL_CUTCELLS(NM)
2033920368REAL(EB),ALLOCATABLE, DIMENSION(:) :: VOL ! Cut-cell volumes.
2034020369INTEGER, 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)
2034320374LOGICAL :: INLIST, TEST1, TEST2, NEWFACE
2034420375INTEGER :: NIEDGE, NEF, LOCSEG, JFACE, KFACE, NFACEK, NUM_FACE, NCUTCELL, NCFACE_CUTCELL
2034520376INTEGER :: 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
2034820379INTEGER :: IBNDINT
2034920380LOGICAL, 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
2116721224END 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
2117221283SUBROUTINE CUT_CELL_ARRAY_REALLOC(NM,ICC)
0 commit comments