@@ -1514,6 +1514,7 @@ SUBROUTINE SET_CUTCELLS_3D
15141514
15151515! Exchange CC%NOADVANCE(JCC)>0 information among NEIGHBOURING meshes:
15161516CALL 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:
15181519CALL ADD_NEIGHBOR_BLOCKED_CELLS
15191520
@@ -1628,13 +1629,19 @@ SUBROUTINE SET_CUTCELLS_3D
16281629 ENDDO MAIN_MESH_LOOP_1B
16291630ENDIF
16301631CALL EXCHANGE_CC_NOADVANCE_INFO
1632+ CALL APPLY_OWN_BLOCKED_TO_REPLICAS
16311633CALL ADD_NEIGHBOR_BLOCKED_CELLS
16321634
16331635! Call tag boundary cut-cells for blocking in refinement interfaces:
16341636CALL TAG_CC_BLOCKING_REFINEMENT
16351637
16361638ENDDO
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+
16381645MAIN_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
22972302ENDDO COARSE_MESH_LOOP
22982303END 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-
23222305SUBROUTINE TAG_FINE_CELLS_IN_COARSE_CELL_VOLUME(NM_COARSE,I_COARSE,J_COARSE,K_COARSE,NM_FINE,BLOCK_TAG,IBOD_DONOR,ITRI_DONOR)
23232306INTEGER, INTENT(IN) :: NM_COARSE,I_COARSE,J_COARSE,K_COARSE,NM_FINE,BLOCK_TAG,IBOD_DONOR,ITRI_DONOR
23242307INTEGER :: I_FINE,J_FINE,K_FINE
23252308REAL(EB) :: XLO,XHI,YLO,YHI,ZLO,ZHI,EPS_LOC
23262309LOGICAL :: CELL_CHANGED
23272310TYPE(MESH_TYPE), POINTER :: MC,MF
23282311
2329- IF (PROCESS(NM_FINE)/=MY_RANK) RETURN
2330-
23312312MC => MESHES(NM_COARSE)
23322313MF => MESHES(NM_FINE)
23332314XLO = MC%X(I_COARSE-1); XHI = MC%X(I_COARSE)
@@ -2625,6 +2606,40 @@ SUBROUTINE ADD_NEIGHBOR_BLOCKED_CELLS
26252606END 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+
26282643SUBROUTINE DEFINE_XYZFACE_CELL(ALLOC_FLG)
26292644
26302645LOGICAL, INTENT(IN) :: ALLOC_FLG
@@ -3083,51 +3098,14 @@ SUBROUTINE TAG_BLOCK_CELL(NM,II1,JJ1,KK1,NOM,IIO1,JJO1,KKO1,FINE_CELL)
30833098M2=>MESHES(NOM)
30843099
30853100IF (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-
31453122ELSE
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-
31953136ENDIF
31963137
3197-
31983138END SUBROUTINE TAG_BLOCK_CELL
31993139
32003140SUBROUTINE TEST_CC_FOR_BLOCKING(NM,ICC,NOM,IIO1,JJO1,KKO1,ICC2)
0 commit comments