Skip to content

Commit 368204c

Browse files
authored
Merge pull request #14119 from drjfloyd/master
FDS Source: Fix enthalpy adjust for N_O2 plus some TGA enhancements
2 parents fd3a6a5 + 20c47af commit 368204c

File tree

7 files changed

+42
-16
lines changed

7 files changed

+42
-16
lines changed

Manuals/FDS_User_Guide/FDS_User_Guide.tex

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3373,6 +3373,8 @@ \subsection{Simulating Bench-scale Measurements like the TGA, DSC, and MCC}
33733373

33743374
The result of the \ct{TGA_ANALYSIS} is a single comma-delimited file called \ct{CHID_tga.csv}. The first and second columns of the file consist of the time and sample temperature. The third column is the normalized sample mass; that is, the sample mass divided by its initial mass. The following columns list the mass fractions of the individual material components. The next column is the total mass loss rate, in units of s$^{-1}$, followed by the mass loss rates of the individual material components. The next column is the heat release rate per unit mass of the sample in units of W/g, typical of an MCC measurement. The final column is the rate of heat absorbed by the sample normalized by its {\it original} mass, also in units of W/g, typical of a DSC measurement.
33753375

3376+
The timestep used in the TGA analysis can be controlled with \ct{TGA_DT} on the \ct{SURF} line. The output spacing for temperature can be set with \ct{TGA_DUMP} on the \ct{SURF} line.
3377+
33763378
Details of the output quantities are discussed in Sec.~\ref{info:material_components}. Further details on these measurement techniques and how to interpret them are found in the FDS Verification Guide~\cite{FDS_Verification_Guide}.
33773379

33783380
\subsubsection{Example}
@@ -3428,6 +3430,8 @@ \section{Pyrolysis and Energy Conservation}
34283430

34293431
If the sum of the yields is less than 1, then for the purpose of solving for the $H_{\rm adj}$ values, FDS will assume that the missing mass is a material with the same specific heat as the original material.
34303432

3433+
If a material has a reaction where \ct{N_O2} is set and the adjustment process needs to determine the \ct{REFERENCE_TEMPERATURE}, then a value for the oxygen concentration is needed. This value will default to the ambient oxygen concentration for the simulation; however, it can be overridden on a material basis by specifying \ct {X_O2_PYRO} for that material. This may be needed if, for example, the kinetics and heat of reaction(s) for a material were developed using a specific oxygen concentration.
3434+
34313435
\chapter{Ventilation}
34323436

34333437
This chapter explains how to model a ventilation system. There are two ways to do this. First, is to explicitly specify air flow rates into and out of
@@ -12511,6 +12515,7 @@ \section{\texorpdfstring{{\tt MATL}}{MATL} (Material Properties)}
1251112515
\ct{SPECIFIC_HEAT_RAMP} & Character & Section~\ref{info:thermal_properties} & & \\ \hline
1251212516
\ct{SPEC_ID(:,:)} & Char.~Array & Section~\ref{info:solid_pyrolysis} & & \\ \hline
1251312517
\ct{SURFACE_OXIDATION_MODEL} & Logical & Section~\ref{vegetation_model} & & \ct{F} \\ \hline
12518+
\ct{X_O2_PYRO} & Logical & Section~\ref{solid_phase_energy_conservation} & & \\ \hline
1251412519
\end{longtable}
1251512520

1251612521

@@ -13491,7 +13496,9 @@ \section{\texorpdfstring{{\tt SURF}}{SURF} (Surface Properties)}
1349113496
\ct{TEXTURE_HEIGHT} & Real & Section~\ref{info:texture_map} & m & 1. \\ \hline
1349213497
\ct{TEXTURE_MAP} & Character & Section~\ref{info:texture_map} & & \\ \hline
1349313498
\ct{TEXTURE_WIDTH} & Real & Section~\ref{info:texture_map} & m & 1. \\ \hline
13494-
\ct{TGA_ANALYSIS} & Logical & Section~\ref{info:TGA_DSC_MCC} & & \ct{F} \\ \hline
13499+
\ct{TGA_ANALYSIS} & Logical & Section~\ref{info:TGA_DSC_MCC} & & \ct{F} \\ \hline
13500+
\ct{TGA_DT} & Real & Section~\ref{info:TGA_DSC_MCC} & s & 0.1 \\ \hline
13501+
\ct{TGA_DUMP} & Real & Section~\ref{info:TGA_DSC_MCC} & K & 1 \\ \hline
1349513502
\ct{TGA_FINAL_TEMPERATURE} & Real & Section~\ref{info:TGA_DSC_MCC} & $^\circ$C & 800. \\ \hline
1349613503
\ct{TGA_HEATING_RATE} & Real & Section~\ref{info:TGA_DSC_MCC} & $^\circ$C/min & 5. \\ \hline
1349713504
\ct{THICKNESS(:)} & Real Array & Section~\ref{info:SURF_MATL_Basics} & m & \\ \hline

