Skip to content

Commit f2a8b5f

Browse files
committed
FDS Source: update to TEST_FLUX_LIMITER_FACE_CORRECTION to account for variable molecular weights
1 parent ff41ca4 commit f2a8b5f

File tree

1 file changed

+50
-23
lines changed

1 file changed

+50
-23
lines changed

Source/mass.f90

Lines changed: 50 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,16 @@ MODULE MASS
2020
SUBROUTINE MASS_FINITE_DIFFERENCES(NM)
2121

2222
USE MATH_FUNCTIONS, ONLY: GET_SCALAR_FACE_VALUE
23+
USE PHYSICAL_FUNCTIONS, ONLY: GET_MOLECULAR_WEIGHT
2324

2425
INTEGER, INTENT(IN) :: NM
25-
REAL(EB) :: TNOW
26+
REAL(EB) :: TNOW,MW_F,MW_G,ZZ_GET(1:N_TRACKED_SPECIES)
2627
REAL(EB), DIMENSION(0:3,0:3,0:3) :: U_TEMP,Z_TEMP,F_TEMP
2728
REAL(EB), PARAMETER :: DUMMY=0._EB
2829
INTEGER :: I,J,K,N,IOR,IW,IIG,JJG,KKG,II,JJ,KK,IC
2930
REAL(EB), POINTER, DIMENSION(:,:,:) :: UU,VV,WW,RHOP
3031
REAL(EB), POINTER, DIMENSION(:,:,:,:) :: ZZP
31-
REAL(EB), POINTER, DIMENSION(:,:,:) :: RHO_Z_P
32+
REAL(EB), POINTER, DIMENSION(:,:,:) :: RHO_Z_P,RHO_RMW
3233
TYPE(WALL_TYPE), POINTER :: WC
3334
TYPE(BOUNDARY_COORD_TYPE), POINTER :: BC
3435
TYPE(BOUNDARY_PROP1_TYPE), POINTER :: B1
@@ -181,11 +182,25 @@ SUBROUTINE MASS_FINITE_DIFFERENCES(NM)
181182

182183
! Repeat the above for DENSITY
183184

184-
CALL GET_SCALAR_FACE_VALUE(UU,RHOP,FX(:,:,:,0),1,IBM1,1,JBAR,1,KBAR,1,I_FLUX_LIMITER)
185-
CALL GET_SCALAR_FACE_VALUE(VV,RHOP,FY(:,:,:,0),1,IBAR,1,JBM1,1,KBAR,2,I_FLUX_LIMITER)
186-
CALL GET_SCALAR_FACE_VALUE(WW,RHOP,FZ(:,:,:,0),1,IBAR,1,JBAR,1,KBM1,3,I_FLUX_LIMITER)
185+
RHO_RMW=>WORK1
187186

