Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
5de52ec
FDS Source: WIP refactor of cut-cell grid setup.
Mar 24, 2026
9b0ed00
Merge remote-tracking branch 'firemodels/master' into cc-fv-refactor
Mar 24, 2026
bb46626
Merge remote-tracking branch 'firemodels/master' into cc-fv-refactor
Mar 25, 2026
04c94cf
FDS Source: WIP, move SET_CUTCELLS_3D to COMPLEX_GEOMETRY_GRID.
Mar 25, 2026
9d4d8fd
Merge remote-tracking branch 'firemodels/master' into cc-fv-refactor
Mar 25, 2026
10367ad
FDS Source: Move all grid routines and related data to COMPLEX_GEOMET…
Mar 27, 2026
ec171e3
Merge remote-tracking branch 'firemodels/master' into cc-fv-refactor
Mar 27, 2026
446881f
Merge remote-tracking branch 'firemodels/master' into cc-fv-refactor
Apr 3, 2026
f1abafa
FDS Source : Move some parameters to COMPLEX_GEOMETRY_GRID.
Apr 3, 2026
1232822
FDS Source: declare IPARM in GLOBMAT_SOLVER.
Apr 3, 2026
76c8238
FDS Source : add SET_CVS_3D skeleton.
Apr 3, 2026
7bc7907
Merge remote-tracking branch 'firemodels/master' into cc-fv-refactor
Apr 8, 2026
59d9077
FDS Source: Move CC_GRID_BUILD_RAW_CUTCELLS out of SET_CUTCELLS_3D.
Apr 8, 2026
b546bed
FDS Source: Fix argument type.
Apr 13, 2026
4926476
Merge remote-tracking branch 'firemodels/master' into cc-fv-refactor
Apr 16, 2026
da63a74
FDS Source : Move contained routines out of SET_CUTCELLS_3D, add GCEL…
Apr 16, 2026
2a39026
Merge remote-tracking branch 'firemodels/master' into cc-fv-refactor
Apr 21, 2026
9c674e3
FDS Source : more helper routine promotions in SET_CUTCELLS_3D.
Apr 21, 2026
b5191d5
FDS Source: Define some low level primitives for GET_CELL_LINK_INFO.
Apr 21, 2026
2445498
Merge branch 'master' into cc-fv-refactor-merge-test
Jun 11, 2026
5e37a86
FDS Source: bring master refinement-interface cut-cell blocking into …
Jun 15, 2026
1c63504
Merge pull request #16339 from marcosvanella/cc-fv-refactor-blocking
marcosvanella Jun 16, 2026
dc01618
FDS Source: fix PATH OBSCURATION XB order bug Issue #16338
drjfloyd Jun 17, 2026
54e29c7
Merge pull request #16340 from drjfloyd/master
drjfloyd Jun 17, 2026
0e2e3aa
FDS Validation: Remove . from RGB
mcgratta Jun 21, 2026
8fe3b0c
Merge pull request #16346 from mcgratta/master
mcgratta Jun 21, 2026
8b22b78
Bump actions/checkout from 6 to 7
dependabot[bot] Jun 22, 2026
42aadc9
Merge pull request #16347 from firemodels/dependabot/github_actions/a…
marcosvanella Jun 22, 2026
b66f406
FDS Source: subtract SOLID from AREA calc with SPATIAL_STATISTIC=AREA
rmcdermo Jun 23, 2026
20b2f3b
Merge pull request #16354 from rmcdermo/master
rmcdermo Jun 23, 2026
dd433f8
FDS Source: add cross-mesh back-CFACE BCs and thickness-based backing…
marcosvanella Jun 23, 2026
ff07e02
Merge pull request #16355 from marcosvanella/master
marcosvanella Jun 23, 2026
4836f70
Merge remote-tracking branch 'firemodels/master' into FireX
Jun 24, 2026
2257dc7
FDS Source: Fix bugs related to restarting HT3D
mcgratta Jun 24, 2026
bb8a568
Merge pull request #16356 from mcgratta/master
mcgratta Jun 24, 2026
c02dee4
Merge remote-tracking branch 'firemodels/master' into FireX
Jun 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/Line_Endings.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- name: Check for CRLF line endings
run: |
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/cmake.yml
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ jobs:
sudo apt-get -y update
sudo apt-get -y install libopenmpi-dev openmpi-bin

