diff --git a/Manuals/FDS_Validation_Guide/Experiment_Chapter.tex b/Manuals/FDS_Validation_Guide/Experiment_Chapter.tex index 599c17e09d..b6c6ee4342 100644 --- a/Manuals/FDS_Validation_Guide/Experiment_Chapter.tex +++ b/Manuals/FDS_Validation_Guide/Experiment_Chapter.tex @@ -10,21 +10,21 @@ \chapter{Description of Experiments} \section{Aalto Woods Experiments} \label{Aalto_Woods_Description} -Rinta-Paavola et al. developed a material model for Norway spruce and Scots pine woods to predict char front progress and heat release in burning timber~\cite{Rinta-Paavola:2023}. The material models are calibrated using temperature, mass loss rate and heat release rate measurements of wood specimens in a cone calorimeter. The model is intended for a number of different fire scenarios, such as fully developed fire with only little oxygen in the compartment, or the decay period after flaming with exposed char still smoldering. Cone calorimeter measurements were conducted under flaming, inert, and and smoldering conditions to replicate these scenarios. The estimated material models are able to predict the experiments in the scale of cone calorimeter. +Rinta-Paavola et al.~developed a material model for Norway spruce and Scots pine woods to predict char front progress and heat release in burning timber~\cite{Rinta-Paavola:2023}. The material models are calibrated using temperature, mass loss rate and heat release rate measurements of wood specimens in a cone calorimeter. The model is intended for fully-developed compartment fires or the subsequent decay period with exposed, smoldering char. Cone calorimeter measurements were conducted under flaming, inert, and smoldering conditions to replicate these scenarios. The material models are able to predict the bench-scale experiments. -The material model for spruce developed using cone calorimeter measurements is tested in prediction of heat release rates in two previously existing experiments: an ISO 9705 room corner test~\cite{Sundstrom:1998} (test code M12 in the original source) and a modified room corner test originally reported in Finnish in~\cite{Hietaniemi:2001}. English description of the modified test is available in~\cite{Hietaniemi:1}. +The material model for spruce developed using cone calorimeter measurements is evaluated for its prediction of heat release rates in two previous experiments: an ISO~9705 room corner test~\cite{Sundstrom:1998} (test code M12 in the original source) and a modified room corner test originally reported in Finnish in~\cite{Hietaniemi:2001}. An English description of the modified test is available in Ref.~\cite{Hietaniemi:1}. -In a room corner test, the walls and the ceiling of a 2.4~m by 3.6~m by 2.4~m (width, length, height) test compartment are lined with the tested material. The 2.4~m wide front wall has a 0.8~m wide, 2.0~m high door opening in the middle, and the back corner adjacent to the wall opposite to the door has a gas burner with an output of 100~kW for the first ten minutes of the test. If flashover does not occur during this time, the burner heat release is increased to 300~kW for another ten minutes. The test is terminated after 20 minutes or when flashover occurs. +In a room corner test, the walls and ceiling of a 2.4~m by 3.6~m by 2.4~m tall compartment are lined with the sample material. The 2.4~m wide front wall has a 0.8~m wide, 2.0~m high door opening in the middle, and the back corner adjacent to the wall opposite to the door has a gas burner with an output of 100~kW for 10~min. If flashover does not occur during this time, the burner heat release is increased to 300~kW for another 10~min. The test is terminated after 20~min or when flashover occurs. -In the test M12~\cite{Sundstrom:1998} the walls and the ceiling are lined with 10~mm thick spruce timber, whereas in the modified test~\cite{Hietaniemi:2001} the walls and ceiling only in the proximity of the gas burner was lined with 22~mm thick spruce timber, elsewhere being exposed concrete. In both of the studied tests the flashover occurred within the first ten minutes, so the burner heat release was 100~kW over the entire duration of the test. +In the test M12~\cite{Sundstrom:1998}, the walls and the ceiling are lined with 10~mm thick spruce timber, whereas in the modified test~\cite{Hietaniemi:2001} the walls and ceiling only in the proximity of the gas burner were lined with 22~mm thick spruce timber, elsewhere being exposed concrete. In both tests, flashover occurred within the first 10~min. \subsubsection{Modeling Notes} -In the simulations of flaming cone calorimeter experiments, the computational domain is 20~cm in length and width and 30~cm in height, with a grid resolution of 1~cm. For the inert and smoldering experiments the domain is 30~cm by 30~cm by 30~cm with the resolution of 10~cm, as the gaseous phase was not directly modeled. In the simulations of room corner tests, the computational domain continued for 1.5~m outside after the 20~cm thick front wall. In the corner where the burner was located, the grid resolution was 2~cm over a volume that extends for 0.5~m from the corner at x-, and y directions, and spans the entire height from floor to the ceiling. Elsewhere, a resolution of 10~cm was used. +In the simulations of flaming cone calorimeter experiments, the computational domain is 20~cm in length and width and 30~cm in height, with a grid resolution of 1~cm. For the inert and smoldering experiments, the domain is 30~cm by 30~cm by 30~cm with a resolution of 10~cm because the gaseous phase is not directly modeled. In the simulations of room corner tests, the computational domain is extended 1.5~m outside the 20~cm thick front wall. In the corner where the burner is located, the grid resolution is 2~cm over a volume that extends 0.5~m from the corner and spans the entire height from floor to ceiling. Elsewhere, a resolution of 10~cm is used. -Neither~\cite{Sundstrom:1998} nor~\cite{Hietaniemi:2001} reported the initial moisture content of the timbers, so a moisture mass fraction of 0.09 similar to the cone calorimeter specimens in~\cite{Rinta-Paavola:2023}, was assumed in the beginning of room corner tests. This is a relevant moisture content for timber in normal room air. +Neither Ref.~\cite{Sundstrom:1998} nor Ref.~\cite{Hietaniemi:2001} reports the initial moisture content of the timbers; thus, a moisture mass fraction of 0.09 is assumed, similar to the cone calorimeter specimens in Ref.~\cite{Rinta-Paavola:2023}. -The parameters in the original research of Rinta-Paavola et al.~\cite{Rinta-Paavola:2023} were estimated for FDS 6.7.7, but in FDS 6.7.8 and later the reaction rate equation for solid pyrolysis is different, possibly requiring scaling of the pre-exponential factor when parameters are carried from a FDS version with the old reaction rate definition to a newer one. See~\cite{Rinta-Paavola:2023} for greater detail. Table~\ref{Aalto_Woods_Properties} presents appropriately scaled parameters that yield results consistent to the original simulations in~\cite{Rinta-Paavola:2023} when initial moisture mass fraction is 0.09. If a different initial moisture content is used, re-scaling of the frequency factor would be necessary to gain most accurate possible agreement with the model presented in~\cite{Rinta-Paavola:2023}. +The parameters in the original research of Rinta-Paavola~et~al.~\cite{Rinta-Paavola:2023} were estimated for FDS 6.7.7, but in FDS 6.7.8 and later the reaction rate equation for solid pyrolysis is different, possibly requiring scaling of the pre-exponential factor when parameters are carried from a FDS version with the old reaction rate definition to a newer one. See Ref.~\cite{Rinta-Paavola:2023} for details. Table~\ref{Aalto_Woods_Properties} presents appropriately scaled parameters that yield results consistent with the original simulations in Ref.~\cite{Rinta-Paavola:2023} when the initial moisture mass fraction is 0.09. If a different initial moisture content is used, re-scaling of the frequency factor would be necessary to obtain the most accurate possible agreement with the model presented in Ref.~\cite{Rinta-Paavola:2023}. \section{ArupFire Tunnel Fire Experiments} diff --git a/Utilities/Python/FDS_validation_script.py b/Utilities/Python/FDS_validation_script.py index cb8bd5396c..e89d08acd5 100644 --- a/Utilities/Python/FDS_validation_script.py +++ b/Utilities/Python/FDS_validation_script.py @@ -1,29 +1,38 @@ #!$FIREMODELS/fds/.github/fds_python_env/bin/python +import subprocess import fdsplotlib import importlib import runpy importlib.reload(fdsplotlib) # use for development (while making changes to fdsplotlib.py) +# If there is an error in one of the sub-scripts, print the message but do not stop the main script. + +def safe_run(script_path): + try: + runpy.run_path(script_path, run_name="__main__") + except Exception as exc: + print(f"Error in {script_path}: {exc}") + # Scripts to run prior to dataplot -print("NIST_deposition_gauge..."); runpy.run_path("./scripts/NIST_deposition_gauge.py", run_name="__main__") -print("flame_height..."); runpy.run_path("./scripts/flame_height.py", run_name="__main__") -print("NIST_RSE..."); runpy.run_path("./scripts/NIST_RSE.py", run_name="__main__") -print("sippola_aerosol_deposition..."); runpy.run_path("./scripts/sippola_aerosol_deposition.py", run_name="__main__") -print("layer_height..."); runpy.run_path("./scripts/layer_height.py", run_name="__main__") -print("NIST_NRC_Corner_Effects..."); runpy.run_path("./scripts/NIST_NRC_Corner_Effects.py", run_name="__main__") -print("LNG_Dispersion..."); runpy.run_path("./scripts/LNG_Dispersion.py", run_name="__main__") -print("LNG_wind_profiles..."); runpy.run_path("./scripts/LNG_wind_profiles.py", run_name="__main__") -print("FM_Vertical_Wall_Flames..."); runpy.run_path("./scripts/FM_Vertical_Wall_Flames.py", run_name="__main__") -print("umd_line_burner_process..."); runpy.run_path("./scripts/umd_line_burner_process.py", run_name="__main__") -# print("Askervein_Hill..."); runpy.run_path("./scripts/Askervein_Hill.py", run_name="__main__") -print("UWO_Wind_Tunnel..."); runpy.run_path("./scripts/UWO_Wind_Tunnel.py", run_name="__main__") -print("FM_Burner..."); runpy.run_path("./scripts/FM_Burner.py", run_name="__main__") -print("Crown_Fires..."); runpy.run_path("./scripts/Crown_Fires.py", run_name="__main__") -print("Ranz_Marshall..."); runpy.run_path("./scripts/Ranz_Marshall.py", run_name="__main__") -print("Phoenix_LNG_Fires..."); runpy.run_path("./scripts/Phoenix_LNG_Fires.py", run_name="__main__") -print("Sandia_Plumes_TKE..."); runpy.run_path("./scripts/Sandia_Plumes_TKE.py", run_name="__main__") +print("NIST_deposition_gauge..."); safe_run("./scripts/NIST_deposition_gauge.py") +print("flame_height..."); safe_run("./scripts/flame_height.py") +print("NIST_RSE..."); safe_run("./scripts/NIST_RSE.py") +print("sippola_aerosol_deposition..."); safe_run("./scripts/sippola_aerosol_deposition.py") +print("layer_height..."); safe_run("./scripts/layer_height.py") +print("NIST_NRC_Corner_Effects..."); safe_run("./scripts/NIST_NRC_Corner_Effects.py") +print("LNG_Dispersion..."); safe_run("./scripts/LNG_Dispersion.py") +print("LNG_wind_profiles..."); safe_run("./scripts/LNG_wind_profiles.py") +print("FM_Vertical_Wall_Flames..."); safe_run("./scripts/FM_Vertical_Wall_Flames.py") +print("umd_line_burner_process..."); safe_run("./scripts/umd_line_burner_process.py") +# print("Askervein_Hill..."); safe_run("./scripts/Askervein_Hill.py") +print("UWO_Wind_Tunnel..."); safe_run("./scripts/UWO_Wind_Tunnel.py") +print("FM_Burner..."); safe_run("./scripts/FM_Burner.py") +print("Crown_Fires..."); safe_run("./scripts/Crown_Fires.py") +print("Ranz_Marshall..."); safe_run("./scripts/Ranz_Marshall.py") +print("Phoenix_LNG_Fires..."); safe_run("./scripts/Phoenix_LNG_Fires.py") +print("Sandia_Plumes_TKE..."); safe_run("./scripts/Sandia_Plumes_TKE.py") # Dataplot and scatplot options @@ -71,27 +80,27 @@ # Create table of git statistics for FDS Validation Guide -print("validation_git_stats..."); runpy.run_path("./scripts/validation_git_stats.py", run_name="__main__") +print("validation_git_stats..."); safe_run("./scripts/validation_git_stats.py") # Special cases -print("Backward_Facing_Step..."); runpy.run_path("./scripts/Backward_Facing_Step.py", run_name="__main__") -print("Beyler_Hood..."); runpy.run_path("./scripts/Beyler_Hood.py", run_name="__main__") -print("BRE_LEMTA_Sprays..."); runpy.run_path("./scripts/BRE_LEMTA_Sprays.py", run_name="__main__") -print("catchpole_spread_rates..."); runpy.run_path("./scripts/catchpole_spread_rates.py", run_name="__main__") -print("FHWA_Tunnel..."); runpy.run_path("./scripts/FHWA_Tunnel.py", run_name="__main__") -print("FM_FPRF_Datacenter..."); runpy.run_path("./scripts/FM_FPRF_Datacenter.py", run_name="__main__") -print("Heskestad_Flame_Height_2..."); runpy.run_path("./scripts/Heskestad_Flame_Height_2.py", run_name="__main__") -print("McCaffrey_Plume..."); runpy.run_path("./scripts/McCaffrey_Plume.py", run_name="__main__") -print("Memorial_Tunnel..."); runpy.run_path("./scripts/Memorial_Tunnel.py", run_name="__main__") -print("Memorial_Tunnel_2..."); runpy.run_path("./scripts/Memorial_Tunnel_2.py", run_name="__main__") -print("NIST_NRC_Parallel_Panels..."); runpy.run_path("./scripts/NIST_NRC_Parallel_Panels.py", run_name="__main__") -print("Sandia_Plumes..."); runpy.run_path("./scripts/Sandia_Plumes.py", run_name="__main__") -print("Sandia_Pools..."); runpy.run_path("./scripts/Sandia_Pools.py", run_name="__main__") -print("Theobald_Hose_Stream..."); runpy.run_path("./scripts/Theobald_Hose_Stream.py", run_name="__main__") -print("TUS_Facade..."); runpy.run_path("./scripts/TUS_Facade_contours.py", run_name="__main__") -print("USFS_Deep_Fuel_Beds..."); runpy.run_path("./scripts/USFS_Deep_Fuel_Beds.py", run_name="__main__") -print("Wu_Bakar_Tunnels..."); runpy.run_path("./scripts/Wu_Bakar_Tunnels.py", run_name="__main__") +print("Backward_Facing_Step..."); safe_run("./scripts/Backward_Facing_Step.py") +print("Beyler_Hood..."); safe_run("./scripts/Beyler_Hood.py") +print("BRE_LEMTA_Sprays..."); safe_run("./scripts/BRE_LEMTA_Sprays.py") +print("catchpole_spread_rates..."); safe_run("./scripts/catchpole_spread_rates.py") +print("FHWA_Tunnel..."); safe_run("./scripts/FHWA_Tunnel.py") +print("FM_FPRF_Datacenter..."); safe_run("./scripts/FM_FPRF_Datacenter.py") +print("Heskestad_Flame_Height_2..."); safe_run("./scripts/Heskestad_Flame_Height_2.py") +print("McCaffrey_Plume..."); safe_run("./scripts/McCaffrey_Plume.py") +print("Memorial_Tunnel..."); safe_run("./scripts/Memorial_Tunnel.py") +print("Memorial_Tunnel_2..."); safe_run("./scripts/Memorial_Tunnel_2.py") +print("NIST_NRC_Parallel_Panels..."); safe_run("./scripts/NIST_NRC_Parallel_Panels.py") +print("Sandia_Plumes..."); safe_run("./scripts/Sandia_Plumes.py") +print("Sandia_Pools..."); safe_run("./scripts/Sandia_Pools.py") +print("Theobald_Hose_Stream..."); safe_run("./scripts/Theobald_Hose_Stream.py") +print("TUS_Facade..."); safe_run("./scripts/TUS_Facade_contours.py") +print("USFS_Deep_Fuel_Beds..."); safe_run("./scripts/USFS_Deep_Fuel_Beds.py") +print("Wu_Bakar_Tunnels..."); safe_run("./scripts/Wu_Bakar_Tunnels.py") print("Python validation scripts completed successfully!") diff --git a/Utilities/Python/FDS_verification_script.py b/Utilities/Python/FDS_verification_script.py index 05b8444baf..3f2d397a88 100644 --- a/Utilities/Python/FDS_verification_script.py +++ b/Utilities/Python/FDS_verification_script.py @@ -8,20 +8,29 @@ import importlib importlib.reload(fdsplotlib) # use for development (while making changes to fdsplotlib.py) print("Using:", fdsplotlib.__file__) + +# If there is an error in one of the sub-scripts, print the message but do not stop the main script. + +def safe_run(script_path): + try: + runpy.run_path(script_path, run_name="__main__") + except Exception as exc: + print(f"Error in {script_path}: {exc}") + # Scripts to run prior to dataplot -print("ashrae_7..."); runpy.run_path("./scripts/ashrae_7.py", run_name="__main__") -print('burke_schumann...'); runpy.run_path("./scripts/burke_schumann.py", run_name="__main__") -print('cat_propane_depo...'); runpy.run_path("./scripts/cat_propane_depo.py", run_name="__main__") -print('convective_cooling_convergence...'); runpy.run_path("./scripts/convective_cooling_convergence.py", run_name="__main__") -print('flame_species...'); runpy.run_path("./scripts/flame_species.py", run_name="__main__") -print("ns2d..."); runpy.run_path("./scripts/ns2d.py", run_name="__main__") -print("radiation_box..."); runpy.run_path("./scripts/radiation_box.py", run_name="__main__") -print("radiation_plane_layer..."); runpy.run_path("./scripts/radiation_plane_layer.py", run_name="__main__") -print("random_walk_soln..."); runpy.run_path("./scripts/random_walk_soln.py", run_name="__main__") -print('rms_cov_corr...'); runpy.run_path("./scripts/rms_cov_corr.py", run_name="__main__") -print('vegetation_absorb...'); runpy.run_path("./scripts/vegetation_absorb.py", run_name="__main__") -print('water_evap_1_const_gamma...'); runpy.run_path("./scripts/water_evap_1_const_gamma.py", run_name="__main__") +print("ashrae_7..."); safe_run("./scripts/ashrae_7.py") +print('burke_schumann...'); safe_run("./scripts/burke_schumann.py") +print('cat_propane_depo...'); safe_run("./scripts/cat_propane_depo.py") +print('convective_cooling_convergence...'); safe_run("./scripts/convective_cooling_convergence.py") +print('flame_species...'); safe_run("./scripts/flame_species.py") +print("ns2d..."); safe_run("./scripts/ns2d.py") +print("radiation_box..."); safe_run("./scripts/radiation_box.py") +print("radiation_plane_layer..."); safe_run("./scripts/radiation_plane_layer.py") +print("random_walk_soln..."); safe_run("./scripts/random_walk_soln.py") +print('rms_cov_corr...'); safe_run("./scripts/rms_cov_corr.py") +print('vegetation_absorb...'); safe_run("./scripts/vegetation_absorb.py") +print('water_evap_1_const_gamma...'); safe_run("./scripts/water_evap_1_const_gamma.py") # Dataplot and scatplot options @@ -67,54 +76,54 @@ # Special cases -print("atmospheric_boundary_layer..."); runpy.run_path("./scripts/atmospheric_boundary_layer.py", run_name="__main__") -print("blasius..."); runpy.run_path("./scripts/blasius.py", run_name="__main__") -print('compression_wave...'); runpy.run_path("./scripts/compression_wave.py", run_name="__main__") -print('extinction...'); runpy.run_path("./scripts/extinction.py", run_name="__main__") -print("fan_curve..."); runpy.run_path("./scripts/fan_curve.py", run_name="__main__") -print("favre_test..."); runpy.run_path("./scripts/favre_test.py", run_name="__main__") -print("fds_moody_chart..."); runpy.run_path("./scripts/fds_moody_chart.py", run_name="__main__") -print("fds_timing_stats..."); runpy.run_path("./scripts/fds_timing_stats.py", run_name="__main__") -print("fluid_part..."); runpy.run_path("./scripts/fluid_part.py", run_name="__main__") -print("freecon_sphere..."); runpy.run_path("./scripts/freecon_sphere.py", run_name="__main__") -print("geom_channel_test..."); runpy.run_path("./scripts/geom_channel_test.py", run_name="__main__") -print("geom_positive_errors..."); runpy.run_path("./scripts/geom_positive_errors.py", run_name="__main__") -print("heated_channel..."); runpy.run_path("./scripts/heated_channel.py", run_name="__main__") -print('hot_layer_collapse...'); runpy.run_path("./scripts/hot_layer_collapse.py", run_name="__main__") -print("ht3d_sphere..."); runpy.run_path("./scripts/ht3d_sphere.py", run_name="__main__") -print('hvac_mass_transport...'); runpy.run_path("./scripts/hvac_mass_transport.py", run_name="__main__") -print("jet_decay..."); runpy.run_path("./scripts/jet_decay.py", run_name="__main__") -print("law_of_the_wall..."); runpy.run_path("./scripts/law_of_the_wall.py", run_name="__main__") -print("level_set_ellipse..."); runpy.run_path("./scripts/level_set_ellipse.py", run_name="__main__") -print("mesh_transformation..."); runpy.run_path("./scripts/mesh_transformation.py", run_name="__main__") -print("make_smv_images..."); runpy.run_path("./scripts/make_smv_images.py", run_name="__main__") -print("mass_balance..."); runpy.run_path("./scripts/mass_balance.py", run_name="__main__") -print("mass_balance_gas_volume..."); runpy.run_path("./scripts/mass_balance_gas_volume.py", run_name="__main__") -print("mass_balance_reac..."); runpy.run_path("./scripts/mass_balance_reac.py", run_name="__main__") -print("natconh..."); runpy.run_path("./scripts/natconh.py", run_name="__main__") -print("natconv..."); runpy.run_path("./scripts/natconv.py", run_name="__main__") -print("openmp_timing_benchmarks..."); runpy.run_path("./scripts/openmp_timing_benchmarks.py", run_name="__main__") -print("particle_size_distribution..."); runpy.run_path("./scripts/particle_size_distribution.py", run_name="__main__") -print("plate_view_factor..."); runpy.run_path("./scripts/plate_view_factor.py", run_name="__main__") -print("pulsating..."); runpy.run_path("./scripts/pulsating.py", run_name="__main__") -print("pyrolysis..."); runpy.run_path("./scripts/pyrolysis.py", run_name="__main__") -print('radiating_polygon...'); runpy.run_path("./scripts/radiating_polygon.py", run_name="__main__") -print("ribbed_channel..."); runpy.run_path("./scripts/ribbed_channel.py", run_name="__main__") -print('rotcube_cc_mms_error...'); runpy.run_path("./scripts/rotcube_cc_mms_error.py", run_name="__main__") -print("saad_mms..."); runpy.run_path("./scripts/saad_mms_temporal_error.py", run_name="__main__") -print("scaling_tests..."); runpy.run_path("./scripts/scaling_tests.py", run_name="__main__") -print("shunn_mms..."); runpy.run_path("./scripts/shunn_mms.py", run_name="__main__") -print("soborot_mass_transport..."); runpy.run_path("./scripts/soborot_mass_transport.py", run_name="__main__") -print("synthetic_eddy_method..."); runpy.run_path("./scripts/synthetic_eddy_method.py", run_name="__main__") -print("terminal_velocity_convergence..."); runpy.run_path("./scripts/terminal_velocity_convergence.py", run_name="__main__") -print("tree_shapes..."); runpy.run_path("./scripts/tree_shapes.py", run_name="__main__") -print("turb_model..."); runpy.run_path("./scripts/turb_model.py", run_name="__main__") -print("vort2d..."); runpy.run_path("./scripts/vort2d.py", run_name="__main__") -print("wall_internal_radiation..."); runpy.run_path("./scripts/wall_internal_radiation.py", run_name="__main__") -print("yplus..."); runpy.run_path("./scripts/yplus.py", run_name="__main__") -print('impinging_jet...'); runpy.run_path("./scripts/impinging_jet.py", run_name="__main__") -print('htc_forced...'); runpy.run_path("./scripts/htc_forced.py", run_name="__main__") -print('nat_conv_hot_plate...'); runpy.run_path("./scripts/nat_conv_hot_plate.py", run_name="__main__") +print("atmospheric_boundary_layer..."); safe_run("./scripts/atmospheric_boundary_layer.py") +print("blasius..."); safe_run("./scripts/blasius.py") +print('compression_wave...'); safe_run("./scripts/compression_wave.py") +print('extinction...'); safe_run("./scripts/extinction.py") +print("fan_curve..."); safe_run("./scripts/fan_curve.py") +print("favre_test..."); safe_run("./scripts/favre_test.py") +print("fds_moody_chart..."); safe_run("./scripts/fds_moody_chart.py") +print("fds_timing_stats..."); safe_run("./scripts/fds_timing_stats.py") +print("fluid_part..."); safe_run("./scripts/fluid_part.py") +print("freecon_sphere..."); safe_run("./scripts/freecon_sphere.py") +print("geom_channel_test..."); safe_run("./scripts/geom_channel_test.py") +print("geom_positive_errors..."); safe_run("./scripts/geom_positive_errors.py") +print("heated_channel..."); safe_run("./scripts/heated_channel.py") +print('hot_layer_collapse...'); safe_run("./scripts/hot_layer_collapse.py") +print("ht3d_sphere..."); safe_run("./scripts/ht3d_sphere.py") +print('hvac_mass_transport...'); safe_run("./scripts/hvac_mass_transport.py") +print("jet_decay..."); safe_run("./scripts/jet_decay.py") +print("law_of_the_wall..."); safe_run("./scripts/law_of_the_wall.py") +print("level_set_ellipse..."); safe_run("./scripts/level_set_ellipse.py") +print("mesh_transformation..."); safe_run("./scripts/mesh_transformation.py") +print("make_smv_images..."); safe_run("./scripts/make_smv_images.py") +print("mass_balance..."); safe_run("./scripts/mass_balance.py") +print("mass_balance_gas_volume..."); safe_run("./scripts/mass_balance_gas_volume.py") +print("mass_balance_reac..."); safe_run("./scripts/mass_balance_reac.py") +print("natconh..."); safe_run("./scripts/natconh.py") +print("natconv..."); safe_run("./scripts/natconv.py") +print("openmp_timing_benchmarks..."); safe_run("./scripts/openmp_timing_benchmarks.py") +print("particle_size_distribution..."); safe_run("./scripts/particle_size_distribution.py") +print("plate_view_factor..."); safe_run("./scripts/plate_view_factor.py") +print("pulsating..."); safe_run("./scripts/pulsating.py") +print("pyrolysis..."); safe_run("./scripts/pyrolysis.py") +print('radiating_polygon...'); safe_run("./scripts/radiating_polygon.py") +print("ribbed_channel..."); safe_run("./scripts/ribbed_channel.py") +print('rotcube_cc_mms_error...'); safe_run("./scripts/rotcube_cc_mms_error.py") +print("saad_mms..."); safe_run("./scripts/saad_mms_temporal_error.py") +print("scaling_tests..."); safe_run("./scripts/scaling_tests.py") +print("shunn_mms..."); safe_run("./scripts/shunn_mms.py") +print("soborot_mass_transport..."); safe_run("./scripts/soborot_mass_transport.py") +print("synthetic_eddy_method..."); safe_run("./scripts/synthetic_eddy_method.py") +print("terminal_velocity_convergence..."); safe_run("./scripts/terminal_velocity_convergence.py") +print("tree_shapes..."); safe_run("./scripts/tree_shapes.py") +print("turb_model..."); safe_run("./scripts/turb_model.py") +print("vort2d..."); safe_run("./scripts/vort2d.py") +print("wall_internal_radiation..."); safe_run("./scripts/wall_internal_radiation.py") +print("yplus..."); safe_run("./scripts/yplus.py") +print('impinging_jet...'); safe_run("./scripts/impinging_jet.py") +print('htc_forced...'); safe_run("./scripts/htc_forced.py") +print('nat_conv_hot_plate...'); safe_run("./scripts/nat_conv_hot_plate.py") print("verification scripts completed successfully!") diff --git a/Utilities/Python/scripts/Backward_Facing_Step.py b/Utilities/Python/scripts/Backward_Facing_Step.py index 80ab2fafa3..d7ab2abe4e 100644 --- a/Utilities/Python/scripts/Backward_Facing_Step.py +++ b/Utilities/Python/scripts/Backward_Facing_Step.py @@ -74,14 +74,12 @@ def tight_subplot(Nh, Nw, gap=(0.01, 0.01), marg_h=(0.13, 0.08), marg_w=(0.11, 0 exp_file = os.path.join(expdir, 'backward_facing_step_data.csv') if not os.path.exists(exp_file): print(f'Error: File {exp_file} does not exist. Skipping case.') - quit() data_files = [] for n in nx: dat_file = os.path.join(datdir, f'backward_facing_step_{n}_line.csv') if not os.path.exists(dat_file): print(f'Error: File {dat_file} does not exist. Skipping case.') - quit() data_files.append(dat_file) # --- Read Experimental and FDS Data --- diff --git a/Utilities/Python/scripts/ashrae_7.py b/Utilities/Python/scripts/ashrae_7.py index 7946d04d46..6e6ef3a926 100644 --- a/Utilities/Python/scripts/ashrae_7.py +++ b/Utilities/Python/scripts/ashrae_7.py @@ -27,16 +27,11 @@ pressure = np.zeros((4, 8)) -skip_case = False - for i in range(len(filename)): name = datadir+filename[i] if not os.path.exists(name): - skip_case = True print('Error: File ', filename[i], ' does not exist. Skipping case.') -if skip_case: quit() - M = pd.read_csv(datadir+filename[0],skiprows=6,header=None) for n in range(1, len(filename)): diff --git a/Utilities/Python/scripts/burke_schumann.py b/Utilities/Python/scripts/burke_schumann.py index 2f048ef5fa..e7c76d7d22 100644 --- a/Utilities/Python/scripts/burke_schumann.py +++ b/Utilities/Python/scripts/burke_schumann.py @@ -15,14 +15,9 @@ base_dir = '../../Verification/Species/' input_file_name = 'burke_schumann_devc.csv' -skip_case = False - if not os.path.exists(base_dir+input_file_name): - skip_case = True print('Error: File ', input_file_name, ' does not exist. Skipping case.') -if skip_case: quit() - df = pd.read_csv(base_dir+input_file_name, skiprows=2, header=None) burke = df.values diff --git a/Utilities/Python/scripts/cat_propane_depo.py b/Utilities/Python/scripts/cat_propane_depo.py index b9e44342bb..1b6a03cc2e 100644 --- a/Utilities/Python/scripts/cat_propane_depo.py +++ b/Utilities/Python/scripts/cat_propane_depo.py @@ -26,16 +26,11 @@ 'depo_turbulent' ] -skip_case = False - for i in range(len(wall_files)): name = outdir+wall_files[i] if not os.path.exists(name): - skip_case = True print('Error: File ', wall_files[i], ' does not exist. Skipping case.') -if skip_case: quit() - # Read data from the wall deposition files wall_data = {} for i, file in enumerate(wall_files): @@ -91,11 +86,8 @@ for i in range(len(gas_files)): name = outdir+gas_files[i] if not os.path.exists(name): - skip_case = True print('Error: File ', gas_files[i], ' does not exist. Skipping case.') -if skip_case: quit() - # Read data from the gas mass files gas_data = {} for i, file in enumerate(gas_files): diff --git a/Utilities/Python/scripts/flame_species.py b/Utilities/Python/scripts/flame_species.py index cd882e80dd..6beeff0bf8 100644 --- a/Utilities/Python/scripts/flame_species.py +++ b/Utilities/Python/scripts/flame_species.py @@ -25,16 +25,11 @@ 'methane_flame_lumped_ox_devc.csv', ] -skip_case = False - for i in range(len(filename)): name = outdir+filename[i] if not os.path.exists(name): - skip_case = True print('Error: File ', filename[i], ' does not exist. Skipping case.') -if skip_case: quit() - h_mf_p = pd.read_csv(outdir+filename[0],skiprows=1,nrows=1,header=None) h_mf_p_2 = pd.read_csv(outdir+filename[1],skiprows=1,nrows=1,header=None) h_mf_l = pd.read_csv(outdir+filename[2],skiprows=1,nrows=1,header=None) diff --git a/Utilities/Python/scripts/hot_layer_collapse.py b/Utilities/Python/scripts/hot_layer_collapse.py index 586bcdaae3..5bb927bc06 100644 --- a/Utilities/Python/scripts/hot_layer_collapse.py +++ b/Utilities/Python/scripts/hot_layer_collapse.py @@ -20,15 +20,10 @@ filename = 'hot_layer_360_devc.csv' git_file = datadir+ 'hot_layer_360_git.txt' -skip_case = False - name = datadir+filename if not os.path.exists(name): - skip_case = True print('Error: File ', filename, ' does not exist. Skipping case.') -if skip_case: quit() - error_tolerance = 0.01 L = 2.0 # height of domain 2*d where d is the layer depth at t=0 @@ -313,4 +308,4 @@ def Y(lambda_in, tau_in, T_h_in, T_0_in): Error_V2 = np.linalg.norm(W_nondim_err - V_analytic_at_FDS_pos) / (np.max(np.abs(W_nondim_err)) * len(W_nondim_err)) if Error_V2 > error_tolerance: - print(f"Python Warning: hot_layer_360.fds Vel_2 Error = {Error_V2:.4e}") \ No newline at end of file + print(f"Python Warning: hot_layer_360.fds Vel_2 Error = {Error_V2:.4e}") diff --git a/Utilities/Python/scripts/hvac_mass_transport.py b/Utilities/Python/scripts/hvac_mass_transport.py index 43bb165a9e..d6961f0111 100644 --- a/Utilities/Python/scripts/hvac_mass_transport.py +++ b/Utilities/Python/scripts/hvac_mass_transport.py @@ -33,16 +33,11 @@ u = 1.0 L = 1.0 -skip_case = False - for i in range(len(filename)): name = datadir+filename[i] if not os.path.exists(name): - skip_case = True print('Error: File ', filename[i], ' does not exist. Skipping case.') -if skip_case: quit() - # --- Analytical Solution --- # Analytical solution (using a lambda function which is similar to MATLAB's Anonymous Function) diff --git a/Utilities/Python/scripts/natconh.py b/Utilities/Python/scripts/natconh.py index 2256c22339..6e4a52e48d 100644 --- a/Utilities/Python/scripts/natconh.py +++ b/Utilities/Python/scripts/natconh.py @@ -68,25 +68,19 @@ # Check for files -skip_case = False for i in range(len(casename)): for j in range(len(res)): devc_filepath = os.path.join(results_dir, f"{casename[i]}_{res[j]}_devc.csv") if not os.path.exists(devc_filepath): - skip_case = True print('Error: File ', devc_filepath, ' does not exist. Skipping case.') line_filepath = os.path.join(results_dir, f"{casename[i]}_{res[j]}_line.csv") if not os.path.exists(line_filepath): - skip_case = True print('Error: File ', line_filepath, ' does not exist. Skipping case.') for j in range(len(res_cg)): devc_filepath = os.path.join(results_dir, f"{casename[i]}_{res_cg[j]}_rot_18_devc.csv") if not os.path.exists(devc_filepath): - skip_case = True print('Error: File ', devc_filepath, ' does not exist. Skipping case.') -if skip_case: quit() - r0 = [] r1 = [] r2 = [] diff --git a/Utilities/Python/scripts/natconv.py b/Utilities/Python/scripts/natconv.py index 65d8b06781..21c3c13db6 100644 --- a/Utilities/Python/scripts/natconv.py +++ b/Utilities/Python/scripts/natconv.py @@ -41,26 +41,19 @@ # Check for files -skip_case = False - for i in range(len(casename)): for j in range(len(res)): devc_filepath = os.path.join(results_dir, f"{casename[i]}_{res[j]}_devc.csv") if not os.path.exists(devc_filepath): - skip_case = True print('Error: File ', devc_filepath, ' does not exist. Skipping case.') line_filepath = os.path.join(results_dir, f"{casename[i]}_{res[j]}_line.csv") if not os.path.exists(line_filepath): - skip_case = True print('Error: File ', line_filepath, ' does not exist. Skipping case.') for j in range(len(res_cg)): devc_filepath = os.path.join(results_dir, f"{casename[i]}_{res_cg[j]}_rot_18_devc.csv") if not os.path.exists(devc_filepath): - skip_case = True print('Error: File ', devc_filepath, ' does not exist. Skipping case.') -if skip_case: quit() - g = 9.80665 S = np.array([0.002,0.02,0.02,0.02,0.02,0.2,0.2,0.2,0.2,2,2,2,2,20,20,20,20]) T1 = np.array([303.15,295.15,303.15,333.15,503.15,295.15,303.15,333.15,503.15,295.15,303.15,333.15,503.15,295.15,303.15,333.15,503.15]) diff --git a/Utilities/Python/scripts/ns2d.py b/Utilities/Python/scripts/ns2d.py index c3c551afeb..b51cdebb7c 100644 --- a/Utilities/Python/scripts/ns2d.py +++ b/Utilities/Python/scripts/ns2d.py @@ -23,17 +23,12 @@ ['ns2d_32_exact.csv','ns2d_32_nupt1_exact.csv'], ['ns2d_64_exact.csv','ns2d_64_nupt1_exact.csv']] -skip_case = False - for i in range(len(infile)): for j in range(len(infile[i])): name = datadir+infile[i][j] if not os.path.exists(name): - skip_case = True print('Error: File ', infile[i][j], ' does not exist. Skipping case.') -if skip_case: quit() - nu = [0.0, 0.1] pi = math.pi x = pi diff --git a/Utilities/Python/scripts/radiating_polygon.py b/Utilities/Python/scripts/radiating_polygon.py index ff38176ad2..bcaca8e77b 100644 --- a/Utilities/Python/scripts/radiating_polygon.py +++ b/Utilities/Python/scripts/radiating_polygon.py @@ -15,16 +15,11 @@ plotdir = '../../Manuals/FDS_Verification_Guide/SCRIPT_FIGURES/' filename = ['radiating_polygon_square_20_line.csv','radiating_polygon_square_40_line.csv','radiating_polygon_square_80_line.csv'] -skip_case = False - for i in range(len(filename)): name = datadir+filename[i] if not os.path.exists(name): - skip_case = True print('Error: File ', filename[i], ' does not exist. Skipping case.') -if skip_case: quit() - flux_20 = pd.read_csv(datadir+filename[0],skiprows=2,header=None) flux_40 = pd.read_csv(datadir+filename[1],skiprows=2,header=None) flux_80 = pd.read_csv(datadir+filename[2],skiprows=2,header=None) diff --git a/Utilities/Python/scripts/rms_cov_corr.py b/Utilities/Python/scripts/rms_cov_corr.py index 6f5cc22799..aa0780764b 100644 --- a/Utilities/Python/scripts/rms_cov_corr.py +++ b/Utilities/Python/scripts/rms_cov_corr.py @@ -16,14 +16,9 @@ plotdir = '../../Manuals/FDS_Verification_Guide/SCRIPT_FIGURES/' filename = datadir + 'rms_cov_corr_devc.csv' -skip_case = False - if not os.path.exists(filename): - skip_case = True print('Error: File ', filename, ' does not exist. Skipping case.') -if skip_case: quit() - df = pd.read_csv(filename, skiprows=2, header=None) start_index = int(500 / 0.02) diff --git a/Utilities/Python/scripts/rotcube_cc_mms_error.py b/Utilities/Python/scripts/rotcube_cc_mms_error.py index eabc1ef8f3..1aaefc8ae3 100644 --- a/Utilities/Python/scripts/rotcube_cc_mms_error.py +++ b/Utilities/Python/scripts/rotcube_cc_mms_error.py @@ -92,7 +92,6 @@ def read_matlab_csv(filepath): # List of dictionaries to replace MATLAB struct 'file' files = [] -skip_case = False for ifile in range(ifile_s - 1, ifile_f): # indices 0, 1, 2 jfile_s = 0 @@ -120,13 +119,10 @@ def read_matlab_csv(filepath): # Check existence and populate files list for name in file_entry['name']: if not os.path.exists(os.path.join(datadir, name)): - skip_case = True print(f"[WARN] File {os.path.join(datadir, name)} does not exist. Skipping case.") files.append(file_entry) -if skip_case: quit() - # --- 4. Compute errors from *_mms.csv files --- for ifile in range(len(files)): diff --git a/Utilities/Python/scripts/saad_mms_temporal_error.py b/Utilities/Python/scripts/saad_mms_temporal_error.py index ee10b6cf3e..17f85cc396 100644 --- a/Utilities/Python/scripts/saad_mms_temporal_error.py +++ b/Utilities/Python/scripts/saad_mms_temporal_error.py @@ -30,16 +30,11 @@ plotdir = '../../Manuals/FDS_Verification_Guide/SCRIPT_FIGURES/'; filename = ['saad_512_cfl_1_mms.csv','saad_512_cfl_p5_mms.csv','saad_512_cfl_p25_mms.csv','saad_512_cfl_p125_mms.csv','saad_512_cfl_p0625_mms.csv'] -skip_case = False - for i in range(len(filename)): name = datadir+filename[i] if not os.path.exists(name): - skip_case = True print('Error: File ', filename[i], ' does not exist. Skipping case.') -if skip_case: quit() - # Gather FDS results M1 = pd.read_csv(datadir+filename[2],skiprows=2,header=None) @@ -172,16 +167,11 @@ datadir = '../../Verification/Complex_Geometry/' filename = ['saad_CC_explicit_512_cfl_p25_mms.csv','saad_CC_explicit_512_cfl_p125_mms.csv','saad_CC_explicit_512_cfl_p0625_mms.csv'] -skip_case = False - for i in range(len(filename)): name = datadir+filename[i] if not os.path.exists(name): - skip_case = True print('Error: File ', filename[i], ' does not exist. Skipping case.') -if skip_case: quit() - M1 = pd.read_csv(datadir+filename[0],skiprows=2,header=None) M2 = pd.read_csv(datadir+filename[1],skiprows=2,header=None) M3 = pd.read_csv(datadir+filename[2],skiprows=2,header=None) diff --git a/Utilities/Python/scripts/shunn_mms.py b/Utilities/Python/scripts/shunn_mms.py index d52652c5cb..073a3236eb 100644 --- a/Utilities/Python/scripts/shunn_mms.py +++ b/Utilities/Python/scripts/shunn_mms.py @@ -25,16 +25,11 @@ 'shunn3_256_cfl_p125_mms.csv', 'shunn3_256_cfl_p0625_mms.csv'] -skip_case = False - for i in range(len(filename)): name = datadir+filename[i] if not os.path.exists(name): - skip_case = True print('Error: File ', filename[i], ' does not exist. Skipping case.') -if skip_case: quit() - M1 = pd.read_csv(datadir+filename[2],skiprows=2,header=None) M2 = pd.read_csv(datadir+filename[3],skiprows=2,header=None) M3 = pd.read_csv(datadir+filename[4],skiprows=2,header=None) @@ -197,16 +192,11 @@ def vd2d_mms_rho(x, y, t): git_file = datadir+'shunn3_FavreZ_32_git.txt' version_string = fdsplotlib.get_version_string(git_file) -skip_case = False - for i in range(len(filename)): name = datadir+filename[i] if not os.path.exists(name): - skip_case = True print('Error: File ', filename[i], ' does not exist. Skipping case.') -if skip_case: quit() - fig = fdsplotlib.plot_to_fig(x_data=[0,T], y_data=[FavreZ_mms,FavreZ_mms], marker_style='k-', revision_label=version_string,x_min=0,x_max=T,y_min=0,y_max=0.2, data_label='Analytical Favre', @@ -295,16 +285,11 @@ def vd2d_mms_p(x,y,t) : datadir = '../../Verification/Scalar_Analytical_Solution/'; filename = ['shunn3_32_mms.csv','shunn3_64_mms.csv','shunn3_128_mms.csv','shunn3_256_mms.csv','shunn3_512_mms.csv'] -skip_case = False - for i in range(len(filename)): name = datadir+filename[i] if not os.path.exists(name): - skip_case = True print('Error: File ', filename[i], ' does not exist. Skipping case.') -if skip_case: quit() - e_r = np.zeros(len(filename)) e_z = np.zeros(len(filename)) e_u = np.zeros(len(filename)) @@ -434,17 +419,12 @@ def vd2d_mms_p(x,y,t) : gitname = ['shunn3_256_cc_exp_chm_git.txt','shunn3_256_cc_exp_gdv_git.txt'] plotname=[ 'shunn_cc_exp_chm_mms_convergence.pdf', 'shunn_cc_exp_gdv_mms_convergence.pdf'] -skip_case = False - for i in range(2): for j in range(len(filename[i])): name = datadir+filename[i][j] if not os.path.exists(name): - skip_case = True print('Error: File ', filename[i][j], ' does not exist. Skipping case.') -if skip_case: quit() - for kk in range(2): for n in range(len(filename[kk])): N = nx[n]**2