case_params_t Derived Type

type, public :: case_params_t

Global container for all parsed simulation parameters.

This structure acts as the source of truth for the entire solver. It is populated once at startup and accessed as a read-only object by the various solver modules.


Components

Type Visibility Attributes Name Initial
real(kind=rk), public :: background_press = 101325.0_rk
real(kind=rk), public :: background_temp = 300.0_rk
real(kind=rk), public :: body_force(3) = zero
character(len=path_len), public :: cantera_mech_file = "gri30.yaml"
character(len=name_len), public :: cantera_phase_name = ""
integer, public :: cantera_reaction_count = 0
character(len=name_len), public :: chemistry_active_species_name(max_species) = ""
real(kind=rk), public :: chemistry_active_species_threshold = zero
real(kind=rk), public :: chemistry_atol = 1.0e-15_rk
real(kind=rk), public :: chemistry_dt_min_factor = 0.1_rk
real(kind=rk), public :: chemistry_dt_safety = 0.5_rk
logical, public :: chemistry_energy_enabled = .true.
logical, public :: chemistry_limit_source_update = .false.
real(kind=rk), public :: chemistry_max_dT_per_step = zero
real(kind=rk), public :: chemistry_max_dY_per_step = zero
real(kind=rk), public :: chemistry_max_rel_rho_change_per_step = zero
integer, public :: chemistry_max_steps = 10000
real(kind=rk), public :: chemistry_min_reactive_mass_fraction = zero
integer, public :: chemistry_n_active_species = 0
real(kind=rk), public :: chemistry_rtol = 1.0e-8_rk
real(kind=rk), public :: chemistry_source_relaxation = one
real(kind=rk), public :: chemistry_temperature_cutoff = zero
integer, public :: chemistry_update_interval = 1

name: Operator-split Cantera chemistry controls

character(len=name_len), public :: convection_scheme = "upwind"
character(len=name_len), public :: density_eos = "constant"
real(kind=rk), public :: dt = zero
real(kind=rk), public :: dt_growth_limit = 1.02_rk
real(kind=rk), public :: dt_old = zero
logical, public :: enable_cantera_fluid = .false.

name: Cantera Bridge Integration

logical, public :: enable_cantera_species = .false.
logical, public :: enable_cantera_thermo = .false.
logical, public :: enable_chemistry_load_balancing = .false.
logical, public :: enable_chemistry_subcycling = .false.

name: Chemistry and Reacting Flow Stability Upgrades

logical, public :: enable_density_corrector_projection = .false.
logical, public :: enable_energy = .false.

name: Enthalpy Energy Equation Controls

logical, public :: enable_ignition_kernel = .false.

name: Ignition-kernel initialization

logical, public :: enable_profiling = .true.

name: Profiling Controls

logical, public :: enable_radiation = .false.

name: Spectral radiation coupling controls

logical, public :: enable_reactions = .false.
logical, public :: enable_species = .false.

name: Multi-Species Transport