- uses: actions/checkout@v6
- uses: actions/checkout@v7
- run: git config --global --add safe.directory /__w/fds/fds

- name: set linux-gnu compiler
Expand Down Expand Up @@ -165,7 +165,7 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- name: Checkout code
uses: actions/checkout@v6
uses: actions/checkout@v7

- name: install openmpi
run: brew install gcc@15 open-mpi
Expand Down Expand Up @@ -243,7 +243,7 @@ jobs:
shell: cmd

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

# install oneapi components from web installer based on
# oneapi-ci/scripts/install_windows.bat
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ jobs:
mkl@2026.0.0
prune: false

- uses: actions/checkout@v6
- uses: actions/checkout@v7

- name: build fds debug
run: |
Expand Down Expand Up @@ -74,7 +74,7 @@ jobs:
mkl@2025.1.0
prune: false

- uses: actions/checkout@v6
- uses: actions/checkout@v7
- name: build fds debug
run: |
source /opt/intel/oneapi/setvars.sh
Expand All @@ -96,7 +96,7 @@ jobs:
runs-on: [ubuntu-latest]

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- uses: actions/setup-python@v6
with:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/osx.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ jobs:
shell: bash

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- name: install openmpi
run: |
brew install gcc@15 open-mpi
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ jobs:
shell: cmd

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

# install oneapi components from web installer based on
# oneapi-ci/scripts/install_windows.bat
Expand Down
242 changes: 240 additions & 2 deletions Source/ccib.f90
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,33 @@
!
MODULE CC_SCALARS

USE COMPLEX_GEOMETRY
USE COMPLEX_GEOMETRY, ONLY: GEOMEPS,LOOSEPS,GEOFCT,NGUARD,CCGUARD,CC_GASPHASE,CC_CUTCFE,CC_SOLID, &
CC_INBOUNDARY,CC_UNDEFINED,CC_VGSC,CC_EGSC,CC_IDCE, &
CC_FGSC,CC_IDCF,CC_IDRC,CC_UNKF,CC_CGSC,CC_IDCC,CC_UNKZ,CC_UNKH,CC_ETYPE_RGGAS, &
CC_ETYPE_CFGAS,CC_FTYPE_RGGAS,CC_FTYPE_CFGAS,CC_FTYPE_CFINB,CC_FTYPE_SVERT,CC_FTYPE_RCGAS, &
CC_FTYPE_CCGAS,CC_ETYPE_SCINB,CC_ETYPE_RCGAS,CC_ETYPE_EP,CC_MATVEC_DEFINED,NM_START, &
CALL_FOR_GLMAT,CALL_FROM_GLMAT_SETUP,N_REQ11,N_REQ12,N_REQ112,N_REQ13,REQ11,REQ112,REQ12,REQ13, &
WRITE_SET_CUTCELLS_TIMINGS,N_SET_CUTCELLS_3D_CALLS,SET_CUTCELLS_TIME_INDEX,GET_CARTCELL_CUTCELLS_TIME_INDEX, &
CC_SET_DATA_TIME_INDEX,INIT_CUTCELL_DATA_TIME_INDEX,CCCOMPUTE_RADIATION_TIME_INDEX, &
CC_DENSITY_TIME_INDEX,CC_VELOCITY_FLUX_TIME_INDEX,CC_COMPUTE_VISCOSITY_TIME_INDEX, &
CC_DIVERGENCE_PART_1_TIME_INDEX,CC_END_STEP_TIME_INDEX,CC_NO_FLUX_TIME_INDEX, &
CC_COMPUTE_VELOCITY_ERROR_TIME_INDEX,MESH_CC_EXCHANGE_TIME_INDEX,T_CC_USED, &
VAL_TESTX_LOW,VAL_TESTX_HIGH,VAL_TESTY_LOW,VAL_TESTY_HIGH,VAL_TESTZ_LOW,VAL_TESTZ_HIGH, &
LU_SETCC,SEARCH_OTHER_MESHES_FACE,POINT_IN_POLYGON
USE COMPLEX_GEOMETRY_GRID, ONLY: DELTA_INT,DELTA_VERT,DIST_THRES,FDS_AREA_GEOM,INDEX_UNDEFINED,INT_N_EXT_PTS, &
INT_P_IND,INT_TMP_IND,INT_VEL_IND,INT_RHO_IND,INT_H_IND,INT_RSUM_IND,INT_MU_IND,INT_MUDNS_IND, &
INT_RHO0_IND,INT_WCEN_IND,INT_VELS_IND,MAX_INTERP_POINTS,NQT2C,N_CUTCELLS_PROC,N_INB_CUTFACES_PROC, &
N_INT_CVARS,N_INT_CCVARS,N_REG_CUTFACES_PROC,N_LINK_ATTMP_F,GLOBAL_DELTA_CELL,GLOBAL_DELTA_EDGE, &
GLOBAL_DELTA_FACE,SET_CUTCELLS_3D,BLOCK_CC_SOLID_EXTWALLCELLS,INIT_CFACE_CELL,GET_REGULAR_CUT_EDGES_BC, &
GET_SOLID_CUTCELL_EDGES_BC,GET_BACK_CFACE_INDEX
USE PRECISION_PARAMETERS
USE GLOBAL_CONSTANTS
USE MESH_POINTERS
USE MESH_VARIABLES, ONLY: MESHES, MESH_TYPE
USE COMP_FUNCTIONS, ONLY: CURRENT_TIME, GET_FILE_NUMBER
USE MATH_FUNCTIONS, ONLY: GET_SCALAR_FACE_VALUE
USE MEMORY_FUNCTIONS, ONLY: ALLOCATE_STORAGE
USE GEOMETRY_FUNCTIONS, ONLY: SEARCH_OTHER_MESHES

