@@ -42,6 +42,7 @@ MODULE COMPLEX_GEOMETRY
4242REAL(EB), PARAMETER :: MIN_VOL_FACTOR = 5.E-4_EB
4343REAL(EB), PARAMETER :: ADIFF_INFO_FACTOR= 1.E-1_EB
4444REAL(EB), PARAMETER :: SNAP_DIST_FACTOR = 1.E-5_EB
45+ REAL(EB), PARAMETER :: MIN_LENGTH_FACTOR= 1.E-2_EB
4546
4647INTEGER, SAVE :: NGUARD = 5 ! Layers of guard-cells.
4748INTEGER, SAVE :: CCGUARD= 5 - 2 ! Layers of guard cut-cells.
@@ -107,12 +108,12 @@ MODULE COMPLEX_GEOMETRY
107108INTEGER, 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.
111112INTEGER, PARAMETER :: CC_FTYPE_CFGAS = 1 ! A GASPHASE cut-face or cell.
112113INTEGER, PARAMETER :: CC_FTYPE_CFINB = 2 ! An INBOUNDARY cut-face.
113114INTEGER, 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.
116117INTEGER, PARAMETER :: CC_FTYPE_CCGAS = 5 ! A regular gas cut-cell.
117118INTEGER, PARAMETER :: CC_ETYPE_SCINB =12
118119INTEGER, 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:
82278228INTEGER :: 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
82318233CHARACTER(MESSAGE_LENGTH) :: UNLINKED_FILE
82328234INTEGER, SAVE :: LU_UNLNK
82338235LOGICAL, SAVE :: UNLINKED_1ST_CALL=.TRUE.
82348236TYPE (MESH_TYPE), POINTER :: M
8237+ TYPE (CC_CUTCELL_TYPE), POINTER :: CC
82358238
82368239M => MESHES(NM)
82378240
82388241! Initialize UNKZ, used here to define if cell has been noted in linking hierarchy. Assume CCVAR has been allocated:
82398242M%CCVAR(:,:,:,CC_UNKZ) = CC_UNDEFINED
82408243DO 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
82458274ENDDO
82468275
@@ -20355,11 +20384,13 @@ SUBROUTINE GET_CARTCELL_CUTCELLS(NM)
2035520384REAL(EB),ALLOCATABLE, DIMENSION(:) :: VOL ! Cut-cell volumes.
2035620385INTEGER, 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)
2035920390LOGICAL :: INLIST, TEST1, TEST2, NEWFACE
2036020391INTEGER :: NIEDGE, NEF, LOCSEG, JFACE, KFACE, NFACEK, NUM_FACE, NCUTCELL, NCFACE_CUTCELL
2036120392INTEGER :: 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
2036420395INTEGER :: IBNDINT
2036520396LOGICAL, 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
2118321240END 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
2118821299SUBROUTINE CUT_CELL_ARRAY_REALLOC(NM,ICC)
0 commit comments