Skip to content

Commit 369a20b

Browse files
Merge pull request #16282 from marcosvanella/master
FDS Source: improve mesh consistency for blocking in refinement region.
2 parents e238356 + d72933a commit 369a20b

1 file changed

Lines changed: 47 additions & 107 deletions

File tree

Source/geom.f90

Lines changed: 47 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1514,6 +1514,7 @@ SUBROUTINE SET_CUTCELLS_3D
15141514

15151515
! Exchange CC%NOADVANCE(JCC)>0 information among NEIGHBOURING meshes:
15161516
CALL EXCHANGE_CC_NOADVANCE_INFO
1517+
CALL APPLY_OWN_BLOCKED_TO_REPLICAS ! Mirror owner-side NOADVANCE flags onto OMESH replicas of the same mesh
15171518
! Add CC%NOADVANCE(JCC) where needed:
15181519
CALL ADD_NEIGHBOR_BLOCKED_CELLS
15191520

@@ -1628,13 +1629,19 @@ SUBROUTINE SET_CUTCELLS_3D
16281629
ENDDO MAIN_MESH_LOOP_1B
16291630
ENDIF
16301631
CALL EXCHANGE_CC_NOADVANCE_INFO
1632+
CALL APPLY_OWN_BLOCKED_TO_REPLICAS
16311633
CALL ADD_NEIGHBOR_BLOCKED_CELLS
16321634

16331635
! Call tag boundary cut-cells for blocking in refinement interfaces:
16341636
CALL TAG_CC_BLOCKING_REFINEMENT
16351637

16361638
ENDDO
16371639

1640+
! Propagate TAG_CC_BLOCKING_REFINEMENT effects across ranks before the final BLOCK_SMALL pass.
1641+
CALL EXCHANGE_CC_NOADVANCE_INFO
1642+
CALL APPLY_OWN_BLOCKED_TO_REPLICAS
1643+
CALL ADD_NEIGHBOR_BLOCKED_CELLS
1644+
16381645
MAIN_MESH_LOOP_3 : DO NM=1,NMESHES
16391646

16401647
IF (.NOT.CC_COMPUTE_MESH(NM)) CYCLE ! Only MESHES assigned to processor and OMESHES of these.
@@ -2291,43 +2298,17 @@ SUBROUTINE PROMOTE_REFINEMENT_FOOTPRINTS_FROM_BLOCKED_FINE(NM_FINE)
22912298
CALL TAG_CELL_BLOCKED_BY_REFINEMENT_FOOTPRINT(NM_COARSE,II_COARSE,JJ_COARSE,KK_COARSE,BLOCKED_REFI_INTER, &
22922299
IBOD_DONOR,ITRI_DONOR,CELL_CHANGED)
22932300
IF (CELL_CHANGED) FM_PENDING_BLOCK_SCAN(NM_COARSE) = .TRUE.
2294-
CALL TAG_ALL_FINE_FOOTPRINTS_FOR_COARSE_CELL(NM_COARSE,II_COARSE,JJ_COARSE,KK_COARSE,IOR_COARSE, &
2295-
BLOCKED_REFI_INTER,IBOD_DONOR,ITRI_DONOR)
22962301
ENDDO COARSE_WALL_LOOP
22972302
ENDDO COARSE_MESH_LOOP
22982303
END SUBROUTINE PROMOTE_REFINEMENT_FOOTPRINTS_FROM_BLOCKED_FINE
22992304