IMPLICIT NONE (TYPE,EXTERNAL)
PRIVATE
Expand Down Expand Up @@ -117,10 +137,225 @@ MODULE CC_SCALARS
FINISH_CC, INIT_CUTCELL_DATA,MESH_CC_EXCHANGE,NUMBER_UNKH_CUTCELLS,&
ROTATED_CUBE_ANN_SOLN,ROTATED_CUBE_VELOCITY_FLUX,ROTATED_CUBE_RHS_ZZ,&
SET_EXIMADVFLX_3D,SET_EXIMDIFFLX_3D,SET_EXIMRHOHSLIM_3D,&
SET_EXIMRHOZZLIM_3D,UNSTRUCTURED_POISSON_RESIDUAL,UNSTRUCTURED_POISSON_RESIDUAL_RC
SET_EXIMRHOZZLIM_3D,UNSTRUCTURED_POISSON_RESIDUAL,UNSTRUCTURED_POISSON_RESIDUAL_RC,&
INITIALIZE_BACK_CFACE_EXCHANGE,EXCHANGE_BACK_CFACE_DATA

! Persistent layout for the per-step cross-mesh BACK CFACE gas-side data exchange (see INITIALIZE_BACK_CFACE_EXCHANGE
! and EXCHANGE_BACK_CFACE_DATA). N_CF_BACK_SEND/RECV are the per-process query totals on the requester/owner side.
LOGICAL, SAVE :: CF_BACK_EXCHANGE_ACTIVE=.FALSE.
INTEGER, SAVE :: N_CF_BACK_SEND=0,N_CF_BACK_RECV=0
INTEGER, SAVE, ALLOCATABLE, DIMENSION(:) :: CF_BACK_SEND_CNT3,CF_BACK_SDISPL3,CF_BACK_RECV_CNT3,CF_BACK_RDISPL3
INTEGER, SAVE, ALLOCATABLE, DIMENSION(:) :: CF_BACK_SEND_NOM,CF_BACK_MAP_IDX !< Requester side: owner mesh and back CFACE index per query
INTEGER, SAVE, ALLOCATABLE, DIMENSION(:) :: CF_BACK_RECV_NOM,CF_BACK_RECV_IDX !< Owner side: owner mesh and resolved local CFACE index per query

CONTAINS

! ------------------------ INITIALIZE_BACK_CFACE_EXCHANGE ---------------------------
SUBROUTINE INITIALIZE_BACK_CFACE_EXCHANGE