logical, public :: enable_species_enthalpy_diffusion = .false.
logical, public :: enable_step_rejection = .false.
logical, public :: enable_variable_density = .false.
logical, public :: enable_variable_nu = .false.
character(len=name_len), public :: energy_convection_scheme = "upwind"
real(kind=rk), public :: energy_cp = 1005.0_rk
real(kind=rk), public :: energy_lambda = 2.6e-2_rk
real(kind=rk), public :: energy_reference_T = 298.15_rk
real(kind=rk), public :: energy_reference_h = zero
character(len=name_len), public :: energy_time_scheme = "euler"
real(kind=rk), public :: ignition_kernel_T = zero
character(len=name_len), public :: ignition_kernel_blend = "overwrite"
real(kind=rk), public :: ignition_kernel_center(3) = zero
character(len=1024), public :: ignition_kernel_composition = ""
real(kind=rk), public :: ignition_kernel_radius = zero
character(len=name_len), public :: ignition_kernel_shape = "sphere"
real(kind=rk), public :: initial_T = 300.0_rk
real(kind=rk), public :: initial_Y(max_species) = 0.0_rk
character(len=1024), public :: initial_composition = ""
real(kind=rk), public :: ke_reject_floor = 1.0e-12_rk
real(kind=rk), public :: max_KE_growth_per_step = 10.0_rk
real(kind=rk), public :: max_cfl = 0.5_rk
real(kind=rk), public :: max_cfl_overshoot_factor = 1.25_rk
integer, public :: max_chemistry_subcycles = 8
real(kind=rk), public :: max_dt = huge(one)
real(kind=rk), public :: max_pressure_residual_limit = 1.0e-2_rk
integer, public :: max_step_retries = 6
real(kind=rk), public :: max_temperature_limit = 3200.0_rk
character(len=path_len), public :: mesh_dir = "mesh_native"
real(kind=rk), public :: min_density_ratio_limit = 0.05_rk
real(kind=rk), public :: min_dt = 1.0e-12_rk
real(kind=rk), public :: min_temperature_limit = 200.0_rk
character(len=name_len), public :: momentum_convection_scheme = ""
integer, public :: n_patches = 0

name: Boundary Condition Mapping

integer, public :: namelist_nspecies = 0

name: Internal Registry (Reacting discovery)

character(len=name_len), public :: namelist_species_name(max_species) = ""
logical, public :: nested_profiling = .true.
integer, public :: nspecies = 0
integer, public :: nsteps = 0

name: Time Stepping

real(kind=rk), public :: nu = 1.0e-2_rk
character(len=path_len), public :: output_dir = "output"

name: Data Output

integer, public :: output_interval = 1
real(kind=rk), public :: patch_T(max_patches) = 300.0_rk
real(kind=rk), public :: patch_Y(max_species,max_patches) = zero
character(len=1024), public :: patch_composition(max_patches) = ""
real(kind=rk), public :: patch_dpdn(max_patches) = zero
real(kind=rk), public :: patch_mass_flux(max_patches) = zero
character(len=name_len), public :: patch_name(max_patches) = ""
real(kind=rk), public :: patch_p(max_patches) = zero
character(len=name_len), public :: patch_pressure_type(max_patches) = ""
character(len=name_len), public :: patch_species_type(max_patches) = ""

Species Boundary Conditions

character(len=name_len), public :: patch_temperature_type(max_patches) = ""
character(len=name_len), public :: patch_type(max_patches) = ""
real(kind=rk), public :: patch_u(max_patches) = zero
real(kind=rk), public :: patch_v(max_patches) = zero
character(len=name_len), public :: patch_velocity_type(max_patches) = ""

Field-specific BC Overrides

real(kind=rk), public :: patch_w(max_patches) = zero

positive magnitude for inlet/outlet_mass_flux.

real(kind=rk), public :: pressure_abs_tol = 1.0e-8_rk
integer, public :: pressure_max_iter = 300

name: Linear Solver & Numerics

real(kind=rk), public :: pressure_tol = 1.0e-10_rk
real(kind=rk), public :: radiation_absorption_coeff = 1.0_rk
logical, public :: radiation_debug = .false.
character(len=name_len), public :: radiation_dom_quadrature = "s2"
real(kind=rk), public :: radiation_emissivity = 1.0_rk
integer, public :: radiation_n_scalars = 0
integer, public :: radiation_n_species = 0
integer, public :: radiation_n_wavenumbers = 0
character(len=name_len), public :: radiation_pressure_source = "background"
character(len=name_len), public :: radiation_scalar_name(max_species) = ""
character(len=name_len), public :: radiation_source_model = "none"
real(kind=rk), public :: radiation_source_scale = 0.0_rk
character(len=name_len), public :: radiation_species_name(max_species) = ""
integer, public :: radiation_update_interval = 1
logical, public :: reject_on_nan = .true.
logical, public :: reject_on_pressure_max_iter = .true.
character(len=path_len), public :: restart_file = ""
logical, public :: restart_from_file = .false.