Source/cons.f90

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -743,6 +743,8 @@ MODULE GLOBAL_CONSTANTS
743743
INTEGER :: TGA_SURF_INDEX=-100 !< Surface properties to use for special TGA calculation
744744
INTEGER :: TGA_WALL_INDEX=-100 !< Wall index to use for special TGA calculation
745745
INTEGER :: TGA_PARTICLE_INDEX=-100 !< Particle index to use for special TGA calculation
746+
REAL(EB) :: TGA_DT=0.1_EB !< Time step (s) to use for special TGA calculation
747+
REAL(EB) :: TGA_DUMP=1._EB !< Temperature output interval (K), starting at TMPA, to use for special TGA calculation
746748
REAL(EB) :: TGA_HEATING_RATE=5._EB !< Heat rate (K/min) to use for special TGA calculation
747749
REAL(EB) :: TGA_FINAL_TEMPERATURE=800._EB !< Final Temperature (C) to use for special TGA calculation
748750

Source/func.f90

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2830,15 +2830,16 @@ SUBROUTINE GET_TMP_REF(N_MATL,NR)
28302830
ELSE
28312831
RR_MAX = 0._EB
28322832
ENDIF
2833+
28332834
DO WHILE (INT(TMP)<I_MAX_TEMP)
28342835
TMP = TMP + DTDT * DT
2835-
REACTION_RATE = ML%A(NR)*RHO_S**ML%N_S(NR)*EXP(-ML%E(NR)/(R0*TMP))*TMP**ML%N_T(NR)
2836+
REACTION_RATE = ML%A(NR)*RHO_S**ML%N_S(NR)*EXP(-ML%E(NR)/(R0*TMP))*TMP**ML%N_T(NR)*ML%X_O2_PYRO**ML%N_O2(NR)
28362837
IF (REACTION_RATE > RR_MAX) THEN
28372838
ML%TMP_REF(NR) = TMP
28382839
RR_MAX = REACTION_RATE
28392840
ENDIF
28402841
RHO_S = RHO_S - REACTION_RATE * DT
2841-
IF (RHO_S<0._EB) EXIT
2842+
IF (RHO_S<TWO_EPSILON_EB) EXIT
28422843
ENDDO
28432844

28442845
END SUBROUTINE GET_TMP_REF