INTEGER :: NM,NOM,IQ,NQ,IIO,JJO,KKO,NOM2,ICFACE,SURF_B,FRONT,OD_INDEX,N_RESOLVED,N_GLOBAL,IP,K,P,TOTAL_SEND,TOTAL_RECV,IERR
REAL(EB) :: POS(3)
INTEGER, ALLOCATABLE :: SEND_CNT(:),RECV_CNT(:),SDISPL(:),RDISPL(:),CNT3_S(:),CNT3_R(:),DSP3_S(:),DSP3_R(:),COUNTER(:)
INTEGER, ALLOCATABLE :: SEND_NOM(:),RECV_NOM(:),REPLY_IDX(:),REPLY_SURF(:),REPLY_DIM(:), &
REPLY_BACK(:),REPLY_BSURF(:),REPLY_BDIM(:),MAP_NM(:),MAP_FRONT(:)
REAL(EB), ALLOCATABLE :: SEND_POS(:),RECV_POS(:)

N_RESOLVED = 0
ALLOCATE(SEND_CNT(0:N_MPI_PROCESSES-1)) ; SEND_CNT = 0
DO NM=LOWER_MESH_INDEX,UPPER_MESH_INDEX
DO NOM=1,NMESHES
IF (NOM==NM) CYCLE
NQ = MESHES(NM)%OMESH(NOM)%N_CFACE_QUERY
IF (NQ==0) CYCLE
IF (PROCESS(NOM)==MY_RANK) THEN ! Owner is on this process: resolve directly.
DO IQ=1,NQ
POS(1:3) = MESHES(NM)%OMESH(NOM)%CFACE_QUERY_XYZ(IAXIS:KAXIS,IQ)
CALL SEARCH_OTHER_MESHES(POS(1),POS(2),POS(3),NOM2,IIO,JJO,KKO)
IF (NOM2/=NOM) CYCLE
ICFACE = GET_BACK_CFACE_INDEX(NOM,IIO,JJO,KKO,POS,-1,-1)
IF (ICFACE>0) THEN
FRONT = MESHES(NM)%OMESH(NOM)%CFACE_QUERY_FRONT(IQ)
OD_INDEX = MESHES(NM)%CFACE(FRONT)%OD_INDEX
IF (OD_INDEX>0) THEN
MESHES(NM)%BOUNDARY_ONE_D(OD_INDEX)%BACK_MESH = NOM
MESHES(NM)%BOUNDARY_ONE_D(OD_INDEX)%BACK_INDEX = ICFACE
MESHES(NM)%BOUNDARY_ONE_D(OD_INDEX)%BACK_SURF = MESHES(NOM)%CFACE(ICFACE)%SURF_INDEX
N_RESOLVED = N_RESOLVED + 1
ENDIF
ENDIF
ENDDO
ELSE ! Owner on another process: count for the all-to-all exchange below.
SEND_CNT(PROCESS(NOM)) = SEND_CNT(PROCESS(NOM)) + NQ
ENDIF
ENDDO
ENDDO

CROSS_PROCESS_IF: IF (N_MPI_PROCESSES>1) THEN

ALLOCATE(RECV_CNT(0:N_MPI_PROCESSES-1)) ; RECV_CNT = 0
CALL MPI_ALLTOALL(SEND_CNT,1,MPI_INTEGER,RECV_CNT,1,MPI_INTEGER,MPI_COMM_WORLD,IERR)

ALLOCATE(SDISPL(0:N_MPI_PROCESSES-1),RDISPL(0:N_MPI_PROCESSES-1))
ALLOCATE(CNT3_S(0:N_MPI_PROCESSES-1),CNT3_R(0:N_MPI_PROCESSES-1))
ALLOCATE(DSP3_S(0:N_MPI_PROCESSES-1),DSP3_R(0:N_MPI_PROCESSES-1))
SDISPL(0) = 0 ; RDISPL(0) = 0
DO IP=1,N_MPI_PROCESSES-1
SDISPL(IP) = SDISPL(IP-1) + SEND_CNT(IP-1)
RDISPL(IP) = RDISPL(IP-1) + RECV_CNT(IP-1)
ENDDO
TOTAL_SEND = SDISPL(N_MPI_PROCESSES-1) + SEND_CNT(N_MPI_PROCESSES-1)
TOTAL_RECV = RDISPL(N_MPI_PROCESSES-1) + RECV_CNT(N_MPI_PROCESSES-1)
CNT3_S = 3*SEND_CNT ; CNT3_R = 3*RECV_CNT ; DSP3_S = 3*SDISPL ; DSP3_R = 3*RDISPL
ALLOCATE(SEND_NOM(MAX(TOTAL_SEND,1)),SEND_POS(MAX(3*TOTAL_SEND,1)),MAP_NM(MAX(TOTAL_SEND,1)), &
MAP_FRONT(MAX(TOTAL_SEND,1)),REPLY_BACK(MAX(TOTAL_SEND,1)),REPLY_BSURF(MAX(TOTAL_SEND,1)), &
REPLY_BDIM(MAX(TOTAL_SEND,1)))
ALLOCATE(RECV_NOM(MAX(TOTAL_RECV,1)),RECV_POS(MAX(3*TOTAL_RECV,1)),REPLY_IDX(MAX(TOTAL_RECV,1)), &
REPLY_SURF(MAX(TOTAL_RECV,1)),REPLY_DIM(MAX(TOTAL_RECV,1)))
ALLOCATE(COUNTER(0:N_MPI_PROCESSES-1)) ; COUNTER = SDISPL

