Skip to content

Commit 898c602

Browse files
committed
FDS Source: IMPORTANT add flux limter face correction to maintain isothermal flow with multicomponent species
1 parent 7843940 commit 898c602

File tree

4 files changed

+138
-5
lines changed

4 files changed

+138
-5
lines changed

Source/cons.f90

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ MODULE GLOBAL_CONSTANTS
270270
LOGICAL :: TENSOR_DIFFUSIVITY=.FALSE. !< If true, use experimental tensor diffusivity model for spec and tmp
271271
LOGICAL :: OXPYRO_MODEL=.FALSE. !< Flag to use oxidative pyrolysis mass transfer model
272272
LOGICAL :: OUTPUT_WALL_QUANTITIES=.FALSE. !< Flag to force call to WALL_MODEL
273+
LOGICAL :: TEST_FLUX_LIMITER_FACE_CORRECTION=.FALSE.
273274

274275
INTEGER, ALLOCATABLE, DIMENSION(:) :: CHANGE_TIME_STEP_INDEX !< Flag to indicate if a mesh needs to change time step
275276
INTEGER, ALLOCATABLE, DIMENSION(:) :: SETUP_PRESSURE_ZONES_INDEX !< Flag to indicate if a mesh needs to keep searching for ZONEs

Source/init.f90

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ SUBROUTINE INITIALIZE_MESH_VARIABLES_1(DT,NM)
3232
USE RADCONS, ONLY: UIIDIM
3333
USE CONTROL_VARIABLES
3434
USE MATH_FUNCTIONS, ONLY: EVALUATE_RAMP
35-
INTEGER :: N,I,J,K,IW,IC,SURF_INDEX,IOR,IERR,IZERO,II,JJ,KK,OBST_INDEX,N_EXTERNAL_CELLS,NS
35+
INTEGER :: N,I,J,K,IW,IC,SURF_INDEX,IOR,IERR,IZERO,II,JJ,KK,OBST_INDEX,N_EXTERNAL_CELLS,NS,N_LOWER_SCALARS
3636
REAL(EB), INTENT(IN) :: DT
3737
INTEGER, INTENT(IN) :: NM
3838
REAL(EB) :: MU_N,CS,DELTA,INTEGRAL,TEMP,ZSW
@@ -187,11 +187,18 @@ SUBROUTINE INITIALIZE_MESH_VARIABLES_1(DT,NM)
187187

188188
! Allocate scalar face values
189189

190-
ALLOCATE( M%FX(0:IBP1,0:JBP1,0:KBP1,1:N_TOTAL_SCALARS),STAT=IZERO)
190+
! Required for cell face density correction for multicomponent mixtures
191+
IF (TEST_FLUX_LIMITER_FACE_CORRECTION .AND. N_TRACKED_SPECIES>2) THEN
192+
N_LOWER_SCALARS=0
193+
ELSE
194+
N_LOWER_SCALARS=1
195+
ENDIF
196+
197+
ALLOCATE( M%FX(0:IBP1,0:JBP1,0:KBP1,N_LOWER_SCALARS:N_TOTAL_SCALARS),STAT=IZERO)
191198
CALL ChkMemErr('INIT','FX',IZERO)
192-
ALLOCATE( M%FY(0:IBP1,0:JBP1,0:KBP1,1:N_TOTAL_SCALARS),STAT=IZERO)
199+
ALLOCATE( M%FY(0:IBP1,0:JBP1,0:KBP1,N_LOWER_SCALARS:N_TOTAL_SCALARS),STAT=IZERO)
193200
CALL ChkMemErr('INIT','FY',IZERO)
194-
ALLOCATE( M%FZ(0:IBP1,0:JBP1,0:KBP1,1:N_TOTAL_SCALARS),STAT=IZERO)
201+
ALLOCATE( M%FZ(0:IBP1,0:JBP1,0:KBP1,N_LOWER_SCALARS:N_TOTAL_SCALARS),STAT=IZERO)
195202
CALL ChkMemErr('INIT','FZ',IZERO)
196203
M%FX = 0._EB
197204
M%FY = 0._EB