Source/init.f90

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2894,15 +2894,15 @@ SUBROUTINE INIT_WALL_CELL(NM,I,J,K,OBST_INDEX,IW,IOR,SURF_INDEX,IERR,TT)
28942894
USE MEMORY_FUNCTIONS, ONLY: ALLOCATE_STORAGE
28952895
USE GEOMETRY_FUNCTIONS, ONLY: SEARCH_OTHER_MESHES
28962896
USE COMP_FUNCTIONS, ONLY: SHUTDOWN
2897-
USE PHYSICAL_FUNCTIONS, ONLY: GET_SPECIFIC_GAS_CONSTANT
2897+
USE PHYSICAL_FUNCTIONS, ONLY: GET_SPECIFIC_GAS_CONSTANT,GET_MASS_FRACTION
28982898
USE CONTROL_VARIABLES, ONLY : CONTROL
28992899
USE DEVICE_VARIABLES, ONLY : DEVICE
29002900
INTEGER, INTENT(IN) :: I,J,K,NM,OBST_INDEX,IW,IOR,SURF_INDEX
29012901
INTEGER :: NOM_FOUND,NOM=0,ITER,IIO_MIN,IIO_MAX,JJO_MIN,JJO_MAX,KKO_MIN,KKO_MAX,VENT_INDEX
29022902
INTEGER, INTENT(OUT) :: IERR
29032903
REAL(EB), INTENT(IN) :: TT
29042904
REAL(EB) :: PX,PY,PZ,T_ACTIVATE,XIN,YIN,ZIN,DIST,XW,YW,ZW,RDN,AW,TSI,&
2905-
ZZ_GET(1:N_TRACKED_SPECIES),RSUM_F,R1,RR,DELTA
2905+
ZZ_GET(1:N_TRACKED_SPECIES),RSUM_F,R1,RR,DELTA,Y_O2_F
29062906
INTEGER :: N,SURF_INDEX_NEW,IIG,JJG,KKG,IIO,JJO,KKO,IC,ICG,ICO,NOM_CHECK(0:1),BOUNDARY_TYPE,FI,VENT_INDEX_FOUND
29072907
LOGICAL :: ALIGNED
29082908
TYPE (MESH_TYPE), POINTER :: M,MM
@@ -3312,6 +3312,11 @@ SUBROUTINE INIT_WALL_CELL(NM,I,J,K,OBST_INDEX,IW,IOR,SURF_INDEX,IERR,TT)
33123312
M%RSUM(I,J,K) = M%RSUM(IIG,JJG,KKG)
33133313
B1%ZZ_F(1:N_TRACKED_SPECIES) = M%ZZ(IIG,JJG,KKG,1:N_TRACKED_SPECIES)
33143314
M%ZZ(I,J,K,1:N_TRACKED_SPECIES) = M%ZZ(IIG,JJG,KKG,1:N_TRACKED_SPECIES)
3315+
IF (O2_INDEX > 0) THEN
3316+
ZZ_GET(1:N_TRACKED_SPECIES) = B1%ZZ_F(1:N_TRACKED_SPECIES)
3317+
CALL GET_MASS_FRACTION(ZZ_GET,O2_INDEX,Y_O2_F)
3318+
B2%Y_O2_F = Y_O2_F
3319+
ENDIF
33153320
ENDIF
33163321

33173322
! Compute the mass of the grid cell corresponding to the wall cell

Source/read.f90

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6871,11 +6871,12 @@ END SUBROUTINE PROC_PROP
68716871
SUBROUTINE READ_MATL
68726872

68736873
USE COMP_FUNCTIONS, ONLY : SEARCH_INPUT_FILE
6874+
USE PHYSICAL_FUNCTIONS, ONLY: GET_MASS_FRACTION
68746875
CHARACTER(LABEL_LENGTH) :: CONDUCTIVITY_RAMP,SPECIFIC_HEAT_RAMP
68756876
CHARACTER(LABEL_LENGTH) :: SPEC_ID(MAX_SPECIES,MAX_REACTIONS),PART_ID(MAX_LPC,MAX_REACTIONS)
68766877
REAL(EB) :: EMISSIVITY,CONDUCTIVITY,SPECIFIC_HEAT,DENSITY,ABSORPTION_COEFFICIENT,BOILING_TEMPERATURE, &
6877-
PEAK_REACTION_RATE,MW,&
6878-
REFERENCE_ENTHALPY,REFERENCE_ENTHALPY_TEMPERATURE,REAC_RATE_DELTA
6878+
PEAK_REACTION_RATE,MW,ZZ_GET(1:N_TRACKED_SPECIES),&
6879+
REFERENCE_ENTHALPY,REFERENCE_ENTHALPY_TEMPERATURE,REAC_RATE_DELTA,X_O2_PYRO
68796880
REAL(EB), DIMENSION(MAX_MATERIALS,MAX_REACTIONS) :: NU_MATL
68806881
REAL(EB), DIMENSION(MAX_REACTIONS) :: A,E,HEATING_RATE,PYROLYSIS_RANGE,HEAT_OF_REACTION, &
68816882
N_S,N_T,N_O2,REFERENCE_RATE,REFERENCE_TEMPERATURE, &
@@ -6894,7 +6895,7 @@ SUBROUTINE READ_MATL
68946895
MAX_REACTION_RATE,MW,N_O2,N_REACTIONS,N_S,N_T,NU_MATL,NU_PART,NU_SPEC,PART_ID,&
68956896
PYROLYSIS_RANGE,REAC_RATE_DELTA,REFERENCE_ENTHALPY,REFERENCE_ENTHALPY_TEMPERATURE,&
68966897
REFERENCE_RATE,REFERENCE_TEMPERATURE,&
6897-
SPECIFIC_HEAT,SPECIFIC_HEAT_RAMP,SPEC_ID,SURFACE_OXIDATION_MODEL
6898+
SPECIFIC_HEAT,SPECIFIC_HEAT_RAMP,SPEC_ID,SURFACE_OXIDATION_MODEL,X_O2_PYRO
68986899

