Skip to content

Commit 0bcee34

Browse files
committed
FDS Source: add TEST_NEW_CHAR_MODEL
1 parent d4421e1 commit 0bcee34

File tree

5 files changed

+43
-13
lines changed

5 files changed

+43
-13
lines changed

Source/cons.f90

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ MODULE GLOBAL_CONSTANTS
165165
INTEGER :: NO2_INDEX=0 !< Index for NO2
166166
INTEGER :: ZETA_INDEX=0 !< Index for unmixed fuel fraction, ZETA
167167
INTEGER :: MOISTURE_INDEX=0 !< Index for MATL MOISTURE
168+
INTEGER :: CHAR_INDEX=0 !< Index for MATL CHAR
168169

169170
INTEGER :: STOP_STATUS=NO_STOP !< Indicator of whether and why to stop the job
170171
INTEGER :: INPUT_FILE_LINE_NUMBER=0 !< Indicator of what line in the input file is being read
@@ -270,9 +271,10 @@ MODULE GLOBAL_CONSTANTS
270271
LOGICAL :: TENSOR_DIFFUSIVITY=.FALSE. !< If true, use experimental tensor diffusivity model for spec and tmp
271272
LOGICAL :: OXPYRO_MODEL=.FALSE. !< Flag to use oxidative pyrolysis mass transfer model
272273
LOGICAL :: OUTPUT_WALL_QUANTITIES=.FALSE. !< Flag to force call to WALL_MODEL
273-
LOGICAL :: FLUX_LIMITER_MW_CORRECTION=.FALSE.
274+
LOGICAL :: FLUX_LIMITER_MW_CORRECTION=.FALSE. !< Flag for MW correction ensure consistent equation of state at face
274275
LOGICAL :: STORE_FIRE_ARRIVAL=.FALSE. !< Flag for tracking arrival of spreading fire front over a surface
275276
LOGICAL :: STORE_FIRE_RESIDENCE=.FALSE. !< Flag for tracking residence time of spreading fire front over a surface
277+
LOGICAL :: TEST_NEW_CHAR_MODEL=.FALSE. !< Flag to envoke new char model
276278

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

