diff --git a/Manuals/FDS_User_Guide/FDS_User_Guide.tex b/Manuals/FDS_User_Guide/FDS_User_Guide.tex index 2f5e51ab274..9506a309011 100644 --- a/Manuals/FDS_User_Guide/FDS_User_Guide.tex +++ b/Manuals/FDS_User_Guide/FDS_User_Guide.tex @@ -9140,7 +9140,8 @@ \section{Flux Limiters} Central differencing & \ct{'CENTRAL'} \\ Godunov & \ct{'GODUNOV'} \\ Superbee (VLES, SVLES default) & \ct{'SUPERBEE'} \\ -CHARM (DNS, LES default) & \ct{'CHARM'} \\ +CHARM (DNS, LES default) & \ct{'CHARM'} \\ +\hline \end{tabular} \end{table} @@ -9171,9 +9172,9 @@ \subsection{Density} The density of the gas has a natural lower bound of zero, but if the density in a cell decreases to nearly zero, the temperature would then increase to an extremely high value due to the equation of state. Thus, by default, the density is kept within the following range: \be - \min \left( 0.1 \, \rho_\infty , \frac{2 \, p_\infty \, W_{\min}}{\R \, T_{\max}} \right) < \rho < \frac{2 \, p_\infty \, W_{\max}}{\R \, T_{\min}} + 0.01 \; \mbox{kg/m$^3$} < \rho < 100 \; \mbox{kg/m$^3$} \ee -where $W_{\min}$ and $W_{\max}$ are the minimum and maximum values of the molecular weight of the tracked gas species in units of g/mol, and $\R$ is the universal gas constant, 8314.5~J/(kmol$\cdot$K). $T_{\min}$ and $T_{\max}$ are described above. To override the limits of density, specify \ct{MINIMUM_DENSITY} and/or \ct{MAXIMUM_DENSITY} on the \ct{CLIP} line in units of kg/m$^3$. +To override the limits of density, specify \ct{MINIMUM_DENSITY} and/or \ct{MAXIMUM_DENSITY} on the \ct{CLIP} line in units of kg/m$^3$. Clipping of density and mass fractions violates mass conservation, so it is preferable to avoid clipping if possible. As discussed in Sec.~\ref{info:Stability_Constraints}, the time step is set to adhere to the CFL constraints of the flow field. The proper \ct{DT} combined with flux limiters generally avoids the need for clipping. Beyond this, FDS then employs a mass redistribution scheme, as discussed in FDS Technical Guide~\cite{FDS_Math_Guide}. If this fails, there is yet one more attempt to avoid clipping---the time step is decreased by 10~\% ($\dt_{\mathrm{new}} = 0.9 \,\dt$) and the scalar transport equations are reiterated. This process is carried out a maximum of \ct{CLIP_DT_RESTRICTIONS_MAX} times; the default is 5. In some very extreme circumstances, this loop can drive the time step into numerical instability range ($\dt/\dt_{\mathrm{init}} < \mbox{\ct{LIMITING_DT_RATIO}}$). You can control the max number of time step restrictions by setting the parameter \ct{CLIP_DT_RESTRICTIONS_MAX} on the \ct{CLIP} line (set to 0 to bypass the algorithm altogether). The number of restrictions (if any) is noted in the \ct{CHID.out} file for a given time step. diff --git a/Source/chem.f90 b/Source/chem.f90 index caad873b03a..8998f5d56c8 100644 --- a/Source/chem.f90 +++ b/Source/chem.f90 @@ -807,6 +807,7 @@ SUBROUTINE CVODE_SERIAL(CC,ZZ_0, TMP_IN, TMP_UNMIX, PR_IN, ZETA0, TAU_MIX, CELL_ TMP_OUT, CHEM_TIME, WRITE_SUBSTEPS, CVODE_CALL_OPTION) USE PHYSICAL_FUNCTIONS, ONLY : MOLAR_CONC_TO_MASS_FRAC, CALC_EQUIV_RATIO, GET_ENTHALPY, GET_MOLECULAR_WEIGHT USE COMP_FUNCTIONS, ONLY: GET_FILE_NUMBER +USE CHEMCONS, ONLY: CVODE_WARNING_CELLS,CVODE_ERR_CODE_MIN,CVODE_ERR_CODE_MAX USE GLOBAL_CONSTANTS USE FCVODE_MOD ! FORTRAN INTERFACE TO CVODE USE FSUNDIALS_CONTEXT_MOD ! FORTRAN INTERFACE TO SUNCONTEXT @@ -1015,15 +1016,18 @@ SUBROUTINE CVODE_SERIAL(CC,ZZ_0, TMP_IN, TMP_UNMIX, PR_IN, ZETA0, TAU_MIX, CELL_ ENDIF IF (IERR_C .NE. CV_SUCCESS) THEN - IF (IERR_C == CV_TOO_MUCH_WORK) THEN - WRITE(LU_ERR,'(A, 2E18.8, I8, A)')" WARN: CVODE took all internal substeps. CUR_CFD_TIME, DT, MAXTRY=", CUR_CFD_TIME, & - (TEND-TCUR), MAXTRY, ". If the warning persists, reduce the timestep." - ELSE - WRITE(LU_ERR,'(A, I4, A, 2E18.8, A)')" WARN: CVODE didn't finish ODE solution with message code:", IERR_C, & - " and CUR_CFD_TIME, DT=", CUR_CFD_TIME, (TEND-TCUR), ". If the warning persists, reduce the timestep." + IF(IERR_C>=CVODE_ERR_CODE_MIN .AND. IERR_C<=CVODE_ERR_CODE_MAX) THEN + CVODE_WARNING_CELLS(IERR_C) = CVODE_WARNING_CELLS(IERR_C) + 1 ENDIF - IF (DEBUG) THEN + IF (IERR_C == CV_TOO_MUCH_WORK) THEN + WRITE(LU_ERR,'(A, 2E18.8, I8, A)')" WARN: CVODE took all internal substeps. CUR_CFD_TIME, DT, MAXTRY=", CUR_CFD_TIME, & + (TEND-TCUR), MAXTRY, ". If the warning persists, reduce the timestep." + ELSE + WRITE(LU_ERR,'(A, I4, A, 2E18.8, A)')" WARN: CVODE didn't finish ODE solution with message code:", IERR_C, & + " and CUR_CFD_TIME, DT=", CUR_CFD_TIME, (TEND-TCUR), ". If the warning persists, reduce the timestep." + ENDIF + CALL MOLAR_CONC_TO_MASS_FRAC(CC(1:N_TRACKED_SPECIES), ZZ(1:N_TRACKED_SPECIES)) CALL CALC_EQUIV_RATIO(ZZ(1:N_TRACKED_SPECIES), EQUIV) DO NS = 1, N_TRACKED_SPECIES diff --git a/Source/cons.f90 b/Source/cons.f90 index 20b6f4a62cf..1643e723ace 100644 --- a/Source/cons.f90 +++ b/Source/cons.f90 @@ -968,6 +968,10 @@ MODULE CHEMCONS INTEGER :: MAX_CVODE_SUBSTEPS=100000 INTEGER :: CVODE_MAX_TRY=4 INTEGER :: CVODE_ORDER=0 +INTEGER :: CVODE_ERR_CODE_MIN=-100 +INTEGER :: CVODE_ERR_CODE_MAX=100 +INTEGER :: CVODE_WARNING_CELLS(-100:100)! Index of the array is error code and value is Cell count +CHARACTER(LEN=100) :: CVODE_WARN_MESSAGES(-100:100) ! FOR WRITING CVODE SUBSTEPS LOGICAL :: WRITE_CVODE_SUBSTEPS = .FALSE. @@ -988,4 +992,12 @@ MODULE CHEMCONS INTEGER :: N_IGNITION_ZONES = 0 TYPE(IGNITION_ZONE_TYPE), DIMENSION(MAX_IGNITION_ZONES) :: IGNITION_ZONES !< Coordinates of ignition zones +CONTAINS + SUBROUTINE INIT_CVODE_WARN_MESSAGES() + CVODE_WARN_MESSAGES = 'CVODE didn''t finish ODE solution with this code.' + CVODE_WARN_MESSAGES(-1) = 'CVODE took all internal substeps.' + CVODE_WARN_MESSAGES(-3) = 'Minimum step size was reached.' + CVODE_WARN_MESSAGES(-4) = 'Convergence test failure.' + END SUBROUTINE INIT_CVODE_WARN_MESSAGES + END MODULE CHEMCONS diff --git a/Source/fire.f90 b/Source/fire.f90 index f37e21f4e74..5d5bc2dd32b 100644 --- a/Source/fire.f90 +++ b/Source/fire.f90 @@ -41,6 +41,7 @@ SUBROUTINE COMBUSTION_LOAD_BALANCED(T,DT) USE SOOT_ROUTINES, ONLY: SOOT_SURFACE_OXIDATION USE COMP_FUNCTIONS, ONLY: CURRENT_TIME +USE CHEMCONS, ONLY: CVODE_WARNING_CELLS,INIT_CVODE_WARN_MESSAGES REAL(EB), INTENT(IN) :: T,DT INTEGER :: NM,ICC,JCC REAL(EB) :: TNOW @@ -55,12 +56,14 @@ SUBROUTINE COMBUSTION_LOAD_BALANCED(T,DT) COMBUSTION_INIT = .TRUE. NVAR_TO_SEND = N_TRACKED_SPECIES +7 ! NS, TEMP, RHO, PRES, MU, DELTA, VOL, IGN_ZN NVAR_TO_RECEIVE = N_TRACKED_SPECIES +4 ! NS, Q_OUT, MIX_TIME_OUT, CHI_R_OUT, CHEM_SUBIT_TMP_OUT + CALL INIT_CVODE_WARN_MESSAGES() ENDIF DO NM=LOWER_MESH_INDEX,UPPER_MESH_INDEX CALL POINT_TO_MESH(NM) Q = 0._EB CHI_R = 0._EB + CVODE_WARNING_CELLS = 0 IF (CC_IBM) THEN DO ICC=1,MESHES(NM)%N_CUTCELL_MESH DO JCC=1,CUT_CELL(ICC)%NCELL @@ -109,6 +112,7 @@ SUBROUTINE COMBUSTION_GENERAL_LOAD_BALANCED(T,DT) REAL(EB) :: MIX_TIME_OUT, Q_OUT, CHI_R_OUT, MYTEMP, MYRHO, MYMU, DELTA, VOL, TNOW2 INTEGER :: IGN_ZN + Q_EXISTS = .FALSE. !------ @@ -329,6 +333,13 @@ SUBROUTINE COMBUSTION_GENERAL_LOAD_BALANCED(T,DT) ENDDO ENDIF +! Output accumulated CVODE warnings (instead of cell by cell) in verbose mode +#ifdef WITH_SUNDIALS +IF (COMBUSTION_ODE_SOLVER == CVODE_SOLVER .AND. VERBOSE) THEN + CALL DUMP_CVODE_WARNING_SUMMARY(NCHEM_ACTIVE_CELLS_AND_CC) +ENDIF +#endif + END SUBROUTINE COMBUSTION_GENERAL_LOAD_BALANCED @@ -1271,6 +1282,60 @@ SUBROUTINE CALC_AFT_REAC_AND_PROD(ZZ,ZZ_REAC,ZZ_PROD) END SUBROUTINE CALC_AFT_REAC_AND_PROD +!> \brief Dump CVODE warning summary +SUBROUTINE DUMP_CVODE_WARNING_SUMMARY(NCHEM_ACTIVE_CELLS_AND_CC) + USE CHEMCONS, ONLY: CVODE_WARNING_CELLS,CVODE_ERR_CODE_MIN,CVODE_ERR_CODE_MAX,CVODE_WARN_MESSAGES + + INTEGER, INTENT(IN) :: NCHEM_ACTIVE_CELLS_AND_CC + INTEGER :: NCHEM_ACTIVE_CELLS_AND_CC_GLOBAL,IERR, CVODE_ERR_CODE, TOT_WARN_CELLS + REAL(EB) :: PCNT + CHARACTER(LEN=16) :: CELL_STR, PCNT_STR + CHARACTER(LEN=40) :: CELL_INFO + + IF (N_MPI_PROCESSES > 1) THEN + CALL MPI_ALLREDUCE(MPI_IN_PLACE, CVODE_WARNING_CELLS, SIZE(CVODE_WARNING_CELLS), & + MPI_INTEGER, MPI_SUM, MPI_COMM_WORLD, IERR) + + CALL MPI_ALLREDUCE(NCHEM_ACTIVE_CELLS_AND_CC, NCHEM_ACTIVE_CELLS_AND_CC_GLOBAL, & + 1, MPI_INTEGER, MPI_SUM, MPI_COMM_WORLD, IERR) + ELSE + NCHEM_ACTIVE_CELLS_AND_CC_GLOBAL = NCHEM_ACTIVE_CELLS_AND_CC + END IF + TOT_WARN_CELLS = SUM(CVODE_WARNING_CELLS) + + IF (TOT_WARN_CELLS > 0 .AND. NCHEM_ACTIVE_CELLS_AND_CC_GLOBAL > 0 .AND. MY_RANK == 0) THEN + + WRITE(LU_ERR, '(A)') '--------------- CVODE Warning Summary ----------------' + WRITE(LU_ERR, '(A)') ' Code Cells (% Chem) Message' + + DO CVODE_ERR_CODE = CVODE_ERR_CODE_MIN, CVODE_ERR_CODE_MAX + IF (CVODE_WARNING_CELLS(CVODE_ERR_CODE) > 0) THEN + + PCNT = REAL(CVODE_WARNING_CELLS(CVODE_ERR_CODE)) / & + REAL(NCHEM_ACTIVE_CELLS_AND_CC_GLOBAL) * 100.0_EB + + ! Convert to strings and left-align + WRITE(CELL_STR, '(I0)') CVODE_WARNING_CELLS(CVODE_ERR_CODE) + WRITE(PCNT_STR, '(F6.2)') PCNT + CELL_STR = ADJUSTL(CELL_STR) + PCNT_STR = ADJUSTL(PCNT_STR) + + ! Combine count + percentage into one left-aligned string + WRITE(CELL_INFO, '(A, " (", A, " %)")') TRIM(CELL_STR), TRIM(PCNT_STR) + CELL_INFO = ADJUSTL(CELL_INFO) + + ! Print one line of summary + WRITE(LU_ERR, '(1X, I4, 5X, A, 5X, A)') CVODE_ERR_CODE, & + TRIM(CELL_INFO), TRIM(CVODE_WARN_MESSAGES(CVODE_ERR_CODE)) + END IF + END DO + + WRITE(LU_ERR, '(A)') '------------------------------------------------------' + + END IF + +END SUBROUTINE DUMP_CVODE_WARNING_SUMMARY + #endif SUBROUTINE CHECK_AUTO_IGNITION(EXTINCT,TMP_IN,AIT,IIC,JJC,KKC,REAC_INDEX) diff --git a/Utilities/Matlab/FDS_verification_dataplot_inputs.csv b/Utilities/Matlab/FDS_verification_dataplot_inputs.csv index bb32e709e65..0cec9cc1bdc 100644 --- a/Utilities/Matlab/FDS_verification_dataplot_inputs.csv +++ b/Utilities/Matlab/FDS_verification_dataplot_inputs.csv @@ -447,8 +447,8 @@ d,isentropic2,Pressure_Effects/isentropic2_git.txt,Pressure_Effects/isentropic2. d,isentropic2,Pressure_Effects/isentropic2_git.txt,Pressure_Effects/isentropic2.csv,1,2,Time,Pressure_1|Pressure_2,Exact (Pressure\_1)|Exact (Pressure\_2),ko|ro,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Pressure_Effects/isentropic2_devc.csv,2,3,Time,pressure_1|pressure_2,FDS (pressure\_1)|FDS (pressure\_2),k-|r-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Pressure (isentropic2),Time (s),Pressure (Pa),0,60,1,0,80000,1,no,0.05 0.90,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/isentropic2_pressure,Relative Error,end,0.03,Pressure Effects,k+,k,TeX d,isentropic2,Pressure_Effects/isentropic2_git.txt,Pressure_Effects/isentropic2.csv,1,2,Time,Temperature_1|Temperature_2,Exact (Temperature\_1)|Exact (Temperature\_2),ko|ro,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Pressure_Effects/isentropic2_devc.csv,2,3,Time,temperature_1|temperature_2,FDS (temperature\_1)|FDS (temperature\_2),k-|r-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Temperature (isentropic2),Time (s),Temperature (°C),0,60,1,15,160,1,no,0.05 0.90,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/isentropic2_temperature,Relative Error,end,0.03,Pressure Effects,k+,k,TeX d,isentropic2,Pressure_Effects/isentropic2_git.txt,Pressure_Effects/isentropic2.csv,1,2,Time,Enthalpy_1|Enthalpy_2,Exact (Enthalpy\_1)|Exact (Enthalpy\_2),ko|ro,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Pressure_Effects/isentropic2_devc.csv,2,3,Time,enthalpy_1|enthalpy_2,FDS (enthalpy\_1)|FDS (enthalpy\_2),k-|r-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Enthalpy (isentropic2),Time (s),Enthalpy (kJ),0,60,1,350,650,1,no,0.05 0.90,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/isentropic2_enthalpy,Relative Error,end,0.01,Pressure Effects,kd,k,TeX -d,lapse_rate,Atmospheric_Effects/lapse_rate_git.txt,Atmospheric_Effects/lapse_rate.csv,1,2,z,T,Exact,bo,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Atmospheric_Effects/lapse_rate_line.csv,2,3,T-z,T,FDS,b,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Temperature,Elevation (m),Temperature (°C),0,40,1,18,22,1,no,0.05 0.90,NorthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/lapse_rate_T,Relative Error,end,0.001,Atmospheric Effects,kd,k,TeX -d,lapse_rate,Atmospheric_Effects/lapse_rate_git.txt,Atmospheric_Effects/lapse_rate.csv,1,2,z,P,Exact,bo,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Atmospheric_Effects/lapse_rate_line.csv,2,3,T-z,P,FDS,b,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Pressure,Elevation (m),Pressure (Pa),0,40,1,100500,101500,1,no,0.05 0.90,NorthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/lapse_rate_P,Relative Error,end,0.001,Atmospheric Effects,kd,k,TeX +d,lapse_rate,Atmospheric_Effects/lapse_rate_git.txt,Atmospheric_Effects/lapse_rate.csv,1,2,z,T,Exact,bo,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Atmospheric_Effects/lapse_rate_line.csv,2,3,T-z,T,FDS,b-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Temperature,Elevation (m),Temperature (°C),0,40,1,18,22,1,no,0.05 0.90,NorthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/lapse_rate_T,Relative Error,end,0.001,Atmospheric Effects,kd,k,TeX +d,lapse_rate,Atmospheric_Effects/lapse_rate_git.txt,Atmospheric_Effects/lapse_rate.csv,1,2,z,P,Exact,bo,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Atmospheric_Effects/lapse_rate_line.csv,2,3,T-z,P,FDS,b-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Pressure,Elevation (m),Pressure (Pa),0,40,1,100500,101500,1,no,0.05 0.90,NorthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/lapse_rate_P,Relative Error,end,0.001,Atmospheric Effects,kd,k,TeX d,layer,Miscellaneous/layer_1mesh_git.txt,Miscellaneous/layer_1mesh_devc.csv,2,3,Time,z_int,1 mesh,k-,0,100000,,20,60,-1.00E+09,1.00E+09,0,Miscellaneous/layer_4mesh_devc.csv,2,3,Time,z_int,4 mesh,k--,0,100000,,20,60,-1.00E+09,1.00E+09,0,Layer Height,Time (s),Height (m),0,60,1,0,2,1,no,0.05 0.90,NorthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/layer_height,Relative Error,mean,0.2,Miscellaneous,kd,k,TeX d,layer,Miscellaneous/layer_1mesh_git.txt,Miscellaneous/layer_1mesh_devc.csv,2,3,Time,T_low|T_up,"T\_low, 1 mesh|T\_up, 1 mesh",k-|r-,0,100000,,20,60,-1.00E+09,1.00E+09,0,Miscellaneous/layer_4mesh_devc.csv,2,3,Time,T_low|T_up,"T\_low, 4 mesh|T\_up, 4 mesh",k--|r--,0,100000,,20,60,-1.00E+09,1.00E+09,0,Layer Temperatures,Time (s),Temperature (°C),0,60,1,0,100,1,no,0.05 0.90,East,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/layer_temps,Relative Error,mean,0.1,Miscellaneous,kd,k,TeX d,leak_test,HVAC/leak_test_git.txt,HVAC/leak_test.csv,1,2,Time,pres_diff,Ideal,ko,0,100000,,0,100000,-1.00E+09,1.00E+09,0,HVAC/leak_test_devc.csv,2,3,Time,pres_diff,FDS,k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Pressure (leak\_test),Time (s),Pressure Difference (Pa),0,30,1,180,200,1,no,0.05 0.90,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/leak_test,Relative Error,end,0.01,HVAC,ms,m,TeX @@ -469,17 +469,17 @@ d,mass_heat_wall_device_test,Flowfields/mass_heat_wall_device_test_git.txt,Flowf d,mass_heat_wall_device_test,Flowfields/mass_heat_wall_device_test_git.txt,Flowfields/mass_heat_wall_device_test_data.csv,2,3,Time,HF vent|HF open,Ideal Heat Flow Out|Ideal Heat Flow In,ko|ro,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Flowfields/mass_heat_wall_device_test_devc.csv,2,3,Time,HF vent|HF open,FDS Heat Flow Out|FDS Heat Flow In,k-|r-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Heat Flow (mass\_heat\_wall\_device\_test),Time (s),Heat Flow (kW),0,60,1,-500,500,1,no,0.05 0.90,East,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/wall_device_test_heatflow,Relative Error,end,0.01,Flowfields,r>,r,TeX d,mass_heat_wall_device_test_2,Flowfields/mass_heat_wall_device_test_2_git.txt,Flowfields/mass_heat_wall_device_test_data.csv,2,3,Time,MF vent|MF open,Ideal Mass Flow Out|Ideal Mass Flow In,ko|ro,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Flowfields/mass_heat_wall_device_test_2_devc.csv,2,3,Time,MF vent|MF open,FDS Mass Flow Out|FDS Mass Flow In,k-|r-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Mass Flow (mass\_heat\_wall\_device\_test\_2),Time (s),Mass Flow (kg/s),0,60,1,-6,6,1,no,0.05 0.90,East,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/wall_device_test_massflow_2,Relative Error,end,0.01,Flowfields,r>,r,TeX d,mass_heat_wall_device_test_2,Flowfields/mass_heat_wall_device_test_2_git.txt,Flowfields/mass_heat_wall_device_test_data.csv,2,3,Time,HF vent|HF open,Ideal Heat Flow Out|Ideal Heat Flow In,ko|ro,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Flowfields/mass_heat_wall_device_test_2_devc.csv,2,3,Time,HF vent|HF open,FDS Heat Flow Out|FDS Heat Flow In,k-|r-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Heat Flow (mass\_heat\_wall\_device\_test\_2),Time (s),Heat Flow (kW),0,60,1,-500,500,1,no,0.05 0.90,East,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/wall_device_test_heatflow_2,Relative Error,end,0.01,Flowfields,r>,r,TeX -d,methane_flame,Species/methane_flame_primitive_git.txt,Species/methane_flame_simple_devc.csv,2,3,Time,CO2|H2O|CO,CO2 simple|H2O simple|CO simple * 30,k|r|b,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/methane_flame_lumpedprimitive.csv,2,3,Time,pCO2|pH2O|pCO|lCO2|lH2O|lCO,CO2 primitive|H2O primitive|CO primitive * 30|CO2 lumped|H2O lumped|CO lumped * 30,ko|rs|bd|kx|r+|b*,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species mass (simple v. primitive v. lumped),Time (s),Mass (kg),0,10,1,0,0.05,1,no,0.03 0.90,EastOutside,,1.4,linear,FDS_Verification_Guide/SCRIPT_FIGURES/methane_flame_reac_comp,Relative Error,end_1_1,1.00E-02,Species,mx,m,TeX -d,methane_flame,Species/methane_flame_primitive_2_git.txt,Species/methane_flame_primitive_2_devc.csv,2,3,Time,pCO2|pH2O,CO2 primitive|H2O primitive,k|r,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/methane_flame_multilumped.csv,2,3,Time,lfCO2|lfH2O|loCO2|loH2O,CO2 lumped fuel|H2O lumped fuel|CO2 lumped oxidizer|H2O lumped oxidizer,ko|rs|bd|kx,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species mass (primitive v. lumped fuel v. lumped oxidizer),Time (s),Mass (kg),0,10,1,0,0.15,1,no,0.03 0.90,EastOutside,,1.4,linear,FDS_Verification_Guide/SCRIPT_FIGURES/methane_flame_lumped_comp,Relative Error,end_1_1,0.01,Species,mx,m,TeX -d,methane_flame,Species/methane_flame_simple_git.txt,Species/methane_flame_simple_devc.csv,2,3,Time,CO2|H2O|CO,CO2 simple|H2O simple|CO simple * 30,k|r|b,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/methane_flame_simple_2_devc.csv,2,3,Time,CO2|H2O|CO,CO2 simple 2| H2O lumped 2 | CO lumped 2 * 30,ko|rs|bd,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species mass (simple v. simple 2),Time (s),Mass (kg),0,10,1,0,0.05,1,no,0.03 0.90,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/methane_flame_simp_comp,Relative Error,end,0.01,Species,mx,m,TeX -d,multiple_reac_hrrpua,Species/multiple_reac_hrrpua_git.txt,Species/multiple_reac_hrrpua.csv,1,2,Time,CH4|C2H6|C3H8|CHO|H2plusC7H8,Ideal CH4|Ideal C2H6|Ideal C3H8|Ideal CHO|Ideal H2+C7H8,ko|ro|bo|mo|go,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/multiple_reac_hrrpua_hrr.csv,2,3,Time,MLR_METHANE|MLR_ETHANE|MLR_PROPANE|MLR_MYFUEL|MLR_MYFUEL2,FDS CH4|FDS C2H6|FDS C3H8|FDS CHO|FDS H2+C7H8,k|r|b|m|g,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species Mass Flux,Time (s),Mass Flux (kg/m²/s),0,5,1,0,0.001,1,no,0.03 0.90,East,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/multiple_reac_hrrpua,Relative Error,end,0.01,Species,yx,y,TeX -d,multiple_reac_n_simple,Species/multiple_reac_n_simple_git.txt,Species/multiple_reac_n_simple.csv,1,2,Time,CH4_CO|CH4_H2,Ideal CO|Ideal H2,ko|ro,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/multiple_reac_n_simple_devc.csv,2,3,Time,CH4_CO|CH4_H2,FDS CO|FDS H2,k|r,0,100000,,0,100000,-1.00E+09,1.00E+09,0,CH4 Species Mass,Time (s),Mass (kg),0,0.0001,1,0,0.006,1,no,0.03 0.90,East,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/multiple_reac_n_simple_CH4,Relative Error,end,0.01,Species,yd,y,TeX -d,multiple_reac_n_simple,Species/multiple_reac_n_simple_git.txt,Species/multiple_reac_n_simple.csv,1,2,Time,C3H8_CO|C3H8_H2O,Ideal CO|Ideal H2O,ko|ro,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/multiple_reac_n_simple_devc.csv,2,3,Time,C3H8_CO|C3H8_H2O,FDS CO|FDS H2O,k|r,0,100000,,0,100000,-1.00E+09,1.00E+09,0,C3H8 Species Mass,Time (s),Mass (kg),0,0.0001,1,0,0.025,1,no,0.03 0.90,East,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/multiple_reac_n_simple_C3H8,Relative Error,end,0.01,Species,ys,y,TeX -d,multiple_reac_n_simple,Species/multiple_reac_n_simple_git.txt,Species/multiple_reac_n_simple.csv,1,2,Time,C2H6_CO|C2H6_H2,Ideal CO|Ideal H2O,ko|ro,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/multiple_reac_n_simple_devc.csv,2,3,Time,C2H6_CO|C2H6_H2,FDS CO|FDS H2,k|r,0,100000,,0,100000,-1.00E+09,1.00E+09,0,C2H6 Species Mass,Time (s),Mass (kg),0,0.0001,1,0,0.035,1,no,0.03 0.90,East,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/multiple_reac_n_simple_C2H6,Relative Error,end,0.01,Species,yd,y,TeX +d,methane_flame,Species/methane_flame_primitive_git.txt,Species/methane_flame_simple_devc.csv,2,3,Time,CO2|H2O|CO,CO2 simple|H2O simple|CO simple * 30,k-|r-|b-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/methane_flame_lumpedprimitive.csv,2,3,Time,pCO2|pH2O|pCO|lCO2|lH2O|lCO,CO2 primitive|H2O primitive|CO primitive * 30|CO2 lumped|H2O lumped|CO lumped * 30,ko|rs|bd|kx|r+|b*,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species mass (simple v. primitive v. lumped),Time (s),Mass (kg),0,10,1,0,0.05,1,no,0.03 0.90,EastOutside,,1.4,linear,FDS_Verification_Guide/SCRIPT_FIGURES/methane_flame_reac_comp,Relative Error,end_1_1,1.00E-02,Species,mx,m,TeX +d,methane_flame,Species/methane_flame_primitive_2_git.txt,Species/methane_flame_primitive_2_devc.csv,2,3,Time,pCO2|pH2O,CO2 primitive|H2O primitive,k-|r-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/methane_flame_multilumped.csv,2,3,Time,lfCO2|lfH2O|loCO2|loH2O,CO2 lumped fuel|H2O lumped fuel|CO2 lumped oxidizer|H2O lumped oxidizer,ko|rs|bd|kx,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species mass (primitive v. lumped fuel v. lumped oxidizer),Time (s),Mass (kg),0,10,1,0,0.15,1,no,0.03 0.90,EastOutside,,1.4,linear,FDS_Verification_Guide/SCRIPT_FIGURES/methane_flame_lumped_comp,Relative Error,end_1_1,0.01,Species,mx,m,TeX +d,methane_flame,Species/methane_flame_simple_git.txt,Species/methane_flame_simple_devc.csv,2,3,Time,CO2|H2O|CO,CO2 simple|H2O simple|CO simple * 30,k-|r-|b-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/methane_flame_simple_2_devc.csv,2,3,Time,CO2|H2O|CO,CO2 simple 2| H2O lumped 2 | CO lumped 2 * 30,ko|rs|bd,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species mass (simple v. simple 2),Time (s),Mass (kg),0,10,1,0,0.05,1,no,0.03 0.90,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/methane_flame_simp_comp,Relative Error,end,0.01,Species,mx,m,TeX +d,multiple_reac_hrrpua,Species/multiple_reac_hrrpua_git.txt,Species/multiple_reac_hrrpua.csv,1,2,Time,CH4|C2H6|C3H8|CHO|H2plusC7H8,Ideal CH4|Ideal C2H6|Ideal C3H8|Ideal CHO|Ideal H2+C7H8,ko|ro|bo|mo|go,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/multiple_reac_hrrpua_hrr.csv,2,3,Time,MLR_METHANE|MLR_ETHANE|MLR_PROPANE|MLR_MYFUEL|MLR_MYFUEL2,FDS CH4|FDS C2H6|FDS C3H8|FDS CHO|FDS H2+C7H8,k-|r-|b-|m-|g-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species Mass Flux,Time (s),Mass Flux (kg/m²/s),0,5,1,0,0.001,1,no,0.03 0.90,East,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/multiple_reac_hrrpua,Relative Error,end,0.01,Species,yx,y,TeX +d,multiple_reac_n_simple,Species/multiple_reac_n_simple_git.txt,Species/multiple_reac_n_simple.csv,1,2,Time,CH4_CO|CH4_H2,Ideal CO|Ideal H2,ko|ro,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/multiple_reac_n_simple_devc.csv,2,3,Time,CH4_CO|CH4_H2,FDS CO|FDS H2,k-|r-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,CH4 Species Mass,Time (s),Mass (kg),0,0.0001,1,0,0.006,1,no,0.03 0.90,East,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/multiple_reac_n_simple_CH4,Relative Error,end,0.01,Species,yd,y,TeX +d,multiple_reac_n_simple,Species/multiple_reac_n_simple_git.txt,Species/multiple_reac_n_simple.csv,1,2,Time,C3H8_CO|C3H8_H2O,Ideal CO|Ideal H2O,ko|ro,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/multiple_reac_n_simple_devc.csv,2,3,Time,C3H8_CO|C3H8_H2O,FDS CO|FDS H2O,k-|r-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,C3H8 Species Mass,Time (s),Mass (kg),0,0.0001,1,0,0.025,1,no,0.03 0.90,East,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/multiple_reac_n_simple_C3H8,Relative Error,end,0.01,Species,ys,y,TeX +d,multiple_reac_n_simple,Species/multiple_reac_n_simple_git.txt,Species/multiple_reac_n_simple.csv,1,2,Time,C2H6_CO|C2H6_H2,Ideal CO|Ideal H2O,ko|ro,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/multiple_reac_n_simple_devc.csv,2,3,Time,C2H6_CO|C2H6_H2,FDS CO|FDS H2,k-|r-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,C2H6 Species Mass,Time (s),Mass (kg),0,0.0001,1,0,0.035,1,no,0.03 0.90,East,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/multiple_reac_n_simple_C2H6,Relative Error,end,0.01,Species,yd,y,TeX d,methanol_evaporation,Pyrolysis/methanol_evaporation_git.txt,Pyrolysis/methanol_evaporation_devc.csv,2,3,Time,mdot,Computed Evaporation Rate (mdot),k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Pyrolysis/methanol_evaporation_devc.csv,2,3,Time,mdot2,Ideal Evaporation Rate (mdot2),k--,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Liquid Evaporation (methanol\_evaporation),Time (min),Mass Loss Rate (kg/m²/s),0,6,60,0,0.025,1,no,0.05 0.90,SouthEast,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/methanol_evaporation_mdot,Relative Error,end,0.02,Pyrolysis,mx,m,TeX d,methanol_evaporation,Pyrolysis/methanol_evaporation_git.txt,Pyrolysis/methanol_evaporation.csv,1,2,Time,Tb,Measured Boiling Temperature (Tb),ko,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Pyrolysis/methanol_evaporation_devc.csv,2,3,Time,Tsurf,Surface Temperature (Tsurf),k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Liquid Evaporation (methanol\_evaporation),Time (min),Temperature (°C),0,6,60,0,100,1,no,0.05 0.90,SouthEast,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/methanol_evaporation_temp,Relative Error,end,0.015,Pyrolysis,mx,m,TeX -d,MO_velocity_profile_stable,Atmospheric_Effects/MO_velocity_profile_stable_git.txt,Atmospheric_Effects/MO_velocity_profile_stable.csv,1,2,z (m),u (m/s),MO profile,k,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Atmospheric_Effects/MO_velocity_profile_stable_line.csv,2,3,z,u,FDS profile,k--,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Monin-Obukhov profile stable,z (m),u (m/s),0,32,1,0,10,1,no,0.03 0.90,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/MO_velocity_profile_stable,Relative Error,area,0.05,Flowfields,r>,r,TeX -d,MO_velocity_profile_unstable,Atmospheric_Effects/MO_velocity_profile_unstable_git.txt,Atmospheric_Effects/MO_velocity_profile_unstable.csv,1,2,z (m),u (m/s),MO profile,k,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Atmospheric_Effects/MO_velocity_profile_unstable_line.csv,2,3,z,u,FDS profile,k--,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Monin-Obukhov profile unstable,z (m),u (m/s),0,32,1,0,15,1,no,0.03 0.90,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/MO_velocity_profile_unstable,Relative Error,area,0.05,Flowfields,r>,r,TeX +d,MO_velocity_profile_stable,Atmospheric_Effects/MO_velocity_profile_stable_git.txt,Atmospheric_Effects/MO_velocity_profile_stable.csv,1,2,z (m),u (m/s),MO profile,k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Atmospheric_Effects/MO_velocity_profile_stable_line.csv,2,3,z,u,FDS profile,k--,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Monin-Obukhov profile stable,z (m),u (m/s),0,32,1,0,10,1,no,0.03 0.90,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/MO_velocity_profile_stable,Relative Error,area,0.05,Flowfields,r>,r,TeX +d,MO_velocity_profile_unstable,Atmospheric_Effects/MO_velocity_profile_unstable_git.txt,Atmospheric_Effects/MO_velocity_profile_unstable.csv,1,2,z (m),u (m/s),MO profile,k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Atmospheric_Effects/MO_velocity_profile_unstable_line.csv,2,3,z,u,FDS profile,k--,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Monin-Obukhov profile unstable,z (m),u (m/s),0,32,1,0,15,1,no,0.03 0.90,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/MO_velocity_profile_unstable,Relative Error,area,0.05,Flowfields,r>,r,TeX d,Morvan_TGA,WUI/Morvan_TGA_git.txt,WUI/Morvan_Data_Mass.csv,1,2,T (C),Normalized Mass (M/M0),Exp (Morvan 2004),k^,0,100000,,0,100000,-1.00E+09,1.00E+09,0,WUI/Morvan_TGA_tga.csv,2,3,Temp,Total Mass,FDS TGA (Total Mass),k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Morvan TGA; 1.6 °C/min,Temperature (°C),Normalized Mass,0,700,1,0,1.2,1,no,0.05 0.90,East,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/Morvan_TGA_Total_Mass,N/A,mean,0,Needle TGA,kd,k,TeX d,Morvan_TGA,WUI/Morvan_TGA_git.txt,WUI/Morvan_Data_SG_Deriv.csv,1,2,T (C),normalized Savitsky-Golay derivative,SG deriv (Morvan 2004),k--,0,100000,,0,100000,-1.00E+09,1.00E+09,0,WUI/Morvan_TGA_tga.csv,2,3,Temp,Total MLR,FDS TGA (Total MLR),k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Morvan TGA; 1.6 °C/min,Temperature (°C),Mass Loss Rate (1/s),0,700,1,0,1.50E-04,1,no,0.05 0.90,East,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/Morvan_TGA_Total_MLR,N/A,mean,0,Needle TGA,kd,k,TeX d,Morvan_TGA,WUI/Morvan_TGA_2_git.txt,WUI/Morvan_Data_Mass.csv,1,2,T (C),Normalized Mass (M/M0),Exp (Morvan 2004),k^,0,100000,,0,100000,-1.00E+09,1.00E+09,0,WUI/Morvan_TGA_2_tga.csv,2,3,Temp,Total Mass,FDS TGA (Total Mass),k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Morvan TGA; 1.6 °C/min,Temperature (°C),Normalized Mass,0,700,1,0,1.2,1,no,0.05 0.90,East,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/Morvan_TGA_2_Total_Mass,N/A,mean,0,Needle TGA,kd,k,TeX @@ -565,7 +565,7 @@ d,propane_flame_2reac,Species/propane_flame_2reac_git.txt,Species/propane_flame_ d,propane_flame_deposition,Aerosols/propane_flame_deposition_git.txt,Aerosols/propane_flame_deposition.csv,1,2,Time,Mass,Expected Mass,ko,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Aerosols/propane_flame_deposition_cat_gas.csv,2,3,Time,depo_all|depo_none|depo_gravitational|depo_thermophoretic|depo_turbulent,FDS (All Deposition)|FDS (No Deposition)|FDS (Gravitational Deposition)|FDS (Thermophoretic Deposition)|FDS (Turbulent Deposition),ks-|bd-|g*-|rx-|mo-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Gas soot mass (propane\_flame\_deposition),Time (s),Mass (g),0,10,1,0.4,0.6,0.001,no,0.05 0.90,West,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/propane_flame_deposition_gas,Relative Error,end_1_2,0.01,Aerosols,mx,m,TeX d,propane_flame_deposition,Aerosols/propane_flame_deposition_git.txt,Aerosols/propane_flame_deposition_cat_wall.csv,2,3,Time,depo_all,FDS (All Deposition),k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Aerosols/propane_flame_deposition_cat_wall.csv,2,3,Time,depo_none|depo_gravitational|depo_thermophoretic|depo_turbulent,FDS (No Deposition)|FDS (Gravitational Deposition)|FDS (Thermophoretic Deposition)|FDS (Turbulent Deposition),bs-|gd-|r*-|mx-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Wall soot mass (propane\_flame\_deposition),Time (s),Mass (g),0,10,1,0,0.012,0.001,no,0.05 0.90,West,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/propane_flame_deposition_wall,N/A,end,0,Aerosols,mx,m,TeX d,propane_flame_deposition,Aerosols/propane_flame_deposition_git.txt,Aerosols/propane_flame_deposition.csv,1,2,Time,Mass,Expected Mass,ko,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Aerosols/propane_flame_deposition_cat_total.csv,2,3,Time,depo_all|depo_none|depo_gravitational|depo_thermophoretic|depo_turbulent,FDS (All Deposition)|FDS (No Deposition)|FDS (Gravitational Deposition)|FDS (Thermophoretic Deposition)|FDS (Turbulent Deposition),ks-|bd-|g*-|rx-|mo-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Total soot mass (propane\_flame\_deposition),Time (s),Mass (g),0,10,1,0.4,0.6,0.001,no,0.05 0.90,West,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/propane_flame_deposition_total,Relative Error,end_1_1,0.01,Aerosols,mx,m,TeX -d,pvc_combustion,Species/pvc_combustion_git.txt,Species/pvc_combustion_soln.csv,1,2,Time,CO2|CO|H2O|S|HCL,Expected CO2|Expected CO|Expected H2O|Expected Soot|Expected HCl,bo|ko|ro|go|mo,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/pvc_combustion_devc.csv,2,3,Time,CO2|CO|H2O|S|HCL,FDS CO2|FDS CO|FDS H2O|FDS Soot|FDS HCl,b|k|r|g|m,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species Mass Fraction (PVC),Time (s),Mass Fraction,0,2,1,0,0.3,1,no,0.05 0.90,EastOutside,,1.365,linear,FDS_User_Guide/SCRIPT_FIGURES/pvc_combustion_spec,Absolute Error,end,1.00E-03,Species,mx,m,TeX +d,pvc_combustion,Species/pvc_combustion_git.txt,Species/pvc_combustion_soln.csv,1,2,Time,CO2|CO|H2O|S|HCL,Expected CO2|Expected CO|Expected H2O|Expected Soot|Expected HCl,bo|ko|ro|go|mo,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species/pvc_combustion_devc.csv,2,3,Time,CO2|CO|H2O|S|HCL,FDS CO2|FDS CO|FDS H2O|FDS Soot|FDS HCl,b-|k-|r-|g-|m-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Species Mass Fraction (PVC),Time (s),Mass Fraction,0,2,1,0,0.3,1,no,0.05 0.90,EastOutside,,1.365,linear,FDS_User_Guide/SCRIPT_FIGURES/pvc_combustion_spec,Absolute Error,end,1.00E-03,Species,mx,m,TeX d,race_test,Thread_Check/race_test_1_git.txt,Thread_Check/race_test_1_devc.csv,2,3,Time,TMP,1 Thread (TMP),k-,0,100000,,4.49,4.51,-1.00E+09,1.00E+09,0,Thread_Check/race_test_4_devc.csv,2,3,Time,TMP,4 Thread (TMP),ko,0,100000,,4.49,4.51,-1.00E+09,1.00E+09,0,Temperature (race\_test),Time (s),Temperature (°C),0,5,1,0,1200,1,no,0.05 0.90,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/race_test_tmp,Absolute Error,end,0.01,Numerics,kd,k,TeX d,race_test,Thread_Check/race_test_1_git.txt,Thread_Check/race_test_1_devc.csv,2,3,Time,VEL,1 Thread (VEL),k-,0,100000,,4.49,4.51,-1.00E+09,1.00E+09,0,Thread_Check/race_test_4_devc.csv,2,3,Time,VEL,4 Thread (VEL),ko,0,100000,,4.49,4.51,-1.00E+09,1.00E+09,0,Velocity (race\_test),Time (s),Velocity (m/s),0,5,1,0,2,1,no,0.05 0.90,SouthEast,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/race_test_vel,Absolute Error,end,0.01,Numerics,kd,k,TeX d,radiation_box,Radiation/radiation_box__20___50_git.txt,Radiation/radiation_box.csv,1,2,(y z),Phi_HdA,Analytical (Phi\_HdA),k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Radiation/radiation_box_devc.csv,1,2,Position,Flux_20_50|Flux_20_100|Flux_20_300|Flux_20_1000|Flux_20_2000,FDS (Flux\_20\_50)|FDS (Flux\_20\_100)|FDS (Flux\_20\_300)|FDS (Flux\_20\_1000)|FDS (Flux\_20\_2000),g--|r--|k--|b--|m--,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Incident Heat Flux (radiation\_box),Position (m),Heat Flux (kW/m²),0,1,1,0,0.35,1,no,0.05 0.90,South,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/radiation_box_20,Convergent Series,mean_1_5,0.01,Radiation,kd,k,TeX @@ -655,8 +655,8 @@ d,sphere_drag_1,Sprinklers_and_Sprays/sphere_drag_1_git.txt,Sprinklers_and_Spray d,sphere_drag_2,Sprinklers_and_Sprays/sphere_drag_2_git.txt,Sprinklers_and_Sprays/sphere_drag_2.csv,1,2,Length,Pres,Exact,ko,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Sprinklers_and_Sprays/sphere_drag_2_line.csv,2,3,pres-x,pres,FDS,k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Pressure Drop (sphere\_drag\_2),Length (m),Pressure (Pa),0,10,1,0,0.3,1,no,0.05 0.90,East,,1,linear,FDS_Verification_Guide/SCRIPT_FIGURES/sphere_drag_2,Relative Error,max,0.02,Sprinklers_and_Sprays,bs,b,TeX d,spray_burner,Fires/spray_burner_git.txt,Fires/spray_burner.csv,1,2,Time,HRR,Specified (HRR),k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Fires/spray_burner_hrr.csv,2,3,Time,HRR,FDS (HRR),k--,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Heat Release Rate (spray\_burner),Time (s),Heat Release Rate (kW),0,60,1,0,2500,1,no,0.05 0.90,SouthEast,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/spray_burner_HRR,Relative Error,area,0.05,Fires,kd,k,TeX d,spreading_fire,Controls/spreading_fire_git.txt,Controls/spreading_fire.csv,1,2,Time,HRR,Specified (HRR),ko,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Controls/spreading_fire_hrr.csv,2,3,Time,HRR,FDS (HRR),k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Heat Release Rate (spreading\_fire),Time (s),Heat Release Rate (kW),0,200,1,0,14000,1,no,0.05 0.90,South,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/spreading_fire_HRR,Relative Error,area,0.05,Fires,kd,k,TeX -d,stack_effect,Atmospheric_Effects/stack_effect_git.txt,Atmospheric_Effects/stack_effect.csv,1,2,Time,Ideal Upper|Ideal Lower,Ideal Upper|Ideal Lower,bo|ko,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Atmospheric_Effects/stack_effect_devc.csv,2,3,Time,FDS Upper|FDS Lower,FDS Upper|FDS Lower,b|k,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Leakage Velocity,Time (s),Velocity (m/s),0,100,1,0,5,1,no,0.05 0.90,South,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/stack_effect_v,Relative Error,end,0.05,Atmospheric Effects,kd,k,TeX -d,stack_effect,Atmospheric_Effects/stack_effect_git.txt,Atmospheric_Effects/stack_effect.csv,1,2,Time,Ideal Upper Exterior|Ideal Lower Exterior|Ideal Upper Interior|Ideal Lower Interior,Ideal Upper Exterior|Ideal Lower Exterior|Ideal Upper Interior|Ideal Lower Interior,bo|ko|ro|go,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Atmospheric_Effects/stack_effect_devc.csv,2,3,Time,FDS Upper Exterior|FDS Lower Exterior|FDS Upper Interior|FDS Lower Interior,FDS Upper Exterior|FDS Lower Exterior|FDS Upper Interior|FDS Lower Interior,b|k|r|g,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Density,Time (s),Density (kg/m³),0,100,1,0,1.5,1,no,0.05 0.90,South,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/stack_effect_rho,Relative Error,end,0.01,Atmospheric Effects,kd,k,TeX +d,stack_effect,Atmospheric_Effects/stack_effect_git.txt,Atmospheric_Effects/stack_effect.csv,1,2,Time,Ideal Upper|Ideal Lower,Ideal Upper|Ideal Lower,bo|ko,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Atmospheric_Effects/stack_effect_devc.csv,2,3,Time,FDS Upper|FDS Lower,FDS Upper|FDS Lower,b-|k-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Leakage Velocity,Time (s),Velocity (m/s),0,100,1,0,5,1,no,0.05 0.90,South,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/stack_effect_v,Relative Error,end,0.05,Atmospheric Effects,kd,k,TeX +d,stack_effect,Atmospheric_Effects/stack_effect_git.txt,Atmospheric_Effects/stack_effect.csv,1,2,Time,Ideal Upper Exterior|Ideal Lower Exterior|Ideal Upper Interior|Ideal Lower Interior,Ideal Upper Exterior|Ideal Lower Exterior|Ideal Upper Interior|Ideal Lower Interior,bo|ko|ro|go,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Atmospheric_Effects/stack_effect_devc.csv,2,3,Time,FDS Upper Exterior|FDS Lower Exterior|FDS Upper Interior|FDS Lower Interior,FDS Upper Exterior|FDS Lower Exterior|FDS Upper Interior|FDS Lower Interior,b-|k-|r-|g-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Density,Time (s),Density (kg/m³),0,100,1,0,1.5,1,no,0.05 0.90,South,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/stack_effect_rho,Relative Error,end,0.01,Atmospheric Effects,kd,k,TeX d,stairwell,Pressure_Solver/stairwell_git.txt,Pressure_Solver/stairwell.csv,1,2,Time,Vdot,Ideal (Vdot),k-,0,100000,,40,60,-1.00E+09,1.00E+09,0,Pressure_Solver/stairwell_devc.csv,2,3,Time,Vdot,FDS (Vdot),k--,0,100000,,40,60,-1.00E+09,1.00E+09,0,stairwell,Time (s),Volume Flow (m³/s),0,60,1,0,1,1,no,0.05 0.90,SouthEast,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/stairwell,Relative Error,end,0.05,Pressure Solver,kd,k,TeX d,spyro_cone_demo,Pyrolysis/spyro_cone_demo_git.txt,Pyrolysis/spyro_cone_demo.csv,1,2,Time,25 kW/m2|50 kW/m2|75 kW/m2,Cone 25|Cone 50|Cone 75,k-|r-|g-,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Pyrolysis/spyro_cone_demo_devc.csv,2,3,Time,Q50 to Q25|Q50 to Q50|Q50 to Q75,FDS 50-25|FDS 50-50|FDS 50-75,k--|r--|g--,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Spyro Cone Demo,Time (s),HRRPUA (kW/m²),0,1500,1,0,500,1,no,0.05 0.90,East,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/spyro_cone_demo,N/A,end,0,Pyrolysis,rx,r,TeX f,spyro_cone_demo,Pyrolysis/spyro_cone_demo_git.txt,Pyrolysis/spyro_cone_demo.csv,1,2,Time,25 kW/m2,blank,blank,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Pyrolysis/spyro_cone_demo_devc.csv,2,3,Time,Q25 Q75 to Q50,FDS 25 75-50,b--,0,100000,,0,100000,-1.00E+09,1.00E+09,0,Spyro Cone Demo,Time (s),HRRPUA (kW/m²),0,1500,1,0,500,1,no,0.05 0.90,East,,1,linear,FDS_User_Guide/SCRIPT_FIGURES/spyro_cone_demo,N/A,end,0,Pyrolysis,rx,r,TeX diff --git a/Utilities/Python/fdsplotlib.py b/Utilities/Python/fdsplotlib.py index 5c6707b13c8..73727219a9c 100644 --- a/Utilities/Python/fdsplotlib.py +++ b/Utilities/Python/fdsplotlib.py @@ -268,8 +268,14 @@ def read_csv_cached(path, **kwargs): } safe_na_values = default_na - df = pd.read_csv(configdir + config_filename, sep=',', engine='python', - quotechar='"', na_values=safe_na_values, keep_default_na=False) + df = pd.read_csv( + configdir + config_filename, + sep=',', + engine='python', + quotechar='"', + na_values=safe_na_values, + keep_default_na=False + ) df["__orig_index__"] = df.index C = df.where(pd.notnull(df), None) @@ -355,6 +361,7 @@ def read_csv_cached(path, **kwargs): start_idx = int(pp.d1_Data_Row - pp.d1_Col_Name_Row - 1) x, _ = get_data(E, pp.d1_Ind_Col_Name, start_idx) y, _ = get_data(E, pp.d1_Dep_Col_Name, start_idx) + flip_axis = str(pp.Flip_Axis).strip().lower() in ['yes', 'true', '1'] x_scale = float(pp.Scale_Ind or 1.0) y_scale = float(pp.Scale_Dep or 1.0) @@ -384,7 +391,7 @@ def read_csv_cached(path, **kwargs): raw_keys = [c.strip() for c in (pp.d1_Key or '').split('|')] if pp.d1_Key else [] key_labels = (raw_keys + [None] * len(y_plot_list))[:len(y_plot_list)] - if dtest: + if dtest or gtest: if verbose: print(f"Generating plot {csv_rownum} {pltdir}{pp.Plot_Filename}...") if close_figs: @@ -396,15 +403,22 @@ def read_csv_cached(path, **kwargs): else: continue + # --- Styles and keys (EXP d1) --- + d1_raw_styles = [c.strip() for c in (pp.d1_Style or '').split('|')] if pp.d1_Style else [] + d1_styles = (d1_raw_styles + [None] * len(y_plot_list))[:len(y_plot_list)] + d1_raw_keys = [c.strip() for c in (pp.d1_Key or '').split('|')] if pp.d1_Key else [] + d1_key_labels = (d1_raw_keys + [None] * len(y_plot_list))[:len(y_plot_list)] + + # --- Plot Exp curves --- for i, (x_i, y_i) in enumerate(zip(x_plot_list, y_plot_list)): f = plot_to_fig( x_data=y_i if flip_axis else x_i, y_data=x_i if flip_axis else y_i, figure_handle=None if (first_plot and i == 0) else f, - data_label=key_labels[i], + data_label=d1_key_labels[i], x_label=pp.Dep_Title if flip_axis else pp.Ind_Title, y_label=pp.Ind_Title if flip_axis else pp.Dep_Title, - marker_style=styles[i], + marker_style=d1_styles[i], x_min=pp.Min_Dep if flip_axis else pp.Min_Ind, x_max=pp.Max_Dep if flip_axis else pp.Max_Ind, y_min=pp.Min_Ind if flip_axis else pp.Min_Dep, @@ -420,7 +434,8 @@ def read_csv_cached(path, **kwargs): qty_meas_list = [] if y.ndim == 2 and x.ndim == 2 and y.shape[1] == x.shape[1]: for j in range(y.shape[1]): - xj = np.ravel(x[:, j]); yj = np.ravel(y[:, j]) + xj = np.ravel(x[:, j]) + yj = np.ravel(y[:, j]) mask = np.isfinite(xj) & np.isfinite(yj) xj, yj = xj[mask], yj[mask] if len(xj) > 0 and len(yj) > 0: @@ -451,7 +466,8 @@ def read_csv_cached(path, **kwargs): Save_Measured_Quantity[-1] = np.array(qty_meas_list, dtype=object) except Exception as e: print(f"[dataplot] Error computing measured metric for {pp.Dataname}: {e}") - Save_Measured_Metric[-1] = np.array([]); Save_Measured_Quantity[-1] = [] + Save_Measured_Metric[-1] = np.array([]) + Save_Measured_Quantity[-1] = [] # ---------------------- LOAD MODEL ---------------------- M = read_csv_cached(cmpdir + pp.d2_Filename, @@ -461,18 +477,24 @@ def read_csv_cached(path, **kwargs): M = M.loc[:M.dropna(how='all').last_valid_index()] M.columns = M.columns.str.strip() start_idx = int(pp.d2_Data_Row - pp.d2_Col_Name_Row - 1) + version_string = revision if pp.VerStr_Filename: try: with open(cmpdir + pp.VerStr_Filename, "r") as fver: Lines = fver.readlines() - if Lines: version_string = Lines[0].strip() + if Lines: + version_string = Lines[0].strip() except Exception as e: print(f"[dataplot] Warning: could not read version string: {e}") + x, _ = get_data(M, pp.d2_Ind_Col_Name, start_idx) y, _ = get_data(M, pp.d2_Dep_Col_Name, start_idx) - x_scale = float(pp.Scale_Ind or 1.0); y_scale = float(pp.Scale_Dep or 1.0) - x_scaled = np.asarray(x) / x_scale; y_scaled = np.asarray(y) / y_scale + + x_scale = float(pp.Scale_Ind or 1.0) + y_scale = float(pp.Scale_Dep or 1.0) + x_scaled = np.asarray(x) / x_scale + y_scaled = np.asarray(y) / y_scale if x_scaled.ndim == 2 and y_scaled.ndim == 2 and x_scaled.shape[1] == y_scaled.shape[1]: x_plot_list = [x_scaled[:, i] for i in range(x_scaled.shape[1])] @@ -481,19 +503,46 @@ def read_csv_cached(path, **kwargs): x_plot_list = [x_scaled for _ in range(y_scaled.shape[1])] y_plot_list = [y_scaled[:, i] for i in range(y_scaled.shape[1])] else: - x_plot_list = [np.ravel(x_scaled)]; y_plot_list = [np.ravel(y_scaled)] + x_plot_list = [np.ravel(x_scaled)] + y_plot_list = [np.ravel(y_scaled)] for xi, yi in zip(x_plot_list, y_plot_list): if len(xi) != len(yi): print(f"[dataplot] Pair length mismatch in {pp.Dataname}: x={len(xi)}, y={len(yi)}") + # --- Styles and keys (MODEL d2) --- + d2_raw_styles = [c.strip() for c in (pp.d2_Style or '').split('|')] if pp.d2_Style else [] + d2_styles = (d2_raw_styles + [None] * len(y_plot_list))[:len(y_plot_list)] + d2_raw_keys = [c.strip() for c in (pp.d2_Key or '').split('|')] if pp.d2_Key else [] + d2_key_labels = (d2_raw_keys + [None] * len(y_plot_list))[:len(y_plot_list)] + + # --- Plot model curves --- + for i, (x_i, y_i) in enumerate(zip(x_plot_list, y_plot_list)): + f = plot_to_fig( + x_data=y_i if flip_axis else x_i, + y_data=x_i if flip_axis else y_i, + revision_label=version_string, + figure_handle=f, # keep same figure + data_label=d2_key_labels[i], + line_style=d2_styles[i], + x_label=pp.Dep_Title if flip_axis else pp.Ind_Title, + y_label=pp.Ind_Title if flip_axis else pp.Dep_Title, + x_min=pp.Min_Dep if flip_axis else pp.Min_Ind, + x_max=pp.Max_Dep if flip_axis else pp.Max_Ind, + y_min=pp.Min_Ind if flip_axis else pp.Min_Dep, + y_max=pp.Max_Ind if flip_axis else pp.Max_Dep, + legend_location=matlab_legend_to_matplotlib(pp.Key_Position), + plot_type=plot_type, + plot_title=pp.Plot_Title, + ) + # --- Interpolated, metric-aware model logic --- if not gtest: try: metric_str = str(pp.Metric or '').strip().lower() meas_list, pred_list, qty_pred_list = [], [], [] - # --- Load experimental data for alignment --- + # Load experimental again for alignment (safe; cached) E = read_csv_cached(expdir + pp.d1_Filename, header=int(pp.d1_Col_Name_Row - 1), sep=',', engine='python', quotechar='"', @@ -503,7 +552,7 @@ def read_csv_cached(path, **kwargs): x_exp, _ = get_data(E, pp.d1_Ind_Col_Name, start_idx_exp) y_exp, _ = get_data(E, pp.d1_Dep_Col_Name, start_idx_exp) - # Normalize shapes + # Normalize shapes to 2D (col-major semantics) x_exp = np.atleast_2d(x_exp) y_exp = np.atleast_2d(y_exp) x_mod = np.atleast_2d(x) @@ -512,6 +561,7 @@ def read_csv_cached(path, **kwargs): ncols = min(y_exp.shape[1], y_mod.shape[1]) for j in range(ncols): + # Cull NaNs per series keeping pairs aligned xj_e = np.ravel(x_exp[:, j] if x_exp.shape[1] > 1 else x_exp) yj_e = np.ravel(y_exp[:, j]) m_e = np.isfinite(xj_e) & np.isfinite(yj_e) @@ -523,7 +573,7 @@ def read_csv_cached(path, **kwargs): xj_m, yj_m = xj_m[m_m], yj_m[m_m] if metric_str == 'all': - # interpolate model→exp grid + # align by interpolating model to exp x if xj_m.size < 2 or xj_e.size == 0: continue yj_m_i = np.interp(xj_e, xj_m, yj_m, left=np.nan, right=np.nan) @@ -533,38 +583,52 @@ def read_csv_cached(path, **kwargs): x_use = xj_e[mask_pair] y_exp_use = yj_e[mask_pair] y_mod_use = yj_m_i[mask_pair] + # compute both on the same x grid + v_meas, _, _ = _compute_metrics_block( + x=x_use, Y=y_exp_use, metric=metric_str, + initial_value=float(pp.d1_Initial_Value or 0.0), + comp_start=float(pp.d1_Comp_Start or np.nan), + comp_end=float(pp.d1_Comp_End or np.nan), + dep_comp_start=float(pp.d1_Dep_Comp_Start or np.nan), + dep_comp_end=float(pp.d1_Dep_Comp_End or np.nan), + variant_side="d1", + ) + v_pred, qty_pred, _ = _compute_metrics_block( + x=x_use, Y=y_mod_use, metric=metric_str, + initial_value=float(pp.d2_Initial_Value or 0.0), + comp_start=float(pp.d2_Comp_Start or np.nan), + comp_end=float(pp.d2_Comp_End or np.nan), + dep_comp_start=float(pp.d2_Dep_Comp_Start or np.nan), + dep_comp_end=float(pp.d2_Dep_Comp_End or np.nan), + variant_side="d2", + ) else: - # no interpolation; operate independently - x_use, y_exp_use, y_mod_use = xj_e, yj_e, yj_m - - if y_exp_use.size == 0 or y_mod_use.size == 0: - continue - - v_meas, _, _ = _compute_metrics_block( - x=x_use, Y=y_exp_use, metric=metric_str, - initial_value=float(pp.d1_Initial_Value or 0.0), - comp_start=float(pp.d1_Comp_Start or np.nan), - comp_end=float(pp.d1_Comp_End or np.nan), - dep_comp_start=float(pp.d1_Dep_Comp_Start or np.nan), - dep_comp_end=float(pp.d1_Dep_Comp_End or np.nan), - variant_side="d1", - ) - v_pred, qty_pred, _ = _compute_metrics_block( - x=x_use if metric_str == 'all' else xj_m, - Y=y_mod_use, metric=metric_str, - initial_value=float(pp.d2_Initial_Value or 0.0), - comp_start=float(pp.d2_Comp_Start or np.nan), - comp_end=float(pp.d2_Comp_End or np.nan), - dep_comp_start=float(pp.d2_Dep_Comp_Start or np.nan), - dep_comp_end=float(pp.d2_Dep_Comp_End or np.nan), - variant_side="d2", - ) + # aggregate metrics: NO interpolation; operate independently + if yj_e.size == 0 or yj_m.size == 0: + continue + v_meas, _, _ = _compute_metrics_block( + x=xj_e, Y=yj_e, metric=metric_str, + initial_value=float(pp.d1_Initial_Value or 0.0), + comp_start=float(pp.d1_Comp_Start or np.nan), + comp_end=float(pp.d1_Comp_End or np.nan), + dep_comp_start=float(pp.d1_Dep_Comp_Start or np.nan), + dep_comp_end=float(pp.d1_Dep_Comp_End or np.nan), + variant_side="d1", + ) + v_pred, qty_pred, _ = _compute_metrics_block( + x=xj_m, Y=yj_m, metric=metric_str, + initial_value=float(pp.d2_Initial_Value or 0.0), + comp_start=float(pp.d2_Comp_Start or np.nan), + comp_end=float(pp.d2_Comp_End or np.nan), + dep_comp_start=float(pp.d2_Dep_Comp_Start or np.nan), + dep_comp_end=float(pp.d2_Dep_Comp_End or np.nan), + variant_side="d2", + ) meas_list.append(np.atleast_1d(v_meas)) pred_list.append(np.atleast_1d(v_pred)) qty_pred_list.append(qty_pred) - # flatten appropriately flat_meas = np.concatenate(meas_list) if meas_list else np.array([]) flat_pred = np.concatenate(pred_list) if pred_list else np.array([])