188-
!$OMP PARALLEL DO PRIVATE(IW,WC,BC,B1,II,JJ,KK,IIG,JJG,KKG,IOR,IC,U_TEMP,Z_TEMP,F_TEMP)
187+
!$OMP PARALLEL DO PRIVATE(ZZ_GET,MW_G) SCHEDULE(STATIC)
188+
DO K=0,KBP1
189+
DO J=0,JBP1
190+
DO I=0,IBP1
191+
ZZ_GET(1:N_TRACKED_SPECIES) = ZZP(I,J,K,1:N_TRACKED_SPECIES)
192+
CALL GET_MOLECULAR_WEIGHT(ZZ_GET,MW_G)
193+
RHO_RMW(I,J,K) = RHOP(I,J,K)/MW_G
194+
ENDDO
195+
ENDDO
196+
ENDDO
197+
!$OMP END PARALLEL DO
198+
199+
CALL GET_SCALAR_FACE_VALUE(UU,RHO_RMW,FX(:,:,:,0),1,IBM1,1,JBAR,1,KBAR,1,I_FLUX_LIMITER)
200+
CALL GET_SCALAR_FACE_VALUE(VV,RHO_RMW,FY(:,:,:,0),1,IBAR,1,JBM1,1,KBAR,2,I_FLUX_LIMITER)
201+
CALL GET_SCALAR_FACE_VALUE(WW,RHO_RMW,FZ(:,:,:,0),1,IBAR,1,JBAR,1,KBM1,3,I_FLUX_LIMITER)
202+
203+
!$OMP PARALLEL DO PRIVATE(IW,WC,BC,B1,II,JJ,KK,IIG,JJG,KKG,IOR,IC,U_TEMP,Z_TEMP,F_TEMP,ZZ_GET,MW_F)
189204
WALL_LOOP_3: DO IW=1,N_EXTERNAL_WALL_CELLS+N_INTERNAL_WALL_CELLS
190205
WC=>WALL(IW)
191206
IF (WC%BOUNDARY_TYPE==NULL_BOUNDARY) CYCLE WALL_LOOP_3
@@ -211,13 +226,15 @@ SUBROUTINE MASS_FINITE_DIFFERENCES(NM)
211226
CASE(-3); FZ(IIG,JJG,KKG,0) = 0._EB
212227
END SELECT
213228
ELSE
229+
ZZ_GET(1:N_TRACKED_SPECIES) = B1%ZZ_F(1:N_TRACKED_SPECIES)
230+
CALL GET_MOLECULAR_WEIGHT(ZZ_GET,MW_F)
214231
SELECT CASE(IOR)
215-
CASE( 1); FX(IIG-1,JJG,KKG,0) = B1%RHO_F
216-
CASE(-1); FX(IIG,JJG,KKG,0) = B1%RHO_F
217-
CASE( 2); FY(IIG,JJG-1,KKG,0) = B1%RHO_F
218-
CASE(-2); FY(IIG,JJG,KKG,0) = B1%RHO_F
219-
CASE( 3); FZ(IIG,JJG,KKG-1,0) = B1%RHO_F
220-
CASE(-3); FZ(IIG,JJG,KKG,0) = B1%RHO_F
232+
CASE( 1); FX(IIG-1,JJG,KKG,0) = B1%RHO_F/MW_F
233+
CASE(-1); FX(IIG,JJG,KKG,0) = B1%RHO_F/MW_F
234+
CASE( 2); FY(IIG,JJG-1,KKG,0) = B1%RHO_F/MW_F
235+
CASE(-2); FY(IIG,JJG,KKG,0) = B1%RHO_F/MW_F
236+
CASE( 3); FZ(IIG,JJG,KKG-1,0) = B1%RHO_F/MW_F
237+
CASE(-3); FZ(IIG,JJG,KKG,0) = B1%RHO_F/MW_F
221238
END SELECT
222239
ENDIF
223240