! Pack cross-process queries grouped by destination process (matching the SDISPL ordering). MAP_NM and
! MAP_FRONT record the local front CFACE associated with each query so the reply can be applied in order.
DO NM=LOWER_MESH_INDEX,UPPER_MESH_INDEX
DO NOM=1,NMESHES
IF (NOM==NM) CYCLE
IF (PROCESS(NOM)==MY_RANK) CYCLE
NQ = MESHES(NM)%OMESH(NOM)%N_CFACE_QUERY
IF (NQ==0) CYCLE
IP = PROCESS(NOM)
DO IQ=1,NQ
P = COUNTER(IP) + 1 ; COUNTER(IP) = P
SEND_NOM(P) = NOM
SEND_POS(3*P-2:3*P) = MESHES(NM)%OMESH(NOM)%CFACE_QUERY_XYZ(IAXIS:KAXIS,IQ)
MAP_NM(P) = NM
MAP_FRONT(P) = MESHES(NM)%OMESH(NOM)%CFACE_QUERY_FRONT(IQ)
ENDDO
ENDDO
ENDDO
CALL MPI_ALLTOALLV(SEND_NOM,SEND_CNT,SDISPL,MPI_INTEGER,RECV_NOM,RECV_CNT,RDISPL,MPI_INTEGER,MPI_COMM_WORLD,IERR)
CALL MPI_ALLTOALLV(SEND_POS,CNT3_S,DSP3_S,MPI_DOUBLE_PRECISION,RECV_POS,CNT3_R,DSP3_R,MPI_DOUBLE_PRECISION,&
MPI_COMM_WORLD,IERR)

! Owner side: resolve each received query against its local cut-face data.
DO K=1,TOTAL_RECV
NOM = RECV_NOM(K)
POS(1:3) = RECV_POS(3*K-2:3*K)
CALL SEARCH_OTHER_MESHES(POS(1),POS(2),POS(3),NOM2,IIO,JJO,KKO)
ICFACE = 0 ; SURF_B = 0
IF (NOM2==NOM) ICFACE = GET_BACK_CFACE_INDEX(NOM,IIO,JJO,KKO,POS,-1,-1)
IF (ICFACE>0) SURF_B = MESHES(NOM)%CFACE(ICFACE)%SURF_INDEX
REPLY_IDX(K) = ICFACE
REPLY_SURF(K) = SURF_B
REPLY_DIM(K) = 0 ; IF (ICFACE>0) REPLY_DIM(K) = MESHES(NOM)%N_CFACE_CELLS_DIM
ENDDO

! Reverse all-to-all: return the resolved BACK CFACE index, SURF_INDEX and owner CFACE dimension to requesters.
CALL MPI_ALLTOALLV(REPLY_IDX, RECV_CNT,RDISPL,MPI_INTEGER,REPLY_BACK, SEND_CNT,SDISPL,MPI_INTEGER,MPI_COMM_WORLD,IERR)
CALL MPI_ALLTOALLV(REPLY_SURF,RECV_CNT,RDISPL,MPI_INTEGER,REPLY_BSURF,SEND_CNT,SDISPL,MPI_INTEGER,MPI_COMM_WORLD,IERR)
CALL MPI_ALLTOALLV(REPLY_DIM, RECV_CNT,RDISPL,MPI_INTEGER,REPLY_BDIM, SEND_CNT,SDISPL,MPI_INTEGER,MPI_COMM_WORLD,IERR)