2300-
SUBROUTINE TAG_ALL_FINE_FOOTPRINTS_FOR_COARSE_CELL(NM_COARSE,II_COARSE,JJ_COARSE,KK_COARSE,IOR_TRIGGER,BLOCK_TAG, &
2301-
IBOD_DONOR,ITRI_DONOR)
2302-
INTEGER, INTENT(IN) :: NM_COARSE,II_COARSE,JJ_COARSE,KK_COARSE,IOR_TRIGGER,BLOCK_TAG,IBOD_DONOR,ITRI_DONOR
2303-
INTEGER :: IW_LOC,NM_FINE
2304-
TYPE(WALL_TYPE), POINTER :: WC_COARSE
2305-
TYPE(EXTERNAL_WALL_TYPE), POINTER :: EWC_COARSE
2306-
TYPE(BOUNDARY_COORD_TYPE), POINTER :: BC_COARSE
2307-
TYPE(MESH_TYPE), POINTER :: MC
2308-
2309-
MC => MESHES(NM_COARSE); IF (.NOT.ALLOCATED(MC%WALL)) RETURN
2310-
DO IW_LOC=1,MC%N_EXTERNAL_WALL_CELLS
2311-
WC_COARSE => MC%WALL(IW_LOC); IF (WC_COARSE%BOUNDARY_TYPE/=INTERPOLATED_BOUNDARY) CYCLE
2312-
BC_COARSE => MC%BOUNDARY_COORD(WC_COARSE%BC_INDEX)
2313-
IF (BC_COARSE%IOR/=IOR_TRIGGER) CYCLE
2314-
IF (BC_COARSE%IIG/=II_COARSE .OR. BC_COARSE%JJG/=JJ_COARSE .OR. BC_COARSE%KKG/=KK_COARSE) CYCLE
2315-
EWC_COARSE => MC%EXTERNAL_WALL(IW_LOC)
2316-
NM_FINE = EWC_COARSE%NOM
2317-
CALL TAG_FINE_CELLS_IN_COARSE_CELL_VOLUME(NM_COARSE,II_COARSE,JJ_COARSE,KK_COARSE,NM_FINE,BLOCK_TAG, &
2318-
IBOD_DONOR,ITRI_DONOR)
2319-
ENDDO
2320-
END SUBROUTINE TAG_ALL_FINE_FOOTPRINTS_FOR_COARSE_CELL
2321-
23222305
SUBROUTINE TAG_FINE_CELLS_IN_COARSE_CELL_VOLUME(NM_COARSE,I_COARSE,J_COARSE,K_COARSE,NM_FINE,BLOCK_TAG,IBOD_DONOR,ITRI_DONOR)
23232306
INTEGER, INTENT(IN) :: NM_COARSE,I_COARSE,J_COARSE,K_COARSE,NM_FINE,BLOCK_TAG,IBOD_DONOR,ITRI_DONOR
23242307
INTEGER :: I_FINE,J_FINE,K_FINE
23252308
REAL(EB) :: XLO,XHI,YLO,YHI,ZLO,ZHI,EPS_LOC
23262309
LOGICAL :: CELL_CHANGED
23272310
TYPE(MESH_TYPE), POINTER :: MC,MF
23282311

2329-
IF (PROCESS(NM_FINE)/=MY_RANK) RETURN
2330-
23312312
MC => MESHES(NM_COARSE)
23322313
MF => MESHES(NM_FINE)
23332314
XLO = MC%X(I_COARSE-1); XHI = MC%X(I_COARSE)
@@ -2625,6 +2606,40 @@ SUBROUTINE ADD_NEIGHBOR_BLOCKED_CELLS
26252606
END SUBROUTINE ADD_NEIGHBOR_BLOCKED_CELLS
26262607

26272608