@@ -231,7 +248,7 @@ SUBROUTINE MASS_FINITE_DIFFERENCES(NM)
231248
! /// II /// II+1 | II+2 | ...
232249
! ^ WALL_INDEX(II+1,+1)
233250
IF ((UU(II+1,JJ,KK)>0._EB) .AND. .NOT.(CELL(CELL_INDEX(II+1,JJ,KK))%WALL_INDEX(+1)>0)) THEN
234-
Z_TEMP(0:3,1,1) = (/RHOP(II+1,JJ,KK),RHOP(II+1:II+2,JJ,KK),DUMMY/)
251+
Z_TEMP(0:3,1,1) = (/RHO_RMW(II+1,JJ,KK),RHO_RMW(II+1:II+2,JJ,KK),DUMMY/)
235252
U_TEMP(1,1,1) = UU(II+1,JJ,KK)
236253
CALL GET_SCALAR_FACE_VALUE(U_TEMP,Z_TEMP,F_TEMP,1,1,1,1,1,1,1,I_FLUX_LIMITER)
237254
FX(II+1,JJ,KK,0) = F_TEMP(1,1,1)
@@ -241,35 +258,35 @@ SUBROUTINE MASS_FINITE_DIFFERENCES(NM)
241258
! ... | II-2 | II-1 /// II ///
242259
! ^ WALL_INDEX(II-1,-1)
243260
IF ((UU(II-2,JJ,KK)<0._EB) .AND. .NOT.(CELL(CELL_INDEX(II-1,JJ,KK))%WALL_INDEX(-1)>0)) THEN
244-
Z_TEMP(0:3,1,1) = (/DUMMY,RHOP(II-2:II-1,JJ,KK),RHOP(II-1,JJ,KK)/)
261+
Z_TEMP(0:3,1,1) = (/DUMMY,RHO_RMW(II-2:II-1,JJ,KK),RHO_RMW(II-1,JJ,KK)/)
245262
U_TEMP(1,1,1) = UU(II-2,JJ,KK)
246263
CALL GET_SCALAR_FACE_VALUE(U_TEMP,Z_TEMP,F_TEMP,1,1,1,1,1,1,1,I_FLUX_LIMITER)
247264
FX(II-2,JJ,KK,0) = F_TEMP(1,1,1)
248265
ENDIF
249266
CASE( 2) OFF_WALL_SELECT_3
250267
IF ((VV(II,JJ+1,KK)>0._EB) .AND. .NOT.(CELL(CELL_INDEX(II,JJ+1,KK))%WALL_INDEX(+2)>0)) THEN
251-
Z_TEMP(1,0:3,1) = (/RHOP(II,JJ+1,KK),RHOP(II,JJ+1:JJ+2,KK),DUMMY/)
268+
Z_TEMP(1,0:3,1) = (/RHO_RMW(II,JJ+1,KK),RHO_RMW(II,JJ+1:JJ+2,KK),DUMMY/)
252269
U_TEMP(1,1,1) = VV(II,JJ+1,KK)
253270
CALL GET_SCALAR_FACE_VALUE(U_TEMP,Z_TEMP,F_TEMP,1,1,1,1,1,1,2,I_FLUX_LIMITER)
254271
FY(II,JJ+1,KK,0) = F_TEMP(1,1,1)
255272
ENDIF
256273
CASE(-2) OFF_WALL_SELECT_3
257274
IF ((VV(II,JJ-2,KK)<0._EB) .AND. .NOT.(CELL(CELL_INDEX(II,JJ-1,KK))%WALL_INDEX(-2)>0)) THEN
258-
Z_TEMP(1,0:3,1) = (/DUMMY,RHOP(II,JJ-2:JJ-1,KK),RHOP(II,JJ-1,KK)/)
275+
Z_TEMP(1,0:3,1) = (/DUMMY,RHO_RMW(II,JJ-2:JJ-1,KK),RHO_RMW(II,JJ-1,KK)/)
259276
U_TEMP(1,1,1) = VV(II,JJ-2,KK)
260277
CALL GET_SCALAR_FACE_VALUE(U_TEMP,Z_TEMP,F_TEMP,1,1,1,1,1,1,2,I_FLUX_LIMITER)
261278
FY(II,JJ-2,KK,0) = F_TEMP(1,1,1)
262279
ENDIF
263280
CASE( 3) OFF_WALL_SELECT_3
264281
IF ((WW(II,JJ,KK+1)>0._EB) .AND. .NOT.(CELL(CELL_INDEX(II,JJ,KK+1))%WALL_INDEX(+3)>0)) THEN
265-
Z_TEMP(1,1,0:3) = (/RHOP(II,JJ,KK+1),RHOP(II,JJ,KK+1:KK+2),DUMMY/)
282+
Z_TEMP(1,1,0:3) = (/RHO_RMW(II,JJ,KK+1),RHO_RMW(II,JJ,KK+1:KK+2),DUMMY/)
266283
U_TEMP(1,1,1) = WW(II,JJ,KK+1)
267284
CALL GET_SCALAR_FACE_VALUE(U_TEMP,Z_TEMP,F_TEMP,1,1,1,1,1,1,3,I_FLUX_LIMITER)
268285
FZ(II,JJ,KK+1,0) = F_TEMP(1,1,1)
269286
ENDIF
270287
CASE(-3) OFF_WALL_SELECT_3
271288
IF ((WW(II,JJ,KK-2)<0._EB) .AND. .NOT.(CELL(CELL_INDEX(II,JJ,KK-1))%WALL_INDEX(-3)>0)) THEN
272-
Z_TEMP(1,1,0:3) = (/DUMMY,RHOP(II,JJ,KK-2:KK-1),RHOP(II,JJ,KK-1)/)
289+
Z_TEMP(1,1,0:3) = (/DUMMY,RHO_RMW(II,JJ,KK-2:KK-1),RHO_RMW(II,JJ,KK-1)/)
273290
U_TEMP(1,1,1) = WW(II,JJ,KK-2)
274291
CALL GET_SCALAR_FACE_VALUE(U_TEMP,Z_TEMP,F_TEMP,1,1,1,1,1,1,3,I_FLUX_LIMITER)
275292
FZ(II,JJ,KK-2,0) = F_TEMP(1,1,1)
@@ -281,20 +298,30 @@ SUBROUTINE MASS_FINITE_DIFFERENCES(NM)
281298
ENDDO WALL_LOOP_3
282299
!$OMP END PARALLEL DO
283300