! Requester side: store BACK_MESH / BACK_INDEX / BACK_SURF and allocate a ghost CFACE (with its boundary
! storage) in MESHES(NOM) so the per-step exchange can deposit the back gas-side state and the solid heat
! transfer solver can read it exactly as it reads a same-mesh back CFACE.
DO P=1,TOTAL_SEND
ICFACE = REPLY_BACK(P)
IF (ICFACE>0) THEN
NM = MAP_NM(P)
FRONT = MAP_FRONT(P)
NOM = SEND_NOM(P)
SURF_B = REPLY_BSURF(P)
OD_INDEX = MESHES(NM)%CFACE(FRONT)%OD_INDEX
IF (OD_INDEX>0) THEN
MESHES(NM)%BOUNDARY_ONE_D(OD_INDEX)%BACK_MESH = NOM
MESHES(NM)%BOUNDARY_ONE_D(OD_INDEX)%BACK_INDEX = ICFACE
MESHES(NM)%BOUNDARY_ONE_D(OD_INDEX)%BACK_SURF = SURF_B
N_RESOLVED = N_RESOLVED + 1
! Allocate the ghost CFACE once per (NOM,ICFACE).
IF (.NOT.ALLOCATED(MESHES(NOM)%CFACE)) THEN
MESHES(NOM)%N_CFACE_CELLS_DIM = REPLY_BDIM(P)
ALLOCATE(MESHES(NOM)%CFACE(0:MESHES(NOM)%N_CFACE_CELLS_DIM))
ENDIF
IF (ICFACE>UBOUND(MESHES(NOM)%CFACE,1)) THEN
CALL ALLOCATE_STORAGE(NOM,CFACE_INDEX=ICFACE,SURF_INDEX=SURF_B)
ELSEIF (MESHES(NOM)%CFACE(ICFACE)%B1_INDEX<=0) THEN
CALL ALLOCATE_STORAGE(NOM,CFACE_INDEX=ICFACE,SURF_INDEX=SURF_B)
ENDIF
ENDIF
ENDIF
ENDDO

! Define exchange layout so EXCHANGE_BACK_CFACE_DATA can move the back gas-side state every step.
N_CF_BACK_SEND = TOTAL_SEND
N_CF_BACK_RECV = TOTAL_RECV
ALLOCATE(CF_BACK_SEND_CNT3(0:N_MPI_PROCESSES-1),CF_BACK_SDISPL3(0:N_MPI_PROCESSES-1))
ALLOCATE(CF_BACK_RECV_CNT3(0:N_MPI_PROCESSES-1),CF_BACK_RDISPL3(0:N_MPI_PROCESSES-1))
CF_BACK_SEND_CNT3 = CNT3_S ; CF_BACK_SDISPL3 = DSP3_S
CF_BACK_RECV_CNT3 = CNT3_R ; CF_BACK_RDISPL3 = DSP3_R
ALLOCATE(CF_BACK_SEND_NOM(MAX(TOTAL_SEND,1)),CF_BACK_MAP_IDX(MAX(TOTAL_SEND,1)))
ALLOCATE(CF_BACK_RECV_NOM(MAX(TOTAL_RECV,1)),CF_BACK_RECV_IDX(MAX(TOTAL_RECV,1)))
IF (TOTAL_SEND>0) THEN
CF_BACK_SEND_NOM(1:TOTAL_SEND) = SEND_NOM(1:TOTAL_SEND)
CF_BACK_MAP_IDX(1:TOTAL_SEND) = REPLY_BACK(1:TOTAL_SEND)
ENDIF
IF (TOTAL_RECV>0) THEN
CF_BACK_RECV_NOM(1:TOTAL_RECV) = RECV_NOM(1:TOTAL_RECV)
CF_BACK_RECV_IDX(1:TOTAL_RECV) = REPLY_IDX(1:TOTAL_RECV)
ENDIF
N_GLOBAL = TOTAL_SEND
CALL MPI_ALLREDUCE(MPI_IN_PLACE,N_GLOBAL,1,MPI_INTEGER,MPI_SUM,MPI_COMM_WORLD,IERR)
IF (N_GLOBAL>0) CF_BACK_EXCHANGE_ACTIVE = .TRUE.