name: Restart Controls

integer, public :: restart_interval = 0
integer, public :: restart_keep = 0
logical, public :: restart_nsteps_are_additional = .false.
character(len=path_len), public :: restart_output_dir = "restart"
logical, public :: restart_use_file_dt = .false.
real(kind=rk), public :: rho = one

name: Fluid Properties

character(len=name_len), public :: scalar_limiter = "barth_jespersen"
character(len=name_len), public :: species_convection_scheme = "upwind"
real(kind=rk), public :: species_diffusivity(max_species) = 0.0_rk
character(len=name_len), public :: species_name(max_species) = ""
character(len=name_len), public :: species_time_scheme = "euler"
real(kind=rk), public :: step_reject_cut_factor = 0.5_rk
real(kind=rk), public :: step_reject_min_dt = 1.0e-12_rk
logical, public :: stop_on_min_dt_failure = .true.
real(kind=rk), public :: subcycling_dT_threshold = 10.0_rk
character(len=name_len), public :: terminal_detail = "health"
integer, public :: terminal_interval = 1
character(len=name_len), public :: thermo_default_species = 'N2'
integer, public :: thermo_update_interval = 1
integer, public :: transport_update_interval = 1
logical, public :: upwind_dilatation_density = .false.
logical, public :: use_dynamic_dt = .false.
logical, public :: variable_density_debug = .false.
integer, public :: variable_density_debug_interval = 1
character(len=name_len), public :: vtu_format = "ascii"
logical, public :: write_cantera_cache_stats = .false.
logical, public :: write_chemistry_screening_stats = .false.
logical, public :: write_diagnostics = .true.
logical, public :: write_radiation_diagnostics = .true.
logical, public :: write_restart = .false.
logical, public :: write_vtu = .true.