2609+
! ----------------------- APPLY_OWN_BLOCKED_TO_REPLICAS ----------------------------
2610+
! Apply owner-side NOADVANCE flags from XYZ_CC_BLOCKED/JBT_CC_BLOCKED onto each replica's local CUT_CELL.
2611+
SUBROUTINE APPLY_OWN_BLOCKED_TO_REPLICAS
2612+
2613+
USE TRAN, ONLY: GET_IJK
2614+
2615+
INTEGER :: NM_LOC,ICELL,JCC_LOC,I_LOC,J_LOC,K_LOC,BLOCK_TAG,ICC_LOC
2616+
REAL(EB) :: XCO,YCO,ZCO,X1,Y1,Z1
2617+
2618+
MESH_LOOP_APPLY : DO NM_LOC=1,NMESHES
2619+
IF (.NOT.CC_COMPUTE_MESH(NM_LOC)) CYCLE ! Only meshes with state on this rank.
2620+
IF (PROCESS(NM_LOC)==MY_RANK) CYCLE ! Owner already wrote authoritative state.
2621+
IF (.NOT.ALLOCATED(MESHES(NM_LOC)%XYZ_CC_BLOCKED)) CYCLE
2622+
IF (MESHES(NM_LOC)%N_CC_BLOCKED<=0) CYCLE
2623+
DO ICELL=1,MESHES(NM_LOC)%N_CC_BLOCKED
2624+
JCC_LOC = MESHES(NM_LOC)%JBT_CC_BLOCKED(1,ICELL); IF (JCC_LOC<=0) CYCLE ! Skip CC_SOLID boundary-band entries.
2625+
BLOCK_TAG = MESHES(NM_LOC)%JBT_CC_BLOCKED(2,ICELL); IF (BLOCK_TAG==NOT_BLOCKED) CYCLE
2626+
XCO = MESHES(NM_LOC)%XYZ_CC_BLOCKED(IAXIS,ICELL)
2627+
YCO = MESHES(NM_LOC)%XYZ_CC_BLOCKED(JAXIS,ICELL)
2628+
ZCO = MESHES(NM_LOC)%XYZ_CC_BLOCKED(KAXIS,ICELL)
2629+
CALL GET_IJK(XCO,YCO,ZCO,NM_LOC,X1,Y1,Z1,I_LOC,J_LOC,K_LOC)
2630+
IF (I_LOC<1 .OR. I_LOC>MESHES(NM_LOC)%IBAR .OR. J_LOC<1 .OR. J_LOC>MESHES(NM_LOC)%JBAR .OR. &
2631+
K_LOC<1 .OR. K_LOC>MESHES(NM_LOC)%KBAR) CYCLE
2632+
ICC_LOC = MESHES(NM_LOC)%CCVAR(I_LOC,J_LOC,K_LOC,CC_IDCC)
2633+
IF (ICC_LOC<=0) CYCLE ! No matching cut-cell on this replica.
2634+
IF (MESHES(NM_LOC)%CUT_CELL(ICC_LOC)%NOADVANCE(JCC_LOC)==NOT_BLOCKED) THEN
2635+
MESHES(NM_LOC)%CUT_CELL(ICC_LOC)%NOADVANCE(JCC_LOC) = BLOCK_TAG
2636+
IF (MESHES(NM_LOC)%JBT_CC_BLOCKED(3,ICELL)>0 .AND. MESHES(NM_LOC)%JBT_CC_BLOCKED(4,ICELL)>0) &
2637+
MESHES(NM_LOC)%CUT_CELL(ICC_LOC)%BODTRI_DONOR(1:2,JCC_LOC) = MESHES(NM_LOC)%JBT_CC_BLOCKED(3:4,ICELL)
2638+
ENDIF
2639+
ENDDO
2640+
ENDDO MESH_LOOP_APPLY
2641+
END SUBROUTINE APPLY_OWN_BLOCKED_TO_REPLICAS
2642+
26282643
SUBROUTINE DEFINE_XYZFACE_CELL(ALLOC_FLG)
26292644

26302645
LOGICAL, INTENT(IN) :: ALLOC_FLG
@@ -3083,51 +3098,14 @@ SUBROUTINE TAG_BLOCK_CELL(NM,II1,JJ1,KK1,NOM,IIO1,JJO1,KKO1,FINE_CELL)
30833098
M2=>MESHES(NOM)
30843099