Source/mass.f90

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,131 @@ SUBROUTINE MASS_FINITE_DIFFERENCES(NM)
177177

178178
ENDDO SPECIES_LOOP
179179

180+
FACE_CORRECTION_IF: IF (TEST_FLUX_LIMITER_FACE_CORRECTION .AND. N_TRACKED_SPECIES>2) THEN
181+
182+
! Repeat the above for DENSITY
183+
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)
187+
188+
!$OMP PARALLEL DO PRIVATE(IW,WC,BC,B1,II,JJ,KK,IIG,JJG,KKG,IOR,IC,U_TEMP,Z_TEMP,F_TEMP)
189+
WALL_LOOP_3: DO IW=1,N_EXTERNAL_WALL_CELLS+N_INTERNAL_WALL_CELLS
190+
WC=>WALL(IW)
191+
IF (WC%BOUNDARY_TYPE==NULL_BOUNDARY) CYCLE WALL_LOOP_3
192+
BC=>BOUNDARY_COORD(WC%BC_INDEX)
193+
B1=>BOUNDARY_PROP1(WC%B1_INDEX)
194+
195+
II = BC%II
196+
JJ = BC%JJ
197+
KK = BC%KK
198+
IIG = BC%IIG
199+
JJG = BC%JJG
200+
KKG = BC%KKG
201+
IOR = BC%IOR
202+
IC = CELL_INDEX(II,JJ,KK)
203+
204+
IF (WC%BOUNDARY_TYPE==SOLID_BOUNDARY .AND. .NOT.CELL(IC)%SOLID .AND. .NOT.CELL(IC)%EXTERIOR) THEN
205+
SELECT CASE(IOR)
206+
CASE( 1); FX(IIG-1,JJG,KKG,0) = 0._EB
207+
CASE(-1); FX(IIG,JJG,KKG,0) = 0._EB
208+
CASE( 2); FY(IIG,JJG-1,KKG,0) = 0._EB
209+
CASE(-2); FY(IIG,JJG,KKG,0) = 0._EB
210+
CASE( 3); FZ(IIG,JJG,KKG-1,0) = 0._EB
211+
CASE(-3); FZ(IIG,JJG,KKG,0) = 0._EB
212+
END SELECT
213+
ELSE
214+
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
221+
END SELECT
222+
ENDIF
223+
224+
! Overwrite first off-wall advective flux if flow is away from the wall and if the face is not also a wall cell
225+
226+
OFF_WALL_IF_3: IF (WC%BOUNDARY_TYPE/=INTERPOLATED_BOUNDARY .AND. WC%BOUNDARY_TYPE/=OPEN_BOUNDARY) THEN
227+
228+
OFF_WALL_SELECT_3: SELECT CASE(IOR)
229+
CASE( 1) OFF_WALL_SELECT_3
230+
! ghost FX/UU(II+1)
231+
! /// II /// II+1 | II+2 | ...
232+
! ^ WALL_INDEX(II+1,+1)
233+
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/)
235+
U_TEMP(1,1,1) = UU(II+1,JJ,KK)
236+
CALL GET_SCALAR_FACE_VALUE(U_TEMP,Z_TEMP,F_TEMP,1,1,1,1,1,1,1,I_FLUX_LIMITER)
237+
FX(II+1,JJ,KK,0) = F_TEMP(1,1,1)
238+
ENDIF
239+
CASE(-1) OFF_WALL_SELECT_3
240+
! FX/UU(II-2) ghost
241+
! ... | II-2 | II-1 /// II ///
242+
! ^ WALL_INDEX(II-1,-1)
243+
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)/)
245+
U_TEMP(1,1,1) = UU(II-2,JJ,KK)
246+
CALL GET_SCALAR_FACE_VALUE(U_TEMP,Z_TEMP,F_TEMP,1,1,1,1,1,1,1,I_FLUX_LIMITER)
247+
FX(II-2,JJ,KK,0) = F_TEMP(1,1,1)
248+
ENDIF
249+
CASE( 2) OFF_WALL_SELECT_3
250+
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/)
252+
U_TEMP(1,1,1) = VV(II,JJ+1,KK)
253+
CALL GET_SCALAR_FACE_VALUE(U_TEMP,Z_TEMP,F_TEMP,1,1,1,1,1,1,2,I_FLUX_LIMITER)
254+
FY(II,JJ+1,KK,0) = F_TEMP(1,1,1)
255+
ENDIF
256+
CASE(-2) OFF_WALL_SELECT_3
257+
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)/)
259+
U_TEMP(1,1,1) = VV(II,JJ-2,KK)
260+
CALL GET_SCALAR_FACE_VALUE(U_TEMP,Z_TEMP,F_TEMP,1,1,1,1,1,1,2,I_FLUX_LIMITER)
261+
FY(II,JJ-2,KK,0) = F_TEMP(1,1,1)
262+
ENDIF
263+
CASE( 3) OFF_WALL_SELECT_3
264+
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/)
266+
U_TEMP(1,1,1) = WW(II,JJ,KK+1)
267+
CALL GET_SCALAR_FACE_VALUE(U_TEMP,Z_TEMP,F_TEMP,1,1,1,1,1,1,3,I_FLUX_LIMITER)
268+
FZ(II,JJ,KK+1,0) = F_TEMP(1,1,1)
269+
ENDIF
270+
CASE(-3) OFF_WALL_SELECT_3
271+
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)/)
273+
U_TEMP(1,1,1) = WW(II,JJ,KK-2)
274+
CALL GET_SCALAR_FACE_VALUE(U_TEMP,Z_TEMP,F_TEMP,1,1,1,1,1,1,3,I_FLUX_LIMITER)
275+
FZ(II,JJ,KK-2,0) = F_TEMP(1,1,1)
276+
ENDIF
277+
END SELECT OFF_WALL_SELECT_3
278+
279+
ENDIF OFF_WALL_IF_3
280+
281+
ENDDO WALL_LOOP_3
282+
!$OMP END PARALLEL DO
283+
284+
! Now correct the face value of (RHO*ZZ) such that SUM(RHO*ZZ)_FACE = RHO_FACE
285+
286+
!$OMP PARALLEL DO PRIVATE(N) SCHEDULE(STATIC)
287+
DO K=0,KBAR
288+
DO J=0,JBAR
289+
DO I=0,IBAR
290+
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)) )
292+
293+
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)) )
295+
296+
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)) )
298+
ENDDO
299+
ENDDO
300+
ENDDO
301+
!$OMP END PARALLEL DO
302+
303+
ENDIF FACE_CORRECTION_IF
304+
180305
T_USED(3)=T_USED(3)+CURRENT_TIME()-TNOW
181306
END SUBROUTINE MASS_FINITE_DIFFERENCES
182307