68996900
! Count the MATL lines in the input file
69006901

@@ -7118,6 +7119,7 @@ SUBROUTINE READ_MATL
71187119
ALLOCATE(ML%N_LPC(N_REACTIONS),STAT=IZERO)
71197120
CALL ChkMemErr('READ','ML%N_LPC',IZERO)
71207121
ML%N_LPC=0
7122+
ML%X_O2_PYRO = X_O2_PYRO
71217123

71227124
! Decide which pyrolysis model to use
71237125

@@ -7145,6 +7147,12 @@ SUBROUTINE READ_MATL
71457147
IF (O2_INDEX <= 0) THEN
71467148
WRITE(MESSAGE,'(A,A,A)') 'ERROR(256): MATL ',TRIM(ID),', oxidation reaction set but OXYGEN not a defined species.'
71477149
CALL SHUTDOWN(MESSAGE) ; RETURN
7150+
ELSE
7151+
IF (ML%X_O2_PYRO < 0._EB) THEN
7152+
ZZ_GET(1:N_TRACKED_SPECIES) = SPECIES_MIXTURE(1:N_TRACKED_SPECIES)%ZZ0
7153+
CALL GET_MASS_FRACTION(ZZ_GET,O2_INDEX,X_O2_PYRO)
7154+
ML%X_O2_PYRO = X_O2_PYRO
7155+
ENDIF
71487156
ENDIF
71497157
OXIDATION_REACTION = .TRUE.
71507158
ENDIF
@@ -7316,6 +7324,7 @@ SUBROUTINE SET_MATL_DEFAULTS
73167324
SURFACE_OXIDATION_MODEL= .FALSE.
73177325
HEATING_RATE = 5._EB ! K/min
73187326
PYROLYSIS_RANGE = 80._EB ! K or C
7327+
X_O2_PYRO = -1._EB
73197328

73207329
END SUBROUTINE SET_MATL_DEFAULTS
73217330

@@ -7748,7 +7757,7 @@ SUBROUTINE READ_SURF(QUICK_READ)
77487757
RGB,ROUGHNESS,SHAPE_FACTOR,SPEC_ID,&
77497758
SPREAD_RATE,STRETCH_FACTOR,SURFACE_VOLUME_RATIO,&
77507759
TAU_EF,TAU_MF,TAU_PART,TAU_Q,TAU_T,TAU_V,TEXTURE_HEIGHT,TEXTURE_MAP,TEXTURE_WIDTH,&
7751-
TGA_ANALYSIS,TGA_FINAL_TEMPERATURE,TGA_HEATING_RATE,THICKNESS,TIME_STEP_FACTOR,&
7760+
TGA_ANALYSIS,TGA_DT,TGA_DUMP,TGA_FINAL_TEMPERATURE,TGA_HEATING_RATE,THICKNESS,TIME_STEP_FACTOR,&
77527761
TMP_BACK,TMP_FRONT,TMP_FRONT_INITIAL,TMP_GAS_BACK,TMP_GAS_FRONT,TMP_INNER,TRANSPARENCY,&
77537762
VEG_LSET_BETA,VEG_LSET_CHAR_FRACTION,VEG_LSET_FIREBASE_TIME,VEG_LSET_FUEL_INDEX,VEG_LSET_HT,VEG_LSET_IGNITE_TIME,&
77547763
VEG_LSET_M1,VEG_LSET_M10,VEG_LSET_M100,VEG_LSET_MLW,VEG_LSET_MLH,VEG_LSET_QCON,&