284-
! Now correct the face value of (RHO*ZZ) such that SUM(RHO*ZZ)_FACE = RHO_FACE
301+
! Now correct the max face value of (RHO*ZZ) such that SUM(RHO*ZZ/MW)_FACE = RHO_FACE/MW_FACE
302+
! (necessary condition to preserve isothermal flow)
285303

286-
!$OMP PARALLEL DO PRIVATE(N) SCHEDULE(STATIC)
304+
!$OMP PARALLEL DO PRIVATE(N,MW_G) SCHEDULE(STATIC)
287305
DO K=0,KBAR
288306
DO J=0,JBAR
289307
DO I=0,IBAR
290308
N=MAXLOC(FX(I,J,K,1:N_TRACKED_SPECIES),1)
291-
FX(I,J,K,N) = MAX( 0._EB, FX(I,J,K,0) - SUM(FX(I,J,K,1:(N-1))) - SUM(FX(I,J,K,(N+1):N_TRACKED_SPECIES)) )
309+
MW_G = SPECIES_MIXTURE(N)%MW
310+
FX(I,J,K,N) = MW_G*MAX( 0._EB, FX(I,J,K,0) &
311+
- SUM(FX(I,J,K,1:(N-1))/SPECIES_MIXTURE(1:(N-1))%MW) &
312+
- SUM(FX(I,J,K,(N+1):N_TRACKED_SPECIES)/SPECIES_MIXTURE((N+1):N_TRACKED_SPECIES)%MW) )
292313

293314
N=MAXLOC(FY(I,J,K,1:N_TRACKED_SPECIES),1)
294-
FY(I,J,K,N) = MAX( 0._EB, FY(I,J,K,0) - SUM(FY(I,J,K,1:(N-1))) - SUM(FY(I,J,K,(N+1):N_TRACKED_SPECIES)) )
315+
MW_G = SPECIES_MIXTURE(N)%MW
316+
FY(I,J,K,N) = MW_G*MAX( 0._EB, FY(I,J,K,0) &
317+
- SUM(FY(I,J,K,1:(N-1))/SPECIES_MIXTURE(1:(N-1))%MW) &
318+
- SUM(FY(I,J,K,(N+1):N_TRACKED_SPECIES)/SPECIES_MIXTURE((N+1):N_TRACKED_SPECIES)%MW) )
295319

296320
N=MAXLOC(FZ(I,J,K,1:N_TRACKED_SPECIES),1)
297-
FZ(I,J,K,N) = MAX( 0._EB, FZ(I,J,K,0) - SUM(FZ(I,J,K,1:(N-1))) - SUM(FZ(I,J,K,(N+1):N_TRACKED_SPECIES)) )
321+
MW_G = SPECIES_MIXTURE(N)%MW
322+
FZ(I,J,K,N) = MW_G*MAX( 0._EB, FZ(I,J,K,0) &
323+
- SUM(FZ(I,J,K,1:(N-1))/SPECIES_MIXTURE(1:(N-1))%MW) &
324+
- SUM(FZ(I,J,K,(N+1):N_TRACKED_SPECIES)/SPECIES_MIXTURE((N+1):N_TRACKED_SPECIES)%MW) )
298325
ENDDO
299326
ENDDO
300327
ENDDO

0 commit comments

Comments
 (0)