Source/read.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1745,7 +1745,7 @@ SUBROUTINE READ_MISC
17451745
RAMP_UX,RAMP_UY,RAMP_UZ,RAMP_VX,RAMP_VY,RAMP_VZ,RAMP_WX,RAMP_WY,RAMP_WZ,&
17461746
RESTART,RESTART_CHID,SC,&
17471747
RND_SEED,SIMULATION_MODE,SMOKE3D_16,SMOKE_ALBEDO,SOLID_PHASE_ONLY,SOOT_DENSITY,SOOT_OXIDATION,&
1748-
TAU_DEFAULT,TENSOR_DIFFUSIVITY,TERRAIN_IMAGE,TEXTURE_ORIGIN,&
1748+
TAU_DEFAULT,TENSOR_DIFFUSIVITY,TERRAIN_IMAGE,TEST_FLUX_LIMITER_FACE_CORRECTION,TEXTURE_ORIGIN,&
17491749
THERMOPHORETIC_DEPOSITION,THERMOPHORETIC_SETTLING,THICKEN_OBSTRUCTIONS,&
17501750
TMPA,TURBULENCE_MODEL,TURBULENT_DEPOSITION,UVW_FILE,&
17511751
VERBOSE,VISIBILITY_FACTOR,VN_MAX,VN_MIN,Y_CO2_INFTY,Y_O2_INFTY,&

0 commit comments

Comments
 (0)