Source/type.f90

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -776,6 +776,7 @@ MODULE TYPES
776776
REAL(EB) :: REFERENCE_ENTHALPY_TEMPERATURE !< Temperature for the reference enthalpy (K)
777777
REAL(EB) :: REAC_RATE_DELTA !< Allowable jump condition for pyrolysis rate. Determines RENODE_DELTA_T
778778
REAL(EB) :: RENODE_DELTA_T=1.E9_EB !< Temperature change (K) above which no resmeshing
779+
REAL(EB) :: X_O2_PYRO !< Oxygen mass fraction to use for enthalpy adjustment
779780
INTEGER :: PYROLYSIS_MODEL !< Type of pyrolysis model (SOLID, LIQUID, VEGETATION)
780781
CHARACTER(LABEL_LENGTH) :: ID !< Identifier
781782
CHARACTER(LABEL_LENGTH) :: RAMP_K_S !< Name of RAMP for thermal conductivity of solid

Source/wall.f90

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3802,7 +3802,7 @@ SUBROUTINE TGA_ANALYSIS(NM)
38023802

38033803
USE PHYSICAL_FUNCTIONS, ONLY: SURFACE_DENSITY
38043804
USE COMP_FUNCTIONS, ONLY: SHUTDOWN
3805-
REAL(EB) :: DT_TGA=0.01_EB,T_TGA,SURF_DEN_0,HRR
3805+
REAL(EB) :: T_TGA,SURF_DEN_0,HRR,TMP_DUMP
38063806
REAL(EB), ALLOCATABLE, DIMENSION(:) :: SURF_DEN
38073807
INTEGER, INTENT(IN) :: NM
38083808
INTEGER :: N_TGA,I,IW,IP,N,NR
@@ -3820,7 +3820,7 @@ SUBROUTINE TGA_ANALYSIS(NM)
38203820
RADIATION = .FALSE.
38213821
TGA_HEATING_RATE = TGA_HEATING_RATE/60._EB ! K/min --> K/s
38223822
TGA_FINAL_TEMPERATURE = TGA_FINAL_TEMPERATURE + TMPM ! C --> K
3823-
N_TGA = NINT((TGA_FINAL_TEMPERATURE-TMPA)/(TGA_HEATING_RATE*DT_TGA))
3823+
N_TGA = NINT((TGA_FINAL_TEMPERATURE-TMPA)/(TGA_HEATING_RATE*TGA_DT))
38243824
T_TGA = 0._EB
38253825

38263826
IF (TGA_WALL_INDEX>0) THEN
@@ -3846,17 +3846,18 @@ SUBROUTINE TGA_ANALYSIS(NM)
38463846

38473847
SURF_DEN_0 = SF%SURFACE_DENSITY
38483848
WRITE(TCFORM,'(A,I3.3,5A)') "(",2*SF%N_MATL+5,"(",TRIM(FMT_R),",','),",TRIM(FMT_R),")"
3849-
3849+
TMP_DUMP = TMPA + TGA_DUMP
38503850
DO I=1,N_TGA
38513851
IF (ONE_D%LAYER_THICKNESS(1)<TWO_EPSILON_EB) EXIT
3852-
T_TGA = I*DT_TGA
3852+
T_TGA = REAL(I,EB)*TGA_DT
38533853
B1%TMP_G = TMPA + TGA_HEATING_RATE*T_TGA
38543854
IF (TGA_WALL_INDEX>0) THEN
3855-
CALL SOLID_HEAT_TRANSFER(NM,T_TGA,DT_TGA,WALL_INDEX=IW)
3855+
CALL SOLID_HEAT_TRANSFER(NM,T_TGA,TGA_DT,WALL_INDEX=IW)
38563856
ELSE
3857-
CALL SOLID_HEAT_TRANSFER(NM,T_TGA,DT_TGA,PARTICLE_INDEX=IP)
3857+
CALL SOLID_HEAT_TRANSFER(NM,T_TGA,TGA_DT,PARTICLE_INDEX=IP)
38583858
ENDIF
3859-
IF (I==1 .OR. MOD(I,NINT(1._EB/(TGA_HEATING_RATE*DT_TGA)))==0) THEN
3859+
IF (I==1 .OR. B1%TMP_G >= TMP_DUMP) THEN
3860+
IF (B1%TMP_G >= TMP_DUMP) TMP_DUMP = TMP_DUMP + TGA_DUMP
38603861
IF (TGA_WALL_INDEX>0) THEN
38613862
SURF_DEN(0) = SURFACE_DENSITY(0,SF,ONE_D)
38623863
DO N=1,SF%N_MATL

0 commit comments

Comments
 (0)