30853100
IF (FINE_CELL) THEN
3086-
30873101
ICC2 = M2%CCVAR(IIO1,JJO1,KKO1,CC_IDCC); ICC = 0
30883102
IF ( ICC2 > 0 .OR. M2%CCVAR(IIO1,JJO1,KKO1,CC_CGSC)==CC_SOLID) THEN ! There are cut-cells in omesh cartesian cell.
30893103
CALL GET_REFINEMENT_CELL_DONOR(NOM,IIO1,JJO1,KKO1,IBOD_LOC,ITRI_LOC)
30903104
IF(M%CCVAR(II1,JJ1,KK1,CC_CGSC)==CC_GASPHASE) THEN
3091-
! Insert cut-cell is this location:
3092-
CT = 6;
3093-
NCFACE_CUTCELL = CT + 1
3094-
NCELL = 1
3095-
NFACE_CELL = CT
3096-
ALLOCATE(CCELEM(1:NCFACE_CUTCELL,1:NCELL)); CCELEM = CC_UNDEFINED
3097-
ALLOCATE(FACE_LIST(1:CC_NPARAM_CCFACE,1:NFACE_CELL)); FACE_LIST = CC_UNDEFINED
3098-
ALLOCATE(VOLUME(1:NCELL)); VOLUME(1)=M%DX(II1)*M%DY(JJ1)*M%DZ(KK1)
3099-
ALLOCATE(XYZCEN(IAXIS:KAXIS,1:NCELL)); XYZCEN(IAXIS:KAXIS,1) = (/ M%XC(II1),M%YC(JJ1),M%ZC(KK1) /)
3100-
ALLOCATE(NOADVANCE(1:NCELL)); NOADVANCE(1) = NOT_BLOCKED
3101-
IF(M2%CCVAR(IIO1,JJO1,KKO1,CC_CGSC)==CC_SOLID) NOADVANCE(1) = BLOCKED_REFI_INTER
3102-
! Add one by one regular and gas cut faces:
3103-
CT = 1; CCELEM(1,1) = 0
3104-
DO AX=IAXIS,KAXIS
3105-
DO SIDE=LOW_IND,HIGH_IND
3106-
ICFC=M%FCVAR(II1+ADDI(SIDE,AX),JJ1+ADDJ(SIDE,AX),KK1+ADDK(SIDE,AX),CC_IDCF,AX);
3107-
IF(ICFC>0) THEN
3108-
FACE_LIST(1:CC_NPARAM_CCFACE,CT) = (/ CC_FTYPE_CFGAS, SIDE, AX,ICFC, 1, CC_UNDEFINED /)
3109-
CCELEM(1,1) = CCELEM(1,1) + 1; CCELEM(CCELEM(1,1)+1,1) = CT; CT=CT+1
3110-
ELSEIF(M%FCVAR(II1+ADDI(SIDE,AX),JJ1+ADDJ(SIDE,AX),KK1+ADDK(SIDE,AX),CC_FGSC,AX) == &
3111-
CC_GASPHASE) THEN
3112-
FACE_LIST(1:CC_NPARAM_CCFACE,CT) = (/ CC_FTYPE_RCGAS, SIDE, AX, 0, 0, CC_UNDEFINED /)
3113-
CCELEM(1,1) = CCELEM(1,1) + 1; CCELEM(CCELEM(1,1)+1,1) = CT; CT=CT+1
3114-
ENDIF
3115-
ENDDO
3116-
ENDDO
3117-
! Insert cut_cell:
3118-
CALL INSERT_CUT_CELL(NM,II1,JJ1,KK1,ICC); M => MESHES(NM)
3119-
CALL NEW_CELL_ALLOC(NM,ICC,NCELL,NFACE_CELL,NCFACE_CUTCELL)
3120-
M%CUT_CELL(ICC)%NCELL = NCELL
3121-
M%CUT_CELL(ICC)%NFACE_CELL = NFACE_CELL
3122-
CALL MOVE_ALLOC(FROM=CCELEM ,TO=M%CUT_CELL(ICC)%CCELEM)
3123-
CALL MOVE_ALLOC(FROM=FACE_LIST,TO=M%CUT_CELL(ICC)%FACE_LIST)
3124-
CALL MOVE_ALLOC(FROM=VOLUME ,TO=M%CUT_CELL(ICC)%VOLUME)
3125-
CALL MOVE_ALLOC(FROM=XYZCEN ,TO=M%CUT_CELL(ICC)%XYZCEN)
3126-
CALL MOVE_ALLOC(FROM=NOADVANCE,TO=M%CUT_CELL(ICC)%NOADVANCE)
3127-
IF (M%CUT_CELL(ICC)%NOADVANCE(1)>0) &
3128-
CALL SET_REFINEMENT_CUTCELL_DONOR(NM,ICC,1,IBOD_LOC,ITRI_LOC)
3105+
! Skip rank-asymmetric cut-cell insertion (owner-only); keep CC_GASPHASE on all ranks.
3106+
ICC = 0
31293107
ELSEIF(M%CCVAR(II1,JJ1,KK1,CC_IDCC)>0) THEN
3130-
ICC = M%CCVAR(II1,JJ1,KK1,CC_IDCC)
3108+
ICC = M%CCVAR(II1,JJ1,KK1,CC_IDCC)
31313109
ENDIF
31323110
! Here Test if cut-cells in II,KK,KK are blocked or not in IIO,JJO,KKO:
31333111
IF(ICC>0) THEN
@@ -3141,60 +3119,22 @@ SUBROUTINE TAG_BLOCK_CELL(NM,II1,JJ1,KK1,NOM,IIO1,JJO1,KKO1,FINE_CELL)
31413119
ENDIF
31423120
ENDIF
31433121
ENDIF
3144-
31453122
ELSE
3146-
31473123
IF (PROCESS(NOM)/=MY_RANK) RETURN
31483124
ICC = M%CCVAR(II1,JJ1,KK1,CC_IDCC); ICC2 = 0
31493125
IF(ICC>0) THEN
31503126
! Set IOGC,JOGC,KOGC fine cells next to this EWC for blocking.
31513127
IF(M2%CCVAR(IIO1,JJO1,KKO1,CC_CGSC)==CC_GASPHASE) THEN
3152-
! Insert cut-cell in this location, set to Block.
3153-
CT = 6;
3154-
NCFACE_CUTCELL = CT + 1
3155-
NCELL = 1
3156-
NFACE_CELL = CT
3157-
ALLOCATE(CCELEM(1:NCFACE_CUTCELL,1:NCELL)); CCELEM = CC_UNDEFINED
3158-
ALLOCATE(FACE_LIST(1:CC_NPARAM_CCFACE,1:NFACE_CELL)); FACE_LIST = CC_UNDEFINED
3159-
ALLOCATE(VOLUME(1:NCELL)); VOLUME(1)=M2%DX(IIO1)*M2%DY(JJO1)*M2%DZ(KKO1)
3160-
ALLOCATE(XYZCEN(IAXIS:KAXIS,1:NCELL)); XYZCEN(IAXIS:KAXIS,1) = (/ M2%XC(IIO1),M2%YC(JJO1),M2%ZC(KKO1) /)
3161-
ALLOCATE(NOADVANCE(1:NCELL)); NOADVANCE(1) = NOT_BLOCKED
3162-
! Add one by one regular and gas cut faces:
3163-
CT = 1; CCELEM(1,1) = 0
3164-
DO AX=IAXIS,KAXIS
3165-
DO SIDE=LOW_IND,HIGH_IND; ICFC=&
3166-
M2%FCVAR(IIO1+ADDI(SIDE,AX),JJO1+ADDJ(SIDE,AX),KKO1+ADDK(SIDE,AX),CC_IDCF,AX);
3167-
IF(ICFC>0) THEN
3168-
FACE_LIST(1:CC_NPARAM_CCFACE,CT) = (/ CC_FTYPE_CFGAS, SIDE, AX,ICFC, 1, CC_UNDEFINED /)
3169-
CCELEM(1,1) = CCELEM(1,1) + 1; CCELEM(CCELEM(1,1)+1,1) = CT; CT=CT+1
3170-
ELSEIF( &
3171-
M2%FCVAR(IIO1+ADDI(SIDE,AX),JJO1+ADDJ(SIDE,AX),KKO1+ADDK(SIDE,AX),CC_FGSC,AX)&
3172-
== CC_GASPHASE) THEN
3173-
FACE_LIST(1:CC_NPARAM_CCFACE,CT) = (/ CC_FTYPE_RCGAS, SIDE, AX, 0, 0, CC_UNDEFINED /)
3174-
CCELEM(1,1) = CCELEM(1,1) + 1; CCELEM(CCELEM(1,1)+1,1) = CT; CT=CT+1
3175-
ENDIF
3176-
ENDDO
3177-
ENDDO
3178-
! Insert cut_cell:
3179-
CALL INSERT_CUT_CELL(NOM,IIO1,JJO1,KKO1,ICC2); M2 => MESHES(NOM)
3180-
CALL NEW_CELL_ALLOC(NOM,ICC2,NCELL,NFACE_CELL,NCFACE_CUTCELL)
3181-
M2%CUT_CELL(ICC2)%NCELL = NCELL
3182-
M2%CUT_CELL(ICC2)%NFACE_CELL = NFACE_CELL
3183-
CALL MOVE_ALLOC(FROM=CCELEM ,TO=M2%CUT_CELL(ICC2)%CCELEM)
3184-
CALL MOVE_ALLOC(FROM=FACE_LIST,TO=M2%CUT_CELL(ICC2)%FACE_LIST)
3185-
CALL MOVE_ALLOC(FROM=VOLUME ,TO=M2%CUT_CELL(ICC2)%VOLUME)
3186-
CALL MOVE_ALLOC(FROM=XYZCEN ,TO=M2%CUT_CELL(ICC2)%XYZCEN)
3187-
CALL MOVE_ALLOC(FROM=NOADVANCE,TO=M2%CUT_CELL(ICC2)%NOADVANCE)
3128+
! Skip rank-asymmetric cut-cell insertion (owner-only); keep CC_GASPHASE on all ranks of NOM.
3129+
ICC2 = 0
31883130
ELSEIF(M2%CCVAR(IIO1,JJO1,KKO1,CC_IDCC)>0) THEN
3189-
ICC2 = M2%CCVAR(IIO1,JJO1,KKO1,CC_IDCC)
3131+
ICC2 = M2%CCVAR(IIO1,JJO1,KKO1,CC_IDCC)
31903132
ENDIF
31913133
! Here Test if cut-cells in IIO,JJO,KKO are blocked or not in II,JJ,KK:
31923134
IF(ICC2>0) CALL TEST_CC_FOR_BLOCKING(NOM,ICC2,NM,II1,JJ1,KK1,ICC)
31933135
ENDIF
3194-
31953136
ENDIF
31963137

3197-
31983138
END SUBROUTINE TAG_BLOCK_CELL
31993139

32003140
SUBROUTINE TEST_CC_FOR_BLOCKING(NM,ICC,NOM,IIO1,JJO1,KKO1,ICC2)

0 commit comments

Comments
 (0)