@@ -132,7 +132,8 @@ MODULE CC_SCALARS
132132 GET_CFACE_OPEN_BC_COEF,GET_FN_DIVERGENCE_CUTCELL,GET_OPENBC_TANGENTIAL_CUTFACE_VEL,&
133133 GET_CUTCELL_DDDT,GET_H_CUTFACES,GET_H_MATRIX_CC,GET_H_GUARD_CUTCELL,GET_CRTCFCC_INT_STENCILS,GET_RCFACES_H, &
134134 GET_CC_MATRIXGRAPH_H,GET_CC_IROW,GET_CC_UNKH,GET_CUTCELL_HP, GET_LINKED_FV, GET_PRES_CFACE_BCS, &
135- GET_PRES_CFACE, GET_PRES_CFACE_TEST, GET_UVWGAS_CFACE, GET_MUDNS_CFACE, GET_BOUNDFACE_GEOM_INFO_H, &
135+ GET_PRES_CFACE, GET_PRES_CFACE_TEST, GET_UVWGAS_CFACE, GET_CFACE_RAD_NVEC, GET_MUDNS_CFACE, &
136+ GET_BOUNDFACE_GEOM_INFO_H, &
136137 GET_FH_FROM_PRHS_AND_BCS,GET_LINKED_VELOCITIES, &
137138 FINISH_CC, INIT_CUTCELL_DATA,MESH_CC_EXCHANGE,NUMBER_UNKH_CUTCELLS,&
138139 ROTATED_CUBE_ANN_SOLN,ROTATED_CUBE_VELOCITY_FLUX,ROTATED_CUBE_RHS_ZZ,&
@@ -154,11 +155,11 @@ MODULE CC_SCALARS
154155SUBROUTINE INITIALIZE_BACK_CFACE_EXCHANGE
155156
156157INTEGER :: 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
157- REAL(EB) :: POS(3)
158+ REAL(EB) :: POS(3),NBACK(3)
158159INTEGER, ALLOCATABLE :: SEND_CNT(:),RECV_CNT(:),SDISPL(:),RDISPL(:),CNT3_S(:),CNT3_R(:),DSP3_S(:),DSP3_R(:),COUNTER(:)
159160INTEGER, ALLOCATABLE :: SEND_NOM(:),RECV_NOM(:),REPLY_IDX(:),REPLY_SURF(:),REPLY_DIM(:), &
160161 REPLY_BACK(:),REPLY_BSURF(:),REPLY_BDIM(:),MAP_NM(:),MAP_FRONT(:)
161- REAL(EB), ALLOCATABLE :: SEND_POS(:),RECV_POS(:)
162+ REAL(EB), ALLOCATABLE :: SEND_POS(:),RECV_POS(:),SEND_NBACK(:),RECV_NBACK(:)
162163
163164N_RESOLVED = 0
164165ALLOCATE(SEND_CNT(0:N_MPI_PROCESSES-1)) ; SEND_CNT = 0
@@ -169,10 +170,11 @@ SUBROUTINE INITIALIZE_BACK_CFACE_EXCHANGE
169170 IF (NQ==0) CYCLE
170171 IF (PROCESS(NOM)==MY_RANK) THEN ! Owner is on this process: resolve directly.
171172 DO IQ=1,NQ
172- POS(1:3) = MESHES(NM)%OMESH(NOM)%CFACE_QUERY_XYZ(IAXIS:KAXIS,IQ)
173+ POS(1:3) = MESHES(NM)%OMESH(NOM)%CFACE_QUERY_XYZ(IAXIS:KAXIS,IQ)
174+ NBACK(1:3) = MESHES(NM)%OMESH(NOM)%CFACE_QUERY_NBACK(IAXIS:KAXIS,IQ)
173175 CALL SEARCH_OTHER_MESHES(POS(1),POS(2),POS(3),NOM2,IIO,JJO,KKO)
174176 IF (NOM2/=NOM) CYCLE
175- ICFACE = GET_BACK_CFACE_INDEX(NOM,IIO,JJO,KKO,POS,-1,-1)
177+ ICFACE = GET_BACK_CFACE_INDEX(NOM,IIO,JJO,KKO,POS,-1,-1,NBACK )
176178 IF (ICFACE>0) THEN
177179 FRONT = MESHES(NM)%OMESH(NOM)%CFACE_QUERY_FRONT(IQ)
178180 OD_INDEX = MESHES(NM)%CFACE(FRONT)%OD_INDEX
@@ -206,10 +208,12 @@ SUBROUTINE INITIALIZE_BACK_CFACE_EXCHANGE
206208 TOTAL_SEND = SDISPL(N_MPI_PROCESSES-1) + SEND_CNT(N_MPI_PROCESSES-1)
207209 TOTAL_RECV = RDISPL(N_MPI_PROCESSES-1) + RECV_CNT(N_MPI_PROCESSES-1)
208210 CNT3_S = 3*SEND_CNT ; CNT3_R = 3*RECV_CNT ; DSP3_S = 3*SDISPL ; DSP3_R = 3*RDISPL
209- ALLOCATE(SEND_NOM(MAX(TOTAL_SEND,1)),SEND_POS(MAX(3*TOTAL_SEND,1)),MAP_NM(MAX(TOTAL_SEND,1)), &
211+ ALLOCATE(SEND_NOM(MAX(TOTAL_SEND,1)),SEND_POS(MAX(3*TOTAL_SEND,1)),SEND_NBACK(MAX(3*TOTAL_SEND,1)), &
212+ MAP_NM(MAX(TOTAL_SEND,1)), &
210213 MAP_FRONT(MAX(TOTAL_SEND,1)),REPLY_BACK(MAX(TOTAL_SEND,1)),REPLY_BSURF(MAX(TOTAL_SEND,1)), &
211214 REPLY_BDIM(MAX(TOTAL_SEND,1)))
212- ALLOCATE(RECV_NOM(MAX(TOTAL_RECV,1)),RECV_POS(MAX(3*TOTAL_RECV,1)),REPLY_IDX(MAX(TOTAL_RECV,1)), &
215+ ALLOCATE(RECV_NOM(MAX(TOTAL_RECV,1)),RECV_POS(MAX(3*TOTAL_RECV,1)),RECV_NBACK(MAX(3*TOTAL_RECV,1)), &
216+ REPLY_IDX(MAX(TOTAL_RECV,1)), &
213217 REPLY_SURF(MAX(TOTAL_RECV,1)),REPLY_DIM(MAX(TOTAL_RECV,1)))
214218 ALLOCATE(COUNTER(0:N_MPI_PROCESSES-1)) ; COUNTER = SDISPL
215219
@@ -224,24 +228,28 @@ SUBROUTINE INITIALIZE_BACK_CFACE_EXCHANGE
224228 IP = PROCESS(NOM)
225229 DO IQ=1,NQ
226230 P = COUNTER(IP) + 1 ; COUNTER(IP) = P
227- SEND_NOM(P) = NOM
228- SEND_POS(3*P-2:3*P) = MESHES(NM)%OMESH(NOM)%CFACE_QUERY_XYZ(IAXIS:KAXIS,IQ)
229- MAP_NM(P) = NM
230- MAP_FRONT(P) = MESHES(NM)%OMESH(NOM)%CFACE_QUERY_FRONT(IQ)
231+ SEND_NOM(P) = NOM
232+ SEND_POS(3*P-2:3*P) = MESHES(NM)%OMESH(NOM)%CFACE_QUERY_XYZ(IAXIS:KAXIS,IQ)
233+ SEND_NBACK(3*P-2:3*P) = MESHES(NM)%OMESH(NOM)%CFACE_QUERY_NBACK(IAXIS:KAXIS,IQ)
234+ MAP_NM(P) = NM
235+ MAP_FRONT(P) = MESHES(NM)%OMESH(NOM)%CFACE_QUERY_FRONT(IQ)
231236 ENDDO
232237 ENDDO
233238 ENDDO
234239 CALL MPI_ALLTOALLV(SEND_NOM,SEND_CNT,SDISPL,MPI_INTEGER,RECV_NOM,RECV_CNT,RDISPL,MPI_INTEGER,MPI_COMM_WORLD,IERR)
235240 CALL MPI_ALLTOALLV(SEND_POS,CNT3_S,DSP3_S,MPI_DOUBLE_PRECISION,RECV_POS,CNT3_R,DSP3_R,MPI_DOUBLE_PRECISION,&
236241 MPI_COMM_WORLD,IERR)
242+ CALL MPI_ALLTOALLV(SEND_NBACK,CNT3_S,DSP3_S,MPI_DOUBLE_PRECISION,RECV_NBACK,CNT3_R,DSP3_R,MPI_DOUBLE_PRECISION,&
243+ MPI_COMM_WORLD,IERR)
237244
238245 ! Owner side: resolve each received query against its local cut-face data.
239246 DO K=1,TOTAL_RECV
240247 NOM = RECV_NOM(K)
241- POS(1:3) = RECV_POS(3*K-2:3*K)
248+ POS(1:3) = RECV_POS(3*K-2:3*K)
249+ NBACK(1:3) = RECV_NBACK(3*K-2:3*K)
242250 CALL SEARCH_OTHER_MESHES(POS(1),POS(2),POS(3),NOM2,IIO,JJO,KKO)
243251 ICFACE = 0 ; SURF_B = 0
244- IF (NOM2==NOM) ICFACE = GET_BACK_CFACE_INDEX(NOM,IIO,JJO,KKO,POS,-1,-1)
252+ IF (NOM2==NOM) ICFACE = GET_BACK_CFACE_INDEX(NOM,IIO,JJO,KKO,POS,-1,-1,NBACK )
245253 IF (ICFACE>0) SURF_B = MESHES(NOM)%CFACE(ICFACE)%SURF_INDEX
246254 REPLY_IDX(K) = ICFACE
247255 REPLY_SURF(K) = SURF_B
@@ -304,8 +312,8 @@ SUBROUTINE INITIALIZE_BACK_CFACE_EXCHANGE
304312 CALL MPI_ALLREDUCE(MPI_IN_PLACE,N_GLOBAL,1,MPI_INTEGER,MPI_SUM,MPI_COMM_WORLD,IERR)
305313 IF (N_GLOBAL>0) CF_BACK_EXCHANGE_ACTIVE = .TRUE.
306314
307- DEALLOCATE(RECV_CNT,SDISPL,RDISPL,CNT3_S,CNT3_R,DSP3_S,DSP3_R,COUNTER,SEND_NOM,SEND_POS,MAP_NM,MAP_FRONT, &
308- REPLY_BACK,REPLY_BSURF,REPLY_BDIM,RECV_NOM,RECV_POS,REPLY_IDX,REPLY_SURF,REPLY_DIM)
315+ DEALLOCATE(RECV_CNT,SDISPL,RDISPL,CNT3_S,CNT3_R,DSP3_S,DSP3_R,COUNTER,SEND_NOM,SEND_POS,SEND_NBACK, MAP_NM,MAP_FRONT, &
316+ REPLY_BACK,REPLY_BSURF,REPLY_BDIM,RECV_NOM,RECV_POS,RECV_NBACK, REPLY_IDX,REPLY_SURF,REPLY_DIM)
309317
310318ENDIF CROSS_PROCESS_IF
311319DEALLOCATE(SEND_CNT)
@@ -622,7 +630,7 @@ SUBROUTINE GET_H_GUARD_CUTCELL(IPZ,HP)
622630 ELSE; D_EXT = ABS(MESHES(NOM)%ZC(KKO) - XFN)
623631 ENDIF
624632 END SELECT
625- ! Refinement seam only: match GET_H_MATRIX_CC sub-face selection (skip solid/no-unknown partners).
633+ ! Refinement seam only: match GET_H_MATRIX_CC sub-face selection (skip solid/no-unknown partners).
626634 IF (WC%BOUNDARY_TYPE == INTERPOLATED_BOUNDARY) THEN
627635 IF (ALLOCATED(OM%MUNKH)) THEN; IF (OM%MUNKH(IIO,JJO,KKO) < 1) CYCLE; ENDIF
628636 IF (MESHES(NOM)%FCVAR(IIO+ISHF(IAXIS),JJO+ISHF(JAXIS),KKO+ISHF(KAXIS),CC_FGSC,X1AXIS) == CC_SOLID) CYCLE
@@ -6756,6 +6764,20 @@ SUBROUTINE GET_UVWGAS_CFACE(U_CELL,V_CELL,W_CELL,IND1,IND2,UP,VP,WP,PREDFCT)
67566764RETURN
67576765END SUBROUTINE GET_UVWGAS_CFACE
67586766
6767+ ! ----------------------------------- GET_CFACE_RAD_NVEC ---------------------------------
6768+ FUNCTION GET_CFACE_RAD_NVEC(CFA) RESULT(NVEC)
6769+
6770+ TYPE(CFACE_TYPE), INTENT(IN) :: CFA
6771+ REAL(EB) :: NVEC(IAXIS:KAXIS)
6772+ INTEGER :: IBOD,IWSEL
6773+
6774+ NVEC(IAXIS:KAXIS) = BOUNDARY_COORD(CFA%BC_INDEX)%NVEC(IAXIS:KAXIS)
6775+ IBOD = CUT_FACE(CFA%CUT_FACE_IND1)%BODTRI(1,CFA%CUT_FACE_IND2)
6776+ IWSEL= CUT_FACE(CFA%CUT_FACE_IND1)%BODTRI(2,CFA%CUT_FACE_IND2)
6777+ IF (IBOD>=1 .AND. IWSEL>=1) NVEC(IAXIS:KAXIS) = GEOMETRY(IBOD)%FACES_NORMAL(IAXIS:KAXIS,IWSEL)
6778+
6779+ END FUNCTION GET_CFACE_RAD_NVEC
6780+
67596781! ----------------------------------- GET_PRES_CFACE ---------------------------------
67606782
67616783SUBROUTINE GET_PRES_CFACE(PRESS,IND1,IND2,CFA)
@@ -8936,7 +8958,7 @@ SUBROUTINE CCSPECIES_ADVECTION
89368958! region and adds components to thermodynamic divergence.
89378959
89388960! Local Variables:
8939- REAL(EB) :: RHO_Z_PV(-2:1), VELC, FN_ZZ, ZZ_GET_N
8961+ REAL(EB) :: RHO_Z_PV(-2:1), VELC, FN_ZZ, FN_ZZ_USE, ZZ_GET_N
89408962REAL(EB), PARAMETER :: SGNFCT=1._EB
89418963INTEGER :: IOR, ICFA
89428964TYPE(BOUNDARY_PROP1_TYPE), POINTER :: B1
@@ -9127,6 +9149,12 @@ SUBROUTINE CCSPECIES_ADVECTION
91279149 CASE(INTERPOLATED_BOUNDARY)
91289150 VELC = UVW_SAVE(IW)
91299151 END SELECT
9152+ ! For a cut-cell against a mesh interface,flux-limited value built across the interface.
9153+ IF ((WC%BOUNDARY_TYPE==INTERPOLATED_BOUNDARY .OR. WC%BOUNDARY_TYPE==PERIODIC_BOUNDARY) .AND. &
9154+ RCF%CELL_LIST(1,ISIDE+2)==CC_FTYPE_CFGAS) THEN
9155+ ICC = RCF%CELL_LIST(2,ISIDE+2); JCC = RCF%CELL_LIST(3,ISIDE+2)
9156+ CALL GET_CCIFACE_RHOZZ_LIM(X1AXIS,I,J,K,ISIDE+2,ICC,JCC,N,VELC,PRFCT,FN_ZZ)
9157+ ENDIF
91309158 SELECT CASE(RCF%CELL_LIST(1,ISIDE+2))
91319159 CASE(CC_FTYPE_RGGAS)
91329160 SELECT CASE(X1AXIS)
@@ -9342,8 +9370,12 @@ SUBROUTINE CCSPECIES_ADVECTION
93429370 RHOPV(ISIDE) = PRFCT *CUT_CELL(ICC)%RHO(JCC) + (1._EB-PRFCT) *CUT_CELL(ICC)%RHOS(JCC)
93439371 ZZ_GET_N = PRFCT*CUT_CELL(ICC)%ZZ(N,JCC) + (1._EB-PRFCT)*CUT_CELL(ICC)%ZZS(N,JCC)
93449372 RHO_Z_PV(ISIDE) = RHOPV(ISIDE)*ZZ_GET_N
9373+ ! At a mesh interface use the flux-limited bar{rho*Z} across the interface.
9374+ FN_ZZ_USE = FN_ZZ
9375+ IF (WC%BOUNDARY_TYPE==INTERPOLATED_BOUNDARY .OR. WC%BOUNDARY_TYPE==PERIODIC_BOUNDARY) &
9376+ CALL GET_CCIFACE_RHOZZ_LIM(X1AXIS,I,J,K,ISIDE+2,ICC,JCC,N,VELC,PRFCT,FN_ZZ_USE)
93459377 CUT_CELL(ICC)%U_DOT_DEL_RHO_Z_VOL(N,JCC) = CUT_CELL(ICC)%U_DOT_DEL_RHO_Z_VOL(N,JCC) + &
9346- FCT*SGNFCT*(FN_ZZ -RHO_Z_PV(ISIDE))*VELC*AF
9378+ FCT*SGNFCT*(FN_ZZ_USE -RHO_Z_PV(ISIDE))*VELC*AF
93479379 ENDIF
93489380 ENDDO ! IFACE
93499381
@@ -9473,7 +9505,7 @@ SUBROUTINE CCENTHALPY_ADVECTION
94739505
94749506
94759507! Local Variables:
9476- REAL(EB) :: RHO_H_S_PV(-2:1), VELC, VELC2, FN_H_S, TMP_F_GAS
9508+ REAL(EB) :: RHO_H_S_PV(-2:1), VELC, VELC2, FN_H_S, FN_H_S_USE, TMP_F_GAS
94779509INTEGER :: IOR, ICFA
94789510TYPE(BOUNDARY_PROP1_TYPE), POINTER :: B1
94799511TYPE(CC_REGFACEZ_TYPE), POINTER, DIMENSION(:) :: REGFACE_Z
@@ -10070,6 +10102,12 @@ SUBROUTINE CCENTHALPY_ADVECTION
1007010102 ZZ_GET(1:N_TRACKED_SPECIES) = B1%ZZ_F(1:N_TRACKED_SPECIES)
1007110103 CALL GET_SENSIBLE_ENTHALPY(ZZ_GET,H_S,TMP_F_GAS)
1007210104 FN_H_S = B1%RHO_F*H_S ! bar{rho*hs}
10105+ ! At a mesh interface with a cut-cell, use the flux-limited bar{rho*h_s} built across the interface.
10106+ IF ((WC%BOUNDARY_TYPE==INTERPOLATED_BOUNDARY .OR. WC%BOUNDARY_TYPE==PERIODIC_BOUNDARY) .AND. &
10107+ RC_FACE(IFACE)%CELL_LIST(1,ISIDE+2)==CC_FTYPE_CFGAS) THEN
10108+ ICC = RC_FACE(IFACE)%CELL_LIST(2,ISIDE+2); JCC = RC_FACE(IFACE)%CELL_LIST(3,ISIDE+2)
10109+ CALL GET_CCIFACE_RHOHS_LIM(X1AXIS,I,J,K,ISIDE+2,ICC,JCC,VELC,PRFCT,FN_H_S)
10110+ ENDIF
1007310111 ! Finally add to Div:
1007410112 SELECT CASE(RC_FACE(IFACE)%CELL_LIST(1,ISIDE+2))
1007510113 CASE(CC_FTYPE_RGGAS) ! Regular cell
@@ -10133,7 +10171,13 @@ SUBROUTINE CCENTHALPY_ADVECTION
1013310171 (1._EB-PRFCT)*CUT_CELL(ICC)%ZZS(1:N_TRACKED_SPECIES,JCC)
1013410172 CALL GET_SENSIBLE_ENTHALPY(ZZ_GET,H_S,TMPV(ISIDE))
1013510173 RHO_H_S_PV(ISIDE) = RHOPV(ISIDE)*H_S
10136- CUT_CELL(ICC)%DVOL(JCC)=CUT_CELL(ICC)%DVOL(JCC)+FCT*(-1._EB)*(FN_H_S-RHO_H_S_PV(ISIDE))*VELC*AF ! +ve or -ve dot
10174+ ! At a mesh interface use the flux-limited bar{rho*h_s} built across the interface.
10175+ FN_H_S_USE = FN_H_S
10176+ IF (WC%BOUNDARY_TYPE==INTERPOLATED_BOUNDARY .OR. WC%BOUNDARY_TYPE==PERIODIC_BOUNDARY) &
10177+ CALL GET_CCIFACE_RHOHS_LIM(CUT_FACE(ICF)%IJK(KAXIS+1), &
10178+ CUT_FACE(ICF)%IJK(IAXIS),CUT_FACE(ICF)%IJK(JAXIS),CUT_FACE(ICF)%IJK(KAXIS), &
10179+ ISIDE+2,ICC,JCC,VELC,PRFCT,FN_H_S_USE)
10180+ CUT_CELL(ICC)%DVOL(JCC)=CUT_CELL(ICC)%DVOL(JCC)+FCT*(-1._EB)*(FN_H_S_USE-RHO_H_S_PV(ISIDE))*VELC*AF ! +ve or -ve dot
1013710181 END SELECT
1013810182 ENDDO ! IFACE
1013910183ENDDO ! ICF
@@ -13449,6 +13493,112 @@ SUBROUTINE GET_RHOZZVECTOR_SCALAR_3D(N)
1344913493END SUBROUTINE GET_RHOZZVECTOR_SCALAR_3D
1345013494
1345113495
13496+ ! ----------------------------- GET_CCIFACE_RHOZZ_LIM --------------------------
13497+ ! Flux-limited bar{rho*Z_N} face value at an INTERPOLATED / PERIODIC-boundary gasphase cut-face.
13498+ SUBROUTINE GET_CCIFACE_RHOZZ_LIM(X1AXIS,IFC,JFC,KFC,ILOC,ICC,JCC,N,VELC,PRFCT,FN_ZZ)
13499+
13500+ INTEGER, INTENT(IN) :: X1AXIS,IFC,JFC,KFC,ILOC,ICC,JCC,N
13501+ REAL(EB), INTENT(IN) :: VELC,PRFCT
13502+ REAL(EB), INTENT(OUT):: FN_ZZ
13503+ INTEGER :: DD,ILSD,ILOUT,II,JJ,KK,SHFT(3)
13504+ REAL(EB) :: RZPV(-2:1)
13505+ REAL(EB), POINTER, DIMENSION(:,:,:) :: RHOP
13506+ REAL(EB), POINTER, DIMENSION(:,:,:,:) :: ZZP
13507+ REAL(EB), TARGET :: ZT(0:3,1,1),UT(1,1,1),FT(1,1,1)
13508+ REAL(EB), POINTER, DIMENSION(:,:,:) :: ZTP,UTP,FTP
13509+
13510+ IF (PRFCT > 0.5_EB) THEN; RHOP=>RHO ; ZZP=>ZZ ! PRFCT=1 -> n-level fields
13511+ ELSE ; RHOP=>RHOS; ZZP=>ZZS ! PRFCT=0 -> star fields
13512+ ENDIF
13513+
13514+ SELECT CASE(X1AXIS)
13515+ CASE(IAXIS); SHFT=(/1,0,0/)
13516+ CASE(JAXIS); SHFT=(/0,1,0/)
13517+ CASE(KAXIS); SHFT=(/0,0,1/)
13518+ END SELECT
13519+
13520+ ! Cartesian rho*Z on the four stencil cells: cell(DD) = base_face_cell + (1+DD) along the face axis.
13521+ DO DD=-2,1
13522+ II=IFC+(1+DD)*SHFT(1); JJ=JFC+(1+DD)*SHFT(2); KK=KFC+(1+DD)*SHFT(3)
13523+ RZPV(DD)=RHOP(II,JJ,KK)*ZZP(II,JJ,KK,N)
13524+ ENDDO
13525+
13526+ ! Override the local immediate cut-cell (side ILOC) with the detailed cut-cell rho*Z:
13527+ ILSD = ILOC-2 ! LOW_IND(1) -> -1 ; HIGH_IND(2) -> 0
13528+ RZPV(ILSD) = (PRFCT*CUT_CELL(ICC)%RHO(JCC) +(1._EB-PRFCT)*CUT_CELL(ICC)%RHOS(JCC)) * &
13529+ (PRFCT*CUT_CELL(ICC)%ZZ(N,JCC)+(1._EB-PRFCT)*CUT_CELL(ICC)%ZZS(N,JCC))
13530+
13531+ ! Solid fall-back only for the local-outer stencil cell (the ghost-outer cell is remote gas):
13532+ IF (ILOC==LOW_IND) THEN; ILOUT=-2; ELSE; ILOUT=1; ENDIF
13533+ II=IFC+(1+ILOUT)*SHFT(1); JJ=JFC+(1+ILOUT)*SHFT(2); KK=KFC+(1+ILOUT)*SHFT(3)
13534+ IF (II>=1.AND.II<=IBAR .AND. JJ>=1.AND.JJ<=JBAR .AND. KK>=1.AND.KK<=KBAR) THEN
13535+ IF (CELL(CELL_INDEX(II,JJ,KK))%SOLID .OR. CCVAR(II,JJ,KK,CC_CGSC)==CC_SOLID) RZPV(ILOUT)=RZPV(ILSD)
13536+ ENDIF
13537+ ZT(0:3,1,1)=RZPV(-2:1); UT(1,1,1)=VELC
13538+ ZTP=>ZT; UTP=>UT; FTP=>FT
13539+ CALL GET_SCALAR_FACE_VALUE(UTP,ZTP,FTP,1,1,1,1,1,1,1,I_FLUX_LIMITER)
13540+ FN_ZZ=FT(1,1,1)
13541+
13542+ RETURN
13543+ END SUBROUTINE GET_CCIFACE_RHOZZ_LIM
13544+
13545+
13546+ ! ----------------------------- GET_CCIFACE_RHOHS_LIM --------------------------
13547+ ! Enthalpy counterpart of GET_CCIFACE_RHOZZ_LIM: flux-limited bar{rho*h_s} face value at an
13548+ ! INTERPOLATED / PERIODIC-boundary gasphase cut-face.
13549+ SUBROUTINE GET_CCIFACE_RHOHS_LIM(X1AXIS,IFC,JFC,KFC,ILOC,ICC,JCC,VELC,PRFCT,FN_H_S)
13550+ USE PHYSICAL_FUNCTIONS, ONLY: GET_SENSIBLE_ENTHALPY
13551+
13552+ INTEGER, INTENT(IN) :: X1AXIS,IFC,JFC,KFC,ILOC,ICC,JCC
13553+ REAL(EB), INTENT(IN) :: VELC,PRFCT
13554+ REAL(EB), INTENT(OUT):: FN_H_S
13555+ INTEGER :: DD,ILSD,ILOUT,II,JJ,KK,SHFT(3)
13556+ REAL(EB) :: RHS_PV(-2:1),HS1,ZZ_GET(1:N_TRACKED_SPECIES)
13557+ REAL(EB), POINTER, DIMENSION(:,:,:) :: RHOP
13558+ REAL(EB), POINTER, DIMENSION(:,:,:,:) :: ZZP
13559+ REAL(EB), TARGET :: ZT(0:3,1,1),UT(1,1,1),FT(1,1,1)
13560+ REAL(EB), POINTER, DIMENSION(:,:,:) :: ZTP,UTP,FTP
13561+
13562+ IF (PRFCT > 0.5_EB) THEN; RHOP=>RHO ; ZZP=>ZZ
13563+ ELSE ; RHOP=>RHOS; ZZP=>ZZS
13564+ ENDIF
13565+
13566+ SELECT CASE(X1AXIS)
13567+ CASE(IAXIS); SHFT=(/1,0,0/)
13568+ CASE(JAXIS); SHFT=(/0,1,0/)
13569+ CASE(KAXIS); SHFT=(/0,0,1/)
13570+ END SELECT
13571+
13572+ ! Cartesian rho*h_s on the four stencil cells: cell(DD) = base_face_cell + (1+DD) along the axis.
13573+ DO DD=-2,1
13574+ II=IFC+(1+DD)*SHFT(1); JJ=JFC+(1+DD)*SHFT(2); KK=KFC+(1+DD)*SHFT(3)
13575+ ZZ_GET(1:N_TRACKED_SPECIES)=ZZP(II,JJ,KK,1:N_TRACKED_SPECIES)
13576+ CALL GET_SENSIBLE_ENTHALPY(ZZ_GET,HS1,TMP(II,JJ,KK))
13577+ RHS_PV(DD)=RHOP(II,JJ,KK)*HS1
13578+ ENDDO
13579+
13580+ ! Override the local immediate cut-cell (side ILOC) with the detailed cut-cell rho*h_s:
13581+ ILSD = ILOC-2
13582+ ZZ_GET(1:N_TRACKED_SPECIES)=PRFCT*CUT_CELL(ICC)%ZZ(1:N_TRACKED_SPECIES,JCC)+ &
13583+ (1._EB-PRFCT)*CUT_CELL(ICC)%ZZS(1:N_TRACKED_SPECIES,JCC)
13584+ CALL GET_SENSIBLE_ENTHALPY(ZZ_GET,HS1,CUT_CELL(ICC)%TMP(JCC))
13585+ RHS_PV(ILSD)=(PRFCT*CUT_CELL(ICC)%RHO(JCC)+(1._EB-PRFCT)*CUT_CELL(ICC)%RHOS(JCC))*HS1
13586+
13587+ ! Solid fall-back for the local-outer stencil cell only:
13588+ IF (ILOC==LOW_IND) THEN; ILOUT=-2; ELSE; ILOUT=1; ENDIF
13589+ II=IFC+(1+ILOUT)*SHFT(1); JJ=JFC+(1+ILOUT)*SHFT(2); KK=KFC+(1+ILOUT)*SHFT(3)
13590+ IF (II>=1.AND.II<=IBAR .AND. JJ>=1.AND.JJ<=JBAR .AND. KK>=1.AND.KK<=KBAR) THEN
13591+ IF (CELL(CELL_INDEX(II,JJ,KK))%SOLID .OR. CCVAR(II,JJ,KK,CC_CGSC)==CC_SOLID) RHS_PV(ILOUT)=RHS_PV(ILSD)
13592+ ENDIF
13593+ ZT(0:3,1,1)=RHS_PV(-2:1); UT(1,1,1)=VELC
13594+ ZTP=>ZT; UTP=>UT; FTP=>FT
13595+ CALL GET_SCALAR_FACE_VALUE(UTP,ZTP,FTP,1,1,1,1,1,1,1,I_FLUX_LIMITER)
13596+ FN_H_S=FT(1,1,1)
13597+
13598+ RETURN
13599+ END SUBROUTINE GET_CCIFACE_RHOHS_LIM
13600+
13601+
1345213602! ------------------------- GET_ADVDIFFVECTOR_SCALAR_3D -------------------------
1345313603
1345413604SUBROUTINE GET_ADVDIFFVECTOR_SCALAR_3D(N)
@@ -13460,7 +13610,7 @@ SUBROUTINE GET_ADVDIFFVECTOR_SCALAR_3D(N)
1346013610REAL(EB):: PRFCT
1346113611INTEGER :: X1AXIS,IFACE,IND(LOW_IND:HIGH_IND),IND_LOC(LOW_IND:HIGH_IND),ICF,IND1,IND2,IOR
1346213612INTEGER :: LOCROW_1,LOCROW_2,ILOC,IROW,ICC,JCC,IW
13463- REAL(EB):: AF,VELC,RHO_Z,FN_ZZ,FCT
13613+ REAL(EB):: AF,VELC,RHO_Z,FN_ZZ,FCT,FN_ZZ_USE
1346413614REAL(EB), POINTER, DIMENSION(:,:,:) :: RHOP,UP,VP,WP
1346513615REAL(EB), POINTER, DIMENSION(:,:,:,:):: ZZP
1346613616TYPE(CC_REGFACEZ_TYPE), POINTER, DIMENSION(:) :: REGFACE_Z
@@ -13620,6 +13770,12 @@ SUBROUTINE GET_ADVDIFFVECTOR_SCALAR_3D(N)
1362013770 CASE(INTERPOLATED_BOUNDARY)
1362113771 VELC = UVW_SAVE(IW)
1362213772 END SELECT
13773+ ! For a cut-cell against a mesh interface , use the flux-limited bar{rho*Z} built across the interface.
13774+ IF ((WC%BOUNDARY_TYPE==INTERPOLATED_BOUNDARY .OR. WC%BOUNDARY_TYPE==PERIODIC_BOUNDARY) .AND. &
13775+ MESHES(NM)%RC_FACE(IFACE)%CELL_LIST(1,ILOC)==CC_FTYPE_CFGAS) THEN
13776+ ICC = MESHES(NM)%RC_FACE(IFACE)%CELL_LIST(2,ILOC); JCC = MESHES(NM)%RC_FACE(IFACE)%CELL_LIST(3,ILOC)
13777+ CALL GET_CCIFACE_RHOZZ_LIM(X1AXIS,I,J,K,ILOC,ICC,JCC,N,VELC,PRFCT,FN_ZZ)
13778+ ENDIF
1362313779
1362413780 IROW=IND_LOC(ILOC) ! Process Local Unknown number.
1362513781 FCT = REAL(3-2*ILOC,EB)
@@ -13652,7 +13808,15 @@ SUBROUTINE GET_ADVDIFFVECTOR_SCALAR_3D(N)
1365213808 ! First (rho hs)_i,j,k:
1365313809 IF (CUT_FACE(ICF)%CELL_LIST(1,ILOC,IFACE) == CC_FTYPE_CFGAS) THEN
1365413810 IROW=IND_LOC(ILOC) ! Process Local Unknown number.
13655- F_Z(IROW) = F_Z(IROW) + FCT*FN_ZZ*VELC*AF
13811+ FN_ZZ_USE = FN_ZZ
13812+ ! Build the flux-limited bar{rho*Z} across the interface.
13813+ IF (WC%BOUNDARY_TYPE==INTERPOLATED_BOUNDARY .OR. WC%BOUNDARY_TYPE==PERIODIC_BOUNDARY) THEN
13814+ ICC = CUT_FACE(ICF)%CELL_LIST(2,ILOC,IFACE); JCC = CUT_FACE(ICF)%CELL_LIST(3,ILOC,IFACE)
13815+ CALL GET_CCIFACE_RHOZZ_LIM(CUT_FACE(ICF)%IJK(KAXIS+1), &
13816+ CUT_FACE(ICF)%IJK(IAXIS),CUT_FACE(ICF)%IJK(JAXIS),CUT_FACE(ICF)%IJK(KAXIS), &
13817+ ILOC,ICC,JCC,N,VELC,PRFCT,FN_ZZ_USE)
13818+ ENDIF
13819+ F_Z(IROW) = F_Z(IROW) + FCT*FN_ZZ_USE*VELC*AF
1365613820 ENDIF
1365713821 ENDDO ! IFACE
1365813822
0 commit comments