Source Code

   type, public :: case_params_t
      !> @name Mesh Configuration
      character(len=path_len) :: mesh_dir = "mesh_native" !< Directory containing `points.dat`, `cells.dat`, etc.

      !> @name Time Stepping
      integer :: nsteps = 0              !< Total number of timesteps to execute.
      real(rk) :: dt = zero              !< Fixed timestep size [s].
      real(rk) :: dt_old = zero          !< Timestep size used in the previous step [s].
      integer :: output_interval = 1     !< Frequency of VTK/PVD output (in steps).
      integer :: terminal_interval = 1   !< Frequency of lightweight terminal status updates (in steps).
      character(len=name_len) :: terminal_detail = "health" !< Terminal verbosity: brief, health, or full.
      logical :: use_dynamic_dt = .false.!< If true, `dt` scales to maintain target `max_cfl`.
      real(rk) :: max_cfl = 0.5_rk       !< Target maximum CFL number for stability.
      real(rk) :: max_dt = huge(one)     !< Absolute timestep ceiling for dynamic dt [s]; huge disables.
      real(rk) :: min_dt = 1.0e-12_rk    !< Absolute timestep floor for automatic dt cuts [s].
      real(rk) :: dt_growth_limit = 1.02_rk !< Per-step dynamic-dt growth factor ceiling.
      logical :: enable_step_rejection = .false. !< If true, reject and retry a timestep when health checks fail.
      integer :: max_step_retries = 6 !< Maximum rejected attempts for a single timestep.
      real(rk) :: step_reject_cut_factor = 0.5_rk !< Multiplicative dt cut applied after a rejected trial step.
      real(rk) :: step_reject_min_dt = 1.0e-12_rk !< Absolute lower bound for rejection retries [s].
      real(rk) :: max_KE_growth_per_step = 10.0_rk !< Reject if KE grows by more than this factor; <=0 disables.
      real(rk) :: ke_reject_floor = 1.0e-12_rk !< Do not apply relative KE-growth rejection when KE before the step is below this floor.
      real(rk) :: max_cfl_overshoot_factor = 1.25_rk !< Reject if post-step CFL exceeds factor*max_cfl; <=0 disables.
      logical :: reject_on_pressure_max_iter = .true. !< Reject if the pressure solve reaches pressure_max_iter.
      logical :: stop_on_min_dt_failure = .true. !< Stop if a rejected step can no longer reduce dt.

      !> @name Fluid Properties
      real(rk) :: rho = one              !< Constant active flow/projection density [kg/m^3] when `enable_variable_density=.false.`.
      logical :: enable_variable_density = .false. !< Enable experimental variable-density low-Mach coupling.
      logical :: enable_density_corrector_projection = .false. !< Post-chemistry pressure-only projection to re-enforce div(u)=S after density change.
      logical :: upwind_dilatation_density = .false. !< Use upwind density in the advective divergence source calculation.
      character(len=name_len) :: density_eos = "constant" !< Density source selector; `cantera` uses the selected YAML phase density.
      real(rk) :: nu = 1.0e-2_rk         !< Constant kinematic viscosity [m^2/s].
      logical :: enable_variable_nu = .false.    !< Allow Cantera-updated flow viscosity/nu; default keeps validation Re fixed.
      integer :: transport_update_interval = 1 !< Cantera transport-property update interval for mu/D_k only [steps].

      !> @name Linear Solver & Numerics
      integer :: pressure_max_iter = 300 !< Maximum Conjugate Gradient iterations for the Poisson solver.
      real(rk) :: pressure_tol = 1.0e-10_rk !< Relative residual tolerance for pressure convergence.
      real(rk) :: pressure_abs_tol = 1.0e-8_rk !< Absolute RMS residual tolerance; PCG exits when either criterion is met.
      real(rk) :: body_force(3) = zero   !< Constant volumetric acceleration vector \((a_x, a_y, a_z)\) [m/s^2].
      character(len=name_len) :: convection_scheme = "upwind" !< Legacy momentum advection selector: "upwind" or "central".
      character(len=name_len) :: momentum_convection_scheme = "" !< Optional momentum-specific scheme; blank falls back to convection_scheme.
      character(len=name_len) :: species_convection_scheme = "upwind" !< Species advection: upwind, central, bounded_central, bounded_linear, muscl, limited_linear.
      character(len=name_len) :: energy_convection_scheme = "upwind" !< Enthalpy advection: upwind, central, bounded_central, bounded_linear, muscl, limited_linear.
      character(len=name_len) :: scalar_limiter = "barth_jespersen" !< Local-bounds limiter for high-order scalar reconstruction.
      character(len=name_len) :: species_time_scheme = "euler" !< Species transport time scheme: euler or ab2.
      character(len=name_len) :: energy_time_scheme = "euler" !< Enthalpy transport time scheme: euler or ab2.

      !> @name Boundary Condition Mapping
      integer :: n_patches = 0           !< Total number of patches defined in the namelist.
      character(len=name_len) :: patch_name(max_patches) = "" !< Names identifying mesh patches.
      character(len=name_len) :: patch_type(max_patches) = "" !< Legacy BC type string.

      !> Field-specific BC Overrides
      character(len=name_len) :: patch_velocity_type(max_patches) = "" !< Override BC type for velocity.
      character(len=name_len) :: patch_pressure_type(max_patches) = "" !< Override BC type for pressure.
      character(len=name_len) :: patch_temperature_type(max_patches) = "" !< Override BC type for temperature/enthalpy.

      real(rk) :: patch_u(max_patches) = zero    !< Specified x-velocity on patch [m/s].
      real(rk) :: patch_v(max_patches) = zero    !< Specified y-velocity on patch [m/s].
      real(rk) :: patch_w(max_patches) = zero    !< Specified z-velocity on patch [m/s].
      !< Mass flux input [kg/m^2/s]. Signed for mass_flux;
      !! positive magnitude for inlet/outlet_mass_flux.
      real(rk) :: patch_mass_flux(max_patches) = zero
      real(rk) :: patch_p(max_patches) = zero    !< Specified projection-pressure boundary value [Pa], not Cantera \(p_0\).
      real(rk) :: patch_dpdn(max_patches) = zero !< Specified pressure gradient on patch [Pa/m].
      real(rk) :: patch_T(max_patches) = 300.0_rk !< Specified temperature on patch [K].

      !> Species Boundary Conditions
      character(len=name_len) :: patch_species_type(max_patches) = "" !< Override BC type for mass fractions.
      real(rk) :: patch_Y(max_species, max_patches) = zero           !< Legacy index-based \(Y_k\) mass fractions on patch.
      character(len=1024) :: patch_composition(max_patches) = ""      !< Preferred named patch mixture, e.g. "CH4:1,O2:0.233,N2:0.767".

      !> @name Data Output
      character(len=path_len) :: output_dir = "output" !< Directory for result storage.
      logical :: write_vtu = .true.                    !< If true, generates Unstructured VTK files.
      logical :: write_diagnostics = .true.            !< If true, writes global residuals to `diagnostics.csv`.
      character(len=name_len) :: vtu_format = "ascii"  !< Output format: "ascii" or "binary".

      !> @name Restart Controls
      logical :: restart_from_file = .false.           !< If true, initialize fields from restart_file after allocation.
      character(len=path_len) :: restart_file = ""     !< Rank-independent restart file to read.
      logical :: write_restart = .false.               !< If true, periodically write global restart files.
      integer :: restart_interval = 0                  !< Restart write cadence [steps]; required when write_restart=.true.
      character(len=path_len) :: restart_output_dir = "restart" !< Restart directory, relative to output_dir unless absolute.
      integer :: restart_keep = 0                      !< Number of newest restart files to keep; 0 keeps all.
      logical :: restart_use_file_dt = .false.         !< If true, restore dt from restart; otherwise namelist dt wins.
      logical :: restart_nsteps_are_additional = .false. !< If true, add namelist nsteps to restart step.

      !> @name Multi-Species Transport
      logical :: enable_species = .false.                         !< Enable advection-diffusion of mass fractions.
      logical :: enable_reactions = .false.                       !< Reserved for chemical source terms; supported paths require non-reacting transport.
      integer :: nspecies = 0                                     !< Total number of transport species.
      character(len=name_len) :: species_name(max_species) = ""   !< List of species names.
      real(rk) :: species_diffusivity(max_species) = 0.0_rk       !< Constant species diffusivity \(D_k\) [m^2/s].
      real(rk) :: initial_Y(max_species) = 0.0_rk                 !< Legacy index/name-matched global initial mass fractions.
      character(len=1024) :: initial_composition = ""              !< Preferred named initial mixture, e.g. "CH4:0.028,O2:0.225,N2:0.747".

      !> @name Operator-split Cantera chemistry controls
      integer :: chemistry_update_interval = 1                    !< Chemistry source update cadence [steps].
      real(rk) :: chemistry_rtol = 1.0e-8_rk                      !< Relative tolerance for Cantera ReactorNet chemistry integration.
      real(rk) :: chemistry_atol = 1.0e-15_rk                     !< Absolute tolerance for Cantera ReactorNet chemistry integration.
      integer :: chemistry_max_steps = 10000                     !< Maximum internal ReactorNet steps per cell chemistry advance.
      logical :: chemistry_energy_enabled = .true.                !< If true, Cantera chemistry solves the reactor energy equation.
      real(rk) :: chemistry_temperature_cutoff = zero             !< Skip chemistry below this temperature [K]; zero disables the cutoff.
      real(rk) :: chemistry_min_reactive_mass_fraction = zero     !< Legacy skip if max(Y_k) is below this threshold; zero disables.
      integer :: chemistry_n_active_species = 0                  !< Number of named species used for optional chemistry activity screening.
      character(len=name_len) :: chemistry_active_species_name(max_species) = "" !< Species names used for optional chemistry screening.
      real(rk) :: chemistry_active_species_threshold = zero      !< Skip chemistry if all named active-species Y are below this threshold.
      real(rk) :: chemistry_max_dT_per_step = zero              !< Optional chemistry dt/source limiter threshold [K]; zero disables.
      real(rk) :: chemistry_max_rel_rho_change_per_step = zero  !< Optional chemistry density-change threshold; zero disables.
      real(rk) :: chemistry_max_dY_per_step = zero              !< Optional chemistry species-change threshold; zero disables.
      real(rk) :: chemistry_dt_safety = 0.5_rk                  !< Safety factor for next-step chemistry dt cuts.
      real(rk) :: chemistry_dt_min_factor = 0.1_rk              !< Minimum multiplicative dt cut in one chemistry-control event.
      logical :: chemistry_limit_source_update = .false.        !< If true, under-relax/clip committed chemistry source update.
      real(rk) :: chemistry_source_relaxation = one             !< Max fraction of Cantera chemistry update to commit when source limiting.
      logical :: enable_chemistry_load_balancing = .false.      !< If true, distribute active chemistry cells globally round-robin.

      !> @name Chemistry and Reacting Flow Stability Upgrades
      logical :: enable_chemistry_subcycling = .false.          !< If true, subcycle Cantera chemistry integration.
      integer :: max_chemistry_subcycles = 8                    !< Upper limit on chemistry subcycles per timestep.
      real(rk) :: subcycling_dT_threshold = 10.0_rk             !< Local temperature change threshold [K] to trigger subcycling.
      logical :: reject_on_nan = .true.                         !< If true, reject trial steps containing NaN/Inf values.
      real(rk) :: min_density_ratio_limit = 0.05_rk             !< Minimum density ratio relative to background before step rejection.
      real(rk) :: max_temperature_limit = 3200.0_rk             !< Maximum temperature limit [K] before step rejection.
      real(rk) :: min_temperature_limit = 200.0_rk              !< Minimum temperature limit [K] before step rejection.
      real(rk) :: max_pressure_residual_limit = 1.0e-2_rk       !< Maximum allowed PCG pressure residual before step rejection.

      !> @name Ignition-kernel initialization
      logical :: enable_ignition_kernel = .false.                 !< If true, overwrite an initial hot spherical kernel before the first step.
      character(len=name_len) :: ignition_kernel_shape = "sphere" !< First supported shape is sphere.
      real(rk) :: ignition_kernel_center(3) = zero                !< Kernel center [m].
      real(rk) :: ignition_kernel_radius = zero                   !< Kernel radius [m].
      real(rk) :: ignition_kernel_T = zero                        !< Kernel temperature [K].
      character(len=1024) :: ignition_kernel_composition = ""  !< Optional named composition inside kernel.
      character(len=name_len) :: ignition_kernel_blend = "overwrite" !< First supported blend mode is overwrite.
      
      !> @name Internal Registry (Reacting discovery)
      integer :: namelist_nspecies = 0                            !< Number of species specified in `case.nml`.
      character(len=name_len) :: namelist_species_name(max_species) = "" !< Names specified in `case.nml`.
      
      !> @name Cantera Bridge Integration
      logical :: enable_cantera_fluid = .false.                   !< Use Cantera for mixture-averaged viscosity; flow density remains `rho`.
      logical :: enable_cantera_species = .false.                 !< Use Cantera for mixture-averaged \(D_k\).
      character(len=path_len) :: cantera_mech_file = "gri30.yaml" !< Path to YAML/CTI mechanism file.
      character(len=name_len) :: cantera_phase_name = ""          !< Optional Cantera phase name; blank uses first/default phase.
      integer :: cantera_reaction_count = 0                       !< Number of reactions reported by the selected Cantera phase.
      real(rk) :: background_temp = 300.0_rk                      !< Fixed temperature for property evaluation [K].
      real(rk) :: background_press = 101325.0_rk                  !< Uniform thermodynamic pressure \(p_0\) passed to Cantera [Pa].

      !> @name Enthalpy Energy Equation Controls
      logical :: enable_energy = .false.                         !< Enable enthalpy/temperature field storage.
      logical :: enable_cantera_thermo = .false.                 !< Use Cantera for sensible h(T,Y,p0) and T(h,Y,p0).
      logical :: enable_species_enthalpy_diffusion = .false.     !< Include optional species-enthalpy diffusion correction in the \(h\) equation.
      integer :: thermo_update_interval = 1                     !< Reserved Cantera thermo interval [steps]; must remain 1.
      character(len=name_len) :: thermo_default_species = 'N2'   !< Single-species Cantera thermo fallback when species transport is off.
      real(rk) :: initial_T = 300.0_rk                           !< Initial gas temperature [K].
      real(rk) :: energy_reference_T = 298.15_rk                 !< Reference temperature for sensible enthalpy [K].
      real(rk) :: energy_reference_h = zero                      !< Reference sensible enthalpy for constant-cp mode [J/kg].
      real(rk) :: energy_cp = 1005.0_rk                          !< Constant heat capacity for non-Cantera thermo [J/kg/K].
      real(rk) :: energy_lambda = 2.6e-2_rk                      !< Constant thermal conductivity for non-Cantera thermo [W/m/K].

      !> @name Spectral radiation coupling controls
      logical :: enable_radiation = .false.                       !< Enable radiation-source updates on the radiation communicator.
      integer :: radiation_update_interval = 1                    !< Recompute qrad every N flow steps; otherwise reuse last qrad.
      integer :: radiation_n_wavenumbers = 0                      !< Number of spectral/wavenumber tasks decomposed over radiation MPI ranks.
      integer :: radiation_n_species = 0                          !< Number of transported species used by the radiation model.
      character(len=name_len) :: radiation_species_name(max_species) = "" !< Radiation-relevant transported species names.
      character(len=name_len) :: radiation_source_model = "none" !< Radiation source model: none or spectral_test.
      real(rk) :: radiation_source_scale = 0.0_rk                 !< Test-model source scale [W/m^3].
      integer :: radiation_n_scalars = 0                            !< Reserved number of generic scalar arrays for radiation.
      character(len=name_len) :: radiation_scalar_name(max_species) = "" !< Reserved selected scalar names for future radiation models.
      character(len=name_len) :: radiation_pressure_source = "background" !< Pressure source for radiation state: background or system.
      logical :: radiation_debug = .false.                          !< Write extra gather/checksum radiation diagnostics.
      logical :: write_radiation_diagnostics = .true.               !< Write radiation_setup.txt and radiation_diagnostics.csv.
      real(rk) :: radiation_absorption_coeff = 1.0_rk               !< Constant grey gas absorption coefficient [1/m].
      real(rk) :: radiation_emissivity = 1.0_rk                     !< Wall boundary surface emissivity [0-1].
      character(len=name_len) :: radiation_dom_quadrature = "s2"    !< DOM angular quadrature type: s2 or s4.


      !> @name Profiling Controls
      logical :: enable_profiling = .true.                       !< Enable wall-clock profiling.
      logical :: nested_profiling = .true.                       !< If true, print nested profiling tree.
      logical :: write_cantera_cache_stats = .false.              !< If true, print final Cantera cache hit/miss statistics.
      logical :: write_chemistry_screening_stats = .false.        !< If true, print final chemistry screening/skipped-cell statistics.
      logical :: variable_density_debug = .false.                 !< If true, print verbose experimental variable-density diagnostics.
      integer :: variable_density_debug_interval = 1              !< Print variable-density debug every N energy steps when enabled.
   end type case_params_t