Source/dump.f90

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8524,7 +8524,7 @@ REAL(EB) FUNCTION SOLID_PHASE_OUTPUT(INDX,Y_INDEX,Z_INDEX,PART_INDEX,OPT_WALL_IN
85248524
INTEGER, INTENT(IN), OPTIONAL :: OPT_WALL_INDEX,OPT_LP_INDEX,OPT_CFACE_INDEX,OPT_BNDF_INDEX,OPT_DEVC_INDEX,OPT_CUT_FACE_INDEX,&
85258525
OPT_NODE_INDEX,OPT_PROF_INDEX
85268526
INTEGER, INTENT(IN) :: INDX,Y_INDEX,Z_INDEX,PART_INDEX
8527-
REAL(EB) :: Q_CON,RHOSUM,VOLSUM,ZZ_GET(1:N_TRACKED_SPECIES),Y_SPECIES,DEPTH,UN,H_S,RHO_D_DYDN,U_CELL,V_CELL,W_CELL,&
8527+
REAL(EB) :: Q_CON,RHOSUM,VOLSUM,ZZ_GET(1:N_TRACKED_SPECIES),Y_SPECIES,DEPTH,CHAR_FRONT,UN,H_S,RHO_D_DYDN,U_CELL,V_CELL,W_CELL,&
85288528
LTMP,ATMP,CTMP,H_W_EFF,X0,VOL,DN,PRESS,&
85298529
NVEC(3),PVEC(3),TAU_IJ(3,3),VEL_CELL(3),VEL_WALL(3),MU_WALL,RHO_WALL,FVEC(3),SVEC(3),TVEC1(3),TVEC2(3),&
85308530
PR1,PR2,Z1,Z2,RADIUS,CUT_FACE_AREA,SOLID_PHASE_OUTPUT_CTF,AAA,BBB,CCC,ALP,BET,GAM,MMM,DTMP
@@ -9277,7 +9277,12 @@ REAL(EB) FUNCTION SOLID_PHASE_OUTPUT(INDX,Y_INDEX,Z_INDEX,PART_INDEX,OPT_WALL_IN
92779277
IF (SF%INCLUDE_BOUNDARY_PROP2_TYPE .AND. MATL_INDEX>0) THEN
92789278
ML => MATERIAL(MATL_INDEX)
92799279
! for the moment this assumes there is only one char reaction
9280-
IF (ML%N_O2(1)>0._EB) SOLID_PHASE_OUTPUT = B2%Y_O2_F*EXP(-ONE_D%X(I_DEPTH-1)/(TWO_EPSILON_EB+ML%GAS_DIFFUSION_DEPTH(1)))
9280+
IF (ML%N_O2(1)>0._EB) THEN
9281+
DEPTH = 0.5_EB*(ONE_D%X(I_DEPTH-1)+ONE_D%X(I_DEPTH))
9282+
CHAR_FRONT = 0._EB
9283+
IF (TEST_NEW_CHAR_MODEL) CHAR_FRONT = ONE_D%X(B2%I_CHAR_FRONT-1)
9284+
SOLID_PHASE_OUTPUT = B2%Y_O2_F*EXP(-MAX(0._EB,DEPTH-CHAR_FRONT)/(TWO_EPSILON_EB+ML%GAS_DIFFUSION_DEPTH(1)))
9285+
ENDIF
92819286
ENDIF
92829287
CASE(90) ! FIRE ARRIVAL TIME
92839288
IF (PRESENT(OPT_WALL_INDEX)) THEN

Source/read.f90

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1732,7 +1732,8 @@ SUBROUTINE READ_MISC
17321732
CFL_MAX,CFL_MIN,CFL_VELOCITY_NORM,CHECK_FO,CHECK_HT,CHECK_VN, &
17331733
CNF_CUTOFF,CONSTANT_SPECIFIC_HEAT_RATIO,&
17341734
C_SMAGORINSKY,C_VREMAN,C_WALE,DEPOSITION,EXTERNAL_FILENAME,&
1735-
FIXED_LES_FILTER_WIDTH,FLUX_LIMITER,FREEZE_VELOCITY,FYI,GAMMA,GRAVITATIONAL_DEPOSITION,&
1735+
FIXED_LES_FILTER_WIDTH,FLUX_LIMITER,FLUX_LIMITER_MW_CORRECTION,&
1736+
FREEZE_VELOCITY,FYI,GAMMA,GRAVITATIONAL_DEPOSITION,&
17361737
GRAVITATIONAL_SETTLING,GVEC,H_F_REFERENCE_TEMPERATURE,&
17371738
HUMIDITY,HVAC_LOCAL_PRESSURE,HVAC_MASS_TRANSPORT_CELL_L,HVAC_PRES_RELAX,HVAC_QFAN,IBLANK_SMV,I_MAX_TEMP,&
17381739
LES_FILTER_TYPE,LEVEL_SET_ELLIPSE,LEVEL_SET_MODE,&
@@ -1745,7 +1746,7 @@ SUBROUTINE READ_MISC
17451746
RAMP_UX,RAMP_UY,RAMP_UZ,RAMP_VX,RAMP_VY,RAMP_VZ,RAMP_WX,RAMP_WY,RAMP_WZ,&
17461747
RESTART,RESTART_CHID,SC,&
17471748
RND_SEED,SIMULATION_MODE,SMOKE3D_16,SMOKE_ALBEDO,SOLID_PHASE_ONLY,SOOT_DENSITY,SOOT_OXIDATION,&
1748-
TAU_DEFAULT,TENSOR_DIFFUSIVITY,TERRAIN_IMAGE,FLUX_LIMITER_MW_CORRECTION,TEXTURE_ORIGIN,&
1749+
TAU_DEFAULT,TENSOR_DIFFUSIVITY,TERRAIN_IMAGE,TEST_NEW_CHAR_MODEL,TEXTURE_ORIGIN,&
17491750
THERMOPHORETIC_DEPOSITION,THERMOPHORETIC_SETTLING,THICKEN_OBSTRUCTIONS,&
17501751
TMPA,TURBULENCE_MODEL,TURBULENT_DEPOSITION,UVW_FILE,&
17511752
VERBOSE,VISIBILITY_FACTOR,VN_MAX,VN_MIN,Y_CO2_INFTY,Y_O2_INFTY,&
@@ -7431,6 +7432,9 @@ SUBROUTINE PROC_MATL
74317432
H_ADJUST = ML%REFERENCE_ENTHALPY - ANS
74327433
ML%H = ML%H + H_ADJUST
74337434

7435+
! Store index of char material
7436+
IF (TRIM(ML%ID)=='CHAR') CHAR_INDEX=N
7437+
74347438
ENDDO PROC_MATL_LOOP
74357439

74367440
! Construct and solve linear system to adjust MATL enthalpies to conserve energy. For reaction i for MATL m the equation is
@@ -7674,7 +7678,6 @@ SUBROUTINE PROC_MATL
76747678
ENDIF
76757679
ENDDO
76767680

7677-
76787681
END SUBROUTINE PROC_MATL
76797682

76807683

Source/type.f90

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,7 @@ MODULE TYPES
362362
INTEGER :: SURF_INDEX=-1 !< Surface index
363363
INTEGER :: HEAT_TRANSFER_REGIME=0 !< 1=Forced convection, 2=Natural convection, 3=Impact convection, 4=Resolved
364364
INTEGER :: Y_O2_ITER=0 !< Number of iterations for surface O2 solve
365+
INTEGER :: I_CHAR_FRONT=1 !< Index of solid cell where char formation starts
365366

366367
END TYPE BOUNDARY_PROP2_TYPE
367368

Source/wall.f90

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2883,12 +2883,12 @@ SUBROUTINE PERFORM_PYROLYSIS
28832883
USE PHYSICAL_FUNCTIONS, ONLY: GET_MASS_FRACTION,GET_SPECIFIC_HEAT
28842884
REAL(EB), DIMENSION(N_TRACKED_SPECIES) :: M_DOT_G_PPP_ADJUST,M_DOT_G_PPP_ACTUAL,ZZ_GET
28852885
REAL(EB), DIMENSION(MAX_MATERIALS) :: RHO_TEMP,M_DOT_S_PPP
2886-
REAL(EB) :: Q_DOT_G_PPP,Q_DOT_O2_PPP,CP_FILM,TMP_FILM,H_MASS,&
2886+
REAL(EB) :: Q_DOT_G_PPP,Q_DOT_O2_PPP,CP_FILM,TMP_FILM,H_MASS,CHAR_FRONT,&
28872887
Y_O2_G,Y_O2_F,M_DOT_O2_PP,Y_LOWER,Y_UPPER,M_DOT_ERROR,M_DOT_ERROR_OLD,Y_O2_F_OLD,DY,DE
28882888
REAL(EB), DIMENSION(MAX_LPC) :: Q_DOT_PART,M_DOT_PART
28892889
INTEGER :: ITER,MAX_ITER
28902890
LOGICAL :: REMOVE_LAYER
2891-
REAL(EB), PARAMETER :: M_DOT_ERROR_TOL=1.E-6_EB
2891+
REAL(EB), PARAMETER :: M_DOT_ERROR_TOL=1.E-6_EB, CHAR_DENSITY_THRESHOLD=5.7_EB ! approx. ASH_DENSITY
28922892

28932893
! Get surface oxygen mass fraction
28942894

@@ -2899,6 +2899,23 @@ SUBROUTINE PERFORM_PYROLYSIS
28992899
Y_O2_F = 0._EB
29002900
ENDIF
29012901

2902+
! Determine char front position
2903+
2904+
CHAR_FRONT=0._EB
2905+
IF (TEST_NEW_CHAR_MODEL .AND. Y_O2_F>TWO_EPSILON_EB .AND. CHAR_INDEX>0) THEN
2906+
! The new char model starts the exp profile of O2 at the CHAR_FRONT
2907+
! Find first cell where char has not been consumed
2908+
CHAR_FRONT_POINTS_LOOP: DO I=B2%I_CHAR_FRONT,NWP
2909+
IF (ONE_D%MATL_COMP(CHAR_INDEX)%RHO(I)>CHAR_DENSITY_THRESHOLD) THEN
2910+
CHAR_FRONT=ONE_D%X(I-1)
2911+
B2%I_CHAR_FRONT=I ! store last position to save time on next time step
2912+
EXIT CHAR_FRONT_POINTS_LOOP
2913+
ENDIF
2914+
ENDDO CHAR_FRONT_POINTS_LOOP
2915+
ENDIF
2916+
2917+
! Initialize iterations for OXPYRO_MODEL
2918+
29022919
MAX_ITER=1
29032920

29042921
! Initialize parameters for oxidative pyrolysis mass transfer model
@@ -2947,13 +2964,13 @@ SUBROUTINE PERFORM_PYROLYSIS
29472964

29482965
IF (PRESENT(PARTICLE_INDEX)) THEN
29492966
CALL PYROLYSIS(ONE_D%N_MATL,ONE_D%MATL_INDEX,SURF_INDEX,BC%IIG,BC%JJG,BC%KKG,ONE_D%TMP(I),B1%TMP_F,Y_O2_F,BC%IOR,&
2950-
RHO_DOT(1:ONE_D%N_MATL,I),RHO_TEMP(1:ONE_D%N_MATL),ONE_D%X(I-1),DX_S,DT_BC_SUB,&
2967+
RHO_DOT(1:ONE_D%N_MATL,I),RHO_TEMP(1:ONE_D%N_MATL),ONE_D%X(I-1),CHAR_FRONT,DX_S,DT_BC_SUB,&
29512968
M_DOT_G_PPP_ADJUST,M_DOT_G_PPP_ACTUAL,M_DOT_S_PPP,Q_S(I),Q_DOT_G_PPP,Q_DOT_O2_PPP,&
29522969
Q_DOT_PART,M_DOT_PART,T_BOIL_EFF,B1%B_NUMBER,LAYER_INDEX(I),REMOVE_LAYER,ONE_D,B1,SOLID_CELL_INDEX=I,&
29532970
R_DROP=R_SURF,LPU=U_SURF,LPV=V_SURF,LPW=W_SURF)
29542971
ELSE
29552972
CALL PYROLYSIS(ONE_D%N_MATL,ONE_D%MATL_INDEX,SURF_INDEX,BC%IIG,BC%JJG,BC%KKG,ONE_D%TMP(I),B1%TMP_F,Y_O2_F,BC%IOR,&
2956-
RHO_DOT(1:ONE_D%N_MATL,I),RHO_TEMP(1:ONE_D%N_MATL),ONE_D%X(I-1),DX_S,DT_BC_SUB,&
2973+
RHO_DOT(1:ONE_D%N_MATL,I),RHO_TEMP(1:ONE_D%N_MATL),0.5*(ONE_D%X(I-1)+ONE_D%X(I)),CHAR_FRONT,DX_S,DT_BC_SUB,&
29572974
M_DOT_G_PPP_ADJUST,M_DOT_G_PPP_ACTUAL,M_DOT_S_PPP,Q_S(I),Q_DOT_G_PPP,Q_DOT_O2_PPP,&
29582975
Q_DOT_PART,M_DOT_PART,T_BOIL_EFF,B1%B_NUMBER,LAYER_INDEX(I),REMOVE_LAYER,ONE_D,B1,SOLID_CELL_INDEX=I)
29592976
ENDIF
@@ -3040,6 +3057,7 @@ END SUBROUTINE SOLID_HEAT_TRANSFER
30403057
!> \param RHO_DOT_OUT (1:N_MATS) Array of component reaction rates (kg/m3/s)
30413058
!> \param RHO_S (1:N_MATS) Array of component densities (kg/m3)
30423059
!> \param DEPTH Distance from surface (m)
3060+
!> \param CHAR_FRONT Distance from surface to start of char front (m)
30433061
!> \param DX_S Array of node sizes (m)
30443062
!> \param DT_BC Time step used by the solid phase solver (s)
30453063
!> \param M_DOT_G_PPP_ADJUST (1:N_TRACKED_SPECIES) Adjusted mass generation rate per unit volume of the gas species
@@ -3062,7 +3080,8 @@ END SUBROUTINE SOLID_HEAT_TRANSFER
30623080
!> \param LPV (OPTIONAL) y component of droplet velocity (m/s)
30633081
!> \param LPW (OPTIONAL) z component of droplet velocity (m/s)
30643082

3065-
SUBROUTINE PYROLYSIS(N_MATS,MATL_INDEX,SURF_INDEX,IIG,JJG,KKG,TMP_S,TMP_F,Y_O2_F,IOR,RHO_DOT_OUT,RHO_S,DEPTH,DX_S,DT_BC,&
3083+
SUBROUTINE PYROLYSIS(N_MATS,MATL_INDEX,SURF_INDEX,IIG,JJG,KKG,TMP_S,TMP_F,Y_O2_F,IOR,&
3084+
RHO_DOT_OUT,RHO_S,DEPTH,CHAR_FRONT,DX_S,DT_BC,&
30663085
M_DOT_G_PPP_ADJUST,M_DOT_G_PPP_ACTUAL,M_DOT_S_PPP,Q_DOT_S_PPP,Q_DOT_G_PPP,Q_DOT_O2_PPP,&
30673086
Q_DOT_PART,M_DOT_PART,T_BOIL_EFF,B_NUMBER,LAYER_INDEX,REMOVE_LAYER,ONE_D,B1,SOLID_CELL_INDEX,&
30683087
R_DROP,LPU,LPV,LPW)
@@ -3075,7 +3094,7 @@ SUBROUTINE PYROLYSIS(N_MATS,MATL_INDEX,SURF_INDEX,IIG,JJG,KKG,TMP_S,TMP_F,Y_O2_F
30753094
INTEGER, INTENT(IN), OPTIONAL :: SOLID_CELL_INDEX
30763095
LOGICAL, INTENT(IN) :: REMOVE_LAYER
30773096
REAL(EB), INTENT(OUT), DIMENSION(:,:) :: RHO_DOT_OUT(N_MATS)
3078-
REAL(EB), INTENT(IN) :: TMP_S,TMP_F,DT_BC,DEPTH,RHO_S(N_MATS),Y_O2_F
3097+
REAL(EB), INTENT(IN) :: TMP_S,TMP_F,DT_BC,DEPTH,RHO_S(N_MATS),Y_O2_F,CHAR_FRONT
30793098
REAL(EB), INTENT(IN), OPTIONAL :: R_DROP,LPU,LPV,LPW
30803099
REAL(EB), INTENT(IN), DIMENSION(NWP_MAX) :: DX_S
30813100
REAL(EB), DIMENSION(:) :: ZZ_GET(1:N_TRACKED_SPECIES),Y_ALL(1:N_SPECIES)
@@ -3358,7 +3377,7 @@ SUBROUTINE PYROLYSIS(N_MATS,MATL_INDEX,SURF_INDEX,IIG,JJG,KKG,TMP_S,TMP_F,Y_O2_F
33583377
! Calculate oxygen volume fraction at the surface
33593378
X_O2 = SPECIES(O2_INDEX)%RCON*Y_O2_F/RSUM(IIG,JJG,KKG)
33603379
! Calculate oxygen concentration inside the material, assuming decay function
3361-
X_O2 = X_O2 * EXP(-DEPTH/(TWO_EPSILON_EB+ML%GAS_DIFFUSION_DEPTH(J)))
3380+
X_O2 = X_O2 * EXP(-MAX(0._EB,DEPTH-CHAR_FRONT)/(TWO_EPSILON_EB+ML%GAS_DIFFUSION_DEPTH(J)))
33623381
REACTION_RATE = REACTION_RATE * X_O2**ML%N_O2(J)
33633382
ENDIF
33643383
REACTION_RATE = MIN(REACTION_RATE,ML%MAX_REACTION_RATE(J)) ! User-specified limit

0 commit comments

Comments
 (0)