DEALLOCATE(RECV_CNT,SDISPL,RDISPL,CNT3_S,CNT3_R,DSP3_S,DSP3_R,COUNTER,SEND_NOM,SEND_POS,MAP_NM,MAP_FRONT, &
REPLY_BACK,REPLY_BSURF,REPLY_BDIM,RECV_NOM,RECV_POS,REPLY_IDX,REPLY_SURF,REPLY_DIM)

ENDIF CROSS_PROCESS_IF
DEALLOCATE(SEND_CNT)

!IF (N_RESOLVED>0) &
! WRITE(LU_ERR,'(A,I0,A,I0)') ' BACK CFACE exchange: process ',MY_RANK,' resolved cross-mesh back CFACEs: ',N_RESOLVED

END SUBROUTINE INITIALIZE_BACK_CFACE_EXCHANGE


! ------------------------ EXCHANGE_BACK_CFACE_DATA --------------------------------
SUBROUTINE EXCHANGE_BACK_CFACE_DATA

INTEGER :: K,P,NOM,ICFACE,B1,IERR
REAL(EB), ALLOCATABLE :: SBUF(:),RBUF(:)

IF (.NOT.CF_BACK_EXCHANGE_ACTIVE .OR. N_MPI_PROCESSES==1) RETURN
ALLOCATE(SBUF(MAX(3*N_CF_BACK_RECV,1))) ; SBUF = 0._EB
ALLOCATE(RBUF(MAX(3*N_CF_BACK_SEND,1))) ; RBUF = 0._EB

! Owner side: pack the back gas-side state of each resolved CFACE.
DO K=1,N_CF_BACK_RECV
ICFACE = CF_BACK_RECV_IDX(K)
IF (ICFACE<=0) CYCLE
NOM = CF_BACK_RECV_NOM(K)
B1 = MESHES(NOM)%CFACE(ICFACE)%B1_INDEX
IF (B1<=0) CYCLE
SBUF(3*K-2) = MESHES(NOM)%BOUNDARY_PROP1(B1)%TMP_G
SBUF(3*K-1) = MESHES(NOM)%BOUNDARY_PROP1(B1)%HEAT_TRANS_COEF
SBUF(3*K ) = MESHES(NOM)%BOUNDARY_PROP1(B1)%Q_RAD_IN
ENDDO
CALL MPI_ALLTOALLV(SBUF,CF_BACK_RECV_CNT3,CF_BACK_RDISPL3,MPI_DOUBLE_PRECISION, &
RBUF,CF_BACK_SEND_CNT3,CF_BACK_SDISPL3,MPI_DOUBLE_PRECISION,MPI_COMM_WORLD,IERR)

! Requester side: deposit the received state into the ghost CFACE so the solver reads it like a same-mesh back CFACE.
DO P=1,N_CF_BACK_SEND
ICFACE = CF_BACK_MAP_IDX(P)
IF (ICFACE<=0) CYCLE
NOM = CF_BACK_SEND_NOM(P)
B1 = MESHES(NOM)%CFACE(ICFACE)%B1_INDEX
IF (B1<=0) CYCLE
MESHES(NOM)%BOUNDARY_PROP1(B1)%TMP_G = RBUF(3*P-2)
MESHES(NOM)%BOUNDARY_PROP1(B1)%HEAT_TRANS_COEF = RBUF(3*P-1)
MESHES(NOM)%BOUNDARY_PROP1(B1)%Q_RAD_IN = RBUF(3*P)
ENDDO
DEALLOCATE(SBUF,RBUF)

END SUBROUTINE EXCHANGE_BACK_CFACE_DATA


! ------------------------ COPY_UNST_DM_TO_CART -------------------------------------

SUBROUTINE COPY_UNST_DM_TO_CART(NM)
Expand Down Expand Up @@ -3722,6 +3957,9 @@ SUBROUTINE MESH_CC_EXCHANGE(CODE)
INTEGER :: EP,INPE,INT_NPE_LO,INT_NPE_HI,VIND,ICELL,IEDGE,IFEP
REAL(EB) :: TNOW,TINTP

! On the end-of-step (CODE=6) exchange, move the gas-side state of cross-mesh BACK CFACEs.
IF (CODE==6) CALL EXCHANGE_BACK_CFACE_DATA

! For solid phase only return. All variables exchanged currently here are gas-phase.
IF (SOLID_PHASE_ONLY) RETURN
! In case of initialization code from main return.
Expand Down
Loading
Loading