From ff6cd2e0defa5474b03c93fdd2a277d3ed89bd92 Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Wed, 14 Jan 2026 11:09:44 -0500 Subject: [PATCH 1/2] allow burn_cell_sdc to take rhoX as input also increase precision in the parse script I am trying to be able to reliably reproduce failures --- unit_test/burn_cell_sdc/_parameters | 3 ++ unit_test/burn_cell_sdc/burn_cell.H | 27 +++++++++++----- .../parse_integration_failure.py | 31 +++++++++++++------ 3 files changed, 44 insertions(+), 17 deletions(-) diff --git a/unit_test/burn_cell_sdc/_parameters b/unit_test/burn_cell_sdc/_parameters index c4b03562fd..e3cad6d99f 100644 --- a/unit_test/burn_cell_sdc/_parameters +++ b/unit_test/burn_cell_sdc/_parameters @@ -12,6 +12,9 @@ nsteps int 100 # do we recompute the aux quantities? or do we take them as given in the inputs? recompute_aux bool 0 +# are mass fractions (and aux) density weighted? e.g. rho X +mass_fraction_rho_weighted bool 0 + density real 1.e7 temperature real 3.e9 rhoe real -1.e0 diff --git a/unit_test/burn_cell_sdc/burn_cell.H b/unit_test/burn_cell_sdc/burn_cell.H index a271b33640..c5178ff8ff 100644 --- a/unit_test/burn_cell_sdc/burn_cell.H +++ b/unit_test/burn_cell_sdc/burn_cell.H @@ -20,10 +20,11 @@ void burn_cell_c() massfractions[n-1] = get_xn(n, unit_test_rp::uniform_xn); - if (massfractions[n-1] < 0 || massfractions[n-1] > 1) { - amrex::Error("mass fraction for " + short_spec_names_cxx[n-1] + " not initialized in the interval [0,1]!"); + if (! unit_test_rp::mass_fraction_rho_weighted) { + if (massfractions[n-1] < 0 || massfractions[n-1] > 1) { + amrex::Error("mass fraction for " + short_spec_names_cxx[n-1] + " not initialized in the interval [0,1]!"); + } } - } @@ -214,8 +215,14 @@ void burn_cell_c() eos_state.rho = unit_test_rp::density; eos_state.T = unit_test_rp::temperature; - for (int n = 0; n < NumSpec; n++) { - eos_state.xn[n] = massfractions[n]; + if (unit_test_rp::mass_fraction_rho_weighted) { + for (int n = 0; n < NumSpec; n++) { + eos_state.xn[n] = massfractions[n] / unit_test_rp::density; + } + } else { + for (int n = 0; n < NumSpec; n++) { + eos_state.xn[n] = massfractions[n]; + } } #ifdef AUX_THERMO if (unit_test_rp::recompute_aux) { @@ -235,8 +242,14 @@ void burn_cell_c() burn_state.rho = eos_state.rho; burn_state.T = eos_state.T; - for (int n = 0; n < NumSpec; n++) { - burn_state.y[SFS+n] = burn_state.rho * eos_state.xn[n]; + if (unit_test_rp::mass_fraction_rho_weighted) { + for (int n = 0; n < NumSpec; n++) { + burn_state.y[SFS+n] = massfractions[n]; + } + } else { + for (int n = 0; n < NumSpec; n++) { + burn_state.y[SFS+n] = burn_state.rho * eos_state.xn[n]; + } } #if NAUX_NET > 0 diff --git a/unit_test/burn_cell_sdc/parse_integration_failure.py b/unit_test/burn_cell_sdc/parse_integration_failure.py index 7dd195a454..2e4b77a282 100644 --- a/unit_test/burn_cell_sdc/parse_integration_failure.py +++ b/unit_test/burn_cell_sdc/parse_integration_failure.py @@ -59,6 +59,8 @@ def doit(string): A_X_k = None A_aux_k = None + X_is_rho_weighted = False + for line in string: if line.startswith("dens start"): is_vode = True @@ -82,10 +84,19 @@ def doit(string): _tmp = line.split("=")[-1] xn = [float(q) for q in _tmp.split()] + elif line.startswith("rho xn start"): + _tmp = line.split("=")[-1] + xn = [float(q) for q in _tmp.split()] + if_rho_weights = True + elif line.startswith("aux start"): _tmp = line.split("=")[-1] aux = [float(q) for q in _tmp.split()] + elif line.startswith("rho aux start"): + _tmp = line.split("=")[-1] + aux = [float(q) for q in _tmp.split()] + elif line.startswith("A(rho)"): A_rho = float(line.split("=")[-1]) @@ -131,40 +142,40 @@ def doit(string): _tmp = line.split("=")[-1] A_aux_k = [float(q) for q in _tmp.split()] - print(f"unit_test.density = {density}") - print(f"unit_test.temperature = {temperature}") + print(f"unit_test.density = {density:30.20g}") + print(f"unit_test.temperature = {temperature:30.20g}") if rhoe: - print(f"unit_test.rhoe = {rhoe}") + print(f"unit_test.rhoe = {rhoe:30.20g}") if tmax: - print(f"unit_test.tmax = {tmax}") + print(f"unit_test.tmax = {tmax:30.20g}") print("") for n, X in enumerate(xn): - print(f"unit_test.X{n+1} = {X}") + print(f"unit_test.X{n+1} = {X:30.20g}") print("") if aux: for n, a in enumerate(aux): - print(f"unit_test.Aux{n+1} = {a}") + print(f"unit_test.Aux{n+1} = {a:30.20g}") print("") - print(f"unit_test.Adv_rho = {A_rho}") - print(f"unit_test.Adv_rhoe = {A_rhoe}") + print(f"unit_test.Adv_rho = {A_rho:30.20g}") + print(f"unit_test.Adv_rhoe = {A_rhoe:30.20g}") print("") for n, A in enumerate(A_X_k): - print(f"unit_test.Adv_X{n+1} = {A}") + print(f"unit_test.Adv_X{n+1} = {A:30.20g}") if A_aux_k: print("") for n, A in enumerate(A_aux_k): - print(f"unit_test.Adv_Aux{n+1} = {A}") + print(f"unit_test.Adv_Aux{n+1} = {A:30.20g}") if __name__ == "__main__": From 45ac05cfcbf7ed2b1d91b72e88c129f0277eeca4 Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Mon, 16 Mar 2026 14:43:03 -0400 Subject: [PATCH 2/2] update --- integration/integrator_setup_sdc.H | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/integration/integrator_setup_sdc.H b/integration/integrator_setup_sdc.H index fe041ac7ad..2a35c672c1 100644 --- a/integration/integrator_setup_sdc.H +++ b/integration/integrator_setup_sdc.H @@ -19,9 +19,9 @@ struct state_backup_t { amrex::Real T_in{}; amrex::Real rhoe_in{}; #ifndef AMREX_USE_GPU - amrex::Real xn_in[NumSpec]{}; + amrex::Real rhoxn_in[NumSpec]{}; #ifdef AUX_THERMO - amrex::Real aux_in[NumAux]{}; + amrex::Real rhoaux_in[NumAux]{}; #endif #endif }; @@ -115,11 +115,11 @@ state_backup_t integrator_backup (const BurnT& state) { #ifndef AMREX_USE_GPU for (int n = 0; n < NumSpec; ++n) { - state_save.xn_in[n] = state.y[SFS+n] / state.y[SRHO]; + state_save.rhoxn_in[n] = state.y[SFS+n]; } #ifdef AUX_THERMO for (int n = 0; n < NumAux; ++n) { - state_save.aux_in[n] = state.y[SFX+n] / state.y[SRHO]; + state_save.rhoaux_in[n] = state.y[SFX+n]; } #endif #endif @@ -223,14 +223,14 @@ void integrator_cleanup (IntegratorT& int_state, BurnT& state, std::cout << "dens start = " << std::setprecision(OUTDIGITS) << state.rho_orig << std::endl; std::cout << "temp start = " << std::setprecision(OUTDIGITS) << state_save.T_in << std::endl; std::cout << "rhoe start = " << std::setprecision(OUTDIGITS) << state_save.rhoe_in << std::endl; - std::cout << "xn start = "; - for (const auto X : state_save.xn_in) { + std::cout << "rho xn start = "; + for (const auto X : state_save.rhoxn_in) { std::cout << std::setprecision(OUTDIGITS) << X << " "; } std::cout << std::endl; #ifdef AUX_THERMO - std::cout << "aux start = "; - for (const auto aux : state_save.aux_in) { + std::cout << "rho aux start = "; + for (const auto aux : state_save.rhoaux_in) { std::cout << std::setprecision(OUTDIGITS) << aux << " "; } std::cout << std::endl;