From a3bc2465da68185084efc23383c55be90e426712 Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Mon, 8 Jul 2024 19:56:12 -0400 Subject: [PATCH 01/33] add a second T check to tablular NSE (#1547) if we are larger than T_always_nse, then we ignore composition (density still matters) --- nse_tabular/_parameters | 5 + nse_tabular/nse_table_check.H | 114 ++++++++++-------- sphinx_docs/source/nse.rst | 23 ++-- .../ci-benchmarks/aprox19_nse_unit_test.out | 86 ++++++------- 4 files changed, 124 insertions(+), 104 deletions(-) diff --git a/nse_tabular/_parameters b/nse_tabular/_parameters index 48dfadf96e..76a5c5910b 100644 --- a/nse_tabular/_parameters +++ b/nse_tabular/_parameters @@ -7,6 +7,11 @@ O_nse real 0.01 Si_nse real 0.01 He_Fe_nse real 0.88 +# temperature above which we always assume NSE, regardless of composition +# note: rho_nse is still considered. +T_always_nse real 9.e9 + + # factor (< 1) by which to relax the criteria for entering NSE. # This is only applied after a failed burn. nse_relax_factor real 1.0 diff --git a/nse_tabular/nse_table_check.H b/nse_tabular/nse_table_check.H index 50ee1cf884..77e2f95b62 100644 --- a/nse_tabular/nse_table_check.H +++ b/nse_tabular/nse_table_check.H @@ -21,72 +21,82 @@ AMREX_GPU_HOST_DEVICE AMREX_INLINE bool in_nse(T& state, const bool relax = false) { using namespace Species; - amrex::Real f = relax ? nse_relax_factor : 1.0_rt; + amrex::Real f = relax ? network_rp::nse_relax_factor : 1.0_rt; bool nse_check = false; - if (state.rho > f * rho_nse && state.T > f * T_nse) { - // Ma checks on Fe-group - // and C-group - // and He-group - // also make sure there is not a lot of O16 (O16 burning will dominate then) or Si28 - - amrex::Real Fe_group = 0.0_rt; - amrex::Real C_group = 0.0_rt; - amrex::Real He_group = 0.0_rt; - amrex::Real O_group = 0.0_rt; - amrex::Real Si_group = 0.0_rt; - - auto add_to_group = [&state](amrex::Real& group, int zion_start, int zion_end) { - for (int spec = 1; spec <= NumSpec; ++spec) { - if (NetworkProperties::zion(spec) >= zion_start && NetworkProperties::zion(spec) <= zion_end) { - group += state.xn[spec - 1]; - } - } - }; + if (state.rho > f * network_rp::rho_nse && state.T > f * network_rp::T_nse) { - if constexpr (std::is_same_v) { - // for a burn_t, we need to use a different field - // depending on whether we are strang or simplified-SDC + if (state.T > network_rp::T_always_nse) { + nse_check = true; -#ifdef STRANG - add_to_group(Fe_group, 24, 30); // range for Fe-group - add_to_group(C_group, 6, 7); // range for C-group - add_to_group(He_group, 1, 2); // range for He-group - add_to_group(O_group, 8, 8); // range for O-group - add_to_group(Si_group, 14, 14); // range for Si-group -#else - // we need to get the mass fractions from the conserved state passed in - auto add_to_group_y = [&state](amrex::Real& group, int zion_start, int zion_end) { + } else { + + // consider composition + + // Ma checks on Fe-group + // and C-group + // and He-group + // also make sure there is not a lot of O16 (O16 burning will dominate then) or Si28 + + amrex::Real Fe_group{}; + amrex::Real C_group{}; + amrex::Real He_group{}; + amrex::Real O_group{}; + amrex::Real Si_group{}; + + auto add_to_group = [&state](amrex::Real& group, int zion_start, int zion_end) { for (int spec = 1; spec <= NumSpec; ++spec) { if (NetworkProperties::zion(spec) >= zion_start && NetworkProperties::zion(spec) <= zion_end) { - group += state.y[SFS + spec - 1]; + group += state.xn[spec - 1]; } } - group /= state.rho; }; - add_to_group_y(Fe_group, 24, 30); - add_to_group_y(C_group, 6, 7); - add_to_group_y(He_group, 1, 2); - add_to_group_y(O_group, 8, 8); - add_to_group_y(Si_group, 14, 14); + + if constexpr (std::is_same_v) { + // for a burn_t, we need to use a different field + // depending on whether we are strang or simplified-SDC + +#ifdef STRANG + add_to_group(Fe_group, 24, 30); // range for Fe-group + add_to_group(C_group, 6, 7); // range for C-group + add_to_group(He_group, 1, 2); // range for He-group + add_to_group(O_group, 8, 8); // range for O-group + add_to_group(Si_group, 14, 14); // range for Si-group +#else + // we need to get the mass fractions from the conserved state passed in + auto add_to_group_y = [&state](amrex::Real& group, int zion_start, int zion_end) { + for (int spec = 1; spec <= NumSpec; ++spec) { + if (NetworkProperties::zion(spec) >= zion_start && NetworkProperties::zion(spec) <= zion_end) { + group += state.y[SFS + spec - 1]; + } + } + group /= state.rho; + }; + add_to_group_y(Fe_group, 24, 30); + add_to_group_y(C_group, 6, 7); + add_to_group_y(He_group, 1, 2); + add_to_group_y(O_group, 8, 8); + add_to_group_y(Si_group, 14, 14); #endif - } else { - // this covers the various eos_t's + } else { + // this covers the various eos_t's - add_to_group(Fe_group, 24, 30); - add_to_group(C_group, 6, 7); - add_to_group(He_group, 1, 2); - add_to_group(O_group, 8, 8); - add_to_group(Si_group, 14, 14); - } + add_to_group(Fe_group, 24, 30); + add_to_group(C_group, 6, 7); + add_to_group(He_group, 1, 2); + add_to_group(O_group, 8, 8); + add_to_group(Si_group, 14, 14); + } - if (Fe_group + He_group > f * He_Fe_nse && - C_group < C_nse / f && - O_group < O_nse / f && - Si_group < Si_nse / f) { - nse_check = true; + if (Fe_group + He_group > f * network_rp::He_Fe_nse && + C_group < network_rp::C_nse / f && + O_group < network_rp::O_nse / f && + Si_group < network_rp::Si_nse / f) { + nse_check = true; + } } + } if constexpr (std::is_same::value) { diff --git a/sphinx_docs/source/nse.rst b/sphinx_docs/source/nse.rst index 6e01f2f18e..67b646b1f4 100644 --- a/sphinx_docs/source/nse.rst +++ b/sphinx_docs/source/nse.rst @@ -166,23 +166,27 @@ The basic flow of a simulation using ``aprox19`` + the NSE table is as follows: NSE check --------- -We group elements by their atomic numbers and perform the NSE check based on these groups: +For a zone to be consider in NSE, we require $\rho$ > ``rho_nse`` and *either* -``He_group``: atomic numbers 1 to 2 (H to He) +* $T$ > ``T_nse`` together with the composition check -``C_group``: atomic numbers 6 to 7 (C to N) +* $T$ > ``T_always_nse`` -``O_group``: atomic number 8 (O) +where we assume that ``T_always_nse`` > ``T_nse``. -``Si_group``: atomic number 14 (Si) +The composition check considers the following nuclei groups: -``Fe_group``: atomic numbers 24 to 30 (Cr to Zn) +* ``He_group``: atomic numbers 1 to 2 (H to He) -We determine if a zone is in NSE according to: +* ``C_group``: atomic numbers 6 to 7 (C to N) -* :math:`\rho` > ``rho_nse`` +* ``O_group``: atomic number 8 (O) -* :math:`T` > ``T_nse`` +* ``Si_group``: atomic number 14 (Si) + +* ``Fe_group``: atomic numbers 24 to 30 (Cr to Zn) + +and we then say that a composition supports NSE if: * :math:`X(C_group)` < ``C_nse`` @@ -193,6 +197,7 @@ We determine if a zone is in NSE according to: * :math:`X(Fe_group) + X(He_group)` > ``He_Fe_nse`` + NSE table ranges ---------------- diff --git a/unit_test/burn_cell/ci-benchmarks/aprox19_nse_unit_test.out b/unit_test/burn_cell/ci-benchmarks/aprox19_nse_unit_test.out index d03c8cec1b..13fd00dec3 100644 --- a/unit_test/burn_cell/ci-benchmarks/aprox19_nse_unit_test.out +++ b/unit_test/burn_cell/ci-benchmarks/aprox19_nse_unit_test.out @@ -1,5 +1,5 @@ -Initializing AMReX (23.12-21-gef38229189e3)... -AMReX (23.12-21-gef38229189e3) initialized +Initializing AMReX (24.06)... +AMReX (24.06) initialized starting the single zone burn... reading the NSE table (C++) ... Maximum Time (s): 0.01 @@ -48,53 +48,53 @@ burn entered NSE during integration (after 280 steps), zone = (0, 0, 0) recovering burn failure in NSE, zone = (0, 0, 0) ------------------------------------ successful? 1 - - Hnuc = 2.578034812e+21 - - added e = 2.578034812e+19 - - final T = 1.063446163e+10 + - Hnuc = 1.196750317e+35 + - added e = 1.196750317e+33 + - final T = 2.753935031e+13 ------------------------------------ e initial = 1.516256085e+18 -e final = 2.72966042e+19 +e final = 1.196750317e+33 ------------------------------------ new mass fractions: -H1 5.812961393e-07 -He3 9.821888481e-12 -He4 0.06008117992 -C12 9.999992174e-31 -N14 1.534220194e-15 -O16 2.310011368e-15 -Ne20 1.352206382e-19 -Mg24 5.363834622e-22 -Si28 4.61640554e-23 -S32 9.999992174e-31 -Ar36 9.999992174e-31 -Ca40 4.564517527e-29 -Ti44 9.999992174e-31 -Cr48 5.163875678e-30 -Fe52 9.999992174e-31 -Fe54 3.381529446e-28 -Ni56 9.999992174e-31 -n 0.4683168262 -p 0.4716014125 +H1 0 +He3 1.06462914e-09 +He4 2.860133032e-11 +C12 1e-16 +N14 1e-16 +O16 1e-16 +Ne20 1e-16 +Mg24 1e-16 +Si28 1e-16 +S32 1e-16 +Ar36 1e-16 +Ca40 1e-16 +Ti44 1e-16 +Cr48 1e-16 +Fe52 1e-16 +Fe54 1e-16 +Ni56 5.070636489e-210 +n 0.4999883475 +p 0.5000116514 ------------------------------------ species creation rates: -omegadot(H1): -9.99994187 -omegadot(He3): -2.499999999 -omegadot(He4): -73.99188201 +omegadot(H1): -10 +omegadot(He3): -2.499999894 +omegadot(He4): -80 omegadot(C12): -2.5 omegadot(N14): -2.5 omegadot(O16): -2.5 -omegadot(Ne20): 1.352206382e-17 -omegadot(Mg24): 5.363834612e-20 -omegadot(Si28): 4.61640544e-21 -omegadot(S32): -7.826200767e-35 -omegadot(Ar36): -7.826200767e-35 -omegadot(Ca40): 4.464517527e-27 -omegadot(Ti44): -7.826200767e-35 -omegadot(Cr48): 4.163875678e-28 -omegadot(Fe52): -7.826200767e-35 -omegadot(Fe54): 3.371529446e-26 -omegadot(Ni56): -7.826200767e-35 -omegadot(n): 46.83168262 -omegadot(p): 47.16014125 -number of steps taken: 27367 -AMReX (23.12-21-gef38229189e3) finalized +omegadot(Ne20): 1e-14 +omegadot(Mg24): 1e-14 +omegadot(Si28): 1e-14 +omegadot(S32): 1e-14 +omegadot(Ar36): 1e-14 +omegadot(Ca40): 1e-14 +omegadot(Ti44): 1e-14 +omegadot(Cr48): 1e-14 +omegadot(Fe52): 1e-14 +omegadot(Fe54): 1e-14 +omegadot(Ni56): -1e-28 +omegadot(n): 49.99883475 +omegadot(p): 50.00116514 +number of steps taken: 28000 +AMReX (24.06) finalized From 0b1a2310392f83adfee33c5a50da9fd90a2b5a7c Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Tue, 9 Jul 2024 08:30:51 -0400 Subject: [PATCH 02/33] add NSE bailout to RKC (#1544) also clean up some VODE stuff --- integration/RKC/rkc.H | 37 +++++++++++++++++++++++++++++++++++ integration/VODE/vode_type.H | 20 ++++++++----------- integration/integrator_data.H | 9 +++++++-- 3 files changed, 52 insertions(+), 14 deletions(-) diff --git a/integration/RKC/rkc.H b/integration/RKC/rkc.H index 7fc0722eeb..55d3a3c5b4 100644 --- a/integration/RKC/rkc.H +++ b/integration/RKC/rkc.H @@ -15,6 +15,14 @@ #include #include +#ifdef NSE_TABLE +#include +#endif +#ifdef NSE_NET +#include +#endif + + template AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void step (BurnT& state, RkcT& rstate, const amrex::Real h, const int m) @@ -225,6 +233,35 @@ int rkclow (BurnT& state, RkcT& rstate) err = std::sqrt(err / int_neqs); + // before we accept or reject the step, let's check if we've entered + // NSE + +#ifdef NSE + // check if, during the course of integration, we hit NSE, and + // if so, bail out we rely on the state being consistent after + // the call to dvstep, even if the step failed. + + // we only do this after MIN_NSE_BAILOUT_STEPS to prevent us + // from hitting this right at the start when VODE might do so + // wild exploration. Also ensure we are not working > tmax, + // so we don't need to worry about extrapolating back in time. + + if (rstate.nsteps > MIN_NSE_BAILOUT_STEPS && rstate.t <= rstate.tout) { + // first we need to make the burn_t in sync + +#ifdef STRANG + update_thermodynamics(state, rstate); +#endif +#ifdef SDC + int_to_burn(rstate.t, rstate, state); +#endif + + if (in_nse(state)) { + return IERR_ENTERED_NSE; + } + } +#endif + if (err > 1.0_rt) { // Step is rejected. rstate.nrejct++; diff --git a/integration/VODE/vode_type.H b/integration/VODE/vode_type.H index 0b639151af..3c246bfb50 100644 --- a/integration/VODE/vode_type.H +++ b/integration/VODE/vode_type.H @@ -9,30 +9,26 @@ #include -const amrex::Real UROUND = std::numeric_limits::epsilon(); +constexpr amrex::Real UROUND = std::numeric_limits::epsilon(); // CCMXJ = Threshold on DRC for updating the Jacobian -const amrex::Real CCMXJ = 0.2e0_rt; +constexpr amrex::Real CCMXJ = 0.2e0_rt; -const amrex::Real HMIN = 0.0_rt; +constexpr amrex::Real HMIN = 0.0_rt; // For each species whose abundance is above a certain threshold, we do // not allow its mass fraction to change by more than a certain amount // in any integration step. -const amrex::Real vode_increase_change_factor = 4.0_rt; -const amrex::Real vode_decrease_change_factor = 0.25_rt; +constexpr amrex::Real vode_increase_change_factor = 4.0_rt; +constexpr amrex::Real vode_decrease_change_factor = 0.25_rt; // For the backward differentiation formula (BDF) integration // the maximum order should be no greater than 5. -const int VODE_MAXORD = 5; -const int VODE_LMAX = VODE_MAXORD + 1; +constexpr int VODE_MAXORD = 5; +constexpr int VODE_LMAX = VODE_MAXORD + 1; // How many timesteps should pass before refreshing the Jacobian -const int max_steps_between_jacobian_evals = 50; - -#ifdef NSE -const int MIN_NSE_BAILOUT_STEPS = 10; -#endif +constexpr int max_steps_between_jacobian_evals = 50; // Type dvode_t contains the integration solution and control variables template diff --git a/integration/integrator_data.H b/integration/integrator_data.H index 9c146c9727..2d4f7795cd 100644 --- a/integration/integrator_data.H +++ b/integration/integrator_data.H @@ -5,12 +5,17 @@ // Define the size of the ODE system that VODE will integrate -const int INT_NEQS = NumSpec + 1; +constexpr int INT_NEQS = NumSpec + 1; // We will use this parameter to determine if a given species // abundance is unreasonably small or large (each X must satisfy // -failure_tolerance <= X <= 1.0 + failure_tolerance). -const amrex::Real species_failure_tolerance = 1.e-2_rt; +constexpr amrex::Real species_failure_tolerance = 1.e-2_rt; + +#ifdef NSE +constexpr int MIN_NSE_BAILOUT_STEPS = 10; +#endif + enum integrator_errors : std::int8_t { IERR_SUCCESS = 1, From 4142d4fbff132040a405d0bc3759b5c99099334c Mon Sep 17 00:00:00 2001 From: Zhi Chen <62574124+zhichen3@users.noreply.github.com> Date: Thu, 11 Jul 2024 11:05:53 -0400 Subject: [PATCH 03/33] Update rhoX for nse_solver for SDC and discard strang (#1607) This is to address #1606 and partially addresses #1542 Also some clean-ups to nse-solver. It mainly stores state.y[SFS+n] at the end. --- nse_solver/nse_check.H | 65 +- nse_solver/nse_solver.H | 48 +- unit_test/test_ase/GNUmakefile | 5 +- unit_test/test_ase/burn_cell.H | 6 +- .../ci-benchmarks/ase_nse_net_unit_test.out | 46 +- unit_test/test_ase/make_table/GNUmakefile | 4 +- unit_test/test_ase/make_table/burn_cell.H | 13 +- .../ase_nse_net_make_table_unit_test.out | 578 +++++++++--------- unit_test/test_nse/GNUmakefile | 4 +- .../test_nse/ci-benchmarks/aprox21_ci.out | 46 +- unit_test/test_nse/nse_example.H | 2 +- 11 files changed, 410 insertions(+), 407 deletions(-) diff --git a/nse_solver/nse_check.H b/nse_solver/nse_check.H index d49a564eaa..5d0061d38f 100644 --- a/nse_solver/nse_check.H +++ b/nse_solver/nse_check.H @@ -20,7 +20,9 @@ // First check to see if we're in the ballpark of nse state AMREX_GPU_HOST_DEVICE AMREX_INLINE -void check_nse_molar(burn_t& state, const burn_t& nse_state, bool& nse_check) { +void check_nse_molar(const amrex::Array1D& Y, + const amrex::Array1D& Y_nse, + bool& nse_check) { // This function gives the first estimate whether we're in the nse or not // it checks whether the molar fractions of n,p,a are approximately in NSE @@ -44,13 +46,13 @@ void check_nse_molar(burn_t& state, const burn_t& nse_state, bool& nse_check) { for (int n = 0; n < NumSpec; ++n) { if (n == NSE_INDEX::H1_index || n == NSE_INDEX::N_index) { - r /= state.xn[n] * state.xn[n] * aion_inv[n] * aion_inv[n]; - r_nse /= nse_state.xn[n] * nse_state.xn[n] * aion_inv[n] * aion_inv[n]; + r /= Y(n+1) * Y(n+1); + r_nse /= Y_nse(n+1) * Y_nse(n+1); } else if (n == NSE_INDEX::He4_index) { - r *= state.xn[n] * aion_inv[n]; - r_nse *= nse_state.xn[n] * aion_inv[n]; + r *= Y(n+1); + r_nse *= Y_nse(n+1); } } @@ -59,7 +61,7 @@ void check_nse_molar(burn_t& state, const burn_t& nse_state, bool& nse_check) { // if there is neutron in the network - if ((std::abs(r - r_nse) < 0.5_rt*r_nse) + if ((std::abs(r - r_nse) < 0.5_rt * r_nse) && (NSE_INDEX::N_index != -1)) { nse_check = true; return; @@ -67,7 +69,7 @@ void check_nse_molar(burn_t& state, const burn_t& nse_state, bool& nse_check) { // if there is no neutron in the network - if ((std::abs(r - r_nse) < 0.25_rt*r_nse) + if ((std::abs(r - r_nse) < 0.25_rt * r_nse) && (NSE_INDEX::N_index == -1)) { nse_check = true; return; @@ -76,9 +78,8 @@ void check_nse_molar(burn_t& state, const burn_t& nse_state, bool& nse_check) { // Overall molar fraction check for (int n = 0; n < NumSpec; ++n) { - amrex::Real abs_diff = std::abs(state.xn[n] - nse_state.xn[n]) / aion[n]; - amrex::Real rel_diff = abs_diff / (state.xn[n] / aion[n]); - if (abs_diff > nse_abs_tol && rel_diff > nse_rel_tol) { + amrex::Real abs_diff = std::abs(Y(n+1) - Y_nse(n+1)); + if (abs_diff > nse_abs_tol && abs_diff > nse_rel_tol * Y(n+1)) { return; } } @@ -228,7 +229,7 @@ bool in_single_group(const amrex::Array1D& group_ind) { template AMREX_GPU_HOST_DEVICE AMREX_INLINE void fill_reaction_timescale(amrex::Array1D& reaction_timescales, - const int current_rate_index, const burn_t& state, + const int current_rate_index, const amrex::Real rho, const amrex::Array1D& Y, const amrex::Array1D& screened_rates, const amrex::Real t_s) { @@ -301,14 +302,14 @@ void fill_reaction_timescale(amrex::Array1D& reaction_tim if (NSE_INDEX::rate_indices(current_rate_index, 2) == NSE_INDEX::rate_indices(current_rate_index, 3)) { b_f *= 0.5_rt; } - b_f *= Y(NSE_INDEX::rate_indices(current_rate_index, 2) + 1) * state.rho; + b_f *= Y(NSE_INDEX::rate_indices(current_rate_index, 2) + 1) * rho; } if (NSE_INDEX::rate_indices(current_rate_index, 5) != -1) { if (NSE_INDEX::rate_indices(current_rate_index, 5) == NSE_INDEX::rate_indices(current_rate_index, 6)) { b_r *= 0.5_rt; } - b_r *= Y(NSE_INDEX::rate_indices(current_rate_index, 5) + 1) * state.rho; + b_r *= Y(NSE_INDEX::rate_indices(current_rate_index, 5) + 1) * rho; } // Find the timescale of the rate, See Equation 11 in Kushnir @@ -437,7 +438,7 @@ void fill_merge_indices(amrex::Array1D& merge_indices, AMREX_GPU_HOST_DEVICE AMREX_INLINE -void nse_grouping(amrex::Array1D& group_ind, const burn_t& state, +void nse_grouping(amrex::Array1D& group_ind, const amrex::Real rho, const amrex::Array1D& Y, const amrex::Array1D& screened_rates, const amrex::Real t_s) { @@ -468,7 +469,7 @@ void nse_grouping(amrex::Array1D& group_ind, const burn_t& stat amrex::Array1D rate_indices; for (int n = 1; n <= Rates::NumRates; ++n) { - fill_reaction_timescale(reaction_timescales, n, state, Y, + fill_reaction_timescale(reaction_timescales, n, rho, Y, screened_rates, t_s); rate_indices(n) = n; } @@ -543,19 +544,22 @@ bool in_nse(burn_t& current_state, bool skip_molar_check=false) { const auto nse_state = get_actual_nse_state(current_state); - burn_t state = current_state; + auto state = current_state; + + // Convert to molar fractions + + amrex::Array1D Y; + amrex::Array1D Y_nse; -#ifndef STRANG - // if not strang, store mass fractions for (int n = 0; n < NumSpec; ++n) { - state.xn[n] = current_state.y[SFS+n] / current_state.rho; + Y(n+1) = current_state.y[SFS+n] * aion_inv[n] / current_state.rho; + Y_nse(n+1) = nse_state.xn[n] * aion_inv[n]; } -#endif // Check whether state is in the ballpark of NSE if (!skip_molar_check) { - check_nse_molar(state, nse_state, current_state.nse); + check_nse_molar(Y, Y_nse, current_state.nse); if (!current_state.nse) { return current_state.nse; } @@ -577,23 +581,16 @@ bool in_nse(burn_t& current_state, bool skip_molar_check=false) { // our current mass fractions are in the ballpark of NSE mass fractions. if (nse_molar_independent || skip_molar_check) { - state = nse_state; - state.dx = current_state.dx; -#ifndef STRANG - for (int n = 0; n < NumSpec; ++n) { - state.y[SFS+n] = nse_state.xn[n] * nse_state.rho; + for (int n = 1; n <= NumSpec; ++n) { + Y(n) = Y_nse(n); } -#endif } - // set molar fractions - - amrex::Array1D Y; + // store xn to find the rates - for (int n = 1; n <= NumSpec; ++n) { - Y(n) = state.xn[n-1] * aion_inv[n-1]; + for (int n = 0; n < NumSpec; ++n) { + state.xn[n] = Y(n+1) * aion[n]; } - rate_t rate_eval; constexpr int do_T_derivatives = 0; evaluate_rates(state, rate_eval); @@ -629,7 +626,7 @@ bool in_nse(burn_t& current_state, bool skip_molar_check=false) { // Now do nse grouping - nse_grouping(group_ind, state, Y, rate_eval.screened_rates, t_s); + nse_grouping(group_ind, state.rho, Y, rate_eval.screened_rates, t_s); // Check if we result in a single group after grouping diff --git a/nse_solver/nse_solver.H b/nse_solver/nse_solver.H index 94490b2933..1793c38f6d 100644 --- a/nse_solver/nse_solver.H +++ b/nse_solver/nse_solver.H @@ -51,6 +51,7 @@ T get_nonexponent_nse_state(const T& state) { // the temperature that comes in through T_fixed amrex::Real T_in = state.T_fixed > 0.0_rt ? state.T_fixed : state.T; + constexpr amrex::Real ihplanck2 = 1.0_rt / (C::hplanck * C::hplanck); #ifndef NEW_NETWORK_IMPLEMENTATION auto tfactors = evaluate_tfactors(T_in); @@ -59,7 +60,7 @@ T get_nonexponent_nse_state(const T& state) { for (int n = 0; n < NumSpec; ++n) { #ifdef NEW_NETWORK_IMPLEMENTATION if (n == NSE_INDEX::H1_index) { - nse_state.xn[n] = 0.0; + nse_state.xn[n] = 0.0_rt; continue; } #endif @@ -73,11 +74,11 @@ T get_nonexponent_nse_state(const T& state) { // find nse mass frac without the exponent term. - amrex::Real power = 2.0 * M_PI * network::mion(n+1) * - C::k_B * T_in / (C::hplanck * C::hplanck); + amrex::Real power = 2.0_rt * M_PI * network::mion(n+1) * + C::k_B * T_in * ihplanck2; nse_state.xn[n] = network::mion(n+1) * pf * spin / state.rho * - std::sqrt(power * power * power); + std::sqrt(amrex::Math::powi<3>(power)); } return nse_state; @@ -103,9 +104,9 @@ void compute_coulomb_contribution(amrex::Array1D& u_c, // so we just treat u_c as a constant. // - const amrex::Real n_e = state.rho * state.y_e / C::m_u; + const amrex::Real n_e = state.rho * state.y_e * C::Legacy::n_A; const amrex::Real Gamma_e = C::q_e * C::q_e * - std::cbrt(4.0_rt * M_PI * n_e / 3.0_rt) / (C::k_B * T_in); + std::cbrt(1.333333333333_rt * M_PI * n_e) / (C::k_B * T_in); amrex::Real gamma; for (int n = 0; n < NumSpec; ++n) { @@ -116,7 +117,7 @@ void compute_coulomb_contribution(amrex::Array1D& u_c, #endif // term for calculating u_c - gamma = std::pow(zion[n], 5.0_rt/3.0_rt) * Gamma_e; + gamma = std::cbrt(amrex::Math::powi<5>(zion[n])) * Gamma_e; // chemical potential for coulomb correction // see appendix of Calder 2007, doi:10.1086/510709 for more detail @@ -146,12 +147,13 @@ void apply_nse_exponent(T& nse_state, // the temperature that comes in through T_fixed amrex::Real T_in = nse_state.T_fixed > 0.0_rt ? nse_state.T_fixed : nse_state.T; + amrex::Real ikTMeV = C::Legacy::MeV2erg / (C::k_B * T_in); amrex::Real exponent; for (int n = 0; n < NumSpec; ++n) { #ifdef NEW_NETWORK_IMPLEMENTATION if (n == NSE_INDEX::H1_index) { - nse_state.xn[n] = 0.0; + nse_state.xn[n] = 0.0_rt; continue; } #endif @@ -163,8 +165,8 @@ void apply_nse_exponent(T& nse_state, exponent = amrex::min(500.0_rt, (zion[n] * nse_state.mu_p + (aion[n] - zion[n]) * - nse_state.mu_n + network::bion(n+1)) / - C::k_B / T_in * C::Legacy::MeV2erg - u_c(n+1)); + nse_state.mu_n + network::bion(n+1)) * + ikTMeV - u_c(n+1)); nse_state.xn[n] *= std::exp(exponent); } @@ -210,6 +212,7 @@ void fcn(amrex::Array1D& x, amrex::Array1D } #endif // constraint equation 1, mass fraction sum to 1 + // since we're using rhoX, make it sum to rho fvec(1) += nse_state.xn[n]; } @@ -247,6 +250,7 @@ void jcn(amrex::Array1D& x, amrex::Array2D 0.0_rt ? nse_state.T_fixed : nse_state.T; + amrex::Real ikTMeV = C::Legacy::MeV2erg / (C::k_B * T_in); for (int n = 0; n < NumSpec; ++n) { #ifdef NEW_NETWORK_IMPLEMENTATION @@ -254,10 +258,10 @@ void jcn(amrex::Array1D& x, amrex::Array2D state_data = {state, {0.0_rt}}; @@ -557,6 +559,12 @@ T get_actual_nse_state(T& state, amrex::Real eps=1.0e-10_rt, state.mu_p = state_data.state.mu_p; state.mu_n = state_data.state.mu_n; + // update rhoX in the output nse_state + + for (int n = 0; n < NumSpec; ++n) { + state_data.state.y[SFS+n] = state.rho * state_data.state.xn[n]; + } + return state_data.state; } #endif diff --git a/unit_test/test_ase/GNUmakefile b/unit_test/test_ase/GNUmakefile index 7541c54f5e..40fbba79ce 100644 --- a/unit_test/test_ase/GNUmakefile +++ b/unit_test/test_ase/GNUmakefile @@ -28,10 +28,11 @@ NETWORK_DIR := ase CONDUCTIVITY_DIR := stellar SCREEN_METHOD := chabrier1998 - #SCREEN_METHOD := null #SCREEN_METHOD := chugunov2007 +USE_SIMPLIFIED_SDC = TRUE + INTEGRATOR_DIR = VODE EXTERN_SEARCH += . @@ -40,5 +41,3 @@ Bpack := ./Make.package Blocs := . include $(MICROPHYSICS_HOME)/unit_test/Make.unit_test - - diff --git a/unit_test/test_ase/burn_cell.H b/unit_test/test_ase/burn_cell.H index d9279653a8..196684312c 100644 --- a/unit_test/test_ase/burn_cell.H +++ b/unit_test/test_ase/burn_cell.H @@ -50,12 +50,12 @@ void burn_cell_c() std::cout << short_spec_names_cxx[n] << " : " << NSE_STATE.xn[n] << std::endl; } - // Let state.xn equal to nse_state.xn to make sure its in nse state + // Let state.y equal to nse_state.y to make sure its in nse state + for (int n = 0; n < NumSpec; ++n){ - state.xn[n] = NSE_STATE.xn[n]; + state.y[SFS+n] = NSE_STATE.y[SFS+n]; } - // get eos //eos(eos_input_rt, state); diff --git a/unit_test/test_ase/ci-benchmarks/ase_nse_net_unit_test.out b/unit_test/test_ase/ci-benchmarks/ase_nse_net_unit_test.out index bd6ed56539..18e17a9981 100644 --- a/unit_test/test_ase/ci-benchmarks/ase_nse_net_unit_test.out +++ b/unit_test/test_ase/ci-benchmarks/ase_nse_net_unit_test.out @@ -8,28 +8,28 @@ State Density (g/cm^3): 10000000 State Temperature (K): 6000000000 electron fraction is 0.5 NSE state: -n : 0.0006075693495 -H1 : 0.001992432534 -He4 : 0.519007877 -C12 : 1.326102e-05 -N13 : 9.477376691e-11 -N14 : 2.565486854e-09 -O16 : 3.225455246e-05 -F18 : 5.422064179e-11 -Ne20 : 7.427509432e-07 -Ne21 : 4.998912611e-08 -Na22 : 2.608008186e-09 -Na23 : 1.00884295e-06 -Mg24 : 0.0001022222509 -Al27 : 0.0005548826609 -Si28 : 0.03680966846 -P31 : 0.04229223791 -S32 : 0.03865771985 -Ar36 : 0.02464742443 -Ca40 : 0.02885152622 -Ti44 : 0.00166123105 -Cr48 : 0.009967017598 -Fe52 : 0.05968005236 -Ni56 : 0.2351208159 +n : 0.000607569351 +H1 : 0.001992432526 +He4 : 0.5190078752 +C12 : 1.326101988e-05 +N13 : 9.477376579e-11 +N14 : 2.56548683e-09 +O16 : 3.225455214e-05 +F18 : 5.422064122e-11 +Ne20 : 7.427509352e-07 +Ne21 : 4.99891257e-08 +Na22 : 2.608008157e-09 +Na23 : 1.008842941e-06 +Mg24 : 0.0001022222498 +Al27 : 0.0005548826564 +Si28 : 0.03680966808 +P31 : 0.0422922376 +S32 : 0.0386577195 +Ar36 : 0.02464742425 +Ca40 : 0.0288515261 +Ti44 : 0.001661231048 +Cr48 : 0.009967017622 +Fe52 : 0.05968005276 +Ni56 : 0.2351208186 We're in NSE. AMReX (23.07-395-ge6c93bf22695) finalized diff --git a/unit_test/test_ase/make_table/GNUmakefile b/unit_test/test_ase/make_table/GNUmakefile index b5367446a5..4634728fca 100644 --- a/unit_test/test_ase/make_table/GNUmakefile +++ b/unit_test/test_ase/make_table/GNUmakefile @@ -29,6 +29,8 @@ NETWORK_DIR := ase SCREEN_METHOD := chabrier1998 +USE_SIMPLIFIED_SDC = TRUE + CONDUCTIVITY_DIR := stellar INTEGRATOR_DIR = VODE @@ -39,5 +41,3 @@ Bpack := ./Make.package Blocs := . include $(MICROPHYSICS_HOME)/unit_test/Make.unit_test - - diff --git a/unit_test/test_ase/make_table/burn_cell.H b/unit_test/test_ase/make_table/burn_cell.H index 168ac8cdc7..886338bf59 100644 --- a/unit_test/test_ase/make_table/burn_cell.H +++ b/unit_test/test_ase/make_table/burn_cell.H @@ -33,17 +33,16 @@ void burn_cell_c() amrex::Real T = std::pow(10.0, std::log10(T_min) + itemp * dlogT); amrex::Real rho = std::pow(10.0, std::log10(rho_min) + irho * dlogrho); amrex::Real Ye = Ye_min + iye * dYe; - state.T = T; state.rho = rho; state.y_e = Ye; if (state.y_e > 0.52_rt){ - state.mu_p = -1.0_rt; - state.mu_n = -16.0_rt; + state.mu_p = -4.0_rt; + state.mu_n = -14.0_rt; } else if (state.y_e > 0.48_rt){ - state.mu_p = -6.0_rt; + state.mu_p = -8.0_rt; state.mu_n = -11.0_rt; } else if (state.y_e > 0.4_rt){ @@ -51,8 +50,8 @@ void burn_cell_c() state.mu_n = -7.0_rt; } else{ - state.mu_p = -18.0; - state.mu_n = -1.0; + state.mu_p = -15.0_rt; + state.mu_n = -5.0_rt; } // find the nse state @@ -65,7 +64,7 @@ void burn_cell_c() auto nse_state = get_actual_nse_state(state, eps, assume_ye_is_valid); for (int i = 0; i < NumSpec; ++i){ - state.xn[i] = nse_state.xn[i]; + state.y[SFS+i] = nse_state.y[SFS+i]; } bool in_nse_state = in_nse(state); diff --git a/unit_test/test_ase/make_table/ci-benchmarks/ase_nse_net_make_table_unit_test.out b/unit_test/test_ase/make_table/ci-benchmarks/ase_nse_net_make_table_unit_test.out index 18a8c9846f..7ec0293319 100644 --- a/unit_test/test_ase/make_table/ci-benchmarks/ase_nse_net_make_table_unit_test.out +++ b/unit_test/test_ase/make_table/ci-benchmarks/ase_nse_net_make_table_unit_test.out @@ -2,354 +2,354 @@ Initializing AMReX (23.07-395-ge6c93bf22695)... AMReX (23.07-395-ge6c93bf22695) initialized starting the single zone burn... reading in network electron-capture / beta-decay tables... - 1.0000000000e+06 4.0000000000e+09 0.4000000000 -12.9555025202 -4.7372062842 0 - 1.0000000000e+06 4.4286927156e+09 0.4000000000 -12.4096892933 -5.3017297034 1 - 1.0000000000e+06 4.9033297922e+09 0.4000000000 -11.8124863348 -5.9247157509 1 - 1.0000000000e+06 5.4288352332e+09 0.4000000000 -11.2186398048 -6.5894751704 1 - 1.0000000000e+06 6.0106607628e+09 0.4000000000 -10.8221627699 -7.3603511110 1 + 1.0000000000e+06 4.0000000000e+09 0.4000000000 -12.9555025204 -4.7372062842 0 + 1.0000000000e+06 4.4286927156e+09 0.4000000000 -12.4096892935 -5.3017297034 1 + 1.0000000000e+06 4.9033297922e+09 0.4000000000 -11.8124863350 -5.9247157509 1 + 1.0000000000e+06 5.4288352332e+09 0.4000000000 -11.2186398049 -6.5894751704 1 + 1.0000000000e+06 6.0106607628e+09 0.4000000000 -10.8221627699 -7.3603511111 1 1.0000000000e+06 6.6548423840e+09 0.4000000000 -10.4363763722 -8.2252373664 1 1.0000000000e+06 7.3680629973e+09 0.4000000000 -10.1445056150 -9.0849662772 1 1.0000000000e+06 8.1577217310e+09 0.4000000000 -10.2582950656 -9.7983309243 1 1.0000000000e+06 9.0320107014e+09 0.4000000000 -11.0251962339 -10.7011623998 1 1.0000000000e+06 1.0000000000e+10 0.4000000000 -12.3061952746 -11.9583139126 1 - 1.0000000000e+07 4.0000000000e+09 0.4000000000 -13.7539410029 -3.9436985166 0 - 1.0000000000e+07 4.4286927156e+09 0.4000000000 -13.2910063983 -4.4245064972 1 - 1.0000000000e+07 4.9033297922e+09 0.4000000000 -12.7738571042 -4.9622430425 1 - 1.0000000000e+07 5.4288352332e+09 0.4000000000 -12.2022519651 -5.5597835137 1 - 1.0000000000e+07 6.0106607628e+09 0.4000000000 -11.5968451663 -6.2091582807 1 - 1.0000000000e+07 6.6548423840e+09 0.4000000000 -11.0838653205 -6.9172956472 1 + 1.0000000000e+07 4.0000000000e+09 0.4000000000 -13.7539410035 -3.9436985166 0 + 1.0000000000e+07 4.4286927156e+09 0.4000000000 -13.2910063988 -4.4245064973 1 + 1.0000000000e+07 4.9033297922e+09 0.4000000000 -12.7738571048 -4.9622430425 1 + 1.0000000000e+07 5.4288352332e+09 0.4000000000 -12.2022519657 -5.5597835137 1 + 1.0000000000e+07 6.0106607628e+09 0.4000000000 -11.5968451667 -6.2091582807 1 + 1.0000000000e+07 6.6548423840e+09 0.4000000000 -11.0838653206 -6.9172956472 1 1.0000000000e+07 7.3680629973e+09 0.4000000000 -10.7117195040 -7.7493017684 1 1.0000000000e+07 8.1577217310e+09 0.4000000000 -10.3608224687 -8.6311809609 1 - 1.0000000000e+07 9.0320107014e+09 0.4000000000 -10.2512028838 -9.4182840029 1 - 1.0000000000e+07 1.0000000000e+10 0.4000000000 -10.6008153727 -10.1495273727 1 - 1.0000000000e+08 4.0000000000e+09 0.4000000000 -14.5607973473 -3.1500296845 0 - 1.0000000000e+08 4.4286927156e+09 0.4000000000 -14.1824332319 -3.5459083093 1 - 1.0000000000e+08 4.9033297922e+09 0.4000000000 -13.7577662165 -3.9903922193 1 - 1.0000000000e+08 5.4288352332e+09 0.4000000000 -13.2819583479 -4.4889815353 1 - 1.0000000000e+08 6.0106607628e+09 0.4000000000 -12.7514980401 -5.0464198084 1 - 1.0000000000e+08 6.6548423840e+09 0.4000000000 -12.1712468684 -5.6630196539 1 - 1.0000000000e+08 7.3680629973e+09 0.4000000000 -11.5722427309 -6.3289690262 1 - 1.0000000000e+08 8.1577217310e+09 0.4000000000 -11.0954919154 -7.0732199085 1 - 1.0000000000e+08 9.0320107014e+09 0.4000000000 -10.7313790717 -7.9307043937 1 - 1.0000000000e+08 1.0000000000e+10 0.4000000000 -10.4459234785 -8.7985272846 1 - 1.0000000000e+09 4.0000000000e+09 0.4000000000 -15.3871516209 -2.3563444183 0 - 1.0000000000e+09 4.4286927156e+09 0.4000000000 -15.0933118549 -2.6671723129 1 - 1.0000000000e+09 4.9033297922e+09 0.4000000000 -14.7621490218 -3.0175641914 1 - 1.0000000000e+09 5.4288352332e+09 0.4000000000 -14.3892566375 -3.4124048451 1 - 1.0000000000e+09 6.0106607628e+09 0.4000000000 -13.9696328300 -3.8570453479 1 - 1.0000000000e+09 6.6548423840e+09 0.4000000000 -13.4990892428 -4.3569663734 1 - 1.0000000000e+09 7.3680629973e+09 0.4000000000 -12.9751070003 -4.9165801597 1 - 1.0000000000e+09 8.1577217310e+09 0.4000000000 -12.4029615892 -5.5362921581 1 - 1.0000000000e+09 9.0320107014e+09 0.4000000000 -11.8075492526 -6.2097916682 1 - 1.0000000000e+09 1.0000000000e+10 0.4000000000 -11.2831770765 -6.9503077457 1 - 1.0000000000e+10 4.0000000000e+09 0.4000000000 -16.2582598091 -1.5626567041 0 - 1.0000000000e+10 4.4286927156e+09 0.4000000000 -16.0486738742 -1.7884208125 1 - 1.0000000000e+10 4.9033297922e+09 0.4000000000 -15.8108280364 -2.0446360334 1 - 1.0000000000e+10 5.4288352332e+09 0.4000000000 -15.5412395104 -2.3352407233 1 - 1.0000000000e+10 6.0106607628e+09 0.4000000000 -15.2357440910 -2.6646600961 1 - 1.0000000000e+10 6.6548423840e+09 0.4000000000 -14.8903553197 -3.0378300140 1 - 1.0000000000e+10 7.3680629973e+09 0.4000000000 -14.5003230698 -3.4601446829 1 - 1.0000000000e+10 8.1577217310e+09 0.4000000000 -14.0614570074 -3.9371817305 1 - 1.0000000000e+10 9.0320107014e+09 0.4000000000 -13.5711724139 -4.4739432697 1 - 1.0000000000e+10 1.0000000000e+10 0.4000000000 -13.0312175088 -5.0733655762 1 - 1.0000000000e+06 4.0000000000e+09 0.4500000000 -12.6199618051 -5.0493825987 0 - 1.0000000000e+06 4.4286927156e+09 0.4500000000 -12.0411581959 -5.6445822151 1 - 1.0000000000e+06 4.9033297922e+09 0.4500000000 -11.4232312197 -6.2868479094 1 - 1.0000000000e+06 5.4288352332e+09 0.4500000000 -10.8518428397 -6.9298657583 1 + 1.0000000000e+07 9.0320107014e+09 0.4000000000 -10.2512028838 -9.4182840030 1 + 1.0000000000e+07 1.0000000000e+10 0.4000000000 -10.6008153728 -10.1495273727 1 + 1.0000000000e+08 4.0000000000e+09 0.4000000000 -14.5607973487 -3.1500296846 0 + 1.0000000000e+08 4.4286927156e+09 0.4000000000 -14.1824332333 -3.5459083093 1 + 1.0000000000e+08 4.9033297922e+09 0.4000000000 -13.7577662180 -3.9903922193 1 + 1.0000000000e+08 5.4288352332e+09 0.4000000000 -13.2819583494 -4.4889815352 1 + 1.0000000000e+08 6.0106607628e+09 0.4000000000 -12.7514980414 -5.0464198084 1 + 1.0000000000e+08 6.6548423840e+09 0.4000000000 -12.1712468695 -5.6630196541 1 + 1.0000000000e+08 7.3680629973e+09 0.4000000000 -11.5722427319 -6.3289690263 1 + 1.0000000000e+08 8.1577217310e+09 0.4000000000 -11.0954919155 -7.0732199085 1 + 1.0000000000e+08 9.0320107014e+09 0.4000000000 -10.7313790718 -7.9307043937 1 + 1.0000000000e+08 1.0000000000e+10 0.4000000000 -10.4459234786 -8.7985272846 1 + 1.0000000000e+09 4.0000000000e+09 0.4000000000 -15.3871516246 -2.3563444183 0 + 1.0000000000e+09 4.4286927156e+09 0.4000000000 -15.0933118585 -2.6671723129 1 + 1.0000000000e+09 4.9033297922e+09 0.4000000000 -14.7621490253 -3.0175641915 1 + 1.0000000000e+09 5.4288352332e+09 0.4000000000 -14.3892566411 -3.4124048451 1 + 1.0000000000e+09 6.0106607628e+09 0.4000000000 -13.9696328335 -3.8570453479 1 + 1.0000000000e+09 6.6548423840e+09 0.4000000000 -13.4990892461 -4.3569663734 1 + 1.0000000000e+09 7.3680629973e+09 0.4000000000 -12.9751070035 -4.9165801598 1 + 1.0000000000e+09 8.1577217310e+09 0.4000000000 -12.4029615922 -5.5362921583 1 + 1.0000000000e+09 9.0320107014e+09 0.4000000000 -11.8075492548 -6.2097916688 1 + 1.0000000000e+09 1.0000000000e+10 0.4000000000 -11.2831770772 -6.9503077459 1 + 1.0000000000e+10 4.0000000000e+09 0.4000000000 -16.2582598176 -1.5626567041 0 + 1.0000000000e+10 4.4286927156e+09 0.4000000000 -16.0486738826 -1.7884208125 1 + 1.0000000000e+10 4.9033297922e+09 0.4000000000 -15.8108280448 -2.0446360334 1 + 1.0000000000e+10 5.4288352332e+09 0.4000000000 -15.5412395186 -2.3352407233 1 + 1.0000000000e+10 6.0106607628e+09 0.4000000000 -15.2357440992 -2.6646600961 1 + 1.0000000000e+10 6.6548423840e+09 0.4000000000 -14.8903553277 -3.0378300141 1 + 1.0000000000e+10 7.3680629973e+09 0.4000000000 -14.5003230778 -3.4601446829 1 + 1.0000000000e+10 8.1577217310e+09 0.4000000000 -14.0614570153 -3.9371817304 1 + 1.0000000000e+10 9.0320107014e+09 0.4000000000 -13.5711724217 -4.4739432697 1 + 1.0000000000e+10 1.0000000000e+10 0.4000000000 -13.0312175162 -5.0733655763 1 + 1.0000000000e+06 4.0000000000e+09 0.4500000000 -12.6199618053 -5.0493825987 0 + 1.0000000000e+06 4.4286927156e+09 0.4500000000 -12.0411581961 -5.6445822151 1 + 1.0000000000e+06 4.9033297922e+09 0.4500000000 -11.4232312199 -6.2868479094 1 + 1.0000000000e+06 5.4288352332e+09 0.4500000000 -10.8518428398 -6.9298657584 1 1.0000000000e+06 6.0106607628e+09 0.4500000000 -10.4348708730 -7.7172921982 1 - 1.0000000000e+06 6.6548423840e+09 0.4500000000 -10.0424621870 -8.5877955647 1 + 1.0000000000e+06 6.6548423840e+09 0.4500000000 -10.0424621871 -8.5877955647 1 1.0000000000e+06 7.3680629973e+09 0.4500000000 -9.8849946892 -9.3214605955 1 1.0000000000e+06 8.1577217310e+09 0.4500000000 -10.1350747780 -9.9053651295 1 1.0000000000e+06 9.0320107014e+09 0.4500000000 -10.9317730375 -10.7720016856 1 1.0000000000e+06 1.0000000000e+10 0.4500000000 -12.2046629248 -12.0333675970 1 - 1.0000000000e+07 4.0000000000e+09 0.4500000000 -13.4182964403 -4.2562148091 0 - 1.0000000000e+07 4.4286927156e+09 0.4500000000 -12.9196141763 -4.7702516152 1 - 1.0000000000e+07 4.9033297922e+09 0.4500000000 -12.3646700488 -5.3431239685 1 - 1.0000000000e+07 5.4288352332e+09 0.4500000000 -11.7607919859 -5.9706982948 1 - 1.0000000000e+07 6.0106607628e+09 0.4500000000 -11.1529755125 -6.6222947523 1 - 1.0000000000e+07 6.6548423840e+09 0.4500000000 -10.6533363164 -7.3144541389 1 + 1.0000000000e+07 4.0000000000e+09 0.4500000000 -13.4182964409 -4.2562148091 0 + 1.0000000000e+07 4.4286927156e+09 0.4500000000 -12.9196141769 -4.7702516152 1 + 1.0000000000e+07 4.9033297922e+09 0.4500000000 -12.3646700494 -5.3431239685 1 + 1.0000000000e+07 5.4288352332e+09 0.4500000000 -11.7607919864 -5.9706982948 1 + 1.0000000000e+07 6.0106607628e+09 0.4500000000 -11.1529755129 -6.6222947524 1 + 1.0000000000e+07 6.6548423840e+09 0.4500000000 -10.6533363165 -7.3144541390 1 1.0000000000e+07 7.3680629973e+09 0.4500000000 -10.2538115130 -8.1710937198 1 1.0000000000e+07 8.1577217310e+09 0.4500000000 -9.9753897162 -8.9845986143 1 - 1.0000000000e+07 9.0320107014e+09 0.4500000000 -10.0361542054 -9.6115697957 1 - 1.0000000000e+07 1.0000000000e+10 0.4500000000 -10.4770937073 -10.2529776198 1 - 1.0000000000e+08 4.0000000000e+09 0.4500000000 -14.2257599744 -3.4625787946 0 - 1.0000000000e+08 4.4286927156e+09 0.4500000000 -13.8113628832 -3.8919431610 1 - 1.0000000000e+08 4.9033297922e+09 0.4500000000 -13.3469605423 -4.3733521392 1 - 1.0000000000e+08 5.4288352332e+09 0.4500000000 -12.8281601546 -4.9118963225 1 - 1.0000000000e+08 6.0106607628e+09 0.4500000000 -12.2549827756 -5.5090675692 1 - 1.0000000000e+08 6.6548423840e+09 0.4500000000 -11.6452553278 -6.1532183845 1 - 1.0000000000e+08 7.3680629973e+09 0.4500000000 -11.0519169738 -6.8138046104 1 - 1.0000000000e+08 8.1577217310e+09 0.4500000000 -10.5744119694 -7.5537001210 1 + 1.0000000000e+07 9.0320107014e+09 0.4500000000 -10.0361542054 -9.6115697958 1 + 1.0000000000e+07 1.0000000000e+10 0.4500000000 -10.4770937073 -10.2529776199 1 + 1.0000000000e+08 4.0000000000e+09 0.4500000000 -14.2257599760 -3.4625787945 0 + 1.0000000000e+08 4.4286927156e+09 0.4500000000 -13.8113628847 -3.8919431610 1 + 1.0000000000e+08 4.9033297922e+09 0.4500000000 -13.3469605437 -4.3733521393 1 + 1.0000000000e+08 5.4288352332e+09 0.4500000000 -12.8281601561 -4.9118963225 1 + 1.0000000000e+08 6.0106607628e+09 0.4500000000 -12.2549827771 -5.5090675693 1 + 1.0000000000e+08 6.6548423840e+09 0.4500000000 -11.6452553291 -6.1532183846 1 + 1.0000000000e+08 7.3680629973e+09 0.4500000000 -11.0519169747 -6.8138046108 1 + 1.0000000000e+08 8.1577217310e+09 0.4500000000 -10.5744119695 -7.5537001211 1 1.0000000000e+08 9.0320107014e+09 0.4500000000 -10.2097691952 -8.4106502242 1 1.0000000000e+08 1.0000000000e+10 0.4500000000 -10.0527955898 -9.1577337848 1 - 1.0000000000e+09 4.0000000000e+09 0.4500000000 -15.0536228361 -2.6688948469 0 - 1.0000000000e+09 4.4286927156e+09 0.4500000000 -14.7237134035 -3.0132309283 1 - 1.0000000000e+09 4.9033297922e+09 0.4500000000 -14.3526160830 -3.4007197563 1 - 1.0000000000e+09 5.4288352332e+09 0.4500000000 -13.9355877601 -3.8365577468 1 - 1.0000000000e+09 6.0106607628e+09 0.4500000000 -13.4675881527 -4.3261360138 1 - 1.0000000000e+09 6.6548423840e+09 0.4500000000 -12.9456617289 -4.8738185709 1 - 1.0000000000e+09 7.3680629973e+09 0.4500000000 -12.3724764750 -5.4792958153 1 - 1.0000000000e+09 8.1577217310e+09 0.4500000000 -11.7661588527 -6.1311892901 1 - 1.0000000000e+09 9.0320107014e+09 0.4500000000 -11.1668612108 -6.8085657270 1 - 1.0000000000e+09 1.0000000000e+10 0.4500000000 -10.6512855619 -7.5351949181 1 - 1.0000000000e+10 4.0000000000e+09 0.4500000000 -15.9281485212 -1.8752022449 0 - 1.0000000000e+10 4.4286927156e+09 0.4500000000 -15.6824856056 -2.1344670415 1 - 1.0000000000e+10 4.9033297922e+09 0.4500000000 -15.4047001726 -2.4277705489 1 - 1.0000000000e+10 5.4288352332e+09 0.4500000000 -15.0909188309 -2.7594143274 1 - 1.0000000000e+10 6.0106607628e+09 0.4500000000 -14.7366091017 -3.1341694060 1 - 1.0000000000e+10 6.6548423840e+09 0.4500000000 -14.3375648595 -3.5571890306 1 - 1.0000000000e+10 7.3680629973e+09 0.4500000000 -13.8893261386 -4.0336347956 1 - 1.0000000000e+10 8.1577217310e+09 0.4500000000 -13.3893312881 -4.5676563223 1 - 1.0000000000e+10 9.0320107014e+09 0.4500000000 -12.8393727491 -5.1603436520 1 - 1.0000000000e+10 1.0000000000e+10 0.4500000000 -12.2492192264 -5.8073345687 1 - 1.0000000000e+06 4.0000000000e+09 0.5000000000 -8.0664287239 -9.4890300703 0 - 1.0000000000e+06 4.4286927156e+09 0.5000000000 -8.2111123603 -9.3757297497 1 - 1.0000000000e+06 4.9033297922e+09 0.5000000000 -8.3918399879 -9.2344583805 1 - 1.0000000000e+06 5.4288352332e+09 0.5000000000 -8.7773708533 -8.9447667659 1 + 1.0000000000e+09 4.0000000000e+09 0.4500000000 -15.0536228396 -2.6688948472 0 + 1.0000000000e+09 4.4286927156e+09 0.4500000000 -14.7237134072 -3.0132309283 1 + 1.0000000000e+09 4.9033297922e+09 0.4500000000 -14.3526160867 -3.4007197563 1 + 1.0000000000e+09 5.4288352332e+09 0.4500000000 -13.9355877638 -3.8365577467 1 + 1.0000000000e+09 6.0106607628e+09 0.4500000000 -13.4675881563 -4.3261360138 1 + 1.0000000000e+09 6.6548423840e+09 0.4500000000 -12.9456617325 -4.8738185708 1 + 1.0000000000e+09 7.3680629973e+09 0.4500000000 -12.3724764785 -5.4792958152 1 + 1.0000000000e+09 8.1577217310e+09 0.4500000000 -11.7661588560 -6.1311892901 1 + 1.0000000000e+09 9.0320107014e+09 0.4500000000 -11.1668612132 -6.8085657276 1 + 1.0000000000e+09 1.0000000000e+10 0.4500000000 -10.6512855625 -7.5351949184 1 + 1.0000000000e+10 4.0000000000e+09 0.4500000000 -15.9281485305 -1.8752022445 0 + 1.0000000000e+10 4.4286927156e+09 0.4500000000 -15.6824856145 -2.1344670415 1 + 1.0000000000e+10 4.9033297922e+09 0.4500000000 -15.4047001813 -2.4277705489 1 + 1.0000000000e+10 5.4288352332e+09 0.4500000000 -15.0909188396 -2.7594143274 1 + 1.0000000000e+10 6.0106607628e+09 0.4500000000 -14.7366091103 -3.1341694060 1 + 1.0000000000e+10 6.6548423840e+09 0.4500000000 -14.3375648682 -3.5571890304 1 + 1.0000000000e+10 7.3680629973e+09 0.4500000000 -13.8893261475 -4.0336347952 1 + 1.0000000000e+10 8.1577217310e+09 0.4500000000 -13.3893312974 -4.5676563215 1 + 1.0000000000e+10 9.0320107014e+09 0.4500000000 -12.8393727587 -5.1603436508 1 + 1.0000000000e+10 1.0000000000e+10 0.4500000000 -12.2492192359 -5.8073345674 1 + 1.0000000000e+06 4.0000000000e+09 0.5000000000 -8.0664287063 -9.4890300885 0 + 1.0000000000e+06 4.4286927156e+09 0.5000000000 -8.2111123981 -9.3757297125 1 + 1.0000000000e+06 4.9033297922e+09 0.5000000000 -8.3918399895 -9.2344583793 1 + 1.0000000000e+06 5.4288352332e+09 0.5000000000 -8.7773708532 -8.9447667662 1 1.0000000000e+06 6.0106607628e+09 0.5000000000 -9.0637265807 -9.0647441208 1 1.0000000000e+06 6.6548423840e+09 0.5000000000 -9.3058731093 -9.3070059375 1 1.0000000000e+06 7.3680629973e+09 0.5000000000 -9.5983915599 -9.5996554213 1 1.0000000000e+06 8.1577217310e+09 0.5000000000 -10.0168541391 -10.0182626012 1 1.0000000000e+06 9.0320107014e+09 0.5000000000 -10.8474197344 -10.8489878418 1 - 1.0000000000e+06 1.0000000000e+10 0.5000000000 -12.1138199091 -12.1155643414 1 - 1.0000000000e+07 4.0000000000e+09 0.5000000000 -7.8839110912 -9.6536804797 0 - 1.0000000000e+07 4.4286927156e+09 0.5000000000 -8.0019179846 -9.5630334178 1 - 1.0000000000e+07 4.9033297922e+09 0.5000000000 -8.1354122155 -9.4609849129 1 - 1.0000000000e+07 5.4288352332e+09 0.5000000000 -8.2961986053 -9.3384887122 1 - 1.0000000000e+07 6.0106607628e+09 0.5000000000 -8.5443326059 -9.1484326222 1 - 1.0000000000e+07 6.6548423840e+09 0.5000000000 -8.9669523913 -8.9714790675 1 - 1.0000000000e+07 7.3680629973e+09 0.5000000000 -9.2004322393 -9.2015703723 1 + 1.0000000000e+06 1.0000000000e+10 0.5000000000 -12.1138199092 -12.1155643414 1 + 1.0000000000e+07 4.0000000000e+09 0.5000000000 -7.8839123533 -9.6536792188 0 + 1.0000000000e+07 4.4286927156e+09 0.5000000000 -8.0019180002 -9.5630334034 1 + 1.0000000000e+07 4.9033297922e+09 0.5000000000 -8.1354121681 -9.4609849615 1 + 1.0000000000e+07 5.4288352332e+09 0.5000000000 -8.2961986080 -9.3384887105 1 + 1.0000000000e+07 6.0106607628e+09 0.5000000000 -8.5443326081 -9.1484326209 1 + 1.0000000000e+07 6.6548423840e+09 0.5000000000 -8.9669523913 -8.9714790676 1 + 1.0000000000e+07 7.3680629973e+09 0.5000000000 -9.2004322394 -9.2015703723 1 1.0000000000e+07 8.1577217310e+09 0.5000000000 -9.4726257222 -9.4739144064 1 1.0000000000e+07 9.0320107014e+09 0.5000000000 -9.8194771269 -9.8209313702 1 1.0000000000e+07 1.0000000000e+10 0.5000000000 -10.3609081088 -10.3625443016 1 - 1.0000000000e+08 4.0000000000e+09 0.5000000000 -7.7564252814 -9.7786841044 0 - 1.0000000000e+08 4.4286927156e+09 0.5000000000 -7.8492022509 -9.7096714074 1 - 1.0000000000e+08 4.9033297922e+09 0.5000000000 -7.9527960406 -9.6330305743 1 - 1.0000000000e+08 5.4288352332e+09 0.5000000000 -8.0692464283 -9.5476093499 1 - 1.0000000000e+08 6.0106607628e+09 0.5000000000 -8.2063900231 -9.4473474699 1 - 1.0000000000e+08 6.6548423840e+09 0.5000000000 -8.3860213855 -9.3159021691 1 - 1.0000000000e+08 7.3680629973e+09 0.5000000000 -8.6892088458 -9.0970021782 1 + 1.0000000000e+08 4.0000000000e+09 0.5000000000 -7.7564252605 -9.7786841281 0 + 1.0000000000e+08 4.4286927156e+09 0.5000000000 -7.8492019112 -9.7096717498 1 + 1.0000000000e+08 4.9033297922e+09 0.5000000000 -7.9527961073 -9.6330305105 1 + 1.0000000000e+08 5.4288352332e+09 0.5000000000 -8.0692464391 -9.5476093419 1 + 1.0000000000e+08 6.0106607628e+09 0.5000000000 -8.2063900317 -9.4473474639 1 + 1.0000000000e+08 6.6548423840e+09 0.5000000000 -8.3860213927 -9.3159021644 1 + 1.0000000000e+08 7.3680629973e+09 0.5000000000 -8.6892088477 -9.0970021780 1 1.0000000000e+08 8.1577217310e+09 0.5000000000 -9.0475207044 -9.0501554594 1 - 1.0000000000e+08 9.0320107014e+09 0.5000000000 -9.2986740371 -9.2997699354 1 - 1.0000000000e+08 1.0000000000e+10 0.5000000000 -9.5981877902 -9.5994826015 1 - 1.0000000000e+09 4.0000000000e+09 0.5000000000 -7.7470629179 -9.8201516603 0 - 1.0000000000e+09 4.4286927156e+09 0.5000000000 -7.8147769063 -9.7725305533 1 - 1.0000000000e+09 4.9033297922e+09 0.5000000000 -7.8899687970 -9.7201023871 1 - 1.0000000000e+09 5.4288352332e+09 0.5000000000 -7.9729788592 -9.6630648482 1 - 1.0000000000e+09 6.0106607628e+09 0.5000000000 -8.0659661802 -9.5999366178 1 - 1.0000000000e+09 6.6548423840e+09 0.5000000000 -8.1710732359 -9.5300539756 1 - 1.0000000000e+09 7.3680629973e+09 0.5000000000 -8.2980124985 -9.4462720725 1 - 1.0000000000e+09 8.1577217310e+09 0.5000000000 -8.4687660241 -9.3330282394 1 - 1.0000000000e+09 9.0320107014e+09 0.5000000000 -8.7320500817 -9.1630033340 1 - 1.0000000000e+09 1.0000000000e+10 0.5000000000 -9.0632943617 -9.0828318755 1 - 1.0000000000e+10 4.0000000000e+09 0.5000000000 -7.9880016295 -9.6879405752 1 - 1.0000000000e+10 4.4286927156e+09 0.5000000000 -8.0302317824 -9.6619334095 1 - 1.0000000000e+10 4.9033297922e+09 0.5000000000 -8.0763342363 -9.6342682341 1 - 1.0000000000e+10 5.4288352332e+09 0.5000000000 -8.1258456519 -9.6058178278 1 - 1.0000000000e+10 6.0106607628e+09 0.5000000000 -8.1795079441 -9.5762500117 1 - 1.0000000000e+10 6.6548423840e+09 0.5000000000 -8.2365071577 -9.5472468447 1 - 1.0000000000e+10 7.3680629973e+09 0.5000000000 -8.2988571017 -9.5177368528 1 - 1.0000000000e+10 8.1577217310e+09 0.5000000000 -8.3695493035 -9.4863947395 1 - 1.0000000000e+10 9.0320107014e+09 0.5000000000 -8.4559430779 -9.4487939792 1 - 1.0000000000e+10 1.0000000000e+10 0.5000000000 -8.5723778963 -9.3960835685 1 - 1.0000000000e+06 4.0000000000e+09 0.5500000000 -4.9263567583 -12.6306847766 0 - 1.0000000000e+06 4.4286927156e+09 0.5500000000 -5.5125982823 -12.0759967428 1 - 1.0000000000e+06 4.9033297922e+09 0.5500000000 -6.1679059616 -11.4605293762 1 - 1.0000000000e+06 5.4288352332e+09 0.5500000000 -6.9002510954 -10.8361899605 1 - 1.0000000000e+06 6.0106607628e+09 0.5500000000 -7.7162795920 -10.4358987388 1 - 1.0000000000e+06 6.6548423840e+09 0.5500000000 -8.5866665411 -10.0436084114 1 + 1.0000000000e+08 9.0320107014e+09 0.5000000000 -9.2986740372 -9.2997699354 1 + 1.0000000000e+08 1.0000000000e+10 0.5000000000 -9.5981877903 -9.5994826015 1 + 1.0000000000e+09 4.0000000000e+09 0.5000000000 -7.7470638015 -9.8201507833 0 + 1.0000000000e+09 4.4286927156e+09 0.5000000000 -7.8147769492 -9.7725305169 1 + 1.0000000000e+09 4.9033297922e+09 0.5000000000 -7.8899734067 -9.7200977838 1 + 1.0000000000e+09 5.4288352332e+09 0.5000000000 -7.9729788613 -9.6630648524 1 + 1.0000000000e+09 6.0106607628e+09 0.5000000000 -8.0659663127 -9.5999364916 1 + 1.0000000000e+09 6.6548423840e+09 0.5000000000 -8.1710732556 -9.5300539621 1 + 1.0000000000e+09 7.3680629973e+09 0.5000000000 -8.2980125161 -9.4462720608 1 + 1.0000000000e+09 8.1577217310e+09 0.5000000000 -8.4687660372 -9.3330282318 1 + 1.0000000000e+09 9.0320107014e+09 0.5000000000 -8.7320500861 -9.1630033338 1 + 1.0000000000e+09 1.0000000000e+10 0.5000000000 -9.0632943617 -9.0828318763 1 + 1.0000000000e+10 4.0000000000e+09 0.5000000000 -7.9879953396 -9.6879468798 1 + 1.0000000000e+10 4.4286927156e+09 0.5000000000 -8.0302314490 -9.6619337577 1 + 1.0000000000e+10 4.9033297922e+09 0.5000000000 -8.0763284304 -9.6342740546 1 + 1.0000000000e+10 5.4288352332e+09 0.5000000000 -8.1258459897 -9.6058175046 1 + 1.0000000000e+10 6.0106607628e+09 0.5000000000 -8.1795088599 -9.5762491105 1 + 1.0000000000e+10 6.6548423840e+09 0.5000000000 -8.2365078557 -9.5472461611 1 + 1.0000000000e+10 7.3680629973e+09 0.5000000000 -8.2988571338 -9.5177368349 1 + 1.0000000000e+10 8.1577217310e+09 0.5000000000 -8.3695493416 -9.4863947153 1 + 1.0000000000e+10 9.0320107014e+09 0.5000000000 -8.4559431120 -9.4487939586 1 + 1.0000000000e+10 1.0000000000e+10 0.5000000000 -8.5723779233 -9.3960835543 1 + 1.0000000000e+06 4.0000000000e+09 0.5500000000 -4.9263567583 -12.6306847771 0 + 1.0000000000e+06 4.4286927156e+09 0.5500000000 -5.5125982821 -12.0759967435 1 + 1.0000000000e+06 4.9033297922e+09 0.5500000000 -6.1679059616 -11.4605293767 1 + 1.0000000000e+06 5.4288352332e+09 0.5500000000 -6.9002510955 -10.8361899606 1 + 1.0000000000e+06 6.0106607628e+09 0.5500000000 -7.7162795920 -10.4358987387 1 + 1.0000000000e+06 6.6548423840e+09 0.5500000000 -8.5866665410 -10.0436084115 1 1.0000000000e+06 7.3680629973e+09 0.5500000000 -9.3202024829 -9.8862686067 1 1.0000000000e+06 8.1577217310e+09 0.5500000000 -9.9039624201 -10.1364903176 1 1.0000000000e+06 9.0320107014e+09 0.5500000000 -10.7704366546 -10.9333444696 1 1.0000000000e+06 1.0000000000e+10 0.5500000000 -12.0316256213 -12.2064099419 1 - 1.0000000000e+07 4.0000000000e+09 0.5500000000 -4.1328499285 -13.4067273016 0 - 1.0000000000e+07 4.4286927156e+09 0.5500000000 -4.6340211015 -12.9330486653 1 - 1.0000000000e+07 4.9033297922e+09 0.5500000000 -5.1951522570 -12.4035178556 1 - 1.0000000000e+07 5.4288352332e+09 0.5500000000 -5.8233286811 -11.8138168037 1 - 1.0000000000e+07 6.0106607628e+09 0.5500000000 -6.5263096328 -11.1696374781 1 - 1.0000000000e+07 6.6548423840e+09 0.5500000000 -7.3118205883 -10.6533164642 1 + 1.0000000000e+07 4.0000000000e+09 0.5500000000 -4.1328499283 -13.4067273031 0 + 1.0000000000e+07 4.4286927156e+09 0.5500000000 -4.6340211015 -12.9330486665 1 + 1.0000000000e+07 4.9033297922e+09 0.5500000000 -5.1951522570 -12.4035178568 1 + 1.0000000000e+07 5.4288352332e+09 0.5500000000 -5.8233286811 -11.8138168049 1 + 1.0000000000e+07 6.0106607628e+09 0.5500000000 -6.5263096328 -11.1696374790 1 + 1.0000000000e+07 6.6548423840e+09 0.5500000000 -7.3118205884 -10.6533164642 1 1.0000000000e+07 7.3680629973e+09 0.5500000000 -8.1699653523 -10.2549768923 1 1.0000000000e+07 8.1577217310e+09 0.5500000000 -8.9833218276 -9.9767011458 1 - 1.0000000000e+07 9.0320107014e+09 0.5500000000 -9.6101289590 -10.0376261257 1 + 1.0000000000e+07 9.0320107014e+09 0.5500000000 -9.6101289590 -10.0376261258 1 1.0000000000e+07 1.0000000000e+10 0.5500000000 -10.2513560243 -10.4787469547 1 - 1.0000000000e+08 4.0000000000e+09 0.5500000000 -3.3394222565 -14.1986157627 0 - 1.0000000000e+08 4.4286927156e+09 0.5500000000 -3.7555058127 -13.8064185732 1 - 1.0000000000e+08 4.9033297922e+09 0.5500000000 -4.2224338348 -13.3665796903 1 - 1.0000000000e+08 5.4288352332e+09 0.5500000000 -4.7463244461 -12.8738625679 1 - 1.0000000000e+08 6.0106607628e+09 0.5500000000 -5.3340170370 -12.3231580820 1 - 1.0000000000e+08 6.6548423840e+09 0.5500000000 -5.9930630461 -11.7121630276 1 - 1.0000000000e+08 7.3680629973e+09 0.5500000000 -6.7314189358 -11.0586117870 1 - 1.0000000000e+08 8.1577217310e+09 0.5500000000 -7.5518998377 -10.5748765825 1 - 1.0000000000e+08 9.0320107014e+09 0.5500000000 -8.4095851779 -10.2109427834 1 - 1.0000000000e+08 1.0000000000e+10 0.5500000000 -9.1564767532 -10.0541540546 1 - 1.0000000000e+09 4.0000000000e+09 0.5500000000 -2.5470603942 -15.0251960068 0 - 1.0000000000e+09 4.4286927156e+09 0.5500000000 -2.8780137696 -14.7144476485 1 - 1.0000000000e+09 4.9033297922e+09 0.5500000000 -3.2506978411 -14.3646520097 1 - 1.0000000000e+09 5.4288352332e+09 0.5500000000 -3.6702538870 -13.9712053555 1 - 1.0000000000e+09 6.0106607628e+09 0.5500000000 -4.1424458457 -13.5290133661 1 - 1.0000000000e+09 6.6548423840e+09 0.5500000000 -4.6737326990 -13.0330537713 1 - 1.0000000000e+09 7.3680629973e+09 0.5500000000 -5.2713212051 -12.4785205527 1 - 1.0000000000e+09 8.1577217310e+09 0.5500000000 -5.9429385084 -11.8635582061 1 - 1.0000000000e+09 9.0320107014e+09 0.5500000000 -6.6949519372 -11.2026555846 1 - 1.0000000000e+09 1.0000000000e+10 0.5500000000 -7.5247904699 -10.6481506633 1 - 1.0000000000e+10 4.0000000000e+09 0.5500000000 -1.7575285284 -15.9281119439 1 - 1.0000000000e+10 4.4286927156e+09 0.5500000000 -2.0032273068 -15.6987367709 1 - 1.0000000000e+10 4.9033297922e+09 0.5500000000 -2.2815466527 -15.4389665423 1 - 1.0000000000e+10 5.4288352332e+09 0.5500000000 -2.5966508208 -15.1450468884 1 - 1.0000000000e+10 6.0106607628e+09 0.5500000000 -2.9532220856 -14.8127045048 1 - 1.0000000000e+10 6.6548423840e+09 0.5500000000 -3.3565239470 -14.4375393754 1 - 1.0000000000e+10 7.3680629973e+09 0.5500000000 -3.8124716667 -14.0145582470 1 - 1.0000000000e+10 8.1577217310e+09 0.5500000000 -4.3277071804 -13.5387148010 1 - 1.0000000000e+10 9.0320107014e+09 0.5500000000 -4.9096377919 -13.0053180906 1 - 1.0000000000e+10 1.0000000000e+10 0.5500000000 -5.5661097737 -12.4114337010 1 - 1.0000000000e+06 4.0000000000e+09 0.6000000000 -4.6874372498 -12.8713326826 0 - 1.0000000000e+06 4.4286927156e+09 0.6000000000 -5.2480726287 -12.3424870395 1 - 1.0000000000e+06 4.9033297922e+09 0.6000000000 -5.8750376557 -11.7561606656 1 + 1.0000000000e+08 4.0000000000e+09 0.5500000000 -3.3394222565 -14.1986157657 0 + 1.0000000000e+08 4.4286927156e+09 0.5500000000 -3.7555058127 -13.8064185762 1 + 1.0000000000e+08 4.9033297922e+09 0.5500000000 -4.2224338348 -13.3665796932 1 + 1.0000000000e+08 5.4288352332e+09 0.5500000000 -4.7463244462 -12.8738625707 1 + 1.0000000000e+08 6.0106607628e+09 0.5500000000 -5.3340170370 -12.3231580847 1 + 1.0000000000e+08 6.6548423840e+09 0.5500000000 -5.9930630460 -11.7121630303 1 + 1.0000000000e+08 7.3680629973e+09 0.5500000000 -6.7314189359 -11.0586117888 1 + 1.0000000000e+08 8.1577217310e+09 0.5500000000 -7.5518998378 -10.5748765826 1 + 1.0000000000e+08 9.0320107014e+09 0.5500000000 -8.4095851780 -10.2109427835 1 + 1.0000000000e+08 1.0000000000e+10 0.5500000000 -9.1564767533 -10.0541540547 1 + 1.0000000000e+09 4.0000000000e+09 0.5500000000 -2.5470603946 -15.0251960133 0 + 1.0000000000e+09 4.4286927156e+09 0.5500000000 -2.8780137697 -14.7144476551 1 + 1.0000000000e+09 4.9033297922e+09 0.5500000000 -3.2506978413 -14.3646520162 1 + 1.0000000000e+09 5.4288352332e+09 0.5500000000 -3.6702538871 -13.9712053620 1 + 1.0000000000e+09 6.0106607628e+09 0.5500000000 -4.1424458459 -13.5290133725 1 + 1.0000000000e+09 6.6548423840e+09 0.5500000000 -4.6737326992 -13.0330537776 1 + 1.0000000000e+09 7.3680629973e+09 0.5500000000 -5.2713212052 -12.4785205588 1 + 1.0000000000e+09 8.1577217310e+09 0.5500000000 -5.9429385089 -11.8635582114 1 + 1.0000000000e+09 9.0320107014e+09 0.5500000000 -6.6949519374 -11.2026555889 1 + 1.0000000000e+09 1.0000000000e+10 0.5500000000 -7.5247904700 -10.6481506638 1 + 1.0000000000e+10 4.0000000000e+09 0.5500000000 -1.7575285290 -15.9281119586 1 + 1.0000000000e+10 4.4286927156e+09 0.5500000000 -2.0032273072 -15.6987367857 1 + 1.0000000000e+10 4.9033297922e+09 0.5500000000 -2.2815466531 -15.4389665570 1 + 1.0000000000e+10 5.4288352332e+09 0.5500000000 -2.5966508213 -15.1450469031 1 + 1.0000000000e+10 6.0106607628e+09 0.5500000000 -2.9532220861 -14.8127045193 1 + 1.0000000000e+10 6.6548423840e+09 0.5500000000 -3.3565239474 -14.4375393899 1 + 1.0000000000e+10 7.3680629973e+09 0.5500000000 -3.8124716671 -14.0145582613 1 + 1.0000000000e+10 8.1577217310e+09 0.5500000000 -4.3277071808 -13.5387148150 1 + 1.0000000000e+10 9.0320107014e+09 0.5500000000 -4.9096377922 -13.0053181043 1 + 1.0000000000e+10 1.0000000000e+10 0.5500000000 -5.5661097741 -12.4114337141 1 + 1.0000000000e+06 4.0000000000e+09 0.6000000000 -4.6874372498 -12.8713326831 0 + 1.0000000000e+06 4.4286927156e+09 0.6000000000 -5.2480726287 -12.3424870400 1 + 1.0000000000e+06 4.9033297922e+09 0.6000000000 -5.8750376557 -11.7561606661 1 1.0000000000e+06 5.4288352332e+09 0.6000000000 -6.5760898652 -11.1834318133 1 1.0000000000e+06 6.0106607628e+09 0.6000000000 -7.3593425290 -10.8232051193 1 - 1.0000000000e+06 6.6548423840e+09 0.6000000000 -8.2241108562 -10.4375374974 1 - 1.0000000000e+06 7.3680629973e+09 0.6000000000 -9.0837111803 -10.1457926302 1 + 1.0000000000e+06 6.6548423840e+09 0.6000000000 -8.2241108560 -10.4375374976 1 + 1.0000000000e+06 7.3680629973e+09 0.6000000000 -9.0837111804 -10.1457926302 1 1.0000000000e+06 8.1577217310e+09 0.6000000000 -9.7969327525 -10.2597190165 1 1.0000000000e+06 9.0320107014e+09 0.6000000000 -10.6996001970 -11.0267712343 1 1.0000000000e+06 1.0000000000e+10 0.6000000000 -11.9565742814 -12.3079450256 1 - 1.0000000000e+07 4.0000000000e+09 0.6000000000 -3.8939383372 -13.6477417068 0 - 1.0000000000e+07 4.4286927156e+09 0.6000000000 -4.3695027901 -13.1998278093 1 - 1.0000000000e+07 4.9033297922e+09 0.6000000000 -4.9022832206 -12.6988733371 1 - 1.0000000000e+07 5.4288352332e+09 0.6000000000 -5.4990786384 -12.1410754226 1 - 1.0000000000e+07 6.0106607628e+09 0.6000000000 -6.1674541533 -11.5347440361 1 - 1.0000000000e+07 6.6548423840e+09 0.6000000000 -6.9156298387 -11.0830753295 1 + 1.0000000000e+07 4.0000000000e+09 0.6000000000 -3.8939383372 -13.6477417081 0 + 1.0000000000e+07 4.4286927156e+09 0.6000000000 -4.3695027901 -13.1998278106 1 + 1.0000000000e+07 4.9033297922e+09 0.6000000000 -4.9022832206 -12.6988733383 1 + 1.0000000000e+07 5.4288352332e+09 0.6000000000 -5.4990786383 -12.1410754239 1 + 1.0000000000e+07 6.0106607628e+09 0.6000000000 -6.1674541533 -11.5347440371 1 + 1.0000000000e+07 6.6548423840e+09 0.6000000000 -6.9156298388 -11.0830753295 1 1.0000000000e+07 7.3680629973e+09 0.6000000000 -7.7481817497 -10.7129141315 1 1.0000000000e+07 8.1577217310e+09 0.6000000000 -8.6299116983 -10.3621615417 1 1.0000000000e+07 9.0320107014e+09 0.6000000000 -9.4168075327 -10.2525633805 1 - 1.0000000000e+07 1.0000000000e+10 0.6000000000 -10.1478709457 -10.6024085068 1 - 1.0000000000e+08 4.0000000000e+09 0.6000000000 -3.1005259273 -14.4405028517 0 - 1.0000000000e+08 4.4286927156e+09 0.6000000000 -3.4910018428 -14.0740545826 1 - 1.0000000000e+08 4.9033297922e+09 0.6000000000 -3.9295779936 -13.6627315281 1 - 1.0000000000e+08 5.4288352332e+09 0.6000000000 -4.4220785916 -13.2016151637 1 - 1.0000000000e+08 6.0106607628e+09 0.6000000000 -4.9750223847 -12.6860142992 1 - 1.0000000000e+08 6.6548423840e+09 0.6000000000 -5.5956833131 -12.1143859292 1 - 1.0000000000e+08 7.3680629973e+09 0.6000000000 -6.2923470974 -11.5100241148 1 - 1.0000000000e+08 8.1577217310e+09 0.6000000000 -7.0719798684 -11.0955902793 1 - 1.0000000000e+08 9.0320107014e+09 0.6000000000 -7.9296619961 -10.7326405101 1 + 1.0000000000e+07 1.0000000000e+10 0.6000000000 -10.1478709457 -10.6024085069 1 + 1.0000000000e+08 4.0000000000e+09 0.6000000000 -3.1005259273 -14.4405028547 0 + 1.0000000000e+08 4.4286927156e+09 0.6000000000 -3.4910018429 -14.0740545856 1 + 1.0000000000e+08 4.9033297922e+09 0.6000000000 -3.9295779936 -13.6627315310 1 + 1.0000000000e+08 5.4288352332e+09 0.6000000000 -4.4220785916 -13.2016151666 1 + 1.0000000000e+08 6.0106607628e+09 0.6000000000 -4.9750223848 -12.6860143020 1 + 1.0000000000e+08 6.6548423840e+09 0.6000000000 -5.5956833129 -12.1143859321 1 + 1.0000000000e+08 7.3680629973e+09 0.6000000000 -6.2923470974 -11.5100241165 1 + 1.0000000000e+08 8.1577217310e+09 0.6000000000 -7.0719798685 -11.0955902794 1 + 1.0000000000e+08 9.0320107014e+09 0.6000000000 -7.9296619962 -10.7326405101 1 1.0000000000e+08 1.0000000000e+10 0.6000000000 -8.7972934615 -10.4473618809 1 - 1.0000000000e+09 4.0000000000e+09 0.6000000000 -2.3082235666 -15.2690142111 0 - 1.0000000000e+09 4.4286927156e+09 0.6000000000 -2.6135665217 -14.9840071646 1 - 1.0000000000e+09 4.9033297922e+09 0.6000000000 -2.9578960344 -14.6627124614 1 - 1.0000000000e+09 5.4288352332e+09 0.6000000000 -3.3460592681 -14.3008241461 1 - 1.0000000000e+09 6.0106607628e+09 0.6000000000 -3.7834946070 -13.8935836474 1 - 1.0000000000e+09 6.6548423840e+09 0.6000000000 -4.2763022553 -13.4363611962 1 - 1.0000000000e+09 7.3680629973e+09 0.6000000000 -4.8313168012 -12.9248402102 1 - 1.0000000000e+09 8.1577217310e+09 0.6000000000 -5.4561228018 -12.3577854766 1 - 1.0000000000e+09 9.0320107014e+09 0.6000000000 -6.1587039832 -11.7516690091 1 - 1.0000000000e+09 1.0000000000e+10 0.6000000000 -6.9454524602 -11.2745753094 1 - 1.0000000000e+10 4.0000000000e+09 0.6000000000 -1.5188716432 -16.1761350955 0 - 1.0000000000e+10 4.4286927156e+09 0.6000000000 -1.7389525108 -15.9724978562 1 - 1.0000000000e+10 4.9033297922e+09 0.6000000000 -1.9889099828 -15.7412229527 1 - 1.0000000000e+10 5.4288352332e+09 0.6000000000 -2.2726142070 -15.4788512141 1 - 1.0000000000e+10 6.0106607628e+09 0.6000000000 -2.5944218273 -15.1814361997 1 - 1.0000000000e+10 6.6548423840e+09 0.6000000000 -2.9592358248 -14.8449412295 1 - 1.0000000000e+10 7.3680629973e+09 0.6000000000 -3.3725725549 -14.4647794117 1 - 1.0000000000e+10 8.1577217310e+09 0.6000000000 -3.8406360368 -14.0363659173 1 - 1.0000000000e+10 9.0320107014e+09 0.6000000000 -4.3703910761 -13.5555230690 1 - 1.0000000000e+10 1.0000000000e+10 0.6000000000 -4.9695596341 -13.0196506972 1 - 1.0000000000e+06 4.0000000000e+09 0.6500000000 -4.5476796742 -13.0130039942 0 - 1.0000000000e+06 4.4286927156e+09 0.6500000000 -5.0933362711 -12.4994174288 1 - 1.0000000000e+06 4.9033297922e+09 0.6500000000 -5.7037185995 -11.9307011919 1 + 1.0000000000e+09 4.0000000000e+09 0.6000000000 -2.3082235668 -15.2690142179 0 + 1.0000000000e+09 4.4286927156e+09 0.6000000000 -2.6135665219 -14.9840071714 1 + 1.0000000000e+09 4.9033297922e+09 0.6000000000 -2.9578960346 -14.6627124682 1 + 1.0000000000e+09 5.4288352332e+09 0.6000000000 -3.3460592682 -14.3008241528 1 + 1.0000000000e+09 6.0106607628e+09 0.6000000000 -3.7834946071 -13.8935836540 1 + 1.0000000000e+09 6.6548423840e+09 0.6000000000 -4.2763022554 -13.4363612027 1 + 1.0000000000e+09 7.3680629973e+09 0.6000000000 -4.8313168013 -12.9248402164 1 + 1.0000000000e+09 8.1577217310e+09 0.6000000000 -5.4561228019 -12.3577854824 1 + 1.0000000000e+09 9.0320107014e+09 0.6000000000 -6.1587039833 -11.7516690135 1 + 1.0000000000e+09 1.0000000000e+10 0.6000000000 -6.9454524603 -11.2745753097 1 + 1.0000000000e+10 4.0000000000e+09 0.6000000000 -1.5188716438 -16.1761351108 0 + 1.0000000000e+10 4.4286927156e+09 0.6000000000 -1.7389525113 -15.9724978714 1 + 1.0000000000e+10 4.9033297922e+09 0.6000000000 -1.9889099833 -15.7412229679 1 + 1.0000000000e+10 5.4288352332e+09 0.6000000000 -2.2726142074 -15.4788512292 1 + 1.0000000000e+10 6.0106607628e+09 0.6000000000 -2.5944218278 -15.1814362147 1 + 1.0000000000e+10 6.6548423840e+09 0.6000000000 -2.9592358252 -14.8449412444 1 + 1.0000000000e+10 7.3680629973e+09 0.6000000000 -3.3725725553 -14.4647794265 1 + 1.0000000000e+10 8.1577217310e+09 0.6000000000 -3.8406360372 -14.0363659318 1 + 1.0000000000e+10 9.0320107014e+09 0.6000000000 -4.3703910764 -13.5555230831 1 + 1.0000000000e+10 1.0000000000e+10 0.6000000000 -4.9695596343 -13.0196507108 1 + 1.0000000000e+06 4.0000000000e+09 0.6500000000 -4.5476796742 -13.0130039947 0 + 1.0000000000e+06 4.4286927156e+09 0.6500000000 -5.0933362712 -12.4994174293 1 + 1.0000000000e+06 4.9033297922e+09 0.6500000000 -5.7037185995 -11.9307011924 1 1.0000000000e+06 5.4288352332e+09 0.6500000000 -6.3864250027 -11.4022341176 1 - 1.0000000000e+06 6.0106607628e+09 0.6500000000 -7.1497090923 -11.0673819183 1 + 1.0000000000e+06 6.0106607628e+09 0.6500000000 -7.1497090923 -11.0673819184 1 1.0000000000e+06 6.6548423840e+09 0.6500000000 -7.9986396847 -10.7004385555 1 1.0000000000e+06 7.3680629973e+09 0.6500000000 -8.8932281298 -10.3705502418 1 1.0000000000e+06 8.1577217310e+09 0.6500000000 -9.6962470719 -10.3881605331 1 1.0000000000e+06 9.0320107014e+09 0.6500000000 -10.6340099963 -11.1317007071 1 1.0000000000e+06 1.0000000000e+10 0.6500000000 -11.8875232376 -12.4230320085 1 - 1.0000000000e+07 4.0000000000e+09 0.6500000000 -3.7541883557 -13.7897569618 0 - 1.0000000000e+07 4.4286927156e+09 0.6500000000 -4.2147736230 -13.3570050875 1 - 1.0000000000e+07 4.9033297922e+09 0.6500000000 -4.7309696317 -12.8729015419 1 - 1.0000000000e+07 5.4288352332e+09 0.6500000000 -5.3094047388 -12.3341136595 1 - 1.0000000000e+07 6.0106607628e+09 0.6500000000 -5.9574765589 -11.7528091110 1 + 1.0000000000e+07 4.0000000000e+09 0.6500000000 -3.7541883557 -13.7897569631 0 + 1.0000000000e+07 4.4286927156e+09 0.6500000000 -4.2147736231 -13.3570050888 1 + 1.0000000000e+07 4.9033297922e+09 0.6500000000 -4.7309696318 -12.8729015431 1 + 1.0000000000e+07 5.4288352332e+09 0.6500000000 -5.3094047388 -12.3341136606 1 + 1.0000000000e+07 6.0106607628e+09 0.6500000000 -5.9574765589 -11.7528091119 1 1.0000000000e+07 6.6548423840e+09 0.6500000000 -6.6833511744 -11.3535641629 1 - 1.0000000000e+07 7.3680629973e+09 0.6500000000 -7.4942271332 -11.0088492096 1 + 1.0000000000e+07 7.3680629973e+09 0.6500000000 -7.4942271332 -11.0088492097 1 1.0000000000e+07 8.1577217310e+09 0.6500000000 -8.3793161375 -10.6554902076 1 - 1.0000000000e+07 9.0320107014e+09 0.6500000000 -9.2440396955 -10.4605434294 1 + 1.0000000000e+07 9.0320107014e+09 0.6500000000 -9.2440396955 -10.4605434295 1 1.0000000000e+07 1.0000000000e+10 0.6500000000 -10.0502569485 -10.7352236557 1 - 1.0000000000e+08 4.0000000000e+09 0.6500000000 -2.9607906231 -14.5833440150 0 - 1.0000000000e+08 4.4286927156e+09 0.6500000000 -3.3362864792 -14.2320397874 1 - 1.0000000000e+08 4.9033297922e+09 0.6500000000 -3.7582773168 -13.8374930268 1 - 1.0000000000e+08 5.4288352332e+09 0.6500000000 -4.2324153362 -13.3949878596 1 - 1.0000000000e+08 6.0106607628e+09 0.6500000000 -4.7650296834 -12.9001483736 1 - 1.0000000000e+08 6.6548423840e+09 0.6500000000 -5.3631981019 -12.3522858891 1 - 1.0000000000e+08 7.3680629973e+09 0.6500000000 -6.0351054434 -11.7844816590 1 - 1.0000000000e+08 8.1577217310e+09 0.6500000000 -6.7883154852 -11.4259937474 1 - 1.0000000000e+08 9.0320107014e+09 0.6500000000 -7.6264687220 -11.0863271604 1 - 1.0000000000e+08 1.0000000000e+10 0.6500000000 -8.5199483964 -10.7735064152 1 - 1.0000000000e+09 4.0000000000e+09 0.6500000000 -2.1685452784 -15.4136828613 0 - 1.0000000000e+09 4.4286927156e+09 0.6500000000 -2.4589055196 -15.1438122185 1 - 1.0000000000e+09 4.9033297922e+09 0.6500000000 -2.7866471567 -14.8392773843 1 - 1.0000000000e+09 5.4288352332e+09 0.6500000000 -3.1564453047 -14.4959492459 1 - 1.0000000000e+09 6.0106607628e+09 0.6500000000 -3.5735478744 -14.1092731334 1 - 1.0000000000e+09 6.6548423840e+09 0.6500000000 -4.0438444752 -13.6748739519 1 - 1.0000000000e+09 7.3680629973e+09 0.6500000000 -4.5739409490 -13.1888195069 1 - 1.0000000000e+09 8.1577217310e+09 0.6500000000 -5.1712163626 -12.6507561189 1 - 1.0000000000e+09 9.0320107014e+09 0.6500000000 -5.8437444563 -12.0829812993 1 - 1.0000000000e+09 1.0000000000e+10 0.6500000000 -6.5994405223 -11.6765113110 1 - 1.0000000000e+10 4.0000000000e+09 0.6500000000 -1.3793655230 -16.3247814599 0 - 1.0000000000e+10 4.4286927156e+09 0.6500000000 -1.5844565479 -16.1362774538 1 - 1.0000000000e+10 4.9033297922e+09 0.6500000000 -1.8178191786 -15.9217568225 1 - 1.0000000000e+10 5.4288352332e+09 0.6500000000 -2.0831515247 -15.6779339909 1 - 1.0000000000e+10 6.0106607628e+09 0.6500000000 -2.3846197509 -15.4010550070 1 - 1.0000000000e+10 6.6548423840e+09 0.6500000000 -2.7269159432 -15.0872983533 1 - 1.0000000000e+10 7.3680629973e+09 0.6500000000 -3.1153229995 -14.7323215373 1 - 1.0000000000e+10 8.1577217310e+09 0.6500000000 -3.5557871010 -14.3318302289 1 - 1.0000000000e+10 9.0320107014e+09 0.6500000000 -4.0549949959 -13.8820225099 1 - 1.0000000000e+10 1.0000000000e+10 0.6500000000 -4.6204256789 -13.3808512813 1 - 1.0000000000e+06 4.0000000000e+09 0.7000000000 -4.4485209891 -13.1143251178 0 - 1.0000000000e+06 4.4286927156e+09 0.7000000000 -4.9835499142 -12.6117081118 1 - 1.0000000000e+06 4.9033297922e+09 0.7000000000 -5.5821660601 -12.0561394500 1 + 1.0000000000e+08 4.0000000000e+09 0.6500000000 -2.9607906232 -14.5833440181 0 + 1.0000000000e+08 4.4286927156e+09 0.6500000000 -3.3362864793 -14.2320397904 1 + 1.0000000000e+08 4.9033297922e+09 0.6500000000 -3.7582773168 -13.8374930298 1 + 1.0000000000e+08 5.4288352332e+09 0.6500000000 -4.2324153362 -13.3949878626 1 + 1.0000000000e+08 6.0106607628e+09 0.6500000000 -4.7650296834 -12.9001483764 1 + 1.0000000000e+08 6.6548423840e+09 0.6500000000 -5.3631981018 -12.3522858919 1 + 1.0000000000e+08 7.3680629973e+09 0.6500000000 -6.0351054434 -11.7844816604 1 + 1.0000000000e+08 8.1577217310e+09 0.6500000000 -6.7883154852 -11.4259937475 1 + 1.0000000000e+08 9.0320107014e+09 0.6500000000 -7.6264687221 -11.0863271605 1 + 1.0000000000e+08 1.0000000000e+10 0.6500000000 -8.5199483965 -10.7735064153 1 + 1.0000000000e+09 4.0000000000e+09 0.6500000000 -2.1685452785 -15.4136828685 0 + 1.0000000000e+09 4.4286927156e+09 0.6500000000 -2.4589055197 -15.1438122255 1 + 1.0000000000e+09 4.9033297922e+09 0.6500000000 -2.7866471569 -14.8392773913 1 + 1.0000000000e+09 5.4288352332e+09 0.6500000000 -3.1564453048 -14.4959492528 1 + 1.0000000000e+09 6.0106607628e+09 0.6500000000 -3.5735478746 -14.1092731402 1 + 1.0000000000e+09 6.6548423840e+09 0.6500000000 -4.0438444754 -13.6748739586 1 + 1.0000000000e+09 7.3680629973e+09 0.6500000000 -4.5739409491 -13.1888195133 1 + 1.0000000000e+09 8.1577217310e+09 0.6500000000 -5.1712163628 -12.6507561248 1 + 1.0000000000e+09 9.0320107014e+09 0.6500000000 -5.8437444564 -12.0829813034 1 + 1.0000000000e+09 1.0000000000e+10 0.6500000000 -6.5994405224 -11.6765113113 1 + 1.0000000000e+10 4.0000000000e+09 0.6500000000 -1.3793655235 -16.3247814756 0 + 1.0000000000e+10 4.4286927156e+09 0.6500000000 -1.5844565484 -16.1362774695 1 + 1.0000000000e+10 4.9033297922e+09 0.6500000000 -1.8178191791 -15.9217568381 1 + 1.0000000000e+10 5.4288352332e+09 0.6500000000 -2.0831515252 -15.6779340065 1 + 1.0000000000e+10 6.0106607628e+09 0.6500000000 -2.3846197513 -15.4010550224 1 + 1.0000000000e+10 6.6548423840e+09 0.6500000000 -2.7269159436 -15.0872983686 1 + 1.0000000000e+10 7.3680629973e+09 0.6500000000 -3.1153229999 -14.7323215524 1 + 1.0000000000e+10 8.1577217310e+09 0.6500000000 -3.5557871014 -14.3318302438 1 + 1.0000000000e+10 9.0320107014e+09 0.6500000000 -4.0549949963 -13.8820225244 1 + 1.0000000000e+10 1.0000000000e+10 0.6500000000 -4.6204256792 -13.3808512952 1 + 1.0000000000e+06 4.0000000000e+09 0.7000000000 -4.4485209891 -13.1143251183 0 + 1.0000000000e+06 4.4286927156e+09 0.7000000000 -4.9835499142 -12.6117081124 1 + 1.0000000000e+06 4.9033297922e+09 0.7000000000 -5.5821660601 -12.0561394505 1 1.0000000000e+06 5.4288352332e+09 0.7000000000 -6.2518496554 -11.5720368075 1 - 1.0000000000e+06 6.0106607628e+09 0.7000000000 -7.0008334983 -11.2561651451 1 + 1.0000000000e+06 6.0106607628e+09 0.7000000000 -7.0008334984 -11.2561651451 1 1.0000000000e+06 6.6548423840e+09 0.7000000000 -7.8361333603 -10.9067344717 1 - 1.0000000000e+06 7.3680629973e+09 0.7000000000 -8.7392243787 -10.5687792382 1 - 1.0000000000e+06 8.1577217310e+09 0.7000000000 -9.6021916703 -10.5229827099 1 + 1.0000000000e+06 7.3680629973e+09 0.7000000000 -8.7392243787 -10.5687792383 1 + 1.0000000000e+06 8.1577217310e+09 0.7000000000 -9.6021916703 -10.5229827098 1 1.0000000000e+06 9.0320107014e+09 0.7000000000 -10.5729938190 -11.2517560750 1 1.0000000000e+06 1.0000000000e+10 0.7000000000 -11.8235850796 -12.5558647574 1 - 1.0000000000e+07 4.0000000000e+09 0.7000000000 -3.6550369761 -13.8914003268 0 - 1.0000000000e+07 4.4286927156e+09 0.7000000000 -4.1049942046 -13.4694919116 1 - 1.0000000000e+07 4.9033297922e+09 0.7000000000 -4.6094232303 -12.9974776841 1 - 1.0000000000e+07 5.4288352332e+09 0.7000000000 -5.1748308102 -12.4725550639 1 - 1.0000000000e+07 6.0106607628e+09 0.7000000000 -5.8084870128 -11.9131933888 1 + 1.0000000000e+07 4.0000000000e+09 0.7000000000 -3.6550369761 -13.8914003282 0 + 1.0000000000e+07 4.4286927156e+09 0.7000000000 -4.1049942046 -13.4694919130 1 + 1.0000000000e+07 4.9033297922e+09 0.7000000000 -4.6094232304 -12.9974776854 1 + 1.0000000000e+07 5.4288352332e+09 0.7000000000 -5.1748308102 -12.4725550651 1 + 1.0000000000e+07 6.0106607628e+09 0.7000000000 -5.8084870128 -11.9131933897 1 1.0000000000e+07 6.6548423840e+09 0.7000000000 -6.5184625267 -11.5626253210 1 1.0000000000e+07 7.3680629973e+09 0.7000000000 -7.3127774909 -11.2390485970 1 1.0000000000e+07 8.1577217310e+09 0.7000000000 -8.1901397748 -10.8966710259 1 1.0000000000e+07 9.0320107014e+09 0.7000000000 -9.0920672122 -10.6613615921 1 1.0000000000e+07 1.0000000000e+10 0.7000000000 -9.9582875767 -10.8797496537 1 - 1.0000000000e+08 4.0000000000e+09 0.7000000000 -2.8616533998 -14.6857719683 0 - 1.0000000000e+08 4.4286927156e+09 0.7000000000 -3.2265203805 -14.3452898454 1 - 1.0000000000e+08 4.9033297922e+09 0.7000000000 -3.6367434104 -13.9627369356 1 - 1.0000000000e+08 5.4288352332e+09 0.7000000000 -4.0978526309 -13.5335594926 1 - 1.0000000000e+08 6.0106607628e+09 0.7000000000 -4.6160423318 -13.0536842219 1 - 1.0000000000e+08 6.6548423840e+09 0.7000000000 -5.1982455453 -12.5235029578 1 - 1.0000000000e+08 7.3680629973e+09 0.7000000000 -5.8525289991 -11.9932156996 1 - 1.0000000000e+08 8.1577217310e+09 0.7000000000 -6.5865650606 -11.6818564066 1 + 1.0000000000e+08 4.0000000000e+09 0.7000000000 -2.8616533998 -14.6857719715 0 + 1.0000000000e+08 4.4286927156e+09 0.7000000000 -3.2265203806 -14.3452898486 1 + 1.0000000000e+08 4.9033297922e+09 0.7000000000 -3.6367434104 -13.9627369387 1 + 1.0000000000e+08 5.4288352332e+09 0.7000000000 -4.0978526310 -13.5335594957 1 + 1.0000000000e+08 6.0106607628e+09 0.7000000000 -4.6160423318 -13.0536842248 1 + 1.0000000000e+08 6.6548423840e+09 0.7000000000 -5.1982455454 -12.5235029605 1 + 1.0000000000e+08 7.3680629973e+09 0.7000000000 -5.8525289991 -11.9932157006 1 + 1.0000000000e+08 8.1577217310e+09 0.7000000000 -6.5865650606 -11.6818564067 1 1.0000000000e+08 9.0320107014e+09 0.7000000000 -7.4069463043 -11.3651455549 1 1.0000000000e+08 1.0000000000e+10 0.7000000000 -8.3014810042 -11.0535468230 1 - 1.0000000000e+09 4.0000000000e+09 0.7000000000 -2.0694628671 -15.5178474580 0 - 1.0000000000e+09 4.4286927156e+09 0.7000000000 -2.3491916892 -15.2587909906 1 - 1.0000000000e+09 4.9033297922e+09 0.7000000000 -2.6651630628 -14.9662310977 1 - 1.0000000000e+09 5.4288352332e+09 0.7000000000 -3.0219300317 -14.6361670450 1 - 1.0000000000e+09 6.0106607628e+09 0.7000000000 -3.4246053575 -14.2641972346 1 - 1.0000000000e+09 6.6548423840e+09 0.7000000000 -3.8789291124 -13.8461550056 1 - 1.0000000000e+09 7.3680629973e+09 0.7000000000 -4.3913430474 -13.3784836488 1 - 1.0000000000e+09 8.1577217310e+09 0.7000000000 -4.9690605511 -12.8619701123 1 - 1.0000000000e+09 9.0320107014e+09 0.7000000000 -5.6200778084 -12.3291976559 1 - 1.0000000000e+09 1.0000000000e+10 0.7000000000 -6.3527292744 -11.9889184559 1 - 1.0000000000e+10 4.0000000000e+09 0.7000000000 -1.2804483934 -16.4327248683 0 - 1.0000000000e+10 4.4286927156e+09 0.7000000000 -1.4749011900 -16.2550319599 1 - 1.0000000000e+10 4.9033297922e+09 0.7000000000 -1.6964869001 -16.0524804559 1 - 1.0000000000e+10 5.4288352332e+09 0.7000000000 -1.9487815726 -15.8219089709 1 - 1.0000000000e+10 6.0106607628e+09 0.7000000000 -2.2358162268 -15.5597016643 1 - 1.0000000000e+10 6.6548423840e+09 0.7000000000 -2.5621333169 -15.2621927956 1 - 1.0000000000e+10 7.3680629973e+09 0.7000000000 -2.9328500817 -14.9252211581 1 - 1.0000000000e+10 8.1577217310e+09 0.7000000000 -3.3537294912 -14.5447208792 1 - 1.0000000000e+10 9.0320107014e+09 0.7000000000 -3.8312578883 -14.1172251618 1 - 1.0000000000e+10 1.0000000000e+10 0.7000000000 -4.3727140954 -13.6413288768 1 + 1.0000000000e+09 4.0000000000e+09 0.7000000000 -2.0694628674 -15.5178474652 0 + 1.0000000000e+09 4.4286927156e+09 0.7000000000 -2.3491916894 -15.2587909978 1 + 1.0000000000e+09 4.9033297922e+09 0.7000000000 -2.6651630630 -14.9662311049 1 + 1.0000000000e+09 5.4288352332e+09 0.7000000000 -3.0219300320 -14.6361670520 1 + 1.0000000000e+09 6.0106607628e+09 0.7000000000 -3.4246053577 -14.2641972416 1 + 1.0000000000e+09 6.6548423840e+09 0.7000000000 -3.8789291126 -13.8461550124 1 + 1.0000000000e+09 7.3680629973e+09 0.7000000000 -4.3913430475 -13.3784836554 1 + 1.0000000000e+09 8.1577217310e+09 0.7000000000 -4.9690605512 -12.8619701183 1 + 1.0000000000e+09 9.0320107014e+09 0.7000000000 -5.6200778085 -12.3291976596 1 + 1.0000000000e+09 1.0000000000e+10 0.7000000000 -6.3527292745 -11.9889184561 1 + 1.0000000000e+10 4.0000000000e+09 0.7000000000 -1.2804483941 -16.4327248844 0 + 1.0000000000e+10 4.4286927156e+09 0.7000000000 -1.4749011906 -16.2550319759 1 + 1.0000000000e+10 4.9033297922e+09 0.7000000000 -1.6964869006 -16.0524804719 1 + 1.0000000000e+10 5.4288352332e+09 0.7000000000 -1.9487815730 -15.8219089869 1 + 1.0000000000e+10 6.0106607628e+09 0.7000000000 -2.2358162273 -15.5597016802 1 + 1.0000000000e+10 6.6548423840e+09 0.7000000000 -2.5621333174 -15.2621928113 1 + 1.0000000000e+10 7.3680629973e+09 0.7000000000 -2.9328500820 -14.9252211738 1 + 1.0000000000e+10 8.1577217310e+09 0.7000000000 -3.3537294917 -14.5447208945 1 + 1.0000000000e+10 9.0320107014e+09 0.7000000000 -3.8312578887 -14.1172251767 1 + 1.0000000000e+10 1.0000000000e+10 0.7000000000 -4.3727140958 -13.6413288908 1 AMReX (23.07-395-ge6c93bf22695) finalized diff --git a/unit_test/test_nse/GNUmakefile b/unit_test/test_nse/GNUmakefile index b943ce9aaa..be47b8580a 100644 --- a/unit_test/test_nse/GNUmakefile +++ b/unit_test/test_nse/GNUmakefile @@ -28,6 +28,8 @@ NETWORK_DIR := aprox21 SCREEN_METHOD := chabrier1998 +USE_SIMPLIFIED_SDC = TRUE + CONDUCTIVITY_DIR := stellar INTEGRATOR_DIR = VODE @@ -38,5 +40,3 @@ Bpack := ./Make.package Blocs := . include $(MICROPHYSICS_HOME)/unit_test/Make.unit_test - - diff --git a/unit_test/test_nse/ci-benchmarks/aprox21_ci.out b/unit_test/test_nse/ci-benchmarks/aprox21_ci.out index 7f8d29cdc2..bb3bd62e2e 100644 --- a/unit_test/test_nse/ci-benchmarks/aprox21_ci.out +++ b/unit_test/test_nse/ci-benchmarks/aprox21_ci.out @@ -1,7 +1,7 @@ Initializing AMReX (23.07-395-ge6c93bf22695)... AMReX (23.07-395-ge6c93bf22695) initialized starting the single zone burn... -0x7ffee3940620 +0x7ffcbd574c90 State Density (g/cm^3): 277355338.4 State Temperature (K): 5197769252 Mass Fraction (H1): 0.4 @@ -27,28 +27,28 @@ Mass Fraction (n): 0.01111111111 Mass Fraction (p): 0.01111111111 electron fraction is 0.5 After solving: -chemical potential of proton is -5.581982204 -chemical potential of neutron is -12.02475811 +chemical potential of proton is -5.581982209 +chemical potential of neutron is -12.0247581 NSE state: H1 : 0 -He3 : 6.726596474e-12 -He4 : 0.002680193707 -C12 : 2.088656806e-08 -N14 : 3.63235315e-13 -O16 : 8.472971401e-08 -Ne20 : 1.346294741e-09 -Mg24 : 5.59648245e-07 -Si28 : 0.001008039758 -S32 : 0.002046314586 -Ar36 : 0.002091462927 -Ca40 : 0.005238622254 -Ti44 : 0.0001839172999 -Cr48 : 0.002037708693 -Cr56 : 7.745054363e-22 -Fe52 : 0.03983694038 -Fe54 : 0.04496220187 -Fe56 : 1.685809858e-05 -Ni56 : 0.898230601 -n : 9.44170726e-10 -p : 0.001666471828 +He3 : 6.726596351e-12 +He4 : 0.002680193661 +C12 : 2.088656717e-08 +N14 : 3.63235298e-13 +O16 : 8.472970972e-08 +Ne20 : 1.346294667e-09 +Mg24 : 5.596482124e-07 +Si28 : 0.0010080397 +S32 : 0.002046314471 +Ar36 : 0.00209146282 +Ca40 : 0.005238622021 +Ti44 : 0.0001839172934 +Cr48 : 0.002037708642 +Cr56 : 7.745054245e-22 +Fe52 : 0.03983693988 +Fe54 : 0.04496220141 +Fe56 : 1.685809845e-05 +Ni56 : 0.8982306026 +n : 9.441707272e-10 +p : 0.001666471811 AMReX (23.07-395-ge6c93bf22695) finalized diff --git a/unit_test/test_nse/nse_example.H b/unit_test/test_nse/nse_example.H index 78c9b17ff3..5a712485d2 100644 --- a/unit_test/test_nse/nse_example.H +++ b/unit_test/test_nse/nse_example.H @@ -77,7 +77,7 @@ void nse_example_c() std::cout << "NSE state: " << std::endl; for (int n = 0; n < NumSpec; ++n) { - std::cout << short_spec_names_cxx[n] << " : " << NSE_STATE.xn[n] << std::endl; + std::cout << short_spec_names_cxx[n] << " : " << NSE_STATE.xn[n]<< std::endl; } } #endif From d791e67c65f623e0ee05b7458f6e6fae19668704 Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Thu, 11 Jul 2024 13:39:25 -0400 Subject: [PATCH 04/33] Remove strang nse (#1549) Strang does not really allow us to do 2nd order easily because we can't capture the evolution of the state during the burn --- .github/workflows/nse_table.yml | 20 ---- Make.Microphysics_extern | 9 ++ integration/Make.package | 5 +- integration/nse_update_strang.H | 128 -------------------------- unit_test/test_nse_interp/GNUmakefile | 1 + 5 files changed, 13 insertions(+), 150 deletions(-) delete mode 100644 integration/nse_update_strang.H diff --git a/.github/workflows/nse_table.yml b/.github/workflows/nse_table.yml index 58715f14af..3daf1e585a 100644 --- a/.github/workflows/nse_table.yml +++ b/.github/workflows/nse_table.yml @@ -26,26 +26,6 @@ jobs: sudo apt-get update -y -qq sudo apt-get -qq -y install curl cmake jq clang g++>=9.3.0 - - name: Compile, burn_cell (NSE, aprox19) - run: | - cd unit_test/burn_cell - make realclean - make NETWORK_DIR=aprox19 USE_NSE_TABLE=TRUE INTEGRATOR_DIR=VODE -j 4 - - - name: Run burn_cell (NSE, aprox19) - run: | - cd unit_test/burn_cell - ./main3d.gnu.ex inputs_aprox19.nse amrex.fpe_trap_{invalid,zero,overflow}=1 > test.out - - - name: Print backtrace - if: ${{ failure() && hashFiles('unit_test/burn_cell/Backtrace.0') != '' }} - run: cat unit_test/burn_cell/Backtrace.0 - - - name: Compare to stored output (NSE, aprox19) - run: | - cd unit_test/burn_cell - diff -I "^Initializing AMReX" -I "^AMReX" -I "^reading in reaclib rates" test.out ci-benchmarks/aprox19_nse_unit_test.out - - name: Compile, burn_cell_sdc (NSE, aprox19) run: | cd unit_test/burn_cell_sdc diff --git a/Make.Microphysics_extern b/Make.Microphysics_extern index 64ca8faefe..60327aebc5 100644 --- a/Make.Microphysics_extern +++ b/Make.Microphysics_extern @@ -87,6 +87,15 @@ endif table: @if [ ! -f helm_table.dat ]; then echo Linking helm_table.dat; ln -s $(EOS_PATH)/helm_table.dat .; fi +# USE_ALL_NSE will be used if any of the NSE techniques is applied +ifeq ($(USE_NSE_TABLE),TRUE) + USE_ALL_NSE := TRUE +endif + +ifeq ($(USE_NSE_NET),TRUE) + USE_ALL_NSE := TRUE +endif + # NSE networks need the table ifeq ($(USE_NSE_TABLE),TRUE) NSE_TABULAR_HOME ?= $(MICROPHYSICS_HOME)/nse_tabular diff --git a/integration/Make.package b/integration/Make.package index 534310c29d..81f5c94887 100644 --- a/integration/Make.package +++ b/integration/Make.package @@ -26,11 +26,12 @@ else CEXE_headers += integrator_setup_strang.H endif -ifeq ($(USE_NSE_TABLE), TRUE) + +ifeq ($(USE_ALL_NSE), TRUE) ifeq ($(USE_ALL_SDC), TRUE) CEXE_headers += nse_update_sdc.H else - CEXE_headers += nse_update_strang.H + $(error NSE with Strang integration is not supported) endif endif diff --git a/integration/nse_update_strang.H b/integration/nse_update_strang.H deleted file mode 100644 index fb896ac3c0..0000000000 --- a/integration/nse_update_strang.H +++ /dev/null @@ -1,128 +0,0 @@ -#ifndef NSE_UPDATE_STRANG_H -#define NSE_UPDATE_STRANG_H - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include -#include - -#ifdef NSE_TABLE -#include -#include -#endif -#ifdef NSE_NET -#include -#endif - -using namespace amrex::literals; - -/// -/// update the state due to NSE changes for the Strang-split case -/// -template -AMREX_GPU_HOST_DEVICE AMREX_INLINE -void nse_burn(BurnT& state, const amrex::Real dt) { - -#if defined(NSE_TABLE) - - using namespace AuxZero; - - // use the NSE table - - // get the energy -- we are assuming that rho, T are valid on input - - eos(eos_input_rt, state); - - // if we are doing drive_initial_convection, we want to use - // the temperature that comes in through T_fixed - - amrex::Real T_in = state.T_fixed > 0.0_rt ? state.T_fixed : state.T; - - // call the NSE table using the * state to get the t^{n+1} - // source estimates. The thermodynamnics here is specified - // in terms of the auxiliary composition, Ye, abar, and B/A - - nse_table_t nse_state; - nse_state.T = T_in; - nse_state.rho = state.rho; - nse_state.Ye = state.aux[iye]; - - nse_interp(nse_state); - - // update Ye - - state.aux[iye] += dt * nse_state.dyedt; - - // now get the composition from the table using the updated Ye - - nse_state.Ye = state.aux[iye]; - nse_interp(nse_state); - - - // this is MeV / nucleon -- here aux has not yet been updated, so we - // access the old binding energy - amrex::Real deltaq = nse_state.bea - state.aux[ibea]; - - state.aux[ibea] += deltaq; - state.aux[iabar] = nse_state.abar; - -#elif defined(NSE_NET) - - // solve for the NSE state -- first compute Ye - state.y_e = 0.0_rt; - for (int n = 0; n < NumSpec; ++n) { - state.y_e += zion[n] * state.xn[n] * aion_inv[n]; - } - - auto nse_state = get_actual_nse_state(state); - - // for now, we'll take dyedt = 0. Later we can evaluate this by - // calling the RHS with the NSE state. - amrex::Real dyedt = 0.0_rt; - - // compute the change in binding energy -- this is the energy release - // we want to do sum {B dY}, where Y is the molar fraction. - // this will be in MeV / nucleon - amrex::Real deltaq = 0.0_rt; - for (int n = 0; n < NumSpec; ++n) { - deltaq += network::bion(n+1) * aion_inv[n] * (nse_state.xn[n] - state.xn[n]); - } - -#endif - - state.success = true; - state.n_rhs = 0; - state.n_jac = 0; - - // convert the energy to erg / g - amrex::Real enuc = deltaq * C::MeV2eV * C::ev2erg * C::n_A; - - state.e = enuc + state.e; - - - // store the new composition - -#if defined(NSE_TABLE) - for (int n = 0; n < NumSpec; ++n) { - state.xn[n] = nse_state.X[n]; - } -#elif defined(NSE_NET) - for (int n = 0; n < NumSpec; ++n) { - state.xn[n] = nse_state.xn[n]; - } -#endif - - -} - -#endif diff --git a/unit_test/test_nse_interp/GNUmakefile b/unit_test/test_nse_interp/GNUmakefile index 1b443926cb..4b8f6c617a 100644 --- a/unit_test/test_nse_interp/GNUmakefile +++ b/unit_test/test_nse_interp/GNUmakefile @@ -11,6 +11,7 @@ USE_MPI = FALSE USE_OMP = FALSE USE_REACT = TRUE +USE_SIMPLIFIED_SDC = TRUE EBASE = main From 963ff00371ca38c271b82c96ccde9fbd17bb4952 Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Thu, 11 Jul 2024 15:07:04 -0400 Subject: [PATCH 05/33] remove the old test_screening (#1608) the new templated version works with more networks --- unit_test/test_screening/GNUmakefile | 43 -- unit_test/test_screening/Make.package | 7 - unit_test/test_screening/README | 5 - unit_test/test_screening/_parameters | 11 - unit_test/test_screening/inputs | 9 - unit_test/test_screening/main.cpp | 168 ----- unit_test/test_screening/screening_util.cpp | 716 -------------------- unit_test/test_screening/test_screen.H | 14 - unit_test/test_screening/variables.H | 105 --- unit_test/test_screening/variables.cpp | 173 ----- 10 files changed, 1251 deletions(-) delete mode 100644 unit_test/test_screening/GNUmakefile delete mode 100644 unit_test/test_screening/Make.package delete mode 100644 unit_test/test_screening/README delete mode 100644 unit_test/test_screening/_parameters delete mode 100644 unit_test/test_screening/inputs delete mode 100644 unit_test/test_screening/main.cpp delete mode 100644 unit_test/test_screening/screening_util.cpp delete mode 100644 unit_test/test_screening/test_screen.H delete mode 100644 unit_test/test_screening/variables.H delete mode 100644 unit_test/test_screening/variables.cpp diff --git a/unit_test/test_screening/GNUmakefile b/unit_test/test_screening/GNUmakefile deleted file mode 100644 index 024126c7f5..0000000000 --- a/unit_test/test_screening/GNUmakefile +++ /dev/null @@ -1,43 +0,0 @@ -PRECISION = DOUBLE -PROFILE = FALSE - -DEBUG = FALSE - -DIM = 3 - -COMP = gnu - -USE_MPI = FALSE -USE_OMP = FALSE - -USE_REACT = TRUE -USE_CONDUCTIVITY = FALSE - -EBASE = main - -BL_NO_FORT = TRUE - -# define the location of the Microphysics top directory -MICROPHYSICS_HOME := ../.. - -# This sets the EOS directory -EOS_DIR := helmholtz - -# This sets the network directory -NETWORK_DIR := aprox21 - -# This isn't actually used but we need VODE to compile with CUDA -INTEGRATOR_DIR := VODE - -CONDUCTIVITY_DIR := stellar - -SCREEN_METHOD := screen5 - -EXTERN_SEARCH += . - -Bpack := ./Make.package -Blocs := . - -include $(MICROPHYSICS_HOME)/unit_test/Make.unit_test - - diff --git a/unit_test/test_screening/Make.package b/unit_test/test_screening/Make.package deleted file mode 100644 index 36a70d3cba..0000000000 --- a/unit_test/test_screening/Make.package +++ /dev/null @@ -1,7 +0,0 @@ -CEXE_sources += main.cpp - -CEXE_headers += test_screen.H - -CEXE_sources += variables.cpp -CEXE_sources += screening_util.cpp -CEXE_headers += variables.H diff --git a/unit_test/test_screening/README b/unit_test/test_screening/README deleted file mode 100644 index 259458fb7f..0000000000 --- a/unit_test/test_screening/README +++ /dev/null @@ -1,5 +0,0 @@ -# test_screening - -This is a unit test for the screening routines. It works for both the -C++ and Fortran implementations (use do_cxx to select). - diff --git a/unit_test/test_screening/_parameters b/unit_test/test_screening/_parameters deleted file mode 100644 index b546788335..0000000000 --- a/unit_test/test_screening/_parameters +++ /dev/null @@ -1,11 +0,0 @@ -@namespace: unit_test - -dens_min real 1.e6 -dens_max real 1.e9 -temp_min real 1.e6 -temp_max real 1.e12 - -metalicity_max real 0.1e0 - -small_temp real 1.e4 -small_dens real 1.e-4 diff --git a/unit_test/test_screening/inputs b/unit_test/test_screening/inputs deleted file mode 100644 index bd2bdb9698..0000000000 --- a/unit_test/test_screening/inputs +++ /dev/null @@ -1,9 +0,0 @@ -n_cell = 16 -max_grid_size = 32 - -unit_test.dens_min = 10.e0 -unit_test.dens_max = 5.e9 -unit_test.temp_min = 1.e6 -unit_test.temp_max = 1.e10 - -unit_test.metalicity_max = 0.5e0 diff --git a/unit_test/test_screening/main.cpp b/unit_test/test_screening/main.cpp deleted file mode 100644 index 7d5e49fe26..0000000000 --- a/unit_test/test_screening/main.cpp +++ /dev/null @@ -1,168 +0,0 @@ -#include -#include -#include - -#include -#include -#include - - -using namespace amrex; - -#include -#include - -#include -#include -#include - -#include - -#include -#include - -using namespace unit_test_rp; - -int main (int argc, char* argv[]) -{ - amrex::Initialize(argc, argv); - - main_main(); - - amrex::Finalize(); - return 0; -} - -void main_main () -{ - - // AMREX_SPACEDIM: number of dimensions - int n_cell, max_grid_size; - - // inputs parameters - { - // ParmParse is way of reading inputs from the inputs file - ParmParse pp; - - // We need to get n_cell from the inputs file - this is the - // number of cells on each side of a square (or cubic) domain. - pp.get("n_cell", n_cell); - - // The domain is broken into boxes of size max_grid_size - max_grid_size = 32; - pp.query("max_grid_size", max_grid_size); - - } - - - Vector is_periodic(AMREX_SPACEDIM,0); - for (int idim=0; idim < AMREX_SPACEDIM; ++idim) { - is_periodic[idim] = 1; - } - - // make BoxArray and Geometry - BoxArray ba; - Geometry geom; - { - IntVect dom_lo(AMREX_D_DECL( 0, 0, 0)); - IntVect dom_hi(AMREX_D_DECL(n_cell-1, n_cell-1, n_cell-1)); - Box domain(dom_lo, dom_hi); - - // Initialize the boxarray "ba" from the single box "bx" - ba.define(domain); - - // Break up boxarray "ba" into chunks no larger than - // "max_grid_size" along a direction - ba.maxSize(max_grid_size); - - // This defines the physical box, [0, 1] in each direction. - RealBox real_box({AMREX_D_DECL(0.0, 0.0, 0.0)}, - {AMREX_D_DECL(1.0, 1.0, 1.0)}); - - // This defines a Geometry object - geom.define(domain, &real_box, - CoordSys::cartesian, is_periodic.data()); - } - - // Nghost = number of ghost cells for each array - int Nghost = 0; - - // do the runtime parameter initializations and microphysics inits - if (ParallelDescriptor::IOProcessor()) { - std::cout << "reading extern runtime parameters ..." << std::endl; - } - - ParmParse ppa("amr"); - - init_unit_test(); - - eos_init(small_temp, small_dens); - - network_init(); - - screening_init(); - - plot_t vars; - - vars = init_variables(); - - amrex::Vector names; - get_varnames(vars, names); - - // time = starting time in the simulation - Real time = 0.0_rt; - - // How Boxes are distributed among MPI processes - DistributionMapping dm(ba); - - // we allocate our main multifabs - MultiFab state(ba, dm, vars.n_plot_comps, Nghost); - - // Initialize the state to zero; we will fill - // it in below in do_eos. - state.setVal(0.0_rt); - - // What time is it now? We'll use this to compute total run time. - Real strt_time = ParallelDescriptor::second(); - - - Real dlogrho = 0.0e0_rt; - Real dlogT = 0.0e0_rt; - Real dmetal = 0.0e0_rt; - - if (n_cell > 1) { - dlogrho = (std::log10(dens_max) - std::log10(dens_min)) / static_cast(n_cell - 1); - dlogT = (std::log10(temp_max) - std::log10(temp_min))/ static_cast(n_cell - 1); - dmetal = (metalicity_max - 0.0_rt)/ static_cast(n_cell - 1); - } - - // Initialize the state and compute the different thermodynamics - // by inverting the EOS - for ( MFIter mfi(state); mfi.isValid(); ++mfi ) - { - const Box& bx = mfi.validbox(); - - Array4 const sp = state.array(mfi); - - screen_test_C(bx, dlogrho, dlogT, dmetal, vars, sp); - - } - - // Call the timer again and compute the maximum difference between - // the start time and stop time over all processors - Real stop_time = ParallelDescriptor::second() - strt_time; - const int IOProc = ParallelDescriptor::IOProcessorNumber(); - ParallelDescriptor::ReduceRealMax(stop_time, IOProc); - - - std::string name = "test_screening." + screen_name; - - // Write a plotfile - WriteSingleLevelPlotfile(name, state, names, geom, time, 0); - - write_job_info(name); - - // Tell the I/O Processor to write out the "run time" - amrex::Print() << "Run time = " << stop_time << std::endl; - -} diff --git a/unit_test/test_screening/screening_util.cpp b/unit_test/test_screening/screening_util.cpp deleted file mode 100644 index 676d7cdcce..0000000000 --- a/unit_test/test_screening/screening_util.cpp +++ /dev/null @@ -1,716 +0,0 @@ -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include - -#include - -using namespace amrex; -using namespace unit_test_rp; - -void screen_test_C(const Box& bx, - const Real dlogrho, const Real dlogT, const Real dmetal, - const plot_t& vars, - Array4 const sp) { - using namespace Species; - - const int ih1 = network_spec_index("hydrogen-1"); - if (ih1 < 0) amrex::Error("Error: ih1 not found"); - - const int ihe3 = network_spec_index("helium-3"); - if (ihe3 < 0) amrex::Error("Error: ihe3 not found"); - - const int ihe4 = network_spec_index("helium-4"); - if (ihe4 < 0) amrex::Error("Error: ihe4 not found"); - - const int ic12 = network_spec_index("carbon-12"); - if (ic12 < 0) amrex::Error("Error: ic12 not found"); - - const int in14 = network_spec_index("nitrogen-14"); - if (in14 < 0) amrex::Error("Error: in14 not found"); - - const int io16 = network_spec_index("oxygen-16"); - if (io16 < 0) amrex::Error("Error: io16 not found"); - - const int ine20 = network_spec_index("neon-20"); - if (ine20 < 0) amrex::Error("Error: ine20 not found"); - - const int img24 = network_spec_index("magnesium-24"); - if (img24 < 0) amrex::Error("Error: img24 not found"); - - const int isi28 = network_spec_index("silicon-28"); - if (isi28 < 0) amrex::Error("Error: isi28 not found"); - - const int is32 = network_spec_index("sulfur-32"); - if (is32 < 0) amrex::Error("Error: is32 not found"); - - const int iar36 = network_spec_index("argon-36"); - if (iar36 < 0) amrex::Error("Error: iar36 not found"); - - const int ica40 = network_spec_index("calcium-40"); - if (ica40 < 0) amrex::Error("Error: ica40 not found"); - - const int iti44 = network_spec_index("titanium-44"); - if (iti44 < 0) amrex::Error("Error: iti44 not found"); - - const int icr48 = network_spec_index("chromium-48"); - if (icr48 < 0) amrex::Error("Error: icr48 not found"); - - const int ife52 = network_spec_index("iron-52"); - if (ife52 < 0) amrex::Error("Error: ife52 not found"); - - const int ife54 = network_spec_index("iron-54"); - if (ife54 < 0) amrex::Error("Error: ife54 not found"); - - const int ife56 = network_spec_index("iron-56"); - if (ife56 < 0) amrex::Error("Error: ife56 not found"); - - amrex::ParallelFor(bx, - [=] AMREX_GPU_DEVICE (int i, int j, int k) - { - - // set the composition -- approximately solar - Real metalicity = 0.0 + static_cast (k) * dmetal; - - Real xn[NumSpec]; - - // for now... the screening using 1-based indexing - Array1D ymass; - - for (int n = 0; n < NumSpec; n++) { - xn[n] = metalicity / static_cast(NumSpec - 2); - } - xn[ih1] = 0.75_rt - 0.5_rt * metalicity; - xn[ihe4] = 0.25_rt - 0.5_rt * metalicity; - - for (int n = 0; n < NumSpec; n++) { - ymass(n+1) = xn[n] / aion[n]; - } - - using dual_t = autodiff::dual; - dual_t temp_zone = std::pow(10.0, std::log10(temp_min) + static_cast(j)*dlogT); - autodiff::seed(temp_zone); - - Real dens_zone = std::pow(10.0, std::log10(dens_min) + static_cast(i)*dlogrho); - - // store default state - sp(i, j, k, vars.irho) = dens_zone; - sp(i, j, k, vars.itemp) = static_cast(temp_zone); - for (int n = 0; n < NumSpec; n++) { - sp(i, j, k, vars.ispec+n) = xn[n]; - } - - plasma_state_t pstate; - fill_plasma_state(pstate, temp_zone, dens_zone, ymass); - - Real sc1a; - Real sc1adt; - Real sc1add; - - // 3-alpha - { - constexpr Real Z1 = NetworkProperties::zion(He4); - constexpr Real A1 = NetworkProperties::aion(He4); - - constexpr Real Z2 = NetworkProperties::zion(He4); - constexpr Real A2 = NetworkProperties::aion(He4); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - // Require scn_fac to be evaluated at compile time - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_he4_he4) = sc1a; - sp(i, j, k, vars.iscn_he4_he4_dt) = sc1adt; - } - - { - constexpr Real Z1 = NetworkProperties::zion(He4); - constexpr Real A1 = NetworkProperties::aion(He4); - - constexpr Real Z2 = 4.0_rt; - constexpr Real A2 = 8.0_rt; - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_he4_be8) = sc1a; - sp(i, j, k, vars.iscn_he4_be8_dt) = sc1adt; - } - - // c12(a,g)o16 - { - constexpr Real Z1 = NetworkProperties::zion(C12); - constexpr Real A1 = NetworkProperties::aion(C12); - - constexpr Real Z2 = NetworkProperties::zion(He4); - constexpr Real A2 = NetworkProperties::aion(He4); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_c12_he4) = sc1a; - sp(i, j, k, vars.iscn_c12_he4_dt) = sc1adt; - } - - // c12 + c12 - { - constexpr Real Z1 = NetworkProperties::zion(C12); - constexpr Real A1 = NetworkProperties::aion(C12); - - constexpr Real Z2 = NetworkProperties::zion(C12); - constexpr Real A2 = NetworkProperties::aion(C12); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_c12_c12) = sc1a; - sp(i, j, k, vars.iscn_c12_c12_dt) = sc1adt; - } - - // c12 + o16 - { - constexpr Real Z1 = NetworkProperties::zion(C12); - constexpr Real A1 = NetworkProperties::aion(C12); - - constexpr Real Z2 = NetworkProperties::zion(O16); - constexpr Real A2 = NetworkProperties::aion(O16); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_c12_o16) = sc1a; - sp(i, j, k, vars.iscn_c12_o16_dt) = sc1adt; - } - - // o16 + o16 - { - constexpr Real Z1 = NetworkProperties::zion(O16); - constexpr Real A1 = NetworkProperties::aion(O16); - - constexpr Real Z2 = NetworkProperties::zion(O16); - constexpr Real A2 = NetworkProperties::aion(O16); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_o16_o16) = sc1a; - sp(i, j, k, vars.iscn_o16_o16_dt) = sc1adt; - } - - // o16 + he4 - { - constexpr Real Z1 = NetworkProperties::zion(O16); - constexpr Real A1 = NetworkProperties::aion(O16); - - constexpr Real Z2 = NetworkProperties::zion(He4); - constexpr Real A2 = NetworkProperties::aion(He4); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_o16_he4) = sc1a; - sp(i, j, k, vars.iscn_o16_he4_dt) = sc1adt; - } - - // ne20(a,g)mg24 - { - constexpr Real Z1 = NetworkProperties::zion(Ne20); - constexpr Real A1 = NetworkProperties::aion(Ne20); - - constexpr Real Z2 = NetworkProperties::zion(He4); - constexpr Real A2 = NetworkProperties::aion(He4); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_ne20_he4) = sc1a; - sp(i, j, k, vars.iscn_ne20_he4_dt) = sc1adt; - } - - // mg24(a,g)si28 - { - constexpr Real Z1 = NetworkProperties::zion(Mg24); - constexpr Real A1 = NetworkProperties::aion(Mg24); - - constexpr Real Z2 = NetworkProperties::zion(He4); - constexpr Real A2 = NetworkProperties::aion(He4); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_mg24_he4) = sc1a; - sp(i, j, k, vars.iscn_mg24_he4_dt) = sc1adt; - } - - // al27(p,g)si28 - { - constexpr Real Z1 = 13.0_rt; - constexpr Real A1 = 27.0_rt; - - constexpr Real Z2 = NetworkProperties::zion(H1); - constexpr Real A2 = NetworkProperties::aion(H1); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_al27_p) = sc1a; - sp(i, j, k, vars.iscn_al27_p_dt) = sc1adt; - } - - // si28 + he4 - { - constexpr Real Z1 = NetworkProperties::zion(Si28); - constexpr Real A1 = NetworkProperties::aion(Si28); - - constexpr Real Z2 = NetworkProperties::zion(He4); - constexpr Real A2 = NetworkProperties::aion(He4); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_si28_he4) = sc1a; - sp(i, j, k, vars.iscn_si28_he4_dt) = sc1adt; - } - - // p31(p,g)s32 - { - constexpr Real Z1 = 15.0_rt; - constexpr Real A1 = 31.0_rt; - - constexpr Real Z2 = NetworkProperties::zion(H1); - constexpr Real A2 = NetworkProperties::aion(H1); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_p31_p) = sc1a; - sp(i, j, k, vars.iscn_p31_p_dt) = sc1adt; - } - - // s32 to ar36 - { - constexpr Real Z1 = NetworkProperties::zion(S32); - constexpr Real A1 = NetworkProperties::aion(S32); - - constexpr Real Z2 = NetworkProperties::zion(He4); - constexpr Real A2 = NetworkProperties::aion(He4); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_s32_he4) = sc1a; - sp(i, j, k, vars.iscn_s32_he4_dt) = sc1adt; - } - - // cl35(p,g)ar36 - { - constexpr Real Z1 = 17.0_rt; - constexpr Real A1 = 35.0_rt; - - constexpr Real Z2 = NetworkProperties::zion(H1); - constexpr Real A2 = NetworkProperties::aion(H1); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_cl35_p) = sc1a; - sp(i, j, k, vars.iscn_cl35_p_dt) = sc1adt; - } - - // ar36 to ca40 - { - constexpr Real Z1 = NetworkProperties::zion(Ar36); - constexpr Real A1 = NetworkProperties::aion(Ar36); - - constexpr Real Z2 = NetworkProperties::zion(He4); - constexpr Real A2 = NetworkProperties::aion(He4); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_ar36_he4) = sc1a; - sp(i, j, k, vars.iscn_ar36_he4_dt) = sc1adt; - } - - // k39(p,g)ca40 - { - constexpr Real Z1 = 19.0_rt; - constexpr Real A1 = 39.0_rt; - - constexpr Real Z2 = NetworkProperties::zion(H1); - constexpr Real A2 = NetworkProperties::aion(H1); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_k39_p) = sc1a; - sp(i, j, k, vars.iscn_k39_p_dt) = sc1adt; - } - - // ca40 to ti44 - { - constexpr Real Z1 = NetworkProperties::zion(Ca40); - constexpr Real A1 = NetworkProperties::aion(Ca40); - - constexpr Real Z2 = NetworkProperties::zion(He4); - constexpr Real A2 = NetworkProperties::aion(He4); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_ca40_he4) = sc1a; - sp(i, j, k, vars.iscn_ca40_he4_dt) = sc1adt; - } - - // sc43(p,g)ti44 - { - constexpr Real Z1 = 21.0_rt; - constexpr Real A1 = 43.0_rt; - - constexpr Real Z2 = NetworkProperties::zion(H1); - constexpr Real A2 = NetworkProperties::aion(H1); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_sc43_p) = sc1a; - sp(i, j, k, vars.iscn_sc43_p_dt) = sc1adt; - } - - // ti44 to cr48 - { - constexpr Real Z1 = NetworkProperties::zion(Ti44); - constexpr Real A1 = NetworkProperties::aion(Ti44); - - constexpr Real Z2 = NetworkProperties::zion(He4); - constexpr Real A2 = NetworkProperties::aion(He4); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_ti44_he4) = sc1a; - sp(i, j, k, vars.iscn_ti44_he4_dt) = sc1adt; - } - - // v47(p,g)cr48 - { - constexpr Real Z1 = 23.0_rt; - constexpr Real A1 = 47.0_rt; - - constexpr Real Z2 = NetworkProperties::zion(H1); - constexpr Real A2 = NetworkProperties::aion(H1); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_v47_p) = sc1a; - sp(i, j, k, vars.iscn_v47_p_dt) = sc1adt; - } - - // cr48 to fe52 - { - constexpr Real Z1 = NetworkProperties::zion(Cr48); - constexpr Real A1 = NetworkProperties::aion(Cr48); - - constexpr Real Z2 = NetworkProperties::zion(He4); - constexpr Real A2 = NetworkProperties::aion(He4); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_cr48_he4) = sc1a; - sp(i, j, k, vars.iscn_cr48_he4_dt) = sc1adt; - } - - // mn51(p,g)fe52 - { - constexpr Real Z1 = 25.0_rt; - constexpr Real A1 = 51.0_rt; - - constexpr Real Z2 = NetworkProperties::zion(H1); - constexpr Real A2 = NetworkProperties::aion(H1); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_mn51_p) = sc1a; - sp(i, j, k, vars.iscn_mn51_p_dt) = sc1adt; - } - - // fe to ni - { - constexpr Real Z1 = NetworkProperties::zion(Fe52); - constexpr Real A1 = NetworkProperties::aion(Fe52); - - constexpr Real Z2 = NetworkProperties::zion(He4); - constexpr Real A2 = NetworkProperties::aion(He4); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_fe52_he4) = sc1a; - sp(i, j, k, vars.iscn_fe52_he4_dt) = sc1adt; - } - - // co55(p,g)ni56 - { - constexpr Real Z1 = 27.0_rt; - constexpr Real A1 = 55.0_rt; - - constexpr Real Z2 = NetworkProperties::zion(H1); - constexpr Real A2 = NetworkProperties::aion(H1); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_co55_p) = sc1a; - sp(i, j, k, vars.iscn_co55_p_dt) = sc1adt; - } - - // fe54(p,g)co55 - { - constexpr Real Z1 = NetworkProperties::zion(Fe54); - constexpr Real A1 = NetworkProperties::aion(Fe54); - - constexpr Real Z2 = NetworkProperties::zion(H1); - constexpr Real A2 = NetworkProperties::aion(H1); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_fe54_p) = sc1a; - sp(i, j, k, vars.iscn_fe54_p_dt) = sc1adt; - } - - // fe54(a,p)co57 - { - constexpr Real Z1 = NetworkProperties::zion(Fe54); - constexpr Real A1 = NetworkProperties::aion(Fe54); - - constexpr Real Z2 = NetworkProperties::zion(He4); - constexpr Real A2 = NetworkProperties::aion(He4); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_fe54_he4) = sc1a; - sp(i, j, k, vars.iscn_fe54_he4_dt) = sc1adt; - } - - // fe56(p,g)co57 - { - constexpr Real Z1 = NetworkProperties::zion(Fe56); - constexpr Real A1 = NetworkProperties::aion(Fe56); - - constexpr Real Z2 = NetworkProperties::zion(H1); - constexpr Real A2 = NetworkProperties::aion(H1); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_fe56_p) = sc1a; - sp(i, j, k, vars.iscn_fe56_p_dt) = sc1adt; - } - - // d + p - { - constexpr Real Z1 = 1.0_rt; - constexpr Real A1 = 2.0_rt; - - constexpr Real Z2 = NetworkProperties::zion(H1); - constexpr Real A2 = NetworkProperties::aion(H1); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_d_p) = sc1a; - sp(i, j, k, vars.iscn_d_p_dt) = sc1adt; - } - - // pp - { - constexpr Real Z1 = NetworkProperties::zion(H1); - constexpr Real A1 = NetworkProperties::aion(H1); - - constexpr Real Z2 = NetworkProperties::zion(H1); - constexpr Real A2 = NetworkProperties::aion(H1); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_p_p) = sc1a; - sp(i, j, k, vars.iscn_p_p_dt) = sc1adt; - } - - // he3 + he3 - { - constexpr Real Z1 = NetworkProperties::zion(He3); - constexpr Real A1 = NetworkProperties::aion(He3); - - constexpr Real Z2 = NetworkProperties::zion(He3); - constexpr Real A2 = NetworkProperties::aion(He3); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_he3_he3) = sc1a; - sp(i, j, k, vars.iscn_he3_he3_dt) = sc1adt; - } - - // he3 + he4 - { - constexpr Real Z1 = NetworkProperties::zion(He3); - constexpr Real A1 = NetworkProperties::aion(He3); - - constexpr Real Z2 = NetworkProperties::zion(He4); - constexpr Real A2 = NetworkProperties::aion(He4); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_he3_he4) = sc1a; - sp(i, j, k, vars.iscn_he3_he4_dt) = sc1adt; - } - - // c12(p,g)n13 - { - constexpr Real Z1 = NetworkProperties::zion(C12); - constexpr Real A1 = NetworkProperties::aion(C12); - - constexpr Real Z2 = NetworkProperties::zion(H1); - constexpr Real A2 = NetworkProperties::aion(H1); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_c12_p) = sc1a; - sp(i, j, k, vars.iscn_c12_p_dt) = sc1adt; - } - - // n14(p,g)o15 - { - constexpr Real Z1 = NetworkProperties::zion(N14); - constexpr Real A1 = NetworkProperties::aion(N14); - - constexpr Real Z2 = NetworkProperties::zion(H1); - constexpr Real A2 = NetworkProperties::aion(H1); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_n14_p) = sc1a; - sp(i, j, k, vars.iscn_n14_p_dt) = sc1adt; - } - - // o16(p,g)f17 - { - constexpr Real Z1 = NetworkProperties::zion(O16); - constexpr Real A1 = NetworkProperties::aion(O16); - - constexpr Real Z2 = NetworkProperties::zion(H1); - constexpr Real A2 = NetworkProperties::aion(H1); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_o16_p) = sc1a; - sp(i, j, k, vars.iscn_o16_p_dt) = sc1adt; - } - - // n14(a,g)f18 - { - constexpr Real Z1 = NetworkProperties::zion(N14); - constexpr Real A1 = NetworkProperties::aion(N14); - - constexpr Real Z2 = NetworkProperties::zion(He4); - constexpr Real A2 = NetworkProperties::aion(He4); - - constexpr auto scn_fac = scrn::calculate_screen_factor(Z1, A1, Z2, A2); - - static_assert(scn_fac.z1 == Z1); - - actual_screen(pstate, scn_fac, sc1a, sc1adt); - sp(i, j, k, vars.iscn_n14_he4) = sc1a; - sp(i, j, k, vars.iscn_n14_he4_dt) = sc1adt; - } - - }); - -} diff --git a/unit_test/test_screening/test_screen.H b/unit_test/test_screening/test_screen.H deleted file mode 100644 index 0223e36a8d..0000000000 --- a/unit_test/test_screening/test_screen.H +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef TEST_SCREEN_H -#define TEST_SCREEN_H - -#include -#include - -void main_main(); - -void screen_test_C(const Box& bx, - const amrex::Real dlogrho, const amrex::Real dlogT, const amrex::Real dmetal, - const plot_t& vars, - Array4 const sp); - -#endif diff --git a/unit_test/test_screening/variables.H b/unit_test/test_screening/variables.H deleted file mode 100644 index 002027e8fe..0000000000 --- a/unit_test/test_screening/variables.H +++ /dev/null @@ -1,105 +0,0 @@ -#include -#include - -#ifndef VARIABLES_H -#define VARIABLES_H - -#include - -class plot_t { - -public: - - - int irho = -1; - int itemp = -1; - int ispec = -1; - - int iscn_he4_he4 = -1; - int iscn_he4_be8 = -1; - int iscn_c12_he4 = -1; - int iscn_c12_c12 = -1; - int iscn_c12_o16 = -1; - int iscn_o16_o16 = -1; - int iscn_o16_he4 = -1; - int iscn_ne20_he4 = -1; - int iscn_mg24_he4 = -1; - int iscn_al27_p = -1; - int iscn_si28_he4 = -1; - int iscn_p31_p = -1; - int iscn_s32_he4 = -1; - int iscn_cl35_p = -1; - int iscn_ar36_he4 = -1; - int iscn_k39_p = -1; - int iscn_ca40_he4 = -1; - int iscn_sc43_p = -1; - int iscn_ti44_he4 = -1; - int iscn_v47_p = -1; - int iscn_cr48_he4 = -1; - int iscn_mn51_p = -1; - int iscn_fe52_he4 = -1; - int iscn_co55_p = -1; - int iscn_fe54_p = -1; - int iscn_fe54_he4 = -1; - int iscn_fe56_p = -1; - int iscn_d_p = -1; - int iscn_p_p = -1; - int iscn_he3_he3 = -1; - int iscn_he3_he4 = -1; - int iscn_c12_p = -1; - int iscn_n14_p = -1; - int iscn_o16_p = -1; - int iscn_n14_he4 = -1; - - int iscn_he4_he4_dt = -1; - int iscn_he4_be8_dt = -1; - int iscn_c12_he4_dt = -1; - int iscn_c12_c12_dt = -1; - int iscn_c12_o16_dt = -1; - int iscn_o16_o16_dt = -1; - int iscn_o16_he4_dt = -1; - int iscn_ne20_he4_dt = -1; - int iscn_mg24_he4_dt = -1; - int iscn_al27_p_dt = -1; - int iscn_si28_he4_dt = -1; - int iscn_p31_p_dt = -1; - int iscn_s32_he4_dt = -1; - int iscn_cl35_p_dt = -1; - int iscn_ar36_he4_dt = -1; - int iscn_k39_p_dt = -1; - int iscn_ca40_he4_dt = -1; - int iscn_sc43_p_dt = -1; - int iscn_ti44_he4_dt = -1; - int iscn_v47_p_dt = -1; - int iscn_cr48_he4_dt = -1; - int iscn_mn51_p_dt = -1; - int iscn_fe52_he4_dt = -1; - int iscn_co55_p_dt = -1; - int iscn_fe54_p_dt = -1; - int iscn_fe54_he4_dt = -1; - int iscn_fe56_p_dt = -1; - int iscn_d_p_dt = -1; - int iscn_p_p_dt = -1; - int iscn_he3_he3_dt = -1; - int iscn_he3_he4_dt = -1; - int iscn_c12_p_dt = -1; - int iscn_n14_p_dt = -1; - int iscn_o16_p_dt = -1; - int iscn_n14_he4_dt = -1; - - int n_plot_comps = 0; - - int next_index(const int num) { - int next = n_plot_comps; - n_plot_comps += num; - return next; - } - -}; - -plot_t init_variables(); - -void get_varnames(const plot_t& p, amrex::Vector& names); - - -#endif diff --git a/unit_test/test_screening/variables.cpp b/unit_test/test_screening/variables.cpp deleted file mode 100644 index f5661e45ce..0000000000 --- a/unit_test/test_screening/variables.cpp +++ /dev/null @@ -1,173 +0,0 @@ -#include -#include - -plot_t init_variables() { - - plot_t p; - - p.irho = p.next_index(1); - p.itemp = p.next_index(1); - p.ispec = p.next_index(NumSpec); - - p.iscn_he4_he4 = p.next_index(1); - p.iscn_he4_be8 = p.next_index(1); - p.iscn_c12_he4 = p.next_index(1); - p.iscn_c12_c12 = p.next_index(1); - p.iscn_c12_o16 = p.next_index(1); - p.iscn_o16_o16 = p.next_index(1); - p.iscn_o16_he4 = p.next_index(1); - p.iscn_ne20_he4 = p.next_index(1); - p.iscn_mg24_he4 = p.next_index(1); - p.iscn_al27_p = p.next_index(1); - p.iscn_si28_he4 = p.next_index(1); - p.iscn_p31_p = p.next_index(1); - p.iscn_s32_he4 = p.next_index(1); - p.iscn_cl35_p = p.next_index(1); - p.iscn_ar36_he4 = p.next_index(1); - p.iscn_k39_p = p.next_index(1); - p.iscn_ca40_he4 = p.next_index(1); - p.iscn_sc43_p = p.next_index(1); - p.iscn_ti44_he4 = p.next_index(1); - p.iscn_v47_p = p.next_index(1); - p.iscn_cr48_he4 = p.next_index(1); - p.iscn_mn51_p = p.next_index(1); - p.iscn_fe52_he4 = p.next_index(1); - p.iscn_co55_p = p.next_index(1); - p.iscn_fe54_p = p.next_index(1); - p.iscn_fe54_he4 = p.next_index(1); - p.iscn_fe56_p = p.next_index(1); - p.iscn_d_p = p.next_index(1); - p.iscn_p_p = p.next_index(1); - p.iscn_he3_he3 = p.next_index(1); - p.iscn_he3_he4 = p.next_index(1); - p.iscn_c12_p = p.next_index(1); - p.iscn_n14_p = p.next_index(1); - p.iscn_o16_p = p.next_index(1); - p.iscn_n14_he4 = p.next_index(1); - - p.iscn_he4_he4_dt = p.next_index(1); - p.iscn_he4_be8_dt = p.next_index(1); - p.iscn_c12_he4_dt = p.next_index(1); - p.iscn_c12_c12_dt = p.next_index(1); - p.iscn_c12_o16_dt = p.next_index(1); - p.iscn_o16_o16_dt = p.next_index(1); - p.iscn_o16_he4_dt = p.next_index(1); - p.iscn_ne20_he4_dt = p.next_index(1); - p.iscn_mg24_he4_dt = p.next_index(1); - p.iscn_al27_p_dt = p.next_index(1); - p.iscn_si28_he4_dt = p.next_index(1); - p.iscn_p31_p_dt = p.next_index(1); - p.iscn_s32_he4_dt = p.next_index(1); - p.iscn_cl35_p_dt = p.next_index(1); - p.iscn_ar36_he4_dt = p.next_index(1); - p.iscn_k39_p_dt = p.next_index(1); - p.iscn_ca40_he4_dt = p.next_index(1); - p.iscn_sc43_p_dt = p.next_index(1); - p.iscn_ti44_he4_dt = p.next_index(1); - p.iscn_v47_p_dt = p.next_index(1); - p.iscn_cr48_he4_dt = p.next_index(1); - p.iscn_mn51_p_dt = p.next_index(1); - p.iscn_fe52_he4_dt = p.next_index(1); - p.iscn_co55_p_dt = p.next_index(1); - p.iscn_fe54_p_dt = p.next_index(1); - p.iscn_fe54_he4_dt = p.next_index(1); - p.iscn_fe56_p_dt = p.next_index(1); - p.iscn_d_p_dt = p.next_index(1); - p.iscn_p_p_dt = p.next_index(1); - p.iscn_he3_he3_dt = p.next_index(1); - p.iscn_he3_he4_dt = p.next_index(1); - p.iscn_c12_p_dt = p.next_index(1); - p.iscn_n14_p_dt = p.next_index(1); - p.iscn_o16_p_dt = p.next_index(1); - p.iscn_n14_he4_dt = p.next_index(1); - - - return p; -} - - -void get_varnames(const plot_t& p, amrex::Vector& names) { - - names.resize(p.n_plot_comps); - - names[p.irho] = "density"; - names[p.itemp] = "temperature"; - for (int n = 0; n < NumSpec; n++) { - names[p.ispec + n] = "X_" + spec_names_cxx[n]; - } - - names[p.iscn_he4_he4] = "scn_he4_he4"; - names[p.iscn_he4_be8] = "scn_he4_be8"; - names[p.iscn_c12_he4] = "scn_c12_he4"; - names[p.iscn_c12_c12] = "scn_c12_c12"; - names[p.iscn_c12_o16] = "scn_c12_o16"; - names[p.iscn_o16_o16] = "scn_o16_o16"; - names[p.iscn_o16_he4] = "scn_o16_he4"; - names[p.iscn_ne20_he4] = "scn_ne20_he4"; - names[p.iscn_mg24_he4] = "scn_mg24_he4"; - names[p.iscn_al27_p] = "scn_al27_p"; - names[p.iscn_si28_he4] = "scn_si28_he4"; - names[p.iscn_p31_p] = "scn_p31_p"; - names[p.iscn_s32_he4] = "scn_s32_he4"; - names[p.iscn_cl35_p] = "scn_cl35_p"; - names[p.iscn_ar36_he4] = "scn_ar36_he4"; - names[p.iscn_k39_p] = "scn_k39_p"; - names[p.iscn_ca40_he4] = "scn_ca40_he4"; - names[p.iscn_sc43_p] = "scn_sc43_p"; - names[p.iscn_ti44_he4] = "scn_ti44_he4"; - names[p.iscn_v47_p] = "scn_v47_p"; - names[p.iscn_cr48_he4] = "scn_cr48_he4"; - names[p.iscn_mn51_p] = "scn_mn51_p"; - names[p.iscn_fe52_he4] = "scn_fe52_he4"; - names[p.iscn_co55_p] = "scn_co55_p"; - names[p.iscn_fe54_p] = "scn_fe54_p"; - names[p.iscn_fe54_he4] = "scn_fe54_he4"; - names[p.iscn_fe56_p] = "scn_fe56_p"; - names[p.iscn_d_p] = "scn_d_p"; - names[p.iscn_p_p] = "scn_p_p"; - names[p.iscn_he3_he3] = "scn_he3_he3"; - names[p.iscn_he3_he4] = "scn_he3_he4"; - names[p.iscn_c12_p] = "scn_c12_p"; - names[p.iscn_n14_p] = "scn_n14_p"; - names[p.iscn_o16_p] = "scn_o16_p"; - names[p.iscn_n14_he4] = "scn_n14_he4"; - - names[p.iscn_he4_he4_dt] = "scn_he4_he4_dt"; - names[p.iscn_he4_be8_dt] = "scn_he4_be8_dt"; - names[p.iscn_c12_he4_dt] = "scn_c12_he4_dt"; - names[p.iscn_c12_c12_dt] = "scn_c12_c12_dt"; - names[p.iscn_c12_o16_dt] = "scn_c12_o16_dt"; - names[p.iscn_o16_o16_dt] = "scn_o16_o16_dt"; - names[p.iscn_o16_he4_dt] = "scn_o16_he4_dt"; - names[p.iscn_ne20_he4_dt] = "scn_ne20_he4_dt"; - names[p.iscn_mg24_he4_dt] = "scn_mg24_he4_dt"; - names[p.iscn_al27_p_dt] = "scn_al27_p_dt"; - names[p.iscn_si28_he4_dt] = "scn_si28_he4_dt"; - names[p.iscn_p31_p_dt] = "scn_p31_p_dt"; - names[p.iscn_s32_he4_dt] = "scn_s32_he4_dt"; - names[p.iscn_cl35_p_dt] = "scn_cl35_p_dt"; - names[p.iscn_ar36_he4_dt] = "scn_ar36_he4_dt"; - names[p.iscn_k39_p_dt] = "scn_k39_p_dt"; - names[p.iscn_ca40_he4_dt] = "scn_ca40_he4_dt"; - names[p.iscn_sc43_p_dt] = "scn_sc43_p_dt"; - names[p.iscn_ti44_he4_dt] = "scn_ti44_he4_dt"; - names[p.iscn_v47_p_dt] = "scn_v47_p_dt"; - names[p.iscn_cr48_he4_dt] = "scn_cr48_he4_dt"; - names[p.iscn_mn51_p_dt] = "scn_mn51_p_dt"; - names[p.iscn_fe52_he4_dt] = "scn_fe52_he4_dt"; - names[p.iscn_co55_p_dt] = "scn_co55_p_dt"; - names[p.iscn_fe54_p_dt] = "scn_fe54_p_dt"; - names[p.iscn_fe54_he4_dt] = "scn_fe54_he4_dt"; - names[p.iscn_fe56_p_dt] = "scn_fe56_p_dt"; - names[p.iscn_d_p_dt] = "scn_d_p_dt"; - names[p.iscn_p_p_dt] = "scn_p_p_dt"; - names[p.iscn_he3_he3_dt] = "scn_he3_he3_dt"; - names[p.iscn_he3_he4_dt] = "scn_he3_he4_dt"; - names[p.iscn_c12_p_dt] = "scn_c12_p_dt"; - names[p.iscn_n14_p_dt] = "scn_n14_p_dt"; - names[p.iscn_o16_p_dt] = "scn_o16_p_dt"; - names[p.iscn_n14_he4_dt] = "scn_n14_he4_dt"; - -} - - From 448132f96834e1958e5fe38a10f08610ec665981 Mon Sep 17 00:00:00 2001 From: Zhi Chen <62574124+zhichen3@users.noreply.github.com> Date: Fri, 12 Jul 2024 07:30:45 -0400 Subject: [PATCH 06/33] remove test_nse and rename test_ase -> test_nse_net (#1610) remove redundant test_nse and rename test_ase to test_nse_net for better clarity --- .github/workflows/cuda.yml | 4 +- .github/workflows/nse_net.yml | 32 +++---- .github/workflows/nse_test.yml | 48 ----------- unit_test/test_nse/GNUmakefile | 42 ---------- unit_test/test_nse/Make.package | 2 - unit_test/test_nse/README.md | 7 -- unit_test/test_nse/_parameters | 17 ---- .../test_nse/ci-benchmarks/aprox21_ci.out | 54 ------------ unit_test/test_nse/inputs_aprox13 | 21 ----- unit_test/test_nse/inputs_aprox19 | 30 ------- unit_test/test_nse/inputs_aprox21 | 32 ------- unit_test/test_nse/inputs_iso7 | 16 ---- unit_test/test_nse/inputs_subch_full | 25 ------ unit_test/test_nse/main.cpp | 34 -------- unit_test/test_nse/nse_example.H | 83 ------------------- .../{test_ase => test_nse_net}/GNUmakefile | 0 .../{test_ase => test_nse_net}/Make.package | 0 .../{test_ase => test_nse_net}/README.md | 4 +- .../{test_ase => test_nse_net}/_parameters | 0 .../{test_ase => test_nse_net}/burn_cell.H | 0 .../ci-benchmarks/nse_net_unit_test.out} | 0 .../{test_ase => test_nse_net}/inputs_ase | 0 unit_test/{test_ase => test_nse_net}/main.cpp | 0 .../make_table/GNUmakefile | 0 .../make_table/Make.package | 0 .../make_table/README.md | 0 .../make_table/_parameters | 0 .../make_table/burn_cell.H | 0 .../nse_net_make_table_unit_test.out} | 0 .../make_table/main.cpp | 0 30 files changed, 20 insertions(+), 431 deletions(-) delete mode 100644 .github/workflows/nse_test.yml delete mode 100644 unit_test/test_nse/GNUmakefile delete mode 100644 unit_test/test_nse/Make.package delete mode 100644 unit_test/test_nse/README.md delete mode 100644 unit_test/test_nse/_parameters delete mode 100644 unit_test/test_nse/ci-benchmarks/aprox21_ci.out delete mode 100644 unit_test/test_nse/inputs_aprox13 delete mode 100644 unit_test/test_nse/inputs_aprox19 delete mode 100644 unit_test/test_nse/inputs_aprox21 delete mode 100644 unit_test/test_nse/inputs_iso7 delete mode 100644 unit_test/test_nse/inputs_subch_full delete mode 100644 unit_test/test_nse/main.cpp delete mode 100644 unit_test/test_nse/nse_example.H rename unit_test/{test_ase => test_nse_net}/GNUmakefile (100%) rename unit_test/{test_ase => test_nse_net}/Make.package (100%) rename unit_test/{test_ase => test_nse_net}/README.md (82%) rename unit_test/{test_ase => test_nse_net}/_parameters (100%) rename unit_test/{test_ase => test_nse_net}/burn_cell.H (100%) rename unit_test/{test_ase/ci-benchmarks/ase_nse_net_unit_test.out => test_nse_net/ci-benchmarks/nse_net_unit_test.out} (100%) rename unit_test/{test_ase => test_nse_net}/inputs_ase (100%) rename unit_test/{test_ase => test_nse_net}/main.cpp (100%) rename unit_test/{test_ase => test_nse_net}/make_table/GNUmakefile (100%) rename unit_test/{test_ase => test_nse_net}/make_table/Make.package (100%) rename unit_test/{test_ase => test_nse_net}/make_table/README.md (100%) rename unit_test/{test_ase => test_nse_net}/make_table/_parameters (100%) rename unit_test/{test_ase => test_nse_net}/make_table/burn_cell.H (100%) rename unit_test/{test_ase/make_table/ci-benchmarks/ase_nse_net_make_table_unit_test.out => test_nse_net/make_table/ci-benchmarks/nse_net_make_table_unit_test.out} (100%) rename unit_test/{test_ase => test_nse_net}/make_table/main.cpp (100%) diff --git a/.github/workflows/cuda.yml b/.github/workflows/cuda.yml index 60aff9d0e8..7e418249a8 100644 --- a/.github/workflows/cuda.yml +++ b/.github/workflows/cuda.yml @@ -41,8 +41,8 @@ jobs: make realclean make NETWORK_DIR=ignition_reaclib/URCA-simple USE_CUDA=TRUE COMP=gnu USE_MPI=FALSE -j 2 - - name: compile test_ase (ase) + - name: compile test_nse_net (ase) run: | export PATH=/usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH} - cd unit_test/test_ase + cd unit_test/test_nse_net make USE_CUDA=TRUE COMP=gnu USE_MPI=FALSE -j 2 diff --git a/.github/workflows/nse_net.yml b/.github/workflows/nse_net.yml index e6e8741724..fc1124fe61 100644 --- a/.github/workflows/nse_net.yml +++ b/.github/workflows/nse_net.yml @@ -26,42 +26,42 @@ jobs: sudo apt-get update -y -qq sudo apt-get -qq -y install curl cmake jq clang g++>=9.3.0 - - name: Compile, test_ase (NSE_NET, ase) + - name: Compile, test_nse_net (NSE_NET, ase) run: | - cd unit_test/test_ase + cd unit_test/test_nse_net make realclean make -j 4 - - name: Run test_ase (NSE_NET, ase) + - name: Run test_nse_net (NSE_NET, ase) run: | - cd unit_test/test_ase + cd unit_test/test_nse_net ./main3d.gnu.ex inputs_ase amrex.fpe_trap_{invalid,zero,overflow}=1 > test.out - name: Print backtrace - if: ${{ failure() && hashFiles('unit_test/test_ase/Backtrace.0') != '' }} - run: cat unit_test/test_ase/Backtrace.0 + if: ${{ failure() && hashFiles('unit_test/test_nse_net/Backtrace.0') != '' }} + run: cat unit_test/test_nse_net/Backtrace.0 - name: Compare to stored output (NSE_NET, ase) run: | - cd unit_test/test_ase - diff -I "^Initializing AMReX" -I "^AMReX" -I "^reading in reaclib rates" test.out ci-benchmarks/ase_nse_net_unit_test.out + cd unit_test/test_nse_net + diff -I "^Initializing AMReX" -I "^AMReX" -I "^reading in reaclib rates" test.out ci-benchmarks/nse_net_unit_test.out - - name: Compile, test_ase/make_table (NSE_NET, ase, make_table) + - name: Compile, test_nse_net/make_table (NSE_NET, ase, make_table) run: | - cd unit_test/test_ase/make_table + cd unit_test/test_nse_net/make_table make realclean make -j 4 - - name: Run, test_ase/make_table (NSE_NET, ase, make_table) + - name: Run, test_nse_net/make_table (NSE_NET, ase, make_table) run: | - cd unit_test/test_ase/make_table + cd unit_test/test_nse_net/make_table ./main3d.gnu.ex amrex.fpe_trap_{invalid,zero,overflow}=1 > test.out - name: Print backtrace - if: ${{ failure() && hashFiles('unit_test/test_ase/make_table/Backtrace.0') != '' }} - run: cat unit_test/test_ase/make_table/Backtrace.0 + if: ${{ failure() && hashFiles('unit_test/test_nse_net/make_table/Backtrace.0') != '' }} + run: cat unit_test/test_nse_net/make_table/Backtrace.0 - name: Compare to stored output (NSE_NET, ase, make_table) run: | - cd unit_test/test_ase/make_table - diff -I "^Initializing AMReX" -I "^AMReX" -I "^reading in reaclib rates" test.out ci-benchmarks/ase_nse_net_make_table_unit_test.out + cd unit_test/test_nse_net/make_table + diff -I "^Initializing AMReX" -I "^AMReX" -I "^reading in reaclib rates" test.out ci-benchmarks/nse_net_make_table_unit_test.out diff --git a/.github/workflows/nse_test.yml b/.github/workflows/nse_test.yml deleted file mode 100644 index 1b898f0e8c..0000000000 --- a/.github/workflows/nse_test.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: nse_test - -on: [pull_request] -jobs: - nse_test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Get AMReX - run: | - mkdir external - cd external - git clone https://github.com/AMReX-Codes/amrex.git - cd amrex - git checkout development - echo 'AMREX_HOME=$(GITHUB_WORKSPACE)/external/amrex' >> $GITHUB_ENV - echo $AMREX_HOME - if [[ -n "${AMREX_HOME}" ]]; then exit 1; fi - cd ../.. - - - name: Install dependencies - run: | - sudo apt-get update -y -qq - sudo apt-get -qq -y install curl cmake jq clang g++>=9.3.0 - - - name: Compile, test_nse (aprox21) - run: | - cd unit_test/test_nse - make realclean - make NETWORK_DIR=aprox21 -j 4 - - - name: Run test_nse (aprox21) - run: | - cd unit_test/test_nse - ./main3d.gnu.ex inputs_aprox21 amrex.fpe_trap_{invalid,zero,overflow}=1 > test.out - - - name: Print backtrace - if: ${{ failure() && hashFiles('unit_test/test_nse/Backtrace.0') != '' }} - run: cat unit_test/test_nse/Backtrace.0 - - - name: Compare to stored output (aprox21) - run: | - cd unit_test/test_nse - diff -I "^Initializing AMReX" -I "^AMReX" -I "^reading in reaclib rates" -I "^0x" test.out ci-benchmarks/aprox21_ci.out - diff --git a/unit_test/test_nse/GNUmakefile b/unit_test/test_nse/GNUmakefile deleted file mode 100644 index be47b8580a..0000000000 --- a/unit_test/test_nse/GNUmakefile +++ /dev/null @@ -1,42 +0,0 @@ -PRECISION = DOUBLE -PROFILE = FALSE - -DEBUG = FALSE - -DIM = 3 - -COMP = gnu - -USE_MPI = FALSE -USE_OMP = FALSE - -USE_REACT = TRUE - -USE_NSE_NET = TRUE -EBASE = main - -BL_NO_FORT = TRUE - -# define the location of the Microphysics top directory -MICROPHYSICS_HOME := ../.. - -# This sets the EOS directory -EOS_DIR := helmholtz - -# This sets the network directory -NETWORK_DIR := aprox21 - -SCREEN_METHOD := chabrier1998 - -USE_SIMPLIFIED_SDC = TRUE - -CONDUCTIVITY_DIR := stellar - -INTEGRATOR_DIR = VODE - -EXTERN_SEARCH += . .. - -Bpack := ./Make.package -Blocs := . - -include $(MICROPHYSICS_HOME)/unit_test/Make.unit_test diff --git a/unit_test/test_nse/Make.package b/unit_test/test_nse/Make.package deleted file mode 100644 index 6bc6cd127c..0000000000 --- a/unit_test/test_nse/Make.package +++ /dev/null @@ -1,2 +0,0 @@ -CEXE_sources += main.cpp -CEXE_headers += nse_example.H diff --git a/unit_test/test_nse/README.md b/unit_test/test_nse/README.md deleted file mode 100644 index 27f809bb53..0000000000 --- a/unit_test/test_nse/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# nse_example - -`nse_example` finds the NSE mass fractions of a given state. -The density, temperature, and composition are set in the -inputs file. - -Upon completion, the new state is printed to the screen. \ No newline at end of file diff --git a/unit_test/test_nse/_parameters b/unit_test/test_nse/_parameters deleted file mode 100644 index 355960df5e..0000000000 --- a/unit_test/test_nse/_parameters +++ /dev/null @@ -1,17 +0,0 @@ -@namespace: unit_test - -run_prefix string "" - -small_temp real 1.e5 -small_dens real 1.e5 - -density real 1.e7 - -temperature real 3.e9 - -mu_p real -3.0 -mu_n real -12.0 - -y_e real 0.5 - - diff --git a/unit_test/test_nse/ci-benchmarks/aprox21_ci.out b/unit_test/test_nse/ci-benchmarks/aprox21_ci.out deleted file mode 100644 index bb3bd62e2e..0000000000 --- a/unit_test/test_nse/ci-benchmarks/aprox21_ci.out +++ /dev/null @@ -1,54 +0,0 @@ -Initializing AMReX (23.07-395-ge6c93bf22695)... -AMReX (23.07-395-ge6c93bf22695) initialized -starting the single zone burn... -0x7ffcbd574c90 -State Density (g/cm^3): 277355338.4 -State Temperature (K): 5197769252 -Mass Fraction (H1): 0.4 -Mass Fraction (He3): 0.2 -Mass Fraction (He4): 0.2 -Mass Fraction (C12): 0.01111111111 -Mass Fraction (N14): 0.01111111111 -Mass Fraction (O16): 0.01111111111 -Mass Fraction (Ne20): 0.01111111111 -Mass Fraction (Mg24): 0.01111111111 -Mass Fraction (Si28): 0.01111111111 -Mass Fraction (S32): 0.01111111111 -Mass Fraction (Ar36): 0.01111111111 -Mass Fraction (Ca40): 0.01111111111 -Mass Fraction (Ti44): 0.01111111111 -Mass Fraction (Cr48): 0.01111111111 -Mass Fraction (Cr56): 0.01111111111 -Mass Fraction (Fe52): 0.01111111111 -Mass Fraction (Fe54): 0.01111111111 -Mass Fraction (Fe56): 0.01111111111 -Mass Fraction (Ni56): 0.01111111111 -Mass Fraction (n): 0.01111111111 -Mass Fraction (p): 0.01111111111 -electron fraction is 0.5 -After solving: -chemical potential of proton is -5.581982209 -chemical potential of neutron is -12.0247581 -NSE state: -H1 : 0 -He3 : 6.726596351e-12 -He4 : 0.002680193661 -C12 : 2.088656717e-08 -N14 : 3.63235298e-13 -O16 : 8.472970972e-08 -Ne20 : 1.346294667e-09 -Mg24 : 5.596482124e-07 -Si28 : 0.0010080397 -S32 : 0.002046314471 -Ar36 : 0.00209146282 -Ca40 : 0.005238622021 -Ti44 : 0.0001839172934 -Cr48 : 0.002037708642 -Cr56 : 7.745054245e-22 -Fe52 : 0.03983693988 -Fe54 : 0.04496220141 -Fe56 : 1.685809845e-05 -Ni56 : 0.8982306026 -n : 9.441707272e-10 -p : 0.001666471811 -AMReX (23.07-395-ge6c93bf22695) finalized diff --git a/unit_test/test_nse/inputs_aprox13 b/unit_test/test_nse/inputs_aprox13 deleted file mode 100644 index 1f6020da45..0000000000 --- a/unit_test/test_nse/inputs_aprox13 +++ /dev/null @@ -1,21 +0,0 @@ -unit_test.small_temp = 1.e5 -unit_test.small_dens = 1.e5 - -unit_test.density = 1.e6 -unit_test.temperature = 3.e9 - -unit_test.X1 = 1.0 -unit_test.X2 = 0.0 -unit_test.X3 = 0.0 -unit_test.X4 = 0.0 -unit_test.X5 = 0.0 -unit_test.X6 = 0.0 -unit_test.X7 = 0.0 -unit_test.X8 = 0.0 -unit_test.X9 = 0.0 -unit_test.X10 = 0.0 -unit_test.X11 = 0.0 -unit_test.X12 = 0.0 -unit_test.X13 = 0.0 - -unit_test.y_e = 0.5 diff --git a/unit_test/test_nse/inputs_aprox19 b/unit_test/test_nse/inputs_aprox19 deleted file mode 100644 index 3ac62abc70..0000000000 --- a/unit_test/test_nse/inputs_aprox19 +++ /dev/null @@ -1,30 +0,0 @@ -unit_test.small_temp = 1.e5 -unit_test.small_dens = 1.e5 - -unit_test.density = 1.e6 -unit_test.temperature = 3.e9 - -unit_test.X1 = 0.7 -unit_test.X2 = 0.025 -unit_test.X3 = 0.2 -unit_test.X4 = 0.025 -unit_test.X5 = 0.025 -unit_test.X6 = 0.025 -unit_test.X7 = 0.0 -unit_test.X8 = 0.0 -unit_test.X9 = 0.0 -unit_test.X10 = 0.0 -unit_test.X11 = 0.0 -unit_test.X12 = 0.0 -unit_test.X13 = 0.0 -unit_test.X14 = 0.0 -unit_test.X15 = 0.0 -unit_test.X16 = 0.0 -unit_test.X17 = 0.0 -unit_test.X18 = 0.0 -unit_test.X19 = 0.0 - -unit_test.mu_p = -3.0 -unit_test.mu_n = -12.0 - -unit_test.y_e = 0.5 diff --git a/unit_test/test_nse/inputs_aprox21 b/unit_test/test_nse/inputs_aprox21 deleted file mode 100644 index 480b74ca54..0000000000 --- a/unit_test/test_nse/inputs_aprox21 +++ /dev/null @@ -1,32 +0,0 @@ -unit_test.small_temp = 1e5 -unit_test.small_dens = 1e5 - -unit_test.density = 277355338.38976681 -unit_test.temperature = 5197769252.1761198 - -unit_test.X1 = 0.4 -unit_test.X2 = 0.2 -unit_test.X3 = 0.2 -unit_test.X4 = 0.01111111111 -unit_test.X5 = 0.01111111111 -unit_test.X6 = 0.01111111111 -unit_test.X7 = 0.01111111111 -unit_test.X8 = 0.01111111111 -unit_test.X9 = 0.01111111111 -unit_test.X10 = 0.01111111111 -unit_test.X11 = 0.01111111111 -unit_test.X12 = 0.01111111111 -unit_test.X13 = 0.01111111111 -unit_test.X14 = 0.01111111111 -unit_test.X15 = 0.01111111111 -unit_test.X16 = 0.01111111111 -unit_test.X17 = 0.01111111111 -unit_test.X18 = 0.01111111111 -unit_test.X19 = 0.01111111111 -unit_test.X20 = 0.01111111111 -unit_test.X21 = 0.01111111111 - -unit_test.mu_p = -3.0 -unit_test.mu_n = -12.0 - -unit_test.y_e = 0.5 diff --git a/unit_test/test_nse/inputs_iso7 b/unit_test/test_nse/inputs_iso7 deleted file mode 100644 index 45d1a6c7cc..0000000000 --- a/unit_test/test_nse/inputs_iso7 +++ /dev/null @@ -1,16 +0,0 @@ -unit_test.small_temp = 1e5 -unit_test.small_dens = 1e5 - -unit_test.density = 1.e6 -unit_test.temperature = 3.e9 - -unit_test.X1 = 1.0 -unit_test.X2 = 0.0 -unit_test.X3 = 0.0 -unit_test.X4 = 0.0 -unit_test.X5 = 0.0 -unit_test.X6 = 0.0 -unit_test.X7 = 0.0 - -unit_test.y_e = 0.5 - diff --git a/unit_test/test_nse/inputs_subch_full b/unit_test/test_nse/inputs_subch_full deleted file mode 100644 index 171b663f4e..0000000000 --- a/unit_test/test_nse/inputs_subch_full +++ /dev/null @@ -1,25 +0,0 @@ -unit_test.small_temp = 1.e5 -unit_test.small_dens = 1.e5 - -unit_test.density = 1.e6 -unit_test.temperature = 3.e9 - -unit_test.X1 = 0.5 -unit_test.X2 = 0.1 -unit_test.X3 = 0.1 -unit_test.X4 = 0.1 -unit_test.X5 = 0.1 -unit_test.X6 = 0.1 -unit_test.X7 = 0.0 -unit_test.X8 = 0.0 -unit_test.X9 = 0.0 -unit_test.X10 = 0.0 -unit_test.X11 = 0.0 -unit_test.X12 = 0.0 -unit_test.X13 = 0.0 - -unit_test.mu_p = -3.0 -unit_test.mu_n = -12.0 - -unit_test.y_e = 0.5 - diff --git a/unit_test/test_nse/main.cpp b/unit_test/test_nse/main.cpp deleted file mode 100644 index 04ed4eec82..0000000000 --- a/unit_test/test_nse/main.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include -#include -#include - -#include -#include -using namespace amrex; - -#include -#include -#include -#include -#include - -int main(int argc, char *argv[]) { - - amrex::Initialize(argc, argv); - - std::cout << "starting the single zone burn..." << std::endl; - - ParmParse ppa("amr"); - - init_unit_test(); - - // C++ EOS initialization (must be done after Fortran eos_init and init_extern_parameters) - eos_init(small_temp, small_dens); - - // C++ Network, RHS, screening, rates initialization - network_init(); - - nse_example_c(); - - amrex::Finalize(); -} diff --git a/unit_test/test_nse/nse_example.H b/unit_test/test_nse/nse_example.H deleted file mode 100644 index 5a712485d2..0000000000 --- a/unit_test/test_nse/nse_example.H +++ /dev/null @@ -1,83 +0,0 @@ -#ifndef NSE_EXAMPLE_H -#define NSE_EXAMPLE_H - -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace unit_test_rp; - -AMREX_INLINE -void nse_example_c() -{ - - burn_t state; - - amrex::Real massfractions[NumSpec] = {-1.0}; - std::cout << massfractions << std::endl; - // Make sure user set all the mass fractions to values in the interval [0, 1] - for (int n = 1; n <= NumSpec; ++n) { - - massfractions[n-1] = get_xn(n); - - 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]!"); - } - - } - - // Echo initial conditions at burn and fill burn state input - - std::cout << "State Density (g/cm^3): " << density << std::endl; - std::cout << "State Temperature (K): " << temperature << std::endl; - for (int n = 0; n < NumSpec; ++n) { - std::cout << "Mass Fraction (" << short_spec_names_cxx[n] << "): " << massfractions[n] << std::endl; - } - - state.T = temperature; - state.rho = density; - for (int n = 0; n < NumSpec; ++n) { - state.xn[n] = massfractions[n]; - } - - - // normalize -- just in case - - normalize_abundances_burn(state); - - // compute the initial Ye - - state.y_e = y_e; - - // composition(state); - - std::cout << "electron fraction is " << state.y_e << std::endl; - - // set initial chemical potential of proton and neutron - - state.mu_p = mu_p; - state.mu_n = mu_n; - - const bool assume_ye_valid = true; - amrex::Real eps = 1.0e-10_rt; - - // find the nse state - use_hybrid_solver = 1; - - auto NSE_STATE = get_actual_nse_state(state, eps, assume_ye_valid); - - std::cout << "After solving: " << std::endl; - std::cout << "chemical potential of proton is " << state.mu_p << std::endl; - std::cout << "chemical potential of neutron is " << state.mu_n << std::endl; - - std::cout << "NSE state: " << std::endl; - for (int n = 0; n < NumSpec; ++n) { - std::cout << short_spec_names_cxx[n] << " : " << NSE_STATE.xn[n]<< std::endl; - } -} -#endif diff --git a/unit_test/test_ase/GNUmakefile b/unit_test/test_nse_net/GNUmakefile similarity index 100% rename from unit_test/test_ase/GNUmakefile rename to unit_test/test_nse_net/GNUmakefile diff --git a/unit_test/test_ase/Make.package b/unit_test/test_nse_net/Make.package similarity index 100% rename from unit_test/test_ase/Make.package rename to unit_test/test_nse_net/Make.package diff --git a/unit_test/test_ase/README.md b/unit_test/test_nse_net/README.md similarity index 82% rename from unit_test/test_ase/README.md rename to unit_test/test_nse_net/README.md index f7069ddcdd..098db51823 100644 --- a/unit_test/test_ase/README.md +++ b/unit_test/test_nse_net/README.md @@ -1,6 +1,6 @@ -# test_ase +# test_nse_net -`test_ase` finds the NSE mass fractions of a given state. +`test_nse_net` finds the NSE mass fractions of a given state. The density, temperature, and composition are set in the inputs file. Then we update the NSE mass fraction to the current state to make sure we're in NSE. Then we diff --git a/unit_test/test_ase/_parameters b/unit_test/test_nse_net/_parameters similarity index 100% rename from unit_test/test_ase/_parameters rename to unit_test/test_nse_net/_parameters diff --git a/unit_test/test_ase/burn_cell.H b/unit_test/test_nse_net/burn_cell.H similarity index 100% rename from unit_test/test_ase/burn_cell.H rename to unit_test/test_nse_net/burn_cell.H diff --git a/unit_test/test_ase/ci-benchmarks/ase_nse_net_unit_test.out b/unit_test/test_nse_net/ci-benchmarks/nse_net_unit_test.out similarity index 100% rename from unit_test/test_ase/ci-benchmarks/ase_nse_net_unit_test.out rename to unit_test/test_nse_net/ci-benchmarks/nse_net_unit_test.out diff --git a/unit_test/test_ase/inputs_ase b/unit_test/test_nse_net/inputs_ase similarity index 100% rename from unit_test/test_ase/inputs_ase rename to unit_test/test_nse_net/inputs_ase diff --git a/unit_test/test_ase/main.cpp b/unit_test/test_nse_net/main.cpp similarity index 100% rename from unit_test/test_ase/main.cpp rename to unit_test/test_nse_net/main.cpp diff --git a/unit_test/test_ase/make_table/GNUmakefile b/unit_test/test_nse_net/make_table/GNUmakefile similarity index 100% rename from unit_test/test_ase/make_table/GNUmakefile rename to unit_test/test_nse_net/make_table/GNUmakefile diff --git a/unit_test/test_ase/make_table/Make.package b/unit_test/test_nse_net/make_table/Make.package similarity index 100% rename from unit_test/test_ase/make_table/Make.package rename to unit_test/test_nse_net/make_table/Make.package diff --git a/unit_test/test_ase/make_table/README.md b/unit_test/test_nse_net/make_table/README.md similarity index 100% rename from unit_test/test_ase/make_table/README.md rename to unit_test/test_nse_net/make_table/README.md diff --git a/unit_test/test_ase/make_table/_parameters b/unit_test/test_nse_net/make_table/_parameters similarity index 100% rename from unit_test/test_ase/make_table/_parameters rename to unit_test/test_nse_net/make_table/_parameters diff --git a/unit_test/test_ase/make_table/burn_cell.H b/unit_test/test_nse_net/make_table/burn_cell.H similarity index 100% rename from unit_test/test_ase/make_table/burn_cell.H rename to unit_test/test_nse_net/make_table/burn_cell.H diff --git a/unit_test/test_ase/make_table/ci-benchmarks/ase_nse_net_make_table_unit_test.out b/unit_test/test_nse_net/make_table/ci-benchmarks/nse_net_make_table_unit_test.out similarity index 100% rename from unit_test/test_ase/make_table/ci-benchmarks/ase_nse_net_make_table_unit_test.out rename to unit_test/test_nse_net/make_table/ci-benchmarks/nse_net_make_table_unit_test.out diff --git a/unit_test/test_ase/make_table/main.cpp b/unit_test/test_nse_net/make_table/main.cpp similarity index 100% rename from unit_test/test_ase/make_table/main.cpp rename to unit_test/test_nse_net/make_table/main.cpp From b413290def9550c8fac7035ec614f90f68c12ba4 Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Fri, 12 Jul 2024 11:34:44 -0400 Subject: [PATCH 07/33] remove some more Fortran comments (#1609) --- Make.Microphysics | 4 ---- nse_solver/make_table/main.cpp | 2 +- nse_solver/nse_compatibility/main.cpp | 2 +- unit_test/burn_cell/main.cpp | 2 +- unit_test/burn_cell_primordial_chem/main.cpp | 2 +- unit_test/burn_cell_sdc/main.cpp | 2 +- unit_test/eos_cell/main.cpp | 2 +- unit_test/nse_table_cell/main.cpp | 2 +- unit_test/test_aprox_rates/README.md | 3 +-- unit_test/test_eos/README.md | 4 +--- unit_test/test_jac/main.cpp | 2 +- unit_test/test_linear_algebra/main.cpp | 2 +- unit_test/test_nse_interp/main.cpp | 2 +- unit_test/test_nse_net/main.cpp | 2 +- unit_test/test_nse_net/make_table/main.cpp | 2 +- unit_test/test_part_func/main.cpp | 2 +- unit_test/test_react/main.cpp | 2 +- unit_test/test_rhs/main.cpp | 2 +- unit_test/test_sdc/main.cpp | 2 +- unit_test/test_sdc_vode_rhs/main.cpp | 2 +- 20 files changed, 19 insertions(+), 26 deletions(-) diff --git a/Make.Microphysics b/Make.Microphysics index a6b7ece9de..9b6fa9e526 100644 --- a/Make.Microphysics +++ b/Make.Microphysics @@ -118,10 +118,6 @@ Blocs += $(foreach dir, $(EXTERN_CORE), $(dir)) include $(Bpack) -# this is a safety from the mega-fortran attempts -f90EXE_sources += $(ca_f90EXE_sources) -F90EXE_sources += $(ca_F90EXE_sources) - INCLUDE_LOCATIONS += $(Blocs) VPATH_LOCATIONS += $(Blocs) diff --git a/nse_solver/make_table/main.cpp b/nse_solver/make_table/main.cpp index 7295b50c85..4ac7112bf1 100644 --- a/nse_solver/make_table/main.cpp +++ b/nse_solver/make_table/main.cpp @@ -22,7 +22,7 @@ int main(int argc, char *argv[]) { init_unit_test(); - // C++ EOS initialization (must be done after Fortran eos_init and init_extern_parameters) + // C++ EOS initialization (must be done after init_extern_parameters) eos_init(); // C++ Network, RHS, screening, rates initialization diff --git a/nse_solver/nse_compatibility/main.cpp b/nse_solver/nse_compatibility/main.cpp index 2581910048..a5982d52bf 100644 --- a/nse_solver/nse_compatibility/main.cpp +++ b/nse_solver/nse_compatibility/main.cpp @@ -22,7 +22,7 @@ int main(int argc, char *argv[]) { init_unit_test(); - // C++ EOS initialization (must be done after Fortran eos_init and init_extern_parameters) + // C++ EOS initialization (must be done after init_extern_parameters) eos_init(); // C++ Network, RHS, screening, rates initialization diff --git a/unit_test/burn_cell/main.cpp b/unit_test/burn_cell/main.cpp index 3b401b12ea..faffbc210b 100644 --- a/unit_test/burn_cell/main.cpp +++ b/unit_test/burn_cell/main.cpp @@ -16,7 +16,7 @@ int main(int argc, char *argv[]) { init_unit_test(); - // C++ EOS initialization (must be done after Fortran eos_init and init_extern_parameters) + // C++ EOS initialization (must be done after init_extern_parameters) eos_init(small_temp, small_dens); // C++ Network, RHS, screening, rates initialization diff --git a/unit_test/burn_cell_primordial_chem/main.cpp b/unit_test/burn_cell_primordial_chem/main.cpp index 9a08bec7e5..5e458f8936 100644 --- a/unit_test/burn_cell_primordial_chem/main.cpp +++ b/unit_test/burn_cell_primordial_chem/main.cpp @@ -32,7 +32,7 @@ int main(int argc, char *argv[]) { init_unit_test(); - // C++ EOS initialization (must be done after Fortran eos_init and + // C++ EOS initialization (must be done after // init_extern_parameters) eos_init(unit_test_rp::small_temp, unit_test_rp::small_dens); diff --git a/unit_test/burn_cell_sdc/main.cpp b/unit_test/burn_cell_sdc/main.cpp index 3b401b12ea..faffbc210b 100644 --- a/unit_test/burn_cell_sdc/main.cpp +++ b/unit_test/burn_cell_sdc/main.cpp @@ -16,7 +16,7 @@ int main(int argc, char *argv[]) { init_unit_test(); - // C++ EOS initialization (must be done after Fortran eos_init and init_extern_parameters) + // C++ EOS initialization (must be done after init_extern_parameters) eos_init(small_temp, small_dens); // C++ Network, RHS, screening, rates initialization diff --git a/unit_test/eos_cell/main.cpp b/unit_test/eos_cell/main.cpp index c7b0a86fa5..b66f0c18d0 100644 --- a/unit_test/eos_cell/main.cpp +++ b/unit_test/eos_cell/main.cpp @@ -16,7 +16,7 @@ int main(int argc, char *argv[]) { init_unit_test(); - // C++ EOS initialization (must be done after Fortran eos_init and init_extern_parameters) + // C++ EOS initialization (must be done after init_extern_parameters) eos_init(small_temp, small_dens); // C++ Network, RHS, screening, rates initialization diff --git a/unit_test/nse_table_cell/main.cpp b/unit_test/nse_table_cell/main.cpp index b97e628012..166a2c2b4a 100644 --- a/unit_test/nse_table_cell/main.cpp +++ b/unit_test/nse_table_cell/main.cpp @@ -14,7 +14,7 @@ int main(int argc, char *argv[]) { init_unit_test(); - // C++ EOS initialization (must be done after Fortran eos_init and init_extern_parameters) + // C++ EOS initialization (must be done after init_extern_parameters) eos_init(small_temp, small_dens); // C++ Network, RHS, screening, rates initialization diff --git a/unit_test/test_aprox_rates/README.md b/unit_test/test_aprox_rates/README.md index c22ea9d000..be323d5d6d 100644 --- a/unit_test/test_aprox_rates/README.md +++ b/unit_test/test_aprox_rates/README.md @@ -1,5 +1,4 @@ # test_aprox_rates -This simply tests the aprox rates (without integration). It tests -both the Fortran and C++ implementations (via the do_cxx parameters). +This simply tests the aprox rates (without integration). diff --git a/unit_test/test_eos/README.md b/unit_test/test_eos/README.md index 2a4294bafd..3e97ea194c 100644 --- a/unit_test/test_eos/README.md +++ b/unit_test/test_eos/README.md @@ -1,8 +1,6 @@ # test_eos -This is the unit test for testing the equation of state. This tests -both the Fortran and C++ implementations (according to the parameter -`do_cxx`). +This is the unit test for testing the equation of state. The test sets up a cube of data (density on one axis, temperature on another, and composition on the third) and calls the EOS in various diff --git a/unit_test/test_jac/main.cpp b/unit_test/test_jac/main.cpp index f43ff9e9a5..e9ca42f556 100644 --- a/unit_test/test_jac/main.cpp +++ b/unit_test/test_jac/main.cpp @@ -98,7 +98,7 @@ void main_main () init_unit_test(); - // C++ EOS initialization (must be done after Fortran eos_init and init_extern_parameters) + // C++ EOS initialization (must be done after init_extern_parameters) eos_init(small_temp, small_dens); // C++ Network, RHS, screening, rates initialization diff --git a/unit_test/test_linear_algebra/main.cpp b/unit_test/test_linear_algebra/main.cpp index f1941303e0..e16897053f 100644 --- a/unit_test/test_linear_algebra/main.cpp +++ b/unit_test/test_linear_algebra/main.cpp @@ -14,7 +14,7 @@ int main(int argc, char *argv[]) { init_unit_test(); - // C++ EOS initialization (must be done after Fortran eos_init and init_extern_parameters) + // C++ EOS initialization (must be done after init_extern_parameters) eos_init(small_temp, small_dens); // C++ Network, RHS, screening, rates initialization diff --git a/unit_test/test_nse_interp/main.cpp b/unit_test/test_nse_interp/main.cpp index 56ad8e7488..9de0af0faf 100644 --- a/unit_test/test_nse_interp/main.cpp +++ b/unit_test/test_nse_interp/main.cpp @@ -14,7 +14,7 @@ int main(int argc, char *argv[]) { init_unit_test(); - // C++ EOS initialization (must be done after Fortran eos_init and init_extern_parameters) + // C++ EOS initialization (must be done after init_extern_parameters) eos_init(unit_test_rp::small_temp, unit_test_rp::small_dens); // C++ Network, RHS, screening, rates initialization diff --git a/unit_test/test_nse_net/main.cpp b/unit_test/test_nse_net/main.cpp index f172e2fe10..134b08b579 100644 --- a/unit_test/test_nse_net/main.cpp +++ b/unit_test/test_nse_net/main.cpp @@ -22,7 +22,7 @@ int main(int argc, char *argv[]) { init_unit_test(); - // C++ EOS initialization (must be done after Fortran eos_init and init_extern_parameters) + // C++ EOS initialization (must be done after init_extern_parameters) eos_init(small_temp, small_dens); // C++ Network, RHS, screening, rates initialization diff --git a/unit_test/test_nse_net/make_table/main.cpp b/unit_test/test_nse_net/make_table/main.cpp index f172e2fe10..134b08b579 100644 --- a/unit_test/test_nse_net/make_table/main.cpp +++ b/unit_test/test_nse_net/make_table/main.cpp @@ -22,7 +22,7 @@ int main(int argc, char *argv[]) { init_unit_test(); - // C++ EOS initialization (must be done after Fortran eos_init and init_extern_parameters) + // C++ EOS initialization (must be done after init_extern_parameters) eos_init(small_temp, small_dens); // C++ Network, RHS, screening, rates initialization diff --git a/unit_test/test_part_func/main.cpp b/unit_test/test_part_func/main.cpp index 4f16284455..9fa048d804 100644 --- a/unit_test/test_part_func/main.cpp +++ b/unit_test/test_part_func/main.cpp @@ -22,7 +22,7 @@ int main(int argc, char *argv[]) { init_unit_test(); - // C++ EOS initialization (must be done after Fortran eos_init and init_extern_parameters) + // C++ EOS initialization (must be done after init_extern_parameters) eos_init(small_temp, small_dens); // C++ Network, RHS, screening, rates initialization diff --git a/unit_test/test_react/main.cpp b/unit_test/test_react/main.cpp index ef051bf564..0a47397c39 100644 --- a/unit_test/test_react/main.cpp +++ b/unit_test/test_react/main.cpp @@ -104,7 +104,7 @@ void main_main () init_unit_test(); - // C++ EOS initialization (must be done after Fortran eos_init and init_extern_parameters) + // C++ EOS initialization (must be done after init_extern_parameters) eos_init(small_temp, small_dens); // C++ Network, RHS, screening, rates initialization diff --git a/unit_test/test_rhs/main.cpp b/unit_test/test_rhs/main.cpp index 1b04270667..4c08451bb3 100644 --- a/unit_test/test_rhs/main.cpp +++ b/unit_test/test_rhs/main.cpp @@ -106,7 +106,7 @@ void main_main () amrex::Error("test_rhs only works for jacobian = 1"); } - // C++ EOS initialization (must be done after Fortran eos_init and init_extern_parameters) + // C++ EOS initialization (must be done after init_extern_parameters) eos_init(small_temp, small_dens); // C++ Network, RHS, screening, rates initialization diff --git a/unit_test/test_sdc/main.cpp b/unit_test/test_sdc/main.cpp index 7967b7ecb6..0a9886b46b 100644 --- a/unit_test/test_sdc/main.cpp +++ b/unit_test/test_sdc/main.cpp @@ -102,7 +102,7 @@ void main_main () init_unit_test(); - // C++ EOS initialization (must be done after Fortran eos_init and init_extern_parameters) + // C++ EOS initialization (must be done after init_extern_parameters) eos_init(small_temp, small_dens); // C++ Network, RHS, screening, rates initialization diff --git a/unit_test/test_sdc_vode_rhs/main.cpp b/unit_test/test_sdc_vode_rhs/main.cpp index 1db72c42b6..8369c89429 100644 --- a/unit_test/test_sdc_vode_rhs/main.cpp +++ b/unit_test/test_sdc_vode_rhs/main.cpp @@ -41,7 +41,7 @@ void main_main () init_unit_test(); - // C++ EOS initialization (must be done after Fortran eos_init and init_extern_parameters) + // C++ EOS initialization (must be done after init_extern_parameters) eos_init(small_temp, small_dens); // C++ Network, RHS, screening, rates initialization From a5408bad445e49e4b8c0622843905a4c08b1ed6d Mon Sep 17 00:00:00 2001 From: Zhi Chen <62574124+zhichen3@users.noreply.github.com> Date: Sun, 14 Jul 2024 15:02:00 -0400 Subject: [PATCH 08/33] update self-consistent NSE SDC update with Tabular NSE (#1569) the self-consistent and tabular code paths are now consistent -- both do an update that should be second-order accurate. --- integration/nse_update_sdc.H | 363 +++++++++++------- networks/CNO_extras/actual_rhs.H | 80 +++- networks/ECSN/actual_rhs.H | 83 +++- networks/He-C-Fe-group/actual_rhs.H | 183 ++++++++- networks/ase/actual_rhs.H | 82 +++- .../C-burn-simple/actual_rhs.H | 52 ++- .../ignition_reaclib/URCA-medium/actual_rhs.H | 92 ++++- .../ignition_reaclib/URCA-simple/actual_rhs.H | 81 +++- networks/nova/actual_rhs.H | 62 ++- networks/nova2/actual_rhs.H | 70 +++- networks/partition_test/actual_rhs.H | 46 ++- networks/sn160/actual_rhs.H | 356 ++++++++++++++++- networks/subch_base/actual_rhs.H | 72 +++- networks/subch_simple/actual_rhs.H | 80 +++- nse_solver/Make.package | 1 + nse_solver/nse_eos.H | 174 +++++++++ 16 files changed, 1734 insertions(+), 143 deletions(-) create mode 100644 nse_solver/nse_eos.H diff --git a/integration/nse_update_sdc.H b/integration/nse_update_sdc.H index bfc24ec230..ed4913bb27 100644 --- a/integration/nse_update_sdc.H +++ b/integration/nse_update_sdc.H @@ -21,6 +21,7 @@ #endif #ifdef NSE_NET #include +#include #endif using namespace amrex::literals; @@ -301,207 +302,311 @@ void sdc_nse_burn(BurnT& state, const amrex::Real dt) { } #else +/// Self-Consistent NSE VERSION + /// -/// update the state due to NSE changes for the simplified-SDC case -/// this version works with the self-consistent NSE +/// this acts as an explicit Euler step for the system (rho e, rho) +/// on input, *_source are the reactive sources at time t0 and on output +/// they are the sources at time t0+dt /// -template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void sdc_nse_burn(BurnT& state, const amrex::Real dt) { +void nse_derivs(const amrex::Real rho0, const amrex::Real rhoe0, + const amrex::Real rhoYe0, const amrex::Real T_old, + const amrex::Real dt, amrex::Real &mu_p, amrex::Real &mu_n, + amrex::Real &drhoyedt_weak, const amrex::Real drhoyedt_a, + amrex::Array1D &ydot_weak, + const amrex::Real *ydot_a, amrex::Real& drhoedt, + const amrex::Real T_fixed) { - state.success = true; - state.n_rhs = 0; - state.n_jac = 0; + // start with the current state and compute T - // store the initial mass fractions -- we will need these - // to compute the energy release. + amrex::Real T0; + amrex::Real Ye0 = rhoYe0 / rho0; + amrex::Real abar{0.0_rt}; - amrex::Real X_old[NumSpec]; + // Get initial temperature and abar for - for (int n = 0; n < NumSpec; ++n) { - X_old[n] = state.y[SFS+n] / state.y[SRHO]; + if (T_fixed > 0) { + T0 = T_fixed; + } else { + // initial guess for eos + T0 = T_old; + amrex::Real e0 = rhoe0 / rho0; + nse_T_abar_from_e(rho0, e0, Ye0, T0, abar, mu_p, mu_n); } - // density and momentum have no reactive sources - amrex::Real rho_old = state.y[SRHO]; + // initialize burn_state for NSE state - state.y[SRHO] += dt * state.ydot_a[SRHO]; - state.y[SMX] += dt * state.ydot_a[SMX]; - state.y[SMY] += dt * state.ydot_a[SMY]; - state.y[SMZ] += dt * state.ydot_a[SMZ]; + burn_t burn_state; - // if we are doing drive_initial_convection, we want to use - // the temperature that comes in through T_fixed + burn_state.T = T0; + burn_state.rho = rho0; + burn_state.y_e = Ye0; + burn_state.mu_p = mu_p; + burn_state.mu_n = mu_n; - amrex::Real T_in = state.T_fixed > 0.0_rt ? state.T_fixed : state.T; + // get NSE state at t0 - // get the neutrino loss term -- we want to use the state that we - // came in here with, so the original Abar and Zbar - amrex::Real snu{0.0}; - amrex::Real dsnudt{0.0}; - amrex::Real dsnudd{0.0}; - amrex::Real dsnuda{0.0}; - amrex::Real dsnudz{0.0}; + auto nse_state0 = get_actual_nse_state(burn_state, 1.0e-10_rt, true); - amrex::Real abar{0.0}; - amrex::Real zbar{0.0}; - for (int n = 0; n < NumSpec; ++n) { - abar += X_old[n] * aion_inv[n]; - zbar += X_old[n] * zion[n] * aion_inv[n]; + // Still need to get abar for T_fixed > 0 + + if (T_fixed > 0) { + for (int n = 0; n < NumSpec; ++n) { + abar += nse_state0.xn[n] * aion_inv[n]; + } + abar = 1.0_rt / abar; } - abar = 1.0 / abar; - zbar *= abar; + + // compute the plasma neutrino losses + // here abar should already be in-sync with NSE + + amrex::Real snu{0.0_rt}; + amrex::Real dsnudt{0.0_rt}; + amrex::Real dsnudd{0.0_rt}; + amrex::Real dsnuda{0.0_rt}; + amrex::Real dsnudz{0.0_rt}; + + amrex::Real zbar = abar * Ye0; #ifdef NEUTRINOS { constexpr int do_derivatives = 0; - sneut5(T_in, rho_old, abar, zbar, - snu, dsnudt, dsnudd, dsnuda, dsnudz); + sneut5(T0, rho0, abar, zbar, + snu, dsnudt, dsnudd, + dsnuda, dsnudz); } #endif - amrex::Real snu_old = snu; + // Get molar fractions, ydots and neutrino loss due to weak rates - // if our network could return the evolution of Ye due to the - // weak interactions, we would evaluate the NSE state here and - // get dYe/dt. + amrex::Array1D Y; + amrex::Real e_nu {0.0_rt}; - //amrex::Real dyedt_old = 0.0; + for (int n = 1; n <= NumSpec; ++n) { + Y(n) = nse_state0.xn[n-1] * aion_inv[n-1]; + } + // Fill in ydot with only weak rates contributing - // predict the U^{n+1,*} state with only estimates of the X - // updates with advection to dt and the neutrino loss term in - // energy + get_ydot_weak(nse_state0, ydot_weak, e_nu, Y); - BurnT burn_state; - burn_state.T = T_in; // initial guess - burn_state.mu_p = state.mu_p; - burn_state.mu_n = state.mu_n; + /// + /// construct initial sources at t0 + /// - amrex::Real rhoX_source[NumSpec] = {0.0_rt}; + // Find drhoyedt_weak from weak reaction - amrex::Real rhoX_new[NumSpec]; + drhoyedt_weak = 0.0_rt; + for (int n = 0; n < NumSpec; ++n) { + drhoyedt_weak += rho0 * zion[n] * ydot_weak(n+1); + } - amrex::Real rhoe_new; - amrex::Real rho_enucdot = -rho_old * snu; + // find rhoe_source - amrex::Real rho_half = 0.5_rt * (rho_old + state.y[SRHO]); + amrex::Real rhoe_source{0.0_rt}; + for (int n = 1; n <= NumSpec; ++n) { + rhoe_source += rho0 * ydot_weak(n) * network::mion(n); + } + rhoe_source *= C::Legacy::enuc_conv2; - // predict the new aux for the first iteration -- this is really - // just including the advection bits + // include plasma neutrino terms - for (int n = 0; n < NumSpec; n++) { - rhoX_new[n] = state.y[SFS+n] + dt * state.ydot_a[SFS+n] + dt * rhoX_source[n]; + rhoe_source -= rho0 * snu; + + // include neutrino loss terms from weak rates + // Note that e_nu here is already negative so we add here. + + if (integrator_rp::nse_include_enu_weak == 1) { + rhoe_source += rho0 * e_nu; } - burn_t nse_state; + // + // evolve for eps * dt; + // - for (int iter = 0; iter < integrator_rp::nse_iters; iter++) { + amrex::Real tau = integrator_rp::nse_deriv_dt_factor * dt; - // update (rho e)^{n+1} based on the new energy generation rate - rhoe_new = state.y[SEINT] + dt * state.ydot_a[SEINT] + dt * rho_enucdot; + amrex::Real rho1 = rho0 + tau * ydot_a[SRHO]; + amrex::Real rhoe1 = rhoe0 + tau * (ydot_a[SEINT] + rhoe_source); + amrex::Real rhoYe1 = rhoYe0 + tau * (drhoyedt_weak + drhoyedt_a); - // call the EOS to get the updated T* + // compute the temperature at t0 + tau - amrex::Real T_new; - burn_state.rho = state.y[SRHO]; - burn_state.e = rhoe_new / state.y[SRHO]; - for (int n = 0; n < NumSpec; n++) { - burn_state.xn[n] = rhoX_new[n] / state.y[SRHO]; - burn_state.y[SFS+n] = rhoX_new[n]; - } + amrex::Real T1; + amrex::Real Ye1 = rhoYe1 / rho1; - if (state.T_fixed > 0) { - T_new = state.T_fixed; - } else { - eos(eos_input_re, burn_state); - T_new = burn_state.T; - } - burn_state.T = T_new; + if (T_fixed > 0) { + T1 = T_fixed; + } else { + // initial guess for eos + T1 = T0; + amrex::Real e1 = rhoe1 / rho1; + amrex::Real abar1; + nse_T_abar_from_e(rho1, e1, Ye1, T1, abar1, mu_p, mu_n); + } - // solve for the NSE state for this network we need to call - // get_nse_state with a burn_t. We will have it compute - // Ye from the input X's + // update burn_state at t0 + tau - nse_state = get_actual_nse_state(burn_state); + burn_state.T = T1; + burn_state.rho = rho1; + burn_state.y_e = Ye1; - // compute the energy release. The mass fractions in nse_state.xn[] - // include the advective parts, so first we need to remove that. + // call NSE at t0 + tau with - amrex::Real rhoX_tilde[NumSpec]; - for (int n = 0; n < NumSpec; ++n) { - rhoX_tilde[n] = state.y[SRHO] * nse_state.xn[n] - dt * state.ydot_a[SFS+n]; - } + // Note this new NSE state has advection contribution - //amrex::Real dyedt = 0.0_rt; // we can update this in the future by calling actual_rhs() + auto nse_state1 = get_actual_nse_state(burn_state, 1.0e-10_rt, true); - // we want to compute (rho eps) = - N_A c^2 sum{m_i (rhoX_tilde - rhoX_old) / A_i} - rho_enucdot = 0.0; - for (int n = 0; n < NumSpec; ++n) { - rho_enucdot += (rhoX_tilde[n] - rho_old * X_old[n]) * - network::mion(n+1) * aion_inv[n]; - } - rho_enucdot *= C::Legacy::enuc_conv2; + // construct the finite-difference approximation to the derivatives + // subtract off advection contribution to get pure drhoedt from reaction - // now get the updated neutrino term - abar = 0.0; - zbar = 0.0; - for (int n = 0; n < NumSpec; ++n) { - abar += nse_state.xn[n] * aion_inv[n]; - zbar += nse_state.xn[n] * zion[n] * aion_inv[n]; - } - abar = 1.0 / abar; - zbar *= abar; + drhoedt = 0.0_rt; + for (int n = 0; n < NumSpec; ++n) { + drhoedt += (nse_state1.y[SFS+n] - tau * ydot_a[SFS+n] - + nse_state0.y[SFS+n]) * aion_inv[n] * network::mion(n+1); + } + drhoedt *= C::Legacy::enuc_conv2 / tau; -#ifdef NEUTRINOS - constexpr int do_derivatives = 0; - sneut5(T_new, state.y[SRHO], abar, zbar, - snu, dsnudt, dsnudd, dsnuda, dsnudz); -#endif + // include neutrino terms again + + drhoedt -= rho1 * snu; + if (integrator_rp::nse_include_enu_weak == 1) { + drhoedt += rho1 * e_nu; + } - rho_enucdot -= 0.5_rt * rho_half * (snu_old + snu); +} - // update the new state for the next pass -- this should - // already implicitly have the advective portion included, - // since it was there when we called the NSE state - for (int n = 0; n < NumSpec; n++) { - rhoX_new[n] = state.y[SRHO] * nse_state.xn[n]; - } +/// +/// update the state due to NSE changes for the simplified-SDC case +/// this version works with the self-consistent NSE +/// + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void sdc_nse_burn(BurnT& state, const amrex::Real dt) { + + state.success = true; + state.n_rhs = 0; + state.n_jac = 0; + + // store the initial state + + amrex::Real rho_old = state.y[SRHO]; + amrex::Real rhoe_old = state.y[SEINT]; + amrex::Real rhoye_old = rho_old * state.y_e; + amrex::Real T_old = state.T; + amrex::Real mu_p = state.mu_p; + amrex::Real mu_n = state.mu_n; + // density and momentum have no reactive sources + + state.y[SRHO] += dt * state.ydot_a[SRHO]; + state.y[SMX] += dt * state.ydot_a[SMX]; + state.y[SMY] += dt * state.ydot_a[SMY]; + state.y[SMZ] += dt * state.ydot_a[SMZ]; + + // do an RK2 integration + + // get the derivatives, rho_dyedt, drhoedt, ydot_weak at t = t^n + + amrex::Array1D ydot_weak; + amrex::Real drhoedt{0.0_rt}; + amrex::Real drhoyedt_weak{0.0_rt}; + amrex::Real drhoyedt_a{0.0_rt}; + + // find the advection contribution: drhoyedt_a and drhoabardt_a + + for (int n = 0; n < NumSpec; ++n) { + drhoyedt_a += state.ydot_a[SFS+n] * zion[n] * aion_inv[n]; } - // now update the aux quantities + nse_derivs(rho_old, rhoe_old, + rhoye_old, T_old, + dt, mu_p, mu_n, + drhoyedt_weak, drhoyedt_a, + ydot_weak, state.ydot_a, + drhoedt, state.T_fixed); - // the new mass fractions are just those that come from the table + // evolve to the midpoint in time + + amrex::Real rho_tmp = rho_old + 0.5_rt * dt * state.ydot_a[SRHO]; + amrex::Real rhoe_tmp = rhoe_old + 0.5_rt * dt * (state.ydot_a[SEINT] + drhoedt); + amrex::Real rhoye_tmp = rhoye_old + 0.5_rt * dt * (drhoyedt_weak + drhoyedt_a); + + // compute the derivatives at the midpoint in time + + nse_derivs(rho_tmp, rhoe_tmp, + rhoye_tmp, T_old, + dt, mu_p, mu_n, + drhoyedt_weak, drhoyedt_a, + ydot_weak, state.ydot_a, + drhoedt, state.T_fixed); + + // evolve to the new time + + amrex::Real rho_new = rho_old + dt * state.ydot_a[SRHO]; + amrex::Real rhoe_new = rhoe_old + dt * (state.ydot_a[SEINT] + drhoedt); + amrex::Real rhoye_new = rhoye_old + dt * (drhoyedt_weak + drhoyedt_a); + + // Update the temperature with new internal energy + + amrex::Real T_new; + amrex::Real Ye_new = rhoye_new / rho_new; + + if (state.T_fixed > 0) { + T_new = state.T_fixed; + } else { + // initial eos guess + T_new = T_old; + amrex::Real e_new = rhoe_new / rho_new; + amrex::Real abar_new; + nse_T_abar_from_e(rho_new, e_new, Ye_new, T_new, abar_new, mu_p, mu_n); + } + + // With updated temp, rho, and Ye get final NSE state + + burn_t burn_state; + burn_state.T = T_new; + burn_state.rho = rho_new; + burn_state.y_e = Ye_new; + burn_state.mu_p = mu_p; + burn_state.mu_n = mu_n; + + auto nse_state = get_actual_nse_state(burn_state, 1.0e-10_rt, true); + + // store the new state // make sure they are normalized + amrex::Real sum_X{0.0_rt}; - amrex::Real X[NumSpec] = {0.0_rt}; - for (int n = 0; n < NumSpec; ++n) { - X[n] = amrex::max(small_x, amrex::min(1.0_rt, nse_state.xn[n])); - sum_X += X[n]; + for (auto & xn : nse_state.xn) { + xn = std::clamp(xn, small_x, 1.0_rt); + sum_X += xn; } - for (int n = 0; n < NumSpec; ++n) { - X[n] /= sum_X; + for (auto & xn : nse_state.xn) { + xn /= sum_X; } for (int n = 0; n < NumSpec; ++n) { - state.y[SFS+n] = state.y[SRHO] * X[n]; + state.y[SFS+n] = rho_new * nse_state.xn[n]; } - // density and momenta have already been updated - // update the total and internal energy now + // get the energy release from the change in rhoe over the timestep + // excluding any advection, and use that to update the total energy - state.y[SEINT] += dt * state.ydot_a[SEINT] + dt * rho_enucdot; + amrex::Real rho_enucdot = (rhoe_new - rhoe_old) / dt - state.ydot_a[SEINT]; + + state.y[SEINT] = rhoe_new; state.y[SEDEN] += dt * state.ydot_a[SEDEN] + dt * rho_enucdot; // store the chemical potentials + state.mu_p = nse_state.mu_p; state.mu_n = nse_state.mu_n; - } #endif diff --git a/networks/CNO_extras/actual_rhs.H b/networks/CNO_extras/actual_rhs.H index a9eaa3f3c0..b74804639b 100644 --- a/networks/CNO_extras/actual_rhs.H +++ b/networks/CNO_extras/actual_rhs.H @@ -693,11 +693,87 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; - rate_eval.enuc_weak = 0.0; + rate_eval.enuc_weak = 0.0_rt; } +#ifdef NSE_NET +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void get_ydot_weak(const burn_t& state, + amrex::Array1D& ydot_nuc, + amrex::Real& enuc_weak, + [[maybe_unused]] const amrex::Array1D& Y) { + /// + /// Calculate Ydots contribute only from weak reactions. + /// This is used to calculate dyedt and energy generation from + /// weak reactions for self-consistent NSE + /// + + + // initialize ydot_nuc to 0 + + for (int i = 1; i <= neqs; ++i) { + ydot_nuc(i) = 0.0_rt; + } + + rate_t rate_eval; + + [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; + [[maybe_unused]] amrex::Real rhoy = state.rho * state.y_e; + + rate_eval.enuc_weak = 0.0_rt; + + // Calculate tabular rates and get ydot_weak + + + ydot_nuc(H1) = 0.0_rt; + + ydot_nuc(He4) = 0.0_rt; + + ydot_nuc(C12) = 0.0_rt; + + ydot_nuc(C13) = 0.0_rt; + + ydot_nuc(N13) = 0.0_rt; + + ydot_nuc(N14) = 0.0_rt; + + ydot_nuc(N15) = 0.0_rt; + + ydot_nuc(O14) = 0.0_rt; + + ydot_nuc(O15) = 0.0_rt; + + ydot_nuc(O16) = 0.0_rt; + + ydot_nuc(O17) = 0.0_rt; + + ydot_nuc(O18) = 0.0_rt; + + ydot_nuc(F17) = 0.0_rt; + + ydot_nuc(F18) = 0.0_rt; + + ydot_nuc(F19) = 0.0_rt; + + ydot_nuc(Ne18) = 0.0_rt; + + ydot_nuc(Ne19) = 0.0_rt; + + ydot_nuc(Ne20) = 0.0_rt; + + ydot_nuc(Mg22) = 0.0_rt; + + ydot_nuc(Mg24) = 0.0_rt; + + ydot_nuc(Fe56) = 0.0_rt; + + enuc_weak = rate_eval.enuc_weak; +} +#endif + + AMREX_GPU_HOST_DEVICE AMREX_INLINE void rhs_nuc(const burn_t& state, amrex::Array1D& ydot_nuc, @@ -858,7 +934,7 @@ void rhs_nuc(const burn_t& state, (screened_rates(k_He4_Ne20_to_Mg24)*Y(He4)*Y(Ne20)*state.rho + -screened_rates(k_Mg24_to_He4_Ne20)*Y(Mg24)) + (screened_rates(k_C12_O16_to_He4_Mg24)*Y(C12)*Y(O16)*state.rho + -screened_rates(k_He4_Mg24_to_C12_O16)*Y(He4)*Y(Mg24)*state.rho); - ydot_nuc(Fe56) = 0.0; + ydot_nuc(Fe56) = 0.0_rt; } diff --git a/networks/ECSN/actual_rhs.H b/networks/ECSN/actual_rhs.H index 251dd5610e..0b404497ef 100644 --- a/networks/ECSN/actual_rhs.H +++ b/networks/ECSN/actual_rhs.H @@ -275,7 +275,7 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; - rate_eval.enuc_weak = 0.0; + rate_eval.enuc_weak = 0.0_rt; tabular_evaluate(j_F20_O20_meta, j_F20_O20_rhoy, j_F20_O20_temp, j_F20_O20_data, rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); @@ -312,6 +312,87 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { } +#ifdef NSE_NET +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void get_ydot_weak(const burn_t& state, + amrex::Array1D& ydot_nuc, + amrex::Real& enuc_weak, + [[maybe_unused]] const amrex::Array1D& Y) { + /// + /// Calculate Ydots contribute only from weak reactions. + /// This is used to calculate dyedt and energy generation from + /// weak reactions for self-consistent NSE + /// + + + // initialize ydot_nuc to 0 + + for (int i = 1; i <= neqs; ++i) { + ydot_nuc(i) = 0.0_rt; + } + + rate_t rate_eval; + + [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; + [[maybe_unused]] amrex::Real rhoy = state.rho * state.y_e; + + rate_eval.enuc_weak = 0.0_rt; + + // Calculate tabular rates and get ydot_weak + + tabular_evaluate(j_F20_O20_meta, j_F20_O20_rhoy, j_F20_O20_temp, j_F20_O20_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_F20_to_O20) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(F20) * (edot_nu + edot_gamma); + + tabular_evaluate(j_Ne20_F20_meta, j_Ne20_F20_rhoy, j_Ne20_F20_temp, j_Ne20_F20_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_Ne20_to_F20) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(Ne20) * (edot_nu + edot_gamma); + + tabular_evaluate(j_O20_F20_meta, j_O20_F20_rhoy, j_O20_F20_temp, j_O20_F20_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_O20_to_F20) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(O20) * (edot_nu + edot_gamma); + + tabular_evaluate(j_F20_Ne20_meta, j_F20_Ne20_rhoy, j_F20_Ne20_temp, j_F20_Ne20_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_F20_to_Ne20) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(F20) * (edot_nu + edot_gamma); + + auto screened_rates = rate_eval.screened_rates; + + ydot_nuc(H1) = 0.0_rt; + + ydot_nuc(He4) = 0.0_rt; + + ydot_nuc(O16) = 0.0_rt; + + ydot_nuc(O20) = + (-screened_rates(k_O20_to_F20)*Y(O20) + screened_rates(k_F20_to_O20)*Y(F20)); + + ydot_nuc(F20) = + (screened_rates(k_O20_to_F20)*Y(O20) + -screened_rates(k_F20_to_O20)*Y(F20)) + + (-screened_rates(k_F20_to_Ne20)*Y(F20) + screened_rates(k_Ne20_to_F20)*Y(Ne20)); + + ydot_nuc(Ne20) = + (screened_rates(k_F20_to_Ne20)*Y(F20) + -screened_rates(k_Ne20_to_F20)*Y(Ne20)); + + ydot_nuc(Mg24) = 0.0_rt; + + ydot_nuc(Al27) = 0.0_rt; + + ydot_nuc(Si28) = 0.0_rt; + + ydot_nuc(P31) = 0.0_rt; + + ydot_nuc(S32) = 0.0_rt; + + enuc_weak = rate_eval.enuc_weak; +} +#endif + + AMREX_GPU_HOST_DEVICE AMREX_INLINE void rhs_nuc(const burn_t& state, amrex::Array1D& ydot_nuc, diff --git a/networks/He-C-Fe-group/actual_rhs.H b/networks/He-C-Fe-group/actual_rhs.H index 12c101e7ca..8736460ae3 100644 --- a/networks/He-C-Fe-group/actual_rhs.H +++ b/networks/He-C-Fe-group/actual_rhs.H @@ -1276,7 +1276,7 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; - rate_eval.enuc_weak = 0.0; + rate_eval.enuc_weak = 0.0_rt; tabular_evaluate(j_Co55_Fe55_meta, j_Co55_Fe55_rhoy, j_Co55_Fe55_temp, j_Co55_Fe55_data, rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); @@ -1377,6 +1377,187 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { } +#ifdef NSE_NET +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void get_ydot_weak(const burn_t& state, + amrex::Array1D& ydot_nuc, + amrex::Real& enuc_weak, + [[maybe_unused]] const amrex::Array1D& Y) { + /// + /// Calculate Ydots contribute only from weak reactions. + /// This is used to calculate dyedt and energy generation from + /// weak reactions for self-consistent NSE + /// + + + // initialize ydot_nuc to 0 + + for (int i = 1; i <= neqs; ++i) { + ydot_nuc(i) = 0.0_rt; + } + + rate_t rate_eval; + + [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; + [[maybe_unused]] amrex::Real rhoy = state.rho * state.y_e; + + rate_eval.enuc_weak = 0.0_rt; + + // Calculate tabular rates and get ydot_weak + + tabular_evaluate(j_Co55_Fe55_meta, j_Co55_Fe55_rhoy, j_Co55_Fe55_temp, j_Co55_Fe55_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_Co55_to_Fe55) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(Co55) * (edot_nu + edot_gamma); + + tabular_evaluate(j_Co56_Fe56_meta, j_Co56_Fe56_rhoy, j_Co56_Fe56_temp, j_Co56_Fe56_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_Co56_to_Fe56) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(Co56) * (edot_nu + edot_gamma); + + tabular_evaluate(j_Co56_Ni56_meta, j_Co56_Ni56_rhoy, j_Co56_Ni56_temp, j_Co56_Ni56_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_Co56_to_Ni56) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(Co56) * (edot_nu + edot_gamma); + + tabular_evaluate(j_Co57_Ni57_meta, j_Co57_Ni57_rhoy, j_Co57_Ni57_temp, j_Co57_Ni57_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_Co57_to_Ni57) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(Co57) * (edot_nu + edot_gamma); + + tabular_evaluate(j_Fe55_Co55_meta, j_Fe55_Co55_rhoy, j_Fe55_Co55_temp, j_Fe55_Co55_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_Fe55_to_Co55) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(Fe55) * (edot_nu + edot_gamma); + + tabular_evaluate(j_Fe55_Mn55_meta, j_Fe55_Mn55_rhoy, j_Fe55_Mn55_temp, j_Fe55_Mn55_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_Fe55_to_Mn55) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(Fe55) * (edot_nu + edot_gamma); + + tabular_evaluate(j_Fe56_Co56_meta, j_Fe56_Co56_rhoy, j_Fe56_Co56_temp, j_Fe56_Co56_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_Fe56_to_Co56) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(Fe56) * (edot_nu + edot_gamma); + + tabular_evaluate(j_Mn55_Fe55_meta, j_Mn55_Fe55_rhoy, j_Mn55_Fe55_temp, j_Mn55_Fe55_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_Mn55_to_Fe55) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(Mn55) * (edot_nu + edot_gamma); + + tabular_evaluate(j_n_p_meta, j_n_p_rhoy, j_n_p_temp, j_n_p_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_n_to_p) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(N) * (edot_nu + edot_gamma); + + tabular_evaluate(j_Ni56_Co56_meta, j_Ni56_Co56_rhoy, j_Ni56_Co56_temp, j_Ni56_Co56_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_Ni56_to_Co56) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(Ni56) * (edot_nu + edot_gamma); + + tabular_evaluate(j_Ni57_Co57_meta, j_Ni57_Co57_rhoy, j_Ni57_Co57_temp, j_Ni57_Co57_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_Ni57_to_Co57) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(Ni57) * (edot_nu + edot_gamma); + + tabular_evaluate(j_p_n_meta, j_p_n_rhoy, j_p_n_temp, j_p_n_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_p_to_n) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(H1) * (edot_nu + edot_gamma); + + auto screened_rates = rate_eval.screened_rates; + + ydot_nuc(N) = + -screened_rates(k_n_to_p)*Y(N) + + screened_rates(k_p_to_n)*Y(H1); + + ydot_nuc(H1) = + screened_rates(k_n_to_p)*Y(N) + + -screened_rates(k_p_to_n)*Y(H1); + + ydot_nuc(He4) = 0.0_rt; + + ydot_nuc(C12) = 0.0_rt; + + ydot_nuc(N13) = 0.0_rt; + + ydot_nuc(N14) = 0.0_rt; + + ydot_nuc(O16) = 0.0_rt; + + ydot_nuc(F18) = 0.0_rt; + + ydot_nuc(Ne20) = 0.0_rt; + + ydot_nuc(Ne21) = 0.0_rt; + + ydot_nuc(Na22) = 0.0_rt; + + ydot_nuc(Na23) = 0.0_rt; + + ydot_nuc(Mg24) = 0.0_rt; + + ydot_nuc(Al27) = 0.0_rt; + + ydot_nuc(Si28) = 0.0_rt; + + ydot_nuc(P31) = 0.0_rt; + + ydot_nuc(S32) = 0.0_rt; + + ydot_nuc(Ar36) = 0.0_rt; + + ydot_nuc(Ca40) = 0.0_rt; + + ydot_nuc(Ti44) = 0.0_rt; + + ydot_nuc(Cr48) = 0.0_rt; + + ydot_nuc(Mn51) = 0.0_rt; + + ydot_nuc(Mn55) = + (screened_rates(k_Fe55_to_Mn55)*Y(Fe55) + -screened_rates(k_Mn55_to_Fe55)*Y(Mn55)); + + ydot_nuc(Fe52) = 0.0_rt; + + ydot_nuc(Fe53) = 0.0_rt; + + ydot_nuc(Fe54) = 0.0_rt; + + ydot_nuc(Fe55) = + (screened_rates(k_Co55_to_Fe55)*Y(Co55) + -screened_rates(k_Fe55_to_Co55)*Y(Fe55)) + + (-screened_rates(k_Fe55_to_Mn55)*Y(Fe55) + screened_rates(k_Mn55_to_Fe55)*Y(Mn55)); + + ydot_nuc(Fe56) = + (screened_rates(k_Co56_to_Fe56)*Y(Co56) + -screened_rates(k_Fe56_to_Co56)*Y(Fe56)); + + ydot_nuc(Co55) = + (-screened_rates(k_Co55_to_Fe55)*Y(Co55) + screened_rates(k_Fe55_to_Co55)*Y(Fe55)); + + ydot_nuc(Co56) = + (-screened_rates(k_Co56_to_Fe56)*Y(Co56) + screened_rates(k_Fe56_to_Co56)*Y(Fe56)) + + (screened_rates(k_Ni56_to_Co56)*Y(Ni56) + -screened_rates(k_Co56_to_Ni56)*Y(Co56)); + + ydot_nuc(Co57) = + (screened_rates(k_Ni57_to_Co57)*Y(Ni57) + -screened_rates(k_Co57_to_Ni57)*Y(Co57)); + + ydot_nuc(Ni56) = + (-screened_rates(k_Ni56_to_Co56)*Y(Ni56) + screened_rates(k_Co56_to_Ni56)*Y(Co56)); + + ydot_nuc(Ni57) = + (-screened_rates(k_Ni57_to_Co57)*Y(Ni57) + screened_rates(k_Co57_to_Ni57)*Y(Co57)); + + ydot_nuc(Ni58) = 0.0_rt; + + ydot_nuc(Cu59) = 0.0_rt; + + ydot_nuc(Zn60) = 0.0_rt; + + enuc_weak = rate_eval.enuc_weak; +} +#endif + + AMREX_GPU_HOST_DEVICE AMREX_INLINE void rhs_nuc(const burn_t& state, amrex::Array1D& ydot_nuc, diff --git a/networks/ase/actual_rhs.H b/networks/ase/actual_rhs.H index f5925ec203..4d08b90d65 100644 --- a/networks/ase/actual_rhs.H +++ b/networks/ase/actual_rhs.H @@ -894,11 +894,91 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; - rate_eval.enuc_weak = 0.0; + rate_eval.enuc_weak = 0.0_rt; } +#ifdef NSE_NET +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void get_ydot_weak(const burn_t& state, + amrex::Array1D& ydot_nuc, + amrex::Real& enuc_weak, + [[maybe_unused]] const amrex::Array1D& Y) { + /// + /// Calculate Ydots contribute only from weak reactions. + /// This is used to calculate dyedt and energy generation from + /// weak reactions for self-consistent NSE + /// + + + // initialize ydot_nuc to 0 + + for (int i = 1; i <= neqs; ++i) { + ydot_nuc(i) = 0.0_rt; + } + + rate_t rate_eval; + + [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; + [[maybe_unused]] amrex::Real rhoy = state.rho * state.y_e; + + rate_eval.enuc_weak = 0.0_rt; + + // Calculate tabular rates and get ydot_weak + + + ydot_nuc(N) = 0.0_rt; + + ydot_nuc(H1) = 0.0_rt; + + ydot_nuc(He4) = 0.0_rt; + + ydot_nuc(C12) = 0.0_rt; + + ydot_nuc(N13) = 0.0_rt; + + ydot_nuc(N14) = 0.0_rt; + + ydot_nuc(O16) = 0.0_rt; + + ydot_nuc(F18) = 0.0_rt; + + ydot_nuc(Ne20) = 0.0_rt; + + ydot_nuc(Ne21) = 0.0_rt; + + ydot_nuc(Na22) = 0.0_rt; + + ydot_nuc(Na23) = 0.0_rt; + + ydot_nuc(Mg24) = 0.0_rt; + + ydot_nuc(Al27) = 0.0_rt; + + ydot_nuc(Si28) = 0.0_rt; + + ydot_nuc(P31) = 0.0_rt; + + ydot_nuc(S32) = 0.0_rt; + + ydot_nuc(Ar36) = 0.0_rt; + + ydot_nuc(Ca40) = 0.0_rt; + + ydot_nuc(Ti44) = 0.0_rt; + + ydot_nuc(Cr48) = 0.0_rt; + + ydot_nuc(Fe52) = 0.0_rt; + + ydot_nuc(Ni56) = 0.0_rt; + + enuc_weak = rate_eval.enuc_weak; +} +#endif + + AMREX_GPU_HOST_DEVICE AMREX_INLINE void rhs_nuc(const burn_t& state, amrex::Array1D& ydot_nuc, diff --git a/networks/ignition_reaclib/C-burn-simple/actual_rhs.H b/networks/ignition_reaclib/C-burn-simple/actual_rhs.H index ad623a6c06..d96207d283 100644 --- a/networks/ignition_reaclib/C-burn-simple/actual_rhs.H +++ b/networks/ignition_reaclib/C-burn-simple/actual_rhs.H @@ -140,11 +140,61 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; - rate_eval.enuc_weak = 0.0; + rate_eval.enuc_weak = 0.0_rt; } +#ifdef NSE_NET +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void get_ydot_weak(const burn_t& state, + amrex::Array1D& ydot_nuc, + amrex::Real& enuc_weak, + [[maybe_unused]] const amrex::Array1D& Y) { + /// + /// Calculate Ydots contribute only from weak reactions. + /// This is used to calculate dyedt and energy generation from + /// weak reactions for self-consistent NSE + /// + + + // initialize ydot_nuc to 0 + + for (int i = 1; i <= neqs; ++i) { + ydot_nuc(i) = 0.0_rt; + } + + rate_t rate_eval; + + [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; + [[maybe_unused]] amrex::Real rhoy = state.rho * state.y_e; + + rate_eval.enuc_weak = 0.0_rt; + + // Calculate tabular rates and get ydot_weak + + + ydot_nuc(N) = 0.0_rt; + + ydot_nuc(H1) = 0.0_rt; + + ydot_nuc(He4) = 0.0_rt; + + ydot_nuc(C12) = 0.0_rt; + + ydot_nuc(O16) = 0.0_rt; + + ydot_nuc(Ne20) = 0.0_rt; + + ydot_nuc(Na23) = 0.0_rt; + + ydot_nuc(Mg23) = 0.0_rt; + + enuc_weak = rate_eval.enuc_weak; +} +#endif + + AMREX_GPU_HOST_DEVICE AMREX_INLINE void rhs_nuc(const burn_t& state, amrex::Array1D& ydot_nuc, diff --git a/networks/ignition_reaclib/URCA-medium/actual_rhs.H b/networks/ignition_reaclib/URCA-medium/actual_rhs.H index 1b9f728b47..a6d35692e1 100644 --- a/networks/ignition_reaclib/URCA-medium/actual_rhs.H +++ b/networks/ignition_reaclib/URCA-medium/actual_rhs.H @@ -300,7 +300,7 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; - rate_eval.enuc_weak = 0.0; + rate_eval.enuc_weak = 0.0_rt; tabular_evaluate(j_Na23_Ne23_meta, j_Na23_Ne23_rhoy, j_Na23_Ne23_temp, j_Na23_Ne23_data, rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); @@ -345,6 +345,96 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { } +#ifdef NSE_NET +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void get_ydot_weak(const burn_t& state, + amrex::Array1D& ydot_nuc, + amrex::Real& enuc_weak, + [[maybe_unused]] const amrex::Array1D& Y) { + /// + /// Calculate Ydots contribute only from weak reactions. + /// This is used to calculate dyedt and energy generation from + /// weak reactions for self-consistent NSE + /// + + + // initialize ydot_nuc to 0 + + for (int i = 1; i <= neqs; ++i) { + ydot_nuc(i) = 0.0_rt; + } + + rate_t rate_eval; + + [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; + [[maybe_unused]] amrex::Real rhoy = state.rho * state.y_e; + + rate_eval.enuc_weak = 0.0_rt; + + // Calculate tabular rates and get ydot_weak + + tabular_evaluate(j_Na23_Ne23_meta, j_Na23_Ne23_rhoy, j_Na23_Ne23_temp, j_Na23_Ne23_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_Na23_to_Ne23) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(Na23) * (edot_nu + edot_gamma); + + tabular_evaluate(j_Ne23_Na23_meta, j_Ne23_Na23_rhoy, j_Ne23_Na23_temp, j_Ne23_Na23_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_Ne23_to_Na23) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(Ne23) * (edot_nu + edot_gamma); + + tabular_evaluate(j_Mg23_Na23_meta, j_Mg23_Na23_rhoy, j_Mg23_Na23_temp, j_Mg23_Na23_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_Mg23_to_Na23) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(Mg23) * (edot_nu + edot_gamma); + + tabular_evaluate(j_n_p_meta, j_n_p_rhoy, j_n_p_temp, j_n_p_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_n_to_p) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(N) * (edot_nu + edot_gamma); + + tabular_evaluate(j_p_n_meta, j_p_n_rhoy, j_p_n_temp, j_p_n_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_p_to_n) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(H1) * (edot_nu + edot_gamma); + + auto screened_rates = rate_eval.screened_rates; + + ydot_nuc(N) = + -screened_rates(k_n_to_p)*Y(N) + + screened_rates(k_p_to_n)*Y(H1); + + ydot_nuc(H1) = + screened_rates(k_n_to_p)*Y(N) + + -screened_rates(k_p_to_n)*Y(H1); + + ydot_nuc(He4) = 0.0_rt; + + ydot_nuc(C12) = 0.0_rt; + + ydot_nuc(N13) = 0.0_rt; + + ydot_nuc(O16) = 0.0_rt; + + ydot_nuc(Ne20) = 0.0_rt; + + ydot_nuc(Ne23) = + (-screened_rates(k_Ne23_to_Na23)*Y(Ne23) + screened_rates(k_Na23_to_Ne23)*Y(Na23)); + + ydot_nuc(Na23) = + (screened_rates(k_Ne23_to_Na23)*Y(Ne23) + -screened_rates(k_Na23_to_Ne23)*Y(Na23)) + + screened_rates(k_Mg23_to_Na23)*Y(Mg23); + + ydot_nuc(Mg23) = + -screened_rates(k_Mg23_to_Na23)*Y(Mg23); + + ydot_nuc(Mg24) = 0.0_rt; + + enuc_weak = rate_eval.enuc_weak; +} +#endif + + AMREX_GPU_HOST_DEVICE AMREX_INLINE void rhs_nuc(const burn_t& state, amrex::Array1D& ydot_nuc, diff --git a/networks/ignition_reaclib/URCA-simple/actual_rhs.H b/networks/ignition_reaclib/URCA-simple/actual_rhs.H index 627b2a97f8..ff15e513fb 100644 --- a/networks/ignition_reaclib/URCA-simple/actual_rhs.H +++ b/networks/ignition_reaclib/URCA-simple/actual_rhs.H @@ -140,7 +140,7 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; - rate_eval.enuc_weak = 0.0; + rate_eval.enuc_weak = 0.0_rt; tabular_evaluate(j_Na23_Ne23_meta, j_Na23_Ne23_rhoy, j_Na23_Ne23_temp, j_Na23_Ne23_data, rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); @@ -177,6 +177,85 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { } +#ifdef NSE_NET +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void get_ydot_weak(const burn_t& state, + amrex::Array1D& ydot_nuc, + amrex::Real& enuc_weak, + [[maybe_unused]] const amrex::Array1D& Y) { + /// + /// Calculate Ydots contribute only from weak reactions. + /// This is used to calculate dyedt and energy generation from + /// weak reactions for self-consistent NSE + /// + + + // initialize ydot_nuc to 0 + + for (int i = 1; i <= neqs; ++i) { + ydot_nuc(i) = 0.0_rt; + } + + rate_t rate_eval; + + [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; + [[maybe_unused]] amrex::Real rhoy = state.rho * state.y_e; + + rate_eval.enuc_weak = 0.0_rt; + + // Calculate tabular rates and get ydot_weak + + tabular_evaluate(j_Na23_Ne23_meta, j_Na23_Ne23_rhoy, j_Na23_Ne23_temp, j_Na23_Ne23_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_Na23_to_Ne23) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(Na23) * (edot_nu + edot_gamma); + + tabular_evaluate(j_Ne23_Na23_meta, j_Ne23_Na23_rhoy, j_Ne23_Na23_temp, j_Ne23_Na23_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_Ne23_to_Na23) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(Ne23) * (edot_nu + edot_gamma); + + tabular_evaluate(j_n_p_meta, j_n_p_rhoy, j_n_p_temp, j_n_p_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_n_to_p) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(N) * (edot_nu + edot_gamma); + + tabular_evaluate(j_p_n_meta, j_p_n_rhoy, j_p_n_temp, j_p_n_data, + rhoy, state.T, rate, drate_dt, edot_nu, edot_gamma); + rate_eval.screened_rates(k_p_to_n) = rate; + rate_eval.enuc_weak += C::Legacy::n_A * Y(H1) * (edot_nu + edot_gamma); + + auto screened_rates = rate_eval.screened_rates; + + ydot_nuc(N) = + -screened_rates(k_n_to_p)*Y(N) + + screened_rates(k_p_to_n)*Y(H1); + + ydot_nuc(H1) = + screened_rates(k_n_to_p)*Y(N) + + -screened_rates(k_p_to_n)*Y(H1); + + ydot_nuc(He4) = 0.0_rt; + + ydot_nuc(C12) = 0.0_rt; + + ydot_nuc(O16) = 0.0_rt; + + ydot_nuc(Ne20) = 0.0_rt; + + ydot_nuc(Ne23) = + (-screened_rates(k_Ne23_to_Na23)*Y(Ne23) + screened_rates(k_Na23_to_Ne23)*Y(Na23)); + + ydot_nuc(Na23) = + (screened_rates(k_Ne23_to_Na23)*Y(Ne23) + -screened_rates(k_Na23_to_Ne23)*Y(Na23)); + + ydot_nuc(Mg23) = 0.0_rt; + + enuc_weak = rate_eval.enuc_weak; +} +#endif + + AMREX_GPU_HOST_DEVICE AMREX_INLINE void rhs_nuc(const burn_t& state, amrex::Array1D& ydot_nuc, diff --git a/networks/nova/actual_rhs.H b/networks/nova/actual_rhs.H index 0c2dd612d3..8f3e7c1c60 100644 --- a/networks/nova/actual_rhs.H +++ b/networks/nova/actual_rhs.H @@ -362,11 +362,71 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; - rate_eval.enuc_weak = 0.0; + rate_eval.enuc_weak = 0.0_rt; } +#ifdef NSE_NET +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void get_ydot_weak(const burn_t& state, + amrex::Array1D& ydot_nuc, + amrex::Real& enuc_weak, + [[maybe_unused]] const amrex::Array1D& Y) { + /// + /// Calculate Ydots contribute only from weak reactions. + /// This is used to calculate dyedt and energy generation from + /// weak reactions for self-consistent NSE + /// + + + // initialize ydot_nuc to 0 + + for (int i = 1; i <= neqs; ++i) { + ydot_nuc(i) = 0.0_rt; + } + + rate_t rate_eval; + + [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; + [[maybe_unused]] amrex::Real rhoy = state.rho * state.y_e; + + rate_eval.enuc_weak = 0.0_rt; + + // Calculate tabular rates and get ydot_weak + + + ydot_nuc(H1) = 0.0_rt; + + ydot_nuc(He4) = 0.0_rt; + + ydot_nuc(C12) = 0.0_rt; + + ydot_nuc(C13) = 0.0_rt; + + ydot_nuc(N13) = 0.0_rt; + + ydot_nuc(N14) = 0.0_rt; + + ydot_nuc(N15) = 0.0_rt; + + ydot_nuc(O14) = 0.0_rt; + + ydot_nuc(O15) = 0.0_rt; + + ydot_nuc(O16) = 0.0_rt; + + ydot_nuc(O17) = 0.0_rt; + + ydot_nuc(F17) = 0.0_rt; + + ydot_nuc(F18) = 0.0_rt; + + enuc_weak = rate_eval.enuc_weak; +} +#endif + + AMREX_GPU_HOST_DEVICE AMREX_INLINE void rhs_nuc(const burn_t& state, amrex::Array1D& ydot_nuc, diff --git a/networks/nova2/actual_rhs.H b/networks/nova2/actual_rhs.H index 1219595277..6cb140fd89 100644 --- a/networks/nova2/actual_rhs.H +++ b/networks/nova2/actual_rhs.H @@ -559,11 +559,79 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; - rate_eval.enuc_weak = 0.0; + rate_eval.enuc_weak = 0.0_rt; } +#ifdef NSE_NET +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void get_ydot_weak(const burn_t& state, + amrex::Array1D& ydot_nuc, + amrex::Real& enuc_weak, + [[maybe_unused]] const amrex::Array1D& Y) { + /// + /// Calculate Ydots contribute only from weak reactions. + /// This is used to calculate dyedt and energy generation from + /// weak reactions for self-consistent NSE + /// + + + // initialize ydot_nuc to 0 + + for (int i = 1; i <= neqs; ++i) { + ydot_nuc(i) = 0.0_rt; + } + + rate_t rate_eval; + + [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; + [[maybe_unused]] amrex::Real rhoy = state.rho * state.y_e; + + rate_eval.enuc_weak = 0.0_rt; + + // Calculate tabular rates and get ydot_weak + + + ydot_nuc(H1) = 0.0_rt; + + ydot_nuc(H2) = 0.0_rt; + + ydot_nuc(He3) = 0.0_rt; + + ydot_nuc(He4) = 0.0_rt; + + ydot_nuc(Be7) = 0.0_rt; + + ydot_nuc(B8) = 0.0_rt; + + ydot_nuc(C12) = 0.0_rt; + + ydot_nuc(C13) = 0.0_rt; + + ydot_nuc(N13) = 0.0_rt; + + ydot_nuc(N14) = 0.0_rt; + + ydot_nuc(N15) = 0.0_rt; + + ydot_nuc(O14) = 0.0_rt; + + ydot_nuc(O15) = 0.0_rt; + + ydot_nuc(O16) = 0.0_rt; + + ydot_nuc(O17) = 0.0_rt; + + ydot_nuc(F17) = 0.0_rt; + + ydot_nuc(F18) = 0.0_rt; + + enuc_weak = rate_eval.enuc_weak; +} +#endif + + AMREX_GPU_HOST_DEVICE AMREX_INLINE void rhs_nuc(const burn_t& state, amrex::Array1D& ydot_nuc, diff --git a/networks/partition_test/actual_rhs.H b/networks/partition_test/actual_rhs.H index ba170ca871..72296fab0e 100644 --- a/networks/partition_test/actual_rhs.H +++ b/networks/partition_test/actual_rhs.H @@ -140,11 +140,55 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; - rate_eval.enuc_weak = 0.0; + rate_eval.enuc_weak = 0.0_rt; } +#ifdef NSE_NET +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void get_ydot_weak(const burn_t& state, + amrex::Array1D& ydot_nuc, + amrex::Real& enuc_weak, + [[maybe_unused]] const amrex::Array1D& Y) { + /// + /// Calculate Ydots contribute only from weak reactions. + /// This is used to calculate dyedt and energy generation from + /// weak reactions for self-consistent NSE + /// + + + // initialize ydot_nuc to 0 + + for (int i = 1; i <= neqs; ++i) { + ydot_nuc(i) = 0.0_rt; + } + + rate_t rate_eval; + + [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; + [[maybe_unused]] amrex::Real rhoy = state.rho * state.y_e; + + rate_eval.enuc_weak = 0.0_rt; + + // Calculate tabular rates and get ydot_weak + + + ydot_nuc(H1) = 0.0_rt; + + ydot_nuc(He4) = 0.0_rt; + + ydot_nuc(Fe52) = 0.0_rt; + + ydot_nuc(Co55) = 0.0_rt; + + ydot_nuc(Ni56) = 0.0_rt; + + enuc_weak = rate_eval.enuc_weak; +} +#endif + + AMREX_GPU_HOST_DEVICE AMREX_INLINE void rhs_nuc(const burn_t& state, amrex::Array1D& ydot_nuc, diff --git a/networks/sn160/actual_rhs.H b/networks/sn160/actual_rhs.H index 9d14330199..3ff15b8115 100644 --- a/networks/sn160/actual_rhs.H +++ b/networks/sn160/actual_rhs.H @@ -8815,11 +8815,365 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; - rate_eval.enuc_weak = 0.0; + rate_eval.enuc_weak = 0.0_rt; } +#ifdef NSE_NET +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void get_ydot_weak(const burn_t& state, + amrex::Array1D& ydot_nuc, + amrex::Real& enuc_weak, + [[maybe_unused]] const amrex::Array1D& Y) { + /// + /// Calculate Ydots contribute only from weak reactions. + /// This is used to calculate dyedt and energy generation from + /// weak reactions for self-consistent NSE + /// + + + // initialize ydot_nuc to 0 + + for (int i = 1; i <= neqs; ++i) { + ydot_nuc(i) = 0.0_rt; + } + + rate_t rate_eval; + + [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; + [[maybe_unused]] amrex::Real rhoy = state.rho * state.y_e; + + rate_eval.enuc_weak = 0.0_rt; + + // Calculate tabular rates and get ydot_weak + + + ydot_nuc(N) = 0.0_rt; + + ydot_nuc(H1) = 0.0_rt; + + ydot_nuc(H2) = 0.0_rt; + + ydot_nuc(He3) = 0.0_rt; + + ydot_nuc(He4) = 0.0_rt; + + ydot_nuc(Li6) = 0.0_rt; + + ydot_nuc(Li7) = 0.0_rt; + + ydot_nuc(Be7) = 0.0_rt; + + ydot_nuc(Be9) = 0.0_rt; + + ydot_nuc(B8) = 0.0_rt; + + ydot_nuc(B10) = 0.0_rt; + + ydot_nuc(B11) = 0.0_rt; + + ydot_nuc(C12) = 0.0_rt; + + ydot_nuc(C13) = 0.0_rt; + + ydot_nuc(C14) = 0.0_rt; + + ydot_nuc(N13) = 0.0_rt; + + ydot_nuc(N14) = 0.0_rt; + + ydot_nuc(N15) = 0.0_rt; + + ydot_nuc(O14) = 0.0_rt; + + ydot_nuc(O15) = 0.0_rt; + + ydot_nuc(O16) = 0.0_rt; + + ydot_nuc(O17) = 0.0_rt; + + ydot_nuc(O18) = 0.0_rt; + + ydot_nuc(F17) = 0.0_rt; + + ydot_nuc(F18) = 0.0_rt; + + ydot_nuc(F19) = 0.0_rt; + + ydot_nuc(Ne18) = 0.0_rt; + + ydot_nuc(Ne19) = 0.0_rt; + + ydot_nuc(Ne20) = 0.0_rt; + + ydot_nuc(Ne21) = 0.0_rt; + + ydot_nuc(Ne22) = 0.0_rt; + + ydot_nuc(Na21) = 0.0_rt; + + ydot_nuc(Na22) = 0.0_rt; + + ydot_nuc(Na23) = 0.0_rt; + + ydot_nuc(Mg23) = 0.0_rt; + + ydot_nuc(Mg24) = 0.0_rt; + + ydot_nuc(Mg25) = 0.0_rt; + + ydot_nuc(Mg26) = 0.0_rt; + + ydot_nuc(Al25) = 0.0_rt; + + ydot_nuc(Al26) = 0.0_rt; + + ydot_nuc(Al27) = 0.0_rt; + + ydot_nuc(Si28) = 0.0_rt; + + ydot_nuc(Si29) = 0.0_rt; + + ydot_nuc(Si30) = 0.0_rt; + + ydot_nuc(Si31) = 0.0_rt; + + ydot_nuc(Si32) = 0.0_rt; + + ydot_nuc(P29) = 0.0_rt; + + ydot_nuc(P30) = 0.0_rt; + + ydot_nuc(P31) = 0.0_rt; + + ydot_nuc(P32) = 0.0_rt; + + ydot_nuc(P33) = 0.0_rt; + + ydot_nuc(S32) = 0.0_rt; + + ydot_nuc(S33) = 0.0_rt; + + ydot_nuc(S34) = 0.0_rt; + + ydot_nuc(S35) = 0.0_rt; + + ydot_nuc(S36) = 0.0_rt; + + ydot_nuc(Cl33) = 0.0_rt; + + ydot_nuc(Cl34) = 0.0_rt; + + ydot_nuc(Cl35) = 0.0_rt; + + ydot_nuc(Cl36) = 0.0_rt; + + ydot_nuc(Cl37) = 0.0_rt; + + ydot_nuc(Ar36) = 0.0_rt; + + ydot_nuc(Ar37) = 0.0_rt; + + ydot_nuc(Ar38) = 0.0_rt; + + ydot_nuc(Ar39) = 0.0_rt; + + ydot_nuc(Ar40) = 0.0_rt; + + ydot_nuc(K37) = 0.0_rt; + + ydot_nuc(K38) = 0.0_rt; + + ydot_nuc(K39) = 0.0_rt; + + ydot_nuc(K40) = 0.0_rt; + + ydot_nuc(K41) = 0.0_rt; + + ydot_nuc(Ca40) = 0.0_rt; + + ydot_nuc(Ca41) = 0.0_rt; + + ydot_nuc(Ca42) = 0.0_rt; + + ydot_nuc(Ca43) = 0.0_rt; + + ydot_nuc(Ca44) = 0.0_rt; + + ydot_nuc(Ca45) = 0.0_rt; + + ydot_nuc(Ca46) = 0.0_rt; + + ydot_nuc(Ca47) = 0.0_rt; + + ydot_nuc(Ca48) = 0.0_rt; + + ydot_nuc(Sc43) = 0.0_rt; + + ydot_nuc(Sc44) = 0.0_rt; + + ydot_nuc(Sc45) = 0.0_rt; + + ydot_nuc(Sc46) = 0.0_rt; + + ydot_nuc(Sc47) = 0.0_rt; + + ydot_nuc(Sc48) = 0.0_rt; + + ydot_nuc(Sc49) = 0.0_rt; + + ydot_nuc(Ti44) = 0.0_rt; + + ydot_nuc(Ti45) = 0.0_rt; + + ydot_nuc(Ti46) = 0.0_rt; + + ydot_nuc(Ti47) = 0.0_rt; + + ydot_nuc(Ti48) = 0.0_rt; + + ydot_nuc(Ti49) = 0.0_rt; + + ydot_nuc(Ti50) = 0.0_rt; + + ydot_nuc(Ti51) = 0.0_rt; + + ydot_nuc(V46) = 0.0_rt; + + ydot_nuc(V47) = 0.0_rt; + + ydot_nuc(V48) = 0.0_rt; + + ydot_nuc(V49) = 0.0_rt; + + ydot_nuc(V50) = 0.0_rt; + + ydot_nuc(V51) = 0.0_rt; + + ydot_nuc(V52) = 0.0_rt; + + ydot_nuc(Cr48) = 0.0_rt; + + ydot_nuc(Cr49) = 0.0_rt; + + ydot_nuc(Cr50) = 0.0_rt; + + ydot_nuc(Cr51) = 0.0_rt; + + ydot_nuc(Cr52) = 0.0_rt; + + ydot_nuc(Cr53) = 0.0_rt; + + ydot_nuc(Cr54) = 0.0_rt; + + ydot_nuc(Mn50) = 0.0_rt; + + ydot_nuc(Mn51) = 0.0_rt; + + ydot_nuc(Mn52) = 0.0_rt; + + ydot_nuc(Mn53) = 0.0_rt; + + ydot_nuc(Mn54) = 0.0_rt; + + ydot_nuc(Mn55) = 0.0_rt; + + ydot_nuc(Fe52) = 0.0_rt; + + ydot_nuc(Fe53) = 0.0_rt; + + ydot_nuc(Fe54) = 0.0_rt; + + ydot_nuc(Fe55) = 0.0_rt; + + ydot_nuc(Fe56) = 0.0_rt; + + ydot_nuc(Fe57) = 0.0_rt; + + ydot_nuc(Fe58) = 0.0_rt; + + ydot_nuc(Co53) = 0.0_rt; + + ydot_nuc(Co54) = 0.0_rt; + + ydot_nuc(Co55) = 0.0_rt; + + ydot_nuc(Co56) = 0.0_rt; + + ydot_nuc(Co57) = 0.0_rt; + + ydot_nuc(Co58) = 0.0_rt; + + ydot_nuc(Co59) = 0.0_rt; + + ydot_nuc(Ni56) = 0.0_rt; + + ydot_nuc(Ni57) = 0.0_rt; + + ydot_nuc(Ni58) = 0.0_rt; + + ydot_nuc(Ni59) = 0.0_rt; + + ydot_nuc(Ni60) = 0.0_rt; + + ydot_nuc(Ni61) = 0.0_rt; + + ydot_nuc(Ni62) = 0.0_rt; + + ydot_nuc(Ni63) = 0.0_rt; + + ydot_nuc(Ni64) = 0.0_rt; + + ydot_nuc(Cu57) = 0.0_rt; + + ydot_nuc(Cu58) = 0.0_rt; + + ydot_nuc(Cu59) = 0.0_rt; + + ydot_nuc(Cu60) = 0.0_rt; + + ydot_nuc(Cu61) = 0.0_rt; + + ydot_nuc(Cu62) = 0.0_rt; + + ydot_nuc(Cu63) = 0.0_rt; + + ydot_nuc(Cu64) = 0.0_rt; + + ydot_nuc(Cu65) = 0.0_rt; + + ydot_nuc(Zn59) = 0.0_rt; + + ydot_nuc(Zn60) = 0.0_rt; + + ydot_nuc(Zn61) = 0.0_rt; + + ydot_nuc(Zn62) = 0.0_rt; + + ydot_nuc(Zn63) = 0.0_rt; + + ydot_nuc(Zn64) = 0.0_rt; + + ydot_nuc(Zn65) = 0.0_rt; + + ydot_nuc(Zn66) = 0.0_rt; + + ydot_nuc(Ga62) = 0.0_rt; + + ydot_nuc(Ga63) = 0.0_rt; + + ydot_nuc(Ga64) = 0.0_rt; + + ydot_nuc(Ge63) = 0.0_rt; + + ydot_nuc(Ge64) = 0.0_rt; + + enuc_weak = rate_eval.enuc_weak; +} +#endif + + AMREX_GPU_HOST_DEVICE AMREX_INLINE void rhs_nuc(const burn_t& state, amrex::Array1D& ydot_nuc, diff --git a/networks/subch_base/actual_rhs.H b/networks/subch_base/actual_rhs.H index 6b083c0284..c1fae4ff7e 100644 --- a/networks/subch_base/actual_rhs.H +++ b/networks/subch_base/actual_rhs.H @@ -804,11 +804,81 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; - rate_eval.enuc_weak = 0.0; + rate_eval.enuc_weak = 0.0_rt; } +#ifdef NSE_NET +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void get_ydot_weak(const burn_t& state, + amrex::Array1D& ydot_nuc, + amrex::Real& enuc_weak, + [[maybe_unused]] const amrex::Array1D& Y) { + /// + /// Calculate Ydots contribute only from weak reactions. + /// This is used to calculate dyedt and energy generation from + /// weak reactions for self-consistent NSE + /// + + + // initialize ydot_nuc to 0 + + for (int i = 1; i <= neqs; ++i) { + ydot_nuc(i) = 0.0_rt; + } + + rate_t rate_eval; + + [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; + [[maybe_unused]] amrex::Real rhoy = state.rho * state.y_e; + + rate_eval.enuc_weak = 0.0_rt; + + // Calculate tabular rates and get ydot_weak + + + ydot_nuc(H1) = 0.0_rt; + + ydot_nuc(He4) = 0.0_rt; + + ydot_nuc(C12) = 0.0_rt; + + ydot_nuc(N13) = 0.0_rt; + + ydot_nuc(O16) = 0.0_rt; + + ydot_nuc(Ne20) = 0.0_rt; + + ydot_nuc(Na23) = 0.0_rt; + + ydot_nuc(Mg24) = 0.0_rt; + + ydot_nuc(Al27) = 0.0_rt; + + ydot_nuc(Si28) = 0.0_rt; + + ydot_nuc(P31) = 0.0_rt; + + ydot_nuc(S32) = 0.0_rt; + + ydot_nuc(Ar36) = 0.0_rt; + + ydot_nuc(Ca40) = 0.0_rt; + + ydot_nuc(Ti44) = 0.0_rt; + + ydot_nuc(Cr48) = 0.0_rt; + + ydot_nuc(Fe52) = 0.0_rt; + + ydot_nuc(Ni56) = 0.0_rt; + + enuc_weak = rate_eval.enuc_weak; +} +#endif + + AMREX_GPU_HOST_DEVICE AMREX_INLINE void rhs_nuc(const burn_t& state, amrex::Array1D& ydot_nuc, diff --git a/networks/subch_simple/actual_rhs.H b/networks/subch_simple/actual_rhs.H index 5a72edee3c..9e86ce9ddf 100644 --- a/networks/subch_simple/actual_rhs.H +++ b/networks/subch_simple/actual_rhs.H @@ -1038,11 +1038,89 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; - rate_eval.enuc_weak = 0.0; + rate_eval.enuc_weak = 0.0_rt; } +#ifdef NSE_NET +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void get_ydot_weak(const burn_t& state, + amrex::Array1D& ydot_nuc, + amrex::Real& enuc_weak, + [[maybe_unused]] const amrex::Array1D& Y) { + /// + /// Calculate Ydots contribute only from weak reactions. + /// This is used to calculate dyedt and energy generation from + /// weak reactions for self-consistent NSE + /// + + + // initialize ydot_nuc to 0 + + for (int i = 1; i <= neqs; ++i) { + ydot_nuc(i) = 0.0_rt; + } + + rate_t rate_eval; + + [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; + [[maybe_unused]] amrex::Real rhoy = state.rho * state.y_e; + + rate_eval.enuc_weak = 0.0_rt; + + // Calculate tabular rates and get ydot_weak + + + ydot_nuc(H1) = 0.0_rt; + + ydot_nuc(He4) = 0.0_rt; + + ydot_nuc(C12) = 0.0_rt; + + ydot_nuc(N13) = 0.0_rt; + + ydot_nuc(N14) = 0.0_rt; + + ydot_nuc(O16) = 0.0_rt; + + ydot_nuc(F18) = 0.0_rt; + + ydot_nuc(Ne20) = 0.0_rt; + + ydot_nuc(Ne21) = 0.0_rt; + + ydot_nuc(Na22) = 0.0_rt; + + ydot_nuc(Na23) = 0.0_rt; + + ydot_nuc(Mg24) = 0.0_rt; + + ydot_nuc(Al27) = 0.0_rt; + + ydot_nuc(Si28) = 0.0_rt; + + ydot_nuc(P31) = 0.0_rt; + + ydot_nuc(S32) = 0.0_rt; + + ydot_nuc(Ar36) = 0.0_rt; + + ydot_nuc(Ca40) = 0.0_rt; + + ydot_nuc(Ti44) = 0.0_rt; + + ydot_nuc(Cr48) = 0.0_rt; + + ydot_nuc(Fe52) = 0.0_rt; + + ydot_nuc(Ni56) = 0.0_rt; + + enuc_weak = rate_eval.enuc_weak; +} +#endif + + AMREX_GPU_HOST_DEVICE AMREX_INLINE void rhs_nuc(const burn_t& state, amrex::Array1D& ydot_nuc, diff --git a/nse_solver/Make.package b/nse_solver/Make.package index 66fe590429..f5344d27ff 100644 --- a/nse_solver/Make.package +++ b/nse_solver/Make.package @@ -1,4 +1,5 @@ ifeq ($(USE_NSE_NET), TRUE) CEXE_headers += nse_solver.H CEXE_headers += nse_check.H + CEXE_headers += nse_eos.H endif diff --git a/nse_solver/nse_eos.H b/nse_solver/nse_eos.H new file mode 100644 index 0000000000..69d4fccc44 --- /dev/null +++ b/nse_solver/nse_eos.H @@ -0,0 +1,174 @@ +#ifndef NSE_EOS_H +#define NSE_EOS_H + +#include + +#include + +#include +#include + + +AMREX_GPU_HOST_DEVICE AMREX_INLINE +amrex::Real nse_abar(const amrex::Real T, const amrex::Real rho, + const amrex::Real Ye, amrex::Real &mu_p, + amrex::Real &mu_n) { + /// + /// This function calculates abar from NSE using + /// Temp, rho, and Ye + /// + + burn_t burn_state; + burn_state.rho = rho; + burn_state.y_e = Ye; + burn_state.T = T; + burn_state.mu_p = mu_p; + burn_state.mu_n = mu_n; + + auto nse_state = get_actual_nse_state(burn_state, 1.0e-10_rt, true); + + amrex::Real abar{0.0_rt}; + for (int n = 0; n < NumSpec; ++n) { + abar += nse_state.xn[n] * aion_inv[n]; + } + + // update mu_p and mu_n + + mu_p = burn_state.mu_p; + mu_n = burn_state.mu_n; + + return abar; +} + + +AMREX_GPU_HOST_DEVICE AMREX_INLINE +amrex::Real nse_dabar_dT(const amrex::Real T, const amrex::Real rho, + const amrex::Real Ye, amrex::Real &mu_p, + amrex::Real &mu_n) { + /// + /// This function constructs dabar_dT + /// This should be 2nd order accurate + /// + + // deviation in temperature + + const amrex::Real dT = 1.0e-6_rt * T; + + // Calculate derivative using five-point stencil method + + amrex::Real dabar_dT = (-nse_abar(T + 2.0_rt*dT, rho, Ye, mu_p, mu_n) + + 8.0_rt * nse_abar(T+dT, rho, Ye, mu_p, mu_n) - + 8.0_rt * nse_abar(T-dT, rho, Ye, mu_p, mu_n) + + nse_abar(T - 2.0_rt*dT, rho, Ye, mu_p, mu_n) + ) / (12.0_rt * dT); + + // Calculate derivative using central differencing + + // amrex::Real dabar_dT = 0.5_rt * (nse_abar(T + dT, rho, Ye, mu_p, mu_n) - + // nse_abar(T - dT, rho, Ye, mu_p, mu_n)) / dT; + + return dabar_dT; +} + +/// +/// This function inverts this form of the EOS to find the T +/// that satisfies the EOS and NSE given an input e and rho. +/// +/// if we are in NSE, then the entire thermodynamic state is just +/// a function of rho, T, Ye. We can write the energy as: +/// +/// e = e(rho, T, Y_e, Abar(rho, T, Ye)) +/// +/// where we note that Abar is a function of those same inputs. +/// +/// The basic idea is that Abar and Zbar are both functions of +/// rho, T, Ye through NSE calculations, so we express the energy +/// as: +/// +/// e = e(rho, T, Abar(rho, T, Ye), Zbar(rho, T, Ye) +/// +/// and NR on that. Note that Zbar = Ye Abar, so we can group +/// those derivative terms together. +/// +/// T and abar come in as initial guesses and are updated +/// on output +/// + +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void +nse_T_abar_from_e(const amrex::Real rho, const amrex::Real e_in, + const amrex::Real Ye, + amrex::Real &T, amrex::Real &abar, + amrex::Real &mu_p, amrex::Real &mu_n) { + + constexpr Real ttol{1.e-8_rt}; + constexpr int max_iter{100}; + + bool converged{false}; + + int iter{0}; + + // initialize burn_state + burn_t burn_state; + burn_state.rho = rho; + burn_state.y_e = Ye; + burn_state.mu_p = mu_p; + burn_state.mu_n = mu_n; + + while (not converged && iter < max_iter) { + + // update Temperature + + burn_state.T = T; + + auto nse_state = get_actual_nse_state(burn_state, 1.0e-10_rt, true); + + // call the EOS with the initial guess for T + // as well as density and NSE mass fractions + + eos_extra_t eos_state; + for (int n = 0; n < NumSpec; ++n) { + eos_state.xn[n] = nse_state.xn[n]; + } + + // Call the EOS to get internal energy + // abar, zbar, etc are calculated automatically in EOS + + eos_state.rho = rho; + eos_state.T = T; + eos(eos_input_rt, eos_state); + + // f is the quantity we want to zero + + amrex::Real f = eos_state.e - e_in; + + amrex::Real dabar_dT = nse_dabar_dT(T, rho, Ye, + nse_state.mu_p, nse_state.mu_n); + + // compute the correction to our guess + + Real dT = -f / (eos_state.dedT + eos_state.dedA * dabar_dT + + Ye * eos_state.dedZ * dabar_dT); + + // update the temperature and abar + + T = std::clamp(T + dT, 0.25 * T, 4.0 * T); + abar = eos_state.abar; + + // update mu_p and mu_n + + mu_p = nse_state.mu_p; + mu_n = nse_state.mu_n; + + // check convergence + + if (std::abs(dT) < ttol * T) { + converged = true; + } + iter++; + + } + +} + +#endif From 24fc8547090297bacdefe30f14bc2c37e53069f4 Mon Sep 17 00:00:00 2001 From: Zhi Chen <62574124+zhichen3@users.noreply.github.com> Date: Sun, 14 Jul 2024 20:53:47 -0400 Subject: [PATCH 09/33] include higher taylor terms for fast_atan (#1611) Pointed out by Eric: in screening, atan is used in cases like gamma - atan(gamma), so we should use a higher order term rather than simply letting atan(gamma) ~ gamma when gamma is small. --- .../ci-benchmarks/nse_net_unit_test.out | 52 +- unit_test/test_nse_net/make_table/burn_cell.H | 10 +- .../nse_net_make_table_unit_test.out | 704 +++++++++--------- util/approx_math/approx_math.H | 25 +- 4 files changed, 399 insertions(+), 392 deletions(-) diff --git a/unit_test/test_nse_net/ci-benchmarks/nse_net_unit_test.out b/unit_test/test_nse_net/ci-benchmarks/nse_net_unit_test.out index 18e17a9981..2af0ee8961 100644 --- a/unit_test/test_nse_net/ci-benchmarks/nse_net_unit_test.out +++ b/unit_test/test_nse_net/ci-benchmarks/nse_net_unit_test.out @@ -1,5 +1,5 @@ -Initializing AMReX (23.07-395-ge6c93bf22695)... -AMReX (23.07-395-ge6c93bf22695) initialized +Initializing AMReX (23.07-445-gc09c45c31007)... +AMReX (23.07-445-gc09c45c31007) initialized starting the single zone burn... reading in network electron-capture / beta-decay tables... chemical potential of proton is -3 @@ -8,28 +8,28 @@ State Density (g/cm^3): 10000000 State Temperature (K): 6000000000 electron fraction is 0.5 NSE state: -n : 0.000607569351 -H1 : 0.001992432526 -He4 : 0.5190078752 -C12 : 1.326101988e-05 -N13 : 9.477376579e-11 -N14 : 2.56548683e-09 -O16 : 3.225455214e-05 -F18 : 5.422064122e-11 -Ne20 : 7.427509352e-07 -Ne21 : 4.99891257e-08 -Na22 : 2.608008157e-09 -Na23 : 1.008842941e-06 -Mg24 : 0.0001022222498 -Al27 : 0.0005548826564 -Si28 : 0.03680966808 -P31 : 0.0422922376 -S32 : 0.0386577195 -Ar36 : 0.02464742425 -Ca40 : 0.0288515261 -Ti44 : 0.001661231048 -Cr48 : 0.009967017622 -Fe52 : 0.05968005276 -Ni56 : 0.2351208186 +n : 0.0006075779147 +H1 : 0.001992190328 +He4 : 0.519153618 +C12 : 1.326242057e-05 +N13 : 9.476378074e-11 +N14 : 2.565252696e-09 +O16 : 3.225118799e-05 +F18 : 5.421427915e-11 +Ne20 : 7.426541003e-07 +Ne21 : 4.998331295e-08 +Na22 : 2.607634144e-09 +Na23 : 1.008712481e-06 +Mg24 : 0.0001022062575 +Al27 : 0.0005547964335 +Si28 : 0.03680294966 +P31 : 0.0422845632 +S32 : 0.03864965592 +Ar36 : 0.02464164049 +Ca40 : 0.02884400365 +Ti44 : 0.001660754609 +Cr48 : 0.009963899266 +Fe52 : 0.05965982508 +Ni56 : 0.2350349989 We're in NSE. -AMReX (23.07-395-ge6c93bf22695) finalized +AMReX (23.07-445-gc09c45c31007) finalized diff --git a/unit_test/test_nse_net/make_table/burn_cell.H b/unit_test/test_nse_net/make_table/burn_cell.H index 886338bf59..17f056ef06 100644 --- a/unit_test/test_nse_net/make_table/burn_cell.H +++ b/unit_test/test_nse_net/make_table/burn_cell.H @@ -37,9 +37,13 @@ void burn_cell_c() state.rho = rho; state.y_e = Ye; - if (state.y_e > 0.52_rt){ - state.mu_p = -4.0_rt; - state.mu_n = -14.0_rt; + if (state.y_e >= 0.63_rt) { + state.mu_p = -3.0_rt; + state.mu_n = -14.9_rt; + } + else if (state.y_e > 0.52_rt){ + state.mu_p = -6.0_rt; + state.mu_n = -11.0_rt; } else if (state.y_e > 0.48_rt){ state.mu_p = -8.0_rt; diff --git a/unit_test/test_nse_net/make_table/ci-benchmarks/nse_net_make_table_unit_test.out b/unit_test/test_nse_net/make_table/ci-benchmarks/nse_net_make_table_unit_test.out index 7ec0293319..b6c5f387b3 100644 --- a/unit_test/test_nse_net/make_table/ci-benchmarks/nse_net_make_table_unit_test.out +++ b/unit_test/test_nse_net/make_table/ci-benchmarks/nse_net_make_table_unit_test.out @@ -1,355 +1,355 @@ -Initializing AMReX (23.07-395-ge6c93bf22695)... -AMReX (23.07-395-ge6c93bf22695) initialized +Initializing AMReX (23.07-445-gc09c45c31007)... +AMReX (23.07-445-gc09c45c31007) initialized starting the single zone burn... reading in network electron-capture / beta-decay tables... - 1.0000000000e+06 4.0000000000e+09 0.4000000000 -12.9555025204 -4.7372062842 0 - 1.0000000000e+06 4.4286927156e+09 0.4000000000 -12.4096892935 -5.3017297034 1 - 1.0000000000e+06 4.9033297922e+09 0.4000000000 -11.8124863350 -5.9247157509 1 - 1.0000000000e+06 5.4288352332e+09 0.4000000000 -11.2186398049 -6.5894751704 1 - 1.0000000000e+06 6.0106607628e+09 0.4000000000 -10.8221627699 -7.3603511111 1 - 1.0000000000e+06 6.6548423840e+09 0.4000000000 -10.4363763722 -8.2252373664 1 - 1.0000000000e+06 7.3680629973e+09 0.4000000000 -10.1445056150 -9.0849662772 1 - 1.0000000000e+06 8.1577217310e+09 0.4000000000 -10.2582950656 -9.7983309243 1 - 1.0000000000e+06 9.0320107014e+09 0.4000000000 -11.0251962339 -10.7011623998 1 - 1.0000000000e+06 1.0000000000e+10 0.4000000000 -12.3061952746 -11.9583139126 1 - 1.0000000000e+07 4.0000000000e+09 0.4000000000 -13.7539410035 -3.9436985166 0 - 1.0000000000e+07 4.4286927156e+09 0.4000000000 -13.2910063988 -4.4245064973 1 - 1.0000000000e+07 4.9033297922e+09 0.4000000000 -12.7738571048 -4.9622430425 1 - 1.0000000000e+07 5.4288352332e+09 0.4000000000 -12.2022519657 -5.5597835137 1 - 1.0000000000e+07 6.0106607628e+09 0.4000000000 -11.5968451667 -6.2091582807 1 - 1.0000000000e+07 6.6548423840e+09 0.4000000000 -11.0838653206 -6.9172956472 1 - 1.0000000000e+07 7.3680629973e+09 0.4000000000 -10.7117195040 -7.7493017684 1 - 1.0000000000e+07 8.1577217310e+09 0.4000000000 -10.3608224687 -8.6311809609 1 - 1.0000000000e+07 9.0320107014e+09 0.4000000000 -10.2512028838 -9.4182840030 1 - 1.0000000000e+07 1.0000000000e+10 0.4000000000 -10.6008153728 -10.1495273727 1 - 1.0000000000e+08 4.0000000000e+09 0.4000000000 -14.5607973487 -3.1500296846 0 - 1.0000000000e+08 4.4286927156e+09 0.4000000000 -14.1824332333 -3.5459083093 1 - 1.0000000000e+08 4.9033297922e+09 0.4000000000 -13.7577662180 -3.9903922193 1 - 1.0000000000e+08 5.4288352332e+09 0.4000000000 -13.2819583494 -4.4889815352 1 - 1.0000000000e+08 6.0106607628e+09 0.4000000000 -12.7514980414 -5.0464198084 1 - 1.0000000000e+08 6.6548423840e+09 0.4000000000 -12.1712468695 -5.6630196541 1 - 1.0000000000e+08 7.3680629973e+09 0.4000000000 -11.5722427319 -6.3289690263 1 - 1.0000000000e+08 8.1577217310e+09 0.4000000000 -11.0954919155 -7.0732199085 1 - 1.0000000000e+08 9.0320107014e+09 0.4000000000 -10.7313790718 -7.9307043937 1 - 1.0000000000e+08 1.0000000000e+10 0.4000000000 -10.4459234786 -8.7985272846 1 + 1.0000000000e+06 4.0000000000e+09 0.4000000000 -12.9555025985 -4.7372062322 0 + 1.0000000000e+06 4.4286927156e+09 0.4000000000 -12.4096886951 -5.3017300984 1 + 1.0000000000e+06 4.9033297922e+09 0.4000000000 -11.8124827277 -5.9247179903 1 + 1.0000000000e+06 5.4288352332e+09 0.4000000000 -11.2186195287 -6.5894809028 1 + 1.0000000000e+06 6.0106607628e+09 0.4000000000 -10.8221238417 -7.3603510805 1 + 1.0000000000e+06 6.6548423840e+09 0.4000000000 -10.4363399360 -8.2252368745 1 + 1.0000000000e+06 7.3680629973e+09 0.4000000000 -10.1444749829 -9.0849628652 1 + 1.0000000000e+06 8.1577217310e+09 0.4000000000 -10.2582729101 -9.7983255913 1 + 1.0000000000e+06 9.0320107014e+09 0.4000000000 -11.0251835300 -10.7011614674 1 + 1.0000000000e+06 1.0000000000e+10 0.4000000000 -12.3061845155 -11.9583138919 1 + 1.0000000000e+07 4.0000000000e+09 0.4000000000 -13.7539410130 -3.9436985103 0 + 1.0000000000e+07 4.4286927156e+09 0.4000000000 -13.2910064791 -4.4245064438 1 + 1.0000000000e+07 4.9033297922e+09 0.4000000000 -12.7738576654 -4.9622426711 1 + 1.0000000000e+07 5.4288352332e+09 0.4000000000 -12.2022552335 -5.5597814123 1 + 1.0000000000e+07 6.0106607628e+09 0.4000000000 -11.5968613147 -6.2091497038 1 + 1.0000000000e+07 6.6548423840e+09 0.4000000000 -11.0839445473 -6.9172943556 1 + 1.0000000000e+07 7.3680629973e+09 0.4000000000 -10.7118071972 -7.7493029627 1 + 1.0000000000e+07 8.1577217310e+09 0.4000000000 -10.3609046402 -8.6311911606 1 + 1.0000000000e+07 9.0320107014e+09 0.4000000000 -10.2511246531 -9.4182694259 1 + 1.0000000000e+07 1.0000000000e+10 0.4000000000 -10.6007602543 -10.1495148201 1 + 1.0000000000e+08 4.0000000000e+09 0.4000000000 -14.5607973496 -3.1500296840 0 + 1.0000000000e+08 4.4286927156e+09 0.4000000000 -14.1824332412 -3.5459083040 1 + 1.0000000000e+08 4.9033297922e+09 0.4000000000 -13.7577662756 -3.9903921809 1 + 1.0000000000e+08 5.4288352332e+09 0.4000000000 -13.2819587028 -4.4889813003 1 + 1.0000000000e+08 6.0106607628e+09 0.4000000000 -12.7514998816 -5.0464186008 1 + 1.0000000000e+08 6.6548423840e+09 0.4000000000 -12.1712550423 -5.6630145848 1 + 1.0000000000e+08 7.3680629973e+09 0.4000000000 -11.5722750148 -6.3289545463 1 + 1.0000000000e+08 8.1577217310e+09 0.4000000000 -11.0956062224 -7.0732197715 1 + 1.0000000000e+08 9.0320107014e+09 0.4000000000 -10.7314991991 -7.9307107472 1 + 1.0000000000e+08 1.0000000000e+10 0.4000000000 -10.4460221082 -8.7985576148 1 1.0000000000e+09 4.0000000000e+09 0.4000000000 -15.3871516246 -2.3563444183 0 - 1.0000000000e+09 4.4286927156e+09 0.4000000000 -15.0933118585 -2.6671723129 1 - 1.0000000000e+09 4.9033297922e+09 0.4000000000 -14.7621490253 -3.0175641915 1 - 1.0000000000e+09 5.4288352332e+09 0.4000000000 -14.3892566411 -3.4124048451 1 - 1.0000000000e+09 6.0106607628e+09 0.4000000000 -13.9696328335 -3.8570453479 1 - 1.0000000000e+09 6.6548423840e+09 0.4000000000 -13.4990892461 -4.3569663734 1 - 1.0000000000e+09 7.3680629973e+09 0.4000000000 -12.9751070035 -4.9165801598 1 - 1.0000000000e+09 8.1577217310e+09 0.4000000000 -12.4029615922 -5.5362921583 1 - 1.0000000000e+09 9.0320107014e+09 0.4000000000 -11.8075492548 -6.2097916688 1 - 1.0000000000e+09 1.0000000000e+10 0.4000000000 -11.2831770772 -6.9503077459 1 - 1.0000000000e+10 4.0000000000e+09 0.4000000000 -16.2582598176 -1.5626567041 0 - 1.0000000000e+10 4.4286927156e+09 0.4000000000 -16.0486738826 -1.7884208125 1 - 1.0000000000e+10 4.9033297922e+09 0.4000000000 -15.8108280448 -2.0446360334 1 - 1.0000000000e+10 5.4288352332e+09 0.4000000000 -15.5412395186 -2.3352407233 1 - 1.0000000000e+10 6.0106607628e+09 0.4000000000 -15.2357440992 -2.6646600961 1 - 1.0000000000e+10 6.6548423840e+09 0.4000000000 -14.8903553277 -3.0378300141 1 - 1.0000000000e+10 7.3680629973e+09 0.4000000000 -14.5003230778 -3.4601446829 1 - 1.0000000000e+10 8.1577217310e+09 0.4000000000 -14.0614570153 -3.9371817304 1 - 1.0000000000e+10 9.0320107014e+09 0.4000000000 -13.5711724217 -4.4739432697 1 - 1.0000000000e+10 1.0000000000e+10 0.4000000000 -13.0312175162 -5.0733655763 1 - 1.0000000000e+06 4.0000000000e+09 0.4500000000 -12.6199618053 -5.0493825987 0 - 1.0000000000e+06 4.4286927156e+09 0.4500000000 -12.0411581961 -5.6445822151 1 - 1.0000000000e+06 4.9033297922e+09 0.4500000000 -11.4232312199 -6.2868479094 1 - 1.0000000000e+06 5.4288352332e+09 0.4500000000 -10.8518428398 -6.9298657584 1 - 1.0000000000e+06 6.0106607628e+09 0.4500000000 -10.4348708730 -7.7172921982 1 - 1.0000000000e+06 6.6548423840e+09 0.4500000000 -10.0424621871 -8.5877955647 1 - 1.0000000000e+06 7.3680629973e+09 0.4500000000 -9.8849946892 -9.3214605955 1 - 1.0000000000e+06 8.1577217310e+09 0.4500000000 -10.1350747780 -9.9053651295 1 - 1.0000000000e+06 9.0320107014e+09 0.4500000000 -10.9317730375 -10.7720016856 1 - 1.0000000000e+06 1.0000000000e+10 0.4500000000 -12.2046629248 -12.0333675970 1 - 1.0000000000e+07 4.0000000000e+09 0.4500000000 -13.4182964409 -4.2562148091 0 - 1.0000000000e+07 4.4286927156e+09 0.4500000000 -12.9196141769 -4.7702516152 1 - 1.0000000000e+07 4.9033297922e+09 0.4500000000 -12.3646700494 -5.3431239685 1 - 1.0000000000e+07 5.4288352332e+09 0.4500000000 -11.7607919864 -5.9706982948 1 - 1.0000000000e+07 6.0106607628e+09 0.4500000000 -11.1529755129 -6.6222947524 1 - 1.0000000000e+07 6.6548423840e+09 0.4500000000 -10.6533363165 -7.3144541390 1 - 1.0000000000e+07 7.3680629973e+09 0.4500000000 -10.2538115130 -8.1710937198 1 - 1.0000000000e+07 8.1577217310e+09 0.4500000000 -9.9753897162 -8.9845986143 1 - 1.0000000000e+07 9.0320107014e+09 0.4500000000 -10.0361542054 -9.6115697958 1 - 1.0000000000e+07 1.0000000000e+10 0.4500000000 -10.4770937073 -10.2529776199 1 - 1.0000000000e+08 4.0000000000e+09 0.4500000000 -14.2257599760 -3.4625787945 0 - 1.0000000000e+08 4.4286927156e+09 0.4500000000 -13.8113628847 -3.8919431610 1 - 1.0000000000e+08 4.9033297922e+09 0.4500000000 -13.3469605437 -4.3733521393 1 - 1.0000000000e+08 5.4288352332e+09 0.4500000000 -12.8281601561 -4.9118963225 1 - 1.0000000000e+08 6.0106607628e+09 0.4500000000 -12.2549827771 -5.5090675693 1 - 1.0000000000e+08 6.6548423840e+09 0.4500000000 -11.6452553291 -6.1532183846 1 - 1.0000000000e+08 7.3680629973e+09 0.4500000000 -11.0519169747 -6.8138046108 1 - 1.0000000000e+08 8.1577217310e+09 0.4500000000 -10.5744119695 -7.5537001211 1 - 1.0000000000e+08 9.0320107014e+09 0.4500000000 -10.2097691952 -8.4106502242 1 - 1.0000000000e+08 1.0000000000e+10 0.4500000000 -10.0527955898 -9.1577337848 1 - 1.0000000000e+09 4.0000000000e+09 0.4500000000 -15.0536228396 -2.6688948472 0 - 1.0000000000e+09 4.4286927156e+09 0.4500000000 -14.7237134072 -3.0132309283 1 - 1.0000000000e+09 4.9033297922e+09 0.4500000000 -14.3526160867 -3.4007197563 1 - 1.0000000000e+09 5.4288352332e+09 0.4500000000 -13.9355877638 -3.8365577467 1 - 1.0000000000e+09 6.0106607628e+09 0.4500000000 -13.4675881563 -4.3261360138 1 - 1.0000000000e+09 6.6548423840e+09 0.4500000000 -12.9456617325 -4.8738185708 1 - 1.0000000000e+09 7.3680629973e+09 0.4500000000 -12.3724764785 -5.4792958152 1 - 1.0000000000e+09 8.1577217310e+09 0.4500000000 -11.7661588560 -6.1311892901 1 - 1.0000000000e+09 9.0320107014e+09 0.4500000000 -11.1668612132 -6.8085657276 1 - 1.0000000000e+09 1.0000000000e+10 0.4500000000 -10.6512855625 -7.5351949184 1 - 1.0000000000e+10 4.0000000000e+09 0.4500000000 -15.9281485305 -1.8752022445 0 - 1.0000000000e+10 4.4286927156e+09 0.4500000000 -15.6824856145 -2.1344670415 1 - 1.0000000000e+10 4.9033297922e+09 0.4500000000 -15.4047001813 -2.4277705489 1 - 1.0000000000e+10 5.4288352332e+09 0.4500000000 -15.0909188396 -2.7594143274 1 - 1.0000000000e+10 6.0106607628e+09 0.4500000000 -14.7366091103 -3.1341694060 1 - 1.0000000000e+10 6.6548423840e+09 0.4500000000 -14.3375648682 -3.5571890304 1 - 1.0000000000e+10 7.3680629973e+09 0.4500000000 -13.8893261475 -4.0336347952 1 - 1.0000000000e+10 8.1577217310e+09 0.4500000000 -13.3893312974 -4.5676563215 1 - 1.0000000000e+10 9.0320107014e+09 0.4500000000 -12.8393727587 -5.1603436508 1 - 1.0000000000e+10 1.0000000000e+10 0.4500000000 -12.2492192359 -5.8073345674 1 - 1.0000000000e+06 4.0000000000e+09 0.5000000000 -8.0664287063 -9.4890300885 0 - 1.0000000000e+06 4.4286927156e+09 0.5000000000 -8.2111123981 -9.3757297125 1 - 1.0000000000e+06 4.9033297922e+09 0.5000000000 -8.3918399895 -9.2344583793 1 - 1.0000000000e+06 5.4288352332e+09 0.5000000000 -8.7773708532 -8.9447667662 1 - 1.0000000000e+06 6.0106607628e+09 0.5000000000 -9.0637265807 -9.0647441208 1 - 1.0000000000e+06 6.6548423840e+09 0.5000000000 -9.3058731093 -9.3070059375 1 - 1.0000000000e+06 7.3680629973e+09 0.5000000000 -9.5983915599 -9.5996554213 1 - 1.0000000000e+06 8.1577217310e+09 0.5000000000 -10.0168541391 -10.0182626012 1 - 1.0000000000e+06 9.0320107014e+09 0.5000000000 -10.8474197344 -10.8489878418 1 - 1.0000000000e+06 1.0000000000e+10 0.5000000000 -12.1138199092 -12.1155643414 1 - 1.0000000000e+07 4.0000000000e+09 0.5000000000 -7.8839123533 -9.6536792188 0 - 1.0000000000e+07 4.4286927156e+09 0.5000000000 -8.0019180002 -9.5630334034 1 - 1.0000000000e+07 4.9033297922e+09 0.5000000000 -8.1354121681 -9.4609849615 1 - 1.0000000000e+07 5.4288352332e+09 0.5000000000 -8.2961986080 -9.3384887105 1 - 1.0000000000e+07 6.0106607628e+09 0.5000000000 -8.5443326081 -9.1484326209 1 - 1.0000000000e+07 6.6548423840e+09 0.5000000000 -8.9669523913 -8.9714790676 1 - 1.0000000000e+07 7.3680629973e+09 0.5000000000 -9.2004322394 -9.2015703723 1 - 1.0000000000e+07 8.1577217310e+09 0.5000000000 -9.4726257222 -9.4739144064 1 - 1.0000000000e+07 9.0320107014e+09 0.5000000000 -9.8194771269 -9.8209313702 1 - 1.0000000000e+07 1.0000000000e+10 0.5000000000 -10.3609081088 -10.3625443016 1 - 1.0000000000e+08 4.0000000000e+09 0.5000000000 -7.7564252605 -9.7786841281 0 - 1.0000000000e+08 4.4286927156e+09 0.5000000000 -7.8492019112 -9.7096717498 1 - 1.0000000000e+08 4.9033297922e+09 0.5000000000 -7.9527961073 -9.6330305105 1 - 1.0000000000e+08 5.4288352332e+09 0.5000000000 -8.0692464391 -9.5476093419 1 - 1.0000000000e+08 6.0106607628e+09 0.5000000000 -8.2063900317 -9.4473474639 1 - 1.0000000000e+08 6.6548423840e+09 0.5000000000 -8.3860213927 -9.3159021644 1 - 1.0000000000e+08 7.3680629973e+09 0.5000000000 -8.6892088477 -9.0970021780 1 - 1.0000000000e+08 8.1577217310e+09 0.5000000000 -9.0475207044 -9.0501554594 1 - 1.0000000000e+08 9.0320107014e+09 0.5000000000 -9.2986740372 -9.2997699354 1 - 1.0000000000e+08 1.0000000000e+10 0.5000000000 -9.5981877903 -9.5994826015 1 - 1.0000000000e+09 4.0000000000e+09 0.5000000000 -7.7470638015 -9.8201507833 0 - 1.0000000000e+09 4.4286927156e+09 0.5000000000 -7.8147769492 -9.7725305169 1 - 1.0000000000e+09 4.9033297922e+09 0.5000000000 -7.8899734067 -9.7200977838 1 - 1.0000000000e+09 5.4288352332e+09 0.5000000000 -7.9729788613 -9.6630648524 1 - 1.0000000000e+09 6.0106607628e+09 0.5000000000 -8.0659663127 -9.5999364916 1 - 1.0000000000e+09 6.6548423840e+09 0.5000000000 -8.1710732556 -9.5300539621 1 - 1.0000000000e+09 7.3680629973e+09 0.5000000000 -8.2980125161 -9.4462720608 1 - 1.0000000000e+09 8.1577217310e+09 0.5000000000 -8.4687660372 -9.3330282318 1 - 1.0000000000e+09 9.0320107014e+09 0.5000000000 -8.7320500861 -9.1630033338 1 - 1.0000000000e+09 1.0000000000e+10 0.5000000000 -9.0632943617 -9.0828318763 1 - 1.0000000000e+10 4.0000000000e+09 0.5000000000 -7.9879953396 -9.6879468798 1 - 1.0000000000e+10 4.4286927156e+09 0.5000000000 -8.0302314490 -9.6619337577 1 - 1.0000000000e+10 4.9033297922e+09 0.5000000000 -8.0763284304 -9.6342740546 1 - 1.0000000000e+10 5.4288352332e+09 0.5000000000 -8.1258459897 -9.6058175046 1 - 1.0000000000e+10 6.0106607628e+09 0.5000000000 -8.1795088599 -9.5762491105 1 - 1.0000000000e+10 6.6548423840e+09 0.5000000000 -8.2365078557 -9.5472461611 1 - 1.0000000000e+10 7.3680629973e+09 0.5000000000 -8.2988571338 -9.5177368349 1 - 1.0000000000e+10 8.1577217310e+09 0.5000000000 -8.3695493416 -9.4863947153 1 - 1.0000000000e+10 9.0320107014e+09 0.5000000000 -8.4559431120 -9.4487939586 1 - 1.0000000000e+10 1.0000000000e+10 0.5000000000 -8.5723779233 -9.3960835543 1 - 1.0000000000e+06 4.0000000000e+09 0.5500000000 -4.9263567583 -12.6306847771 0 - 1.0000000000e+06 4.4286927156e+09 0.5500000000 -5.5125982821 -12.0759967435 1 - 1.0000000000e+06 4.9033297922e+09 0.5500000000 -6.1679059616 -11.4605293767 1 - 1.0000000000e+06 5.4288352332e+09 0.5500000000 -6.9002510955 -10.8361899606 1 - 1.0000000000e+06 6.0106607628e+09 0.5500000000 -7.7162795920 -10.4358987387 1 - 1.0000000000e+06 6.6548423840e+09 0.5500000000 -8.5866665410 -10.0436084115 1 - 1.0000000000e+06 7.3680629973e+09 0.5500000000 -9.3202024829 -9.8862686067 1 - 1.0000000000e+06 8.1577217310e+09 0.5500000000 -9.9039624201 -10.1364903176 1 - 1.0000000000e+06 9.0320107014e+09 0.5500000000 -10.7704366546 -10.9333444696 1 - 1.0000000000e+06 1.0000000000e+10 0.5500000000 -12.0316256213 -12.2064099419 1 - 1.0000000000e+07 4.0000000000e+09 0.5500000000 -4.1328499283 -13.4067273031 0 - 1.0000000000e+07 4.4286927156e+09 0.5500000000 -4.6340211015 -12.9330486665 1 - 1.0000000000e+07 4.9033297922e+09 0.5500000000 -5.1951522570 -12.4035178568 1 - 1.0000000000e+07 5.4288352332e+09 0.5500000000 -5.8233286811 -11.8138168049 1 - 1.0000000000e+07 6.0106607628e+09 0.5500000000 -6.5263096328 -11.1696374790 1 - 1.0000000000e+07 6.6548423840e+09 0.5500000000 -7.3118205884 -10.6533164642 1 - 1.0000000000e+07 7.3680629973e+09 0.5500000000 -8.1699653523 -10.2549768923 1 - 1.0000000000e+07 8.1577217310e+09 0.5500000000 -8.9833218276 -9.9767011458 1 - 1.0000000000e+07 9.0320107014e+09 0.5500000000 -9.6101289590 -10.0376261258 1 - 1.0000000000e+07 1.0000000000e+10 0.5500000000 -10.2513560243 -10.4787469547 1 - 1.0000000000e+08 4.0000000000e+09 0.5500000000 -3.3394222565 -14.1986157657 0 - 1.0000000000e+08 4.4286927156e+09 0.5500000000 -3.7555058127 -13.8064185762 1 - 1.0000000000e+08 4.9033297922e+09 0.5500000000 -4.2224338348 -13.3665796932 1 - 1.0000000000e+08 5.4288352332e+09 0.5500000000 -4.7463244462 -12.8738625707 1 - 1.0000000000e+08 6.0106607628e+09 0.5500000000 -5.3340170370 -12.3231580847 1 - 1.0000000000e+08 6.6548423840e+09 0.5500000000 -5.9930630460 -11.7121630303 1 - 1.0000000000e+08 7.3680629973e+09 0.5500000000 -6.7314189359 -11.0586117888 1 - 1.0000000000e+08 8.1577217310e+09 0.5500000000 -7.5518998378 -10.5748765826 1 - 1.0000000000e+08 9.0320107014e+09 0.5500000000 -8.4095851780 -10.2109427835 1 - 1.0000000000e+08 1.0000000000e+10 0.5500000000 -9.1564767533 -10.0541540547 1 - 1.0000000000e+09 4.0000000000e+09 0.5500000000 -2.5470603946 -15.0251960133 0 - 1.0000000000e+09 4.4286927156e+09 0.5500000000 -2.8780137697 -14.7144476551 1 - 1.0000000000e+09 4.9033297922e+09 0.5500000000 -3.2506978413 -14.3646520162 1 - 1.0000000000e+09 5.4288352332e+09 0.5500000000 -3.6702538871 -13.9712053620 1 - 1.0000000000e+09 6.0106607628e+09 0.5500000000 -4.1424458459 -13.5290133725 1 - 1.0000000000e+09 6.6548423840e+09 0.5500000000 -4.6737326992 -13.0330537776 1 - 1.0000000000e+09 7.3680629973e+09 0.5500000000 -5.2713212052 -12.4785205588 1 - 1.0000000000e+09 8.1577217310e+09 0.5500000000 -5.9429385089 -11.8635582114 1 - 1.0000000000e+09 9.0320107014e+09 0.5500000000 -6.6949519374 -11.2026555889 1 - 1.0000000000e+09 1.0000000000e+10 0.5500000000 -7.5247904700 -10.6481506638 1 - 1.0000000000e+10 4.0000000000e+09 0.5500000000 -1.7575285290 -15.9281119586 1 - 1.0000000000e+10 4.4286927156e+09 0.5500000000 -2.0032273072 -15.6987367857 1 - 1.0000000000e+10 4.9033297922e+09 0.5500000000 -2.2815466531 -15.4389665570 1 - 1.0000000000e+10 5.4288352332e+09 0.5500000000 -2.5966508213 -15.1450469031 1 - 1.0000000000e+10 6.0106607628e+09 0.5500000000 -2.9532220861 -14.8127045193 1 - 1.0000000000e+10 6.6548423840e+09 0.5500000000 -3.3565239474 -14.4375393899 1 - 1.0000000000e+10 7.3680629973e+09 0.5500000000 -3.8124716671 -14.0145582613 1 - 1.0000000000e+10 8.1577217310e+09 0.5500000000 -4.3277071808 -13.5387148150 1 - 1.0000000000e+10 9.0320107014e+09 0.5500000000 -4.9096377922 -13.0053181043 1 - 1.0000000000e+10 1.0000000000e+10 0.5500000000 -5.5661097741 -12.4114337141 1 - 1.0000000000e+06 4.0000000000e+09 0.6000000000 -4.6874372498 -12.8713326831 0 - 1.0000000000e+06 4.4286927156e+09 0.6000000000 -5.2480726287 -12.3424870400 1 - 1.0000000000e+06 4.9033297922e+09 0.6000000000 -5.8750376557 -11.7561606661 1 - 1.0000000000e+06 5.4288352332e+09 0.6000000000 -6.5760898652 -11.1834318133 1 - 1.0000000000e+06 6.0106607628e+09 0.6000000000 -7.3593425290 -10.8232051193 1 - 1.0000000000e+06 6.6548423840e+09 0.6000000000 -8.2241108560 -10.4375374976 1 - 1.0000000000e+06 7.3680629973e+09 0.6000000000 -9.0837111804 -10.1457926302 1 - 1.0000000000e+06 8.1577217310e+09 0.6000000000 -9.7969327525 -10.2597190165 1 - 1.0000000000e+06 9.0320107014e+09 0.6000000000 -10.6996001970 -11.0267712343 1 - 1.0000000000e+06 1.0000000000e+10 0.6000000000 -11.9565742814 -12.3079450256 1 - 1.0000000000e+07 4.0000000000e+09 0.6000000000 -3.8939383372 -13.6477417081 0 - 1.0000000000e+07 4.4286927156e+09 0.6000000000 -4.3695027901 -13.1998278106 1 - 1.0000000000e+07 4.9033297922e+09 0.6000000000 -4.9022832206 -12.6988733383 1 - 1.0000000000e+07 5.4288352332e+09 0.6000000000 -5.4990786383 -12.1410754239 1 - 1.0000000000e+07 6.0106607628e+09 0.6000000000 -6.1674541533 -11.5347440371 1 - 1.0000000000e+07 6.6548423840e+09 0.6000000000 -6.9156298388 -11.0830753295 1 - 1.0000000000e+07 7.3680629973e+09 0.6000000000 -7.7481817497 -10.7129141315 1 - 1.0000000000e+07 8.1577217310e+09 0.6000000000 -8.6299116983 -10.3621615417 1 - 1.0000000000e+07 9.0320107014e+09 0.6000000000 -9.4168075327 -10.2525633805 1 - 1.0000000000e+07 1.0000000000e+10 0.6000000000 -10.1478709457 -10.6024085069 1 - 1.0000000000e+08 4.0000000000e+09 0.6000000000 -3.1005259273 -14.4405028547 0 - 1.0000000000e+08 4.4286927156e+09 0.6000000000 -3.4910018429 -14.0740545856 1 - 1.0000000000e+08 4.9033297922e+09 0.6000000000 -3.9295779936 -13.6627315310 1 - 1.0000000000e+08 5.4288352332e+09 0.6000000000 -4.4220785916 -13.2016151666 1 - 1.0000000000e+08 6.0106607628e+09 0.6000000000 -4.9750223848 -12.6860143020 1 - 1.0000000000e+08 6.6548423840e+09 0.6000000000 -5.5956833129 -12.1143859321 1 - 1.0000000000e+08 7.3680629973e+09 0.6000000000 -6.2923470974 -11.5100241165 1 - 1.0000000000e+08 8.1577217310e+09 0.6000000000 -7.0719798685 -11.0955902794 1 - 1.0000000000e+08 9.0320107014e+09 0.6000000000 -7.9296619962 -10.7326405101 1 - 1.0000000000e+08 1.0000000000e+10 0.6000000000 -8.7972934615 -10.4473618809 1 - 1.0000000000e+09 4.0000000000e+09 0.6000000000 -2.3082235668 -15.2690142179 0 - 1.0000000000e+09 4.4286927156e+09 0.6000000000 -2.6135665219 -14.9840071714 1 - 1.0000000000e+09 4.9033297922e+09 0.6000000000 -2.9578960346 -14.6627124682 1 - 1.0000000000e+09 5.4288352332e+09 0.6000000000 -3.3460592682 -14.3008241528 1 - 1.0000000000e+09 6.0106607628e+09 0.6000000000 -3.7834946071 -13.8935836540 1 - 1.0000000000e+09 6.6548423840e+09 0.6000000000 -4.2763022554 -13.4363612027 1 - 1.0000000000e+09 7.3680629973e+09 0.6000000000 -4.8313168013 -12.9248402164 1 - 1.0000000000e+09 8.1577217310e+09 0.6000000000 -5.4561228019 -12.3577854824 1 - 1.0000000000e+09 9.0320107014e+09 0.6000000000 -6.1587039833 -11.7516690135 1 - 1.0000000000e+09 1.0000000000e+10 0.6000000000 -6.9454524603 -11.2745753097 1 - 1.0000000000e+10 4.0000000000e+09 0.6000000000 -1.5188716438 -16.1761351108 0 - 1.0000000000e+10 4.4286927156e+09 0.6000000000 -1.7389525113 -15.9724978714 1 - 1.0000000000e+10 4.9033297922e+09 0.6000000000 -1.9889099833 -15.7412229679 1 - 1.0000000000e+10 5.4288352332e+09 0.6000000000 -2.2726142074 -15.4788512292 1 - 1.0000000000e+10 6.0106607628e+09 0.6000000000 -2.5944218278 -15.1814362147 1 - 1.0000000000e+10 6.6548423840e+09 0.6000000000 -2.9592358252 -14.8449412444 1 - 1.0000000000e+10 7.3680629973e+09 0.6000000000 -3.3725725553 -14.4647794265 1 - 1.0000000000e+10 8.1577217310e+09 0.6000000000 -3.8406360372 -14.0363659318 1 - 1.0000000000e+10 9.0320107014e+09 0.6000000000 -4.3703910764 -13.5555230831 1 - 1.0000000000e+10 1.0000000000e+10 0.6000000000 -4.9695596343 -13.0196507108 1 - 1.0000000000e+06 4.0000000000e+09 0.6500000000 -4.5476796742 -13.0130039947 0 - 1.0000000000e+06 4.4286927156e+09 0.6500000000 -5.0933362712 -12.4994174293 1 - 1.0000000000e+06 4.9033297922e+09 0.6500000000 -5.7037185995 -11.9307011924 1 - 1.0000000000e+06 5.4288352332e+09 0.6500000000 -6.3864250027 -11.4022341176 1 - 1.0000000000e+06 6.0106607628e+09 0.6500000000 -7.1497090923 -11.0673819184 1 - 1.0000000000e+06 6.6548423840e+09 0.6500000000 -7.9986396847 -10.7004385555 1 - 1.0000000000e+06 7.3680629973e+09 0.6500000000 -8.8932281298 -10.3705502418 1 - 1.0000000000e+06 8.1577217310e+09 0.6500000000 -9.6962470719 -10.3881605331 1 - 1.0000000000e+06 9.0320107014e+09 0.6500000000 -10.6340099963 -11.1317007071 1 - 1.0000000000e+06 1.0000000000e+10 0.6500000000 -11.8875232376 -12.4230320085 1 - 1.0000000000e+07 4.0000000000e+09 0.6500000000 -3.7541883557 -13.7897569631 0 - 1.0000000000e+07 4.4286927156e+09 0.6500000000 -4.2147736231 -13.3570050888 1 - 1.0000000000e+07 4.9033297922e+09 0.6500000000 -4.7309696318 -12.8729015431 1 - 1.0000000000e+07 5.4288352332e+09 0.6500000000 -5.3094047388 -12.3341136606 1 - 1.0000000000e+07 6.0106607628e+09 0.6500000000 -5.9574765589 -11.7528091119 1 - 1.0000000000e+07 6.6548423840e+09 0.6500000000 -6.6833511744 -11.3535641629 1 - 1.0000000000e+07 7.3680629973e+09 0.6500000000 -7.4942271332 -11.0088492097 1 - 1.0000000000e+07 8.1577217310e+09 0.6500000000 -8.3793161375 -10.6554902076 1 - 1.0000000000e+07 9.0320107014e+09 0.6500000000 -9.2440396955 -10.4605434295 1 - 1.0000000000e+07 1.0000000000e+10 0.6500000000 -10.0502569485 -10.7352236557 1 - 1.0000000000e+08 4.0000000000e+09 0.6500000000 -2.9607906232 -14.5833440181 0 - 1.0000000000e+08 4.4286927156e+09 0.6500000000 -3.3362864793 -14.2320397904 1 - 1.0000000000e+08 4.9033297922e+09 0.6500000000 -3.7582773168 -13.8374930298 1 - 1.0000000000e+08 5.4288352332e+09 0.6500000000 -4.2324153362 -13.3949878626 1 - 1.0000000000e+08 6.0106607628e+09 0.6500000000 -4.7650296834 -12.9001483764 1 - 1.0000000000e+08 6.6548423840e+09 0.6500000000 -5.3631981018 -12.3522858919 1 - 1.0000000000e+08 7.3680629973e+09 0.6500000000 -6.0351054434 -11.7844816604 1 - 1.0000000000e+08 8.1577217310e+09 0.6500000000 -6.7883154852 -11.4259937475 1 - 1.0000000000e+08 9.0320107014e+09 0.6500000000 -7.6264687221 -11.0863271605 1 - 1.0000000000e+08 1.0000000000e+10 0.6500000000 -8.5199483965 -10.7735064153 1 - 1.0000000000e+09 4.0000000000e+09 0.6500000000 -2.1685452785 -15.4136828685 0 - 1.0000000000e+09 4.4286927156e+09 0.6500000000 -2.4589055197 -15.1438122255 1 - 1.0000000000e+09 4.9033297922e+09 0.6500000000 -2.7866471569 -14.8392773913 1 - 1.0000000000e+09 5.4288352332e+09 0.6500000000 -3.1564453048 -14.4959492528 1 - 1.0000000000e+09 6.0106607628e+09 0.6500000000 -3.5735478746 -14.1092731402 1 - 1.0000000000e+09 6.6548423840e+09 0.6500000000 -4.0438444754 -13.6748739586 1 - 1.0000000000e+09 7.3680629973e+09 0.6500000000 -4.5739409491 -13.1888195133 1 - 1.0000000000e+09 8.1577217310e+09 0.6500000000 -5.1712163628 -12.6507561248 1 - 1.0000000000e+09 9.0320107014e+09 0.6500000000 -5.8437444564 -12.0829813034 1 - 1.0000000000e+09 1.0000000000e+10 0.6500000000 -6.5994405224 -11.6765113113 1 - 1.0000000000e+10 4.0000000000e+09 0.6500000000 -1.3793655235 -16.3247814756 0 - 1.0000000000e+10 4.4286927156e+09 0.6500000000 -1.5844565484 -16.1362774695 1 - 1.0000000000e+10 4.9033297922e+09 0.6500000000 -1.8178191791 -15.9217568381 1 - 1.0000000000e+10 5.4288352332e+09 0.6500000000 -2.0831515252 -15.6779340065 1 - 1.0000000000e+10 6.0106607628e+09 0.6500000000 -2.3846197513 -15.4010550224 1 - 1.0000000000e+10 6.6548423840e+09 0.6500000000 -2.7269159436 -15.0872983686 1 - 1.0000000000e+10 7.3680629973e+09 0.6500000000 -3.1153229999 -14.7323215524 1 - 1.0000000000e+10 8.1577217310e+09 0.6500000000 -3.5557871014 -14.3318302438 1 - 1.0000000000e+10 9.0320107014e+09 0.6500000000 -4.0549949963 -13.8820225244 1 - 1.0000000000e+10 1.0000000000e+10 0.6500000000 -4.6204256792 -13.3808512952 1 - 1.0000000000e+06 4.0000000000e+09 0.7000000000 -4.4485209891 -13.1143251183 0 - 1.0000000000e+06 4.4286927156e+09 0.7000000000 -4.9835499142 -12.6117081124 1 - 1.0000000000e+06 4.9033297922e+09 0.7000000000 -5.5821660601 -12.0561394505 1 - 1.0000000000e+06 5.4288352332e+09 0.7000000000 -6.2518496554 -11.5720368075 1 - 1.0000000000e+06 6.0106607628e+09 0.7000000000 -7.0008334984 -11.2561651451 1 - 1.0000000000e+06 6.6548423840e+09 0.7000000000 -7.8361333603 -10.9067344717 1 - 1.0000000000e+06 7.3680629973e+09 0.7000000000 -8.7392243787 -10.5687792383 1 - 1.0000000000e+06 8.1577217310e+09 0.7000000000 -9.6021916703 -10.5229827098 1 - 1.0000000000e+06 9.0320107014e+09 0.7000000000 -10.5729938190 -11.2517560750 1 - 1.0000000000e+06 1.0000000000e+10 0.7000000000 -11.8235850796 -12.5558647574 1 - 1.0000000000e+07 4.0000000000e+09 0.7000000000 -3.6550369761 -13.8914003282 0 - 1.0000000000e+07 4.4286927156e+09 0.7000000000 -4.1049942046 -13.4694919130 1 - 1.0000000000e+07 4.9033297922e+09 0.7000000000 -4.6094232304 -12.9974776854 1 - 1.0000000000e+07 5.4288352332e+09 0.7000000000 -5.1748308102 -12.4725550651 1 - 1.0000000000e+07 6.0106607628e+09 0.7000000000 -5.8084870128 -11.9131933897 1 - 1.0000000000e+07 6.6548423840e+09 0.7000000000 -6.5184625267 -11.5626253210 1 - 1.0000000000e+07 7.3680629973e+09 0.7000000000 -7.3127774909 -11.2390485970 1 - 1.0000000000e+07 8.1577217310e+09 0.7000000000 -8.1901397748 -10.8966710259 1 - 1.0000000000e+07 9.0320107014e+09 0.7000000000 -9.0920672122 -10.6613615921 1 - 1.0000000000e+07 1.0000000000e+10 0.7000000000 -9.9582875767 -10.8797496537 1 - 1.0000000000e+08 4.0000000000e+09 0.7000000000 -2.8616533998 -14.6857719715 0 - 1.0000000000e+08 4.4286927156e+09 0.7000000000 -3.2265203806 -14.3452898486 1 - 1.0000000000e+08 4.9033297922e+09 0.7000000000 -3.6367434104 -13.9627369387 1 - 1.0000000000e+08 5.4288352332e+09 0.7000000000 -4.0978526310 -13.5335594957 1 - 1.0000000000e+08 6.0106607628e+09 0.7000000000 -4.6160423318 -13.0536842248 1 - 1.0000000000e+08 6.6548423840e+09 0.7000000000 -5.1982455454 -12.5235029605 1 - 1.0000000000e+08 7.3680629973e+09 0.7000000000 -5.8525289991 -11.9932157006 1 - 1.0000000000e+08 8.1577217310e+09 0.7000000000 -6.5865650606 -11.6818564067 1 - 1.0000000000e+08 9.0320107014e+09 0.7000000000 -7.4069463043 -11.3651455549 1 - 1.0000000000e+08 1.0000000000e+10 0.7000000000 -8.3014810042 -11.0535468230 1 - 1.0000000000e+09 4.0000000000e+09 0.7000000000 -2.0694628674 -15.5178474652 0 - 1.0000000000e+09 4.4286927156e+09 0.7000000000 -2.3491916894 -15.2587909978 1 - 1.0000000000e+09 4.9033297922e+09 0.7000000000 -2.6651630630 -14.9662311049 1 - 1.0000000000e+09 5.4288352332e+09 0.7000000000 -3.0219300320 -14.6361670520 1 - 1.0000000000e+09 6.0106607628e+09 0.7000000000 -3.4246053577 -14.2641972416 1 - 1.0000000000e+09 6.6548423840e+09 0.7000000000 -3.8789291126 -13.8461550124 1 - 1.0000000000e+09 7.3680629973e+09 0.7000000000 -4.3913430475 -13.3784836554 1 - 1.0000000000e+09 8.1577217310e+09 0.7000000000 -4.9690605512 -12.8619701183 1 - 1.0000000000e+09 9.0320107014e+09 0.7000000000 -5.6200778085 -12.3291976596 1 - 1.0000000000e+09 1.0000000000e+10 0.7000000000 -6.3527292745 -11.9889184561 1 - 1.0000000000e+10 4.0000000000e+09 0.7000000000 -1.2804483941 -16.4327248844 0 - 1.0000000000e+10 4.4286927156e+09 0.7000000000 -1.4749011906 -16.2550319759 1 - 1.0000000000e+10 4.9033297922e+09 0.7000000000 -1.6964869006 -16.0524804719 1 - 1.0000000000e+10 5.4288352332e+09 0.7000000000 -1.9487815730 -15.8219089869 1 - 1.0000000000e+10 6.0106607628e+09 0.7000000000 -2.2358162273 -15.5597016802 1 - 1.0000000000e+10 6.6548423840e+09 0.7000000000 -2.5621333174 -15.2621928113 1 - 1.0000000000e+10 7.3680629973e+09 0.7000000000 -2.9328500820 -14.9252211738 1 - 1.0000000000e+10 8.1577217310e+09 0.7000000000 -3.3537294917 -14.5447208945 1 - 1.0000000000e+10 9.0320107014e+09 0.7000000000 -3.8312578887 -14.1172251767 1 - 1.0000000000e+10 1.0000000000e+10 0.7000000000 -4.3727140958 -13.6413288908 1 -AMReX (23.07-395-ge6c93bf22695) finalized + 1.0000000000e+09 4.4286927156e+09 0.4000000000 -15.0933118588 -2.6671723127 1 + 1.0000000000e+09 4.9033297922e+09 0.4000000000 -14.7621490285 -3.0175641894 1 + 1.0000000000e+09 5.4288352332e+09 0.4000000000 -14.3892566633 -3.4124048303 1 + 1.0000000000e+09 6.0106607628e+09 0.4000000000 -13.9696329645 -3.8570452607 1 + 1.0000000000e+09 6.6548423840e+09 0.4000000000 -13.4990899024 -4.3569659385 1 + 1.0000000000e+09 7.3680629973e+09 0.4000000000 -12.9751097903 -4.9165783433 1 + 1.0000000000e+09 8.1577217310e+09 0.4000000000 -12.4029718543 -5.5362858494 1 + 1.0000000000e+09 9.0320107014e+09 0.4000000000 -11.8075831340 -6.2097753499 1 + 1.0000000000e+09 1.0000000000e+10 0.4000000000 -11.2833005757 -6.9502991890 1 + 1.0000000000e+10 4.0000000000e+09 0.4000000000 -16.2582552424 -1.5626567049 0 + 1.0000000000e+10 4.4286927156e+09 0.4000000000 -16.0486695196 -1.7884208146 1 + 1.0000000000e+10 4.9033297922e+09 0.4000000000 -15.8108280439 -2.0446360339 1 + 1.0000000000e+10 5.4288352332e+09 0.4000000000 -15.5412395159 -2.3352407251 1 + 1.0000000000e+10 6.0106607628e+09 0.4000000000 -15.2357440912 -2.6646601015 1 + 1.0000000000e+10 6.6548423840e+09 0.4000000000 -14.8903553070 -3.0378300279 1 + 1.0000000000e+10 7.3680629973e+09 0.4000000000 -14.5003230284 -3.4601447158 1 + 1.0000000000e+10 8.1577217310e+09 0.4000000000 -14.0614573455 -3.9371815118 1 + 1.0000000000e+10 9.0320107014e+09 0.4000000000 -13.5711738956 -4.4739423061 1 + 1.0000000000e+10 1.0000000000e+10 0.4000000000 -13.0312228621 -5.0733622012 1 + 1.0000000000e+06 4.0000000000e+09 0.4500000000 -12.6199619882 -5.0493824492 0 + 1.0000000000e+06 4.4286927156e+09 0.4500000000 -12.0411567544 -5.6445833881 1 + 1.0000000000e+06 4.9033297922e+09 0.4500000000 -11.4232232546 -6.2868541638 1 + 1.0000000000e+06 5.4288352332e+09 0.4500000000 -10.8518135789 -6.9298795402 1 + 1.0000000000e+06 6.0106607628e+09 0.4500000000 -10.4348297049 -7.7172920610 1 + 1.0000000000e+06 6.6548423840e+09 0.4500000000 -10.0424249574 -8.5877937253 1 + 1.0000000000e+06 7.3680629973e+09 0.4500000000 -9.8849653906 -9.3214540023 1 + 1.0000000000e+06 8.1577217310e+09 0.4500000000 -10.1350525691 -9.9053582092 1 + 1.0000000000e+06 9.0320107014e+09 0.4500000000 -10.9317596586 -10.7720005416 1 + 1.0000000000e+06 1.0000000000e+10 0.4500000000 -12.2046515153 -12.0333675716 1 + 1.0000000000e+07 4.0000000000e+09 0.4500000000 -13.4182964630 -4.2562147910 0 + 1.0000000000e+07 4.4286927156e+09 0.4500000000 -12.9196143636 -4.7702514625 1 + 1.0000000000e+07 4.9033297922e+09 0.4500000000 -12.3646713416 -5.3431229151 1 + 1.0000000000e+07 5.4288352332e+09 0.4500000000 -11.7607991622 -5.9706925457 1 + 1.0000000000e+07 6.0106607628e+09 0.4500000000 -11.1530047519 -6.6222738557 1 + 1.0000000000e+07 6.6548423840e+09 0.4500000000 -10.6534176006 -7.3144511945 1 + 1.0000000000e+07 7.3680629973e+09 0.4500000000 -10.2538965760 -8.1710984842 1 + 1.0000000000e+07 8.1577217310e+09 0.4500000000 -9.9754563098 -8.9846245478 1 + 1.0000000000e+07 9.0320107014e+09 0.4500000000 -10.0361948008 -9.6116151464 1 + 1.0000000000e+07 1.0000000000e+10 0.4500000000 -10.4770374370 -10.2529619738 1 + 1.0000000000e+08 4.0000000000e+09 0.4500000000 -14.2257599781 -3.4625787929 0 + 1.0000000000e+08 4.4286927156e+09 0.4500000000 -13.8113629028 -3.8919431463 1 + 1.0000000000e+08 4.9033297922e+09 0.4500000000 -13.3469606757 -4.3733520313 1 + 1.0000000000e+08 5.4288352332e+09 0.4500000000 -12.8281609635 -4.9118956632 1 + 1.0000000000e+08 6.0106607628e+09 0.4500000000 -12.2549868876 -5.5090642377 1 + 1.0000000000e+08 6.6548423840e+09 0.4500000000 -11.6452720540 -6.1532052811 1 + 1.0000000000e+08 7.3680629973e+09 0.4500000000 -11.0519682942 -6.8137717934 1 + 1.0000000000e+08 8.1577217310e+09 0.4500000000 -10.5745250527 -7.5537012214 1 + 1.0000000000e+08 9.0320107014e+09 0.4500000000 -10.2098734359 -8.4106723339 1 + 1.0000000000e+08 1.0000000000e+10 0.4500000000 -10.0528603240 -9.1577967123 1 + 1.0000000000e+09 4.0000000000e+09 0.4500000000 -15.0536228397 -2.6688948470 0 + 1.0000000000e+09 4.4286927156e+09 0.4500000000 -14.7237134075 -3.0132309281 1 + 1.0000000000e+09 4.9033297922e+09 0.4500000000 -14.3526160907 -3.4007197531 1 + 1.0000000000e+09 5.4288352332e+09 0.4500000000 -13.9355878021 -3.8365577153 1 + 1.0000000000e+09 6.0106607628e+09 0.4500000000 -13.4675884154 -4.3261358021 1 + 1.0000000000e+09 6.6548423840e+09 0.4500000000 -12.9456631769 -4.8738173937 1 + 1.0000000000e+09 7.3680629973e+09 0.4500000000 -12.3724824027 -5.4792910380 1 + 1.0000000000e+09 8.1577217310e+09 0.4500000000 -11.7661786775 -6.1311738817 1 + 1.0000000000e+09 9.0320107014e+09 0.4500000000 -11.1669148875 -6.8085299247 1 + 1.0000000000e+09 1.0000000000e+10 0.4500000000 -10.6514166226 -7.5351746507 1 + 1.0000000000e+10 4.0000000000e+09 0.4500000000 -15.9281437071 -1.8752022471 0 + 1.0000000000e+10 4.4286927156e+09 0.4500000000 -15.6824809806 -2.1344670468 1 + 1.0000000000e+10 4.9033297922e+09 0.4500000000 -15.4047001663 -2.4277705612 1 + 1.0000000000e+10 5.4288352332e+09 0.4500000000 -15.0909187931 -2.7594143654 1 + 1.0000000000e+10 6.0106607628e+09 0.4500000000 -14.7366089802 -3.1341695123 1 + 1.0000000000e+10 6.6548423840e+09 0.4500000000 -14.3375645420 -3.5571892970 1 + 1.0000000000e+10 7.3680629973e+09 0.4500000000 -13.8893254086 -4.0336353982 1 + 1.0000000000e+10 8.1577217310e+09 0.4500000000 -13.3893298655 -4.5676574853 1 + 1.0000000000e+10 9.0320107014e+09 0.4500000000 -12.8393736234 -5.1603429531 1 + 1.0000000000e+10 1.0000000000e+10 0.4500000000 -12.2492265137 -5.8073288375 1 + 1.0000000000e+06 4.0000000000e+09 0.5000000000 -8.0664194354 -9.4890393815 0 + 1.0000000000e+06 4.4286927156e+09 0.5000000000 -8.2111046670 -9.3757376097 1 + 1.0000000000e+06 4.9033297922e+09 0.5000000000 -8.3918234083 -9.2344738095 1 + 1.0000000000e+06 5.4288352332e+09 0.5000000000 -8.7772909062 -8.9448205348 1 + 1.0000000000e+06 6.0106607628e+09 0.5000000000 -9.0636971271 -9.0647301302 1 + 1.0000000000e+06 6.6548423840e+09 0.5000000000 -9.3058452726 -9.3069927949 1 + 1.0000000000e+06 7.3680629973e+09 0.5000000000 -9.5983657200 -9.5996435483 1 + 1.0000000000e+06 8.1577217310e+09 0.5000000000 -10.0168321560 -10.0182538936 1 + 1.0000000000e+06 9.0320107014e+09 0.5000000000 -10.8474057609 -10.8489864867 1 + 1.0000000000e+06 1.0000000000e+10 0.5000000000 -12.1138078856 -12.1155643114 1 + 1.0000000000e+07 4.0000000000e+09 0.5000000000 -7.8838825215 -9.6537090536 0 + 1.0000000000e+07 4.4286927156e+09 0.5000000000 -8.0018897889 -9.5630616368 1 + 1.0000000000e+07 4.9033297922e+09 0.5000000000 -8.1353862644 -9.4610110058 1 + 1.0000000000e+07 5.4288352332e+09 0.5000000000 -8.2961790243 -9.3385091392 1 + 1.0000000000e+07 6.0106607628e+09 0.5000000000 -8.5443481247 -9.1484241687 1 + 1.0000000000e+07 6.6548423840e+09 0.5000000000 -8.9669746383 -8.9715401000 1 + 1.0000000000e+07 7.3680629973e+09 0.5000000000 -9.2004551976 -9.2016374220 1 + 1.0000000000e+07 8.1577217310e+09 0.5000000000 -9.4726511197 -9.4739817205 1 + 1.0000000000e+07 9.0320107014e+09 0.5000000000 -9.8195004568 -9.8209945474 1 + 1.0000000000e+07 1.0000000000e+10 0.5000000000 -10.3608512486 -10.3625253205 1 + 1.0000000000e+08 4.0000000000e+09 0.5000000000 -7.7564783284 -9.7786310606 0 + 1.0000000000e+08 4.4286927156e+09 0.5000000000 -7.8492582957 -9.7096153678 1 + 1.0000000000e+08 4.9033297922e+09 0.5000000000 -7.9528574806 -9.6329691536 1 + 1.0000000000e+08 5.4288352332e+09 0.5000000000 -8.0693126926 -9.5475431816 1 + 1.0000000000e+08 6.0106607628e+09 0.5000000000 -8.2064635264 -9.4472744455 1 + 1.0000000000e+08 6.6548423840e+09 0.5000000000 -8.3859624449 -9.3159632798 1 + 1.0000000000e+08 7.3680629973e+09 0.5000000000 -8.6892137197 -9.0970157579 1 + 1.0000000000e+08 8.1577217310e+09 0.5000000000 -9.0475146736 -9.0502773705 1 + 1.0000000000e+08 9.0320107014e+09 0.5000000000 -9.2986738307 -9.2998953589 1 + 1.0000000000e+08 1.0000000000e+10 0.5000000000 -9.5981915843 -9.5996058564 1 + 1.0000000000e+09 4.0000000000e+09 0.5000000000 -7.7470944343 -9.8201166535 0 + 1.0000000000e+09 4.4286927156e+09 0.5000000000 -7.8148151276 -9.7724887691 1 + 1.0000000000e+09 4.9033297922e+09 0.5000000000 -7.8900133105 -9.7200543142 1 + 1.0000000000e+09 5.4288352332e+09 0.5000000000 -7.9730314841 -9.6630087712 1 + 1.0000000000e+09 6.0106607628e+09 0.5000000000 -8.0660308619 -9.5998690277 1 + 1.0000000000e+09 6.6548423840e+09 0.5000000000 -8.1711502365 -9.5299746078 1 + 1.0000000000e+09 7.3680629973e+09 0.5000000000 -8.2981193470 -9.4461659460 1 + 1.0000000000e+09 8.1577217310e+09 0.5000000000 -8.4688942226 -9.3329031919 1 + 1.0000000000e+09 9.0320107014e+09 0.5000000000 -8.7322319942 -9.1628388393 1 + 1.0000000000e+09 1.0000000000e+10 0.5000000000 -9.0635018458 -9.0827468205 1 + 1.0000000000e+10 4.0000000000e+09 0.5000000000 -7.9880361426 -9.6879018121 1 + 1.0000000000e+10 4.4286927156e+09 0.5000000000 -8.0302837106 -9.6618767633 1 + 1.0000000000e+10 4.9033297922e+09 0.5000000000 -8.0763904321 -9.6342068332 1 + 1.0000000000e+10 5.4288352332e+09 0.5000000000 -8.1258757774 -9.6057820019 1 + 1.0000000000e+10 6.0106607628e+09 0.5000000000 -8.1795463024 -9.5762054669 1 + 1.0000000000e+10 6.6548423840e+09 0.5000000000 -8.2365564026 -9.5471909647 1 + 1.0000000000e+10 7.3680629973e+09 0.5000000000 -8.2989177606 -9.5176692137 1 + 1.0000000000e+10 8.1577217310e+09 0.5000000000 -8.3696249312 -9.4863119797 1 + 1.0000000000e+10 9.0320107014e+09 0.5000000000 -8.4560400376 -9.4486905350 1 + 1.0000000000e+10 1.0000000000e+10 0.5000000000 -8.5725042842 -9.3959527205 1 + 1.0000000000e+06 4.0000000000e+09 0.5500000000 -4.9263369035 -12.6307046567 0 + 1.0000000000e+06 4.4286927156e+09 0.5500000000 -5.5125794078 -12.0760158044 1 + 1.0000000000e+06 4.9033297922e+09 0.5500000000 -6.1678880195 -11.4605459733 1 + 1.0000000000e+06 5.4288352332e+09 0.5500000000 -6.9002340024 -10.8361713231 1 + 1.0000000000e+06 6.0106607628e+09 0.5500000000 -7.7162632259 -10.4358694538 1 + 1.0000000000e+06 6.6548423840e+09 0.5500000000 -8.5866490983 -10.0435826768 1 + 1.0000000000e+06 7.3680629973e+09 0.5500000000 -9.3201805492 -9.8862508729 1 + 1.0000000000e+06 8.1577217310e+09 0.5500000000 -9.9039408495 -10.1364796930 1 + 1.0000000000e+06 9.0320107014e+09 0.5500000000 -10.7704221565 -10.9333429140 1 + 1.0000000000e+06 1.0000000000e+10 0.5500000000 -12.0316130148 -12.2064099076 1 + 1.0000000000e+07 4.0000000000e+09 0.5500000000 -4.1327873451 -13.4067898896 0 + 1.0000000000e+07 4.4286927156e+09 0.5500000000 -4.6339615895 -12.9331082034 1 + 1.0000000000e+07 4.9033297922e+09 0.5500000000 -5.1950956687 -12.4035746041 1 + 1.0000000000e+07 5.4288352332e+09 0.5500000000 -5.8232748773 -11.8138715673 1 + 1.0000000000e+07 6.0106607628e+09 0.5500000000 -6.5262585311 -11.1696968936 1 + 1.0000000000e+07 6.6548423840e+09 0.5500000000 -7.3117723591 -10.6534502323 1 + 1.0000000000e+07 7.3680629973e+09 0.5500000000 -8.1699241087 -10.2551099463 1 + 1.0000000000e+07 8.1577217310e+09 0.5500000000 -8.9833050294 -9.9768125421 1 + 1.0000000000e+07 9.0320107014e+09 0.5500000000 -9.6101346160 -10.0377081495 1 + 1.0000000000e+07 1.0000000000e+10 0.5500000000 -10.2512990136 -10.4787244918 1 + 1.0000000000e+08 4.0000000000e+09 0.5500000000 -3.3395295007 -14.1985085219 0 + 1.0000000000e+08 4.4286927156e+09 0.5500000000 -3.7556211435 -13.8063032478 1 + 1.0000000000e+08 4.9033297922e+09 0.5500000000 -4.2225575794 -13.3664559653 1 + 1.0000000000e+08 5.4288352332e+09 0.5500000000 -4.7464569494 -12.8737301627 1 + 1.0000000000e+08 6.0106607628e+09 0.5500000000 -5.3341586613 -12.3230169469 1 + 1.0000000000e+08 6.6548423840e+09 0.5500000000 -5.9932141535 -11.7120144662 1 + 1.0000000000e+08 7.3680629973e+09 0.5500000000 -6.7312739156 -11.0587794004 1 + 1.0000000000e+08 8.1577217310e+09 0.5500000000 -7.5517647875 -10.5751303759 1 + 1.0000000000e+08 9.0320107014e+09 0.5500000000 -8.4094768040 -10.2111789283 1 + 1.0000000000e+08 1.0000000000e+10 0.5500000000 -9.1564178754 -10.0543419536 1 + 1.0000000000e+09 4.0000000000e+09 0.5500000000 -2.5471797995 -15.0250730353 0 + 1.0000000000e+09 4.4286927156e+09 0.5500000000 -2.8781461534 -14.7143116038 1 + 1.0000000000e+09 4.9033297922e+09 0.5500000000 -3.2508437389 -14.3645024308 1 + 1.0000000000e+09 5.4288352332e+09 0.5500000000 -3.6704138417 -13.9710418050 1 + 1.0000000000e+09 6.0106607628e+09 0.5500000000 -4.1426204134 -13.5288354140 1 + 1.0000000000e+09 6.6548423840e+09 0.5500000000 -4.6739224526 -13.0328615008 1 + 1.0000000000e+09 7.3680629973e+09 0.5500000000 -5.2715267295 -12.4783156933 1 + 1.0000000000e+09 8.1577217310e+09 0.5500000000 -5.9431603152 -11.8633393484 1 + 1.0000000000e+09 9.0320107014e+09 0.5500000000 -6.6951903623 -11.2024350566 1 + 1.0000000000e+09 1.0000000000e+10 0.5500000000 -7.5250446792 -10.6480296449 1 + 1.0000000000e+10 4.0000000000e+09 0.5500000000 -1.7576144396 -15.9280217909 1 + 1.0000000000e+10 4.4286927156e+09 0.5500000000 -2.0033314082 -15.6986279517 1 + 1.0000000000e+10 4.9033297922e+09 0.5500000000 -2.2816705223 -15.4388374567 1 + 1.0000000000e+10 5.4288352332e+09 0.5500000000 -2.5967959027 -15.1448960799 1 + 1.0000000000e+10 6.0106607628e+09 0.5500000000 -2.9533897196 -14.8125306367 1 + 1.0000000000e+10 6.6548423840e+09 0.5500000000 -3.3567153951 -14.4373412142 1 + 1.0000000000e+10 7.3680629973e+09 0.5500000000 -3.8126881350 -14.0143346733 1 + 1.0000000000e+10 8.1577217310e+09 0.5500000000 -4.3279498369 -13.5384648003 1 + 1.0000000000e+10 9.0320107014e+09 0.5500000000 -4.9099077591 -13.0050412453 1 + 1.0000000000e+10 1.0000000000e+10 0.5500000000 -5.5664079579 -12.4111302237 1 + 1.0000000000e+06 4.0000000000e+09 0.6000000000 -4.6874165138 -12.8713534471 0 + 1.0000000000e+06 4.4286927156e+09 0.6000000000 -5.2480529163 -12.3425069636 1 + 1.0000000000e+06 4.9033297922e+09 0.6000000000 -5.8750189170 -11.7561777822 1 + 1.0000000000e+06 5.4288352332e+09 0.6000000000 -6.5760720464 -11.1834054668 1 + 1.0000000000e+06 6.0106607628e+09 0.6000000000 -7.3593255585 -10.8231744084 1 + 1.0000000000e+06 6.6548423840e+09 0.6000000000 -8.2240941596 -10.4375089980 1 + 1.0000000000e+06 7.3680629973e+09 0.6000000000 -9.0836917067 -10.1457704344 1 + 1.0000000000e+06 8.1577217310e+09 0.6000000000 -9.7969116846 -10.2597064355 1 + 1.0000000000e+06 9.0320107014e+09 0.6000000000 -10.6995852342 -11.0267695004 1 + 1.0000000000e+06 1.0000000000e+10 0.6000000000 -11.9565611188 -12.3079449877 1 + 1.0000000000e+07 4.0000000000e+09 0.6000000000 -3.8938729829 -13.6478070662 0 + 1.0000000000e+07 4.4286927156e+09 0.6000000000 -4.3694406419 -13.1998899866 1 + 1.0000000000e+07 4.9033297922e+09 0.6000000000 -4.9022241247 -12.6989326129 1 + 1.0000000000e+07 5.4288352332e+09 0.6000000000 -5.4990224481 -12.1411327078 1 + 1.0000000000e+07 6.0106607628e+09 0.6000000000 -6.1674007417 -11.5348079253 1 + 1.0000000000e+07 6.6548423840e+09 0.6000000000 -6.9155791417 -11.0832126364 1 + 1.0000000000e+07 7.3680629973e+09 0.6000000000 -7.7481347730 -10.7130540280 1 + 1.0000000000e+07 8.1577217310e+09 0.6000000000 -8.6298769859 -10.3622929168 1 + 1.0000000000e+07 9.0320107014e+09 0.6000000000 -9.4167978029 -10.2526624488 1 + 1.0000000000e+07 1.0000000000e+10 0.6000000000 -10.1478611795 -10.6024621642 1 + 1.0000000000e+08 4.0000000000e+09 0.6000000000 -3.1006340152 -14.4403947671 0 + 1.0000000000e+08 4.4286927156e+09 0.6000000000 -3.4911181626 -14.0739382686 1 + 1.0000000000e+08 4.9033297922e+09 0.6000000000 -3.9297028770 -13.6626066662 1 + 1.0000000000e+08 5.4288352332e+09 0.6000000000 -4.4222123883 -13.2014814753 1 + 1.0000000000e+08 6.0106607628e+09 0.6000000000 -4.9751654635 -12.6858717662 1 + 1.0000000000e+08 6.6548423840e+09 0.6000000000 -5.5958360589 -12.1142361002 1 + 1.0000000000e+08 7.3680629973e+09 0.6000000000 -6.2921951408 -11.5102059086 1 + 1.0000000000e+08 8.1577217310e+09 0.6000000000 -7.0718360681 -11.0958538127 1 + 1.0000000000e+08 9.0320107014e+09 0.6000000000 -7.9295315244 -10.7329004795 1 + 1.0000000000e+08 1.0000000000e+10 0.6000000000 -8.7971964340 -10.4475908920 1 + 1.0000000000e+09 4.0000000000e+09 0.6000000000 -2.3083427797 -15.2688913657 0 + 1.0000000000e+09 4.4286927156e+09 0.6000000000 -2.6136989393 -14.9838710003 1 + 1.0000000000e+09 4.9033297922e+09 0.6000000000 -2.9580422061 -14.6625625008 1 + 1.0000000000e+09 5.4288352332e+09 0.6000000000 -3.3462197500 -14.3006599290 1 + 1.0000000000e+09 6.0106607628e+09 0.6000000000 -3.7836699672 -13.8934047622 1 + 1.0000000000e+09 6.6548423840e+09 0.6000000000 -4.2764930786 -13.4361677469 1 + 1.0000000000e+09 7.3680629973e+09 0.6000000000 -4.8315236918 -12.9246340459 1 + 1.0000000000e+09 8.1577217310e+09 0.6000000000 -5.4563463669 -12.3575652127 1 + 1.0000000000e+09 9.0320107014e+09 0.6000000000 -6.1589448250 -11.7514500907 1 + 1.0000000000e+09 1.0000000000e+10 0.6000000000 -6.9457107700 -11.2744549299 1 + 1.0000000000e+10 4.0000000000e+09 0.6000000000 -1.5189550687 -16.1760474376 0 + 1.0000000000e+10 4.4286927156e+09 0.6000000000 -1.7390541688 -15.9723914831 1 + 1.0000000000e+10 4.9033297922e+09 0.6000000000 -1.9890315435 -15.7410961693 1 + 1.0000000000e+10 5.4288352332e+09 0.6000000000 -2.2727571929 -15.4787024815 1 + 1.0000000000e+10 6.0106607628e+09 0.6000000000 -2.5945876455 -15.1812641094 1 + 1.0000000000e+10 6.6548423840e+09 0.6000000000 -2.9594257944 -14.8447444844 1 + 1.0000000000e+10 7.3680629973e+09 0.6000000000 -3.3727879321 -14.4645568357 1 + 1.0000000000e+10 8.1577217310e+09 0.6000000000 -3.8408780345 -14.0361164439 1 + 1.0000000000e+10 9.0320107014e+09 0.6000000000 -4.3706608771 -13.5552459151 1 + 1.0000000000e+10 1.0000000000e+10 0.6000000000 -4.9698583638 -13.0193464360 1 + 1.0000000000e+06 4.0000000000e+09 0.6500000000 -4.5476580932 -13.0130256076 0 + 1.0000000000e+06 4.4286927156e+09 0.6500000000 -5.0933157554 -12.4994381879 1 + 1.0000000000e+06 4.9033297922e+09 0.6500000000 -5.7036990969 -11.9307186936 1 + 1.0000000000e+06 5.4288352332e+09 0.6500000000 -6.3864064622 -11.4022027916 1 + 1.0000000000e+06 6.0106607628e+09 0.6500000000 -7.1496914530 -11.0673499344 1 + 1.0000000000e+06 6.6548423840e+09 0.6500000000 -7.9986226626 -10.7004084995 1 + 1.0000000000e+06 7.3680629973e+09 0.6500000000 -8.8932097425 -10.3705250415 1 + 1.0000000000e+06 8.1577217310e+09 0.6500000000 -9.6962265139 -10.3881460503 1 + 1.0000000000e+06 9.0320107014e+09 0.6500000000 -10.6339946188 -11.1316988308 1 + 1.0000000000e+06 1.0000000000e+10 0.6500000000 -11.8875095425 -12.4230319679 1 + 1.0000000000e+07 4.0000000000e+09 0.6500000000 -3.7541203442 -13.7898249789 0 + 1.0000000000e+07 4.4286927156e+09 0.6500000000 -4.2147089469 -13.3570697965 1 + 1.0000000000e+07 4.9033297922e+09 0.6500000000 -4.7309081311 -12.8729632474 1 + 1.0000000000e+07 5.4288352332e+09 0.6500000000 -5.3093462612 -12.3341734101 1 + 1.0000000000e+07 6.0106607628e+09 0.6500000000 -5.9574209643 -11.7528786941 1 + 1.0000000000e+07 6.6548423840e+09 0.6500000000 -6.6832983524 -11.3537044311 1 + 1.0000000000e+07 7.3680629973e+09 0.6500000000 -7.4941774420 -11.0089926944 1 + 1.0000000000e+07 8.1577217310e+09 0.6500000000 -8.3792738800 -10.6556306767 1 + 1.0000000000e+07 9.0320107014e+09 0.6500000000 -9.2440179618 -10.4606562951 1 + 1.0000000000e+07 1.0000000000e+10 0.6500000000 -10.0502406180 -10.7352829937 1 + 1.0000000000e+08 4.0000000000e+09 0.6500000000 -2.9608994723 -14.5832351693 0 + 1.0000000000e+08 4.4286927156e+09 0.6500000000 -3.3364036964 -14.2319225764 1 + 1.0000000000e+08 4.9033297922e+09 0.6500000000 -3.7584032382 -13.8373671291 1 + 1.0000000000e+08 5.4288352332e+09 0.6500000000 -4.2325503160 -13.3948530013 1 + 1.0000000000e+08 6.0106607628e+09 0.6500000000 -4.7651740951 -12.9000045811 1 + 1.0000000000e+08 6.6548423840e+09 0.6500000000 -5.3633523384 -12.3521350793 1 + 1.0000000000e+08 7.3680629973e+09 0.6500000000 -6.0349472150 -11.7846818528 1 + 1.0000000000e+08 8.1577217310e+09 0.6500000000 -6.7881653086 -11.4262642633 1 + 1.0000000000e+08 9.0320107014e+09 0.6500000000 -7.6263287309 -11.0865976478 1 + 1.0000000000e+08 1.0000000000e+10 0.6500000000 -8.5198307182 -10.7737584967 1 + 1.0000000000e+09 4.0000000000e+09 0.6500000000 -2.1686642542 -15.4135601959 0 + 1.0000000000e+09 4.4286927156e+09 0.6500000000 -2.4590379093 -15.1436760063 1 + 1.0000000000e+09 4.9033297922e+09 0.6500000000 -2.7867935242 -14.8391271318 1 + 1.0000000000e+09 5.4288352332e+09 0.6500000000 -3.1566062187 -14.4957844807 1 + 1.0000000000e+09 6.0106607628e+09 0.6500000000 -3.5737239146 -14.1090934401 1 + 1.0000000000e+09 6.6548423840e+09 0.6500000000 -4.0440362374 -13.6746794679 1 + 1.0000000000e+09 7.3680629973e+09 0.6500000000 -4.5741490489 -13.1886122154 1 + 1.0000000000e+09 8.1577217310e+09 0.6500000000 -5.1714414325 -12.6505348485 1 + 1.0000000000e+09 9.0320107014e+09 0.6500000000 -5.8439871511 -12.0827672096 1 + 1.0000000000e+09 1.0000000000e+10 0.6500000000 -6.5997012945 -11.6763905107 1 + 1.0000000000e+10 4.0000000000e+09 0.6500000000 -1.3794466033 -16.3246961572 0 + 1.0000000000e+10 4.4286927156e+09 0.6500000000 -1.5845558746 -16.1361734166 1 + 1.0000000000e+10 4.9033297922e+09 0.6500000000 -1.8179385128 -15.9216322620 1 + 1.0000000000e+10 5.4288352332e+09 0.6500000000 -2.0832924664 -15.6777872875 1 + 1.0000000000e+10 6.0106607628e+09 0.6500000000 -2.3847837732 -15.4008846806 1 + 1.0000000000e+10 6.6548423840e+09 0.6500000000 -2.7271044222 -15.0871030464 1 + 1.0000000000e+10 7.3680629973e+09 0.6500000000 -3.1155372402 -14.7321000031 1 + 1.0000000000e+10 8.1577217310e+09 0.6500000000 -3.5560283588 -14.3315813824 1 + 1.0000000000e+10 9.0320107014e+09 0.6500000000 -4.0552644947 -13.8817455175 1 + 1.0000000000e+10 1.0000000000e+10 0.6500000000 -4.6207246098 -13.3805467847 1 + 1.0000000000e+06 4.0000000000e+09 0.7000000000 -4.4484985951 -13.1143475495 0 + 1.0000000000e+06 4.4286927156e+09 0.7000000000 -4.9835286255 -12.6117296860 1 + 1.0000000000e+06 4.9033297922e+09 0.7000000000 -5.5821458226 -12.0561621904 1 + 1.0000000000e+06 5.4288352332e+09 0.7000000000 -6.2518304171 -11.5720026737 1 + 1.0000000000e+06 6.0106607628e+09 0.7000000000 -7.0008152024 -11.2561319512 1 + 1.0000000000e+06 6.6548423840e+09 0.7000000000 -7.8361158291 -10.9067031322 1 + 1.0000000000e+06 7.3680629973e+09 0.7000000000 -8.7392063208 -10.5687519073 1 + 1.0000000000e+06 8.1577217310e+09 0.7000000000 -9.6021715722 -10.5229664649 1 + 1.0000000000e+06 9.0320107014e+09 0.7000000000 -10.5729780670 -11.2517541081 1 + 1.0000000000e+06 1.0000000000e+10 0.7000000000 -11.8235708727 -12.5558647155 1 + 1.0000000000e+07 4.0000000000e+09 0.7000000000 -3.6549664086 -13.8914709006 0 + 1.0000000000e+07 4.4286927156e+09 0.7000000000 -4.1049270968 -13.4695590574 1 + 1.0000000000e+07 4.9033297922e+09 0.7000000000 -4.6093594165 -12.9975417362 1 + 1.0000000000e+07 5.4288352332e+09 0.7000000000 -5.1747701322 -12.4726172619 1 + 1.0000000000e+07 6.0106607628e+09 0.7000000000 -5.8084293227 -11.9132714976 1 + 1.0000000000e+07 6.6548423840e+09 0.7000000000 -6.5184076951 -11.5627682932 1 + 1.0000000000e+07 7.3680629973e+09 0.7000000000 -7.3127256426 -11.2391950016 1 + 1.0000000000e+07 8.1577217310e+09 0.7000000000 -8.1900933044 -10.8968169016 1 + 1.0000000000e+07 9.0320107014e+09 0.7000000000 -9.0920365426 -10.6614850215 1 + 1.0000000000e+07 1.0000000000e+10 0.7000000000 -9.9582648682 -10.8798139159 1 + 1.0000000000e+08 4.0000000000e+09 0.7000000000 -2.8617629403 -14.6856624315 0 + 1.0000000000e+08 4.4286927156e+09 0.7000000000 -3.2266384172 -14.3451718155 1 + 1.0000000000e+08 4.9033297922e+09 0.7000000000 -3.6368702837 -13.9626100890 1 + 1.0000000000e+08 5.4288352332e+09 0.7000000000 -4.0979886993 -13.5334235631 1 + 1.0000000000e+08 6.0106607628e+09 0.7000000000 -4.6161879732 -13.0535392989 1 + 1.0000000000e+08 6.6548423840e+09 0.7000000000 -5.1984011582 -12.5233515125 1 + 1.0000000000e+08 7.3680629973e+09 0.7000000000 -5.8523647926 -11.9934421813 1 + 1.0000000000e+08 8.1577217310e+09 0.7000000000 -6.5864090547 -11.6821331659 1 + 1.0000000000e+08 9.0320107014e+09 0.7000000000 -7.4067994755 -11.3654235744 1 + 1.0000000000e+08 1.0000000000e+10 0.7000000000 -8.3013506853 -11.0538132814 1 + 1.0000000000e+09 4.0000000000e+09 0.7000000000 -2.0695815696 -15.5177250154 0 + 1.0000000000e+09 4.4286927156e+09 0.7000000000 -2.3493240008 -15.2586547889 1 + 1.0000000000e+09 4.9033297922e+09 0.7000000000 -2.6653095613 -14.9660806276 1 + 1.0000000000e+09 5.4288352332e+09 0.7000000000 -3.0220912983 -14.6360018221 1 + 1.0000000000e+09 6.0106607628e+09 0.7000000000 -3.4247819832 -14.2640168398 1 + 1.0000000000e+09 6.6548423840e+09 0.7000000000 -3.8791217034 -13.8459596123 1 + 1.0000000000e+09 7.3680629973e+09 0.7000000000 -4.3915522296 -13.3782729765 1 + 1.0000000000e+09 8.1577217310e+09 0.7000000000 -4.9692869712 -12.8617482228 1 + 1.0000000000e+09 9.0320107014e+09 0.7000000000 -5.6203221431 -12.3289938297 1 + 1.0000000000e+09 1.0000000000e+10 0.7000000000 -6.3529920884 -11.9887960558 1 + 1.0000000000e+10 4.0000000000e+09 0.7000000000 -1.2805272580 -16.4326417920 0 + 1.0000000000e+10 4.4286927156e+09 0.7000000000 -1.4749982900 -16.2549301551 1 + 1.0000000000e+10 4.9033297922e+09 0.7000000000 -1.6966040866 -16.0523580418 1 + 1.0000000000e+10 5.4288352332e+09 0.7000000000 -1.9489205221 -15.8217642481 1 + 1.0000000000e+10 6.0106607628e+09 0.7000000000 -2.2359784782 -15.5595330834 1 + 1.0000000000e+10 6.6548423840e+09 0.7000000000 -2.5623203021 -15.2619989382 1 + 1.0000000000e+10 7.3680629973e+09 0.7000000000 -2.9330631536 -14.9250007236 1 + 1.0000000000e+10 8.1577217310e+09 0.7000000000 -3.3539699474 -14.5444727373 1 + 1.0000000000e+10 9.0320107014e+09 0.7000000000 -3.8315269899 -14.1169483246 1 + 1.0000000000e+10 1.0000000000e+10 0.7000000000 -4.3730130767 -13.6410243937 1 +AMReX (23.07-445-gc09c45c31007) finalized diff --git a/util/approx_math/approx_math.H b/util/approx_math/approx_math.H index 9f4a6a4835..97fa6b43b3 100644 --- a/util/approx_math/approx_math.H +++ b/util/approx_math/approx_math.H @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -38,6 +39,19 @@ amrex::Real fast_atan_1(const amrex::Real x) { constexpr amrex::Real A = 0.0776509570923569_rt; constexpr amrex::Real B = -0.287434475393028_rt; constexpr amrex::Real C = GCEM_PI / 4.0_rt - A - B; + constexpr amrex::Real third = 1.0_rt / 3.0_rt; + + /// + /// If x < 0.378, then using arctan(x) ~ x - x^3/3 + x^5/5 + /// gives better answer than the approximation below. + /// And accuracy increase as x << 0.378. + /// + + if (std::abs(x) < 0.378_rt) { + // return -0.3333333333_rt*amrex::Math::powi<3>(x) + x; + amrex::Real x2 = x*x; + return ((0.2_rt*x2 - third)*x2 + 1.0_rt)*x; + } amrex::Real x2 = x*x; return ((A*x2 + B)*x2 + C)*x; @@ -52,17 +66,6 @@ amrex::Real fast_atan(const amrex::Real x) { constexpr amrex::Real PI_2 = 0.5_rt * GCEM_PI; - /// - /// If x < 0.113, then using arctan(x) ~ x - /// gives better answer than the approximation below. - /// And accuracy increase as x << 0.113. - /// Also significantly faster. - /// - - if (std::abs(x) < 0.113_rt) { - return x; - } - // Check for large number, close to infinity. // Error is ~1e-8 rad by not checking actual inf From 8fd0d4aed4b7934a3a704fe938614685df988305 Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Mon, 15 Jul 2024 17:13:08 -0400 Subject: [PATCH 10/33] rework the unit test docs (#1570) We split the current page into 3 separate pages and add descriptions for all of the unit tests --- sphinx_docs/source/comprehensive_tests.rst | 119 +++++++++ sphinx_docs/source/index.rst | 11 +- sphinx_docs/source/one_zone_tests.rst | 103 ++++++++ sphinx_docs/source/unit_tests.rst | 280 ++++++++------------- 4 files changed, 332 insertions(+), 181 deletions(-) create mode 100644 sphinx_docs/source/comprehensive_tests.rst create mode 100644 sphinx_docs/source/one_zone_tests.rst diff --git a/sphinx_docs/source/comprehensive_tests.rst b/sphinx_docs/source/comprehensive_tests.rst new file mode 100644 index 0000000000..5ea20ab663 --- /dev/null +++ b/sphinx_docs/source/comprehensive_tests.rst @@ -0,0 +1,119 @@ +************************ +Comprehensive Unit Tests +************************ + +Generally, for each test, you simply type ``make`` in the test +directory. There are a number of runtime parameters that can +control the behavior. These are specified (along with defaults) +in ``_parameters`` files in each test directory and can be +overridden in an inputs file or on the commandline. + +Some additional details on a few of the comprehensive unit tests +are given below. + +EOS test (``test_eos``) +======================= + +``Microphysics/unit_test/test_eos/`` is a unit test for the equations +of state in Microphysics. It sets up a cube of data, with +:math:`\rho`, :math:`T`, and :math:`X_k` varying along the three +dimensions, and then calls the EOS in each zone. Calls are done to +exercise all modes of calling the EOS, in order: + +- ``eos_input_rt``: We call the EOS using :math:`\rho, T`. this is the + reference call, and we save the :math:`h`, :math:`e`, :math:`p`, and + :math:`s` from here to use in subsequent calls. + +- ``eos_input_rh``: We call the EOS using :math:`\rho, h`, to recover + the original :math:`T`. To give the root finder some work to do, we + perturb the initial temperature. + + We store the relative error in :math:`T` in the output file. + +- ``eos_input_tp``: We call the EOS using :math:`T, p`, to recover the + original :math:`\rho`. To give the root finder some work to do, we + perturb the initial density. + + We store the relative error in :math:`\rho` in the output file. + +- ``eos_input_rp``: We call the EOS using :math:`\rho, p`, to recover + the original :math:`T`. To give the root finder some work to do, we + perturb the initial temperature. + + We store the relative error in :math:`T` in the output file. + +- ``eos_input_re``: We call the EOS using :math:`\rho, e`, to recover + the original :math:`T`. To give the root finder some work to do, we + perturb the initial temperature. + + We store the relative error in :math:`T` in the output file. + +- ``eos_input_ps``: We call the EOS using :math:`p, s`, to recover the + original :math:`\rho, T`. To give the root finder some work to do, + we perturb the initial density and temperature. + + Note: entropy is not well-defined for some EOSs, so we only attempt + the root find if :math:`s > 0`. + + We store the relative error in :math:`\rho, T` in the output file. + +- ``eos_input_ph``: We call the EOS using :math:`p, h`, to recover the + original :math:`\rho, T`. To give the root finder some work to do, + we perturb the initial density and temperature. + + We store the relative error in :math:`\rho, T` in the output file. + +- ``eos_input_th``: We call the EOS using :math:`T, h`, to recover the + original :math:`\rho`. To give the root finder some work to do, we + perturb the initial density. + + Note: for some EOSs, :math:`h = h(\rho)` (e.g., an ideal gas), so there + is no temperature dependence, and we do not do this test. + + We store the relative error in :math:`\rho` in the output file. + +This unit test is marked up with OpenMP directives and therefore also +tests whether the EOS is threadsafe. + +To compile for a specific EOS, e.g., helmholtz, do:: + + make EOS_DIR=helmholtz -j 4 + +Examining the output (an AMReX plotfile) will show you how big the +errors are. You can use the ``amrex/Tools/Plotfile/`` tool +``fextrema`` to display the maximum error for each variable. + + +Network test (``test_react``) +============================= + +``Microphysics/unit_test/test_react/`` is a unit test for the nuclear +reaction networks in Microphysics. It sets up a cube of data, with +:math:`\rho`, :math:`T`, and :math:`X_k` varying along the three +dimensions (as a :math:`16^3` domain), and then calls the EOS in each +zone. This test does the entire ODE integration of the network for +each zone. + +The state in each zone of our data cube is determined by the runtime +parameters ``dens_min``, ``dens_max``, ``temp_min``, and ``temp_max`` +for :math:`(\rho, T)`. Because each network carries different +compositions, we specify the composition through runtime parameters in +the ``&extern`` namelist: ``primary_species_1``, +``primary_species_2``, ``primary_species_3``. These primary species +will vary from X = 0.2 to X = 0.7 to 0.9 (depending on the number). +Only one primary species varies at a time. The non-primary species +will be set equally to share whatever fraction of 1 is not accounted +for by the primary species mass fractions. + +This test calls the network on each zone, running for a time +``tmax``. The full state, including new mass fractions and energy +release is output to a AMReX plotfile. + +You can compile for a specific integrator (e.g., ``VODE``) or +network (e.g., ``aprox13``) as:: + + make NETWORK_DIR=aprox13 INTEGRATOR_DIR=VODE -j 4 + +The loop over the burner is marked up for OpenMP and CUDA and +therefore this test can be used to assess threadsafety of the burners +as well as to optimize the GPU performance of the burners. diff --git a/sphinx_docs/source/index.rst b/sphinx_docs/source/index.rst index 5c547fcd43..7b48af3de1 100644 --- a/sphinx_docs/source/index.rst +++ b/sphinx_docs/source/index.rst @@ -24,7 +24,6 @@ for astrophysical simulation codes. data_structures autodiff rp_intro - unit_tests .. toctree:: :maxdepth: 1 @@ -53,7 +52,15 @@ for astrophysical simulation codes. .. toctree:: :maxdepth: 1 - :caption: references + :caption: Unit tests + + unit_tests + comprehensive_tests + one_zone_tests + +.. toctree:: + :maxdepth: 1 + :caption: References zreferences diff --git a/sphinx_docs/source/one_zone_tests.rst b/sphinx_docs/source/one_zone_tests.rst new file mode 100644 index 0000000000..ec9706a05e --- /dev/null +++ b/sphinx_docs/source/one_zone_tests.rst @@ -0,0 +1,103 @@ +************** +One Zone Tests +************** + +There are several tests that let you call the EOS or reaction network +on a single zone to inspect the output directly. + + +``burn_cell`` +============= + +``burn_cell`` is a simple one-zone burn that will evolve a state with +a network for a specified amount of time. This can be used to +understand the timescales involved in a reaction sequence or to +determine the needed ODE tolerances. + + +Getting Started +--------------- + +The ``burn_cell`` code are located in +``Microphysics/unit_test/burn_cell``. To run a simulation, ensure that +both an input file and an initial conditions file have been created +and are in the same directory as the executable. + +Input File +---------- + +These files are typically named as ``inputs_burn_network`` where network +is the network you wish to use for your testing. + +The structure of this file is is fairly self-explanatory. The run +prefix defined should be unique to the tests that will be run as they +will be used to identify all of the output files. Typically, the run +prefix involves the name of the network being tested. The ``atol`` +variables define absolute tolerances of the ordinary differential +equations and the ``rtol`` variables define the relative tolerances. The +second section of the input file collects the inputs that ``main.f90`` +asks for so that the user does not have to input all 5+ +parameters that are required every time the test is run. Each input +required is defined and initialized on the lines following +``&cellparams``. The use of the parameters is show below: + +.. table:: The definition of parameters used in the burn_cell unit tests and specified in the second half of each inputs file. + + +-----------------------+----------------------------------------+ + | ``tmax`` | Maximum Time (s) | + +-----------------------+----------------------------------------+ + | ``nsteps`` | Number of time subdivisions | + +-----------------------+----------------------------------------+ + | ``density`` | State Density (:math:`\frac{g}{cm^3}`) | + +-----------------------+----------------------------------------+ + | ``temperature`` | State Temperature (K) | + +-----------------------+----------------------------------------+ + | ``massfractions(i)`` | Mass Fraction for element i | + +-----------------------+----------------------------------------+ + +Running the Code +---------------- + +To run the code, enter the burn_cell directory and run:: + + ./main3d.gnu.ex inputs + +where ``inputs`` is the name of your inputs file. + +For each of the ``numsteps`` steps defined in the inputs +file, the code will output a files into a new directory titled +``run_prefix_output`` where ``run_prefix`` is the run prefix defined in the +inputs file. Each output file will be named using the run prefix +defined in the inputs file and the corresponding timestep. + +Next, run ``burn_cell.py`` using python 3.x, giving the defined run prefix as an argument. +For example:: + + python3 burn_cell.py react_aprox13 + +The ``burn_cell.py`` code will gather information from all of the +output files and compile them into three graphs explained below. + +Graphs Output by ``burn_cell.py`` +--------------------------------- + +The file ``run-prefix_logX.png`` and ``run-prefix_logX.eps`` will display a +graph of the chemical abundances as a function of the time, both on +logarithmic scales, for all species involved in the simulation. An +example of this graph is shown below. + +.. figure:: react_aprox13_logX.png + :alt: An example of a plot output by the burn_cell unit test. This is the logX output corresponding to the network aprox13. + :width: 4.5in + + An example of a plot output by the burn_cell unit test. This is the + logX output corresponding to the network aprox13. + + + +The file ``run-prefix_ydot.png`` and ``run-prefix_ydot.eps`` will display the +molar fraction (mass fraction / atomic weight) as a function of time, +both on logarithmic scales, for all species involved in the code. + +The file ``run-prefix_T-edot.png`` and ``run-prefix_T-edot.eps`` will display +the temperature and the energy generation rate as a function of time. diff --git a/sphinx_docs/source/unit_tests.rst b/sphinx_docs/source/unit_tests.rst index ab4d58e4b4..d9ba9c5d1e 100644 --- a/sphinx_docs/source/unit_tests.rst +++ b/sphinx_docs/source/unit_tests.rst @@ -1,10 +1,6 @@ -********** -Unit Tests -********** - - -Comprehensive Unit Tests -======================== +********************** +Overview of Unit Tests +********************** There are a few unit tests in Microphysics that operate on a generic EOS, reaction network, conductivity, or some smaller component to @@ -23,229 +19,155 @@ script. Most of these tests work with MPI+OpenMP, MPI+CUDA, and MPI+HIP +Tests are divided into three categories: -EOS test --------- - -``Microphysics/unit_test/test_eos/`` is a unit test for the equations -of state in Microphysics. It sets up a cube of data, with -:math:`\rho`, :math:`T`, and :math:`X_k` varying along the three -dimensions, and then calls the EOS in each zone. Calls are done to -exercise all modes of calling the EOS, in order: - -- ``eos_input_rt``: We call the EOS using :math:`\rho, T`. this is the - reference call, and we save the :math:`h`, :math:`e`, :math:`p`, and - :math:`s` from here to use in subsequent calls. - -- ``eos_input_rh``: We call the EOS using :math:`\rho, h`, to recover - the original :math:`T`. To give the root finder some work to do, we - perturb the initial temperature. - - We store the relative error in :math:`T` in the output file. - -- ``eos_input_tp``: We call the EOS using :math:`T, p`, to recover the - original :math:`\rho`. To give the root finder some work to do, we - perturb the initial density. - - We store the relative error in :math:`\rho` in the output file. - -- ``eos_input_rp``: We call the EOS using :math:`\rho, p`, to recover - the original :math:`T`. To give the root finder some work to do, we - perturb the initial temperature. - - We store the relative error in :math:`T` in the output file. - -- ``eos_input_re``: We call the EOS using :math:`\rho, e`, to recover - the original :math:`T`. To give the root finder some work to do, we - perturb the initial temperature. - - We store the relative error in :math:`T` in the output file. +* *comprehensive tests* work on a cube of data (usually + $\rho$, $T$, and composition varying along the three dimensions) and + are meant to exercise a wide range of input conditions. -- ``eos_input_ps``: We call the EOS using :math:`p, s`, to recover the - original :math:`\rho, T`. To give the root finder some work to do, - we perturb the initial density and temperature. + These are mainly used for regression testing. - Note: entropy is not well-defined for some EOSs, so we only attempt - the root find if :math:`s > 0`. +* *one-zone tests* allow you to evaluate the conditions for a + particular thermodynamic state. - We store the relative error in :math:`\rho, T` in the output file. + These are often used for interactive explorations and within the CI. -- ``eos_input_ph``: We call the EOS using :math:`p, h`, to recover the - original :math:`\rho, T`. To give the root finder some work to do, - we perturb the initial density and temperature. +* *infrastructure tests* test small bits of the solver, function + interfaces, or runtime infrastructure. - We store the relative error in :math:`\rho, T` in the output file. + These are not really meant for exploring the actual thermodynamic + state. -- ``eos_input_th``: We call the EOS using :math:`T, h`, to recover the - original :math:`\rho`. To give the root finder some work to do, we - perturb the initial density. - Note: for some EOSs, :math:`h = h(\rho)` (e.g., an ideal gas), so there - is no temperature dependence, and we do not do this test. - We store the relative error in :math:`\rho` in the output file. +Comprehensive tests +=================== -This unit test is marked up with OpenMP directives and therefore also -tests whether the EOS is threadsafe. +Each of these tests sets up a cube of data, $(\rho, T, X_k)$, with the +range of $T$ and $\rho$, and the species to focus on for $X_k$ controlled +by options in the input file. -To compile for a specific EOS, e.g., helmholtz, do:: +* ``test_aprox_rates`` : - make EOS_DIR=helmholtz -j 4 + call each of the hardcoded rate functions in ``Microphysics/rates/`` + on each cell in the data cube and store the output in a plotfile. -Examining the output (an AMReX plotfile) will show you how big the -errors are. You can use the ``amrex/Tools/Plotfile/`` tool -``fextrema`` to display the maximum error for each variable. +* ``test_conductivity`` : + call one of the conductivity routines (set via ``CONDUCTIVITY_DIR``) + on each cell in the data cube and store the output in a plotfile. -Network test ------------- +* ``test_eos`` : -``Microphysics/unit_test/test_react/`` is a unit test for the nuclear -reaction networks in Microphysics. It sets up a cube of data, with -:math:`\rho`, :math:`T`, and :math:`X_k` varying along the three -dimensions (as a :math:`16^3` domain), and then calls the EOS in each -zone. This test does the entire ODE integration of the network for -each zone. + call one of the equations of state (set via ``EOS_DIR``) on each + cell in the data cube. We first call it with $(\rho, T, X_k)$ as + input (``eos_input_rt``), and then test each of the other EOS modes + (``eos_input_rh``, ``eos_input_tp``, ``eos_input_rp``, + ``eos_input_re``, ``eos_input_ps``, ``eos_input_ph``, + ``eos_input_th``) and for each of these modes, we compute the error + in the recovered $T$ and/or $\rho$ (as appropriate). The full + thermodynamic state and errors are stored in a plotfile. -The state in each zone of our data cube is determined by the runtime -parameters ``dens_min``, ``dens_max``, ``temp_min``, and ``temp_max`` -for :math:`(\rho, T)`. Because each network carries different -compositions, we specify the composition through runtime parameters in -the ``&extern`` namelist: ``primary_species_1``, -``primary_species_2``, ``primary_species_3``. These primary species -will vary from X = 0.2 to X = 0.7 to 0.9 (depending on the number). -Only one primary species varies at a time. The non-primary species -will be set equally to share whatever fraction of 1 is not accounted -for by the primary species mass fractions. +* ``test_jac`` : -This test calls the network on each zone, running for a time -``tmax``. The full state, including new mass fractions and energy -release is output to a AMReX plotfile. + for each cell in the data cube, and for a specific network (set via + ``NETWORK_DIR``) call the analytic Jacobian provided by the network + and compute the numerical Jacobian (via finite differencing) and + store the relative difference between each approximation for each + Jacobian element in a plotfile. -You can compile for a specific integrator (e.g., ``VODE``) or -network (e.g., ``aprox13``) as:: +* ``test_neutrino_cooling`` : - make NETWORK_DIR=aprox13 INTEGRATOR_DIR=VODE -j 4 + for each cell in the data cube, call the neutrino cooling function + and store the output in a plotfile. -The loop over the burner is marked up for OpenMP and CUDA and -therefore this test can be used to assess threadsafety of the burners -as well as to optimize the GPU performance of the burners. +* ``test_react`` : + for each cell in the data cube, call the reaction network and + integrate to a specified time. Statistics about the number of RHS + calls are reported at the end. A lot of options can be set via the + inputs file to control the integration. -Aprox Rates Test ----------------- +* ``test_rhs`` : -``Microphysics/unit_test/test_aprox_rates`` just evaluates the -instantaneous reaction rates in ``Microphysics/rates/`` used by the -``iso7``, ``aprox13``, ``aprox19``, and ``aprox21`` reaction networks. -This uses the same basic ideas as the tests above---a cube of data is -setup and the rates are evaluated using each zone's thermodynamic -conditions. This test is not really network specific---it tests all -of the available rates. + for each cell in the data cube, call the network's righthand side and + Jacobian functions and store the output in a plotfile. The network + is controlled by the ``NETWORK_DIR`` variable. +* ``test_screening_templated`` : -Screening Test --------------- + for any of the templated-C++ networks, this test will loop over all of + the rates and calculate the screening factor (the screening routine can + be set via ``SCREEN_METHOD``). The factors for each cell in the data + cube are written to a plotfile. -``Microphysics/unit_test/test_screening`` just evaluates the screening -routine, using the ``aprox21`` reaction network. -This uses the same basic ideas as the tests above---a cube of data is -setup and the rates are evaluated using each zone's thermodynamic -conditions. +* ``test_sdc`` : + similar to ``test_react``, except now we exercise the SDC + integration infrastructure. The conserved state that is input to + the burner is chosen to have a Mach number of $0.1$ (and otherwise + use the thermodynamics from the data cube). No advective terms are + modeled. -``burn_cell`` -============= -``burn_cell`` is a simple one-zone burn that will evolve a state with -a network for a specified amount of time. This can be used to -understand the timescales involved in a reaction sequence or to -determine the needed ODE tolerances. +One-zone tests +============== +* ``burn_cell`` : -Getting Started ---------------- + given a $\rho$, $T$, and $X_k$, integrate a reaction network through a specified time + and output the new state. -The ``burn_cell`` code are located in -``Microphysics/unit_test/burn_cell``. To run a simulation, ensure that -both an input file and an initial conditions file have been created -and are in the same directory as the executable. +* ``burn_cell_primordial_chem`` : -Input File ----------- + similar to ``burn_cell`` except specific for the primordial chemistry network. -These files are typically named as ``inputs_burn_network`` where network -is the network you wish to use for your testing. +* ``burn_cell_sdc`` : -The structure of this file is is fairly self-explanatory. The run -prefix defined should be unique to the tests that will be run as they -will be used to identify all of the output files. Typically, the run -prefix involves the name of the network being tested. The ``atol`` -variables define absolute tolerances of the ordinary differential -equations and the ``rtol`` variables define the relative tolerances. The -second section of the input file collects the inputs that ``main.f90`` -asks for so that the user does not have to input all 5+ -parameters that are required every time the test is run. Each input -required is defined and initialized on the lines following -``&cellparams``. The use of the parameters is show below: + similar to ``burn_cell`` except this uses the SDC integration code paths. -.. table:: The definition of parameters used in the burn_cell unit tests and specified in the second half of each inputs file. +* ``eos_cell`` : - +-----------------------+----------------------------------------+ - | ``tmax`` | Maximum Time (s) | - +-----------------------+----------------------------------------+ - | ``numsteps`` | Number of time subdivisions | - +-----------------------+----------------------------------------+ - | ``density`` | State Density (:math:`\frac{g}{cm^3}`) | - +-----------------------+----------------------------------------+ - | ``temperature`` | State Temperature (K) | - +-----------------------+----------------------------------------+ - | ``massfractions(i)`` | Mass Fraction for element i | - +-----------------------+----------------------------------------+ + given a $\rho$, $T$, and $X_k$, call the equation of state and print out + the thermodynamic information. -Running the Code ----------------- +* ``nse_table_cell`` : -To run the code, enter the burn_cell directory and run:: + given a $\rho$, $T$, and $Y_e$, evaluate the NSE state via table interpolation + and print it out. - ./main3d.gnu.exe with inputs +* ``test_ase`` : -where ``inputs`` is the name of your inputs file. + for the self-consistent NSE, take a $\rho$, $T$, and $Y_e$, and solve for the NSE + state. Then check the NSE condition to see if we are actually satisfying the NSE + criteria for the network. -For each of the ``numsteps`` steps defined in the inputs -file, the code will output a files into a new directory titled -``run_prefix_output`` where ``run_prefix`` is the run prefix defined in the -inputs file. Each output file will be named using the run prefix -defined in the inputs file and the corresponding timestep. +* ``test_part_func`` -Next, run ``burn_cell.py`` using python 3.x, giving the defined run prefix as an argument. -For example:: + exercise the partition function interpolation for a few select nuclei. - python3 burn_cell.py react_aprox13 -The ``burn_cell.py`` code will gather information from all of the -output files and compile them into three graphs explained below. +Infrastructure tests +==================== -Graphs Output by ``burn_cell.py`` ---------------------------------- +* ``test_linear_algebra`` : -The file ``run-prefix_logX.png`` and ``run-prefix_logX.eps`` will display a -graph of the chemical abundances as a function of the time, both on -logarithmic scales, for all species involved in the simulation. An -example of this graph is shown below. + create a diagonally dominant matrix, multiply it by a test vector, $x$, + to get $b = Ax$, and then call the linear algebra routines to see if we + we recover $x$ from $b$. -.. figure:: react_aprox13_logX.png - :alt: An example of a plot output by the burn_cell unit test. This is the logX output corresponding to the network aprox13. - :width: 4.5in +* ``test_nse_interp`` : - An example of a plot output by the burn_cell unit test. This is the - logX output corresponding to the network aprox13. + run various tests of the NSE interpolation routines. +* ``test_parameters`` : + a simple setup that initializes the runtime parameters and can be + used to test if we can override them at runtime via inputs or the + commandline. This uses both the global data and the struct form + of the runtime parameters. -The file ``run-prefix_ydot.png`` and ``run-prefix_ydot.eps`` will display the -molar fraction (mass fraction / atomic weight) as a function of time, -both on logarithmic scales, for all species involved in the code. +* ``test_sdc_vode_rhs`` : -The file ``run-prefix_T-edot.png`` and ``run-prefix_T-edot.eps`` will display -the temperature and the energy generation rate as a function of time. + a simple driver for the SDC RHS routines. Given a thermodynamic + state, it outputs the RHS that the integrator will see. From 51019acd6fca65ac90851f95da6d63a103b06619 Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Wed, 17 Jul 2024 13:26:55 -0400 Subject: [PATCH 11/33] fix test_jac numerical Jacobian (#1615) we should not zero out the energy term before calling numerical_jacobian --- unit_test/test_jac/jac_zones.H | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/unit_test/test_jac/jac_zones.H b/unit_test/test_jac/jac_zones.H index c00cc9348a..afb4616e23 100644 --- a/unit_test/test_jac/jac_zones.H +++ b/unit_test/test_jac/jac_zones.H @@ -26,17 +26,11 @@ bool do_jac (int i, int j, int k, amrex::Array4 const& state, const normalize_abundances_burn(burn_state); - eos_extra_t eos_state; - - burn_to_eos(burn_state, eos_state); - - eos(eos_input_rt, eos_state); - - eos_to_burn(eos_state, burn_state); + eos(eos_input_rt, burn_state); // the integrator doesn't actually care about the initial internal // energy. - burn_state.e = 0.0_rt; + //burn_state.e = 0.0_rt; JacNetArray2D jac_analytic; JacNetArray2D jac_numerical; From 80dffdcbf8ea0c2ec53e573a40bfc5ed7fddf722 Mon Sep 17 00:00:00 2001 From: "Eric T. Johnson" Date: Wed, 17 Jul 2024 13:51:37 -0400 Subject: [PATCH 12/33] Fix more derivatives in the templated networks (#1613) --- networks/aprox19/actual_network.H | 7 +++++-- networks/aprox21/actual_network.H | 8 +++++-- networks/iso7/actual_network.H | 4 ++-- networks/rprox/actual_network.H | 2 ++ rates/aprox_rates.H | 1 + unit_test/test_rhs/ci-benchmarks/aprox19.out | 6 +++--- unit_test/test_rhs/ci-benchmarks/aprox21.out | 4 ++-- unit_test/test_rhs/ci-benchmarks/iso7.out | 8 +++---- unit_test/test_rhs/ci-benchmarks/rprox.out | 22 ++++++++++---------- 9 files changed, 36 insertions(+), 26 deletions(-) diff --git a/networks/aprox19/actual_network.H b/networks/aprox19/actual_network.H index 55fa6a2451..97b0b5fc27 100644 --- a/networks/aprox19/actual_network.H +++ b/networks/aprox19/actual_network.H @@ -1549,6 +1549,7 @@ namespace RHS { if constexpr (rate == H1_H1_H1_to_He3) { rates.fr = rates1.fr; + rates.frdt = rates1.frdt; } // Beta limit He3 + He4 by the B8 decay half-life @@ -1674,7 +1675,8 @@ namespace RHS { amrex::Real dtotdt = rates2.frdt + rates3.frdt; - rates.frdt = rates1.fr * (rates2.frdt * invtot - rates2.fr * invtot * invtot * dtotdt); + rates.frdt = rates1.fr * (rates2.frdt * invtot - rates2.fr * invtot * invtot * dtotdt) + + rates1.frdt * (rates2.fr * invtot); } if constexpr (rate == N14_2H1_to_C12_He4) @@ -1701,7 +1703,8 @@ namespace RHS { amrex::Real dtotdt = rates2.frdt + rates3.frdt; - rates.frdt = rates1.fr * (rates3.frdt * invtot - rates3.fr * invtot * invtot * dtotdt); + rates.frdt = rates1.fr * (rates3.frdt * invtot - rates3.fr * invtot * invtot * dtotdt) + + rates1.frdt * (rates3.fr * invtot); } if constexpr (rate == N14_He4_to_Ne20) diff --git a/networks/aprox21/actual_network.H b/networks/aprox21/actual_network.H index 04927498b3..539aefa2ba 100644 --- a/networks/aprox21/actual_network.H +++ b/networks/aprox21/actual_network.H @@ -1689,6 +1689,7 @@ namespace RHS { if constexpr (rate == H1_H1_H1_to_He3) { rates.fr = rates1.fr; + rates.frdt = rates1.frdt; } // Beta limit He3 + He4 by the B8 decay half-life @@ -1814,7 +1815,8 @@ namespace RHS { amrex::Real dtotdt = rates2.frdt + rates3.frdt; - rates.frdt = rates1.fr * (rates2.frdt * invtot - rates2.fr * invtot * invtot * dtotdt); + rates.frdt = rates1.fr * (rates2.frdt * invtot - rates2.fr * invtot * invtot * dtotdt) + + rates1.frdt * (rates2.fr * invtot); } if constexpr (rate == N14_2H1_to_C12_He4) @@ -1841,7 +1843,8 @@ namespace RHS { amrex::Real dtotdt = rates2.frdt + rates3.frdt; - rates.frdt = rates1.fr * (rates3.frdt * invtot - rates3.fr * invtot * invtot * dtotdt); + rates.frdt = rates1.fr * (rates3.frdt * invtot - rates3.fr * invtot * invtot * dtotdt) + + rates1.frdt * (rates3.fr * invtot); } if constexpr (rate == N14_He4_to_Ne20) @@ -1975,6 +1978,7 @@ namespace RHS { { // Rate 1 == Ni56_to_Fe56 rates.fr = 1.0e-4 * rates1.fr; + rates.frdt = 1.0e-4 * rates1.frdt; } if constexpr (rate == Fe54_2N_to_Fe56) diff --git a/networks/iso7/actual_network.H b/networks/iso7/actual_network.H index 80cb9072dd..a8c8a5b1fe 100644 --- a/networks/iso7/actual_network.H +++ b/networks/iso7/actual_network.H @@ -374,7 +374,7 @@ namespace RHS { amrex::Real denom = amrex::Math::powi<3>(state.rho * state.y(He4)); rates.fr = yeff_ca40 * denom * rates1.fr; - rates.frdt = (yeff_ca40dt * rates1.fr + yeff_ca40 * rates1.frdt) * denom * 1.0e-9_rt; + rates.frdt = (yeff_ca40dt * rates1.fr * 1.0e-9_rt + yeff_ca40 * rates1.frdt) * denom; amrex::Real zz = 1.0_rt / denom; rates.rr = amrex::min(1.0e10_rt, yeff_ti44 * rates1.rr * zz); @@ -382,7 +382,7 @@ namespace RHS { if (rates.rr == 1.0e10_rt) { rates.rrdt = 0.0_rt; } else { - rates.rrdt = (yeff_ti44dt * rates1.rr + yeff_ti44 * rates1.rrdt) * zz * 1.0e-9_rt; + rates.rrdt = (yeff_ti44dt * rates1.rr * 1.0e-9_rt + yeff_ti44 * rates1.rrdt) * zz; } } } diff --git a/networks/rprox/actual_network.H b/networks/rprox/actual_network.H index 81191639a7..09c7266b8e 100644 --- a/networks/rprox/actual_network.H +++ b/networks/rprox/actual_network.H @@ -732,6 +732,7 @@ namespace RHS { else if constexpr (rate == O16_H1_to_F17) { rate_p_o16_to_f17(state.tf, rates.fr, rates.frdt); rate_f17_to_p_o16(state.tf, rates.rr, rates.rrdt); + rates.rrdt *= 1.0e-9_rt; } else if constexpr (rate == O16_He4_to_Ne20) { rate_he4_o16_to_ne20(state.tf, rates.fr, rates.frdt); @@ -760,6 +761,7 @@ namespace RHS { else if constexpr (rate == Ti44_He4_to_V47_H1) { rate_he4_ti44_to_p_v47(state.tf, rates.fr, rates.frdt); } + rates.frdt *= 1.0e-9_rt; } template diff --git a/rates/aprox_rates.H b/rates/aprox_rates.H index 84933ea1cc..8f2db09354 100644 --- a/rates/aprox_rates.H +++ b/rates/aprox_rates.H @@ -2,6 +2,7 @@ #define APROX_RATES_H #include +#include #include #include diff --git a/unit_test/test_rhs/ci-benchmarks/aprox19.out b/unit_test/test_rhs/ci-benchmarks/aprox19.out index 201258eb2d..843427e39d 100644 --- a/unit_test/test_rhs/ci-benchmarks/aprox19.out +++ b/unit_test/test_rhs/ci-benchmarks/aprox19.out @@ -422,9 +422,9 @@ J_neutron_proton -3.1041941575e+11 0.01005978836 J_proton_proton -3.1047599221e+11 -2.3827182398e-87 J_E_proton -7.593501065e+15 4.237794952e+30 - J_hydrogen-1_E 2.0563926691e-19 5.7718078776e-06 + J_hydrogen-1_E 2.056391585e-19 5.7718078776e-06 J_helium-3_E -5.7716864292e-06 -2.0648367761e-19 - J_helium-4_E 1.026556653e-19 2.885937043e-06 + J_helium-4_E 1.0265571946e-19 2.885937043e-06 J_carbon-12_E -1.7761025826e-08 3.1733884044e-10 J_nitrogen-14_E -3.3419345218e-10 9.9166452811e-09 J_oxygen-16_E -4.8278139961e-11 2.1225767505e-12 @@ -441,5 +441,5 @@ J_nickel-56_E -1.41049225e-12 3.8177441789e-11 J_neutron_E 0 1.1761800714e-07 J_proton_E -5.6936091804e-14 1.1296574697e-07 - J_E_E 2.092537071 3.5786987301e+13 + J_E_E 2.0925380937 3.5786987301e+13 diff --git a/unit_test/test_rhs/ci-benchmarks/aprox21.out b/unit_test/test_rhs/ci-benchmarks/aprox21.out index bc513f9e62..afe0227f7d 100644 --- a/unit_test/test_rhs/ci-benchmarks/aprox21.out +++ b/unit_test/test_rhs/ci-benchmarks/aprox21.out @@ -510,7 +510,7 @@ J_E_proton -2.6108991385e+16 3.6817330507e+30 J_hydrogen-1_E -1.0006504976e-07 4.2872891104e-06 J_helium-3_E -4.2866803458e-06 -7.5769167747e-20 - J_helium-4_E 3.7850094111e-20 2.1441607162e-06 + J_helium-4_E 3.7852613992e-20 2.1441607162e-06 J_carbon-12_E -5.3556320773e-08 1.4041391721e-09 J_nitrogen-14_E -1.9393729314e-09 5.3556258717e-08 J_oxygen-16_E -3.4898941611e-13 6.2789315765e-12 @@ -529,5 +529,5 @@ J_nickel-56_E -1.3650886568e-12 2.7798205721e-11 J_neutron_E -4.0660804174e-09 5.9256825143e-08 J_proton_E -3.9082377477e-10 8.5866665712e-08 - J_E_E 0.65500458025 2.6535626445e+13 + J_E_E 0.65504112892 2.6535626445e+13 diff --git a/unit_test/test_rhs/ci-benchmarks/iso7.out b/unit_test/test_rhs/ci-benchmarks/iso7.out index f77f18f11e..865cc8f32d 100644 --- a/unit_test/test_rhs/ci-benchmarks/iso7.out +++ b/unit_test/test_rhs/ci-benchmarks/iso7.out @@ -74,12 +74,12 @@ J_silicon-28_nickel-56 0 10000000000 J_nickel-56_nickel-56 -10000000000 0 J_E_nickel-56 -4.7656897776e+29 3.4603369325e+17 - J_helium-4_E -5.2043289985e-09 1.0072596721e+20 + J_helium-4_E -5.2043289985e-09 8.7939289725e+19 J_carbon-12_E -8.1026490435e-07 6.1135331864e-10 J_oxygen-16_E -1.0316135993e-08 2.5415462665e-08 J_neon-20_E -1.379618092e-08 3.5556715497e-07 J_magnesium-24_E -6.1614211527e-10 2.247549785e-08 - J_silicon-28_E -5.4772628635e-09 1.4389423887e+19 - J_nickel-56_E -1.4389423887e+19 0 - J_E_E -6.8575530322e+38 1.9477832709e+12 + J_silicon-28_E -5.4777796693e-09 1.2562755675e+19 + J_nickel-56_E -1.2562755675e+19 0 + J_E_E -5.9870196299e+38 1.9477832709e+12 diff --git a/unit_test/test_rhs/ci-benchmarks/rprox.out b/unit_test/test_rhs/ci-benchmarks/rprox.out index d5230fcfbf..aec2337f5c 100644 --- a/unit_test/test_rhs/ci-benchmarks/rprox.out +++ b/unit_test/test_rhs/ci-benchmarks/rprox.out @@ -134,15 +134,15 @@ J_helium-4_hydrogen-1 -189922474.35 927.47563176 J_hydrogen-1_hydrogen-1 -53877537415 -4.5403436538e-06 J_E_hydrogen-1 1.440700152e+13 1.7081017075e+29 - J_carbon-12_E -63.63763642 0.9574584339 - J_oxygen-14_E -16.885124406 63.634574488 - J_oxygen-15_E -0.0078799579355 0.0012865310157 - J_oxygen-16_E -0.09149619414 375.43326461 - J_flourine-17_E -368.62408276 0.0050664564906 - J_magnesium-22_E -16.81079726 0.25807275751 - J_sulfur-30_E 0 15.814632043 - J_nickel-56_E 0 1.0194733271 - J_helium-4_E -57.069383443 9.1684880792e-05 - J_hydrogen-1_E -127.2956735 383.90825786 - J_E_E -1.0373910939e+20 4.0361993326e+20 + J_carbon-12_E -4.9270631512e-08 1.2626274548e-09 + J_oxygen-14_E -1.5651670231e-08 4.9270423429e-08 + J_oxygen-15_E -6.7474909572e-12 1.4489725852e-12 + J_oxygen-16_E -7.1070989692e-11 3.7544796794e-07 + J_flourine-17_E -3.6920874683e-07 8.8724341682e-12 + J_magnesium-22_E -1.5881316649e-08 1.9046704682e-10 + J_sulfur-30_E 0 1.4942256036e-08 + J_nickel-56_E 0 9.5914484828e-10 + J_helium-4_E -5.3527159887e-08 7.3940758949e-14 + J_hydrogen-1_E -9.8553411023e-08 3.8292554973e-07 + J_E_E -1.0652292974e+11 3.1241232578e+11 From a5d2e2973a2b7625ecdcab8b6e41978abb801c97 Mon Sep 17 00:00:00 2001 From: "Eric T. Johnson" Date: Wed, 17 Jul 2024 13:58:15 -0400 Subject: [PATCH 13/33] Update `autodiff::dual` to give the same results as `amrex::Real` (#1612) In my testing with converting the aprox* rates to use autodiff, I found a lot of instances where code templated with autodiff::dual would give slightly different values than the same code templated with amrex::Real. It turns out to be due to some optimizations autodiff makes to speed up evaluation, which this PR disables to avoid any weird inconsistencies in the future. --- .../ci-benchmarks/chamulak_VODE_unit_test.out | 24 +++---- util/autodiff/autodiff/forward/dual/dual.hpp | 68 ++++++++++++++++--- util/microphysics_autodiff.H | 3 + 3 files changed, 73 insertions(+), 22 deletions(-) diff --git a/unit_test/burn_cell/ci-benchmarks/chamulak_VODE_unit_test.out b/unit_test/burn_cell/ci-benchmarks/chamulak_VODE_unit_test.out index 31638d62f1..8de1d8384c 100644 --- a/unit_test/burn_cell/ci-benchmarks/chamulak_VODE_unit_test.out +++ b/unit_test/burn_cell/ci-benchmarks/chamulak_VODE_unit_test.out @@ -1,5 +1,5 @@ -Initializing AMReX (24.06-22-g731014ff3eed)... -AMReX (24.06-22-g731014ff3eed) initialized +Initializing AMReX (24.07-16-gdcb9cc0383dc)... +AMReX (24.07-16-gdcb9cc0383dc) initialized starting the single zone burn... Maximum Time (s): 0.01585 State Density (g/cm^3): 1000000000 @@ -13,21 +13,21 @@ RHS at t = 0 ash 0.01230280576 ------------------------------------ successful? 1 - - Hnuc = 5.277400893e+17 - - added e = 8.364680415e+15 - - final T = 1433712612 + - Hnuc = 5.277406331e+17 + - added e = 8.364689034e+15 + - final T = 1433713030 ------------------------------------ e initial = 1.253426044e+18 -e final = 1.261790725e+18 +e final = 1.261790733e+18 ------------------------------------ new mass fractions: -C12 0.9657895158 +C12 0.9657894806 O16 1e-30 -ash 0.03421048417 +ash 0.03421051942 ------------------------------------ species creation rates: -omegadot(C12): -2.158390168 -omegadot(O16): 9.946124747e-44 -omegadot(ash): 2.158390168 +omegadot(C12): -2.158392392 +omegadot(O16): 8.840999775e-44 +omegadot(ash): 2.158392392 number of steps taken: 381 -AMReX (24.06-22-g731014ff3eed) finalized +AMReX (24.07-16-gdcb9cc0383dc) finalized diff --git a/util/autodiff/autodiff/forward/dual/dual.hpp b/util/autodiff/autodiff/forward/dual/dual.hpp index 5e904e5846..8aadf9e230 100644 --- a/util/autodiff/autodiff/forward/dual/dual.hpp +++ b/util/autodiff/autodiff/forward/dual/dual.hpp @@ -719,7 +719,7 @@ AUTODIFF_DEVICE_FUNC constexpr auto negative(U&& expr) template AUTODIFF_DEVICE_FUNC constexpr auto inverse(U&& expr) { - static_assert(isExpr); + static_assert(isExpr || isArithmetic); if constexpr (isInvExpr) return inner(expr); else return InvExpr>{ expr }; @@ -780,9 +780,11 @@ AUTODIFF_DEVICE_FUNC constexpr auto operator+(L&& l, R&& r) // ADDITION EXPRESSION CASE: (-x) + (-y) => -(x + y) if constexpr (isNegExpr && isNegExpr) return -( inner(l) + inner(r) ); +#if !defined(AUTODIFF_STRICT_ASSOCIATIVITY) // ADDITION EXPRESSION CASE: expr + number => number + expr (number always on the left) else if constexpr (isExpr && isArithmetic) return std::forward(r) + std::forward(l); +#endif // DEFAULT ADDITION EXPRESSION else return AddExpr, PreventExprRef>{ l, r }; } @@ -799,18 +801,22 @@ AUTODIFF_DEVICE_FUNC constexpr auto operator*(L&& l, R&& r) // MULTIPLICATION EXPRESSION CASE: (-expr) * (-expr) => expr * expr if constexpr (isNegExpr && isNegExpr) return inner(l) * inner(r); +#if !defined(AUTODIFF_STRICT_ASSOCIATIVITY) // // MULTIPLICATION EXPRESSION CASE: (1 / expr) * (1 / expr) => 1 / (expr * expr) else if constexpr (isInvExpr && isInvExpr) return inverse(inner(l) * inner(r)); // // MULTIPLICATION EXPRESSION CASE: expr * number => number * expr else if constexpr (isExpr && isArithmetic) return std::forward(r) * std::forward(l); +#endif // // MULTIPLICATION EXPRESSION CASE: number * (-expr) => (-number) * expr else if constexpr (isArithmetic && isNegExpr) return (-l) * inner(r); +#if !defined(AUTODIFF_STRICT_ASSOCIATIVITY) // // MULTIPLICATION EXPRESSION CASE: number * (number * expr) => (number * number) * expr else if constexpr (isArithmetic && isNumberDualMulExpr) return (l * left(r)) * right(r); +#endif // MULTIPLICATION EXPRESSION CASE: number * dual => NumberDualMulExpr else if constexpr (isArithmetic && isDual) return NumberDualMulExpr, PreventExprRef>{ l, r }; @@ -845,9 +851,7 @@ AUTODIFF_DEVICE_FUNC constexpr auto operator-(L&& l, R&& r) template> = true> AUTODIFF_DEVICE_FUNC constexpr auto operator/(L&& l, R&& r) { - if constexpr (isArithmetic) - return std::forward(l) * (One() / std::forward(r)); - else return std::forward(l) * inverse(std::forward(r)); + return std::forward(l) * inverse(std::forward(r)); } //===================================================================================================================== @@ -1000,13 +1004,27 @@ AUTODIFF_DEVICE_FUNC constexpr void assign(Dual& self, U&& other) } // ASSIGN AN ADDITION EXPRESSION: self = expr + expr else if constexpr (isAddExpr) { +#if defined(AUTODIFF_STRICT_ASSOCIATIVITY) + assign(self, other.l); + assignAdd(self, other.r); +#else + // this reordering saves a few FLOPs when other.l is arithmetic, + // but otherwise breaks the left-to-right associativity of a+b+c+... assign(self, other.r); assignAdd(self, other.l); +#endif } // ASSIGN A MULTIPLICATION EXPRESSION: self = expr * expr else if constexpr (isMulExpr) { +#if defined(AUTODIFF_STRICT_ASSOCIATIVITY) + assign(self, other.l); + assignMul(self, other.r); +#else + // this reordering saves a few FLOPs when other.l is arithmetic, + // but otherwise breaks the left-to-right associativity of a*b*c*... assign(self, other.r); assignMul(self, other.l); +#endif } // ASSIGN A POWER EXPRESSION: self = pow(expr) else if constexpr (isPowExpr) { @@ -1042,13 +1060,23 @@ AUTODIFF_DEVICE_FUNC constexpr void assign(Dual& self, U&& other, Dual) { +#if defined(AUTODIFF_STRICT_ASSOCIATIVITY) + assign(self, other.l, tmp); + assignAdd(self, other.r, tmp); +#else assign(self, other.r, tmp); assignAdd(self, other.l, tmp); +#endif } // ASSIGN A MULTIPLICATION EXPRESSION: self = expr * expr else if constexpr (isMulExpr) { +#if defined(AUTODIFF_STRICT_ASSOCIATIVITY) + assign(self, other.l, tmp); + assignMul(self, other.r, tmp); +#else assign(self, other.r, tmp); assignMul(self, other.l, tmp); +#endif } // ASSIGN A POWER EXPRESSION: self = pow(expr, expr) else if constexpr (isPowExpr) { @@ -1091,11 +1119,13 @@ AUTODIFF_DEVICE_FUNC constexpr void assignAdd(Dual& self, U&& other) self.val += other.l * other.r.val; self.grad += other.l * other.r.grad; } +#if !defined(AUTODIFF_STRICT_ASSOCIATIVITY) // ASSIGN-ADD AN ADDITION EXPRESSION: self += expr + expr else if constexpr (isAddExpr) { assignAdd(self, other.l); assignAdd(self, other.r); } +#endif // ASSIGN-ADD ALL OTHER EXPRESSIONS else { Dual tmp; @@ -1112,11 +1142,13 @@ AUTODIFF_DEVICE_FUNC constexpr void assignAdd(Dual& self, U&& other, Dual< if constexpr (isNegExpr) { assignSub(self, other.r, tmp); } +#if !defined(AUTODIFF_STRICT_ASSOCIATIVITY) // ASSIGN-ADD AN ADDITION EXPRESSION: self += expr + expr else if constexpr (isAddExpr) { assignAdd(self, other.l, tmp); assignAdd(self, other.r, tmp); } +#endif // ASSIGN-ADD ALL OTHER EXPRESSIONS else { assign(tmp, other); @@ -1153,11 +1185,13 @@ AUTODIFF_DEVICE_FUNC constexpr void assignSub(Dual& self, U&& other) self.val -= other.l * other.r.val; self.grad -= other.l * other.r.grad; } +#if !defined(AUTODIFF_STRICT_ASSOCIATIVITY) // ASSIGN-SUBTRACT AN ADDITION EXPRESSION: self -= expr + expr else if constexpr (isAddExpr) { assignSub(self, other.l); assignSub(self, other.r); } +#endif // ASSIGN-SUBTRACT ALL OTHER EXPRESSIONS else { Dual tmp; @@ -1174,11 +1208,13 @@ AUTODIFF_DEVICE_FUNC constexpr void assignSub(Dual& self, U&& other, Dual< if constexpr (isNegExpr) { assignAdd(self, other.r, tmp); } +#if !defined(AUTODIFF_STRICT_ASSOCIATIVITY) // ASSIGN-SUBTRACT AN ADDITION EXPRESSION: self -= expr + expr else if constexpr (isAddExpr) { assignSub(self, other.l, tmp); assignSub(self, other.r, tmp); } +#endif // ASSIGN-SUBTRACT ALL OTHER EXPRESSIONS else { assign(tmp, other); @@ -1214,6 +1250,11 @@ AUTODIFF_DEVICE_FUNC constexpr void assignMul(Dual& self, U&& other) assignMul(self, other.r); negate(self); } + // ASSIGN-MULTIPLY AN INVERSE EXPRESSION: self *= 1/expr + else if constexpr (isInvExpr) { + assignDiv(self, other.r); + } +#if !defined(AUTODIFF_STRICT_ASSOCIATIVITY) // ASSIGN-MULTIPLY A NUMBER-DUAL MULTIPLICATION EXPRESSION: self *= number * dual else if constexpr (isNumberDualMulExpr) { assignMul(self, other.r); @@ -1224,6 +1265,7 @@ AUTODIFF_DEVICE_FUNC constexpr void assignMul(Dual& self, U&& other) assignMul(self, other.l); assignMul(self, other.r); } +#endif // ASSIGN-MULTIPLY ALL OTHER EXPRESSIONS else { Dual tmp; @@ -1241,11 +1283,13 @@ AUTODIFF_DEVICE_FUNC constexpr void assignMul(Dual& self, U&& other, Dual< assignMul(self, other.r, tmp); negate(self); } +#if !defined(AUTODIFF_STRICT_ASSOCIATIVITY) // ASSIGN-MULTIPLY A MULTIPLICATION EXPRESSION: self *= expr * expr else if constexpr (isMulExpr) { assignMul(self, other.l, tmp); assignMul(self, other.r, tmp); } +#endif // ASSIGN-MULTIPLY ALL OTHER EXPRESSIONS else { assign(tmp, other); @@ -1271,10 +1315,10 @@ AUTODIFF_DEVICE_FUNC constexpr void assignDiv(Dual& self, U&& other) } // ASSIGN-DIVIDE A DUAL NUMBER: self /= dual else if constexpr (isDual) { - const T aux = One() / other.val; // to avoid aliasing when self === other - self.val *= aux; + const T aux = other.val; // to avoid aliasing when self === other + self.val /= aux; self.grad -= self.val * other.grad; - self.grad *= aux; + self.grad /= aux; } // ASSIGN-DIVIDE A NEGATIVE EXPRESSION: self /= (-expr) else if constexpr (isNegExpr) { @@ -1285,6 +1329,7 @@ AUTODIFF_DEVICE_FUNC constexpr void assignDiv(Dual& self, U&& other) else if constexpr (isInvExpr) { assignMul(self, other.r); } +#if !defined(AUTODIFF_STRICT_ASSOCIATIVITY) // ASSIGN-DIVIDE A NUMBER-DUAL MULTIPLICATION EXPRESSION: self /= number * dual else if constexpr (isNumberDualMulExpr) { assignDiv(self, other.r); @@ -1295,6 +1340,7 @@ AUTODIFF_DEVICE_FUNC constexpr void assignDiv(Dual& self, U&& other) assignDiv(self, other.l); assignDiv(self, other.r); } +#endif // ASSIGN-DIVIDE ALL OTHER EXPRESSIONS else { Dual tmp; @@ -1316,11 +1362,13 @@ AUTODIFF_DEVICE_FUNC constexpr void assignDiv(Dual& self, U&& other, Dual< else if constexpr (isInvExpr) { assignMul(self, other.r, tmp); } +#if !defined(AUTODIFF_STRICT_ASSOCIATIVITY) // ASSIGN-DIVIDE A MULTIPLICATION EXPRESSION: self /= expr * expr else if constexpr (isMulExpr) { assignDiv(self, other.l, tmp); assignDiv(self, other.r, tmp); } +#endif // ASSIGN-DIVIDE ALL OTHER EXPRESSIONS else { assign(tmp, other); @@ -1339,9 +1387,9 @@ AUTODIFF_DEVICE_FUNC constexpr void assignPow(Dual& self, U&& other) { // ASSIGN-POW A NUMBER: self = pow(self, number) if constexpr (isArithmetic) { - const T aux = pow(self.val, other - 1); - self.grad *= other * aux; - self.val = aux * self.val; + const T aux = pow(self.val, other); + self.grad *= other * aux / self.val; + self.val = aux; } // ASSIGN-POW A DUAL NUMBER: self = pow(self, dual) else if constexpr (isDual) { diff --git a/util/microphysics_autodiff.H b/util/microphysics_autodiff.H index 13cf5ade9b..b1b0d0e845 100644 --- a/util/microphysics_autodiff.H +++ b/util/microphysics_autodiff.H @@ -12,6 +12,9 @@ // required for AMREX_GPU_HOST_DEVICE, which is used via AUTODIFF_DEVICE_FUNC #include +// disable some optimizations that break standard left-to-right operator +// associativity, giving slightly different results with Dual vs. double +#define AUTODIFF_STRICT_ASSOCIATIVITY #include #include From 393f003cdc4f10c9595bb35f143237c7b3a4ce6a Mon Sep 17 00:00:00 2001 From: Zhi Chen <62574124+zhichen3@users.noreply.github.com> Date: Wed, 17 Jul 2024 15:19:24 -0400 Subject: [PATCH 14/33] remove old nse_iters parameter (#1617) This was used in the old energy NSE update. --- integration/_parameters | 4 ---- 1 file changed, 4 deletions(-) diff --git a/integration/_parameters b/integration/_parameters index f3900aaca8..eac2654ab9 100644 --- a/integration/_parameters +++ b/integration/_parameters @@ -89,10 +89,6 @@ subtract_internal_energy bool 1 # for Strang, this simply means scaling e by the initial energy? scale_system bool 0 -# for the NSE update predictor-corrector, how many iterations -# do we take to get the new time NSE state -nse_iters int 3 - # for SDC+NSE, when estimating the derivatives of the NSE table # quantities, what fraction of dt do we use for the finite-difference # estimate From f4d0de23b9676aab6aca3076d72a650d9da1a0dd Mon Sep 17 00:00:00 2001 From: "Eric T. Johnson" Date: Wed, 17 Jul 2024 16:01:24 -0400 Subject: [PATCH 15/33] Rename the numeric type template parameter from dual_t to number_t (#1616) This is more accurate, as it may be either `amrex::Real` or a dual type. --- interfaces/rhs_type.H | 6 +- networks/aprox13/actual_network.H | 12 +- networks/aprox19/actual_network.H | 12 +- networks/aprox21/actual_network.H | 12 +- networks/ignition_chamulak/actual_network.H | 12 +- networks/ignition_simple/actual_network.H | 12 +- networks/iso7/actual_network.H | 12 +- networks/powerlaw/actual_network.H | 12 +- networks/rhs.H | 16 +- networks/rprox/actual_network.H | 12 +- .../triple_alpha_plus_cago/actual_network.H | 12 +- screening/screen.H | 210 +++++++++--------- sphinx_docs/source/autodiff.rst | 16 +- .../screening_util.cpp | 10 +- 14 files changed, 183 insertions(+), 183 deletions(-) diff --git a/interfaces/rhs_type.H b/interfaces/rhs_type.H index d0af2a2c35..c69795a8f0 100644 --- a/interfaces/rhs_type.H +++ b/interfaces/rhs_type.H @@ -95,15 +95,15 @@ struct rate_tab_t } }; -// dual_t is currently only used in the screening routines -template +// number_t is currently only used in the screening routines +template struct rhs_state_t { amrex::Real rho; tf_t tf; rate_tab_t tab; #ifdef SCREENING - plasma_state_t pstate; + plasma_state_t pstate; #endif amrex::Real y_e; amrex::Real eta; diff --git a/networks/aprox13/actual_network.H b/networks/aprox13/actual_network.H index b4f97034d9..f366c6ae5a 100644 --- a/networks/aprox13/actual_network.H +++ b/networks/aprox13/actual_network.H @@ -782,9 +782,9 @@ namespace RHS { return data; } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) + void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; @@ -884,9 +884,9 @@ namespace RHS { } } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void postprocess_rate ([[maybe_unused]] const rhs_state_t& state, rate_t& rates, + void postprocess_rate ([[maybe_unused]] const rhs_state_t& state, rate_t& rates, rate_t& rates1, rate_t& rates2, rate_t& rates3) { using namespace Species; @@ -968,9 +968,9 @@ namespace RHS { } } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - amrex::Real ener_gener_rate ([[maybe_unused]] const rhs_state_t& rhs_state, amrex::Real const& dydt) + amrex::Real ener_gener_rate ([[maybe_unused]] const rhs_state_t& rhs_state, amrex::Real const& dydt) { return dydt * network::mion() * C::Legacy::enuc_conv2; } diff --git a/networks/aprox19/actual_network.H b/networks/aprox19/actual_network.H index 97b0b5fc27..db163ca97d 100644 --- a/networks/aprox19/actual_network.H +++ b/networks/aprox19/actual_network.H @@ -1335,9 +1335,9 @@ namespace RHS { return data; } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) + void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; @@ -1505,9 +1505,9 @@ namespace RHS { } } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void postprocess_rate (const rhs_state_t& state, rate_t& rates, + void postprocess_rate (const rhs_state_t& state, rate_t& rates, rate_t& rates1, rate_t& rates2, rate_t& rates3) { using namespace Species; @@ -1835,9 +1835,9 @@ namespace RHS { } } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - amrex::Real ener_gener_rate ([[maybe_unused]] const rhs_state_t& rhs_state, amrex::Real const& dydt) + amrex::Real ener_gener_rate ([[maybe_unused]] const rhs_state_t& rhs_state, amrex::Real const& dydt) { return dydt * network::mion() * C::Legacy::enuc_conv2; } diff --git a/networks/aprox21/actual_network.H b/networks/aprox21/actual_network.H index 539aefa2ba..6d5817ff76 100644 --- a/networks/aprox21/actual_network.H +++ b/networks/aprox21/actual_network.H @@ -1471,9 +1471,9 @@ namespace RHS { return data; } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) + void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; @@ -1645,9 +1645,9 @@ namespace RHS { } } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void postprocess_rate (const rhs_state_t& state, rate_t& rates, + void postprocess_rate (const rhs_state_t& state, rate_t& rates, rate_t& rates1, rate_t& rates2, rate_t& rates3) { using namespace Species; @@ -2026,9 +2026,9 @@ namespace RHS { } } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - amrex::Real ener_gener_rate ([[maybe_unused]] const rhs_state_t& rhs_state, amrex::Real const& dydt) + amrex::Real ener_gener_rate ([[maybe_unused]] const rhs_state_t& rhs_state, amrex::Real const& dydt) { return dydt * network::mion() * C::Legacy::enuc_conv2; } diff --git a/networks/ignition_chamulak/actual_network.H b/networks/ignition_chamulak/actual_network.H index f5ee22ac01..955fa0b0e0 100644 --- a/networks/ignition_chamulak/actual_network.H +++ b/networks/ignition_chamulak/actual_network.H @@ -65,9 +65,9 @@ namespace RHS { return data; } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) + void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; @@ -97,17 +97,17 @@ namespace RHS { } } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void postprocess_rate (const rhs_state_t& state, rate_t& rates, + void postprocess_rate (const rhs_state_t& state, rate_t& rates, rate_t& rates1, rate_t& rates2, rate_t& rates3) { // Nothing to do for this network. } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - amrex::Real ener_gener_rate (const rhs_state_t& rhs_state, amrex::Real const& dydt) + amrex::Real ener_gener_rate (const rhs_state_t& rhs_state, amrex::Real const& dydt) { // Chamulak et al. provide the q-value resulting from C12 burning, // given as 3 different values (corresponding to 3 different densities). diff --git a/networks/ignition_simple/actual_network.H b/networks/ignition_simple/actual_network.H index 3c277e68ec..255b863919 100644 --- a/networks/ignition_simple/actual_network.H +++ b/networks/ignition_simple/actual_network.H @@ -137,9 +137,9 @@ namespace RHS return data; } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) + void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; @@ -149,9 +149,9 @@ namespace RHS } } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void postprocess_rate ([[maybe_unused]] const rhs_state_t& state, [[maybe_unused]] rate_t& rates, + void postprocess_rate ([[maybe_unused]] const rhs_state_t& state, [[maybe_unused]] rate_t& rates, [[maybe_unused]] rate_t& rates1, [[maybe_unused]] rate_t& rates2, [[maybe_unused]] rate_t& rates3) { using namespace Species; @@ -160,9 +160,9 @@ namespace RHS // Nothing to do for this network. } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - amrex::Real ener_gener_rate ([[maybe_unused]] const rhs_state_t& rhs_state, amrex::Real const& dydt) + amrex::Real ener_gener_rate ([[maybe_unused]] const rhs_state_t& rhs_state, amrex::Real const& dydt) { return dydt * network::mion() * C::Legacy::enuc_conv2; } diff --git a/networks/iso7/actual_network.H b/networks/iso7/actual_network.H index a8c8a5b1fe..9612eaa2bd 100644 --- a/networks/iso7/actual_network.H +++ b/networks/iso7/actual_network.H @@ -313,9 +313,9 @@ namespace RHS { return data; } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) + void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; @@ -349,9 +349,9 @@ namespace RHS { } } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void postprocess_rate (const rhs_state_t& state, rate_t& rates, + void postprocess_rate (const rhs_state_t& state, rate_t& rates, rate_t& rates1, [[maybe_unused]] rate_t& rates2, [[maybe_unused]] rate_t& rates3) { using namespace Species; @@ -388,9 +388,9 @@ namespace RHS { } } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - amrex::Real ener_gener_rate ([[maybe_unused]] const rhs_state_t& rhs_state, amrex::Real const& dydt) + amrex::Real ener_gener_rate ([[maybe_unused]] const rhs_state_t& rhs_state, amrex::Real const& dydt) { return dydt * network::mion() * C::Legacy::enuc_conv2; } diff --git a/networks/powerlaw/actual_network.H b/networks/powerlaw/actual_network.H index 1fca7a8095..6c2cc5e174 100644 --- a/networks/powerlaw/actual_network.H +++ b/networks/powerlaw/actual_network.H @@ -53,9 +53,9 @@ namespace RHS { return data; } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) + void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; @@ -73,17 +73,17 @@ namespace RHS { } } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void postprocess_rate (const rhs_state_t& state, rate_t& rates, + void postprocess_rate (const rhs_state_t& state, rate_t& rates, rate_t& rates1, rate_t& rates2, rate_t& rates3) { // Nothing to do for this network. } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - Real ener_gener_rate ([[maybe_unused]] const rhs_state_t& rhs_state, Real const& dydt) + Real ener_gener_rate ([[maybe_unused]] const rhs_state_t& rhs_state, Real const& dydt) { if constexpr (spec == 2) { return dydt * NetworkProperties::aion(spec) * network_rp::specific_q_burn; diff --git a/networks/rhs.H b/networks/rhs.H index 26e3c096e1..ca032d8bc7 100644 --- a/networks/rhs.H +++ b/networks/rhs.H @@ -405,9 +405,9 @@ constexpr int density_exponent_reverse () } // Scale a rate using the density terms. -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void apply_density_scaling (const rhs_state_t& state, rate_t& rates) +void apply_density_scaling (const rhs_state_t& state, rate_t& rates) { constexpr int forward_exponent = density_exponent_forward(); constexpr int reverse_exponent = density_exponent_reverse(); @@ -447,9 +447,9 @@ void apply_density_scaling (const rhs_state_t& state, rate_t& rates) #ifdef SCREENING // Apply the screening term to a given rate. -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void apply_screening (const rhs_state_t& state, rate_t& rates) +void apply_screening (const rhs_state_t& state, rate_t& rates) { // The screening behavior depends on the type of reaction. We provide screening // here for the reaction classes we know about, and any other reactions are unscreened. @@ -622,9 +622,9 @@ void tabulate_rates () } // Evaluate a rate using the rate tables. -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void evaluate_tabulated_rate (const rhs_state_t& state, rate_t& rates) +void evaluate_tabulated_rate (const rhs_state_t& state, rate_t& rates) { rates.fr = (state.tab.alfa * rattab(rate, 1, state.tab.iat ) + state.tab.beta * rattab(rate, 1, state.tab.iat+1) + @@ -1141,9 +1141,9 @@ constexpr amrex::Real jac_term (const burn_t& state, const rate_t& rates) return term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void construct_rate (const rhs_state_t& state, rate_t& rates) +void construct_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; diff --git a/networks/rprox/actual_network.H b/networks/rprox/actual_network.H index 09c7266b8e..b4a817b375 100644 --- a/networks/rprox/actual_network.H +++ b/networks/rprox/actual_network.H @@ -701,9 +701,9 @@ namespace RHS { return data; } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) + void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; @@ -764,9 +764,9 @@ namespace RHS { rates.frdt *= 1.0e-9_rt; } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void postprocess_rate ([[maybe_unused]] const rhs_state_t& state, [[maybe_unused]] rate_t& rates, + void postprocess_rate ([[maybe_unused]] const rhs_state_t& state, [[maybe_unused]] rate_t& rates, [[maybe_unused]] rate_t& rates1, [[maybe_unused]] rate_t& rates2, [[maybe_unused]] rate_t& rates3) { using namespace Species; @@ -917,9 +917,9 @@ namespace RHS { } } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - amrex::Real ener_gener_rate ([[maybe_unused]] const rhs_state_t& rhs_state, amrex::Real const& dydt) + amrex::Real ener_gener_rate ([[maybe_unused]] const rhs_state_t& rhs_state, amrex::Real const& dydt) { return dydt * network::bion() * C::Legacy::n_A * C::Legacy::MeV2erg; } diff --git a/networks/triple_alpha_plus_cago/actual_network.H b/networks/triple_alpha_plus_cago/actual_network.H index 4b8d1d4fe6..8ec5d88d85 100644 --- a/networks/triple_alpha_plus_cago/actual_network.H +++ b/networks/triple_alpha_plus_cago/actual_network.H @@ -149,9 +149,9 @@ namespace RHS { return data; } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) + void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; @@ -164,9 +164,9 @@ namespace RHS { } } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void postprocess_rate ([[maybe_unused]] const rhs_state_t& state, rate_t& rates, + void postprocess_rate ([[maybe_unused]] const rhs_state_t& state, rate_t& rates, rate_t& rates1, rate_t& rates2, rate_t& rates3) { using namespace Species; @@ -175,9 +175,9 @@ namespace RHS { // Nothing to do for this network. } - template + template AMREX_GPU_HOST_DEVICE AMREX_INLINE - amrex::Real ener_gener_rate ([[maybe_unused]] const rhs_state_t& rhs_state, amrex::Real const& dydt) + amrex::Real ener_gener_rate ([[maybe_unused]] const rhs_state_t& rhs_state, amrex::Real const& dydt) { return dydt * network::mion() * C::Legacy::enuc_conv2; } diff --git a/screening/screen.H b/screening/screen.H index b7941be47d..ffeacc374f 100644 --- a/screening/screen.H +++ b/screening/screen.H @@ -41,32 +41,32 @@ const std::string screen_name = "chugunov2009"; const std::string screen_name = "chabrier1998"; #endif -template +template struct plasma_state_t { - dual_t qlam0z; - dual_t taufac; - dual_t aa; - dual_t temp; + number_t qlam0z; + number_t taufac; + number_t aa; + number_t temp; amrex::Real zbar; amrex::Real z2bar; amrex::Real n_e; amrex::Real gamma_e_fac; }; -template +template inline -std::ostream& operator<< (std::ostream& o, plasma_state_t const& pstate) +std::ostream& operator<< (std::ostream& o, plasma_state_t const& pstate) { o << "qlam0z = " << pstate.qlam0z << std::endl; - if constexpr (autodiff::detail::isDual) { + if constexpr (autodiff::detail::isDual) { o << "qlam0zdt = " << autodiff::derivative(pstate.qlam0z) << std::endl; } o << "taufac = " << pstate.taufac << std::endl; - if constexpr (autodiff::detail::isDual) { + if constexpr (autodiff::detail::isDual) { o << "taufacdt = " << autodiff::derivative(pstate.taufac) << std::endl; } o << "aa = " << pstate.aa << std::endl; - if constexpr (autodiff::detail::isDual) { + if constexpr (autodiff::detail::isDual) { o << "daadt = " << autodiff::derivative(pstate.aa) << std::endl; } o << "temp = " << pstate.temp << std::endl; @@ -90,10 +90,10 @@ screening_finalize() { } -template +template AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void -fill_plasma_state(plasma_state_t& state, const dual_t& temp, +fill_plasma_state(plasma_state_t& state, const number_t& temp, const amrex::Real dens, amrex::Array1D const& y) { amrex::Real sum = 0.0_rt; @@ -120,11 +120,11 @@ fill_plasma_state(plasma_state_t& state, const dual_t& temp, // ntot amrex::Real rr = dens * ytot; - dual_t tempi = 1.0_rt / temp; + number_t tempi = 1.0_rt / temp; // Part of Eq. 19 in Graboske:1973 // pp = sqrt( \tilde{z}*(rho/u_I/T) ) - dual_t pp = admath::sqrt(rr*tempi*(z2bar + zbar)); + number_t pp = admath::sqrt(rr*tempi*(z2bar + zbar)); // Part version of Eq. 19 in Graboske:1973 state.qlam0z = 1.88e8_rt * tempi * pp; @@ -153,9 +153,9 @@ fill_plasma_state(plasma_state_t& state, const dual_t& temp, } #if SCREEN_METHOD == SCREEN_METHOD_screen5 -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -dual_t actual_screen5 (const plasma_state_t& state, +number_t actual_screen5 (const plasma_state_t& state, const scrn::screen_factors_t& scn_fac) { // this subroutine calculates screening factors and their derivatives @@ -182,7 +182,7 @@ dual_t actual_screen5 (const plasma_state_t& state, // calculate individual screening factors amrex::Real bb = z1 * z2; - dual_t gamp = state.aa; + number_t gamp = state.aa; // In Eq.4 in Itoh:1979, this term is 2*Z_1*Z_2/(Z_1^(1/3) + Z_2^(1/3)) // However here we follow Wallace:1982 Eq. A13, which is Z_1*Z_2*(2/(Z_1+Z_2))^(1/3) @@ -191,17 +191,17 @@ dual_t actual_screen5 (const plasma_state_t& state, // Full Equation of Wallace:1982 Eq. A13 - dual_t gamef = qq * gamp; + number_t gamef = qq * gamp; // Full version of Eq.6 in Itoh:1979 with extra 1/3 factor // the extra 1/3 factor is there for convenience. // tau12 = Eq.6 / 3 - dual_t tau12 = state.taufac * scn_fac.aznut; + number_t tau12 = state.taufac * scn_fac.aznut; // alph12 = 3*gamma_ij/tau_ij - dual_t alph12 = gamef / tau12; + number_t alph12 = gamef / tau12; // limit alph12 to 1.6 to prevent unphysical behavior. @@ -223,9 +223,9 @@ dual_t actual_screen5 (const plasma_state_t& state, // Full version of Eq. 19 in Graboske:1973 by considering weak regime // and Wallace:1982 Eq. A14. Here the degeneracy factor is assumed to be 1. - dual_t h12w = bb * state.qlam0z; + number_t h12w = bb * state.qlam0z; - dual_t h12 = h12w; + number_t h12 = h12w; // intermediate and strong sceening regime @@ -233,32 +233,32 @@ dual_t actual_screen5 (const plasma_state_t& state, // gamma_ij^(1/4) - dual_t gamp14 = admath::pow(gamp, 0.25_rt); + number_t gamp14 = admath::pow(gamp, 0.25_rt); // Here we follow Eq. A9 in Wallace:1982 // See Eq. 25 Alastuey:1978, Eq. 16 and 17 in Jancovici:1977 for reference - dual_t cc = 0.896434e0_rt * gamp * scn_fac.zhat + number_t cc = 0.896434e0_rt * gamp * scn_fac.zhat - 3.44740e0_rt * gamp14 * scn_fac.zhat2 - 0.5551e0_rt * (admath::log(gamp) + scn_fac.lzav) - 2.996e0_rt; // (3gamma_ij/tau_ij)^3 - dual_t a3 = alph12 * alph12 * alph12; + number_t a3 = alph12 * alph12 * alph12; // Part of Eq. 28 in Alastuey:1978 - dual_t rr = (5.0_rt/32.0_rt) - alph12*(0.014e0_rt + 0.0128e0_rt*alph12); + number_t rr = (5.0_rt/32.0_rt) - alph12*(0.014e0_rt + 0.0128e0_rt*alph12); // Part of Eq. 28 in Alastuey:1978 - dual_t ss = tau12*rr; + number_t ss = tau12*rr; // Part of Eq. 31 in Alastuey:1978 - dual_t tt = -0.0098e0_rt + 0.0048e0_rt*alph12; + number_t tt = -0.0098e0_rt + 0.0048e0_rt*alph12; // Part of Eq. 31 in Alastuey:1978 - dual_t uu = 0.0055e0_rt + alph12*tt; + number_t uu = 0.0055e0_rt + alph12*tt; // Part of Eq. 31 in Alastuey:1978 - dual_t vv = gamef * alph12 * uu; + number_t vv = gamef * alph12 * uu; // Exponent of Eq. 32 in Alastuey:1978, which uses Eq.28 and Eq.31 // Strong screening factor @@ -268,7 +268,7 @@ dual_t actual_screen5 (const plasma_state_t& state, // This is an extra factor to account for quantum effects rr = 1.0_rt - 0.0562e0_rt*a3; - dual_t xlgfac; + number_t xlgfac; // In extreme case, rr is 0.77, see conclusion in Alastuey:1978 if (rr >= 0.77e0_rt) { @@ -306,9 +306,9 @@ dual_t actual_screen5 (const plasma_state_t& state, } #elif SCREEN_METHOD == SCREEN_METHOD_chugunov2007 -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -dual_t chugunov2007 (const plasma_state_t& state, +number_t chugunov2007 (const plasma_state_t& state, const scrn::screen_factors_t& scn_fac) { // Calculates screening factors based on Chugunov et al. 2007, following the @@ -351,7 +351,7 @@ dual_t chugunov2007 (const plasma_state_t& state, amrex::Real T_p = T_p_factor * std::sqrt(z_factor * n_i / m_i); // Normalized temperature - dual_t T_norm = state.temp / T_p; + number_t T_norm = state.temp / T_p; // The fit has only been verified down to T ~ 0.1 T_p, below which the rate // should be nearly temperature-independent (in the pycnonuclear regime), @@ -366,14 +366,14 @@ dual_t chugunov2007 (const plasma_state_t& state, } else if (T_norm <= T_norm_fade) { // blend using a cosine, after MESA constexpr amrex::Real delta_T = T_norm_fade - T_norm_min; - dual_t tmp = M_PI * (T_norm - T_norm_min) / delta_T; - dual_t f = 0.5_rt * (1.0_rt - admath::cos(tmp)); + number_t tmp = M_PI * (T_norm - T_norm_min) / delta_T; + number_t f = 0.5_rt * (1.0_rt - admath::cos(tmp)); T_norm = (1.0_rt - f) * T_norm_min + f * T_norm; } - dual_t inv_T_norm = 1.0_rt / T_norm; + number_t inv_T_norm = 1.0_rt / T_norm; // Coulomb coupling parameter from Yakovlev 2006 eq. 10 - dual_t Gamma = state.gamma_e_fac*scn_fac.z1*scn_fac.z2 / (scn_fac.ztilde*T_p) * inv_T_norm; + number_t Gamma = state.gamma_e_fac*scn_fac.z1*scn_fac.z2 / (scn_fac.ztilde*T_p) * inv_T_norm; // The fit for Gamma is only applicable up to ~600, so smoothly cap its value constexpr amrex::Real Gamma_fade = 590; @@ -385,23 +385,23 @@ dual_t chugunov2007 (const plasma_state_t& state, } else if (Gamma >= Gamma_fade) { // blend using a cosine, after MESA constexpr amrex::Real delta_gamma = Gamma_max - Gamma_fade; - dual_t tmp = M_PI * (Gamma - Gamma_fade) / delta_gamma; - dual_t f = 0.5_rt * (1.0_rt - admath::cos(tmp)); + number_t tmp = M_PI * (Gamma - Gamma_fade) / delta_gamma; + number_t f = 0.5_rt * (1.0_rt - admath::cos(tmp)); Gamma = (1.0_rt - f) * Gamma + f * Gamma_max; } // Chugunov 2007 eq. 3 constexpr amrex::Real zeta_factor = 4.0_rt / (3.0_rt * GCEM_PI*GCEM_PI); - dual_t zeta = admath::cbrt(zeta_factor * (inv_T_norm*inv_T_norm)); + number_t zeta = admath::cbrt(zeta_factor * (inv_T_norm*inv_T_norm)); // Gamma tilde from Chugunov 2007 eq. 21 constexpr amrex::Real fit_alpha = 0.022_rt; - dual_t fit_beta = 0.41_rt - 0.6_rt / Gamma; - dual_t fit_gamma = 0.06_rt + 2.2_rt / Gamma; + number_t fit_beta = 0.41_rt - 0.6_rt / Gamma; + number_t fit_gamma = 0.06_rt + 2.2_rt / Gamma; // Polynomial term in Gamma tilde - dual_t poly = 1.0_rt + zeta*(fit_alpha + zeta*(fit_beta + fit_gamma*zeta)); + number_t poly = 1.0_rt + zeta*(fit_alpha + zeta*(fit_beta + fit_gamma*zeta)); - dual_t gamtilde = Gamma / admath::cbrt(poly); + number_t gamtilde = Gamma / admath::cbrt(poly); // fit parameters just after Chugunov 2007 eq. 19 constexpr amrex::Real A1 = 2.7822_rt; @@ -411,16 +411,16 @@ dual_t chugunov2007 (const plasma_state_t& state, const amrex::Real B2 = 66.07_rt; const amrex::Real B3 = 1.12_rt; const amrex::Real B4 = 65_rt; - dual_t gamtilde2 = gamtilde * gamtilde; + number_t gamtilde2 = gamtilde * gamtilde; // Chugunov 2007 eq. 19 - dual_t term1 = 1.0_rt / admath::sqrt(A2 + gamtilde); - dual_t term2 = 1.0_rt / (1.0_rt + gamtilde); - dual_t term3 = gamtilde2 / (B2 + gamtilde); - dual_t term4 = gamtilde2 / (B4 + gamtilde2); + number_t term1 = 1.0_rt / admath::sqrt(A2 + gamtilde); + number_t term2 = 1.0_rt / (1.0_rt + gamtilde); + number_t term3 = gamtilde2 / (B2 + gamtilde); + number_t term4 = gamtilde2 / (B4 + gamtilde2); - dual_t inner = A1 * term1 + A3 * term2; - dual_t h = admath::pow(gamtilde, 1.5_rt) * inner + B1 * term3 + B3 * term4; + number_t inner = A1 * term1 + A3 * term2; + number_t h = admath::pow(gamtilde, 1.5_rt) * inner + B1 * term3 + B3 * term4; // machine limit the output constexpr amrex::Real h_max = 300.e0_rt; @@ -429,9 +429,9 @@ dual_t chugunov2007 (const plasma_state_t& state, } #elif SCREEN_METHOD == SCREEN_METHOD_chugunov2009 -template +template AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -dual_t chugunov2009_f0 (const dual_t& gamma) +number_t chugunov2009_f0 (const number_t& gamma) { // Calculates the free energy per ion in a OCP, from Chugunov and DeWitt 2009 // equation 24. @@ -444,20 +444,20 @@ dual_t chugunov2009_f0 (const dual_t& gamma) constexpr amrex::Real B2 = 211.6_rt; constexpr amrex::Real B3 = -1e-4_rt; constexpr amrex::Real B4 = 0.00462_rt; - dual_t gamma_12 = admath::sqrt(gamma); + number_t gamma_12 = admath::sqrt(gamma); - dual_t term1 = gamma_12 * admath::sqrt(A2 + gamma); - dual_t term2 = admath::log(admath::sqrt(gamma / A2) + admath::sqrt(1.0_rt + gamma / A2)); - dual_t term3 = gamma_12 - admath::fast_atan(gamma_12); - dual_t term4 = admath::log(1.0_rt + gamma / B2); - dual_t term5 = admath::log(1.0_rt + gamma * gamma / B4); + number_t term1 = gamma_12 * admath::sqrt(A2 + gamma); + number_t term2 = admath::log(admath::sqrt(gamma / A2) + admath::sqrt(1.0_rt + gamma / A2)); + number_t term3 = gamma_12 - admath::fast_atan(gamma_12); + number_t term4 = admath::log(1.0_rt + gamma / B2); + number_t term5 = admath::log(1.0_rt + gamma * gamma / B4); return A1*(term1 - A2*term2) + 2.0_rt*A3*term3 + B1*(gamma - B2*term4) + 0.5_rt*B3*term5; } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -dual_t chugunov2009 (const plasma_state_t& state, +number_t chugunov2009 (const plasma_state_t& state, const scrn::screen_factors_t& scn_fac) { // Calculates screening factors based on Chugunov and DeWitt 2009, PhRvC, 80, 014611 @@ -470,14 +470,14 @@ dual_t chugunov2009 (const plasma_state_t& state, amrex::Real zcomp = scn_fac.z1 + scn_fac.z2; // Gamma_e from eq. 6 - dual_t Gamma_e = state.gamma_e_fac / state.temp; + number_t Gamma_e = state.gamma_e_fac / state.temp; // Coulomb coupling parameters for ions and compound nucleus, eqs. 7 & 9 - dual_t Gamma_1 = Gamma_e * scn_fac.z1_53; - dual_t Gamma_2 = Gamma_e * scn_fac.z2_53; - dual_t Gamma_comp = Gamma_e * scn_fac.zs53; + number_t Gamma_1 = Gamma_e * scn_fac.z1_53; + number_t Gamma_2 = Gamma_e * scn_fac.z2_53; + number_t Gamma_comp = Gamma_e * scn_fac.zs53; - dual_t Gamma_12 = Gamma_e * z1z2 / scn_fac.ztilde; + number_t Gamma_12 = Gamma_e * z1z2 / scn_fac.ztilde; // Coulomb barrier penetrability, eq. 10 @@ -485,34 +485,34 @@ dual_t chugunov2009 (const plasma_state_t& state, 27.0_rt/2.0_rt * amrex::Math::powi<2>(M_PI*C::q_e*C::q_e/C::hbar) / (C::n_A*C::k_B), 1.0_rt/3.0_rt); - dual_t tau_12 = tau_factor * scn_fac.aznut / admath::cbrt(state.temp); + number_t tau_12 = tau_factor * scn_fac.aznut / admath::cbrt(state.temp); // eq. 12 - dual_t zeta = 3.0_rt * Gamma_12 / tau_12; + number_t zeta = 3.0_rt * Gamma_12 / tau_12; // additional fit parameters, eq. 25 amrex::Real y_12 = 4.0_rt * z1z2 / (zcomp * zcomp); amrex::Real c1 = 0.013_rt * y_12 * y_12; amrex::Real c2 = 0.406_rt * std::pow(y_12, 0.14_rt); - dual_t c3 = 0.062_rt * std::pow(y_12, 0.19_rt) + 1.8_rt / Gamma_12; + number_t c3 = 0.062_rt * std::pow(y_12, 0.19_rt) + 1.8_rt / Gamma_12; - dual_t t_12 = admath::cbrt(1.0_rt + zeta*(c1 + zeta*(c2 + c3*zeta))); + number_t t_12 = admath::cbrt(1.0_rt + zeta*(c1 + zeta*(c2 + c3*zeta))); // strong screening enhancement factor, eq. 23, replacing tau_ij with t_ij // Using Gamma/tau_ij gives extremely low values, while Gamma/t_ij gives // values similar to those from Chugunov 2007. - auto term1 = chugunov2009_f0(Gamma_1 / t_12); - auto term2 = chugunov2009_f0(Gamma_2 / t_12); - auto term3 = chugunov2009_f0(Gamma_comp / t_12); - dual_t h_fit = term1 + term2 - term3; + auto term1 = chugunov2009_f0(Gamma_1 / t_12); + auto term2 = chugunov2009_f0(Gamma_2 / t_12); + auto term3 = chugunov2009_f0(Gamma_comp / t_12); + number_t h_fit = term1 + term2 - term3; // weak screening correction term, eq. A3 amrex::Real corr_C = 3.0_rt*z1z2 * std::sqrt(state.z2bar/state.zbar) / (scn_fac.zs52 - scn_fac.z1_52 - scn_fac.z2_52); // corrected enhancement factor, eq. A4 - dual_t Gamma_12_2 = Gamma_12 * Gamma_12; - dual_t h12 = (corr_C + Gamma_12_2) / (1.0_rt + Gamma_12_2) * h_fit; + number_t Gamma_12_2 = Gamma_12 * Gamma_12; + number_t h12 = (corr_C + Gamma_12_2) / (1.0_rt + Gamma_12_2) * h_fit; // machine limit the output constexpr amrex::Real h12_max = 300.e0_rt; @@ -521,9 +521,9 @@ dual_t chugunov2009 (const plasma_state_t& state, } #elif SCREEN_METHOD == SCREEN_METHOD_chabrier1998 -template +template AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -dual_t chabrier1998_helmholtz_F(const dual_t& gamma) { +number_t chabrier1998_helmholtz_F(const number_t& gamma) { // Helmholtz free energy, See Chabrier & Potekhin 1998 Eq. 28 // Fitted parameters, see Chabrier & Potekhin 1998 Sec.IV @@ -534,18 +534,18 @@ dual_t chabrier1998_helmholtz_F(const dual_t& gamma) { constexpr amrex::Real A_3 = -0.5_rt * gcem::sqrt(3.0_rt) - A_1 / sqrt_A2; // Compute the square root terms individually, for simpler code - const dual_t sqrt_gamma = admath::sqrt(gamma); - const dual_t term3 = admath::sqrt(1.0_rt + gamma / A_2); - const dual_t term1 = sqrt_gamma * sqrt_A2 * term3; - const dual_t term2 = sqrt_gamma / sqrt_A2; + const number_t sqrt_gamma = admath::sqrt(gamma); + const number_t term3 = admath::sqrt(1.0_rt + gamma / A_2); + const number_t term1 = sqrt_gamma * sqrt_A2 * term3; + const number_t term2 = sqrt_gamma / sqrt_A2; return A_1 * (term1 - A_2 * admath::log(term2 + term3)) + 2.0_rt * A_3 * (sqrt_gamma - admath::fast_atan(sqrt_gamma)); } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -dual_t chabrier1998 (const plasma_state_t& state, +number_t chabrier1998 (const plasma_state_t& state, const scrn::screen_factors_t& scn_fac) { // Calculates screening factors based on Chabrier & Potekhin 1998, @@ -560,35 +560,35 @@ dual_t chabrier1998 (const plasma_state_t& state, // Alastuey 1978 // Eq. 2 in Chabrier & Potekhin 1998 - dual_t Gamma_e = state.gamma_e_fac / state.temp; + number_t Gamma_e = state.gamma_e_fac / state.temp; // See Calder2007 appendix Eq. A9 - dual_t Gamma1 = Gamma_e * scn_fac.z1_53; - dual_t Gamma2 = Gamma_e * scn_fac.z2_53; - dual_t Gamma12 = Gamma_e * scn_fac.zs53; + number_t Gamma1 = Gamma_e * scn_fac.z1_53; + number_t Gamma2 = Gamma_e * scn_fac.z2_53; + number_t Gamma12 = Gamma_e * scn_fac.zs53; // Helmholtz free energy - dual_t f1 = chabrier1998_helmholtz_F(Gamma1); - dual_t f2 = chabrier1998_helmholtz_F(Gamma2); - dual_t f12 = chabrier1998_helmholtz_F(Gamma12); + number_t f1 = chabrier1998_helmholtz_F(Gamma1); + number_t f2 = chabrier1998_helmholtz_F(Gamma2); + number_t f12 = chabrier1998_helmholtz_F(Gamma12); // Now we add quantum correction terms discussed in Alastuey 1978. // Notice in Alastuey 1978, they have a different classical term, // which is implemented in the strong screening limit of our screen5 routine. - dual_t quantum_corr_1 = 0.0_rt; - dual_t quantum_corr_2 = 0.0_rt; + number_t quantum_corr_1 = 0.0_rt; + number_t quantum_corr_2 = 0.0_rt; if (screening_rp::enable_chabrier1998_quantum_corr) { // See Wallace1982, Eq. A13 constexpr amrex::Real CBRT_2 = gcem::pow(2.0_rt, 1.0_rt/3.0_rt); - dual_t Gamma_eff = CBRT_2 * scn_fac.z1 * scn_fac.z2 * + number_t Gamma_eff = CBRT_2 * scn_fac.z1 * scn_fac.z2 * scn_fac.zs13inv * Gamma_e; // TAU/3, see Wallace1982, Eq. A2 - dual_t tau12 = state.taufac * scn_fac.aznut; + number_t tau12 = state.taufac * scn_fac.aznut; // see Calder 2007 Eq. A8 - dual_t b_fac = Gamma_eff / tau12; + number_t b_fac = Gamma_eff / tau12; // Quantum correction terms (same as screen5) //see Calder 2007 Eq.A8 and Alastuey1978, Eq. 24 and 31 @@ -606,7 +606,7 @@ dual_t chabrier1998 (const plasma_state_t& state, // is that we replaced the classical term which is f1 + f2 - f12 // using results from Chabrier&Potekhin1998. - dual_t h12 = f1 + f2 - f12 + quantum_corr_1 + quantum_corr_2; + number_t h12 = f1 + f2 - f12 + quantum_corr_1 + quantum_corr_2; constexpr amrex::Real h12_max = 300.0_rt; h12 = admath::min(h12_max, h12); @@ -615,12 +615,12 @@ dual_t chabrier1998 (const plasma_state_t& state, } #endif -template +template AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -dual_t actual_screen(const plasma_state_t& state, +number_t actual_screen(const plasma_state_t& state, const scrn::screen_factors_t& scn_fac) { - dual_t scor; + number_t scor; #if SCREEN_METHOD == SCREEN_METHOD_null // null screening amrex::ignore_unused(state, scn_fac); @@ -637,15 +637,15 @@ dual_t actual_screen(const plasma_state_t& state, return scor; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE -void actual_screen(const plasma_state_t& state, +void actual_screen(const plasma_state_t& state, const scrn::screen_factors_t& scn_fac, amrex::Real& scor, amrex::Real& scordt) { - dual_t scor_dual; + number_t scor_dual; scor_dual = actual_screen(state, scn_fac); - if constexpr (autodiff::detail::isDual) { + if constexpr (autodiff::detail::isDual) { scor = autodiff::val(scor_dual); scordt = autodiff::derivative(scor_dual); } else { diff --git a/sphinx_docs/source/autodiff.rst b/sphinx_docs/source/autodiff.rst index 8cc65aac9f..5b57a31268 100644 --- a/sphinx_docs/source/autodiff.rst +++ b/sphinx_docs/source/autodiff.rst @@ -14,7 +14,7 @@ machinery needed for use in Microphysics is located in Most functions can be updated to support ``autodiff`` by adding a template parameter for the numeric type (the current code calls it -``dual_t``). This should be used for any values that depend on the +``number_t``). This should be used for any values that depend on the variables we're differentiating with respect to. Calls to functions from ```` as well as ``amrex::min`` and ``amrex::max`` can be replaced with ones in the ``admath`` namespace. This namespace also @@ -22,7 +22,7 @@ exports the original functions, so they work fine on normal numeric types too. To manually check whether a type is a dual number or not, use -``autodiff::detail::isDual``. +``autodiff::detail::isDual``. Derivatives of single-variable functions ======================================== @@ -71,19 +71,19 @@ following example program: using namespace amrex::literals; - template - dual_t f(const dual_t& x, const dual_t& y) { + template + number_t f(const number_t& x, const number_t& y) { return y * admath::sin(x) + admath::exp(y); } int main() { - using dual_t = autodiff::dual_array<1, 2>; - dual_t result; - dual_t x_dual = 2.41, y_dual = 0.38; + using number_t = autodiff::dual_array<1, 2>; + number_t result; + number_t x_dual = 2.41, y_dual = 0.38; // seed the inputs autodiff::seed_array(x_dual, y_dual); // compute the function and both derivatives in a single pass - dual_t result = f(x_dual, y_dual); + number_t result = f(x_dual, y_dual); auto [dfdx, dfdy] = autodiff::derivative(result); std::cout << "f(" << x << ", " << y << ") = " << autodiff::val(result) << "\n"; diff --git a/unit_test/test_screening_templated/screening_util.cpp b/unit_test/test_screening_templated/screening_util.cpp index cfa17ae183..2cfac1fb8e 100644 --- a/unit_test/test_screening_templated/screening_util.cpp +++ b/unit_test/test_screening_templated/screening_util.cpp @@ -20,9 +20,9 @@ using namespace amrex; using namespace unit_test_rp; // for whatever reason, this doesn't work when inlined -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void maybe_seed(dual_t& value) { +void maybe_seed(number_t& value) { if constexpr (do_T_derivatives) { autodiff::seed(value); } @@ -62,8 +62,8 @@ void screen_test_C(const Box& bx, } constexpr int do_T_derivatives = 1; - using dual_t = std::conditional_t; - dual_t temp_zone = std::pow(10.0, std::log10(temp_min) + static_cast(j)*dlogT); + using number_t = std::conditional_t; + number_t temp_zone = std::pow(10.0, std::log10(temp_min) + static_cast(j)*dlogT); maybe_seed(temp_zone); Real dens_zone = std::pow(10.0, std::log10(dens_min) + static_cast(i)*dlogrho); @@ -76,7 +76,7 @@ void screen_test_C(const Box& bx, } for (int loop = 0; loop < unit_test_rp::loops; ++loop) { - plasma_state_t pstate; + plasma_state_t pstate; fill_plasma_state(pstate, temp_zone, dens_zone, ymass); Real sc1a; From 17a2fa775d2f36432e75c7186545d7bc0e72df58 Mon Sep 17 00:00:00 2001 From: "Eric T. Johnson" Date: Wed, 17 Jul 2024 20:08:02 -0400 Subject: [PATCH 16/33] Rename dual_t in pynucastro networks (#1619) https://github.com/pynucastro/pynucastro/pull/759 --- networks/CNO_extras/actual_rhs.H | 6 +++--- networks/ECSN/actual_rhs.H | 6 +++--- networks/He-C-Fe-group/actual_rhs.H | 6 +++--- networks/ase/actual_rhs.H | 6 +++--- networks/ignition_reaclib/C-burn-simple/actual_rhs.H | 6 +++--- networks/ignition_reaclib/URCA-medium/actual_rhs.H | 6 +++--- networks/ignition_reaclib/URCA-simple/actual_rhs.H | 6 +++--- networks/nova/actual_rhs.H | 6 +++--- networks/nova2/actual_rhs.H | 6 +++--- networks/partition_test/actual_rhs.H | 6 +++--- networks/sn160/actual_rhs.H | 6 +++--- networks/subch_base/actual_rhs.H | 6 +++--- networks/subch_simple/actual_rhs.H | 6 +++--- 13 files changed, 39 insertions(+), 39 deletions(-) diff --git a/networks/CNO_extras/actual_rhs.H b/networks/CNO_extras/actual_rhs.H index b74804639b..6ba23deb2f 100644 --- a/networks/CNO_extras/actual_rhs.H +++ b/networks/CNO_extras/actual_rhs.H @@ -58,13 +58,13 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { // Calculate Reaclib rates - using dual_t = std::conditional_t; - dual_t temp = state.T; + using number_t = std::conditional_t; + number_t temp = state.T; if constexpr (do_T_derivatives) { // seed the dual number for temperature before calculating anything with it autodiff::seed(temp); } - plasma_state_t pstate{}; + plasma_state_t pstate{}; fill_plasma_state(pstate, temp, state.rho, Y); tf_t tfactors = evaluate_tfactors(state.T); diff --git a/networks/ECSN/actual_rhs.H b/networks/ECSN/actual_rhs.H index 0b404497ef..dd2f295be3 100644 --- a/networks/ECSN/actual_rhs.H +++ b/networks/ECSN/actual_rhs.H @@ -58,13 +58,13 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { // Calculate Reaclib rates - using dual_t = std::conditional_t; - dual_t temp = state.T; + using number_t = std::conditional_t; + number_t temp = state.T; if constexpr (do_T_derivatives) { // seed the dual number for temperature before calculating anything with it autodiff::seed(temp); } - plasma_state_t pstate{}; + plasma_state_t pstate{}; fill_plasma_state(pstate, temp, state.rho, Y); tf_t tfactors = evaluate_tfactors(state.T); diff --git a/networks/He-C-Fe-group/actual_rhs.H b/networks/He-C-Fe-group/actual_rhs.H index 8736460ae3..1823252640 100644 --- a/networks/He-C-Fe-group/actual_rhs.H +++ b/networks/He-C-Fe-group/actual_rhs.H @@ -58,13 +58,13 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { // Calculate Reaclib rates - using dual_t = std::conditional_t; - dual_t temp = state.T; + using number_t = std::conditional_t; + number_t temp = state.T; if constexpr (do_T_derivatives) { // seed the dual number for temperature before calculating anything with it autodiff::seed(temp); } - plasma_state_t pstate{}; + plasma_state_t pstate{}; fill_plasma_state(pstate, temp, state.rho, Y); tf_t tfactors = evaluate_tfactors(state.T); diff --git a/networks/ase/actual_rhs.H b/networks/ase/actual_rhs.H index 4d08b90d65..72002e6660 100644 --- a/networks/ase/actual_rhs.H +++ b/networks/ase/actual_rhs.H @@ -58,13 +58,13 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { // Calculate Reaclib rates - using dual_t = std::conditional_t; - dual_t temp = state.T; + using number_t = std::conditional_t; + number_t temp = state.T; if constexpr (do_T_derivatives) { // seed the dual number for temperature before calculating anything with it autodiff::seed(temp); } - plasma_state_t pstate{}; + plasma_state_t pstate{}; fill_plasma_state(pstate, temp, state.rho, Y); tf_t tfactors = evaluate_tfactors(state.T); diff --git a/networks/ignition_reaclib/C-burn-simple/actual_rhs.H b/networks/ignition_reaclib/C-burn-simple/actual_rhs.H index d96207d283..ab30a6d695 100644 --- a/networks/ignition_reaclib/C-burn-simple/actual_rhs.H +++ b/networks/ignition_reaclib/C-burn-simple/actual_rhs.H @@ -58,13 +58,13 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { // Calculate Reaclib rates - using dual_t = std::conditional_t; - dual_t temp = state.T; + using number_t = std::conditional_t; + number_t temp = state.T; if constexpr (do_T_derivatives) { // seed the dual number for temperature before calculating anything with it autodiff::seed(temp); } - plasma_state_t pstate{}; + plasma_state_t pstate{}; fill_plasma_state(pstate, temp, state.rho, Y); tf_t tfactors = evaluate_tfactors(state.T); diff --git a/networks/ignition_reaclib/URCA-medium/actual_rhs.H b/networks/ignition_reaclib/URCA-medium/actual_rhs.H index a6d35692e1..800806443c 100644 --- a/networks/ignition_reaclib/URCA-medium/actual_rhs.H +++ b/networks/ignition_reaclib/URCA-medium/actual_rhs.H @@ -58,13 +58,13 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { // Calculate Reaclib rates - using dual_t = std::conditional_t; - dual_t temp = state.T; + using number_t = std::conditional_t; + number_t temp = state.T; if constexpr (do_T_derivatives) { // seed the dual number for temperature before calculating anything with it autodiff::seed(temp); } - plasma_state_t pstate{}; + plasma_state_t pstate{}; fill_plasma_state(pstate, temp, state.rho, Y); tf_t tfactors = evaluate_tfactors(state.T); diff --git a/networks/ignition_reaclib/URCA-simple/actual_rhs.H b/networks/ignition_reaclib/URCA-simple/actual_rhs.H index ff15e513fb..954a9facf3 100644 --- a/networks/ignition_reaclib/URCA-simple/actual_rhs.H +++ b/networks/ignition_reaclib/URCA-simple/actual_rhs.H @@ -58,13 +58,13 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { // Calculate Reaclib rates - using dual_t = std::conditional_t; - dual_t temp = state.T; + using number_t = std::conditional_t; + number_t temp = state.T; if constexpr (do_T_derivatives) { // seed the dual number for temperature before calculating anything with it autodiff::seed(temp); } - plasma_state_t pstate{}; + plasma_state_t pstate{}; fill_plasma_state(pstate, temp, state.rho, Y); tf_t tfactors = evaluate_tfactors(state.T); diff --git a/networks/nova/actual_rhs.H b/networks/nova/actual_rhs.H index 8f3e7c1c60..77d0021022 100644 --- a/networks/nova/actual_rhs.H +++ b/networks/nova/actual_rhs.H @@ -58,13 +58,13 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { // Calculate Reaclib rates - using dual_t = std::conditional_t; - dual_t temp = state.T; + using number_t = std::conditional_t; + number_t temp = state.T; if constexpr (do_T_derivatives) { // seed the dual number for temperature before calculating anything with it autodiff::seed(temp); } - plasma_state_t pstate{}; + plasma_state_t pstate{}; fill_plasma_state(pstate, temp, state.rho, Y); tf_t tfactors = evaluate_tfactors(state.T); diff --git a/networks/nova2/actual_rhs.H b/networks/nova2/actual_rhs.H index 6cb140fd89..5ea5298963 100644 --- a/networks/nova2/actual_rhs.H +++ b/networks/nova2/actual_rhs.H @@ -58,13 +58,13 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { // Calculate Reaclib rates - using dual_t = std::conditional_t; - dual_t temp = state.T; + using number_t = std::conditional_t; + number_t temp = state.T; if constexpr (do_T_derivatives) { // seed the dual number for temperature before calculating anything with it autodiff::seed(temp); } - plasma_state_t pstate{}; + plasma_state_t pstate{}; fill_plasma_state(pstate, temp, state.rho, Y); tf_t tfactors = evaluate_tfactors(state.T); diff --git a/networks/partition_test/actual_rhs.H b/networks/partition_test/actual_rhs.H index 72296fab0e..18614f0339 100644 --- a/networks/partition_test/actual_rhs.H +++ b/networks/partition_test/actual_rhs.H @@ -58,13 +58,13 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { // Calculate Reaclib rates - using dual_t = std::conditional_t; - dual_t temp = state.T; + using number_t = std::conditional_t; + number_t temp = state.T; if constexpr (do_T_derivatives) { // seed the dual number for temperature before calculating anything with it autodiff::seed(temp); } - plasma_state_t pstate{}; + plasma_state_t pstate{}; fill_plasma_state(pstate, temp, state.rho, Y); tf_t tfactors = evaluate_tfactors(state.T); diff --git a/networks/sn160/actual_rhs.H b/networks/sn160/actual_rhs.H index 3ff15b8115..19b6fe1af3 100644 --- a/networks/sn160/actual_rhs.H +++ b/networks/sn160/actual_rhs.H @@ -58,13 +58,13 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { // Calculate Reaclib rates - using dual_t = std::conditional_t; - dual_t temp = state.T; + using number_t = std::conditional_t; + number_t temp = state.T; if constexpr (do_T_derivatives) { // seed the dual number for temperature before calculating anything with it autodiff::seed(temp); } - plasma_state_t pstate{}; + plasma_state_t pstate{}; fill_plasma_state(pstate, temp, state.rho, Y); tf_t tfactors = evaluate_tfactors(state.T); diff --git a/networks/subch_base/actual_rhs.H b/networks/subch_base/actual_rhs.H index c1fae4ff7e..1b0edff51b 100644 --- a/networks/subch_base/actual_rhs.H +++ b/networks/subch_base/actual_rhs.H @@ -58,13 +58,13 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { // Calculate Reaclib rates - using dual_t = std::conditional_t; - dual_t temp = state.T; + using number_t = std::conditional_t; + number_t temp = state.T; if constexpr (do_T_derivatives) { // seed the dual number for temperature before calculating anything with it autodiff::seed(temp); } - plasma_state_t pstate{}; + plasma_state_t pstate{}; fill_plasma_state(pstate, temp, state.rho, Y); tf_t tfactors = evaluate_tfactors(state.T); diff --git a/networks/subch_simple/actual_rhs.H b/networks/subch_simple/actual_rhs.H index 9e86ce9ddf..17481e41d7 100644 --- a/networks/subch_simple/actual_rhs.H +++ b/networks/subch_simple/actual_rhs.H @@ -58,13 +58,13 @@ void evaluate_rates(const burn_t& state, T& rate_eval) { // Calculate Reaclib rates - using dual_t = std::conditional_t; - dual_t temp = state.T; + using number_t = std::conditional_t; + number_t temp = state.T; if constexpr (do_T_derivatives) { // seed the dual number for temperature before calculating anything with it autodiff::seed(temp); } - plasma_state_t pstate{}; + plasma_state_t pstate{}; fill_plasma_state(pstate, temp, state.rho, Y); tf_t tfactors = evaluate_tfactors(state.T); From 83817c08f1adeb5d18e78d72c89706c0946be91a Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Thu, 18 Jul 2024 14:09:43 -0400 Subject: [PATCH 17/33] update the test_nse_net test to also test the NSE EOS (#1621) this follows the same test that is done in the test_nse_interp test. --- unit_test/test_nse_net/burn_cell.H | 57 +++++++++++++++++++ .../ci-benchmarks/nse_net_unit_test.out | 9 ++- 2 files changed, 63 insertions(+), 3 deletions(-) diff --git a/unit_test/test_nse_net/burn_cell.H b/unit_test/test_nse_net/burn_cell.H index 196684312c..6d268dcaeb 100644 --- a/unit_test/test_nse_net/burn_cell.H +++ b/unit_test/test_nse_net/burn_cell.H @@ -66,5 +66,62 @@ void burn_cell_c() std::cout << "We're not in NSE. " << std::endl; } + // now test the EOS+NSE function. The basic idea is the following: + // + // 1. find the e corresponding to the current NSE state (eos_input_rt) + // 2. perturb e and then call the NSE EOS to get the updated T and abar + // 3. call the NSE function explicitly with the new T to get the X's + // (since the NSE EOS doesn't return these). + // 4. call the EOS with this new T (eos_input_rt) and updated NSE + // composition and see if we recover the same perturbed e + + eos_t eos_state; + eos_state.T = state.T; + eos_state.rho = state.rho; + for (int n = 0; n < NumSpec; ++n) { + eos_state.xn[n] = state.y[SFS+n] / state.rho; + } + + // get the initial e and abar corresponding to this T + + eos(eos_input_rt, eos_state); + + amrex::Real abar_start = eos_state.abar; + amrex::Real e_start = eos_state.e; + + // now perturb e and find the T/abar that are consistent with it + // and NSE + + amrex::Real e_new = eos_state.e * 1.05; + + eos_state.e = e_new; + + amrex::Real T_new{eos_state.T}; + amrex::Real abar_new{}; + + nse_T_abar_from_e(eos_state.rho, eos_state.e, ye, + T_new, abar_new, + state.mu_p, state.mu_n); + + std::cout << "change in T: " << eos_state.T << " " << T_new << std::endl; + std::cout << "change in abar: " << abar_start << " " << abar_new << std::endl; + + // now try calling the EOS with this T and composition and see if + // we get back the same energy. we need to recompute the NSE + // state here since we didn't get the mass fractions from the EOS call + + state.T = T_new; + auto nse_state = get_actual_nse_state(state, 1.e-10, true); + + for (int n = 0; n < NumSpec; ++n) { + eos_state.xn[n] = nse_state.xn[n]; + } + + eos_state.T = T_new; + + eos(eos_input_rt, eos_state); + + std::cout << "recovered energy: " << eos_state.e << " " << e_new << std::endl; + } #endif diff --git a/unit_test/test_nse_net/ci-benchmarks/nse_net_unit_test.out b/unit_test/test_nse_net/ci-benchmarks/nse_net_unit_test.out index 2af0ee8961..281decae17 100644 --- a/unit_test/test_nse_net/ci-benchmarks/nse_net_unit_test.out +++ b/unit_test/test_nse_net/ci-benchmarks/nse_net_unit_test.out @@ -1,5 +1,5 @@ -Initializing AMReX (23.07-445-gc09c45c31007)... -AMReX (23.07-445-gc09c45c31007) initialized +Initializing AMReX (24.07-16-gdcb9cc0383dc)... +AMReX (24.07-16-gdcb9cc0383dc) initialized starting the single zone burn... reading in network electron-capture / beta-decay tables... chemical potential of proton is -3 @@ -32,4 +32,7 @@ Cr48 : 0.009963899266 Fe52 : 0.05965982508 Ni56 : 0.2350349989 We're in NSE. -AMReX (23.07-445-gc09c45c31007) finalized +change in T: 6000000000 6069004548 +change in abar: 6.978480599 6.209860332 +recovered energy: 2.785016793e+18 2.785016799e+18 +AMReX (24.07-16-gdcb9cc0383dc) finalized From 2456fd1ee64a1f6341f560cc3ed9c780ac32646b Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Sat, 20 Jul 2024 15:19:03 -0400 Subject: [PATCH 18/33] fix circular include in hybrj (#1623) --- util/hybrj/hybrj_r1mpyq.H | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/hybrj/hybrj_r1mpyq.H b/util/hybrj/hybrj_r1mpyq.H index 1a1bb9bedc..ff05403e3a 100644 --- a/util/hybrj/hybrj_r1mpyq.H +++ b/util/hybrj/hybrj_r1mpyq.H @@ -1,7 +1,7 @@ #ifndef HYBRJ_R1MPYQ_H #define HYBRJ_R1MPYQ_H -#include +#include // given an m by n matrix a, this subroutine computes a*q where // q is the product of 2*(n - 1) transformations From ed95f6edb305bc4797b0e9fabb7b5f15881767cd Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Sat, 20 Jul 2024 15:19:22 -0400 Subject: [PATCH 19/33] fix some clang-tidy issues in nse_net / hybrj (#1624) --- nse_solver/nse_solver.H | 2 +- unit_test/test_nse_net/burn_cell.H | 1 - util/hybrj/hybrj.H | 30 +++++++++++++++--------------- util/hybrj/hybrj_dogleg.H | 6 +++--- util/hybrj/hybrj_enorm.H | 6 +++--- util/hybrj/hybrj_type.H | 8 ++------ util/microphysics_sort.H | 2 +- 7 files changed, 25 insertions(+), 30 deletions(-) diff --git a/nse_solver/nse_solver.H b/nse_solver/nse_solver.H index 1793c38f6d..ad6170191c 100644 --- a/nse_solver/nse_solver.H +++ b/nse_solver/nse_solver.H @@ -123,7 +123,7 @@ void compute_coulomb_contribution(amrex::Array1D& u_c, // see appendix of Calder 2007, doi:10.1086/510709 for more detail // reuse existing implementation from screening routine - amrex::Real f = chabrier1998_helmholtz_F(gamma); + auto f = chabrier1998_helmholtz_F(gamma); // // Here u_c is a dimensionless quantity. diff --git a/unit_test/test_nse_net/burn_cell.H b/unit_test/test_nse_net/burn_cell.H index 6d268dcaeb..2d1cde714a 100644 --- a/unit_test/test_nse_net/burn_cell.H +++ b/unit_test/test_nse_net/burn_cell.H @@ -87,7 +87,6 @@ void burn_cell_c() eos(eos_input_rt, eos_state); amrex::Real abar_start = eos_state.abar; - amrex::Real e_start = eos_state.e; // now perturb e and find the T/abar that are consistent with it // and NSE diff --git a/util/hybrj/hybrj.H b/util/hybrj/hybrj.H index 9ca275a10e..05ab7310c0 100644 --- a/util/hybrj/hybrj.H +++ b/util/hybrj/hybrj.H @@ -108,7 +108,7 @@ void hybrj(hybrj_t& hj, if (iter == 1) { if (hj.mode != 2) { - for (int j = 1; j <= hj.n; ++j) { + for (int j = 1; j <= neqs; ++j) { hj.diag(j) = hj.wa2(j); if (hj.wa2(j) == 0.0_rt) { hj.diag(j) = 1.0_rt; @@ -122,7 +122,7 @@ void hybrj(hybrj_t& hj, for (int j = 1; j <= neqs; ++j) { hj.wa3(j) = hj.diag(j) * hj.x(j); } - xnorm = enorm(hj.n, hj.wa3); + xnorm = enorm(neqs, hj.wa3); delta = factor * xnorm; if (delta == 0.0_rt) { delta = factor; @@ -131,17 +131,17 @@ void hybrj(hybrj_t& hj, // form (q transpose)*fvec and store in qtf. - for (int i = 1; i <= hj.n; ++i) { + for (int i = 1; i <= neqs; ++i) { hj.qtf(i) = hj.fvec(i); } for (int j = 1; j <= neqs; ++j) { if (hj.fjac(j,j) != 0.0_rt) { amrex::Real sum = 0.0_rt; - for (int i = j; i <= hj.n; ++i) { + for (int i = j; i <= neqs; ++i) { sum += hj.fjac(i,j) * hj.qtf(i); } amrex::Real temp = -sum / hj.fjac(j,j); - for (int i = j; i <= hj.n; ++i) { + for (int i = j; i <= neqs; ++i) { hj.qtf(i) += hj.fjac(i,j) * temp; } } @@ -151,7 +151,7 @@ void hybrj(hybrj_t& hj, bool sing = false; - for (int j = 1; j <= hj.n; ++j) { + for (int j = 1; j <= neqs; ++j) { int l = j; int jm1 = j - 1; if (jm1 >= 1) { @@ -173,7 +173,7 @@ void hybrj(hybrj_t& hj, // rescale if necessary. if (hj.mode != 2) { - for (int j = 1; j <= hj.n; ++j) { + for (int j = 1; j <= neqs; ++j) { hj.diag(j) = amrex::max(hj.diag(j), hj.wa2(j)); } } @@ -207,7 +207,7 @@ void hybrj(hybrj_t& hj, hj.wa3(j) = hj.diag(j) * hj.wa1(j); } - amrex::Real pnorm = enorm(hj.n, hj.wa3); + amrex::Real pnorm = enorm(neqs, hj.wa3); // on the first iteration, adjust the initial step bound. @@ -225,7 +225,7 @@ void hybrj(hybrj_t& hj, break; } - amrex::Real fnorm1 = enorm(hj.n, hj.wa4); + amrex::Real fnorm1 = enorm(neqs, hj.wa4); // compute the scaled actual reduction. @@ -237,7 +237,7 @@ void hybrj(hybrj_t& hj, // compute the scaled predicted reduction. int l = 1; - for (int i = 1; i <= hj.n; ++i) { + for (int i = 1; i <= neqs; ++i) { amrex::Real sum = 0.0_rt; for (int j = i; j <= neqs; ++j) { sum += hj.r(l) * hj.wa1(j); @@ -245,7 +245,7 @@ void hybrj(hybrj_t& hj, } hj.wa3(i) = hj.qtf(i) + sum; } - amrex::Real temp = enorm(hj.n, hj.wa3); + amrex::Real temp = enorm(neqs, hj.wa3); amrex::Real prered = 0.0_rt; if (temp < fnorm) { prered = 1.0_rt - amrex::Math::powi<2>(temp/fnorm); @@ -282,13 +282,13 @@ void hybrj(hybrj_t& hj, // successful iteration. update x, fvec, and their norms. - for (int j = 1; j <= hj.n; ++j) { + for (int j = 1; j <= neqs; ++j) { hj.x(j) = hj.wa2(j); hj.wa2(j) = hj.diag(j) * hj.x(j); hj.fvec(j) = hj.wa4(j); } - xnorm = enorm(hj.n, hj.wa2); + xnorm = enorm(neqs, hj.wa2); fnorm = fnorm1; iter++; } @@ -348,9 +348,9 @@ void hybrj(hybrj_t& hj, break; } - for (int j = 1; j <= hj.n; ++j) { + for (int j = 1; j <= neqs; ++j) { amrex::Real sum = 0.0_rt; - for (int i = 1; i <= hj.n; ++i) { + for (int i = 1; i <= neqs; ++i) { sum += hj.fjac(i,j) * hj.wa4(i); } hj.wa2(j) = (sum - hj.wa3(j)) / pnorm; diff --git a/util/hybrj/hybrj_dogleg.H b/util/hybrj/hybrj_dogleg.H index c8a61dd8e9..88d17c32b4 100644 --- a/util/hybrj/hybrj_dogleg.H +++ b/util/hybrj/hybrj_dogleg.H @@ -43,9 +43,9 @@ template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void dogleg(amrex::Array1D& r, - amrex::Array1D& diag, - amrex::Array1D& qtb, +void dogleg(const amrex::Array1D& r, + const amrex::Array1D& diag, + const amrex::Array1D& qtb, amrex::Real delta, amrex::Array1D& x, amrex::Array1D& wa1, diff --git a/util/hybrj/hybrj_enorm.H b/util/hybrj/hybrj_enorm.H index 60cbe91467..f2f6a137f5 100644 --- a/util/hybrj/hybrj_enorm.H +++ b/util/hybrj/hybrj_enorm.H @@ -24,12 +24,12 @@ template AMREX_GPU_HOST_DEVICE AMREX_INLINE -amrex::Real enorm(const int n, amrex::Array1D& x) { +amrex::Real enorm(const int n, const amrex::Array1D& x) { // note: n <= neqs - const amrex::Real rdwarf = 3.834e-20_rt; - const amrex::Real rgiant = 1.304e19_rt; + constexpr amrex::Real rdwarf = 3.834e-20_rt; + constexpr amrex::Real rgiant = 1.304e19_rt; amrex::Real s1 = 0.0_rt; amrex::Real s2 = 0.0_rt; diff --git a/util/hybrj/hybrj_type.H b/util/hybrj/hybrj_type.H index 87de2e9cd1..90dd00697b 100644 --- a/util/hybrj/hybrj_type.H +++ b/util/hybrj/hybrj_type.H @@ -16,24 +16,20 @@ using namespace amrex::literals; // maxfev is a positive integer input variable. termination // occurs when the number of calls to fcn with iflag = 1 // has reached maxfev. -const int maxfev = 1000; +constexpr int maxfev = 1000; // factor is a positive input variable used in determining the // initial step bound. this bound is set to the product of // factor and the euclidean norm of diag*x if nonzero, or else // to factor itself. in most cases factor should lie in the // interval (.1,100.). 100. is a generally recommended value. -const amrex::Real factor = 100.0_rt; +constexpr amrex::Real factor = 100.0_rt; template struct hybrj_t { static_assert(neqs > 0); - // n is a positive integer input variable set to the number - // of functions and variables. - const int n = neqs; - // x is an array of length n. on input x must contain // an initial estimate of the solution vector. on output x // contains the final estimate of the solution vector. diff --git a/util/microphysics_sort.H b/util/microphysics_sort.H index 82cb6775f3..4f06ad3cc5 100644 --- a/util/microphysics_sort.H +++ b/util/microphysics_sort.H @@ -19,7 +19,7 @@ bool compare(const T& a, const T& b, const bool ascending=true) { template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void swap(T& a, T& b) { +void swap(T& a, T& b) noexcept { // Helper function for sorting functions // Swaps the position of the two input From 66beb701ba42cf7301120c22357cd47f2069389c Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Sun, 21 Jul 2024 14:49:00 -0400 Subject: [PATCH 20/33] some more constexpr in VODE (#1626) --- integration/VODE/vode_dvhin.H | 4 +++- integration/VODE/vode_dvjac.H | 2 +- integration/VODE/vode_dvnlsd.H | 10 +++++----- integration/VODE/vode_dvset.H | 2 +- integration/VODE/vode_dvstep.H | 28 ++++++++++++++-------------- 5 files changed, 24 insertions(+), 22 deletions(-) diff --git a/integration/VODE/vode_dvhin.H b/integration/VODE/vode_dvhin.H index a974322ea5..055ddc1394 100644 --- a/integration/VODE/vode_dvhin.H +++ b/integration/VODE/vode_dvhin.H @@ -1,6 +1,8 @@ #ifndef VODE_DVHIN_H #define VODE_DVHIN_H +#include + #ifdef STRANG #include #endif @@ -23,7 +25,7 @@ void dvhin (BurnT& state, DvodeT& vstate, amrex::Real& H0, int& NITER, int& IER) constexpr int int_neqs = integrator_neqs(); - const amrex::Real PT1 = 0.1e0_rt; + constexpr amrex::Real PT1 = 0.1e0_rt; NITER = 0; const amrex::Real TDIST = std::abs(vstate.tout - vstate.t); diff --git a/integration/VODE/vode_dvjac.H b/integration/VODE/vode_dvjac.H index ac66444490..5be11a5483 100644 --- a/integration/VODE/vode_dvjac.H +++ b/integration/VODE/vode_dvjac.H @@ -116,7 +116,7 @@ void dvjac (int& IERPJ, BurnT& state, DvodeT& vstate) R0 = 1.0_rt; } - const bool in_jacobian = true; + constexpr bool in_jacobian = true; for (int j = 1; j <= int_neqs; ++j) { const amrex::Real yj = vstate.y(j); diff --git a/integration/VODE/vode_dvnlsd.H b/integration/VODE/vode_dvnlsd.H index 1a4c449643..46ede5d86c 100644 --- a/integration/VODE/vode_dvnlsd.H +++ b/integration/VODE/vode_dvnlsd.H @@ -20,11 +20,11 @@ amrex::Real dvnlsd (int& NFLAG, BurnT& state, DvodeT& vstate) // It then handles the corrector phase of this integration package. // Parameter declarations - const amrex::Real CCMAX = 0.3e0_rt; - const amrex::Real CRDOWN = 0.3e0_rt; - const amrex::Real RDIV = 2.0e0_rt; - const int MAXCOR = 3; - const int MSBP = 20; + constexpr amrex::Real CCMAX = 0.3e0_rt; + constexpr amrex::Real CRDOWN = 0.3e0_rt; + constexpr amrex::Real RDIV = 2.0e0_rt; + constexpr int MAXCOR = 3; + constexpr int MSBP = 20; amrex::Real DEL{}; int M{}; diff --git a/integration/VODE/vode_dvset.H b/integration/VODE/vode_dvset.H index 962c01b4be..e9cb65ccfd 100644 --- a/integration/VODE/vode_dvset.H +++ b/integration/VODE/vode_dvset.H @@ -20,7 +20,7 @@ void dvset (DvodeT& vstate) // H*xi(i) = t sub n - t sub (n-i) // = H + TAU(1) + TAU(2) + ... TAU(i-1). - const amrex::Real CORTES = 0.1e0_rt; + constexpr amrex::Real CORTES = 0.1e0_rt; const amrex::Real FLOTL = vstate.L; const int NQM1 = vstate.NQ - 1; diff --git a/integration/VODE/vode_dvstep.H b/integration/VODE/vode_dvstep.H index 3a7c23c079..cf07a5b27e 100644 --- a/integration/VODE/vode_dvstep.H +++ b/integration/VODE/vode_dvstep.H @@ -67,20 +67,20 @@ int dvstep (BurnT& state, DvodeT& vstate) // On a successful return, ETAMAX is reset and ACOR is scaled. // Parameter declarations - const int KFC = -3; - const int KFH = -7; - const int MXNCF = 10; - const amrex::Real ADDON = 1.0e-6_rt; - const amrex::Real BIAS1 = 6.0e0_rt; - const amrex::Real BIAS2 = 6.0e0_rt; - const amrex::Real BIAS3 = 10.0e0_rt; - const amrex::Real ETACF = 0.25e0_rt; - const amrex::Real ETAMIN = 0.1e0_rt; - const amrex::Real ETAMXF = 0.2e0_rt; - const amrex::Real ETAMX2 = 10.0e0_rt; - const amrex::Real ETAMX3 = 10.0e0_rt; - const amrex::Real ONEPSM = 1.00001e0_rt; - const amrex::Real THRESH = 1.5e0_rt; + constexpr int KFC = -3; + constexpr int KFH = -7; + constexpr int MXNCF = 10; + constexpr amrex::Real ADDON = 1.0e-6_rt; + constexpr amrex::Real BIAS1 = 6.0e0_rt; + constexpr amrex::Real BIAS2 = 6.0e0_rt; + constexpr amrex::Real BIAS3 = 10.0e0_rt; + constexpr amrex::Real ETACF = 0.25e0_rt; + constexpr amrex::Real ETAMIN = 0.1e0_rt; + constexpr amrex::Real ETAMXF = 0.2e0_rt; + constexpr amrex::Real ETAMX2 = 10.0e0_rt; + constexpr amrex::Real ETAMX3 = 10.0e0_rt; + constexpr amrex::Real ONEPSM = 1.00001e0_rt; + constexpr amrex::Real THRESH = 1.5e0_rt; amrex::Real CNQUOT{}, DDN{}, DSM{}, DUP{}, TOLD{}; amrex::Real FLOTL{}, R{}; From a85dc0d6e44525fb420d455396fed7c8d692b79e Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Sun, 21 Jul 2024 16:04:59 -0400 Subject: [PATCH 21/33] switch some more min(max(..)) to std::clamp (#1627) --- EOS/helmholtz/actual_eos.H | 10 +++++----- integration/BackwardEuler/be_integrator.H | 2 +- integration/ForwardEuler/actual_integrator.H | 2 +- integration/RKC/rkc.H | 2 +- integration/integrator_type_sdc.H | 3 +-- integration/integrator_type_strang.H | 2 +- integration/utils/initial_timestep.H | 2 +- 7 files changed, 11 insertions(+), 12 deletions(-) diff --git a/EOS/helmholtz/actual_eos.H b/EOS/helmholtz/actual_eos.H index febdfe07d8..dfe8983e0c 100644 --- a/EOS/helmholtz/actual_eos.H +++ b/EOS/helmholtz/actual_eos.H @@ -156,9 +156,9 @@ void apply_electrons (T& state) // hash locate this temperature and density int jat = int((std::log10(state.T) - tlo) * tstpi) + 1; - jat = amrex::max(1, amrex::min(jat, jmax-1)) - 1; + jat = std::clamp(jat, 1, jmax-1) - 1; int iat = int((std::log10(din) - dlo) * dstpi) + 1; - iat = amrex::max(1, amrex::min(iat, imax-1)) - 1; + iat = std::clamp(iat, 1, imax-1) - 1; amrex::Real fi[36]; @@ -1005,7 +1005,7 @@ void single_iter_update (T& state, int var, int dvar, amrex::Real xnew = x - (v - v_want) / dvdx; // Don't let the temperature/density change by more than a factor of two - xnew = amrex::max(0.5_rt * x, amrex::min(xnew, 2.0_rt * x)); + xnew = std::clamp(xnew, 0.5_rt * x, 2.0_rt * x); // Don't let us freeze/evacuate xnew = amrex::max(smallx, xnew); @@ -1120,8 +1120,8 @@ void double_iter_update (T& state, int var1, int var2, // Don't let the temperature or density change by more // than a factor of two - tnew = amrex::max(0.5e0_rt * told, amrex::min(tnew, 2.0e0_rt * told)); - rnew = amrex::max(0.5e0_rt * rold, amrex::min(rnew, 2.0e0_rt * rold)); + tnew = std::clamp(tnew, 0.5e0_rt * told, 2.0e0_rt * told); + rnew = std::clamp(rnew, 0.5e0_rt * rold, 2.0e0_rt * rold); // Don't let us freeze or evacuate tnew = amrex::max(EOSData::mintemp, tnew); diff --git a/integration/BackwardEuler/be_integrator.H b/integration/BackwardEuler/be_integrator.H index 2d858a7b57..6ce4ddeb9e 100644 --- a/integration/BackwardEuler/be_integrator.H +++ b/integration/BackwardEuler/be_integrator.H @@ -272,7 +272,7 @@ int be_integrator (BurnT& state, BeT& be) // backward-Euler has a local truncation error of dt**2 amrex::Real dt_new = dt_sub * std::pow(1.0_rt / rel_error, 0.5_rt); - dt_sub = amrex::min(amrex::max(dt_new, dt_sub / 2.0), 2.0 * dt_sub); + dt_sub = std::clamp(dt_new, dt_sub / 2.0, 2.0 * dt_sub); } else { diff --git a/integration/ForwardEuler/actual_integrator.H b/integration/ForwardEuler/actual_integrator.H index e52b8cb678..6fd19d1a59 100644 --- a/integration/ForwardEuler/actual_integrator.H +++ b/integration/ForwardEuler/actual_integrator.H @@ -86,7 +86,7 @@ void clean_state (const amrex::Real time, IntT& int_state, BurnT& state) // Ensure that the temperature always stays within reasonable limits. - state.T = amrex::min(MAX_TEMP, amrex::max(state.T, EOSData::mintemp)); + state.T = std::clamp(state.T, EOSData::mintemp, MAX_TEMP); } diff --git a/integration/RKC/rkc.H b/integration/RKC/rkc.H index 55d3a3c5b4..958cffc3ca 100644 --- a/integration/RKC/rkc.H +++ b/integration/RKC/rkc.H @@ -308,7 +308,7 @@ int rkclow (BurnT& state, RkcT& rstate) } } absh = std::max(0.1_rt, fac) * absh; - absh = std::max(hmin, std::min(rstate.hmax, absh)); + absh = std::clamp(absh, hmin, rstate.hmax); errold = err; hold = h; h = tdir * absh; diff --git a/integration/integrator_type_sdc.H b/integration/integrator_type_sdc.H index 4d65e03c7e..7913d610a6 100644 --- a/integration/integrator_type_sdc.H +++ b/integration/integrator_type_sdc.H @@ -21,8 +21,7 @@ void clean_state(const amrex::Real time, BurnT& state, T& int_state) if (do_species_clip) { for (int n = 1; n <= NumSpec; ++n) { // we use 1-based indexing, so we need to offset SFS - int_state.y(SFS+n) = amrex::max(amrex::min(int_state.y(SFS+n), state.rho), - state.rho * SMALL_X_SAFE); + int_state.y(SFS+n) = std::clamp(int_state.y(SFS+n), state.rho * SMALL_X_SAFE, state.rho); } } diff --git a/integration/integrator_type_strang.H b/integration/integrator_type_strang.H index 35dfd7174f..09bc40307b 100644 --- a/integration/integrator_type_strang.H +++ b/integration/integrator_type_strang.H @@ -55,7 +55,7 @@ void clean_state (const amrex::Real time, BurnT& state, I& int_state) if (do_species_clip) { for (int n = 1; n <= NumSpec; ++n) { - int_state.y(n) = amrex::max(amrex::min(int_state.y(n), 1.0_rt), SMALL_X_SAFE); + int_state.y(n) = std::clamp(int_state.y(n), SMALL_X_SAFE, 1.0_rt); } } diff --git a/integration/utils/initial_timestep.H b/integration/utils/initial_timestep.H index 876b571103..9d7f5cd9f4 100644 --- a/integration/utils/initial_timestep.H +++ b/integration/utils/initial_timestep.H @@ -87,7 +87,7 @@ amrex::Real initial_react_dt (BurnT& burn_state, IntT& int_state, // Save the final timestep, with a bias factor. amrex::Real dt = h / 2.0_rt; - dt = amrex::min(amrex::max(h, hL), hU); + dt = std::clamp(h, hL, hU); dt = amrex::min(dt, ode_max_dt); From 3ee048ec696a4b3d34a0638814306003678deece Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Sun, 21 Jul 2024 16:05:13 -0400 Subject: [PATCH 22/33] add CNO_He_burn network (#1622) this is basically CNO_extras + subch_simple --- networks/CNO_He_burn/CNO_He_burn.png | Bin 0 -> 114151 bytes networks/CNO_He_burn/CNO_He_burn.py | 123 + networks/CNO_He_burn/Make.package | 14 + networks/CNO_He_burn/_parameters | 4 + networks/CNO_He_burn/actual_network.H | 518 ++ networks/CNO_He_burn/actual_network_data.cpp | 164 + networks/CNO_He_burn/actual_rhs.H | 2873 ++++++ networks/CNO_He_burn/inputs.burn_cell.VODE | 59 + networks/CNO_He_burn/partition_functions.H | 192 + networks/CNO_He_burn/pynucastro.net | 39 + networks/CNO_He_burn/reaclib_rates.H | 8426 ++++++++++++++++++ networks/CNO_He_burn/table_rates.H | 399 + networks/CNO_He_burn/table_rates_data.cpp | 23 + networks/CNO_He_burn/tfactors.H | 34 + 14 files changed, 12868 insertions(+) create mode 100644 networks/CNO_He_burn/CNO_He_burn.png create mode 100644 networks/CNO_He_burn/CNO_He_burn.py create mode 100644 networks/CNO_He_burn/Make.package create mode 100644 networks/CNO_He_burn/_parameters create mode 100644 networks/CNO_He_burn/actual_network.H create mode 100644 networks/CNO_He_burn/actual_network_data.cpp create mode 100644 networks/CNO_He_burn/actual_rhs.H create mode 100644 networks/CNO_He_burn/inputs.burn_cell.VODE create mode 100644 networks/CNO_He_burn/partition_functions.H create mode 100644 networks/CNO_He_burn/pynucastro.net create mode 100644 networks/CNO_He_burn/reaclib_rates.H create mode 100644 networks/CNO_He_burn/table_rates.H create mode 100644 networks/CNO_He_burn/table_rates_data.cpp create mode 100644 networks/CNO_He_burn/tfactors.H diff --git a/networks/CNO_He_burn/CNO_He_burn.png b/networks/CNO_He_burn/CNO_He_burn.png new file mode 100644 index 0000000000000000000000000000000000000000..24c454e17c45b28b699c5ba4e65ee219d0a453b0 GIT binary patch literal 114151 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

AnvILt$-fAM=reYY>V~fxqc>F@I4IM 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 CI$Lc2KaGfVUFUXy^x`OLKDrex1t&qBT|L_ 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 bSZ{KhzOnu4Bha~Z#6;z~=I=#U{|NpsZFCX7 literal 0 HcmV?d00001 diff --git a/sphinx_docs/source/ECSN.png b/sphinx_docs/source/ECSN.png new file mode 100644 index 0000000000000000000000000000000000000000..094b13c06364cb57c7ff01abd29a7f2af309a522 GIT binary patch literal 54118 zcma&Obx@p5vp$RyJV1g=vbeizf_osrg1ftW65NBkBv=w$g1bAx-QAr97TDhnd7k$@ z^_}y_w^dtE?Cjh#Jw4r5U)@dUJ4GoBR3cOu7#Iv0X>k=882DE(FmM{rkbu9Wx_+?- ze(*UoGU|_He9^bG(L<%fmV8+H}#NT{yPd`|6bN(NDBE!BL z`TW&Ieh4Z^q7~`OGZ3wQo9oM$UR`0Rps-%mab|eWAI~5~Tyon7K35)&Iy`Y^t{&*)oC@Mkue(;99hj%za*y7@fu3HzISBuJ zD2WpC^tz73d5-<~Iwhuh^)zOUM^^M{P^Vq|r@w=iXj~aF65OzJ=rCc4ZQ@+vGJj-PDKtO*VMD?oFk zCy{>nqS*F}_@AL5-yFgx*`uH`%crNp{=EF(AI!n4@ci>#@jJ=CtHgQn0Xf(95Bk3c z__PE{${{VZ_bvW!z4SB5Nnv@eJ~#IuZ{7Tk+5a<;v@W+o_qeZ^ubh_xGl|$M1X~QS z*nA&9exU*c@tW=(2YDNwzx0pMzjGoW7DS_A-#S{KX8s@BtJiBL`M)HVZREa>^rS;7 zg@RsuoYFAk0fTVv-b62w+ON^RIe>Vz%Utp0Z;@m(K1ZqL9{p9N-~Am~Z{CDLmRa}^ zZTFF(8L-EUL0L8a2CeHI`tEM-eiqp|34V?SE1f61*EsG^s+p^H!*Bx=66p-(sOin{ z{^Vu45iRtG_vb;=y+CW;;x~^lh>s`PT?M>uCbA~tLx^tf)%z#C{XJ~dku4|J%M_Hh z%vZq#LPv7>vTa80asO+4HBtD)Z(u=n3IqOQL4928t%I!SU7N{2n|;!!34SACH|V)Y zL7Pj{0z{}a<3j{797A<$g@V+QQy<;Q5Rv;4d1xON@!~)gdhr7GPqsH+=*Mea;e?## z&n+x02!h(GEXMmUG;3^0{gJV#U%&obTgzMTc03$KDgcL53Y;fG7K>V2Ym{G0i(j@E z?(K%A38Y)%tz_o5gS?N^5&p24m#FtmY%AIvLT+~UC*W&mV{$AW*2|3^90eJ!M2B;~ zjaJ(O@6HBTA_zHxdV8f?dgy@@ZhK7+r?L+9T?V_)c(>jk*MR*e5Zo{1M!+TW@L~<^ zH#A~R8qiJ#6@0`)oFZ6wBv$>_Pmc5Co;$CHg}~YmkYy-Y^VBa@1`!FG$LVP4NivBr ztL?!>T@Tt|$0D`M#ewqb{0=XkS_tzpI?Lb!aCSZV_?X8Z_wr`Wl^-KVBjnFTrcMGZa@wTAKIHa<1y9 z-a7Dvn3XO2_OZw#AyAUiXRT%bUVE^l>#0zZ#q}N4XZ%={kbzCOmAmti?UIJ0wcI$x zwa>_8D~;#FMtc)KHUi0y#m=2{n95;a-`>2xay9v$yG`QI{ z-(P9vD`gG02cp3f)jX~xe;TiK_i&};;p+?d*}$Vsb)F`)!Wtz0`ues|!~!h0XS_b# z6(o__3ZiPoA0>{Lny^~Pxh!A6sOz}AJZ?P46bnK(0E8o-&Komt*OFlrEtEJS0!<%R z6kz(K93B!P{o~d;4?+cMep!VgU8>u}%0MUJIm9(>54^9Ls2@GgDd~6*jcN)%A_Hx} z2Au|=gCG!2>KE6)R&@_ASUFn- zuQPKZ;-LR;%gc{g_`hwegcJh*mz9uj+^6?+8guYC=uaL}TDra*OFjcD@T#RGIiC02 zp*9Q_7u{c44o)rHt|DOPnHxID(fOaDdtQwY#CHdS2E#|?2TUKG#K{Y>+gy4EFD(TN z?(t=v$l%nu@wBko*JupN&41U6)G4){Eed1kMKLY?HDa%A>{d$$mjyE6q&!o&3oK|V z-HH2RnCMA5HWz~LS6Ewjn@e{%w4*M?^Suu%YbEyRpNuk2to(S_ND6rc{kqMdSg1b@ zUdP8>jl4P~GDTs`XuVtFsP<@-a57zrQ`t>z4f|i1(!~WH5`gScWaO@tOij9pUs999 z1S#KS37GD(kd-EFMRcgvH}|uJNozh?Wy+0Qd^>%eVdv6YqJ+CTqxv(p41oa)rnXEM zj(mm|ROSBB+x-`eddWEIOCdxF z2Li6MezcW$ds*_^cz|3wC$LLg#%Qv<+cVsj`oyq=Isq*j+%3o&{sap@Q*I=cEr#}= zl}Na>zuoi_SfGD!>d~zDF@~MqHSX|og zg44)omBssf`INOdD8?S#U!ggEZ^zk>9{mM>kQnk`M z%o6|PVIf^%<>25cJcTrFs@JbqPpsBDL&+c}#>Oko{1$(*+pwpJIn7&}eIQR0L1}=i zFWuWmyVN>YG{SJ`rgCPIK+>^)-yBtzT-bQTpt{b9k)D4XhWNmBHJl+38XYa-y=Ypg z>YjC48Y!M{kyuCluL^aU@M~81u~V0@+hFAI|DmtO_lRoZ3_W^VIdk+f%0y$|D3TtftSN2;)$sl1;j=hK`6Tf`-3i4ODlD$ZA}aS#~ijIo;Mi|8`D`hAk;B z{s+*5t>KJ;udl^0^|A!qn76b1nz2Ad#D8y1FRin2h2T9`v<(fFp6f&(@+X6tGRe$C zHdr=B8P%}&meI;Nk`9{*>SK9w_?{O#ZC0gC-GFF-GUDwlUQ6i>Y{tqludcNDN05tTHhF;^+fis( zownptdF+nj2=@Qc3>;VdhtBSWI&R?F^QHEfCdrna;0zHdO6H8hdt?4usy9qM&1qSf&Bx`%TKz7a0eK%Fg!xWpv*C%x zlb$CW(;}8G*OuNWf={+i`VYH8Tpn^}hsE4LRo+b0H=i{`uJiOU1(OoZ_K%ajGayIG ze+JH_wuEFLG6+@?q%Y}zpi&)fGO9;q)$!^VeqE&SyC*Scz5UBT@NzWd5ga}+0PaEh z9lbNj2Cy#=YXRX?IF+2J!kF#ks3EdaE#T~~1OB4Zo#g!R<15ANUQJgg_js<961wTB znM&=bih)u942be7ped41!Ja;1=D&*M>^pq-buq9|sQOaA2{DZ;%EQWF&+VOtt5>fw zn~s_PjabTl5Y%N#JHCQ5jb$ zLg0em^Zhmh>`xhHbnTZWK3uHL2$@^o0K-FR{zAYhrNvEBy>uPRW zIn)SZ=%8h&3&0ySlV~*- zKv5t4+dEhF*XLJ)VFQdz<9HSdxo$bZmbok0AqdES4@=ai1*+*N>jntEa8#@_VDj8c z9*2N=yw&9PnT3xmyP`PZnwsyGz5_JvlG&8tw%kLQI=4wFBiqslHoef#L_wM4+b30qnR&h>}y zCqqAa_ie5Vy<$ETeunz=<<4W-bdSMVA-rHs?R=(o9J%GHa*fDe_bF%UXRyzSZ@?|k zs^T?B$?>7@JyjtL0FnTtk$R|#Dj_cTH)8eOgrmo0n%mfHa=3An^TuuduY6HG)ESvB3>XqY)6f3ZGkf8?>U}geLm%5O<_Nbs=Ta zcQ|>(pmm(p2t#{%00PmbE?V659fHD3-ji!Eu@+hV7Q=}V`@#)NM@yS+)DzWsF($Wp z^$0b+z(+!NseDfPdPXk*mB^{wThZFIB7 z4DhsmXJWsEb%?QlHGSWFd^)Mc|I*0+npS$GSWN?ThV>@xllx;(kei<$o1EO6VwTw# zfPyQnpukk)CnJMGMdf!aKQJ_Dhx-VwXEe*cbV0ICXYg!8O-0vbI)jp+gbzyjnh1Hs zt=4Gb^<$?audb^QA^Utr}aC!DO~{mnqF6-6o>6q4OFVTpGoVQ7Q6E zuOi?iTr?$5CAW^q!b2Rsjd;aD2k8 zfUE7*+DtUwOeCxBZ$zPg%d})D5aB%_I|;$co6!qSt}iZ+X|u}s8e zDSo~+G+XOnROe&OtyNb^@u+N-vgtR2b1vk8QRvZ!8FA1Kw$ULrw51+K9gM52*54z? z4i9ky0WMx}L|>$f)va*80zqSi)3zcJ*RQ3z)yElp6f5KFyt-pO#EY@wD8v1?R;jA0 zyW$Q!QO;L#VI=9=Bmt8Y1ORg&0-CMbJw{A=6#P&s7bOi%TzdLot;0G2w>3c|5tre7 zwT2y-mVe6r!-+n`z8Kikl$jhT{^PB?P+RRY=>T}3AD`PnqX?_6jV=VVHG(;+Y z_fss@5tSMh8cdIJw6bOHb26^p4CjEX2!kCZteASm7DV9UZ#>Iqz(*D7WW0N>jU09R za35vw%KKefjz}WzT8<69xB)+=<%#0KhLJZzGF=sTckQRYMLyZIJIu;GlQa8~NCqV) zJ>!a2!AR*+vq(jtP98pKw;^CM$tWEBw2}#jd?y~$wzPNGBH5k$kT4yjG`XDXaWaMc z0UyDV$&hTnbrisNY^7-^#4SoRXrz~iSVKfbe~XI0eR8@n{Qb_>?Sp<8VJ&>W?nxU+ zv5RV?DvLRBwnd`2FgQTF%f_I{9Ho*`-i-XXNDpF-xO-fyis`QgN^U(PbzHY3D1tP2 z>DTtS^;kW4$4`6tX*4*d$9Aq480+!LO|@S^PK-Og`{ex_<{Q&l5%PAXQFL>`P{~nJ zOU|jGn>2T;ec}U_S@oRtFzJ;i!ty7Dd=K^D0!>@<3?vPtm`CYIP&w8DYI67Q5g`RJ zmZMvrasE{9nKWr;{8+?4xObvu zmZC&L8cpOq3qwP}sxi`#*H%PR;|QAh(MuE^Dc08$>Eq2_C0(5VsA#!~>_aNFch5MW z60A;*wG`+eWP{GA&SzE~`3oM53p^+V7T_6y{?yLa{E>GfQ}x|O$RQZvR141vCKxYg zGLx&rI;&J+a<^O!2DT#6`R>)DcrR->Q__^K7idmphMWxAHamQXo^Zy~r?WT4!A(4< zxE)c#B6a^!=n$tuvjA(flB;h3T9P`LGRRDAhRk$S(IH0vDFCJHOrervb&~Yo z7v0RT@nKyfYkel*xI2;Au9w_khTb)NmL!mo?2Ns*zZ}waGL(gtSE3?3^FStt#e8~8 zhQ=J*j>@o`XV)Ya_(=6WU9AAxan(;LU_IK~A7{e`J^GzOAqM-J`4&1?&dtkE#u7)x z-iqhlyBLzA%nter0f)-fLgDJ%Exn0f&dl_Pq`1HN8v9HcL%nyxWX5~tizK^#%cF}C zM@xJOedO+Ao*U1p8*MFM4U@ifXw#KVwr6Fnu_GcS8N4Rtkjvy|gu?39%#gUHAK+0kQeJA#1Srp|8fT?Cv8oWEj7lOQ z=~}A#dIPU2IzI|K8y|moD#*Ygu0`lZy&8|bieUk}O_0GK+PzL$+~;U&AfGA&UCT^d z_yR0k$^URFI2-cgu!yA%N_Fi{%EB-av=OzC*L!0fm59&{PSQubHS(Lo*G* z(%FkV>01g_QK!>8yosHKm>Q@&EJY$!BQ1<=VUB$t6Rb|+J->NWK0xmZsnqU@RtvL(jOydQqW+TgJ}n{Ij*0Y zOUISD*(&DJ%q>wvxU1^SalkcZgtZGin*rPAm1gEClEiR@mn2}y0C|5^uaC|j)!{8} zv*E&NxDFn;IFwN>2^(Q}F7iaR(TUndc-%Lj-By{Ea@O;U!rq+8_RWjOnVzD5RK|cJ6K|ig<^9 zc!G?}mUvF6#fBq4TnBM@naQ)hYz~xnc|9r1mk^6Y!!3m`?O^&Hlh4WfY=(AStb*z{ zOPMVZ5)f+Tjlo~~FBmf3OWFewkcQx3<_9T73rxMEhx9x`Ir@ct1FoXn812OtaVDfID#&=en<89zoSwG{`r zNJ@M*?i-A(PS;)X1FD~~pXzEQE=8(?T28Q)cc1Fd!gvqJHoMXB^oxdmy)(o=l)vbv zt4U9{ekk_PPQ0^2!Wten^oeX-Gs`#P zFn!qYdx66k*j~fXOt-}!G1DMq%L$yyl<@<3A;(g;#7$abPLa%owYY^{=PH~iOp4>Jk2LL5 zuI(w)l9eK%CyE%_9%D^_qNFd5aW>;w=8pSFL;9T_zl<6ay!tR~ZO@`?Afp;GQ`tDC z-8{z;DY1)2zpxGa+%~{Tu>%&^;PbRe*AF8OwXzzGP>*Pvp3W?Vb@P#dQE^J%CwOs6 zG4A|ExoffktCF)_+LMstE`VKuYFJRsq_OLGcATD(p1@RmjN?*mjw)To?hs=irjvw zOYJB20IXouF`>5U>_=J*(EPaYY9oC#Q(Ir)>b&gEBlrH~*H3Yi3ZI3woR(CcAIB8| z5q{C2dz?r`%P;%7m!jV8L`}p(;vGLK2CAc`x*IVD7r+=Tn|FJvP*#cvUyNHP+nmqh zA9H@)-%TQm=qoADnh|U8R<`L7OiJ5|Q`$fJOX&zvns!N5^c}cK01R_E zo1gzQ*hO)#Jy3!9TXV5*Le{;K7pkAZhFdtP^2{kDkw^gMx(TN-)Y~BRx21Ou1-wM7yh0$@;miS zG-X^3_FsKT<1j&=AFmIpZZinM`3xO30m`e zJht57v-v?O3AT7LS?MB$)~TeilcS)|n%&QvlX+PtDAv+DB%Zv# zqEF0aF%^68EImf!Xy@hHPo<}ryt!j(2~2g> zZo}B8F&H*TPUnc{;Zr(fxITE>v^%{*f{$-I0n5b)jmm$RpW;4LR>CYZT01Kq~x60a3C+Qru49h@Vw@ z+U^vd`Ad@FGw+*-ra2X^UL3C`9b^Hd_dtY~9IztIU=iu_T!c7*|m&@N!gIYhV9`eL1R?#1W_9 zvFu^JpYF}4V95U%?4B|`IaSfOFCto=6VZI>K(ume%eBj%KoOd6XYyIRPiJ;F#k*6v zagC&xi!hf2-|~zLR!gN+gUqnC&Uh->{NU5hcq#yhgjsn|L1icY5wx4QkTI?@oNXdM zK%bGTs*^%BfBn!JPBu>@nISqIUwBUzhY&T;<0AS2MTqxF@O;iIhXUcN+lTrDC)cb5 zOQcJBs75TG(w06K@7m9?*)NOMddm*=JSR?+-Hyj5!Cl4*UwsG}t}r8&<>oG9v!iGT zb0xdfjq($qzS2-s;LBi^(J9xAK6+7{x?!L2cq$~OGAZ0?R8f`0LJ?hMNR-?$Ig{Td z(5mg0eLH_cj$5(-5`kTx4UyrmG;Cu8ZeUmyu8pubA9||&XL?(p9C4T$859%41H5Z?uT3aP0wgi9pCo|$F zqMc}7jjMHlGcE54V`_{1lbiiW-`5Ov9sNq#3sIh;<)?JcH8P}83=xUhDO;gm0y}N> z6b+>8mLGO@eyh4Tt73`K$HB*!>IlLB(hYym=FSiBSab)o-vB8{xeiwJe1$YM+ht)SIb33>`U^U96~7<5~Z7J&VDKd7Cv+SqDjmxL2=-1Mrjr zuzx7^8%9P)-oAtGLq=L}H5fdnTG{}bdm=z4j#{}?S4fe6my%jO`O~5=&E9-K<%DmflDN2K0R*|8=bKXIrmvqhg>*=e2)KTk zMH4F;GqBUVm)Th_JUk#maAZ9txZ3JN6++=JYdqp&!#R8Fh4S?Hnb2-!1-OcsJM#l( z?T$O2I6yJhYTLzrV!KA=Vh5`nfQ~{!CujvIP5OgMFR-m`)1{i}Naj%MXZU-(G(ftFPc;^` z;GC9H(q5NiM2q-mUX|a(-j@kHCg7lQvR>;@tuMAy6*03;tzO0cHKmq8DCx3g9>2gSbE6) zyt6wVWse(vPrJ-W-jr$eAf9BRZIhxFm|;%&&f_7Z`#rbP;u}_rB`+ zUill)#Jae|U$WuyIgcxjbfO`p!=`&9(xIIBR*IU#bx|pFz{xdnuQA>TM+xkujiY_X z1^>ug0?9)xJr=vG^(ieolk1aJviXNG;Ce?-H@F>RwgPGz|LIPym-@@l$FE4Ut~_O+{KCak;>~jt?#rOv7sJVrio*UWw=aQ-`QM*U=Pn ze_Ny9(cGV$tvqB-v>3lN%4AMDA2d@o=kP`GXJH6o1KF#Q@?|5)!(m44?!i8A znJ08kPfw*NUv0|B$h@Ya%99w?N6xX}s$ezunkp9&C=81k>VKQ)i+C#p(*uaB=f>NYi7Ym$Uc$+`+c#$SYmLNww z;vt>JOU(*n6l6@2Y|Tp3fWSa(JiP9!!}&VMQNut659E9h?e@2Y#Oq5k)+$mm7FeK0uz$<>%cBamS<@SI%Aos=hN> zh<`X=V|Fl89zntv8!dd>8{V*=`86H3?yR3-cfRHrdm5(6NKe2|Fx)a~dq0 z59d)IP1azvh^JyzUeUk&w8i);_`m!#u=z^%G>`U<4vU$x*F9uj)-c~+V#m}UtZOZ# z4JX-riSTwiZIe@UAfJRh7P;UP5IeOn)J#b^#6%Ku)N|}DRE9){U3gi8a5R7%NYTgN zVM|S3OMjin!1JYw=>Hc{0uK6=p z1eJ(KB=-Kg9~CC8^CWh!k(^D&hA-4H1?;;S#;wB&_YLnwzPY~8h)*pb{96AeoCPRP z%I)XgW-`1wlIm9w{@9b*=eF!ZT{<&-sz7W%yPI)GmJ@=2|2N&3VBMQBaMz?{xOO(< zD}Oi33&vV)&}*R@G+Z5BHN!QXbjwl^9{M!#H|W{;Q9O{+_r*skNo($~Ho%FG?#eVs z@doCT6~uKjxk|RbJzP5DFR>ogKX*{7*$AC=oL7<-%o=}hXLiuz#FwltU5L~dA=r?n zXB7X(I29=$%Z%>7F{1ln(%^_j>Vsq5A!!^l0F%=+t9_C6im%~2J~tQVo+blA= z>G7XSc`$bsHdxS_4KtW--GwA`t!Ks>IGoO?YKu=|+AC`AY0!ho-_=*YjePN9q?7l8 zr@w7MU%R?SNGGa&i9_YH!wf&vy_f83t1I#JAPcJy;tu8*H+je zbKv8vMa)3TyLHzgD?Y}0qvYNVUg&|tgN~5&*%js}B@*xJ`+X<%G7~@QzVgupuZI-h zun(5FkEK~Zh`s_Y(c(s;a<;mKTyeUTY(Cnig1DhWbCrNO30HkeL4S*^eywxR4-R;m zaL5dJYI|_CFvBe|&6_}jw{Z1dijti8D))S=F#$%9w}=OYEyg!oUHonMV|78UBD(_3 z?rd~y0#q{ap51Ycj?P6Nt#pN=(wXqxhph?*2xi3XIV+xbky8Jm zQDvut;v5BM=&tv5>iDMN0*#YHt#-PLq1Euw%#;$goK23`CxGd`&H+; zSj?ib0eNL(3ML1#`jt>}e&H{J+sH-D$6TR$vNxq9=X(3r`zUE)7-8)@4lB0<8s@QX z|Bm5b&UL9F6E=?(#xeXooC+1^10pI{Sw(7SY}F@WJq$X^zG*(#rfnZ0X40bh75)0k zk4?9Zf_p3MSZb6ili%|;jCRZvl}l+ar^F1&arnWk9G#E6;(A@3jxA1K@VL^a;MG6< z)2`}B;jJ?j_piJ6#q!f{Xzz>L*|cv)-dy)-ST9ENtLV+Ep5Ru31!Y4SY8HfPsC3?f zZz;+NrYK6%^80eKhI48s-qchp5IXjs`i5wTzs*S02Rv_v5rF|^r|yyJ^7YOR>iptB zDZQMjcI_Fpe(DmH&_e~c716lcqL%HM0b4sCaAp_sP37`uuqT^m%bMj5G%>3Nf{qS) zOii(t99W02r;~CVuiD-`mNcu-OdF{%-%UDU{xB&xM4XL!E@k7cuL{s zE5+A`X?m`hJoMh=F9<77Q6h2rMg%EmnsH%nY@83Ohr`xhE@W~l$XsYPf>atFqm>wb zx`LHO**L6Ev|2T&^9tLF$7JT6pRupU%f`ZaSnZB+Umk&_%YU1QuJ?qZDP7Lkrc&by zL!uhja1_m_J`IfQY;=U=F|)zyDZW6OCNW;jd(4*Xkpw%D6Y@cs3b;sU5z$rFj;Ywc z`ve*hP6Z|BB?z&R$la|INUo>}H^|div5Oc;bkEn)LO+yFIhZ-BbwE&R#1rPtj#!8_ z%Un4O@X*$ocY`Otzg+yMeoAGVq}LN6DMfFqUPf*%cPM+JJoKatFF^A>J?Q|B7qTM6 z(w>xd-h841#|vI^0|wnHClwX?V>9u{=wT`Jfay%z`jlmHFEZPyiGg8ZAm;tMLEJ1B zn3cI^9X{&fGiaoE<7RtnYp~1zFmiN=5@>x4sYm6-n)e0IDyeZy57#c;B{hhP=$6;y zk1wNTcY^0Y_4=W8`EzXQ2^Oi3ZXgz(Mc?gZ{5;EGNUl;2vN@@nX`YervU1#C-2WtXF#XXwExEs6q06lF~yeq=4UQ;d>-bdI!B?RC=n} zr^64GNtW08eqmW}kQw@!C$I8s=)jb12S!SXn%mM=( zODjo5P}Lb0;YMs9AnTCx1GkY35=baF8CBS!l5LkC)*Lp~ZA5TbuDsR~(&aA7M7x=c7Yb}CbBCfO4101$ z9<^&m9??)A>?EZ$3A-U`U74w{FsFJUk?Wj+Kxu)-S#{4R+(g;q4!W5`{JDCIXDu(d-y*)w8UzG*dKYcQ!U zGd>J|QN3$+5^;#(CL@_@Xy4lbfuzKqCgwkSUwU+|ao(Xz)P1`+ZEsPEH26=yh6~wN zyR*;xt9on&lfumJ6f51rf56vgkQcn{*Q>2BxVL=NEof!1hxh=NG*`myg8Iy{c(FWM z-INJ_rTMj)ipcBgkL#iCfHnQc0k}A#3WG{d7@}>mSoYgYnvh_RHjK1xe&044BND0I z9Q`~OqIsn_-uB4f(XZ>s3aM&BgYD%wb@p|-LS@97=;<|LfJ>4ik{sBvxt1OmWne#j zHA$o-zOnoS7m8I>>NDYIvAnFcYAV?fsgfMz*Kb9+%!DmN3J6?Z-gN@j;j78A?(V(K z`YphpO9DBiNom2jX6??a3u_|EZuYJ3!XG`UeDmH0{Ig^(?UJ`w#tR`9cu5umEMXgY zgxhSFiSOZY(s<6~#x+wPP}9!w)aH2jzP~i%tZkYbD1NX2tmuv7%|~>2YF*(^*X9|X zR3NUW6y*dFaz&4UTM>BXs=o-<*>*gT+d@hYtz#Ofw<+qo3(%_&?pS^8aa-_A4qfMc z$yR6QYYlX($gVOLfoLg_4764*pZc*pg*YN&txhd^ag8U|G3MjzniDHPvL`d#PLq9i zRdpCyA~TD}4yxTp^c((6Ny=;eg;mGpr}sO`P^9l2u~wW&1p{4TU zDqn;OhpsLn7HZa6(8ORH2zqS7w0BtAno4Y#*P4lXd!Qzc1SRG?fyB3|7IU*+C)5Ci zFS4e(e_T9otJKzk`Jlxk_J{mCvu6EObTs zXhyKHZ^9oz1d7EjA1+;W>FEr&+fdiRfb3dh$)WjZ_MM3wiZbiNTl4g1nD|ADh;hxI z1I*nY!df6yl47o}wS~LzMfzd@GgjbrAH&tWu$P4@CtC--*W^uSzI8S4`1+onRvNU1 z{4bXq^EE+_Gpnc(pnCaq{N0^weTwk>V-f~^lUx5kM5Cv1#pw*|OjS$1Ul;{fIA7o+ zhW9nrS{8ohep@JEtuzASdYvf6EUYDU6c(cQK_y2ODCy));J>P1Ime8)!8WjQznou! zK|k;$8G6s4s}`@dp(xB-C3y$54$+?W3XfvjO9~|4$la`a+fx(~VP$B=+cY%uF#7(u z^CFfc8$ndaT5qIQx}~~FhVD}fYh4is!76DlWd#tB)-ilGyIrOFT=3XpfWpVD4%@&{ z(!JZyIBu#>QF_gWSA5?m1aTN1J-iQj=Km&R$33J81{cPyZ zw)@G|tDie%lpldBsdcvMm?C(wTC?#2&q+J(gDvTwah8#nr`>x0={7PxUF$+8;tZ*( z;zaMzpR2Nvs){D&iE=%h!^XuGQ&GVIdRa_v&Ng8IP%iF00x`eA)p);a9ZxKh?o7KLQEg4 zvh`Yga|;R}LTW(INc3Q1QXifBvXPd!h7}RD$WVNW2%Nod^ty#MOWS_A-7)e{l#`t# zlX;{}gmd3uoZxLQC3851Sc5COlXcTxdi#+Ogfy21%#*u_W7yi`FB}#rdkwhN;=jbx zME3%+7vb6UTVVhe@SQEhBuU4$69TjpoNuMso$Z&lj1?%6i-^;LKo9X+Csc%dO77N` zA63k?q42&-={;c>0w|RqYfG}gmE^^H9e#@b#k(g<7)MqEJRN9G3sB)Qiiq>C$#*8A z$h35U#}6(LZ8TyL7^t#QN81+(ATK&B5`IT;5v~?TQLtSYQCP?aYJiN$F{qjM z0NNU)rKKOMQ8%v`=;*%XZX7FpSy<2(kpLDnsjSf$;gbSX4Rb_D6BRT{)&3@Ak%uCD zdM%`wt?YP*eJ?+bFs(~_k4xfb$Uo(8#rQ6oY4?wb_00(RnfHwi9{g=4j2zEhhP5|@ zLE9VkLKw68r~Yz?h|v9{VKrHAuCI4Q)I!3_=DrUR&>{2UEk7(!25(0o?9Ce(7|3Zk z5mM*09UB{~Vhat$r8(QliN58M1afYfv15@3!?j4b4Z&(?7MB2XCJ;I+QoKD~>=hdE z%*Yt}o>eDBUoX-EiX!U=-{Z;Z6xFy$qH}nyXn}EQXmIKoBIF!fcc} zVB~e594=k;iD6%j1X1K{&IGEVwtt}%QEktA&Z}{P?0vT$V-w28x{I^p2J)^N6gj<1 z8!%zt%HcD9`C_!h!N->T2Zfsi<>S+Dc*Z%SXVzbXK;Qaw_SdOpW&MP_hr-?zb;(9x zOU6^dh5O*;FZ$@(e)uFjG%PsPG#Y(yx#M-YhLaRC3NPrJ{ zR;Wr2Q9-+@R}0?zgb&H$^17eADs4PNZE!tY z`yS4WYW~Px3gufkzOq6`>^cu=b>!U*sk*Dw4J<^;e4%_8-S$9gV8>m=Z1#Ja$7R55RZuf}7?U)ZL|B>sN=yMQ=3}}0+u$-g^%1?c+@AbTR9(lif#f<(e zzlXkt<7PQYNuMWg}0VXWML2a#SHbR9yqR()X`t6T5Sf(;w|k(aV$evbF0^wg}aWxmmf z2V$V{6QB?WD5gRM4A{lqsfV6881z>4`?6A;O3hKoP76VaHr{w-M&caNp(jo@FRpt5H&hn4`6GwiwQ7 z>VIm~mXk{uX;Y&#FGSpQqJBl;x`MJw<&BrfL#wPNla$4fCd|{n(NolXDkpCksL^wf zq*1h)2K{**8WR81-QwNPsiUvArN|$)4VR}%Km}(l#A@x+Iu%~3W_;2)Sl1~rdwm?) zSzn!LH;AETe{mvU>SU#Ti=p^YUxi;H7CLb{9w`1?c_kcPgY>%>-K} zbhep^YpWbjf?>7%Ls(@IkF)a?u=Xzhlz^&G$U~Hp5li3pjb?D|b1IzaU^)(}$jaj* zagV9!(s2K>OKFBwoVnXQSi&3$LY+asPMQ2dIq-uS;6jSd2-;qi{s?GTPKjDv-MCo) z$bQF3Wdg!kc!Jakz$soGKbE?Vy_9mX`!*m`QW)<&?%=LjZ6H3zyUAn-5<1>@x42aa zlOs)EsAn^Cv38m`#p55FO=t;V@~D(%dBAAc-~Xy8s?8i147KB)AFs4XCg?Frx*U&b zz`3nb%9(nSuGA1`#yj@u40m2%@U1Y7!3Hl{pG$(uZD|WTIz=iq-7z-l?D%?9%kfMP z55qJpt7R{tF7%tuL9e0MQPM#_G}E8T&z;nY)_uPrfl;F&#lA41k75{j1_%e|aVsIy z@|6=l5w>lGD+_y@I%4Iqp8L=vE}8!B$UYB~X2f^X_bS26CEq|LeYzZG2Ev8uVJK<@ZyK`R=FoXg~{LI2z7~ixk)lCErdwNAC!-NURXqe^YV3Ob1S6wW3I! zg2soOOufX+00<_l<%egjL-1ZWxV!hBc?Ypf2Xq=+s>^Dp@Qq|VUmtO@9OjX%;O zj+K=~ty%UJaBXPnA7P}U`zhJ^`RPA2v^gJj5BiYEZmBQL#ztU!(TM8=7-(SWG1D#f z9z_(=x>z%Sr)GY9=9Kj%3(q@SH>@G=T^sLeY5iv8R-D-1!oi_{-(u1{#FA2~{@_Fc z6o_J}$-Q*_0#P>geeKqAj*+KGW0o3-5s1nFf zM8YJI2AWH6fL3unz+*o4R_9xst%b9AUPb^75$8bXOu2C%j_bk9=YdTSKYwbRl5mRe z{Vkhe=d-b~G4GS{NybP1#3k7x_1y)P>5`E?-iI-Pg{C^eD?Idp7~;0`@U2Sl%24fK zqvLT2z90VO+VPcV4%kVLscqHK!4iUZVXl5tbDvl8)^~;{lN1q+VaEhk8|seVT^@?> z`BEtxi1CiR?5H6X=jOU1p*_q(Qe8-SSE#EBJ3uOt7UsBd-2=&eIGyhfNOm49)ScVM zo(yt~*k4Yna{y&p2O># zz7@ohl##JnG|Zk~r^|~MYU2=FY`ZPl2wd6-6Rt)W7Khq}z(Bc@wr$pJ42`2>|6vgy zZ{WRz2)2bnzEi&q*u7(hX zISum#$HwBQmFg-SFKuR-gFA7RPAj6VO)=whJb%}FyeLG)U)We ze3+A!d;56xC*GKzS`Vg||39+cGOVho>l#K85F`X76_7@{I|M-*6e*>9j|O~iH4hZr(P%!D0($K_WdEGnC+D1zJC8Ar#r4Lu|O_eE-(Lv zD24m@%a-cBHlR6NbGaeKZwn{(>OX>YF4gJqoJ_dnBM^$*Sk7?DpgKxXG^~TR;M^SL zF5?yqPp-w6EMzJU4d zHp$tl?Kx6Vrq~<)u|2%KDY-ATkHJD@nBQ4^0~d~YFRnxb7d!*v`$WI%k66A<@2Yv+_o z^Ka*^v3UkF-Z<$&hYeS|pbMw2@eU@ByR5M+bt1;l*~R%N#rG$55n<2{vDTcvZ-0u8 z7P3Ege&L8Fv*&0w?=LVYAO!ZuWuRFVuuUPG0<{me2XjyIZPodN29dC*>(@6Gro)*n z7mb|2<7T}#p3IJkfgu!}SauFdyjP5jYZbHBt6+m5=>k&BU-R)0$U*^>;iRrh4~jd{ zoqNy6rgoVhnUJ1{{^Z)lzTJQd!TnR5J_tV?uvR&=gM9y08E#ncth|qgLF{Qw2QkCAznU zv#!?Tb=0eD$#3B>5zl&?#RkEXE=mY*rz(-_#O&KkZZ7??5??c4F{@N_2F%;KD=cc)b^!3RB#uVw>@E6-E>}T;{#~lOe z!Vr*!Q#NdwEj9=x^Thi+m1Kn|_DZrqI>J_V_`51213M5~1fK#WzKnaixp|I&Hv!JL z#ORU$x;dN*ZUh>xv-Its)b&k9Ob#eK)Y6>Ttw!$dI!eb>+7yXcO361*(K<^$#%!fs z14{K^ff9PNZhJ?nAkVD_!a;2Y0f~nH0(!WV78eNjt-YBD{7yTMn*5NSKnxDm{8-3R z1>74BJ9)V{czEpqoah);6!B6XlvY%v<>D&uJNNVRi{#7H0EvzilR*;AvxYB;JljD@ z1V-X#ZBhwAdRA+t)7mw$^@)`qEOoS&PeIN5Q*Y#hdZDyRxLeORqrKi9N+!OvT@*)= z8;89vou-{{1g~uO3Xkq`*i7tYc5cPLx}`OvB7wW03RX{4B^PsA^P-bFmvnx^3m~cf zyS~6NMPPjb;Yzm5xc?I11HaExinMCk4LZ=RYxlV?J3B5Wb$n7ug?dD)C=;N5UY>+p z*&_}U^k<6s8ERB-=e(YJC3a@|0-LE1N7w-H)ld4m92sx zLcNi7&)Q9}@vs$)yOC9YiuB%PrZd#>%mFO)8aBjUU|M8;!D8qo zqDn}lgDX<#W&+3JAH*$ ztc8hXA(6EfAM__xIrRujcCdT1eOuOa-kyg5U41a%CIpA9@_QF9Z+Wx&3T4u`6#C~1 z>&XYC_m;v4JQo05>~u>@#K~hoAH6+Uzx**^Uj7FNQ`w&nW049#54Y%b8`7rcjfvMh%ak1f@&Ai6r}TFIA$u>0=(xD0nX%)P?l2W4=znm zNE~?xsz4<&Ra=6Dj>qKi3=ZWs-nWtoqoloXs~26wvZBXzA%P`hS$ZcNZEw%>&8s9? zZL&N>!1p0nq20Wk)Ec<_ zWB|VbKN=moG62OsW=>Xs#p{qtk@Kl{N>^Y`DJBDdBcT zJ#~;MkMMI!#H?8FH?W%USevSJbyEDZuU<3O7>fL!t89{LiczyRQEihEMR%{=i?71& z99J;v)0LIeoy0|}R3cJ}W{Z8Xk*OP{@@atKd45O3G6`HDDgKu4$jZks6z zJJsy_%?s>hqj)P4jNE+x{%Vd(p->^b*_TvnIcP`*bC6WfbqTkK9+ zEopzQoSs2U=W2=ex#JDBHN1FRrO>x?4tGRQAh?sjv@_Mpg6@JVp#JvsHVa6#Pf z@pRjoy*)HE!nR}MZs`By74I2NY9%~|L|TRT*+b) z+>zgKHW8jZ*(iDC!jB?5K{8&Sm}qCYI2RU75YdirEb!ao&GhqARd%cPLv{2oxy8g% zwHjMG$Y@(oC;Ck)fr7fSp3Beyqp9czME2|#&Owp>I{8{A5mE0St0xbC- zx;y*Q@7CHAWgocen%XGX6w7Q<;EkY5{nXdjr+a00PpTj*YXD3LUijP`BN!T9dTH6l z{<{(MFxB`$e?oPJg+B9np0wgqqTz*nyC)<>d(4+%(-5huO(F-`kx21Qd z$mi~E+$%`BHZn)~hkh7kWf9YUzx`{(V{m7KiEzK|#NMj7O9+6oZ2YZ-dI4}J{RCwL z`U~Dj0JtVEdc(t@;|RcRl>fPt^k@dqW((uS-t-m*s8-GO0A|#_#*|8lf9h2zpZbYp z>`E|}&D-Ql(ZAowUOTFz6??%cXE6;w0J^~}a_Xm_Y;T4y&KM6ocP(U66|PgJ0&0;{ zNx>Ho`?BM!Y<{xVy|%fD$Z9>u3tSMc0MFHQG^c-A|LcE`X&4#utI{Rg<{2&4?dNp2 zlEOzvSGJ-iyhbm0weG?PWR&*G$7HLX=Ti?DVCD8IxF6eqBhgaiN4*xW>a4HIr^rrW zhCLg|jr!#m+4Qk(X4&m)e49S)2Tek61`9aG8_J%9RGpujK~Rra8M2_Agbz4cWL6NL zA$PPJ_%v+~{Xj$*9v-d(B-_uJyT2fYM_#64e5;F(@Bg?UF4oVb7Zo-UXEgE|P{O04 zd5JYH0TGPFZX;6r>^Vw^4|V+(0lUlu$@$1{ADLjmG*I>d)sS=IH3>io+GtNp1yUSs zCcoXKMliXg%w%VeHIvwQ_k(u)Nc4)^^2}*)$YU%=bqexU)_E44aI&5PRff$J2TTw_ zKTtaY)~)G2GfYGt_ihR?49g2&JfM}yYdIXI_b&GjOlxuWmOt_dV!GYpz2czGgIrQX z*@;#yGIuh??}aGmxNmWdcKytf)?yFH!I#8*cH8rLMW?IOCT}3(30O|Vq|S>R`5Rpv ztHPdr*mkte#|Ayx3R?y&?YYfginC}EIcDq^t9&2{OY*8vLrL;QAaRs zT2~yChUqlBBUU+N7^5VQt#=^4diCZU!A9u0@F!$GiS@+~JHBnETXPRpt#0A&Vw@=> z#Ax9w8Lu=hQK{PIC4z^2t-d~&9=wT0lxS31lPm5}Jg+pIE#(a6OU+@+jWHC+88Os{ ze`ZWetswLj7!*l0KF?QOVjZg!v>+<;{-l`D-oimSkR_k>9l%RC?jRTY33LrjLa@13 z2%y*;NDU6=I|&WHyu9>n-zYSvemSY_!8EDqfRUT_$%Pv~BME?on>?4vS zu^2;FcjInqUG)P0_W@ux6%c(Nw1D51=UoAprVrYjrRA(ff+`fQe0_dXzWup_G>8)by9DyDO_ z(q=$0Cp-QcX_iD7@Okv(@iJ9&#wXM+P+&q{9W9_IwKZF5(=UOYGp2m z+6^}+vdmRW4-sT!W!-?!St6eUjYfqfIq)OG1mnJ8hnt09I(aOe_FJG3sZJO-1PBVQ_5>B6|3}x??1vr1kHhHbY zc~kQQICvgvr}vF`rA|llWPK8m^rsH*U=sqr8aXVpHhy|^xzJ^^cm-+_hJ9Na?uF}> zj@|uK6S1CZzEs?NV5_xgjn4PeJa%0|yslKY+3$7WJ1ed~k1URsn&pzY!vH|$W_b@X zdN+_HUmm?VB;X+UPm384+?z}ETEk5lKn)Hk|N6kL#&K^ds-S@Jpzc%wG_U%8tK|QN ziUilyB#xI{4-Rg(4lNFu?Hcd?mwo}UM@(Fl(bZX`#z z6D@;Ik>8b1Q)!rP%U6{Mp*bAc+b&$`upKFLWyu}Mw4nB13z99@THA7o)#$!(<~@)T zFX1(Hu3zmi>$u-;5J*FCg$^CEU@r*@bL*2qPlH)?xSbR8skMCvs+b-!NbA!4vkJ=fX^G{Qdr;Y>+xadk`?~*&Mgt3B&g| z0352$F--C`CFKQr>r1xMoBnX%6&ffziMY105jU$Qp3S}~tmXW1ywQnB!wz1cv%J0h z6mMDKb;E7BC0Xcl+OezkMbsogAp^?;HmN`5)LefM&$IZWiKmx;UDzqNe^2b4s-pdp zJw?}neyFjlSWo{a-hTGEPAM%%yz#4GL6?4A%Vqva32{%Td5BIbm=HxNIZ~*>6X6B0 z%S(Xvxq(`-dO6^E)qch74QXzr`C6qB(6y-lHN^(tf$>y{-VK1y41gsS7u#R8kkC-K zrOzl;dw+WA=dMKTR>VoY{%&xagSP%;NdG(Cz}*3VZVcV;fx#=;gpbR_RDs-r1FJsb ziH+RsB{|jfOr)WOY;+;lGX6cu{qMR}d2bti{V5pFbiKnI#!P zLrc4PWC5a}ckp}hY(Zw+jl!=C3SV`cU4?Jy^PB3Wg|>D0Bu;+7NOrW|z>r}MmMg4E zS^Sq=S9FY}92d9K|F8p+&W|Lsm;2M7+1;*jHts8eLECAwh)DeO`iBO(oVeHz&kIm4~u*7clEdrF~0VuW~I0JqWzRJki^#vS+ts}WEsPQjJ=G8Xz z=B(>j3Djlq@Y37dC`P4lpXq+pi9p_1a+^bOaj#8gcMI)at8a_Wr)1C}Uc z_m{A9j)+r@pmlfW860QhwISA5;qZWSG)G=xSoesItIZFO3X_|kw_9^Ft#(EfN=|_F z^aFVE24Irxj5ZeE{@8GSNjj1tiippwDFytOs)2Rb)n3`4`8D=Y#F_yBSo@NBB0#tN zYK;#xiYxTU=1!yFj`=5b)sJf``~s0{pWtab5vR-!r@xOoZ>_PqIrM<##7eRpN_sjP z>LQ+$Qu|mMt!y5wve=Le#e7bkMFI#|RHSm@BP!~4huBGw1A~w5V(Wa-3SmT$AZ*NF zb8{0wGQn-m3FfDIcgHh4|#U+mmSQBa7Q z9lIx7a-EqX4r(F`&DKQhVtk)#(I>qc@>-kxX_D6Vs&nFC6lD^0=@($eOYHIkhZAX0 zCLRlqfC|R&dKs@pwMerYK!pmuaZJI$>YSfH3Eb`W06h#;eudV`*>8TEYg?_U&X{(Z z0O|^eVB-zn=kd+@-B)G1Eanbl_NePsQPXM%YBAhWi?tV+5WD*Oslnxx zl9CchrvaM7?a9DwU>jV!eMq0(F1B1u*eu4=IThtsR^cqP^b~@upD&vm_5_Pu4-5dk ze6-N&Lyo41{}HQ2Mk`L9%H4Hx!4)oUiTJfO_qd8?-vtU8T6g0uP_K1>EhU#O?8OUG zC)1&f2Y|!?+=n;%5?gPsPOm^r;Jd#$MI$GO=^u z1FJ0|QT?9llm;vm4jB@qNAvH(ckdo{@;IwW=u}|4|2?;1bnsqiDp2v!XG14#JW2VK z>iO*1Z1rteF(8X60?CXVsa;w$7B*^7Aenc<@oML36C&1kvswVSC32eKUGb#iI40|-uFXg=NFLh^xSPL)*@|$; z$4Kii8+O+ePPG))+0N@GjmbU+Nvcv{x%GS!Kw|9{y@fNAoH&_il};`0`MROX3=>g&5ED@Q7h@o1t@b`F(G=4(Da|a3My~D(cw8h zn+!!DZ6@c-)1Gs)e7eJz*8#_2Ch#A1a4{(dVfM7Wcg5vAIZ9E8x zP$G}-HQWnypksXX^Fuyok>Kvy>%cXRe4a!7Gn6t``Kn(gD0idz7k32|qS72M@piy} z?xG^X%R3hH2mia)v+Br1)n-OQS)6yZm>0zYDVHqZ&!WrT>cnJYX4P0T(Y^+|yQvL& zEA-kZ$`$r+ASXiNQny1!e2Q{piF>Z}_ZAeg%BxqO~EZpPQwsz-rmg`RC0f3PzeJU!gALD~C zZEi^dZW7m8`|bcOyBNcF397$S`_4eZO}fQem$_I1*x|#^%hZlK2M|H~$93(b%wpX> z+v}s7rpUSj`w5!aEZx^vlUU?5>=Z+K!DCuE%idS^H&40D$9|#Bj*gDr;>$Yyr$*X( zc_}ci##R7Yd6SJ=m`z^@VB}on6FgXG8DHFxzNMV-dHk^l#MY=uYhoF(Z)g}HQnv13 zRrt2EV}c@Jnh5kFB8!J?DzX2dh<_f=hs-#a1f#JLX82W$gv08LcETRsj{X7xNzSa5 zzQc!oZAM8cll#2aF2WTXWH`FjU)$$c&!1G}nhevu3I`waw!SLibs#kbaF5mmaK}1i z5+1@(bTrifVk*DO!5*yYH^eWH!aEmQxP8c~C9!50mi^bT8QUvU|L`UEg2VWX?wVsY z;q3t7B%U$IaqA*Bkq7y}y9 zI?c-fJ>8@qQF{Mg4~^uuyM38;)Ap2lPGQwiR;0{pZMZWZ1NR;kJH@x$Vxb5+4cCk} zzu&hzqf|CtaWz^kN{TsBK~LT|k9kNE7xZFfH|Dq4)w2SVG`9di*|VPoHv#ZJKe3Qg zfe?%A5V_Ipsw0CF2QuWcsuYEFO)N1$^h}*>xW)EmYlV;e)~kOVsGKE3qHy2_d#-9d zBmIrZ?-dXF538&hjbSZu^LTJpkoo&)cqQ5(_6Ro&jdKSdstQy{ysZsEOCK;HFJD7s1VpZ`jJ70h$eziJbpqR`q5Ic zRMgaNg81{S=oFNcAj)8<>3DHbzWw%C%5&jgk%{z^TDE@A?A(rOoX2Q`9UMUUzf38) zMMA}@c*`JY-79Ex#rOJj>J!S&{m!PF7@lZxeq~Mq&XmX+V?u}QxQN$C@EHGbMhl^QUZl4KDN#v zDl|zepQ(ty#X9%!jD`A<3(1YdzEIXRdfg1#!Ic~LHNmB1gAbPej4G~FICy~A2!bw` z{hHKFrOlu$OMM%Gj^}5yq`wxE;n0OpmJ4@T04-jUEmj6d8?Z))w{5_jxVW2J40wjCi@%-6?ZWy4>W$#fV6y-Ju7EZH*k1PQjVC){lS5V54gP z_CHAdpePgz{AQ!V&NaZuu*W=BP~!O6jhiM$L3@JF)|I21p45^$4L3DL@Yl%8~Df4J+y2x@CZv zY~Gr(G}>$k`4T1tK~nnwaiD?r5X6lr?IaBaTC=H=&mfb4+Jc|J)C>qIT^ypI(58QN zO@;|a!(!5Fqme`3Sr;Go2$dtV0wGH4=H{({L9)__a?I&c#YQarmhulG@jz}O(~S8%8fqUFZZ)-HhWTo8`rPWW5BjX?I%8IDc_v@O@Bb)6b-1A zW1u>Mr2SZA)lc35(~C6ElkUiAf`6k3Se~uPH#r)`R$G^Hlha%b__nQuMJu7e8o0jP z=nIf&aIZ{={y1J%PW=CGMm`#*|LtZBx=iUeret9$?mNG^@uZ*-TZLsn>n!sK@OBb^3#37|_1kVL?cwFd!(-Sub*dQDIcgU8xG^5*$qZ%EKy1k<1NMT3)x z%KXXG#zP+@-4-9@p_i{*^H9|!&UhlM>`)c; z374Vo%%Y&vlUc42^tkL~ud8`XF$mlW<9`?^lXtc4Y!ILIiJDjC&F zUJj9u(LvwyUP(zXFw>7ms6yhcj%Zb3K3LF>Nq``xx&g9~i<^joni6Fxw zLa|2!Y_BNjI|h{NQq~83ADpCB84vhSVvhLlc}tE5G%UN!5mpl=20>wDo3MnsQsZ7y zQn;%y!er`bm_zN~C(w7(Q{JZE4(MdQn{^CG<; z=TPaws_d~@M>^!g?Ii1=N^yq(?N#S>z%?7#$(2i5eP0R_M+Y_*@#&k8spcLN5V~ksZw|aN< zIMwlW)@$xX$-+lUjR61p_n+!U%Qc7yYg@DBC1#OUv!hATa&}Bbp``KE*@+%I%AB6w zHFhNWD|lNglDMRH(TfJZ`)p<}PPXp*k#xlunNubUy`TpX+H}GT~SBq zU3Z|AmhtuSIwi^7Uh20#)6 zel$M-#0XmFc=5gKl_n^mz%S+hws&$Chl8A=nQt=%BC!VOm4LxMzU}lBKUz7p){N)F zvm9ePFSe!xf=iHe$Q$#@;@E8ZX`sAUhbQRoQ^8}cM;shfM{B~kRaib~&P7>A zH2|V3AClJHUV_)aF#q3}q$FOuOdanAV8`<9{`SxZ0;rZ-104W}aSB+Dm+RBbRHpH| zc>f26E?AKca6n~4f>7RLNG9VMfm2BHg!#S&G6>(SW>h239#rV`j4kRUFB^LL-8YB0J(X8lMxsD zsCSnPZkLVHetjz$&yi>7tvj$P`jgoTFTs;#ON6`8T#ii_5#b?n5-xzE2D3D*j{asfX@Tu23KqKm^t#V^PhzXcV3 zq0T@z4NdGbFImw8O43<$$|(OetP=HIxKL5Z-r#`A*sjh8r5zv=(6H}Z8WK3}*|ujp zh^h80U%^60guFrY<`vPQieCFaW<~8Ls{mLU1mkq#JS=UjRB~}5LA6H7O|-tTfy@ca z<06#cia^hzG%#t7-A3Ceq3)WDAgPE%cd%jULR>R z+`1vEhBmLpr?xf?bRzLHVxt<9d!kMJ@4UHzR(QvoR=U#-C`^vYK_AbA_enuTr} zKG4FHMxj(bUyTL$1-XGaFoa+L6&NlC22!zk-?&;=ug4+0B_VX8e?SDN06=xbeD-t-*A+j0pA!>iTthOR8q1oqA3Qu(sC;<1HMM7@5*CrtP$fdRnTvI8T%N zRX200#CLu-ntSo4Y6w+GzP%6pHI;k=KE?R{Z(3fN_oJmBve!e^@-eRi9hD&x=|zWH z!AxCfR}iaq)rIH3#+@E;;dlzR50!{WI#7*~csDxjssf}Ig1>>Qzd&7w^b>Z-GQM8V&z9YZ`WbWk*BU;a z!)gBLr4w9RpOVtmZ4JrM9M4@6IaCVa>k*hvqdjzBs#$K1m&)(NU*~N-_Upal&RB4% zLFdCGu*{=*A80{O=5Z6i(zeI)a6x3p07@<#SET9)1D3SqQYOZ_)*q|RUv}Z~A}*v$ z1Cxz8W6RktffI9pehq#8i#~>>ns|}T$$gJtP%m7|w|@5o^eM^abJQEGdiV1d&R)e2 z#SPcyMc}Wog9^C#bIPNgre*$GQi<5dxA=e)z1UtN4i~Bjfl~5~S0M4X%yj^XzuS4W z|Hm&E@E`0Idm>%^#lQmJm>F2q)H#p73zvRUL>VSQ#p!?Y?>9o4DoJ3Kg=SCtPMNjc zpccG5xOzdJcSIq@Hs96U*~zBi2A;iT%(bA)EocG#IL&t(2Nl!t#^f4a><}mQXSE_S zvD0hm&zN8&o1glYXAh7_fhhcJO<3%Gv&Q;a&`aSf`IeS1yM$8!AGc0q51U7EFpG|E z>gB;8XZ8=DO}!dT|8~{L_nkl0(R3k*py;`ry`^nGGvF5ulScAGMg{(yqmEJOrwHv| z$>K&^d6jpwYSSt6)l27_wTgZE0k3*2G}O4K|BZBT1gfLDHaJ_A8^vo^M6wUIW`AHP zY6|;yJ@(25DAf9y8Bl-pa;B~sMPz1gmD#(i2g!OeZ-HH!!c6LFLX*$4@0^bBbow-D z0xRqj8R+BD3g3qh#@!+}`M9U{{Sr0NEqyc@tWSZH$%&{$3rfMLNW-L`YetKr(!*-& zXOBVRL2dc|%gu|A?O^1?al~fnQDwil|3|lj>r=Bys;Y~h-*Ypj2I>#{m*7sbtmswu ze*a%sr67lBgZ?i@|HdRcaa^o?1ka-t-d3@Ezj?{`r>CCR>(!|D4N0ip(c1Xt$WJTN zXT*X)FI`yd)1F?7^^}OTBb#CHCoH(|-=)Fc@lRyd1j(St+c`tK`|C(Ox^L{=r-Br{ z5jEC6dWRR-ANo`#Rc;hL((U`{#g}i84B*(VYl-T_L0b`ul}q~j*%FXe;w zHZ=GEc%znb|L^m8qCEs_S(3eOz`xlz`-m^DlxmtK)lUdvzCoK zZR3kRbn;K-vTef25>rt53l93Q>Ybkj`RI23)Se{0{yy__kYA z9(4seAXH_-y1(((0wCk0XOiJw7ji7()q=XHPbSk8|5LsJL%&>b!T6>1#!3$~=i7ZR zx|p&iJf<3h`yK@ifQ`&yJ)_Vk_Hyq`3a~iPMzH%l)xD_C2 zHHc5cRYJl6XCn{CeLh1Gm|&ZSk6^4BYKQe!&l}Y0QANKyq->$&zZ9zIv7AY6-Y-@F z#zD<_`x>kVC*GnynpQvvX^=i(G83}+plYLlc~1D~Z$^X$Fh2-{Ufd_pgzE0C!5i&^ zOUcdY%*&wvtv4M&0ytJE zf#(}59|VxW<&-D;KbgHKu58|TnghHIDxekyeGzDw>?6EUMj95luuO>-)XR6mV7^ z>?d>oYh9?B#by2z;)%9y&na4Ol=I5?Fjp$7yApu#)udl|I5}0P#{$G*VcR#Q1|mSC zC0Ff6hY`K^*vSpRc{_)s>oKI5xv5^)Lt)0MC{rqir^LwYJ(z3Uc4AeT;Ijw!NA zI@#me#3sX=E8_yq1%Q+Nb47WiX*aC4W)$`?q<347oaRn1Q@;qShtg7hbgeO+$?!t) z`Qx%r34-=dX)7Kt$Sebt;H1E)j@yL~VbjUFGpiMjO^QF4ye1)@?F^;g4-Ar+LDedUA(8SVjig7o7dQJWe@X;(SAlXtWQVImAL0T(M{{5q+ z>oUdVxCcUh?4`I-{8GST8x>TCR4?V!9#l`e=(41#Sd- zA0+z2!Cpxj=tSl(uwMr^-K551iT$VoaGNM4fEjhYqJ0E55q6#dB*9tady(ALUx%G* zpjGYFLa9J2>_(3-o2g@P8fTVNC%B5TkWl~7w>B`P`-npk%~5@Q25eWRVz2Iv+r+jh z3fGOD(=DPl4)6|npwUNA_voerY|1B#v?8$gti7{`58ks);^2zlw>}=wc@JLL2#?6o zMoME$1j8UdSe4k_h*WqrL>gPe1GLKCUP_jwsg7oskOUxI!DznPW~L|)?@d(DzL=kq z-B251_%`KF3reQBh$s>gaEk4&l@^j}aeO@j(z@~LzwlhC-@x$?yliMBE|kKhWtV?O z5e%`iRYf4Y3%B4KpAx^nG+76PQ1*X3@&kkSy)O^evifiPc>MO z(M~FVHtJ8>$+?<{y@~yt$WxLK==bKKGT5`j5idF&P6w_e<*7kp=NG8mHU=0LJC#%6 z&|5n?ht&z$;32>;1!8(VkW5aZbTnHM?vq<@7P%kT>P6rZ2^H`xtCEy4P&CW`w-jE% z{dvI!O5u>v>hczE08$5qc|2~#S^v)?1@FNl9q6vAY}8qpcgJ51>AC%N@}Y5Q;7Tn- zVMnd}b6w#mLZh9I;&ZBaiT4ZNy@eCj%Z#oJRsTfM^!LGww#@Q2O>+n^V{8fY`P?)-MhgWxZq zHWlxI4#haAbf_iLqtiK%M;YlFv#{kYZ(J#|0#Uryt-$jx!1G{gCwA{`0@ATPyCoGw z*|0oWLx1{MBQAw-@Y_u;jg~LI0Wlw%F_DKK&yiY}f>KH_SWu#)?n=87quoY4F=A7y z0^GX<1*}jHy*3qu-|9Hx$EOUlf$di6?ZWR;FO;f<;t&KnDp9fn#=4u%PzIB|1B`V4 z0VXQ?NthvM3qM#7&Ezl&A65lHJU8JUHJE~6ue z^6%G%6*rVLcQWkk1qZb_)Z39H#Hpwr-RmGy;5hD4i$tfNvMO}epus;DG6l)HM;!$% z2^L)}f;=ISh2XUL$J*)-*@2bJQ9p(&IwyX&i(P8Zl1mc=_X>-FY=!}9&>e0cn zuEZK+eBPnOHQ;;ZvEU#3h^BZ#s*J3K#DTj#Pkl>lLGNk4v+W@o(7p^BWBi}H{VVvz zFFsk9H;gn?{5lN|BMWR#+KHbs7fW0-a3y0F8*vrXZSP^_^z@$0*8ma9?3l8_k|9D|;(nrt?n#$s5a-Rgi%cUcL6} z;*`IGUx^8S`itzxdQ~FuLhf3h{2oYh5g@r~CyPMfl$1us8(i#T)K*S5xkdR8m(W~C zoTpI;fH`W}``8x!w3p`P!Mdsq=_hLyQF*K;R{h}c=Mu_&T!e3{Y`zrg-75$KhE#9K z2dE+q+#ej+1Tvaski@g0S2;E1Y0l;{;LF-hDgqPEyl>EhQO6*|`zhH5k-u~120vjl znE^Ps_pGWGh>J*Dlwc=qmwolDn@aWkR{xjfjR&&gNvZoO^MRWSGFUCBGFZdgw4bqK zf_im9&}_MXE~2*I@1#W+sP@_&==Uu!1P+Gm^AEg(3v&Qdf%M*$6iO3YeM{rh`Xfo9 zP|y3F@OCkpOYn4DA9#UvX8$~z3lim&mPU6prJ$hT0%@ldiE$F9ec1uXihE@m@!7xe zf(=hjzp)cZN4F&%RsS7jA*~xAtR;lV1}p-}Pio@JP&)=g_I?UpG+ud@^=N6V&&ABL zU92>S&x%=?B?D85UzlJHUXqVQkW`p$^+^5iZN1Q%$f?Ufu^q>JpWat=8{v};`u%Z2 zfb9Tkme=ksrX*V>2vbh1f$wb;HwWjp)tQj9kkgy-OdMNS|3c^8oD2f`m@U*jR&df@ z&P{L){ZQ_`D-g6!JE2a7ky0`Dbbv~FV~rbhHt`WeZmLt^i|Nt|dTi3A?*+ZaU)NNa z5ku+2Luhm*bPGJdAwb1S#R|i1UiK@m)g9q^x8slh>S&7^xlXZr$uflwf*SSnHAmDlMww7^N{81@R#Lz>Z5rwTQ|k3eM>^v zPm#@_G1;hryG{VnZ-*4y1?HC6D+KqH5?H!RA6ppt&hUA*L3yNB=8lM@xne zLUO^w%SN4xRJ%53uL>B(w_}l5ajH^e6~C-*h8@(CmcP7GKY^_`sGN)X^_{KzupZoRfHeI~u!v7l z$Ac80$i5whNi@La_Dir1V@8*@jJX)&pr#ioi3TT{sU}DPp@C)pR??V|)%tP4)Wcrx zW;?Sq_$}PUSPvEGq$oYqgdUWtD+MXK|1{@8$%E*#(`K>=gj3}ttIUUzRpZ1%3HDDy z-S&J=6YGr;5wvDG*BkGNUIS)>ZwEC{yFC`IePr?f8bSf; z>4k=8(!4}MLV~!u@!Ia)25_HyxDJhCS|8MS?TKZ8+@wv?y|~@n+`J=HvVU9u#|BD- zJHZ6M=>mPrDFuFul&ZJPKL}%)f82Oze+Z`=43=LW$376E%@X;Fs`Cck!Fu(F_)hQP zud!{zK9t3i1(*B>Rl9zp)gD`k>Wue`3toYe@9V8z+#gs+%Zu?-lbvS-e2-F28RsF2!5XmVBn{o^E)evH66=?(oQw|&N(*W72n(tH8u38PN;Lt>h=ZmF-lh&eZ0<&GcTCv=|@y8JWmblUln3PFf?e5pOHP)HaP z$LU4s92<%eE{-|8xvQg>93P31uR zcav_Adkwx3!ecBf#Y$oDw!nl3L-)A^HUn2^WVnzpwhMfb-L;ry>{X1nS7fopO_xKe zR_}Vq#%hua?La5{AfcxkfprXHR5eCv!-?;ASCuM9|{yh!KmU6L;2^&(FT8hR~E35*xc{^DX$vblNwIHiC+P#3)hR z<@2#nwLmprL;smwB}-g$mGJf?^{j5ENKs2bjDn_{T&d^f`b`{Sr`vUzPLQn34^MHz z7-Sfg;24J%A7*Y03xSpHh+jEx3UZX5Xq}gj$}vj2Tc+yi23Jk+p23ln z1YI;BOF{unV5FB^T(O|t%;CJJt{6zWg57)3)Ievd*{njj7LEEu^TSbt6Bgqfs-1LE zTb3P?di7uowoapw04D3r?xIvF-!H8qUNX!bQCo7Ih&Fq6{E+k0SnBwXLQmxz>%; z1a-+vIK4*m7fkjIn)~)bf%bIr&}d{1j0-$yH$1j{XwNPDdDEDgc5E@?sfdW!trzM! zEX%BV#Qz%Z#$7S>DD76Cc@`_ZO`n^sz{J9R@l)r%9d9afOuUu;O5OMri9*YphpxK~ z3Y-PMh|WMk^#^iXeGXWhA^Rv-rWfXzDZD7YKNGrFb=sy<6};!KCh>MPR2X{+ybjN# z@(pJIoWtbV0aQ> zS5GIV6jAfc5)1;+CAzobKxE*Oh+*3MhzjBJohs?hSfttP6FZuL(P5*4PpsZ@4|Z^I4QT=j5Hg_f zbyIKZ<0h~gP&XDigy|feUt}uI)|?#<`DTbU-281F#WpUmCHEn<8t&TPbmGSlhI^5u z_v@g%J~cNYI@LAtyP2Pzjr?xDTF=LDX?E_6@H>vKV+w`;Ly>xd#_Ch-SCO2^*{?zM z8Qr>vNjn;Evl^o_@iaXpr2COj(&SpHwfrmM7fahmBge2~n&m$STUBe%RQE*0!LT$gUnaD>F-_%8h|Hph#58;yvOXsc^|5N-(fy0jgpvwSz#U2st zeh#&RrL5`vU|G2b86Ky^f?g(1#1KzAF)U~4@mw2C2>d(?l`&Xk#*Z?`zM*ga)WQFA zaKz^BeJq4~SfBbSif=abw6{j9j?IdVyY@>DbqM?Nu=O)62OFa{yjskYo(LaXVPWk2 z%CDO><(X=yGsLFM6f3U+mOt5-c^&hD6o2~f>APnJ4LW^kS-B5>DgCBnxu_1C!J`l& znQ_|v#Bu8yp)k(y;fEBV;vHvv>n6((Y&YGtyw_?@t8xP)y?5D>eK}smv(^w7VSh*2 z@a#7AsLXxQcJ?D4NqU<=S^V*APCbG$qjo~+ZOywpSM17m&{0u(2exyy0>Mg50&vFWo~48Ss?7IebaEan}r%pKv&j zOL)5AjwJqjOXy;s!MXM1szQXbd7nXQvOafhZf7$qI=kjE?Mlss+V;C1NbhmxX50aKbUJB0{cdIdZf`)=ub8taw@g$u& zplwXn0v+9ikuaD*C%NfGNVj4AojS&sGHFy^W@oNsUkdL#*Tj4I7dKv-Y?|^J#jz0{ zP6i`A=W?1Aab!GJCN^V4!gZU@EnkXk-WF5lW)WRqy}(T6k0`DrD2DAy1=hqC!|RPE z^PU{n@foo7I+H%i5EIwa-knd==y~R%feykjfYYdC!_z{H*CwA#*>$PNmFNdk)J^4L zoYTklIVbO%SK%YH63LsNt@3`D)TxNaYh3Xt8?FhiMu|9H8>u$4kilab7}SDmyBvO< zHe3l-mH+ioFlE!E-(>eV=IqLt_yc_LjiK#Chh@R6hd)8XUD#CHGY~`x?@f7r$D%bJ zxWtkK=&>5iD=eg!`CYCl*D)F+S6H<9I)@!y^k^%FgOM*jB*LBvfQ?=TJf}d~5cKWa z8gQmEX$!)>yu5)|HG_YGBz5XwXpOhGHzaTX?mRzdb6^;yY_uQ&okf5@A+ol zKi)mVAIy$xUF$m6T4x;Ramd0PeAZgd2W1u)%hJ_T=M#(hAjK+Cz-Ty*ZZ%2y{XRV` zDVSTqyh>+Z7!f`mSF>4LNExu_!?2^*PQOH5d=q1HMrhhoUP(a6ZHrBE0rqyY?I&RV z^^AojB~J>ywL?wgXPXq}sCPHw>o2e3AdabJ0MQX*X z^H3+yG)2+Dmdxj1bby>Fm4cqTtbqEQghbZfo{gQI9T^4cc0ty6YlIW)VZ1}Zw7AC* zHI@CI{+;Nbn4{5FQp+W_^ywEOUF4S{%e~H`SyZy+?ny(F{0f~tW0sS=oq4nc#kY<7 z8O}`F^xFG~=@Fr84}GG?BY_(Ic$lW|VP3C^?M=lED+S%XZj{V^xh8nGG=1cLcVQPi zA$ZwxY0sD8U2B9!F{CX~F%$)iP|?-0+oyPEbK5fJt>m*p*-Mj12t{O4Eu-(3tUh4)ub^C$S>_3{1{ zeqU>rSM=EKIX%;2BL!<^N`Y66!Psaff1)?Sw2_oiwAW=}AF6*}{QUqI2W1GB-F~dy z!YSjH1J{9g%^VXsY41Af0WAmLSBb4}9`^mt!*n$Hb94eCp*UEh zI@_GEoclz5e9Ls;W4vXnT~8HY#r@ukEG@PDh3w|n)iU#jq1cygatCg_E1wYeM4d8G z3x+8L*q{2}(+xYq>JDeBU=+Zz*;alZoI&O&r>w1~_b_Sin-ld8eR_s-KO$e<99fmR z-a(FZ;~8*bi?;BwWA0w@@bD}E=tgYrJ_Vn>Kb#+T+Bo`qaX9FQ5)!(<>KPsV;O*@l z5*F6~`*h0%WGGn#NL?}?jQvbb+9L@c&(D0LU5c)Y-Z6FbEvp*$rRkY#Of|&NQfirQ z!RxNgiZmL`8i4#58Z&$;=eukd_W0^_>Sv{pkPEF7@80I8OTYCis0MHcH|NZ~#tY4^ zN!?M^YuBW4n-*c9P(Eqs#%HNpDO4GBxm7}2t)lWll13D&62itykgf7l2^kf&fZ4b^ zqK_^8W9~acj+Bym8_*-Tz)q)-o(=E-^G+ke=!9&P3pEiBv_wH4mmkzDpV#BMgRRDT zLZSPwlur1J=Xr@%ScB1Lw(~_p?vE^qBR!X#{=e$QxCSNU@p;0VNMh;gtzZB@2 zP(D6Ckmm|}EtBM^TH@ht2G+wyny=e9C=2@MvvHR))q~tq^lVP=)(8fJr&yfKeLFug8 zOa&}zT*zS+8DLU#Ktli=M8ACjC`}CRZ_X-p-$_XsSI(6DC4$b-BgP=@i+khb7BCrY zt4)cWzEhPwz6r>9jqmBh%~F!or-Xd?_31Q=kjD@`za0OckD84iC@JP=6Ho~h6tyqg z`>+4J)`{SFlQUyCwX`aqw=&{kjuXU-oW#=E@TeYVHLIboC(Dn*_)nGS)s_xALhV#( ze;Il4Q;gn))36Zf0|)h&?EopygmJ^7l=tLqn2GIXC*ZsQ;4PA!snQX^3le!EquxbS51&)w(5jD4 z;-LS0eGR9;cD#D)5m%r;)FLXQQvTB^(`@x*b(Ef!%HIYcX31@3IkA5UMm{=jC2w@`Gk-+^dV{dx z<^m$Ycm~xlaAr7c4ibR_W-M|aL}iaa2YLY@=(3rq2kjTU$(f@Mi=?9|R^Jz^R-WnY z$2O%>rvQ2$1c-wE;C3=H!hx+Xngj&$#{ckKJ)8hLM(B0cB%&tZJOk0CIqcy+o++hS z`uKYo0e*NOoB;zs=f@j8PMrgvpb<|XekA*f^a|{DhFQa=r%OGEbw#SonN3@2cixQ) z_yLA|()?}&LAG;vb8?FqWmk()D}0~3W^uwHX*!`RD&nLW=8Bs-CoSV!&7;|>^@}ls z>3kFe;rb)Sw}$E~owsv;jHPSwEmgacU_K#Ie#scEb%KIUQpJV5q=(Qt$?jpT{zL5x z#1HuvPf9PW6a${kluELK97xZ1uZsK(y^(VPN^3vAx0k-;`Q*>(*)TJOdPbvtSF$SE zaZk=y&VvQU@)Zs+xJDwVk9*MLu#Vd3)@=v%@EnDMj>JF7S@;Ov`@-n=2eRFGN?J!& zyE?c@Kqlpc43&`I1+hGo9{EPoW4{@5UQO`6Wu-Ww|5zjZop=3?qTaO&_5^j9QjW!n zO_wF%<5QkP)4gA&I?~eJMm)b;TztrPr*ZWu?r(5FJXU9o9^#((@LBd#nd>EXklzEz zu?&6uYn;w2x_af89M%E-jJr|m>zL!NhHebBz)j3HNF#3SIR81n0a09miMbGhD)%+cCoG0 zkYi(!vsC@meZQNA-$rh_;xVAj@v`d@`i0MmwAxg1-K%OAhK#!!&`>`Lo7*0oDNlO* zU3RqSfmvO6vp2=!9a!M)?3hv01Yjq1_n9>#P56sMp>Kx8($z0W>Do4)CyBwrMHZV1ji-G*->u zr1huUXwqhdiVEeONCt{*Ni@!L=r*aK)2AE?SbI*~*75oAYGknBmX+%1ud*J$Pb+-x z8;_L{7T-_{V=LXT$F5Bjc9N5Tz~S-WouZY+vUEx&-#uPx#gt4e2+qz z^U|9jIap-Mqg$NyTL@$%F`$Qt(}~C{I_q(^<;Ga!SP|K)_7c_^U?nkkZ}ge_qGDzUDVBdlXeOQ+PlOnP^#q`FHdj&x+ zk)FLC_cLqnPv{zld=L|+bmU9{;V?u__shaco@a`^2;qF>x0eS$tul!^*vh(^k@9rP zht^eJg!_p`ce?PWb+mOti>_Ud0pSSM#2uftJQ8J}-P$J!Oe$wx&4LRO`42MUdwNpEi5GOyJF1jw-Q;cTGNdSX(P^0fh z9~vO4sVdb^Va;smSpz;Jr-#UJ{05N?`^t;E$Fy-H`#g_XuLI#5&5EfSDmO zB3PMNX?18QhiKp~0eu#jayQ+S%-sv}Jb7Zj^?mzlZCp`1L}8I{(_r0m1MO+i&YQ<} zLnrS}4Ebc5j?no=bfLd>kPll8GoLU<4y`N)%rLscQ?4>{`JUVM`Azov_4KaA_^izq zZgc?<%k+b3Qy6L9Z94s4xQN%#X(wF)+d&fEJh$t!qD%7b9-|z^eXT1EraPAlQYW{E z1ja+4u6t6TLk5c(P@R0W`{xnWwNl~GFj^L@8|2WAk1LKImhHHTK2DAselMr<4&!uj z37TsR(CaqAbo7!-A{8a+fcXe!*#_%88n~?~85p%==J*wD#GXd9c%){9i@9~3a4J(V zhrowRA|DM^c5hKt7f2``9Ih<5+E}*JN@7wx?FG5)$4h0tHJNQ2Uo|jx(y{+^f{rtX_Mr z20^1hKTwFwqtTZspYgC8)0x~8 zhyXzth0yPe?uqwa0>8L|PLXQ#AQ?I~PWZf!H&%IH=(I1rYTdY9S@=Zl#E>vgk1%RQD5gz~b1~-yTZ+U2`S@L= z7xcCmqSRkz)^gX|dH;eFI zVFDwjWG8x8!n*1Kd@%2qz{Rf28Z^Am%)PpCXFvWa_){O6SJ3gkC+3QII6e?;XwL}4 zx(af%*Z3)tdbLHF4M7eO-Ecw{&)B&|LFKjHRnY7?N7{AEyW*cXN?**?hX?GlnxZPx zU1*Rpvz~!mn&b)oE6UidSKp@zZ;n}Qu67B1)gZJY69JwH;NDh%uZMrD7Bn{~GIaEe zaBtE*ai6bsSCnbhTZamy_8tjxZ?0fs9M@<#=G_~cvmRadpQqT>k|>bta)l$TeN=H% z13BbD4~M>?i>@_bTA7LQM#jBTl{0mR6nDjo-e+eSe|~DTgSBAHwdR_6f=+ z@{+=UV`DH9R^9pP`_Vy!>7Zr{iT|@MG*0mNR9ML}srTvf^G;gck|Z}ezu01+=}^rq z6Cfs#==+09xqB`S?rVJ$05?y5b*`&qrt+mR-$pCZR7Mn|@0a15I{dZh<-`>zAFRvN|k(h3_tvCPZQTc09%`&?N_E85ZP&yO4G zwq^1?k{bI3ye2&2FI|_DI?*rbySlIR0n6P64+1<=JohF0sV!pe8Fq2!lv-=fVmk10 zYWW5S6nsW=xfA;F4R;ocNh2Ftuh(f<@@O1H_(S2TH1tQ|eUkpQSmiZm`zW_=F2&9LP#MAVwG%!u2^ME9+8B?ZI?;w8Q5%t7?{93*f?y9Bm_^@TMDp8> z91(%1Dy2@T_1%(ru8Cwlzz4_zjl<9%mM@zr_ znWb7yKJy-YUX(ZJw{rhUBB%FM*0sZDX!+*_8^hY2f~2I~J3#M33EV!RE|4Q#9k{j; zw2u|@V~hhM^qgr-@+KVCP|Br1rQYt3%op<(r#0g6*qXgowsjRrsZE3sK-w({;jxg_ z5++xX>lzBtJ|>-L>CCXy>D2S2bKY^2OgZ)Y)Zh4(K{a8g64ca_ZVIDH)+;ikP8kCDEpej`kWBv7k?15&QGLL!bm9g z?zfhD+`T5ps%nZP@lD-FCb@oq6n9S#+QARB7x-f3lzit|2eDsp%LH|zZMyF0Mr0KN zdzxjI6#7l0JwP^I#FX%#;z{(t)Kh649a4B{6|^vch5feAheCqSxLJo_h*(hMyi9 z=ZlzYCraEqY$-&@hJss)jecL;BOu@2o~R_5%}-R}<2xPvVdPFR_>*z8^+uzCqR^D1 zrFFxPAw9@?9?Vh5y5hCKKdnNb$;bqd34yj64woI3*=p+^z*g?6t3Ov8Bn)&)wl?{{0iNEDja)IXEgQdGq&h#H~pLZ*2z!+PQ?< z$W$U#1NK=1Hlly)P6M@1r9m~2(`;}V5Xa;I!gB;5TNDO#060O`Zqa=WLoxWZX4T;| z5j+-B==dkmo##ZY7##o7Yn5y7I0c=HP09e{76$~wkl74{fWt&vv(@>Dyje1MKz5wT z<81i>FOL2e+Hwj4dfkDl1o3IipG0zLNE2!J`Gv0>shg1-c5T58W|ah24gmLmjlge z^z^Vv<`5ta<4f*P%So_GbaHHiqinfC8Tf`=noGD?LQq7;zKhDtm)?$U()bte9a z;i`$bE63w35c59H*6K47TBzn9DvWoq9&4*F*Rmmg~yFJ#yr24FFva0JZ03uxT>{yxFcxYIGT zV|yLeoZhpTTksU)Y^|ff^LhM$F=j=_HlITOb#SY6uYH5tk+#OKV#hu2+o-ISNXzgU z-@h~n=M3@7=eL3%Dx{@rW-Iwg?<#x=vRHIRwh7hWwp4V9gE9=~?1IwMO8&!h9^LS9 ze_=WyvOuuP9>n9?@i_OHH>Ys7UuO1Sj)BF#Iz39*KeM z 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 literal 0 HcmV?d00001 diff --git a/sphinx_docs/source/cno_extras_hide_alpha.png b/sphinx_docs/source/cno_extras_hide_alpha.png new file mode 100644 index 0000000000000000000000000000000000000000..2df9d36a12a917f1d95097bddd3316adbb4be192 GIT binary patch literal 85600 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 alLt6?!9&A34SH<|_$bIK%alkN2mUXp7k+{O literal 0 HcmV?d00001 diff --git a/sphinx_docs/source/networks.rst b/sphinx_docs/source/networks.rst index afed2c0a4d..e0fd944f00 100644 --- a/sphinx_docs/source/networks.rst +++ b/sphinx_docs/source/networks.rst @@ -3,8 +3,8 @@ Available Reaction Networks *************************** -iso7, aprox13, aprox19, and aprox21 -=================================== +``iso7``, ``aprox13``, ``aprox19``, and ``aprox21`` +=================================================== These are alpha-chains (with some other nuclei) from Frank Timmes. These networks share common rates (from ``Microphysics/rates``), @@ -32,8 +32,8 @@ where :math:`N_A` is Avogadro’s number (to convert this to “per gram”) and :math:`\edotnu` is the neutrino loss term. -general_null -============ +``general_null`` +================ ``general_null`` is a bare interface for a nuclear reaction network -- no reactions are enabled. The @@ -79,9 +79,44 @@ At compile time, the "`.net`" file is parsed and a network header ``Make.package``. +``CNO_extras`` +============== + +This network replicates the popular [MESA "cno_extras" +network](https://docs.mesastar.org/en/latest/net/nets.html) which is +meant to study hot-CNO burning and the start of the breakout from CNO +burning. + +We add ${}^{56}\mathrm{Fe}$ as an inert nucleus to allow this to be +used for X-ray burst simulations. + +.. figure:: cno_extras_hide_alpha.png + :align: center -ignition_chamulak -================= + +``CNO_He_burn`` +=============== + +This network is meant to study explosive H and He burning. It combines +the ``CNO_extras`` network (with the exception of the inert ${}^{56}\mathrm{Fe}$ +with the ``subch_simple`` network. This allows it to capture hot-CNO and +He burning. + +.. figure:: CNO_He_burn.png + :align: center + +``ECSN`` +======== + +``ECSN`` is meant to model electron-capture supernovae in O-Ne white dwarfs. +It includes various weak rates that are important to this process. + +.. figure:: ECSN.png + :align: center + + +``ignition_chamulak`` +===================== This network was introduced in our paper on convection in white dwarfs as a model of Type Ia supernovae :cite:`wdconvect`. It models @@ -104,11 +139,24 @@ binding energies are negative. The energy generation rate is then: (this is positive since both :math:`q` and :math:`dY/dt` are negative) -ignition_reaclib -================ +``ignition_reaclib`` +==================== + +This contains several networks designed to model C burning in WDs. They include: + +* ``C-burn-simple`` : a version of ``ignition_simple`` built from + ReacLib rates. This just includes the C+C rates and doesn't group + the endpoints together. + +* ``URCA-simple`` : a basic network for modeling convective Urca, + containing the ${}^{23}\mathrm{Na}$-${}^{23}\mathrm{Ne}$ Urca pair. + +* ``URCA-medium`` : a more extensive Urca network than ``URCA-simple``, + containing more extensive C burning rates. -ignition_simple -=============== + +``ignition_simple`` +=================== This is the original network used in our white dwarf convection studies :cite:`lowMach4`. It includes a single-step @@ -127,11 +175,26 @@ Kepler stellar evolution code (Weaver 1978), which implements the work of (Graboske 1973) for weak screening and the work of (Alastuey 1978 and Itoh 1979) for strong screening. -kpp -=== -powerlaw -======== +nova networks +============= + +The ``nova`` and ``nova2`` networks both are intended for modeling classical novae. + + +* ``nova`` focuses just on CNO/hot-CNO: + + .. figure:: nova.png + :align: center + +* ``nova2`` expands ``nova`` by adding the pp-chain nuclei: + + .. figure:: nova2.png + :align: center + + +``powerlaw`` +============ This is a simple single-step reaction rate. We will consider only two species, fuel, :math:`f`, and ash, :math:`a`, through @@ -185,8 +248,8 @@ There are a number of parameters we use to control the constants in this network. This is one of the few networks that was designed to work with ``gamma_law`` as the EOS. -rprox -===== +``rprox`` +========= This network contains 10 species, approximating hot CNO, triple-\ :math:`\alpha`, and rp-breakout burning up through :math:`^{56}\mathrm{Ni}`, @@ -195,8 +258,8 @@ reaction rates from ReacLib :cite:`ReacLib` where available. This network was used for the X-ray burst studies in :cite:`xrb:II`, :cite:`xrb:III`, and more details are contained in those papers. -triple_alpha_plus_cago -====================== +``triple_alpha_plus_cago`` +========================== This is a 2 reaction network for helium burning, capturing the :math:`3`-:math:`\alpha` reaction and :math:`\isotm{C}{12}(\alpha,\gamma)\isotm{O}{16}`. Additionally, @@ -206,8 +269,7 @@ reaction and :math:`\isotm{C}{12}(\alpha,\gamma)\isotm{O}{16}`. Additionally, subch networks ============== -The networks subch_full (subch2), subch_approx (subch), -subch_simple, and subch_base recreate an aprox13 +The subch networks recreate an ``aprox13`` alpha-chain + including a bypass rate for :math:`\isotm{C}{12}(\alpha, \gamma)\isotm{O}{16}` discussed in :cite:`ShenBildsten`. This is appropriate for explosive He burning. @@ -242,74 +304,47 @@ forward rate to just be the first rate. We do not include reverse rates for these processes. -subch_full ----------- - -subch_full, also known as subch2, does not create an effective rate -for :math:`(\alpha, \gamma)` and :math:`(\alpha, p)(p, \gamma)` -(i.e. combine them assuming proton equilibrium). Therefore, -we need to explicitly include the intermediate nuclei produced in -the :math:`(\alpha,p)` reactions. In all, 28 nuclei and 107 rates are included. +``subch_simple`` +---------------- -This network is generated via pynucastro using the ``subch_full.py`` script. -The overall network appears as: - -.. figure:: subch_full.png - :align: center - -.. note:: - subch_full has been removed in - commit 19108a72c2dc81e251669ef0fed4edf7e6a3f9ed - -subch_approx ------------- - -subch_approx, also known as subch, approximates subch_full by +``subch_simple`` uses the ideas above but approximates some +of the rates by combining some of the :math:`A(\alpha,p)X(p,\gamma)B` links with :math:`A(\alpha,\gamma)B`, allowing us to drop the intermediate nucleus :math:`X`. We do this for :math:`\isotm{Cl}{35}`, :math:`\isotm{K}{39}`, :math:`\isotm{Sc}{43}`, :math:`\isotm{V}{47}`, :math:`\isotm{Mn}{51}`, and :math:`\isotm{Co}{55}`. -The resulting network appears as: - -.. figure:: subch_approx.png - :align: center - -The nuclei in gray are not part of the network, but the links to them -are approximated. This reduces the number of nuclei compared to subch_full -from 28 to 22. - -.. note:: - subch_approx has been removed in - commit 19108a72c2dc81e251669ef0fed4edf7e6a3f9ed -subch_simple -------------- +Further simplifications include: -subch_simple further simplifies subch_approx by the following: - -* Reverse rates of :math:`\isotm{C}{12}+\isotm{C}{12}`, +* The reverse rates of :math:`\isotm{C}{12}+\isotm{C}{12}`, :math:`\isotm{C}{12}+\isotm{O}{16}`, :math:`\isotm{O}{16}+\isotm{O}{16}` are neglected since they're not present in the original aprox13 network -* :math:`\isotm{C}{12}+\isotm{Ne}{20}` rates are removed +* The :math:`\isotm{C}{12}+\isotm{Ne}{20}` rate is removed -* :math:`(\alpha, \gamma)` links between :math:`\isotm{Na}{23}`, +* The :math:`(\alpha, \gamma)` links between :math:`\isotm{Na}{23}`, :math:`\isotm{Al}{27}` and between :math:`\isotm{Al}{27}` and :math:`\isotm{P}{31}` are removed, since they're not in the original aprox13 network. +The network appears as: + .. figure:: subch_simple.png :align: center -.. warning:: - Due to inclusion of the rate sequence, n14(a, g)f18(a, p)ne21, there is - an artificial end-point at Na22. +The nuclei in gray are those that have been approximated about, but the links +are effectively accounted for in the approximate rates. + +.. warning:: Due to inclusion of the rate sequence, + ${}^{14}\mathrm{N}(\alpha, \gamma){}^{18}\mathrm{F}(\alpha, + \mathrm{p}){}^{21}\mathrm{Ne}$, there is an artificial end-point at + ${}^{22}\mathrm{Na}$. -subch_base ------------ +``subch_base`` +-------------- -subch_base is the simplest subch network. It is created to reconcile the +``subch_base`` is the simplest subch network. It is created to reconcile the artificial end-point at :math:`\isotm{Na}{22}`. This is done by excluding :math:`\isotm{N}{14}`, :math:`\isotm{F}{18}`, :math:`\isotm{Ne}{21}`, and :math:`\isotm{Na}{22}`. These nuclei were added to include diff --git a/sphinx_docs/source/nova.png b/sphinx_docs/source/nova.png new file mode 100644 index 0000000000000000000000000000000000000000..a9fbc5984d21a0254e7ababf86c1bdb7485ff14d GIT binary patch literal 47467 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 VR=xcVvf?Nd`jWxLq6-f9{|i_N+jjr} literal 0 HcmV?d00001 diff --git a/sphinx_docs/source/nova2.png b/sphinx_docs/source/nova2.png new file mode 100644 index 0000000000000000000000000000000000000000..8867d19795d5ea5f1493963236c1319cc1a9716b GIT binary patch literal 63679 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

LGui9EN1B2Jlv;Zu5L7;R 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

Z{A1_uV7*n{^ zmrd-P;Z8R{ovu#pARn?BrssP)v%y38A%Ky3YU2XUhBDFjyH_DyBGYlJ<*%swUd|`# z5Q%)FH)<~qbDK z{i#88*Vwdgn}hdu#`8cGr%EC)@?9?7f!BQK9CKdxG{@@bTlFk8IZ)RC+7PN~Xov&p z9~^XZoNaRFgqVN}F}fT|;Xwi;xty^N!1Z=j?!|Yoi=d;?xhKu2~ z8ZllcFvCKj5&W(ZkLlAc&ohr@PudQtW2=TG2DkJ+7VC{H?$7P3b&raWU%j`GD2Rq) z-2mZX`&p&~_FvJ>_5=cYv%H^_YTIfm4{f@c0rM6&V4+)S66E9aiVX~=JoQ%Es0YNM z!e|~+T_j0@(V9Ie;-KOai(0>j5i2V9EI!&x?hWZzSvvsa=2txwf)9_l;pW~IrIF8YM% zR#Y{Dzoct&R=OvznK}B)kJA<=0)i2G9o41tpk-hH!PHyzifcQ5DtNDDAk=5xeKNbT zaccjM=bSSdyn`=-&Y%3#r%!vkppgrbrRn|9vQ)k3$q7X?KsFhD$Nk1$xLL7jNF6p} z449XaUu@rNuJR*Q=O4(jA~I3eJJdVhXk>AH;+C+iM)zk=K)_^UmTGy6^hqy8aaQ8= zk`qE&>T?t4f%u9Elb+B|g^%~UdWoPbDRtB|O8m$WMujmVXO9sg!2({QOqx=u#A({` zKll*E2MSNEpIwdT0;A#18p#-nK4I-f3#+asL=EX^nV$?3A106hbHGUt4pl^tHQNx@ z;4xvbR*6#=j=&OVxjpq#&fRPj>9DDjEITpSX{^!L-Vh5RKtd18sAz&(reTir0nYp5 zr-^2=n=7bS$FTB)WzDF<%)L&O#QOI9>xVnvN9k(}Q4!*e>tHSQC}}!=(dLp!ywET6 z9jnaOR%5B0ONjJ|5YYT9$vF_NVAlKmQaJ*LQJCu#M&^knXmvwc@Z$b(q2?LzYrdYP zDB|f>QoLW560{x-QYZ9|e+M+5CLT}_MChi=P)6gy4zk+(@d<7S%Rm35guiNK6k`HL zt3ll6EVb0tR}Kvv8(!g%0=d=(a;=Cf^o2?z%WDohY#=CpXu^EA^~1ul`EUL;3cc+3 z6v%mmQ@^K#%?tE5HF?RNJDDN3*SL$mH6*_|XH*4CF;=m)$lvjz5RLB1HWd@E_u@>c zH(>6@>aj_)P*NZN!lb@wQoz6;A!r53MB?v6wUpA{-s)$yx{R*R-$USe7VE~nryQmY zoS^hikGibz>;D%=tQfk8f}vyZeN5F_C+a|^YpsdgglV2dlM|FN$kMzWW-s*yWV-s< zcdb?-N0mrS@A;N?i#J=s@lH`{kI2(gKdIU*hAo^bTKC8L`Hzs@fCz|4k}M)&OBP8YvB_C*i%JfP1Q8^u8B~%Ws0b?I*1~i5 zckVs!dw<@q*T0a)xz?(=X3d&aHO5FSI#Xr0l(I8c=&aMF9V`>WQAC0k(9&Nh;HeN3 zSGyDWqDKp5$rs0@@s_=zooDUO_+v@X5vJ#qtmbkSBA)nN{Gw|R86+-;iRl{7 zscj90?26$_(_lp`%CQEQ$7Y(6yEFh@LX-v^*noK$S~LRKoz<(!~UDk=tu zXJUaL42=>J5^@Fab^EO1t#$KTz-k2eq7gjM)IbIJE@;3ovd3Z&GXTVGN}4+)l`A}_ zpC4UWRmCkRNCC7QXeMbI`)q;vt>*>h71yX<1T(Qk8R1E>GzynT-LG@@>q=UGo9x5? zH09I-KBj+qSbt74U#Iex-s7lSJ-FMP&s#Y0adb!bxbs1|lFIM2i@7!+v*W#7up#xL@U~He1Vr5YFG6CUPv2XM~yiMnpgKqAtB^*39x|)_rS2Qq!`Xt?)Wn zbAn7>Rcnl_!hg={E{HdM0SLDFTJ9@ZhBW`3k~m0t1>DPlQ#+ zJ~N7_8?EVH2_4{T;)_ZkCj!^yn@4?vU9P{9aw%2fO(ogX$Zv-|6;iW2+`KBcyXR0s zm5H0PvS`u|zliwx4;sc-C7?`FFK@sM8IQX1%O% zprX=0Jr&kJFN8aBnh1qc(R|}XVVC}J&ku0NV5Z-im=BfA)?Z`v@dvlh*=gM#*+-p} z>9NfyL;Yqyfbl3asr<_n)D2}G=#M#v>k6vh2&aWJxc+tFTO$F+@l>vZ zx89k1TJ*nlnm`qi+)JXCiX%QMk5(L9Tu7O8w{wVfRS7akimCX@xhW*G&2%Qi(#|&B zpI7Vs5t_?UqPZUB^5(MR4o!U;j0S`5DfUZZQWuD82K|QldVwV%uZSfR#}X<9Cy?yW zMU~9A&S8Q6Q3}*tAu$3`vc@xUYpLDJ-QM3@9lYirJYn{~Q_plF_i@v*yAp}st8NrF zyZs9-Ht4gOaOm-6{FI>b6g8IiVNgh{34Vk%3pZF@w$#Ik*f3&K^{hsrZd-M9zN!%2 zjE&y~dj***Qr3__e?{1fAQ=3>Y$K_CRTqa+Bd&uE>6ZnkV1IkikTuj3Lwoneu% zCVyQKKs{hj#p~*QS*3%wY>~hD(F2l>yo7Po1!*g`8|`I->~;cQ-8vH#YofdNhJ2Q` zSKNlTz9q<9OQ>C!^Gs~A+d%((FnR4Ily9xqh&lX@%!>W+1O8sd*?BH^PLQCme z_GbCjz6ZQ+y!oBsDtfP?9Y050dK&tQi!_d!gKN3^S!WS$uH$9SYzm|7t(KSR8D6P% zqxCOKjB@PnS?#J`5BD0*IUR9CM|RSOn*TB_*V!eHW60IGvp1|zY$QL1s;sruJqBm4 z2nvX=PHUID3}4>~v}Hs!6wzD1y~X9ECi4DaJ(Ex>Dw3-mzx+i^#~V{zQe`o|EMq-i z`o3jJJ706poQq%8WuN2Slk0OS0be$8&18_u3oWBE0<;<1?2q9pYbWX^%@dJo!9^bL zRkYePT{{$2H`5stgykPIWhUh}xVj!^el|+^^E{c`+||d{rBky^XLudu+C+W{YV>5V zR(N1DgT}u)rC;u;RwYM9$Ljlt2T@yTvX4V{zE+s+Hf_cVG5yCAlM_g*z1EKO`tH!< z$JaH4s)I!1KDlr2JM_CEK}cXO-;3eXKT=^qa%&YI#lBc=G# zYDtW=t;4=;hq{(rPsQmK&0<;{f=Y)Eh69s;#^cnTPdWulYLPD9WylO4+!fBveH~%D zrm)$c!#^4)J1OFu=VDZyLOa@4pt?=P*dM{sE*l`y?{Yv^FyMDK&Y0n9CveIk975%s zka6ytZDm6WUJ|G^07DP6))>|89e0asEvXF{{Z&I$wJlDeudd3$o&$0;D8G1W>nWbq-?lN2iW<`H8{yH~Tuqk3;Q5=N?%IhG~hmPLIc>cJ&;&AJ#YK`8UqlUv+L@|35#rsY+o2Ji*2K6WDX7W!YJ@ZCM>g0cTJvx+?<&rv9e zxy*8}_@1qQ2|6N>+UmskNdU-~A4#O+qTxTXGVu&QBE++Af#jk>IEXt?&kx!!9yI3x zlz)!R^uyBS1T7MXp7fkv*g$oXGI>a#vzObfG*pLM8S?+q8p2hVWyt*fQ@;`AK9zV? z6`f5W_G;|@VEEE_<7cDq_6U0ouAA9!@cp$rR~3*v{UO&OvckAN>$0qjyI7yKhva)| zxBWXI-PSTsk#nPF3xOrsV=+Lce-F#y-M_{yT6(tZ1^`9f-k71DZl*^{5O$Jst}keSH3qH&9;RIw5H{{(qn zbCjI_ju6BFeUxu?#3D2coW4hzKBFvijQsMI>*n?;uGT6`o8U~RUT-(jTgS<@Q?-b&|lJ%@|}QgnA*~l z6Jyib*xS7C^Q2q8put69z0OyoB=qD|&0~LC1^6{MMSutRJ}z^Z;9h!~`Zkxr{ETh1 z0yLv=VUCfk09neM&~>3JP`n*p-Uc(sEa%q@>LLwSQKAjFuH(i!NSgS(J~a zPvzFm>_c8m&AQO$n?+N0;;`oB7U5&>m&>KyMZ$P)WCqe9 z(=gxJP|w1TLC6rgMxTW~yVSv5%S=$*d;Nj=s?YBdCpUvnH(g&W-~R02dradz$83L? zt&j5ZmzpJ9e_0H&sRn*v!1l@0OrPUOgYbhO^^AzA`%@Wb1=snoBx(-#?;MRQa8g4S ziP_;IkrlieZ631Hz9<24RP&D~pE9Qxf+?EC&zRAnSnqi&gy&7g!6xa()zGx#BcCSa za!~7l7#~aA5tNuu@yah*5lQ$~8T+5R(&tR8J$rt@H(uewQ&iJYrEGUmc4%hg&MsrP z`lp*nw}~`C+G!Z_k4I5@SFVsf=nh8`C8&gqj2KX87rEE`%_-Aj_ZR!N(ixUK9U_sN zjmRolc^OK@RSGqc*SlY}<6WR?1+g0wQ>zO~zcUYS(5YgPAjWJU?cR|$9Y70}osK-B z&%}i!qaccm@h%Go}tkZtEu5WK2jW!l)qM--laWA~ip-*T=^DY}AQEM-Vl zjkN|zC9jJGQFB3nsA{lhIoO_@b;I;Az`wN&I;S|E&R@L|9{17`v0E4gxGqU|)VrhP zC=C*^_lYLII_UBr+YxVgi^KKMA>cB3!DaGa&LRA!mykD$xAU5D3Hg?62nRb&Yqcze zJT5jNxw=1tQNdtR;-@HluldV}X&ZEkojWa<89=Js@I4zR;8$~5_@4WBE$WMlpOKKE zg+SP##ur~q@Q>^fR$NKd5o&xlKWI$X9F4LXP8iIj{5a$;n2+Pvbk@mAI!^-Y?%LX6 zFpv(xfS!pjU)x7k*tY2wz9l7;(7Z15$3MX|`!1(5Q4K^HWJV8|AhD%#h%^^PB-##j z1f2YXEkOE;QOr4y;V4Cn${?fBc|_fsB+>Jw)wu)waIIqR;zuk03qwhKxoC(38a3qA9@*K)yw zCcVFBqwl;B)^)t>d-`M?A2w)NU63`I!}4V%Vssjr`py7)Xfr>LH5SyP4(%SYTRH1sShWL%4@PIj5I$e*5C&^#69pr27^(AH*j^V7vr)#&2Uf) zA0|PWw>`7zXHLcDh09bwM%Z|Moa2%7LI^-iNG2AU3mg;juGna+Gj=_AhrLY~2|%ah zQ1LNeeDKmF;uqAi-~?m$!GHpuz{>bvV*Zc;_Ghw{7$lzm zLH}2Gzfi6~ckf)Tr^ukVDfY~%^Re~3(&NRn+clx?PDV*u;n@4~)E5R+um#b_ASHmM z@rLt223)tZ<~(bftXb5 zls6_%wiR6I5))Kp1LxlB=$6@Nr>g4L{`18|2InGoGCAJh?bKpoexfQ*{9_NKc#9In zVy~7=LYM{qH;IcxIY^l=M43<3&Cy@v7t6^=E-n)h&F7{-3J-4y0mF(o5_nt+eNSZ^ z&&Z}kQhPoE*@v6fcP7}_-AuN@`kLGD!Km<2rvaEb@^;Czkh5fYV0cB{Fi^XMPj{{J0i-$rBE$^o@17N6R$VXK@mk1bWa0L8D+_vpK_n*rH)*c$k}q zhbP}wPXO2P{(aklu0N1q0{d*ZN)}<~x85vC;*i{NP|HCIIOYLS^ijjZMmQWU^DwV` ze7HI5*yeAB$2$R$7k6K`91FZSe`#?$ucn3#a8>1;w17KsmN9FY(ah3Q$}>>k4G?h6 zKvN{DaVrM~1{OzPWiTOk@9@skzd5xTIg_^2@szt{q132GF6DAyxBoNe zNYn-&bsA!P@Fk&CggPok>soPy%GAdHyaC2Hr*Nl?LxBtL-zE!8_U9e@KmU+GQsup7 zs`IxLg<~Z9BY6T+XL8^HIOud|2aM7d8s%edBfDy)D^f} zvtGQw38hjZq!dsg+XpG;R$m8-P6sK3N3scimpQPUkeGP)zU1}!*wfR5tzL#ENW{5~ zT}!LEqshd=vR$iKN-SVh&EOmC3-}3F(CoDR^zOdTN>PEHrDZ&#`C=Kc#Z=`o5k5IN zX-p?R2Q1|5NEHqd8=M2#lu(td1_X8j#7Fdqo-!0Ks4Go5R;~H#L46^oq(pSMnG2Pg znku{YVxV_)lwi3#&%!G0hyx*vA8QjJ$rxo!cWSQMToh52AFaPFSyHzyKk3%a;c)Y2 z``^+|u0XJ`&~TU7__hD-;t09IsXGUI_zM?W0Y}#d_q6)Do;EX`L2zzxWF%VtA<#s) zWjg?Te&VIe1V3dk*Z$YEH!*Wd3?uLiE&2KUrE7F&HiF2N{NZu46$QR-06$rjL6M>V z?q<6>Y94eCY|rL~%0MzxTtUICxUi70rH9A0UU(oAiE4p-=74QoryWB@MMZ0IaWQM` zNw=ft{73g@ax~+aqobny*V|W7QPR`FsX@~L+gDj*HIOGs=&a>$)Rp^)Lr8TIBf%R> zt(l&V{0b_GelAG+$zjb7P&;0W|C7!w$(ZiMoXcn#8t~kF2=#4FW+sX@BIKn|o3XYw z70M^Ty~OBgVp0-OtOjGWHD3xG128X+!L$woHC6BMGczSL!pnk>Xp4 zhZ(5T7`CgumV2m+(Dh2(rv|zS!j>z8(e2xEpuHUoICX1a=Z6)IUXRW}IygX|!3T8B zHb9?k9 zG4N}$F=jn&dC427_QiNt6j& z2@FZy_RXM#9tO2_y0EY?0byZP6O;SDuNQzi3YEmqA zl1G(5tpy@~>lOlb^!c^uI?@^NLE_iCaECSnY%0ToK7anlw`sP(fCBYnG=en4=k*)Y z31*G0dHe6oMOaKYIXRWP&Z!{&3Srk2^Zo9Sl9JM56&m>zwk1HL0ns;t5(O4kl;=CG zSm4&SuV8}(P#?=11uTG~2;rp9_dd-{U{IZY^$P3?DmBWgs>Ca+t5eb#oC*B%Zl8l1 zn0>?pxqVyIdA*)9->BE?zv;fqkYj|pmo)tCCRC7=Mbm77r+a93L+gP;Sr!iaoOgEJc7MEtjuJ7l%Ktu> zZG5iiX|k`VIp|LQLyb|h{Sn-Oq4S7xuCebz?CBPOUlN2;wRA3AU^?|?*L|}ik*A!~ zsHyhHxRW|6@ECOL#BR|qYXWWcN3A8d`B&T1jMv|12s&1p>gV(kfLM=N5j2>M>4dE> z8yQ6b-)pq7sj1MDAxHg!fyfH`ZiWN6CuAeE1`@%*gYX?wriUYFobW%9lC>AoFnzew z|Fh-)KmVXljqFUUlJ?Y4QYBGtfXd!l4Lrs!XG&NQdUAa}{e$I)PAl zheRLOYD^bQ5a`=OmMl2#GOtx5Ln9+@Ny!1H$6(Rfk7<@|;2P*c8tFsyA;jJ~hJEap#-?F(uHISQODP!ctM=uCElo=R@;n8*^( z&@C82Hjx7{r{QAO80c9S@CU{Kg3V{}a4pav0s;lDP;$+N1}YF1yE_sHJ`Jy{8@G>w z^hFZ^TKELoetemU2L>cm1MHS)6nL<&ql>UZ!)xR-*scM=G2l9&kJ;|!1T+;+TBhB* zX9F{VFw46w^&a2;0kh74%yKI|GG-JqW;haJoKNPz?Q8~6PH55v*|pi}A7DglAlmBV z41saAx6(z!~3T=&)!VrmNvyPYBl7aCT z%P(Z<%>uW#>ZMDJ2<*K%g3cDgDRK7WFeoIdVNgQz914ZcGbmj|xYJ=BfE;D{J|sji zOov1L{4sG8nY+h5h$uAxvzt%P_=jA7bQ^<^bg$3C$$&c)c@7Q#p*x-i#%@BVZ2ID|UD_tO7g|8PJ@Sj(QQ TjCk0Eg3oz%U9}PwtKk0vt}YDB literal 0 HcmV?d00001 diff --git a/sphinx_docs/source/subch_approx.png b/sphinx_docs/source/subch_approx.png deleted file mode 100644 index 1fa79a0ac026ca4ddde01b6711c2c54b62b86b60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92928 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 From ecbc595ec086227d1120b97efc51d92aa6e14dc4 Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Fri, 26 Jul 2024 09:07:04 -0400 Subject: [PATCH 26/33] add the ability print warnings from GPU (#1629) this is enabled with USE_GPU_PRINTF --- .github/workflows/good_defines.txt | 1 + Make.Microphysics | 4 ++++ integration/integrator_setup_sdc.H | 4 ++++ integration/integrator_setup_strang.H | 4 ++++ 4 files changed, 13 insertions(+) diff --git a/.github/workflows/good_defines.txt b/.github/workflows/good_defines.txt index c2c60995b8..7f06eea880 100644 --- a/.github/workflows/good_defines.txt +++ b/.github/workflows/good_defines.txt @@ -1,3 +1,4 @@ +ALLOW_GPU_PRINTF ALLOW_JACOBIAN_CACHING AMREX_USE_CUDA AMREX_USE_GPU diff --git a/Make.Microphysics b/Make.Microphysics index 9b6fa9e526..3cfab8b613 100644 --- a/Make.Microphysics +++ b/Make.Microphysics @@ -35,6 +35,10 @@ endif # Require C++17 CXXSTD := c++17 +ifeq ($(USE_GPU_PRINTF),TRUE) + DEFINES += -DALLOW_GPU_PRINTF +endif + include $(AMREX_HOME)/Tools/GNUMake/Make.defs MICROPHYSICS_AUTO_SOURCE_DIR := $(TmpBuildDir)/microphysics_sources/$(optionsSuffix).EXE diff --git a/integration/integrator_setup_sdc.H b/integration/integrator_setup_sdc.H index ce49cc5491..f55c46ff62 100644 --- a/integration/integrator_setup_sdc.H +++ b/integration/integrator_setup_sdc.H @@ -3,6 +3,7 @@ #include #include +#include #include @@ -261,6 +262,9 @@ void integrator_cleanup (IntegratorT& int_state, BurnT& state, } std::cout << std::endl; #endif +#elif defined(ALLOW_GPU_PRINTF) + AMREX_DEVICE_PRINTF("[ERROR] integration failed in net, istate = %d, time = %g, dt = %g, dens_start = %g, temp_start = %g\n", + istate, state.time, dt, state.rho_orig, state_save.T_in); #endif } else { #ifndef AMREX_USE_GPU diff --git a/integration/integrator_setup_strang.H b/integration/integrator_setup_strang.H index 5c5a94469b..e4fcb9eb86 100644 --- a/integration/integrator_setup_strang.H +++ b/integration/integrator_setup_strang.H @@ -3,6 +3,7 @@ #include #include +#include #include @@ -217,6 +218,9 @@ void integrator_cleanup (IntegratorT& int_state, BurnT& state, } std::cout << std::endl; std::cout << "energy generated = " << state.e << std::endl; +#elif defined(ALLOW_GPU_PRINTF) + AMREX_DEVICE_PRINTF("[ERROR] integration failed in net, istate = %d, time = %g, dt = %g, dens = %g, temp_start = %g\n", + istate, int_state.t, dt, state.rho, state_save.T_in); #endif } else { #ifndef AMREX_USE_GPU From 3f62e993ed5e352ba20c8a511290eeede4239f5b Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Fri, 26 Jul 2024 18:13:58 -0400 Subject: [PATCH 27/33] remove "use namespace integrator_rp" (#1625) --- EOS/helmholtz/actual_eos.H | 14 +++---- integration/BackwardEuler/_parameters | 3 -- integration/BackwardEuler/be_integrator.H | 8 ++-- integration/ForwardEuler/actual_integrator.H | 36 ++++++++-------- integration/QSS/actual_integrator.H | 44 ++++++++++---------- integration/RKC/actual_integrator_sdc.H | 2 - integration/RKC/rkc.H | 6 +-- integration/VODE/actual_integrator_sdc.H | 2 - integration/VODE/vode_dvjac.H | 8 ++-- integration/VODE/vode_dvode.H | 2 +- integration/VODE/vode_dvstep.H | 9 ++-- integration/integrator_rhs_sdc.H | 14 +++---- integration/integrator_rhs_strang.H | 26 ++++++------ integration/integrator_type.H | 6 +-- integration/integrator_type_sdc.H | 15 ++++--- integration/integrator_type_strang.H | 16 ++++--- integration/utils/initial_timestep.H | 2 +- integration/utils/jacobian_utilities.H | 2 - integration/utils/nonaka_plot.H | 4 +- integration/utils/numerical_jacobian.H | 20 ++++----- unit_test/burn_cell/burn_cell.H | 2 +- unit_test/test_rhs/main.cpp | 4 +- 22 files changed, 110 insertions(+), 135 deletions(-) diff --git a/EOS/helmholtz/actual_eos.H b/EOS/helmholtz/actual_eos.H index dfe8983e0c..62e8b03a3a 100644 --- a/EOS/helmholtz/actual_eos.H +++ b/EOS/helmholtz/actual_eos.H @@ -16,8 +16,6 @@ #include #include -using namespace eos_rp; - // Frank Timmes Helmholtz based Equation of State // https://cococubed.com/ @@ -576,8 +574,8 @@ void apply_radiation (T& state) // on prad, this will result in the radiation term effectively vanishing below the // cutoff density. For simplicity we ignore the effect this has on the derivatives. - if (prad_limiter_rho_c > 0.0e0_rt && prad_limiter_delta_rho > 0.0e0_rt) { - prad = prad * 0.5e0_rt * (1.0e0_rt + std::tanh((state.rho - prad_limiter_rho_c) / prad_limiter_delta_rho)); + if (eos_rp::prad_limiter_rho_c > 0.0e0_rt && eos_rp::prad_limiter_delta_rho > 0.0e0_rt) { + prad = prad * 0.5e0_rt * (1.0e0_rt + std::tanh((state.rho - eos_rp::prad_limiter_rho_c) / eos_rp::prad_limiter_delta_rho)); } amrex::Real dpraddd = 0.0e0_rt; @@ -1310,10 +1308,10 @@ void actual_eos_init () // Read in the runtime parameters - input_is_constant = eos_input_is_constant; - do_coulomb = use_eos_coulomb; - ttol = eos_ttol; - dtol = eos_dtol; + input_is_constant = eos_rp::eos_input_is_constant; + do_coulomb = eos_rp::use_eos_coulomb; + ttol = eos_rp::eos_ttol; + dtol = eos_rp::eos_dtol; // read the helmholtz free energy table diff --git a/integration/BackwardEuler/_parameters b/integration/BackwardEuler/_parameters index c845f1424b..f32bd9f6eb 100644 --- a/integration/BackwardEuler/_parameters +++ b/integration/BackwardEuler/_parameters @@ -1,8 +1,5 @@ @namespace: integrator -# Maximum amount any quantity can change by in a timestep -maximum_timestep_change_factor real 1.01 - # Maximum number of iterations for the Newton solve max_iter int 25 diff --git a/integration/BackwardEuler/be_integrator.H b/integration/BackwardEuler/be_integrator.H index 6ce4ddeb9e..1a8e5c954c 100644 --- a/integration/BackwardEuler/be_integrator.H +++ b/integration/BackwardEuler/be_integrator.H @@ -51,7 +51,7 @@ int single_step (BurnT& state, BeT& be, const amrex::Real dt) // Newton loop - for (int iter = 1; iter <= max_iter; iter++) { + for (int iter = 1; iter <= integrator_rp::max_iter; iter++) { // work with the current guess @@ -136,7 +136,7 @@ int single_step (BurnT& state, BeT& be, const amrex::Real dt) y_norm = std::sqrt(y_norm / int_neqs); b_norm = std::sqrt(b_norm / int_neqs); - if (b_norm < tol * y_norm) { + if (b_norm < integrator_rp::tol * y_norm) { converged = true; break; } @@ -191,7 +191,7 @@ int be_integrator (BurnT& state, BeT& be) // main timestepping loop while (be.t < (1.0_rt - timestep_safety_factor) * be.tout && - be.n_step < ode_max_steps) { + be.n_step < integrator_rp::ode_max_steps) { // store the current solution -- we'll revert to this if a step fails amrex::Array1D y_old; @@ -291,7 +291,7 @@ int be_integrator (BurnT& state, BeT& be) } - if (be.n_step >= ode_max_steps) { + if (be.n_step >= integrator_rp::ode_max_steps) { ierr = IERR_TOO_MANY_STEPS; } diff --git a/integration/ForwardEuler/actual_integrator.H b/integration/ForwardEuler/actual_integrator.H index 6fd19d1a59..7bf5d6e8bc 100644 --- a/integration/ForwardEuler/actual_integrator.H +++ b/integration/ForwardEuler/actual_integrator.H @@ -15,8 +15,6 @@ #include #include -using namespace integrator_rp; - template AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real calculate_dt (IntT& int_state, BurnT& state, amrex::Array1D& spec_rhs, amrex::Real& ener_rhs) @@ -31,13 +29,13 @@ amrex::Real calculate_dt (IntT& int_state, BurnT& state, amrex::Array1D= atol_spec) { + if (state.xn[n-1] >= integrator_rp::atol_spec) { amrex::Real target_dX; if (spec_rhs(n) > 0.0) { - target_dX = (maximum_timestep_change_factor - 1.0_rt) * state.xn[n-1]; + target_dX = (integrator_rp::maximum_timestep_change_factor - 1.0_rt) * state.xn[n-1]; } else { - target_dX = (1.0_rt - 1.0_rt / maximum_timestep_change_factor) * state.xn[n-1]; + target_dX = (1.0_rt - 1.0_rt / integrator_rp::maximum_timestep_change_factor) * state.xn[n-1]; } amrex::Real dXdt = amrex::max(std::abs(spec_rhs(n)), 1.0e-30_rt); @@ -48,13 +46,13 @@ amrex::Real calculate_dt (IntT& int_state, BurnT& state, amrex::Array1D 0.0) { - target_de = (maximum_timestep_change_factor - 1.0_rt) * state.e; + target_de = (integrator_rp::maximum_timestep_change_factor - 1.0_rt) * state.e; } else { - target_de = (1.0_rt - 1.0_rt / maximum_timestep_change_factor) * state.e; + target_de = (1.0_rt - 1.0_rt / integrator_rp::maximum_timestep_change_factor) * state.e; } amrex::Real dedt = amrex::max(std::abs(ener_rhs), 1.0e-30_rt); @@ -63,7 +61,7 @@ amrex::Real calculate_dt (IntT& int_state, BurnT& state, amrex::Array1D spec_rhs; @@ -204,7 +202,7 @@ void actual_integrator (BurnT& state, amrex::Real dt, bool is_retry=false) state.xn[n-1] += spec_rhs(n) * dt_sub; } - if (integrate_energy) { + if (integrator_rp::integrate_energy) { fe.y(net_ienuc) += ener_rhs * dt_sub; state.e += ener_rhs * dt_sub; } @@ -215,7 +213,7 @@ void actual_integrator (BurnT& state, amrex::Real dt, bool is_retry=false) clean_state(fe.t, fe, state); } - if (fe.n_step >= ode_max_steps) { + if (fe.n_step >= integrator_rp::ode_max_steps) { state.success = false; state.error_code = IERR_TOO_MANY_STEPS; } @@ -226,7 +224,7 @@ void actual_integrator (BurnT& state, amrex::Real dt, bool is_retry=false) state.n_jac = 0; #ifndef AMREX_USE_GPU - if (burner_verbose) { + if (integrator_rp::burner_verbose) { // Print out some integration statistics, if desired. std::cout << "integration summary: " << std::endl; std::cout << "dens: " << state.rho << " temp: " << state.T << std::endl; diff --git a/integration/QSS/actual_integrator.H b/integration/QSS/actual_integrator.H index bfbaf0484f..df12332c8a 100644 --- a/integration/QSS/actual_integrator.H +++ b/integration/QSS/actual_integrator.H @@ -14,8 +14,6 @@ #include #include -using namespace integrator_rp; - template AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void clean_state (BurnT& state) @@ -26,13 +24,13 @@ void clean_state (BurnT& state) // Evaluate the EOS to get T from e. - if (call_eos_in_rhs) { + if (integrator_rp::call_eos_in_rhs) { eos(eos_input_re, state); } // Ensure that the temperature always stays within reasonable limits. - state.T = amrex::min(MAX_TEMP, amrex::max(state.T, EOSData::mintemp)); + state.T = amrex::min(integrator_rp::MAX_TEMP, amrex::max(state.T, EOSData::mintemp)); } template @@ -78,7 +76,7 @@ void evaluate_rhs (BurnT& state, amrex::Array1D& f_minu f_minus(n) = ydot(2 * n) * aion[n-1]; } - if (integrate_energy) { + if (integrator_rp::integrate_energy) { dedt = ydot(2 * net_ienuc - 1) - ydot(2 * net_ienuc); } else { @@ -130,7 +128,7 @@ bool predictor (BurnT& state_0, amrex::Array1D& f_minus amrex::Real dXdt = (f_plus_0(n) - k_0 * X_0) / (1.0_rt + alpha_0 * k_0 * dt); state.xn[n-1] = X_0 + dt * dXdt; - if (X_0 >= atol_spec && (state.xn[n-1] < -species_tolerance || state.xn[n-1] > 1.0_rt + species_tolerance)) { + if (X_0 >= integrator_rp::atol_spec && (state.xn[n-1] < -integrator_rp::species_tolerance || state.xn[n-1] > 1.0_rt + integrator_rp::species_tolerance)) { return false; } } @@ -178,7 +176,7 @@ bool corrector (const BurnT& state_0, const amrex::Array1D= atol_spec && (state.xn[n-1] < -species_tolerance || state.xn[n-1] > 1.0_rt + species_tolerance)) { + if (X_0 >= integrator_rp::atol_spec && (state.xn[n-1] < -integrator_rp::species_tolerance || state.xn[n-1] > 1.0_rt + integrator_rp::species_tolerance)) { return false; } } @@ -223,14 +221,14 @@ void actual_integrator (BurnT& state, amrex::Real dt, const bool is_retry=false) amrex::Real dt_sub = dt; for (int n = 1; n <= NumSpec; ++n) { - if (xn_in[n-1] >= atol_spec) { + if (xn_in[n-1] >= integrator_rp::atol_spec) { dt_sub = amrex::min(dt_sub, xn_in[n - 1] / amrex::max(std::abs(f_plus_init(n) - f_minus_init(n)), 1.e-50_rt)); } } - dt_sub *= dt_init_fraction; + dt_sub *= integrator_rp::dt_init_fraction; - dt_sub = amrex::min(dt_sub, ode_max_dt); + dt_sub = amrex::min(dt_sub, integrator_rp::ode_max_dt); // When checking the integration time to see if we're done, // be careful with roundoff issues. @@ -239,13 +237,13 @@ void actual_integrator (BurnT& state, amrex::Real dt, const bool is_retry=false) int num_timesteps = 0; - while (t < (1.0_rt - timestep_safety_factor) * dt && num_timesteps < ode_max_steps) + while (t < (1.0_rt - timestep_safety_factor) * dt && num_timesteps < integrator_rp::ode_max_steps) { // Start the step with a guess that is a small factor above the previous timestep. - dt_sub *= dt_max_change_factor; + dt_sub *= integrator_rp::dt_max_change_factor; - dt_sub = amrex::min(dt_sub, ode_max_dt); + dt_sub = amrex::min(dt_sub, integrator_rp::ode_max_dt); // Prevent the timestep from overshooting the final time. @@ -304,7 +302,7 @@ void actual_integrator (BurnT& state, amrex::Real dt, const bool is_retry=false) int timestep_iter = 0; - for (timestep_iter = 0; timestep_iter < num_timestep_iters; ++timestep_iter) + for (timestep_iter = 0; timestep_iter < integrator_rp::num_timestep_iters; ++timestep_iter) { // Evaluate the predictor. The return value indicates whether we consider it // a successful prediction; if it was unsuccessful, we'll cut the timestep by @@ -320,7 +318,7 @@ void actual_integrator (BurnT& state, amrex::Real dt, const bool is_retry=false) BurnT predictor_state = state; if (!success) { - dt_sub *= dt_cut_factor; + dt_sub *= integrator_rp::dt_cut_factor; continue; } @@ -329,7 +327,7 @@ void actual_integrator (BurnT& state, amrex::Real dt, const bool is_retry=false) // predictor for the next. The return value is the maximum relative diff between // the predictor and the corrector. - for (int corrector_iter = 0; corrector_iter < num_corrector_iters; ++corrector_iter) + for (int corrector_iter = 0; corrector_iter < integrator_rp::num_corrector_iters; ++corrector_iter) { success = corrector(state_0, f_minus_0, f_plus_0, dedt_0, t, dt_sub, state); @@ -339,7 +337,7 @@ void actual_integrator (BurnT& state, amrex::Real dt, const bool is_retry=false) } if (!success) { - dt_sub *= dt_cut_factor; + dt_sub *= integrator_rp::dt_cut_factor; continue; } @@ -350,7 +348,7 @@ void actual_integrator (BurnT& state, amrex::Real dt, const bool is_retry=false) for (int n = 1; n <= NumSpec; ++n) { amrex::Real dX = std::abs(state.xn[n-1] - predictor_state.xn[n-1]); - if (state_0.xn[n-1] >= atol_spec) { + if (state_0.xn[n-1] >= integrator_rp::atol_spec) { max_diff = amrex::max(max_diff, dX / state.xn[n-1]); } } @@ -358,7 +356,7 @@ void actual_integrator (BurnT& state, amrex::Real dt, const bool is_retry=false) // If the relative diff was smaller than the requested tolerance factor, we're done. // Otherwise, cut dt and try again. - if (max_diff <= predictor_corrector_tolerance) { + if (max_diff <= integrator_rp::predictor_corrector_tolerance) { break; } else { @@ -369,14 +367,14 @@ void actual_integrator (BurnT& state, amrex::Real dt, const bool is_retry=false) // method; given the expense of our RHS it seems unlikely that this would make // a performance difference, but it is a potential optimization. - amrex::Real sigma = max_diff / (predictor_corrector_tolerance / tolerance_safety_factor); + amrex::Real sigma = max_diff / (integrator_rp::predictor_corrector_tolerance / integrator_rp::tolerance_safety_factor); dt_sub *= (1.0_rt / std::sqrt(sigma) + 0.005); } } // If we didn't get a converged timestep in the fixed number of iterations, the integration failed. - if (timestep_iter >= num_timestep_iters) { + if (timestep_iter >= integrator_rp::num_timestep_iters) { state.success = false; state.error_code = IERR_CORRECTOR_CONVERGENCE; break; @@ -389,7 +387,7 @@ void actual_integrator (BurnT& state, amrex::Real dt, const bool is_retry=false) state.n_step = num_timesteps; } - if (num_timesteps >= ode_max_steps) { + if (num_timesteps >= integrator_rp::ode_max_steps) { state.success = false; state.error_code = IERR_TOO_MANY_STEPS; } @@ -403,7 +401,7 @@ void actual_integrator (BurnT& state, amrex::Real dt, const bool is_retry=false) state.e -= e_in; #ifndef AMREX_USE_GPU - if (burner_verbose) { + if (integrator_rp::burner_verbose) { // Print out some integration statistics, if desired. std::cout << "integration summary: " << std::endl; std::cout << "dens: " << state.rho << " temp: " << state.T << std::endl; diff --git a/integration/RKC/actual_integrator_sdc.H b/integration/RKC/actual_integrator_sdc.H index 103136306d..59a053b24f 100644 --- a/integration/RKC/actual_integrator_sdc.H +++ b/integration/RKC/actual_integrator_sdc.H @@ -9,8 +9,6 @@ #include #include -using namespace integrator_rp; - template AMREX_GPU_HOST_DEVICE AMREX_INLINE void actual_integrator (BurnT& state, amrex::Real dt, bool is_retry=false) diff --git a/integration/RKC/rkc.H b/integration/RKC/rkc.H index 958cffc3ca..9598534f33 100644 --- a/integration/RKC/rkc.H +++ b/integration/RKC/rkc.H @@ -331,12 +331,12 @@ int rkc (BurnT& state, RkcT& rstate) // Test the input data. bool valid = true; - if ((rtol_spec > rmax) || (rtol_enuc > rmax) || - (rtol_spec < rmin) || (rtol_enuc < rmin)) { + if ((rstate.rtol_spec > rmax) || (rstate.rtol_enuc > rmax) || + (rstate.rtol_spec < rmin) || (rstate.rtol_enuc < rmin)) { valid = false; } - if (atol_spec < 0.0_rt || atol_enuc < 0.0_rt) { + if (rstate.atol_spec < 0.0_rt || rstate.atol_enuc < 0.0_rt) { valid = false; } diff --git a/integration/VODE/actual_integrator_sdc.H b/integration/VODE/actual_integrator_sdc.H index 8cc855c75d..8a1a362b90 100644 --- a/integration/VODE/actual_integrator_sdc.H +++ b/integration/VODE/actual_integrator_sdc.H @@ -12,8 +12,6 @@ #include #include -using namespace integrator_rp; - template AMREX_GPU_HOST_DEVICE AMREX_INLINE void actual_integrator (BurnT& state, amrex::Real dt, bool is_retry=false) diff --git a/integration/VODE/vode_dvjac.H b/integration/VODE/vode_dvjac.H index 5be11a5483..848a31621b 100644 --- a/integration/VODE/vode_dvjac.H +++ b/integration/VODE/vode_dvjac.H @@ -33,11 +33,11 @@ void dvjac (int& IERPJ, BurnT& state, DvodeT& vstate) int evaluate_jacobian = 1; - if (use_jacobian_caching) { + if (integrator_rp::use_jacobian_caching) { evaluate_jacobian = 0; } - if (use_jacobian_caching) { + if (integrator_rp::use_jacobian_caching) { // Now evaluate the cases where we're caching the Jacobian but aren't // going to be using the cached Jacobian. @@ -86,7 +86,7 @@ void dvjac (int& IERPJ, BurnT& state, DvodeT& vstate) #ifdef ALLOW_JACOBIAN_CACHING // Store the Jacobian if we're caching. - if (use_jacobian_caching == 1) { + if (integrator_rp::use_jacobian_caching == 1) { vstate.jac_save = vstate.jac; } #endif @@ -137,7 +137,7 @@ void dvjac (int& IERPJ, BurnT& state, DvodeT& vstate) #ifdef ALLOW_JACOBIAN_CACHING // Store the Jacobian if we're caching. - if (use_jacobian_caching == 1) { + if (integrator_rp::use_jacobian_caching == 1) { vstate.jac_save = vstate.jac; } #endif diff --git a/integration/VODE/vode_dvode.H b/integration/VODE/vode_dvode.H index c5bd5e2bd6..361b7cba50 100644 --- a/integration/VODE/vode_dvode.H +++ b/integration/VODE/vode_dvode.H @@ -133,7 +133,7 @@ int dvode (BurnT& state, DvodeT& vstate) // start of problem), check for too much accuracy being requested, and // check for H below the roundoff level in T. - if (vstate.n_step >= ode_max_steps) { + if (vstate.n_step >= integrator_rp::ode_max_steps) { // The maximum number of steps was taken before reaching TOUT. #ifndef AMREX_USE_GPU std::cout << amrex::Font::Bold << amrex::FGColor::Red << "DVODE: maximum number of steps taken before reaching TOUT" << amrex::ResetDisplay << std::endl; diff --git a/integration/VODE/vode_dvstep.H b/integration/VODE/vode_dvstep.H index cf07a5b27e..18faa5d420 100644 --- a/integration/VODE/vode_dvstep.H +++ b/integration/VODE/vode_dvstep.H @@ -241,7 +241,8 @@ int dvstep (BurnT& state, DvodeT& vstate) // factor in a given step (as long as their initial abundance was large enough // for us to worry about). - if (std::abs(y_save(i)) > X_reject_buffer * atol_spec && std::abs(vstate.y(i)) > X_reject_buffer * atol_spec && + if (std::abs(y_save(i)) > integrator_rp::X_reject_buffer * vstate.atol_spec && + std::abs(vstate.y(i)) > integrator_rp::X_reject_buffer * vstate.atol_spec && (std::abs(vstate.y(i)) > vode_increase_change_factor * std::abs(y_save(i)) || std::abs(vstate.y(i)) < vode_decrease_change_factor * std::abs(y_save(i)))) { #ifdef MICROPHYSICS_DEBUG @@ -262,7 +263,7 @@ int dvstep (BurnT& state, DvodeT& vstate) // Don't enforce the condition below if // vstate.y contains number densities - if (!use_number_densities) { + if (! integrator_rp::use_number_densities) { if (vstate.y(i) > 1.0_rt + species_failure_tolerance) { valid_update = false; break; @@ -280,8 +281,8 @@ int dvstep (BurnT& state, DvodeT& vstate) amrex::Real X_current = (vstate.y(SFS+i) - vstate.H * state.ydot_a[SFS-1+i]) / rho_current; - if (std::abs(y_save(SFS+i)) > X_reject_buffer * atol_spec && - std::abs(X_current) > X_reject_buffer * atol_spec && + if (std::abs(y_save(SFS+i)) > integrator_rp::X_reject_buffer * vstate.atol_spec && + std::abs(X_current) > integrator_rp::X_reject_buffer * vstate.atol_spec && (std::abs(X_current) > vode_increase_change_factor * std::abs(y_save(SFS+i)) || std::abs(X_current) < vode_decrease_change_factor * std::abs(y_save(SFS+i)))) { #ifdef MICROPHYSICS_DEBUG diff --git a/integration/integrator_rhs_sdc.H b/integration/integrator_rhs_sdc.H index b6272fa5ea..a953d253b5 100644 --- a/integration/integrator_rhs_sdc.H +++ b/integration/integrator_rhs_sdc.H @@ -42,7 +42,7 @@ void rhs(const amrex::Real time, BurnT& state, T& int_state, RArray1D& ydot, // make sure that the temperature is valid - if (state.T <= EOSData::mintemp || state.T >= MAX_TEMP) { + if (state.T <= EOSData::mintemp || state.T >= integrator_rp::MAX_TEMP) { for (int n = 1; n <= INT_NEQS; ++n) { ydot(n) = 0.0_rt; @@ -64,12 +64,12 @@ void rhs(const amrex::Real time, BurnT& state, T& int_state, RArray1D& ydot, // apply fudge factor: - if (react_boost > 0.0_rt) { + if (integrator_rp::react_boost > 0.0_rt) { // the correct size here is the size of the reactive state // RHS, not the SDC state RHS (neqs, not INT_NEQS) for (int n = 1; n <= neqs; ++n) { - ydot(n) *= react_boost; + ydot(n) *= integrator_rp::react_boost; } } @@ -104,7 +104,7 @@ void jac (const amrex::Real time, BurnT& state, T& int_state, MatrixType& pd) int_to_burn(time, int_state, state); - if (state.T <= EOSData::mintemp || state.T >= MAX_TEMP) { + if (state.T <= EOSData::mintemp || state.T >= integrator_rp::MAX_TEMP) { for (int j = 1; j <= INT_NEQS; ++j) { for (int i = 1; i <= INT_NEQS; ++i) { @@ -136,8 +136,8 @@ void jac (const amrex::Real time, BurnT& state, T& int_state, MatrixType& pd) // apply fudge factor: - if (react_boost > 0.0_rt) { - pd.mul(react_boost); + if (integrator_rp::react_boost > 0.0_rt) { + pd.mul(integrator_rp::react_boost); } // The system we integrate has the form (rho X_k, rho e) @@ -178,7 +178,7 @@ void jac (const amrex::Real time, BurnT& state, T& int_state, MatrixType& pd) // apply scale_system scaling (if needed) - if (scale_system) { + if (integrator_rp::scale_system) { // do the dX/de terms diff --git a/integration/integrator_rhs_strang.H b/integration/integrator_rhs_strang.H index 7901eca3ba..8c9d6f4a97 100644 --- a/integration/integrator_rhs_strang.H +++ b/integration/integrator_rhs_strang.H @@ -16,8 +16,6 @@ #include #endif -using namespace integrator_rp; - // The rhs routine provides the right-hand-side for the DVODE solver. // This is a generic interface that calls the specific RHS routine in the // network you're actually using. @@ -51,7 +49,7 @@ void rhs (const amrex::Real time, BurnT& state, T& int_state, RArray1D& ydot, [[ // Only do the burn if the incoming temperature is within the temperature // bounds. Otherwise set the RHS to zero and return. - if (state.T <= EOSData::mintemp || state.T >= MAX_TEMP) { + if (state.T <= EOSData::mintemp || state.T >= integrator_rp::MAX_TEMP) { for (int n = 1; n <= INT_NEQS; ++n) { ydot(n) = 0.0_rt; @@ -82,28 +80,28 @@ void rhs (const amrex::Real time, BurnT& state, T& int_state, RArray1D& ydot, [[ // We integrate X, not Y // turn it off for primordial chem - if (!use_number_densities) { + if (! integrator_rp::use_number_densities) { for (int n = 1; n <= NumSpec; ++n) { ydot(n) *= aion[n-1]; } } // scale the energy - if (scale_system) { + if (integrator_rp::scale_system) { ydot(net_ienuc) /= state.e_scale; } // Allow energy integration to be disabled. - if (!integrate_energy) { + if (! integrator_rp::integrate_energy) { ydot(net_ienuc) = 0.0_rt; } // apply fudge factor: - if (react_boost > 0.0_rt) { + if (integrator_rp::react_boost > 0.0_rt) { for (int n = 1; n <= INT_NEQS; ++n) { - ydot(n) *= react_boost; + ydot(n) *= integrator_rp::react_boost; } } @@ -120,7 +118,7 @@ void jac ([[maybe_unused]] const amrex::Real time, BurnT& state, T& int_state, M // Only do the burn if the incoming temperature is within the temperature // bounds. Otherwise set the Jacobian to zero and return. - if (state.T <= EOSData::mintemp || state.T >= MAX_TEMP) { + if (state.T <= EOSData::mintemp || state.T >= integrator_rp::MAX_TEMP) { for (int j = 1; j <= INT_NEQS; ++j) { for (int i = 1; i <= INT_NEQS; ++i) { @@ -144,7 +142,7 @@ void jac ([[maybe_unused]] const amrex::Real time, BurnT& state, T& int_state, M // We integrate X, not Y // turn it off for primordial chem - if (!use_number_densities) { + if (! integrator_rp::use_number_densities) { for (int j = 1; j <= NumSpec; ++j) { for (int i = 1; i <= INT_NEQS; ++i) { pd.mul(j, i, aion[j-1]); @@ -155,7 +153,7 @@ void jac ([[maybe_unused]] const amrex::Real time, BurnT& state, T& int_state, M // scale the energy derivatives - if (scale_system) { + if (integrator_rp::scale_system) { // first the row de/dX for (int j = 1; j <= INT_NEQS; ++j) { pd(net_ienuc,j) /= state.e_scale; @@ -168,13 +166,13 @@ void jac ([[maybe_unused]] const amrex::Real time, BurnT& state, T& int_state, M } // apply fudge factor: - if (react_boost > 0.0_rt) { - pd.mul(react_boost); + if (integrator_rp::react_boost > 0.0_rt) { + pd.mul(integrator_rp::react_boost); } // Allow temperature and energy integration to be disabled. - if (!integrate_energy) { + if (! integrator_rp::integrate_energy) { for (int j = 1; j <= INT_NEQS; ++j) { pd(net_ienuc,j) = 0.0_rt; } diff --git a/integration/integrator_type.H b/integration/integrator_type.H index 6f83711598..8c6876adea 100644 --- a/integration/integrator_type.H +++ b/integration/integrator_type.H @@ -3,8 +3,6 @@ #include -using namespace integrator_rp; - template AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void update_density_in_time(const amrex::Real time, BurnT& state) @@ -61,13 +59,13 @@ void update_thermodynamics (BurnT& state, const I& int_state) } state.e = int_state.y(net_ienuc); - if (scale_system) { + if (integrator_rp::scale_system) { state.e *= state.e_scale; } // Get T from e (also updates composition quantities). - if (call_eos_in_rhs) { + if (integrator_rp::call_eos_in_rhs) { eos(eos_input_re, state); } diff --git a/integration/integrator_type_sdc.H b/integration/integrator_type_sdc.H index 7913d610a6..99c058bccc 100644 --- a/integration/integrator_type_sdc.H +++ b/integration/integrator_type_sdc.H @@ -10,24 +10,23 @@ #endif #include -using namespace integrator_rp; - template AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void clean_state(const amrex::Real time, BurnT& state, T& int_state) { // Ensure that mass fractions always stay positive. - if (do_species_clip) { + if (integrator_rp::do_species_clip) { for (int n = 1; n <= NumSpec; ++n) { // we use 1-based indexing, so we need to offset SFS - int_state.y(SFS+n) = std::clamp(int_state.y(SFS+n), state.rho * SMALL_X_SAFE, state.rho); + int_state.y(SFS+n) = std::clamp(int_state.y(SFS+n), + state.rho * integrator_rp::SMALL_X_SAFE, state.rho); } } // renormalize abundances as necessary - if (renormalize_abundances) { + if (integrator_rp::renormalize_abundances) { // update rho, rho*u, etc. update_density_in_time(time, state); @@ -70,7 +69,7 @@ void burn_to_int(BurnT& state, T& int_state) state.e_scale = state.rhoe_orig / state.rho_orig; // scale the integrator energy - if (scale_system) { + if (integrator_rp::scale_system) { int_state.y(SEINT+1) /= state.e_scale; } @@ -93,7 +92,7 @@ void int_to_burn(const amrex::Real time, const T& int_state, BurnT& state) // correct energy for scaling - if (scale_system) { + if (integrator_rp::scale_system) { state.y[SEINT] *= state.e_scale; } @@ -172,7 +171,7 @@ void rhs_to_int([[maybe_unused]] const amrex::Real time, // finally scale the ydots if we are doing scale_system - if (scale_system) { + if (integrator_rp::scale_system) { ydot(SEINT+1) /= state.e_scale; } diff --git a/integration/integrator_type_strang.H b/integration/integrator_type_strang.H index 09bc40307b..6efc3fcf4d 100644 --- a/integration/integrator_type_strang.H +++ b/integration/integrator_type_strang.H @@ -4,8 +4,6 @@ #include #include -using namespace integrator_rp; - template AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void integrator_to_burn (const I& int_state, BurnT& state) @@ -18,7 +16,7 @@ void integrator_to_burn (const I& int_state, BurnT& state) state.e = int_state.y(net_ienuc); - if (scale_system) { + if (integrator_rp::scale_system) { state.e *= state.e_scale; } @@ -38,7 +36,7 @@ void burn_to_integrator (const BurnT& state, I& int_state) int_state.y(net_ienuc) = state.e; - if (scale_system) { + if (integrator_rp::scale_system) { int_state.y(net_ienuc) /= state.e_scale; } } @@ -53,22 +51,22 @@ void clean_state (const amrex::Real time, BurnT& state, I& int_state) // Ensure that mass fractions always stay positive and less than or // equal to 1. - if (do_species_clip) { + if (integrator_rp::do_species_clip) { for (int n = 1; n <= NumSpec; ++n) { - int_state.y(n) = std::clamp(int_state.y(n), SMALL_X_SAFE, 1.0_rt); + int_state.y(n) = std::clamp(int_state.y(n), integrator_rp::SMALL_X_SAFE, 1.0_rt); } } // for primordial chem, just enforce positivity - if (use_number_densities) { + if (integrator_rp::use_number_densities) { for (int n = 1; n <= NumSpec; ++n) { - int_state.y(n) = amrex::max(int_state.y(n), SMALL_X_SAFE); + int_state.y(n) = amrex::max(int_state.y(n), integrator_rp::SMALL_X_SAFE); } } // Renormalize the abundances as necessary. - if (renormalize_abundances) { + if (integrator_rp::renormalize_abundances) { amrex::Real sum = 0.0_rt; for (int n = 1; n <= NumSpec; ++n) { diff --git a/integration/utils/initial_timestep.H b/integration/utils/initial_timestep.H index 9d7f5cd9f4..ce6c2ef0ac 100644 --- a/integration/utils/initial_timestep.H +++ b/integration/utils/initial_timestep.H @@ -89,7 +89,7 @@ amrex::Real initial_react_dt (BurnT& burn_state, IntT& int_state, amrex::Real dt = h / 2.0_rt; dt = std::clamp(h, hL, hU); - dt = amrex::min(dt, ode_max_dt); + dt = amrex::min(dt, integrator_rp::ode_max_dt); // restore the old time solution for (int n = 1; n <= INT_NEQS; ++n) { diff --git a/integration/utils/jacobian_utilities.H b/integration/utils/jacobian_utilities.H index 208e483c68..835506a170 100644 --- a/integration/utils/jacobian_utilities.H +++ b/integration/utils/jacobian_utilities.H @@ -4,8 +4,6 @@ #include #include -using namespace integrator_rp; - // Given the Jacobian element for d(spec) / dT, convert it // to d(spec) / de. diff --git a/integration/utils/nonaka_plot.H b/integration/utils/nonaka_plot.H index 57c9ebb68b..2bc42a5ba7 100644 --- a/integration/utils/nonaka_plot.H +++ b/integration/utils/nonaka_plot.H @@ -9,9 +9,7 @@ #include #include -using namespace integrator_rp; - -const int FIELD_WIDTH=14; +constexpr int FIELD_WIDTH=14; // this supports outputting the integration state at each RHS // evaluation for a single zone. This is used for diagnostics diff --git a/integration/utils/numerical_jacobian.H b/integration/utils/numerical_jacobian.H index 7bafdab8b9..7c367fcee9 100644 --- a/integration/utils/numerical_jacobian.H +++ b/integration/utils/numerical_jacobian.H @@ -13,8 +13,6 @@ #include -using namespace integrator_rp; - /// /// Compute the numerical Jacobian of the reactive system, dydot/dy, /// where ydot = {dX/dt, denuc/dt}, and y = {X, e}. @@ -75,14 +73,14 @@ void numerical_jac(BurnT& state, const jac_info_t& jac_info, JacNetArray2D& jac) amrex::Real w; for (int i = 1; i <= NumSpec; i++) { // the weight is 1 / EWT defined in VODE - w = 1.0_rt / (rtol_spec * std::abs(state.xn[i-1]) + atol_spec); + w = 1.0_rt / (integrator_rp::rtol_spec * std::abs(state.xn[i-1]) + integrator_rp::atol_spec); fac += (ydotm(i) * w) * (ydotm(i) * w); } // even though we difference wrt T below, for |f|, we want to use // energy to get the units correct - w = 1.0_rt / (rtol_enuc * std::abs(state.e) + atol_enuc); + w = 1.0_rt / (integrator_rp::rtol_enuc * std::abs(state.e) + integrator_rp::atol_enuc); fac += (ydotm(net_ienuc) * w) * (ydotm(net_ienuc) * w); fac = std::sqrt(fac / int_neqs); @@ -104,7 +102,7 @@ void numerical_jac(BurnT& state, const jac_info_t& jac_info, JacNetArray2D& jac) amrex::Real yj = state_delp.xn[n-1]; - w = rtol_spec * std::abs(yj) + atol_spec; + w = integrator_rp::rtol_spec * std::abs(yj) + integrator_rp::atol_spec; // the incremement we use in the derivative is defined in the LSODE paper, Eq. 3.35 @@ -131,13 +129,13 @@ void numerical_jac(BurnT& state, const jac_info_t& jac_info, JacNetArray2D& jac) // T derivative - w = rtol_enuc * std::abs(state.T) + atol_enuc; + w = integrator_rp::rtol_enuc * std::abs(state.T) + integrator_rp::atol_enuc; amrex::Real dy = amrex::max(std::sqrt(U) * std::abs(state.T), r0 * w); state_delp.T += dy; - if (state_delp.T <= EOSData::mintemp || state_delp.T >= MAX_TEMP) { + if (state_delp.T <= EOSData::mintemp || state_delp.T >= integrator_rp::MAX_TEMP) { for (int i = 1; i <= int_neqs; i++) { for (int j = 1; j <= int_neqs; j++) { @@ -204,7 +202,7 @@ void numerical_jac(BurnT& state, const jac_info_t& jac_info, JacNetArray2D& jac) } // scale the energy derivatives - if (scale_system) { + if (integrator_rp::scale_system) { // first the de/dX row for (int n = 1; n <= INT_NEQS; ++n) { jac(net_ienuc, n) /= state.e_scale; @@ -218,13 +216,13 @@ void numerical_jac(BurnT& state, const jac_info_t& jac_info, JacNetArray2D& jac) // apply boosting factor: - if (react_boost > 0.0_rt) { - jac.mul(react_boost); + if (integrator_rp::react_boost > 0.0_rt) { + jac.mul(integrator_rp::react_boost); } // Allow temperature and energy integration to be disabled. - if (!integrate_energy) { + if (! integrator_rp::integrate_energy) { for (int n = 1; n <= int_neqs; ++n) { jac(net_ienuc, n) = 0.0_rt; } diff --git a/unit_test/burn_cell/burn_cell.H b/unit_test/burn_cell/burn_cell.H index 778bd7461f..71f379471e 100644 --- a/unit_test/burn_cell/burn_cell.H +++ b/unit_test/burn_cell/burn_cell.H @@ -174,7 +174,7 @@ void burn_cell_c() // get the updated T - if (call_eos_in_rhs) { + if (integrator_rp::call_eos_in_rhs) { eos(eos_input_re, burn_state); } diff --git a/unit_test/test_rhs/main.cpp b/unit_test/test_rhs/main.cpp index 4c08451bb3..ae01b38747 100644 --- a/unit_test/test_rhs/main.cpp +++ b/unit_test/test_rhs/main.cpp @@ -102,8 +102,8 @@ void main_main () init_unit_test(); - if (jacobian != 1) { - amrex::Error("test_rhs only works for jacobian = 1"); + if (integrator_rp::jacobian != 1) { + amrex::Error("test_rhs only works for integrator.jacobian = 1"); } // C++ EOS initialization (must be done after init_extern_parameters) From c75486b64d31f9dbad41c79024a9c9cf70fffcf2 Mon Sep 17 00:00:00 2001 From: "Eric T. Johnson" Date: Fri, 26 Jul 2024 18:15:12 -0400 Subject: [PATCH 28/33] Use autodiff in templated network rate evaluation (#1614) Note: this fixes an issue with powerlaw, which previously did not have any derivatives computed --- interfaces/rhs_type.H | 14 +- interfaces/tfactors.H | 142 +- networks/aprox13/actual_network.H | 101 +- networks/aprox19/actual_network.H | 248 +-- networks/aprox21/actual_network.H | 271 +-- networks/ignition_chamulak/actual_network.H | 26 +- networks/ignition_simple/actual_network.H | 9 +- networks/iso7/actual_network.H | 46 +- networks/powerlaw/actual_network.H | 8 +- networks/rhs.H | 156 +- networks/rhs.cpp | 3 +- networks/rprox/actual_network.H | 97 +- networks/rprox/rprox_rates.H | 486 ++--- .../triple_alpha_plus_cago/actual_network.H | 11 +- rates/aprox_rates.H | 1847 ++++++----------- .../ci-benchmarks/chamulak_VODE_unit_test.out | 16 +- .../test_aprox_rates/aprox_rates_util.cpp | 548 ++--- unit_test/test_rhs/ci-benchmarks/powerlaw.out | 6 +- 18 files changed, 1478 insertions(+), 2557 deletions(-) diff --git a/interfaces/rhs_type.H b/interfaces/rhs_type.H index c69795a8f0..b91b692aa8 100644 --- a/interfaces/rhs_type.H +++ b/interfaces/rhs_type.H @@ -95,12 +95,13 @@ struct rate_tab_t } }; -// number_t is currently only used in the screening routines -template +// number_t is currently used in the screening routines and templated network +// rate evaluation +template struct rhs_state_t { amrex::Real rho; - tf_t tf; + tf_t tf; rate_tab_t tab; #ifdef SCREENING plasma_state_t pstate; @@ -110,12 +111,11 @@ struct rhs_state_t amrex::Array1D y; }; +template struct rate_t { - amrex::Real fr; - amrex::Real rr; - amrex::Real frdt; - amrex::Real rrdt; + number_t fr; + number_t rr; }; } // namespace RHS diff --git a/interfaces/tfactors.H b/interfaces/tfactors.H index ba54d9eef2..8ea11c87fc 100644 --- a/interfaces/tfactors.H +++ b/interfaces/tfactors.H @@ -2,76 +2,80 @@ #define TFACTORS_H #include +#include +#include #include using namespace amrex::literals; +template struct tf_t { - amrex::Real temp; - amrex::Real t9; - amrex::Real t92; - amrex::Real t93; - // amrex::Real t94; - amrex::Real t95; - // amrex::Real t96; - amrex::Real t912; - amrex::Real t932; - amrex::Real t952; - amrex::Real t972; - amrex::Real t913; - amrex::Real t923; - amrex::Real t943; - amrex::Real t953; - // amrex::Real t973; - // amrex::Real t9113; - // amrex::Real t914; - // amrex::Real t934; - // amrex::Real t954; - // amrex::Real t974; - // amrex::Real t915; - // amrex::Real t935; - // amrex::Real t945; - // amrex::Real t965; - // amrex::Real t917; - // amrex::Real t927; - // amrex::Real t947; - // amrex::Real t918; - // amrex::Real t938; - // amrex::Real t958; - amrex::Real t9i; - amrex::Real t9i2; - // amrex::Real t9i3; - amrex::Real t9i12; - amrex::Real t9i32; - // amrex::Real t9i52; - // amrex::Real t9i72; - amrex::Real t9i13; - amrex::Real t9i23; - amrex::Real t9i43; - amrex::Real t9i53; - // amrex::Real t9i14; - // amrex::Real t9i34; - // amrex::Real t9i54; - // amrex::Real t9i15; - // amrex::Real t9i35; - // amrex::Real t9i45; - // amrex::Real t9i65; - // amrex::Real t9i17; - // amrex::Real t9i27; - // amrex::Real t9i47; - // amrex::Real t9i18; - // amrex::Real t9i38; - // amrex::Real t9i58; - // amrex::Real t916; - // amrex::Real t976; - // amrex::Real t9i76; - amrex::Real lnt9; + number_t temp; + number_t t9; + number_t t92; + number_t t93; + // number_t t94; + number_t t95; + // number_t t96; + number_t t912; + number_t t932; + number_t t952; + number_t t972; + number_t t913; + number_t t923; + number_t t943; + number_t t953; + // number_t t973; + // number_t t9113; + // number_t t914; + // number_t t934; + // number_t t954; + // number_t t974; + // number_t t915; + // number_t t935; + // number_t t945; + // number_t t965; + // number_t t917; + // number_t t927; + // number_t t947; + // number_t t918; + // number_t t938; + // number_t t958; + number_t t9i; + number_t t9i2; + // number_t t9i3; + number_t t9i12; + number_t t9i32; + // number_t t9i52; + // number_t t9i72; + number_t t9i13; + number_t t9i23; + number_t t9i43; + number_t t9i53; + // number_t t9i14; + // number_t t9i34; + // number_t t9i54; + // number_t t9i15; + // number_t t9i35; + // number_t t9i45; + // number_t t9i65; + // number_t t9i17; + // number_t t9i27; + // number_t t9i47; + // number_t t9i18; + // number_t t9i38; + // number_t t9i58; + // number_t t916; + // number_t t976; + // number_t t9i76; + number_t lnt9; }; +template AMREX_GPU_HOST_DEVICE inline -tf_t get_tfactors(amrex::Real temp) +tf_t get_tfactors(number_t temp) { - tf_t tf; + tf_t tf; tf.temp = temp; @@ -83,38 +87,38 @@ tf_t get_tfactors(amrex::Real temp) tf.t95 = tf.t92*tf.t93; // tf.t96 = tf.t9*tf.t95; - tf.t912 = std::sqrt(tf.t9); + tf.t912 = admath::sqrt(tf.t9); tf.t932 = tf.t9*tf.t912; tf.t952 = tf.t9*tf.t932; // tf.t972 = tf.t9*tf.t952; tf.t972 = tf.t92*tf.t932; - tf.t913 = std::cbrt(tf.t9); + tf.t913 = admath::cbrt(tf.t9); tf.t923 = tf.t913*tf.t913; tf.t943 = tf.t9*tf.t913; tf.t953 = tf.t9*tf.t923; // tf.t973 = tf.t953*tf.t923; // tf.t9113 = tf.t973*tf.t943; - // tf.t914 = std::pow(tf.t9, 0.25e0_rt); + // tf.t914 = admath::pow(tf.t9, 0.25e0_rt); // tf.t934 = tf.t914*tf.t914*tf.t914; // tf.t954 = tf.t9*tf.t914; // tf.t974 = tf.t9*tf.t934; - // tf.t915 = std::pow(tf.t9, 0.2_rt); + // tf.t915 = admath::pow(tf.t9, 0.2_rt); // tf.t935 = tf.t915*tf.t915*tf.t915; // tf.t945 = tf.t915 * tf.t935; // tf.t965 = tf.t9 * tf.t915; - // tf.t916 = std::pow(tf.t9, 1.0_rt/6.0_rt); + // tf.t916 = admath::pow(tf.t9, 1.0_rt/6.0_rt); // tf.t976 = tf.t9 * tf.t916; // tf.t9i76 = 1.0e0_rt/tf.t976; - // tf.t917 = std::pow(tf.t9, 1.0_rt/7.0_rt); + // tf.t917 = admath::pow(tf.t9, 1.0_rt/7.0_rt); // tf.t927 = tf.t917*tf.t917; // tf.t947 = tf.t927*tf.t927; - // tf.t918 = std::sqrt(tf.t914); + // tf.t918 = admath::sqrt(tf.t914); // tf.t938 = tf.t918*tf.t918*tf.t918; // tf.t958 = tf.t938*tf.t918*tf.t918; @@ -149,7 +153,7 @@ tf_t get_tfactors(amrex::Real temp) // tf.t9i38 = tf.t9i18*tf.t9i18*tf.t9i18; // tf.t9i58 = tf.t9i38*tf.t9i18*tf.t9i18; - tf.lnt9 = std::log(tf.t9); + tf.lnt9 = admath::log(tf.t9); return tf; } diff --git a/networks/aprox13/actual_network.H b/networks/aprox13/actual_network.H index f366c6ae5a..937585dd88 100644 --- a/networks/aprox13/actual_network.H +++ b/networks/aprox13/actual_network.H @@ -784,110 +784,111 @@ namespace RHS { template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) + void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; if constexpr (rate == C12_He4_to_O16) { - rate_c12ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_c12ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == He4_He4_He4_to_C12) { - rate_triplealf(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_triplealf(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == C12_C12_to_Ne20_He4) { - rate_c12c12(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_c12c12(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == C12_O16_to_Mg24_He4 || rate == C12_O16_to_Si28) { - rate_c12o16(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_c12o16(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == O16_O16_to_Si28_He4 || rate == O16_O16_to_P31_P || rate == O16_O16_to_S32) { - rate_o16o16(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_o16o16(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == O16_He4_to_Ne20) { - rate_o16ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_o16ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ne20_He4_to_Mg24) { - rate_ne20ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ne20ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Mg24_He4_to_Si28) { - rate_mg24ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_mg24ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Si28_He4_to_S32) { - rate_si28ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_si28ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == S32_He4_to_Ar36) { - rate_s32ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_s32ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ar36_He4_to_Ca40) { - rate_ar36ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ar36ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ca40_He4_to_Ti44) { - rate_ca40ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ca40ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ti44_He4_to_Cr48) { - rate_ti44ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ti44ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Cr48_He4_to_Fe52) { - rate_cr48ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_cr48ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Fe52_He4_to_Ni56) { - rate_fe52ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_fe52ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Mg24_He4_to_Al27_P) { - rate_mg24ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_mg24ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Al27_P_to_Si28) { - rate_al27pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_al27pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Si28_He4_to_P31_P) { - rate_si28ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_si28ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == P31_P_to_S32) { - rate_p31pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_p31pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == S32_He4_to_Cl35_P) { - rate_s32ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_s32ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Cl35_P_to_Ar36) { - rate_cl35pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_cl35pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ar36_He4_to_K39_P) { - rate_ar36ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ar36ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == K39_P_to_Ca40) { - rate_k39pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_k39pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ca40_He4_to_Sc43_P) { - rate_ca40ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ca40ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Sc43_P_to_Ti44) { - rate_sc43pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_sc43pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ti44_He4_to_V47_P) { - rate_ti44ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ti44ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == V47_P_to_Cr48) { - rate_v47pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_v47pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Cr48_He4_to_Mn51_P) { - rate_cr48ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_cr48ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Mn51_P_to_Fe52) { - rate_mn51pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_mn51pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Fe52_He4_to_Co55_P) { - rate_fe52ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_fe52ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Co55_P_to_Ni56) { - rate_co55pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_co55pg(state.tf, 1.0_rt, rates.fr, rates.rr); } } template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void postprocess_rate ([[maybe_unused]] const rhs_state_t& state, rate_t& rates, - rate_t& rates1, rate_t& rates2, rate_t& rates3) + void postprocess_rate ([[maybe_unused]] const rhs_state_t& state, rate_t& rates, + rate_t& rates1, rate_t& rates2, + rate_t& rates3) { using namespace Species; using namespace Rates; @@ -911,60 +912,46 @@ namespace RHS { rate == Cr48_He4_to_Fe52 || rate == Fe52_He4_to_Ni56) { - amrex::Real rate_ir = 0.0e0_rt; - amrex::Real dratedt_ir = 0.0e0_rt; - amrex::Real denom = rates1.rr + rates2.fr; - amrex::Real denomdt = rates1.rrdt + rates2.frdt; + number_t rate_ir = 0.0e0_rt; + number_t denom = rates1.rr + rates2.fr; if (denom > 1.0e-30_rt) { - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; rate_ir = rates1.rr * zz; - dratedt_ir = (rates1.rrdt - rate_ir * denomdt) * zz; } rates.fr += rates1.fr * (1.0_rt - rate_ir); - rates.frdt += rates1.frdt * (1.0_rt - rate_ir) - rates1.fr * dratedt_ir; - rates.rr += rates2.rr * rate_ir; - rates.rrdt += rates2.rrdt * rate_ir + rates2.rr * dratedt_ir; } // The O16+O16->Si28+He4 reaction has an additional contribution from the O16+O16->P31+P // reaction followed by the reverse Si28+He4<->P31+P reaction. if constexpr (rate == O16_O16_to_Si28_He4) { - amrex::Real rate_ir = 0.0e0_rt; - amrex::Real dratedt_ir = 0.0e0_rt; - amrex::Real denom = rates1.rr + rates2.fr; - amrex::Real denomdt = rates1.rrdt + rates2.frdt; + number_t rate_ir = 0.0e0_rt; + number_t denom = rates1.rr + rates2.fr; if (denom > 1.0e-30_rt) { - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; rate_ir = rates1.rr * zz; - dratedt_ir = (rates1.rrdt - rate_ir * denomdt) * zz; } rates.fr += rates3.fr * rate_ir; - rates.frdt += rates3.frdt * rate_ir + rates3.fr * dratedt_ir; } // The O16+O16->S32 reaction has an additional contribution from the O16+O16->P31+P // reaction followed by the forward P31+P<->S32 reaction. if constexpr (rate == O16_O16_to_S32) { - amrex::Real rate_ir = 0.0e0_rt; - amrex::Real dratedt_ir = 0.0e0_rt; - amrex::Real denom = rates1.rr + rates2.fr; - amrex::Real denomdt = rates1.rrdt + rates2.frdt; + number_t rate_ir = 0.0e0_rt; + number_t denom = rates1.rr + rates2.fr; if (denom > 1.0e-30_rt) { - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; rate_ir = rates1.rr * zz; - dratedt_ir = (rates1.rrdt - rate_ir * denomdt) * zz; } rates.fr += rates3.fr * (1.0_rt - rate_ir); - rates.frdt += rates3.frdt * (1.0_rt - rate_ir) - rates3.fr * dratedt_ir; } } diff --git a/networks/aprox19/actual_network.H b/networks/aprox19/actual_network.H index db163ca97d..e7f9f413d8 100644 --- a/networks/aprox19/actual_network.H +++ b/networks/aprox19/actual_network.H @@ -1337,162 +1337,168 @@ namespace RHS { template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) + void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; if constexpr (rate == H1_H1_to_He3) { - amrex::Real tmp1, tmp2; - rate_pp(state.tf, 1.0_rt, rates.fr, rates.frdt, tmp1, tmp2); + number_t tmp1; + rate_pp(state.tf, 1.0_rt, rates.fr, tmp1); } else if constexpr (rate == P_to_N) { if (state.tf.temp >= 1.0e6_rt && state.rho >= 1.0e-9_rt) { + amrex::Real tmp_fr, tmp_rr; amrex::Real tmp1, tmp2; - ecapnuc(state.eta, state.tf.temp, rates.fr, rates.rr, tmp1, tmp2); + ecapnuc(state.eta, static_cast(state.tf.temp), + tmp_fr, tmp_rr, tmp1, tmp2); + rates.fr = tmp_fr; + rates.rr = tmp_rr; } } else if constexpr (rate == P_N_to_H2) { - rate_png(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_png(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == H2_P_to_He3) { - rate_dpg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_dpg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == He3_N_to_He4) { - rate_he3ng(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_he3ng(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == He3_He3_to_He4_2H1) { - amrex::Real tmp1, tmp2; - rate_he3he3(state.tf, 1.0_rt, rates.fr, rates.frdt, tmp1, tmp2); + number_t tmp1; + rate_he3he3(state.tf, 1.0_rt, rates.fr, tmp1); } else if constexpr (rate == He3_He4_H1_to_2He4) { - amrex::Real tmp1, tmp2; - rate_he3he4(state.tf, 1.0_rt, rates.fr, rates.frdt, tmp1, tmp2); + number_t tmp1; + rate_he3he4(state.tf, 1.0_rt, rates.fr, tmp1); } else if constexpr (rate == C12_He4_to_O16) { - rate_c12ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_c12ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == He4_He4_He4_to_C12) { - rate_triplealf(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_triplealf(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == C12_H1_to_N13) { - rate_c12pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_c12pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == C12_C12_to_Ne20_He4) { - rate_c12c12(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_c12c12(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == C12_O16_to_Mg24_He4) { - rate_c12o16(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_c12o16(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == N14_H1_to_O15) { - rate_n14pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_n14pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == N15_H1_to_O16) { - rate_n15pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_n15pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == N15_H1_to_C12_He4) { - rate_n15pa(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_n15pa(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == N14_He4_to_F18) { - rate_n14ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_n14ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == O16_H1_to_F17) { - rate_o16pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_o16pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == O16_O16_to_P31_P) { - rate_o16o16(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_o16o16(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == O16_He4_to_Ne20) { - rate_o16ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_o16ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ne20_He4_to_Mg24) { - rate_ne20ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ne20ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Mg24_He4_to_Si28) { - rate_mg24ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_mg24ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Si28_He4_to_S32) { - rate_si28ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_si28ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == S32_He4_to_Ar36) { - rate_s32ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_s32ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ar36_He4_to_Ca40) { - rate_ar36ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ar36ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ca40_He4_to_Ti44) { - rate_ca40ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ca40ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ti44_He4_to_Cr48) { - rate_ti44ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ti44ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Cr48_He4_to_Fe52) { - rate_cr48ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_cr48ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Fe52_He4_to_Ni56) { - rate_fe52ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_fe52ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Mg24_He4_to_Al27_P) { - rate_mg24ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_mg24ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Al27_P_to_Si28) { - rate_al27pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_al27pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Si28_He4_to_P31_P) { - rate_si28ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_si28ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == P31_P_to_S32) { - rate_p31pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_p31pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == S32_He4_to_Cl35_P) { - rate_s32ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_s32ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Cl35_P_to_Ar36) { - rate_cl35pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_cl35pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ar36_He4_to_K39_P) { - rate_ar36ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ar36ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == K39_P_to_Ca40) { - rate_k39pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_k39pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ca40_He4_to_Sc43_P) { - rate_ca40ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ca40ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Sc43_P_to_Ti44) { - rate_sc43pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_sc43pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ti44_He4_to_V47_P) { - rate_ti44ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ti44ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == V47_P_to_Cr48) { - rate_v47pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_v47pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Cr48_He4_to_Mn51_P) { - rate_cr48ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_cr48ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Mn51_P_to_Fe52) { - rate_mn51pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_mn51pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Fe52_He4_to_Co55_P) { - rate_fe52ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_fe52ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Co55_P_to_Ni56) { - rate_co55pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_co55pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Fe52_N_to_Fe53) { - rate_fe52ng(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_fe52ng(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Fe53_N_to_Fe54) { - rate_fe53ng(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_fe53ng(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Fe54_P_to_Co55) { - rate_fe54pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_fe54pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ni56_to_Fe54) { - if (state.tf.temp >= 1.0e6_rt && state.rho >= 1.0e-9_rt) { - amrex::Real tmp; - langanke(state.tf.temp, state.rho, state.y(Ni56), state.y_e, rates.fr, tmp); + if (static_cast(state.tf.temp) >= 1.0e6_rt && state.rho >= 1.0e-9_rt) { + amrex::Real tmp_fr, tmp_rr; + langanke(static_cast(state.tf.temp), state.rho, + state.y(Ni56), state.y_e, tmp_fr, tmp_rr); + rates.fr = tmp_fr; // We scaled the number of nucleons per reaction // in defining the reaction so that the number of reactants @@ -1507,8 +1513,9 @@ namespace RHS { template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void postprocess_rate (const rhs_state_t& state, rate_t& rates, - rate_t& rates1, rate_t& rates2, rate_t& rates3) + void postprocess_rate (const rhs_state_t& state, rate_t& rates, + rate_t& rates1, rate_t& rates2, + rate_t& rates3) { using namespace Species; using namespace Rates; @@ -1520,28 +1527,16 @@ namespace RHS { // Rate 2 == H2_P_to_He3 == irdpg (forward), irhegp (reverse) // Rate 3 == He3_N_to_He4 == irheng (forward), irhegn (reverse) - amrex::Real denom = rates2.rr * rates1.rr + state.y(N) * rates3.fr * rates1.rr + state.y(N) * state.y(P) * rates3.fr * rates2.fr; + number_t denom = rates2.rr * rates1.rr + state.y(N) * rates3.fr * rates1.rr + state.y(N) * state.y(P) * rates3.fr * rates2.fr; if (denom > 1.0e-50_rt && state.tf.t9 > 1.5_rt) { - amrex::Real denomdt = rates2.rrdt * rates1.rr + rates2.rr * rates1.rrdt + - state.y(N) * (rates3.frdt * rates1.rr + rates3.fr * rates1.rrdt) + - state.y(N) * state.y(P) * (rates3.frdt * rates2.fr + rates3.fr * rates2.frdt); - - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; // iralf1 in the original aprox19 rates.rr = rates3.rr * rates2.rr * rates1.rr * zz; - rates.rrdt = rates3.rrdt * rates2.rr * rates1.rr * zz + - rates3.rr * rates2.rrdt * rates1.rr * zz + - rates3.rr * rates2.rr * rates1.rrdt * zz - - rates.rr * zz * denomdt; // iralf2 in the original aprox19 rates.fr = rates3.fr * rates2.fr * rates1.fr * zz; - rates.frdt = rates3.frdt * rates2.fr * rates1.fr * zz + - rates3.fr * rates2.frdt * rates1.fr * zz + - rates3.fr * rates2.fr * rates1.frdt * zz - - rates.fr * zz * denomdt; } } @@ -1549,7 +1544,6 @@ namespace RHS { if constexpr (rate == H1_H1_H1_to_He3) { rates.fr = rates1.fr; - rates.frdt = rates1.frdt; } // Beta limit He3 + He4 by the B8 decay half-life @@ -1557,10 +1551,7 @@ namespace RHS { if constexpr (rate == He3_He4_H1_to_2He4) { amrex::Real xx = 0.896_rt / state.y(He4); - rates.fr = amrex::min(rates.fr, xx); - if (rates.fr == xx) { - rates.frdt = 0.0_rt; - } + rates.fr = admath::min(rates.fr, xx); } // Each of the following reactions has both an (a,g) path and an @@ -1581,74 +1572,57 @@ namespace RHS { rate == Ti44_He4_to_Cr48 || rate == Cr48_He4_to_Fe52) { - amrex::Real rate_ir = 0.0e0_rt; - amrex::Real dratedt_ir = 0.0e0_rt; - amrex::Real denom = rates1.rr + rates2.fr; - amrex::Real denomdt = rates1.rrdt + rates2.frdt; + number_t rate_ir = 0.0e0_rt; + number_t denom = rates1.rr + rates2.fr; if (denom > 1.0e-30_rt) { - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; rate_ir = rates1.rr * zz; - dratedt_ir = (rates1.rrdt - rate_ir * denomdt) * zz; } rates.fr += rates1.fr * (1.0_rt - rate_ir); - rates.frdt += rates1.frdt * (1.0_rt - rate_ir) - rates1.fr * dratedt_ir; - rates.rr += rates2.rr * rate_ir; - rates.rrdt += rates2.rrdt * rate_ir + rates2.rr * dratedt_ir; } // The O16+O16->Si28+He4 reaction has an additional contribution from the O16+O16->P31+P // reaction followed by the reverse Si28+He4<->P31+P reaction. if constexpr (rate == O16_O16_to_Si28_He4) { - amrex::Real rate_ir = 0.0e0_rt; - amrex::Real dratedt_ir = 0.0e0_rt; - amrex::Real denom = rates1.rr + rates2.fr; - amrex::Real denomdt = rates1.rrdt + rates2.frdt; + number_t rate_ir = 0.0e0_rt; + number_t denom = rates1.rr + rates2.fr; if (denom > 1.0e-30_rt) { - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; rate_ir = rates1.rr * zz; - dratedt_ir = (rates1.rrdt - rate_ir * denomdt) * zz; } rates.fr = 0.56_rt * rates3.fr + 0.34_rt * rates3.fr * rate_ir; - rates.frdt = 0.56_rt * rates3.frdt + 0.34_rt * rates3.frdt * rate_ir + 0.34_rt * rates3.fr * dratedt_ir; } // The O16+O16->S32 reaction has an additional contribution from the O16+O16->P31+P // reaction followed by the forward P31+P<->S32 reaction. if constexpr (rate == O16_O16_to_S32) { - amrex::Real rate_ir = 0.0e0_rt; - amrex::Real dratedt_ir = 0.0e0_rt; - amrex::Real denom = rates1.rr + rates2.fr; - amrex::Real denomdt = rates1.rrdt + rates2.frdt; + number_t rate_ir = 0.0e0_rt; + number_t denom = rates1.rr + rates2.fr; if (denom > 1.0e-30_rt) { - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; rate_ir = rates1.rr * zz; - dratedt_ir = (rates1.rrdt - rate_ir * denomdt) * zz; } rates.fr = 0.1_rt * rates3.fr + 0.34_rt * rates3.fr * (1.0_rt - rate_ir); - rates.frdt = 0.1_rt * rates3.frdt + 0.34_rt * rates3.frdt * (1.0_rt - rate_ir) - 0.34_rt * rates3.fr * dratedt_ir; } if constexpr (rate == C12_2H1_to_N14) { rates.fr = rates1.fr; - rates.frdt = rates1.frdt; } if constexpr (rate == C12_O16_to_Si28) { rates.fr = rates1.fr; - rates.frdt = rates1.frdt; rates.rr = rates1.rr; - rates.rrdt = rates1.rrdt; } if constexpr (rate == N14_2H1_to_O16) @@ -1659,24 +1633,16 @@ namespace RHS { if (state.y(H1) > 1.0e-30_rt) { amrex::Real xx = 5.68e-3_rt / (state.y(H1) * 1.57_rt); - rates1.fr = amrex::min(rates1.fr, xx); - if (rates1.fr == xx) { - rates1.frdt = 0.0_rt; - } + rates1.fr = admath::min(rates1.fr, xx); } // Rate 2: O15_H1_to_O16 // Rate 3: O15_H1_to_C12_He4 - amrex::Real tot = rates2.fr + rates3.fr; - amrex::Real invtot = 1.0_rt / tot; + number_t tot = rates2.fr + rates3.fr; + number_t invtot = 1.0_rt / tot; rates.fr = rates1.fr * (rates2.fr * invtot); - - amrex::Real dtotdt = rates2.frdt + rates3.frdt; - - rates.frdt = rates1.fr * (rates2.frdt * invtot - rates2.fr * invtot * invtot * dtotdt) - + rates1.frdt * (rates2.fr * invtot); } if constexpr (rate == N14_2H1_to_C12_He4) @@ -1687,24 +1653,16 @@ namespace RHS { if (state.y(H1) > 1.0e-30_rt) { amrex::Real xx = 5.68e-3_rt / (state.y(H1) * 1.57_rt); - rates1.fr = amrex::min(rates1.fr, xx); - if (rates1.fr == xx) { - rates1.frdt = 0.0_rt; - } + rates1.fr = admath::min(rates1.fr, xx); } // Rate 2: O15_H1_to_O16 // Rate 3: O15_H1_to_C12_He4 - amrex::Real tot = rates2.fr + rates3.fr; - amrex::Real invtot = 1.0_rt / tot; + number_t tot = rates2.fr + rates3.fr; + number_t invtot = 1.0_rt / tot; rates.fr = rates1.fr * (rates3.fr * invtot); - - amrex::Real dtotdt = rates2.frdt + rates3.frdt; - - rates.frdt = rates1.fr * (rates3.frdt * invtot - rates3.fr * invtot * invtot * dtotdt) - + rates1.frdt * (rates3.fr * invtot); } if constexpr (rate == N14_He4_to_Ne20) @@ -1715,7 +1673,6 @@ namespace RHS { // we'll halve the rate. rates.fr = rates1.fr * 0.5_rt; - rates.frdt = rates1.frdt * 0.5_rt; } if constexpr (rate == O16_2H1_to_N14_He4) @@ -1723,13 +1680,9 @@ namespace RHS { // Beta limit amrex::Real xx = 0.0105_rt / state.y(H1); - rates1.fr = amrex::min(rates1.fr, xx); - if (rates1.fr == xx) { - rates1.frdt = 0.0_rt; - } + rates1.fr = admath::min(rates1.fr, xx); rates.fr = rates1.fr; - rates.frdt = rates1.frdt; } if constexpr (rate == Fe52_2N_to_Fe54) @@ -1738,19 +1691,16 @@ namespace RHS { // Rate 1 == Fe52_N_to_Fe53 == ir52ng (forward), ir53gn (reverse) // Rate 2 == Fe53_N_to_Fe54 == ir53ng (forward), ir54gn (reverse) - amrex::Real denom = rates1.rr + state.y(N) * rates2.fr; - amrex::Real denomdt = rates1.rrdt + state.y(N) * rates2.frdt; + number_t denom = rates1.rr + state.y(N) * rates2.fr; if (denom > 1.0e-50_rt && state.tf.t9 > 1.5_rt) { - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; // ir2f54 in the original aprox19 rates.fr = rates1.fr * rates2.fr * zz; - rates.frdt = rates1.frdt * rates2.fr * zz + rates1.fr * rates2.frdt * zz - rates.fr * zz * denomdt; // ir1f54 in the original aprox19 rates.rr = rates2.rr * rates1.rr * zz; - rates.rrdt = rates2.rrdt * rates1.rr * zz + rates2.rr * rates1.rrdt * zz - rates.rr * zz * denomdt; } } @@ -1761,20 +1711,16 @@ namespace RHS { // Rate 2 == Co55_P_to_Ni56 == ircopg (forward), irnigp (reverse) // Rate 3 == Fe52_He4_to_Co55_P == irfeap (forward), ircopa (reverse) - amrex::Real denom = rates1.rr + state.y(P) * (rates2.fr + rates3.rr); + number_t denom = rates1.rr + state.y(P) * (rates2.fr + rates3.rr); if (denom > 1.0e-50_rt && state.tf.t9 > 1.5_rt) { - amrex::Real denomdt = rates1.rrdt + state.y(P) * (rates2.frdt + rates3.rrdt); - - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; // ir3f54 in the original aprox19 rates.fr = rates1.fr * rates2.fr * zz; - rates.frdt = rates1.frdt * rates2.fr * zz + rates1.fr * rates2.frdt * zz - rates.fr * zz * denomdt; // ir4f54 in the original aprox19 rates.rr = rates2.rr * rates1.rr * zz; - rates.rrdt = rates2.rrdt * rates1.rr * zz + rates2.rr * rates1.rrdt * zz - rates.rr * zz * denomdt; } } @@ -1785,20 +1731,16 @@ namespace RHS { // Rate 2 == Fe54_P_to_Co55 == irfepg (forward), ircogp (reverse) // Rate 3 == Co55_P_to_Ni56 == ircopg (forward), irnigp (reverse) - amrex::Real denom = rates2.rr + state.y(P) * (rates3.fr + rates1.rr); + number_t denom = rates2.rr + state.y(P) * (rates3.fr + rates1.rr); if (denom > 1.0e-50_rt && state.tf.t9 > 1.5_rt) { - amrex::Real denomdt = rates2.rrdt + state.y(P) * (rates3.frdt + rates1.rrdt); - - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; // ir6f54 in the original aprox19 rates.fr = rates1.fr * rates2.rr * zz; - rates.frdt = rates1.frdt * rates2.rr * zz + rates1.fr * rates2.rrdt * zz - rates.fr * zz * denomdt; // ir5f54 in the original aprox19 rates.rr = rates2.fr * rates1.rr * zz; - rates.rrdt = rates2.frdt * rates1.rr * zz + rates2.fr * rates1.rrdt * zz - rates.rr * zz * denomdt; } } @@ -1809,28 +1751,22 @@ namespace RHS { // Rate 2 == Co55_P_to_Ni56 == ircopg (forward), irnigp (reverse) // Rate 3 == Fe54_P_to_Co55 == irfepg (forward), ircogp (reverse) - amrex::Real denom = rates3.rr + state.y(P) * (rates2.fr + rates1.rr); + number_t denom = rates3.rr + state.y(P) * (rates2.fr + rates1.rr); if (denom > 1.0e-50_rt && state.tf.t9 > 1.5_rt) { - amrex::Real denomdt = rates3.rrdt + state.y(P) * (rates2.frdt + rates1.rrdt); - - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; // Note that in these reactions we're adding to fr and rr // since this reaction already has a contribution from the // direct alpha capture sequence Fe52(a,g)Ni56. // ir7f54 in the original aprox19 - amrex::Real fr_add = rates1.fr * rates2.fr * zz; - amrex::Real frdt_add = rates1.frdt * rates2.fr * zz + rates1.fr * rates2.frdt * zz - fr_add * zz * denomdt; + number_t fr_add = rates1.fr * rates2.fr * zz; rates.fr += state.y(P) * fr_add; - rates.frdt += state.y(P) * frdt_add; // ir8f54 in the original aprox19 - amrex::Real rr_add = rates2.rr * rates1.rr * zz; - amrex::Real rrdt_add = rates2.rrdt * rates1.rr * zz + rates2.rr * rates1.rrdt * zz - rr_add * zz * denomdt; + number_t rr_add = rates2.rr * rates1.rr * zz; rates.rr += state.y(P) * rr_add; - rates.rrdt += state.y(P) * rrdt_add; } } } diff --git a/networks/aprox21/actual_network.H b/networks/aprox21/actual_network.H index 6d5817ff76..dcade97f08 100644 --- a/networks/aprox21/actual_network.H +++ b/networks/aprox21/actual_network.H @@ -1473,182 +1473,189 @@ namespace RHS { template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) + void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; if constexpr (rate == H1_H1_to_He3) { - amrex::Real tmp1, tmp2; - rate_pp(state.tf, 1.0_rt, rates.fr, rates.frdt, tmp1, tmp2); + number_t tmp1; + rate_pp(state.tf, 1.0_rt, rates.fr, tmp1); } else if constexpr (rate == P_to_N) { if (state.tf.temp >= 1.0e6_rt && state.rho >= 1.0e-9_rt) { + amrex::Real tmp_fr, tmp_rr; amrex::Real tmp1, tmp2; - ecapnuc(state.eta, state.tf.temp, rates.fr, rates.rr, tmp1, tmp2); + ecapnuc(state.eta, static_cast(state.tf.temp), + tmp_fr, tmp_rr, tmp1, tmp2); + rates.fr = tmp_fr; + rates.rr = tmp_rr; } } else if constexpr (rate == P_N_to_H2) { - rate_png(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_png(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == H2_P_to_He3) { - rate_dpg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_dpg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == He3_N_to_He4) { - rate_he3ng(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_he3ng(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == He3_He3_to_He4_2H1) { - amrex::Real tmp1, tmp2; - rate_he3he3(state.tf, 1.0_rt, rates.fr, rates.frdt, tmp1, tmp2); + number_t tmp1; + rate_he3he3(state.tf, 1.0_rt, rates.fr, tmp1); } else if constexpr (rate == He3_He4_H1_to_2He4) { - amrex::Real tmp1, tmp2; - rate_he3he4(state.tf, 1.0_rt, rates.fr, rates.frdt, tmp1, tmp2); + number_t tmp1; + rate_he3he4(state.tf, 1.0_rt, rates.fr, tmp1); } else if constexpr (rate == C12_He4_to_O16) { - rate_c12ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_c12ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == He4_He4_He4_to_C12) { - rate_triplealf(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_triplealf(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == C12_H1_to_N13) { - rate_c12pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_c12pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == C12_C12_to_Ne20_He4) { - rate_c12c12(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_c12c12(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == C12_O16_to_Mg24_He4) { - rate_c12o16(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_c12o16(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == N14_H1_to_O15) { - rate_n14pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_n14pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == N15_H1_to_O16) { - rate_n15pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_n15pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == N15_H1_to_C12_He4) { - rate_n15pa(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_n15pa(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == N14_He4_to_F18) { - rate_n14ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_n14ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == O16_H1_to_F17) { - rate_o16pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_o16pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == O16_O16_to_P31_P) { - rate_o16o16(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_o16o16(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == O16_He4_to_Ne20) { - rate_o16ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_o16ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ne20_He4_to_Mg24) { - rate_ne20ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ne20ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Mg24_He4_to_Si28) { - rate_mg24ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_mg24ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Si28_He4_to_S32) { - rate_si28ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_si28ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == S32_He4_to_Ar36) { - rate_s32ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_s32ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ar36_He4_to_Ca40) { - rate_ar36ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ar36ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ca40_He4_to_Ti44) { - rate_ca40ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ca40ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ti44_He4_to_Cr48) { - rate_ti44ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ti44ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Cr48_He4_to_Fe52) { - rate_cr48ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_cr48ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Fe52_He4_to_Ni56) { - rate_fe52ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_fe52ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Mg24_He4_to_Al27_P) { - rate_mg24ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_mg24ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Al27_P_to_Si28) { - rate_al27pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_al27pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Si28_He4_to_P31_P) { - rate_si28ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_si28ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == P31_P_to_S32) { - rate_p31pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_p31pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == S32_He4_to_Cl35_P) { - rate_s32ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_s32ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Cl35_P_to_Ar36) { - rate_cl35pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_cl35pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ar36_He4_to_K39_P) { - rate_ar36ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ar36ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == K39_P_to_Ca40) { - rate_k39pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_k39pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ca40_He4_to_Sc43_P) { - rate_ca40ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ca40ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Sc43_P_to_Ti44) { - rate_sc43pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_sc43pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ti44_He4_to_V47_P) { - rate_ti44ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ti44ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == V47_P_to_Cr48) { - rate_v47pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_v47pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Cr48_He4_to_Mn51_P) { - rate_cr48ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_cr48ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Mn51_P_to_Fe52) { - rate_mn51pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_mn51pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Fe52_He4_to_Co55_P) { - rate_fe52ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_fe52ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Co55_P_to_Ni56) { - rate_co55pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_co55pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Fe52_N_to_Fe53) { - rate_fe52ng(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_fe52ng(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Fe53_N_to_Fe54) { - rate_fe53ng(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_fe53ng(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Fe54_P_to_Co55) { - rate_fe54pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_fe54pg(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ni56_to_Fe56) { - if (state.tf.temp >= 1.0e6_rt && state.rho >= 1.0e-9_rt) { - amrex::Real tmp; - langanke(state.tf.temp, state.rho, state.y(Ni56), state.y_e, rates.fr, tmp); + if (static_cast(state.tf.temp) >= 1.0e6_rt && state.rho >= 1.0e-9_rt) { + amrex::Real tmp_fr, tmp_rr; + langanke(static_cast(state.tf.temp), state.rho, + state.y(Ni56), state.y_e, tmp_fr, tmp_rr); + rates.fr = tmp_fr; } } else if constexpr (rate == Fe54_N_to_Fe55) { - rate_fe54ng(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_fe54ng(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Fe55_N_to_Fe56) { - rate_fe55ng(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_fe55ng(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Fe54_He4_to_Co57_P) { - rate_fe54ap(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_fe54ap(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Fe56_P_to_Co57) { - rate_fe56pg(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_fe56pg(state.tf, 1.0_rt, rates.fr, rates.rr); } } template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void postprocess_rate (const rhs_state_t& state, rate_t& rates, - rate_t& rates1, rate_t& rates2, rate_t& rates3) + void postprocess_rate (const rhs_state_t& state, rate_t& rates, + rate_t& rates1, rate_t& rates2, + rate_t& rates3) { using namespace Species; using namespace Rates; @@ -1660,28 +1667,16 @@ namespace RHS { // Rate 2 == H2_P_to_He3 == irdpg (forward), irhegp (reverse) // Rate 3 == He3_N_to_He4 == irheng (forward), irhegn (reverse) - amrex::Real denom = rates2.rr * rates1.rr + state.y(N) * rates3.fr * rates1.rr + state.y(N) * state.y(P) * rates3.fr * rates2.fr; + number_t denom = rates2.rr * rates1.rr + state.y(N) * rates3.fr * rates1.rr + state.y(N) * state.y(P) * rates3.fr * rates2.fr; if (denom > 1.0e-50_rt && state.tf.t9 > 1.5_rt) { - amrex::Real denomdt = rates2.rrdt * rates1.rr + rates2.rr * rates1.rrdt + - state.y(N) * (rates3.frdt * rates1.rr + rates3.fr * rates1.rrdt) + - state.y(N) * state.y(P) * (rates3.frdt * rates2.fr + rates3.fr * rates2.frdt); - - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; // iralf1 in the original aprox21 rates.rr = rates3.rr * rates2.rr * rates1.rr * zz; - rates.rrdt = rates3.rrdt * rates2.rr * rates1.rr * zz + - rates3.rr * rates2.rrdt * rates1.rr * zz + - rates3.rr * rates2.rr * rates1.rrdt * zz - - rates.rr * zz * denomdt; // iralf2 in the original aprox21 rates.fr = rates3.fr * rates2.fr * rates1.fr * zz; - rates.frdt = rates3.frdt * rates2.fr * rates1.fr * zz + - rates3.fr * rates2.frdt * rates1.fr * zz + - rates3.fr * rates2.fr * rates1.frdt * zz - - rates.fr * zz * denomdt; } } @@ -1689,7 +1684,6 @@ namespace RHS { if constexpr (rate == H1_H1_H1_to_He3) { rates.fr = rates1.fr; - rates.frdt = rates1.frdt; } // Beta limit He3 + He4 by the B8 decay half-life @@ -1697,10 +1691,7 @@ namespace RHS { if constexpr (rate == He3_He4_H1_to_2He4) { amrex::Real xx = 0.896_rt / state.y(He4); - rates.fr = amrex::min(rates.fr, xx); - if (rates.fr == xx) { - rates.frdt = 0.0_rt; - } + rates.fr = admath::min(rates.fr, xx); } // Each of the following reactions has both an (a,g) path and an @@ -1721,74 +1712,57 @@ namespace RHS { rate == Ti44_He4_to_Cr48 || rate == Cr48_He4_to_Fe52) { - amrex::Real rate_ir = 0.0e0_rt; - amrex::Real dratedt_ir = 0.0e0_rt; - amrex::Real denom = rates1.rr + rates2.fr; - amrex::Real denomdt = rates1.rrdt + rates2.frdt; + number_t rate_ir = 0.0e0_rt; + number_t denom = rates1.rr + rates2.fr; if (denom > 1.0e-30_rt) { - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; rate_ir = rates1.rr * zz; - dratedt_ir = (rates1.rrdt - rate_ir * denomdt) * zz; } rates.fr += rates1.fr * (1.0_rt - rate_ir); - rates.frdt += rates1.frdt * (1.0_rt - rate_ir) - rates1.fr * dratedt_ir; - rates.rr += rates2.rr * rate_ir; - rates.rrdt += rates2.rrdt * rate_ir + rates2.rr * dratedt_ir; } // The O16+O16->Si28+He4 reaction has an additional contribution from the O16+O16->P31+P // reaction followed by the reverse Si28+He4<->P31+P reaction. if constexpr (rate == O16_O16_to_Si28_He4) { - amrex::Real rate_ir = 0.0e0_rt; - amrex::Real dratedt_ir = 0.0e0_rt; - amrex::Real denom = rates1.rr + rates2.fr; - amrex::Real denomdt = rates1.rrdt + rates2.frdt; + number_t rate_ir = 0.0e0_rt; + number_t denom = rates1.rr + rates2.fr; if (denom > 1.0e-30_rt) { - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; rate_ir = rates1.rr * zz; - dratedt_ir = (rates1.rrdt - rate_ir * denomdt) * zz; } rates.fr = 0.56_rt * rates3.fr + 0.34_rt * rates3.fr * rate_ir; - rates.frdt = 0.56_rt * rates3.frdt + 0.34_rt * rates3.frdt * rate_ir + 0.34_rt * rates3.fr * dratedt_ir; } // The O16+O16->S32 reaction has an additional contribution from the O16+O16->P31+P // reaction followed by the forward P31+P<->S32 reaction. if constexpr (rate == O16_O16_to_S32) { - amrex::Real rate_ir = 0.0e0_rt; - amrex::Real dratedt_ir = 0.0e0_rt; - amrex::Real denom = rates1.rr + rates2.fr; - amrex::Real denomdt = rates1.rrdt + rates2.frdt; + number_t rate_ir = 0.0e0_rt; + number_t denom = rates1.rr + rates2.fr; if (denom > 1.0e-30_rt) { - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; rate_ir = rates1.rr * zz; - dratedt_ir = (rates1.rrdt - rate_ir * denomdt) * zz; } rates.fr = 0.1_rt * rates3.fr + 0.34_rt * rates3.fr * (1.0_rt - rate_ir); - rates.frdt = 0.1_rt * rates3.frdt + 0.34_rt * rates3.frdt * (1.0_rt - rate_ir) - 0.34_rt * rates3.fr * dratedt_ir; } if constexpr (rate == C12_2H1_to_N14) { rates.fr = rates1.fr; - rates.frdt = rates1.frdt; } if constexpr (rate == C12_O16_to_Si28) { rates.fr = rates1.fr; - rates.frdt = rates1.frdt; rates.rr = rates1.rr; - rates.rrdt = rates1.rrdt; } if constexpr (rate == N14_2H1_to_O16) @@ -1799,24 +1773,16 @@ namespace RHS { if (state.y(H1) > 1.0e-30_rt) { amrex::Real xx = 5.68e-3_rt / (state.y(H1) * 1.57_rt); - rates1.fr = amrex::min(rates1.fr, xx); - if (rates1.fr == xx) { - rates1.frdt = 0.0_rt; - } + rates1.fr = admath::min(rates1.fr, xx); } // Rate 2: O15_H1_to_O16 // Rate 3: O15_H1_to_C12_He4 - amrex::Real tot = rates2.fr + rates3.fr; - amrex::Real invtot = 1.0_rt / tot; + number_t tot = rates2.fr + rates3.fr; + number_t invtot = 1.0_rt / tot; rates.fr = rates1.fr * (rates2.fr * invtot); - - amrex::Real dtotdt = rates2.frdt + rates3.frdt; - - rates.frdt = rates1.fr * (rates2.frdt * invtot - rates2.fr * invtot * invtot * dtotdt) - + rates1.frdt * (rates2.fr * invtot); } if constexpr (rate == N14_2H1_to_C12_He4) @@ -1827,24 +1793,16 @@ namespace RHS { if (state.y(H1) > 1.0e-30_rt) { amrex::Real xx = 5.68e-3_rt / (state.y(H1) * 1.57_rt); - rates1.fr = amrex::min(rates1.fr, xx); - if (rates1.fr == xx) { - rates1.frdt = 0.0_rt; - } + rates1.fr = admath::min(rates1.fr, xx); } // Rate 2: O15_H1_to_O16 // Rate 3: O15_H1_to_C12_He4 - amrex::Real tot = rates2.fr + rates3.fr; - amrex::Real invtot = 1.0_rt / tot; + number_t tot = rates2.fr + rates3.fr; + number_t invtot = 1.0_rt / tot; rates.fr = rates1.fr * (rates3.fr * invtot); - - amrex::Real dtotdt = rates2.frdt + rates3.frdt; - - rates.frdt = rates1.fr * (rates3.frdt * invtot - rates3.fr * invtot * invtot * dtotdt) - + rates1.frdt * (rates3.fr * invtot); } if constexpr (rate == N14_He4_to_Ne20) @@ -1855,7 +1813,6 @@ namespace RHS { // we'll halve the rate. rates.fr = rates1.fr * 0.5_rt; - rates.frdt = rates1.frdt * 0.5_rt; } if constexpr (rate == O16_2H1_to_N14_He4) @@ -1863,13 +1820,9 @@ namespace RHS { // Beta limit amrex::Real xx = 0.0105_rt / state.y(H1); - rates1.fr = amrex::min(rates1.fr, xx); - if (rates1.fr == xx) { - rates1.frdt = 0.0_rt; - } + rates1.fr = admath::min(rates1.fr, xx); rates.fr = rates1.fr; - rates.frdt = rates1.frdt; } if constexpr (rate == Fe52_2N_to_Fe54) @@ -1878,19 +1831,16 @@ namespace RHS { // Rate 1 == Fe52_N_to_Fe53 == ir52ng (forward), ir53gn (reverse) // Rate 2 == Fe53_N_to_Fe54 == ir53ng (forward), ir54gn (reverse) - amrex::Real denom = rates1.rr + state.y(N) * rates2.fr; - amrex::Real denomdt = rates1.rrdt + state.y(N) * rates2.frdt; + number_t denom = rates1.rr + state.y(N) * rates2.fr; if (denom > 1.0e-50_rt && state.tf.t9 > 1.5_rt) { - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; // ir2f54 in the original aprox21 rates.fr = rates1.fr * rates2.fr * zz; - rates.frdt = rates1.frdt * rates2.fr * zz + rates1.fr * rates2.frdt * zz - rates.fr * zz * denomdt; // ir1f54 in the original aprox21 rates.rr = rates2.rr * rates1.rr * zz; - rates.rrdt = rates2.rrdt * rates1.rr * zz + rates2.rr * rates1.rrdt * zz - rates.rr * zz * denomdt; } } @@ -1901,20 +1851,16 @@ namespace RHS { // Rate 2 == Co55_P_to_Ni56 == ircopg (forward), irnigp (reverse) // Rate 3 == Fe52_He4_to_Co55_P == irfeap (forward), ircopa (reverse) - amrex::Real denom = rates1.rr + state.y(P) * (rates2.fr + rates3.rr); + number_t denom = rates1.rr + state.y(P) * (rates2.fr + rates3.rr); if (denom > 1.0e-50_rt && state.tf.t9 > 1.5_rt) { - amrex::Real denomdt = rates1.rrdt + state.y(P) * (rates2.frdt + rates3.rrdt); - - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; // ir3f54 in the original aprox21 rates.fr = rates1.fr * rates2.fr * zz; - rates.frdt = rates1.frdt * rates2.fr * zz + rates1.fr * rates2.frdt * zz - rates.fr * zz * denomdt; // ir4f54 in the original aprox21 rates.rr = rates2.rr * rates1.rr * zz; - rates.rrdt = rates2.rrdt * rates1.rr * zz + rates2.rr * rates1.rrdt * zz - rates.rr * zz * denomdt; } } @@ -1925,20 +1871,16 @@ namespace RHS { // Rate 2 == Fe54_P_to_Co55 == irfepg (forward), ircogp (reverse) // Rate 3 == Co55_P_to_Ni56 == ircopg (forward), irnigp (reverse) - amrex::Real denom = rates2.rr + state.y(P) * (rates3.fr + rates1.rr); + number_t denom = rates2.rr + state.y(P) * (rates3.fr + rates1.rr); if (denom > 1.0e-50_rt && state.tf.t9 > 1.5_rt) { - amrex::Real denomdt = rates2.rrdt + state.y(P) * (rates3.frdt + rates1.rrdt); - - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; // ir6f54 in the original aprox21 rates.fr = rates1.fr * rates2.rr * zz; - rates.frdt = rates1.frdt * rates2.rr * zz + rates1.fr * rates2.rrdt * zz - rates.fr * zz * denomdt; // ir5f54 in the original aprox21 rates.rr = rates2.fr * rates1.rr * zz; - rates.rrdt = rates2.frdt * rates1.rr * zz + rates2.fr * rates1.rrdt * zz - rates.rr * zz * denomdt; } } @@ -1949,28 +1891,22 @@ namespace RHS { // Rate 2 == Co55_P_to_Ni56 == ircopg (forward), irnigp (reverse) // Rate 3 == Fe54_P_to_Co55 == irfepg (forward), ircogp (reverse) - amrex::Real denom = rates3.rr + state.y(P) * (rates2.fr + rates1.rr); + number_t denom = rates3.rr + state.y(P) * (rates2.fr + rates1.rr); if (denom > 1.0e-50_rt && state.tf.t9 > 1.5_rt) { - amrex::Real denomdt = rates3.rrdt + state.y(P) * (rates2.frdt + rates1.rrdt); - - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; // Note that in these reactions we're adding to fr and rr // since this reaction already has a contribution from the // direct alpha capture sequence Fe52(a,g)Ni56. // ir7f54 in the original aprox19 - amrex::Real fr_add = rates1.fr * rates2.fr * zz; - amrex::Real frdt_add = rates1.frdt * rates2.fr * zz + rates1.fr * rates2.frdt * zz - fr_add * zz * denomdt; + number_t fr_add = rates1.fr * rates2.fr * zz; rates.fr += state.y(P) * fr_add; - rates.frdt += state.y(P) * frdt_add; // ir8f54 in the original aprox19 - amrex::Real rr_add = rates2.rr * rates1.rr * zz; - amrex::Real rrdt_add = rates2.rrdt * rates1.rr * zz + rates2.rr * rates1.rrdt * zz - rr_add * zz * denomdt; + number_t rr_add = rates2.rr * rates1.rr * zz; rates.rr += state.y(P) * rr_add; - rates.rrdt += state.y(P) * rrdt_add; } } @@ -1978,7 +1914,6 @@ namespace RHS { { // Rate 1 == Ni56_to_Fe56 rates.fr = 1.0e-4 * rates1.fr; - rates.frdt = 1.0e-4 * rates1.frdt; } if constexpr (rate == Fe54_2N_to_Fe56) @@ -1987,19 +1922,16 @@ namespace RHS { // Rate 1 == Fe54_N_to_Fe55 == ir54ng (forward), ir55gn (reverse) // Rate 2 == Fe55_N_to_Fe56 == ir55ng (forward), ir56gn (reverse) - amrex::Real denom = rates1.rr + state.y(N) * rates2.fr; - amrex::Real denomdt = rates1.rrdt + state.y(N) * rates2.frdt; + number_t denom = rates1.rr + state.y(N) * rates2.fr; if (denom > 1.0e-50_rt && state.tf.t9 > 1.5_rt) { - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; // irfe56_aux2 in the original aprox21 rates.fr = rates1.fr * rates2.fr * zz; - rates.frdt = rates1.frdt * rates2.fr * zz + rates1.fr * rates2.frdt * zz - rates.fr * zz * denomdt; // irfe56_aux1 in the original aprox21 rates.rr = rates2.rr * rates1.rr * zz; - rates.rrdt = rates2.rrdt * rates1.rr * zz + rates2.rr * rates1.rrdt * zz - rates.rr * zz * denomdt; } } @@ -2009,19 +1941,16 @@ namespace RHS { // Rate 1 == Fe54_He4_to_Co57_P == ir54ap (forward), irco57pa (reverse) // Rate 2 == Fe56_P_to_Co57 == irfe56pg (forward), irco57gp (reverse) - amrex::Real denom = rates2.rr + state.y(P) * rates1.rr; - amrex::Real denomdt = rates2.rrdt + state.y(P) * rates1.rrdt; + number_t denom = rates2.rr + state.y(P) * rates1.rr; if (denom > 1.0e-50_rt && state.tf.t9 > 1.5_rt) { - amrex::Real zz = 1.0_rt / denom; + number_t zz = 1.0_rt / denom; // irfe56_aux4 in the original aprox21 rates.fr = rates1.fr * rates2.rr * zz; - rates.frdt = rates1.frdt * rates2.rr * zz + rates1.fr * rates2.rrdt * zz - rates.fr * zz * denomdt; // irfe56_aux3 in the original aprox21 rates.rr = rates2.fr * rates1.rr * zz; - rates.rrdt = rates2.frdt * rates1.rr * zz + rates2.fr * rates1.rrdt * zz - rates.rr * zz * denomdt; } } } diff --git a/networks/ignition_chamulak/actual_network.H b/networks/ignition_chamulak/actual_network.H index 955fa0b0e0..23716fa6fc 100644 --- a/networks/ignition_chamulak/actual_network.H +++ b/networks/ignition_chamulak/actual_network.H @@ -67,40 +67,32 @@ namespace RHS { template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) + void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; if constexpr (rate == chamulak_rate) { // compute some often used temperature constants - amrex::Real T9 = state.tf.t9; - amrex::Real dT9dt = 1.0_rt / 1.0e9_rt; - amrex::Real T9a = T9 / (1.0_rt + 0.0396e0_rt * T9); - amrex::Real dT9adt = (T9a / T9 - (T9a / (1.0_rt + 0.0396e0_rt * T9)) * 0.0396e0_rt) * dT9dt; + number_t T9 = state.tf.t9; + number_t T9a = T9 / (1.0_rt + 0.0396e0_rt * T9); // compute the CF88 rate - amrex::Real scratch = std::pow(T9a, 1.0_rt / 3.0_rt); - amrex::Real dscratchdt = (1.0_rt / 3.0_rt) * std::pow(T9a, -2.0_rt / 3.0_rt) * dT9adt; + number_t scratch = admath::pow(T9a, 1.0_rt / 3.0_rt); - amrex::Real a = 4.27e26_rt * std::pow(T9a, 5.0_rt / 6.0_rt) * std::pow(T9, -1.5e0_rt); - amrex::Real dadt = (5.0_rt / 6.0_rt) * (a / T9a) * dT9adt - 1.5e0_rt * (a / T9) * dT9dt; - - amrex::Real b = std::exp(-84.165e0_rt / scratch - 2.12e-3_rt * T9 * T9 * T9); - amrex::Real dbdt = (84.165e0_rt * dscratchdt / (scratch * scratch) - 3.0_rt * 2.12e-3_rt * T9 * T9 * dT9dt) * b; + number_t a = 4.27e26_rt * admath::pow(T9a, 5.0_rt / 6.0_rt) * admath::pow(T9, -1.5e0_rt); + number_t b = admath::exp(-84.165e0_rt / scratch - 2.12e-3_rt * T9 * T9 * T9); rates.fr = a * b; - rates.frdt = dadt * b + a * dbdt; - rates.rr = 0.0_rt; - rates.rrdt = 0.0_rt; } } template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void postprocess_rate (const rhs_state_t& state, rate_t& rates, - rate_t& rates1, rate_t& rates2, rate_t& rates3) + void postprocess_rate (const rhs_state_t& state, rate_t& rates, + rate_t& rates1, rate_t& rates2, + rate_t& rates3) { // Nothing to do for this network. } diff --git a/networks/ignition_simple/actual_network.H b/networks/ignition_simple/actual_network.H index 255b863919..5ccce2fdfb 100644 --- a/networks/ignition_simple/actual_network.H +++ b/networks/ignition_simple/actual_network.H @@ -139,20 +139,21 @@ namespace RHS template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) + void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; if constexpr (rate == C12_C12_to_Mg24) { - rate_c12c12(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_c12c12(state.tf, 1.0_rt, rates.fr, rates.rr); } } template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void postprocess_rate ([[maybe_unused]] const rhs_state_t& state, [[maybe_unused]] rate_t& rates, - [[maybe_unused]] rate_t& rates1, [[maybe_unused]] rate_t& rates2, [[maybe_unused]] rate_t& rates3) + void postprocess_rate ([[maybe_unused]] const rhs_state_t& state, [[maybe_unused]] rate_t& rates, + [[maybe_unused]] rate_t& rates1, [[maybe_unused]] rate_t& rates2, + [[maybe_unused]] rate_t& rates3) { using namespace Species; using namespace Rates; diff --git a/networks/iso7/actual_network.H b/networks/iso7/actual_network.H index 9612eaa2bd..ea60bd0351 100644 --- a/networks/iso7/actual_network.H +++ b/networks/iso7/actual_network.H @@ -315,44 +315,45 @@ namespace RHS { template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) + void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; if constexpr (rate == C12_He4_to_O16) { - rate_c12ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_c12ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == He4_He4_He4_to_C12) { - rate_triplealf(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_triplealf(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == C12_C12_to_Ne20_He4) { - rate_c12c12(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_c12c12(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == C12_O16_to_Mg24_He4 || rate == C12_O16_to_Si28) { - rate_c12o16(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_c12o16(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == O16_O16_to_Si28_He4) { - rate_o16o16(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_o16o16(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == O16_He4_to_Ne20) { - rate_o16ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_o16ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ne20_He4_to_Mg24) { - rate_ne20ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ne20ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Mg24_He4_to_Si28) { - rate_mg24ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_mg24ag(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == Ca40_He4_to_Ti44) { - rate_ca40ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_ca40ag(state.tf, 1.0_rt, rates.fr, rates.rr); } } template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void postprocess_rate (const rhs_state_t& state, rate_t& rates, - rate_t& rates1, [[maybe_unused]] rate_t& rates2, [[maybe_unused]] rate_t& rates3) + void postprocess_rate (const rhs_state_t& state, rate_t& rates, + rate_t& rates1, [[maybe_unused]] rate_t& rates2, + [[maybe_unused]] rate_t& rates3) { using namespace Species; using namespace Rates; @@ -360,30 +361,21 @@ namespace RHS { if constexpr (rate == Si28_7He4_to_Ni56) { // first rate corresponds to Ca40_He4_to_Ti44 - if (state.tf.t9 > 2.5_rt && state.y(C12) + state.y(O16) <= 4.0e-3_rt) { + if (static_cast(state.tf.t9) > 2.5_rt && state.y(C12) + state.y(O16) <= 4.0e-3_rt) { - amrex::Real t992 = state.tf.t972 * state.tf.t9; - amrex::Real t9i92 = 1.0_rt / t992; + number_t t992 = state.tf.t972 * state.tf.t9; + number_t t9i92 = 1.0_rt / t992; - amrex::Real yeff_ca40 = t9i92 * std::exp(239.42_rt * state.tf.t9i - 74.741_rt); - amrex::Real yeff_ca40dt = -yeff_ca40 * (239.42_rt * state.tf.t9i2 + 4.5_rt * state.tf.t9i); + number_t yeff_ca40 = t9i92 * admath::exp(239.42_rt * state.tf.t9i - 74.741_rt); - amrex::Real yeff_ti44 = t992 * std::exp(-274.12_rt * state.tf.t9i + 74.914_rt); - amrex::Real yeff_ti44dt = yeff_ti44*(274.12_rt * state.tf.t9i2 + 4.5_rt * state.tf.t9i); + number_t yeff_ti44 = t992 * admath::exp(-274.12_rt * state.tf.t9i + 74.914_rt); amrex::Real denom = amrex::Math::powi<3>(state.rho * state.y(He4)); rates.fr = yeff_ca40 * denom * rates1.fr; - rates.frdt = (yeff_ca40dt * rates1.fr * 1.0e-9_rt + yeff_ca40 * rates1.frdt) * denom; amrex::Real zz = 1.0_rt / denom; - rates.rr = amrex::min(1.0e10_rt, yeff_ti44 * rates1.rr * zz); - - if (rates.rr == 1.0e10_rt) { - rates.rrdt = 0.0_rt; - } else { - rates.rrdt = (yeff_ti44dt * rates1.rr * 1.0e-9_rt + yeff_ti44 * rates1.rrdt) * zz; - } + rates.rr = admath::min(1.0e10_rt, yeff_ti44 * rates1.rr * zz); } } } diff --git a/networks/powerlaw/actual_network.H b/networks/powerlaw/actual_network.H index 6c2cc5e174..e6c829394a 100644 --- a/networks/powerlaw/actual_network.H +++ b/networks/powerlaw/actual_network.H @@ -55,7 +55,7 @@ namespace RHS { template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) + void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; @@ -66,7 +66,7 @@ namespace RHS { } else { rates.fr = network_rp::rtilde / network_rp::rho_burn_ref * - std::pow(state.tf.temp / network_rp::T_burn_ref, network_rp::nu); + admath::pow(state.tf.temp / network_rp::T_burn_ref, network_rp::nu); } rates.rr = 0.0_rt; @@ -75,8 +75,8 @@ namespace RHS { template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void postprocess_rate (const rhs_state_t& state, rate_t& rates, - rate_t& rates1, rate_t& rates2, rate_t& rates3) + void postprocess_rate (const rhs_state_t& state, rate_t& rates, + rate_t& rates1, rate_t& rates2, rate_t& rates3) { // Nothing to do for this network. } diff --git a/networks/rhs.H b/networks/rhs.H index ca032d8bc7..5d57aa5ac5 100644 --- a/networks/rhs.H +++ b/networks/rhs.H @@ -18,6 +18,7 @@ #endif #include #include +#include #ifdef NEW_NETWORK_IMPLEMENTATION @@ -27,8 +28,7 @@ namespace RHS { // Rate tabulation data. -extern AMREX_GPU_MANAGED amrex::Array3D rattab; -extern AMREX_GPU_MANAGED amrex::Array3D drattabdt; +extern AMREX_GPU_MANAGED amrex::Array3D rattab; // Calculate an integer factorial. AMREX_GPU_HOST_DEVICE AMREX_INLINE @@ -407,7 +407,7 @@ constexpr int density_exponent_reverse () // Scale a rate using the density terms. template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void apply_density_scaling (const rhs_state_t& state, rate_t& rates) +void apply_density_scaling (const rhs_state_t& state, rate_t& rates) { constexpr int forward_exponent = density_exponent_forward(); constexpr int reverse_exponent = density_exponent_reverse(); @@ -440,16 +440,14 @@ void apply_density_scaling (const rhs_state_t& state, rate_t& rates) } rates.fr *= density_term_forward; - rates.frdt *= density_term_forward; rates.rr *= density_term_reverse; - rates.rrdt *= density_term_reverse; } #ifdef SCREENING // Apply the screening term to a given rate. template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void apply_screening (const rhs_state_t& state, rate_t& rates) +void apply_screening (const rhs_state_t& state, rate_t& rates) { // The screening behavior depends on the type of reaction. We provide screening // here for the reaction classes we know about, and any other reactions are unscreened. @@ -475,17 +473,14 @@ void apply_screening (const rhs_state_t& state, rate_t& rates) // compiler to evaluate the screen factor at compile time. static_assert(scn_fac.z1 == Z1); - amrex::Real sc, scdt; - actual_screen(state.pstate, scn_fac, sc, scdt); + const number_t sc = actual_screen(state.pstate, scn_fac); if constexpr (data.screen_forward_reaction == 1) { - rates.frdt = rates.frdt * sc + rates.fr * scdt; - rates.fr = rates.fr * sc; + rates.fr *= sc; } if constexpr (data.screen_reverse_reaction == 1) { - rates.rrdt = rates.rrdt * sc + rates.rr * scdt; - rates.rr = rates.rr * sc; + rates.rr *= sc; } } @@ -499,17 +494,14 @@ void apply_screening (const rhs_state_t& state, rate_t& rates) static_assert(scn_fac.z1 == Z1); - amrex::Real sc, scdt; - actual_screen(state.pstate, scn_fac, sc, scdt); + const number_t sc = actual_screen(state.pstate, scn_fac); if constexpr (data.screen_forward_reaction == 1) { - rates.frdt = rates.frdt * sc + rates.fr * scdt; - rates.fr = rates.fr * sc; + rates.fr *= sc; } if constexpr (data.screen_reverse_reaction == 1) { - rates.rrdt = rates.rrdt * sc + rates.rr * scdt; - rates.rr = rates.rr * sc; + rates.rr *= sc; } } @@ -524,8 +516,7 @@ void apply_screening (const rhs_state_t& state, rate_t& rates) static_assert(scn_fac1.z1 == Z1); - amrex::Real sc1, sc1dt; - actual_screen(state.pstate, scn_fac1, sc1, sc1dt); + const number_t sc1 = actual_screen(state.pstate, scn_fac1); constexpr amrex::Real Z2 = 2.0_rt * Z1; constexpr amrex::Real A2 = 2.0_rt * A1; @@ -534,42 +525,36 @@ void apply_screening (const rhs_state_t& state, rate_t& rates) static_assert(scn_fac2.z1 == Z1); - amrex::Real sc2, sc2dt; - actual_screen(state.pstate, scn_fac2, sc2, sc2dt); + const number_t sc2 = actual_screen(state.pstate, scn_fac2); // Compute combined screening factor - amrex::Real sc = sc1 * sc2; - amrex::Real scdt = sc1dt * sc2 + sc1 * sc2dt; + const number_t sc = sc1 * sc2; if constexpr (data.screen_forward_reaction == 1) { - rates.frdt = rates.frdt * sc + rates.fr * scdt; - rates.fr = rates.fr * sc; + rates.fr *= sc; } if constexpr (data.screen_reverse_reaction == 1) { - rates.rrdt = rates.rrdt * sc + rates.rr * scdt; - rates.rr = rates.rr * sc; + rates.rr *= sc; } } } #endif // SCREENING // Apply the branching ratios to a given rate. -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void apply_branching (rate_t& rates) +void apply_branching (rate_t& rates) { constexpr rhs_t data = rhs_data(rate); if constexpr (data.forward_branching_ratio != 1.0_rt) { rates.fr *= data.forward_branching_ratio; - rates.frdt *= data.forward_branching_ratio; } if constexpr (data.reverse_branching_ratio != 1.0_rt) { rates.rr *= data.reverse_branching_ratio; - rates.rrdt *= data.reverse_branching_ratio; } } @@ -586,10 +571,12 @@ void tabulate_rates () ttab(i) = temp; - rhs_state_t state; + rhs_state_t state; // Get the temperature factors - state.tf = get_tfactors(temp); + autodiff::dual dual_temp = temp; + autodiff::seed(dual_temp); + state.tf = get_tfactors(dual_temp); // Arbitrary density, y, and y_e values (should be unused) state.rho = 0.0_rt; @@ -601,11 +588,9 @@ void tabulate_rates () { [[maybe_unused]] constexpr int rate = n; - rate_t rates; + rate_t rates; rates.fr = 0.0_rt; rates.rr = 0.0_rt; - rates.frdt = 0.0_rt; - rates.rrdt = 0.0_rt; constexpr rhs_t data = RHS::rhs_data(rate); @@ -615,8 +600,6 @@ void tabulate_rates () rattab(rate, 1, i) = rates.fr; rattab(rate, 2, i) = rates.rr; - drattabdt(rate, 1, i) = rates.frdt; - drattabdt(rate, 2, i) = rates.rrdt; }); } } @@ -624,27 +607,17 @@ void tabulate_rates () // Evaluate a rate using the rate tables. template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void evaluate_tabulated_rate (const rhs_state_t& state, rate_t& rates) +void evaluate_tabulated_rate (const rhs_state_t& state, rate_t& rates) { - rates.fr = (state.tab.alfa * rattab(rate, 1, state.tab.iat ) + - state.tab.beta * rattab(rate, 1, state.tab.iat+1) + - state.tab.gama * rattab(rate, 1, state.tab.iat+2) + - state.tab.delt * rattab(rate, 1, state.tab.iat+3)); - - rates.rr = (state.tab.alfa * rattab(rate, 2, state.tab.iat ) + - state.tab.beta * rattab(rate, 2, state.tab.iat+1) + - state.tab.gama * rattab(rate, 2, state.tab.iat+2) + - state.tab.delt * rattab(rate, 2, state.tab.iat+3)); - - rates.frdt = (state.tab.alfa * drattabdt(rate, 1, state.tab.iat ) + - state.tab.beta * drattabdt(rate, 1, state.tab.iat+1) + - state.tab.gama * drattabdt(rate, 1, state.tab.iat+2) + - state.tab.delt * drattabdt(rate, 1, state.tab.iat+3)); - - rates.rrdt = (state.tab.alfa * drattabdt(rate, 2, state.tab.iat ) + - state.tab.beta * drattabdt(rate, 2, state.tab.iat+1) + - state.tab.gama * drattabdt(rate, 2, state.tab.iat+2) + - state.tab.delt * drattabdt(rate, 2, state.tab.iat+3)); + rates.fr = (state.tab.alfa * static_cast(rattab(rate, 1, state.tab.iat )) + + state.tab.beta * static_cast(rattab(rate, 1, state.tab.iat+1)) + + state.tab.gama * static_cast(rattab(rate, 1, state.tab.iat+2)) + + state.tab.delt * static_cast(rattab(rate, 1, state.tab.iat+3))); + + rates.rr = (state.tab.alfa * static_cast(rattab(rate, 2, state.tab.iat )) + + state.tab.beta * static_cast(rattab(rate, 2, state.tab.iat+1)) + + state.tab.gama * static_cast(rattab(rate, 2, state.tab.iat+2)) + + state.tab.delt * static_cast(rattab(rate, 2, state.tab.iat+3))); } // Calculate the RHS term for a given species and rate. @@ -684,9 +657,9 @@ void evaluate_tabulated_rate (const rhs_state_t& state, rate_t& rates) // If a given reaction uses fewer than three species, we infer // this by calling its index -1 and then not accessing it // in the multiplication. -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -constexpr std::pair rhs_term (const burn_t& state, const rate_t& rates) +constexpr std::pair rhs_term (const burn_t& state, const rate_t& rates) { constexpr rhs_t data = rhs_data(rate); @@ -694,7 +667,12 @@ constexpr std::pair rhs_term (const burn_t& state, con // reverse reactions, which is the same regardless of which species // we're producing or consuming. - amrex::Real forward_term = use_T_derivatives ? rates.frdt : rates.fr; + amrex::Real forward_term{}; + if constexpr (autodiff::detail::isDual) { + forward_term = autodiff::derivative(rates.fr); + } else { + forward_term = rates.fr; + } if constexpr (data.species_A >= 0) { amrex::Real Y_A = state.xn[data.species_A-1] * aion_inv[data.species_A-1]; @@ -771,7 +749,12 @@ constexpr std::pair rhs_term (const burn_t& state, con forward_term *= df; } - amrex::Real reverse_term = use_T_derivatives ? rates.rrdt : rates.rr; + amrex::Real reverse_term{}; + if constexpr (autodiff::detail::isDual) { + reverse_term = autodiff::derivative(rates.rr); + } else { + reverse_term = rates.rr; + } if constexpr (data.species_D >= 0) { amrex::Real Y_D = state.xn[data.species_D-1] * aion_inv[data.species_D-1]; @@ -889,7 +872,7 @@ constexpr std::pair rhs_term (const burn_t& state, con // contribution if spec2 is one of (D, E, F). template AMREX_GPU_HOST_DEVICE AMREX_INLINE -constexpr amrex::Real jac_term (const burn_t& state, const rate_t& rates) +constexpr amrex::Real jac_term (const burn_t& state, const rate_t& rates) { constexpr rhs_t data = rhs_data(rate); @@ -898,7 +881,7 @@ constexpr amrex::Real jac_term (const burn_t& state, const rate_t& rates) if constexpr (is_rate_used() && (spec2 == data.species_A || spec2 == data.species_B || spec2 == data.species_C)) { - forward_term = rates.fr; + forward_term = autodiff::val(rates.fr); if constexpr (data.species_A >= 0) { amrex::Real Y_A = state.xn[data.species_A-1] * aion_inv[data.species_A-1]; @@ -1012,7 +995,7 @@ constexpr amrex::Real jac_term (const burn_t& state, const rate_t& rates) if constexpr (is_rate_used() && (spec2 == data.species_D || spec2 == data.species_E || spec2 == data.species_F)) { - reverse_term = rates.rr; + reverse_term = autodiff::val(rates.rr); if constexpr (data.species_D >= 0) { amrex::Real Y_D = state.xn[data.species_D-1] * aion_inv[data.species_D-1]; @@ -1143,15 +1126,13 @@ constexpr amrex::Real jac_term (const burn_t& state, const rate_t& rates) template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void construct_rate (const rhs_state_t& state, rate_t& rates) +void construct_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; rates.fr = 0.0; - rates.frdt = 0.0; rates.rr = 0.0; - rates.rrdt = 0.0; constexpr rhs_t data = RHS::rhs_data(rate); @@ -1177,9 +1158,9 @@ void construct_rate (const rhs_state_t& state, rate_t& rates) apply_branching(rates); } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void fill_additional_rates (const Arr& intermediate_rates, rate_t& rates1, rate_t& rates2, rate_t& rates3) +void fill_additional_rates (const Arr& intermediate_rates, rate_t& rates1, rate_t& rates2, rate_t& rates3) { constexpr rhs_t data = RHS::rhs_data(rate); @@ -1270,7 +1251,7 @@ void rhs (burn_t& burn_state, amrex::Array1D& ydot) constexpr int intermediate_array_size = num_intermediate > 0 ? num_intermediate : 1; // Define forward and reverse (and d/dT) rate arrays. - amrex::Array1D intermediate_rates; + amrex::Array1D, 1, intermediate_array_size> intermediate_rates; // Fill all intermediate rates first. amrex::constexpr_for<1, Rates::NumRates+1>([&] (auto n) @@ -1290,7 +1271,7 @@ void rhs (burn_t& burn_state, amrex::Array1D& ydot) { constexpr int rate = n1; - rate_t rates; + rate_t rates; // We only need to compute the rate at this point if it's not intermediate. If it // is intermediate, retrieve it from the cached array. @@ -1307,7 +1288,7 @@ void rhs (burn_t& burn_state, amrex::Array1D& ydot) // To keep the problem bounded we assume that there are no more than // three intermediate reactions needed. - rate_t rates1, rates2, rates3; + rate_t rates1, rates2, rates3; fill_additional_rates(intermediate_rates, rates1, rates2, rates3); @@ -1321,8 +1302,7 @@ void rhs (burn_t& burn_state, amrex::Array1D& ydot) constexpr int species = n2; if constexpr (is_rate_used()) { - constexpr int use_T_derivatives = 0; - auto [forward_term, reverse_term] = rhs_term(burn_state, rates); + auto [forward_term, reverse_term] = rhs_term(burn_state, rates); if constexpr (nrhs == 2 * neqs) { if (forward_term >= 0.0_rt) { @@ -1378,11 +1358,7 @@ void rhs (burn_t& burn_state, amrex::Array1D& ydot) AMREX_GPU_HOST_DEVICE AMREX_INLINE void jac (burn_t& burn_state, ArrayUtil::MathArray2D<1, neqs, 1, neqs>& jac) { -#ifdef SCREENING rhs_state_t rhs_state; -#else - rhs_state_t rhs_state; -#endif rhs_state.rho = burn_state.rho; rhs_state.eta = burn_state.eta; @@ -1393,16 +1369,17 @@ void jac (burn_t& burn_state, ArrayUtil::MathArray2D<1, neqs, 1, neqs>& jac) rhs_state.y(n) = burn_state.xn[n-1] * aion_inv[n-1]; } + autodiff::dual dual_temp = burn_state.T; + // seed the dual number for temperature before calculating anything with it + autodiff::seed(dual_temp); + #ifdef SCREENING // Set up the state data, which is the same for all screening factors. - autodiff::dual temp = burn_state.T; - // seed the dual number for temperature before calculating anything with it - autodiff::seed(temp); - fill_plasma_state(rhs_state.pstate, temp, burn_state.rho, rhs_state.y); + fill_plasma_state(rhs_state.pstate, dual_temp, burn_state.rho, rhs_state.y); #endif // Initialize the rate temperature term. - rhs_state.tf = get_tfactors(burn_state.T); + rhs_state.tf = get_tfactors(dual_temp); if (use_tables) { rhs_state.tab.initialize(burn_state.T); } @@ -1421,9 +1398,9 @@ void jac (burn_t& burn_state, ArrayUtil::MathArray2D<1, neqs, 1, neqs>& jac) constexpr int intermediate_array_size = num_intermediate > 0 ? num_intermediate : 1; // Define forward and reverse (and d/dT) rate arrays. - amrex::Array1D intermediate_rates; + amrex::Array1D, 1, intermediate_array_size> intermediate_rates; - rate_t rates1, rates2, rates3; + rate_t rates1, rates2, rates3; // Fill all intermediate rates first. amrex::constexpr_for<1, Rates::NumRates+1>([&] (auto n) @@ -1442,7 +1419,7 @@ void jac (burn_t& burn_state, ArrayUtil::MathArray2D<1, neqs, 1, neqs>& jac) { constexpr int rate = n1; - rate_t rates; + rate_t rates; // We only need to compute the rate at this point if it's not intermediate. If it // is intermediate, retrieve it from the cached array. @@ -1488,8 +1465,7 @@ void jac (burn_t& burn_state, ArrayUtil::MathArray2D<1, neqs, 1, neqs>& jac) [[maybe_unused]] constexpr int species = n2; if constexpr (is_rate_used()) { - constexpr int use_T_derivatives = 1; - auto [forward_term, reverse_term] = rhs_term(burn_state, rates); + auto [forward_term, reverse_term] = rhs_term(burn_state, rates); jac(species, net_ienuc) += forward_term + reverse_term; } }); diff --git a/networks/rhs.cpp b/networks/rhs.cpp index 935029cf5e..abcd931050 100644 --- a/networks/rhs.cpp +++ b/networks/rhs.cpp @@ -3,8 +3,7 @@ #ifdef NEW_NETWORK_IMPLEMENTATION #include -AMREX_GPU_MANAGED amrex::Array3D RHS::rattab; -AMREX_GPU_MANAGED amrex::Array3D RHS::drattabdt; +AMREX_GPU_MANAGED amrex::Array3D RHS::rattab{}; AMREX_GPU_MANAGED amrex::Array1D RHS::ttab; #endif diff --git a/networks/rprox/actual_network.H b/networks/rprox/actual_network.H index b4a817b375..c16d12dc61 100644 --- a/networks/rprox/actual_network.H +++ b/networks/rprox/actual_network.H @@ -703,71 +703,70 @@ namespace RHS { template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) + void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; if constexpr (rate == He4_He4_He4_to_C12) { - rate_he4_he4_he4_to_c12(state.tf, rates.fr, rates.frdt); + rate_he4_he4_he4_to_c12(state.tf, rates.fr); } else if constexpr (rate == C12_H1_to_N13) { - rate_p_c12_to_n13(state.tf, rates.fr, rates.frdt); + rate_p_c12_to_n13(state.tf, rates.fr); } else if constexpr (rate == N14_H1_to_O15) { - rate_p_n14_to_o15(state.tf, rates.fr, rates.frdt); + rate_p_n14_to_o15(state.tf, rates.fr); } else if constexpr (rate == O14_to_N14) { - rate_o14_to_n14(state.tf, rates.fr, rates.frdt); + rate_o14_to_n14(state.tf, rates.fr); } else if constexpr (rate == O14_He4_to_F17_H1) { - rate_he4_o14_to_p_f17(state.tf, rates.fr, rates.frdt); + rate_he4_o14_to_p_f17(state.tf, rates.fr); } else if constexpr (rate == O15_to_N15) { - rate_o15_to_n15(state.tf, rates.fr, rates.frdt); + rate_o15_to_n15(state.tf, rates.fr); } else if constexpr (rate == O15_He4_to_Ne19) { - rate_he4_o15_to_ne19(state.tf, rates.fr, rates.frdt); + rate_he4_o15_to_ne19(state.tf, rates.fr); } else if constexpr (rate == O16_H1_to_F17) { - rate_p_o16_to_f17(state.tf, rates.fr, rates.frdt); - rate_f17_to_p_o16(state.tf, rates.rr, rates.rrdt); - rates.rrdt *= 1.0e-9_rt; + rate_p_o16_to_f17(state.tf, rates.fr); + rate_f17_to_p_o16(state.tf, rates.rr); } else if constexpr (rate == O16_He4_to_Ne20) { - rate_he4_o16_to_ne20(state.tf, rates.fr, rates.frdt); + rate_he4_o16_to_ne20(state.tf, rates.fr); } else if constexpr (rate == F17_to_O17) { - rate_f17_to_o17(state.tf, rates.fr, rates.frdt); + rate_f17_to_o17(state.tf, rates.fr); } else if constexpr (rate == F17_H1_to_Ne18) { - rate_p_f17_to_ne18(state.tf, rates.fr, rates.frdt); + rate_p_f17_to_ne18(state.tf, rates.fr); } else if constexpr (rate == Ne18_to_F18) { - rate_ne18_to_f18(state.tf, rates.fr, rates.frdt); + rate_ne18_to_f18(state.tf, rates.fr); } else if constexpr (rate == Ne18_He4_to_Na21_H1) { - rate_he4_ne18_to_p_na21(state.tf, rates.fr, rates.frdt); + rate_he4_ne18_to_p_na21(state.tf, rates.fr); } else if constexpr (rate == Ne19_to_F19) { - rate_ne19_to_f19(state.tf, rates.fr, rates.frdt); + rate_ne19_to_f19(state.tf, rates.fr); } else if constexpr (rate == Ne19_H1_to_Na20) { - rate_p_ne19_to_na20(state.tf, rates.fr, rates.frdt); + rate_p_ne19_to_na20(state.tf, rates.fr); } else if constexpr (rate == Si26_He4_to_P29_H1) { - rate_he4_si26_to_p_p29(state.tf, rates.fr, rates.frdt); + rate_he4_si26_to_p_p29(state.tf, rates.fr); } else if constexpr (rate == Ti44_He4_to_V47_H1) { - rate_he4_ti44_to_p_v47(state.tf, rates.fr, rates.frdt); + rate_he4_ti44_to_p_v47(state.tf, rates.fr); } - rates.frdt *= 1.0e-9_rt; } template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void postprocess_rate ([[maybe_unused]] const rhs_state_t& state, [[maybe_unused]] rate_t& rates, - [[maybe_unused]] rate_t& rates1, [[maybe_unused]] rate_t& rates2, [[maybe_unused]] rate_t& rates3) + void postprocess_rate ([[maybe_unused]] const rhs_state_t& state, [[maybe_unused]] rate_t& rates, + [[maybe_unused]] rate_t& rates1, [[maybe_unused]] rate_t& rates2, + [[maybe_unused]] rate_t& rates3) { using namespace Species; using namespace Rates; @@ -776,17 +775,15 @@ namespace RHS { // Rate 1 == C12_H1_to_N13 rates.fr = rates1.fr; - rates.frdt = rates1.frdt; } else if constexpr (rate == O14_H1_to_O15) { // Rate 1 == O14_to_N14 rates.fr = rates1.fr; - rates.frdt = rates1.frdt; } else if constexpr (rate == O15_H1_to_C12_He4) { // Set as the minimum of the cold CNO and hot CNO cases respectively - rates.fr = amrex::min(rates1.fr, rates2.fr); + rates.fr = admath::min(rates1.fr, rates2.fr); if (rates.fr == rates2.fr) { // For the hot CNO case, divide the rate by y(H1) because the proton capture @@ -794,66 +791,52 @@ namespace RHS { // There is no T derivative to bring along since this is a weak rate. rates.fr /= state.y(H1); } - else { - // Cold CNO case - rates.frdt = rates1.frdt; - } } else if constexpr (rate == O15_H1_to_O16) { // Rate 1 == O15_He4_to_Ne19 // Rate 2 == Ne19_to_F19 // Rate 3 == Ne19_H1_to_Na20 - amrex::Real rate_irr1 = rates2.fr / (rates2.fr + state.y(H1) * rates3.fr); - amrex::Real dratedt_irr1 = -rate_irr1 * state.y(H1) * rates3.frdt / (rates2.fr + state.y(H1) * rates3.fr); + number_t rate_irr1 = rates2.fr / (rates2.fr + state.y(H1) * rates3.fr); rates.fr = rates1.fr * rate_irr1; - rates.frdt = rates1.frdt * rate_irr1 + rates1.fr * dratedt_irr1; } else if constexpr (rate == O15_He4_3H1_to_Mg22) { // Rate 1 == Ne19_to_F19 (wk19ne in the original rprox) // Rate 2 == Ne19_H1_to_Na20 // Rate 3 == O15_He4_to_Ne19 (ir15ago in the original rprox) - amrex::Real rate_irr1 = rates1.fr / (rates1.fr + state.y(H1) * rates2.fr); - amrex::Real dratedt_irr1 = -rate_irr1 * state.y(H1) * rates2.frdt / (rates1.fr + state.y(H1) * rates2.fr); + number_t rate_irr1 = rates1.fr / (rates1.fr + state.y(H1) * rates2.fr); rates.fr = rates3.fr * (1.0_rt - rate_irr1); - rates.frdt = rates3.frdt * (1.0_rt - rate_irr1) - rates3.fr * dratedt_irr1; } else if constexpr (rate == O16_He4_2H1_to_Mg22) { // Rate 1 == O16_He4_to_Ne20 rates.fr = rates1.fr; - rates.frdt = rates1.frdt; } else if constexpr (rate == F17_2H1_to_O15_He4) { // Rate 1 == F17_H1_to_Ne18 // Rate 2 == Ne18_to_F18 // Rate 3 == Ne18_He4_to_Na21_H1 - amrex::Real rate_irs1 = rates2.fr / (rates2.fr + state.y(He4) * rates3.fr); - amrex::Real dratedt_irs1 = -rate_irs1 * state.y(He4) * rates3.frdt / (rates2.fr + state.y(He4) * rates3.fr); + number_t rate_irs1 = rates2.fr / (rates2.fr + state.y(He4) * rates3.fr); rates.fr = rates1.fr * rate_irs1; - rates.frdt = rates1.frdt * rate_irs1 + rates1.fr * dratedt_irs1; } else if constexpr (rate == F17_2H1_to_O15_He4_weak) { // Rate 1 == F17_to_O17 rates.fr = rates1.fr; - rates.frdt = rates1.frdt; } else if constexpr (rate == F17_He4_H1_to_Mg22) { // Rate 1 == F17_H1_to_Ne18 // Rate 2 == Ne18_to_F18 // Rate 3 == Ne18_He4_to_Na21_H1 - amrex::Real rate_irs1 = rates2.fr / (rates2.fr + state.y(He4) * rates3.fr); - amrex::Real dratedt_irs1 = -rate_irs1 * state.y(He4) * rates3.frdt / (rates2.fr + state.y(He4) * rates3.fr); + number_t rate_irs1 = rates2.fr / (rates2.fr + state.y(He4) * rates3.fr); rates.fr = rates1.fr * (1.0_rt - rate_irs1); - rates.frdt = rates1.frdt * (1.0_rt - rate_irs1) - rates1.fr * dratedt_irs1; } else if constexpr (rate == Mg22_2He4_to_S30 || rate == Mg22_8H1_to_S30) { // Rate 1 == Si26_He4_to_P29_H1 @@ -865,23 +848,17 @@ namespace RHS { constexpr amrex::Real Lweak = 1.05e0_rt; // this is for NS // constexpr amrex::Real Lweak = 0.107e0_rt; // this is for lower densities - rates.fr = amrex::max(Lweak, state.y(He4) * rates1.fr); + rates.fr = admath::max(Lweak, state.y(He4) * rates1.fr); - if (rates.fr == Lweak) { + if (static_cast(rates.fr) == Lweak) { // Proton capture case - if constexpr (rate == Mg22_8H1_to_S30) { - rates.frdt = 0.0_rt; - } - else { + if constexpr (rate == Mg22_2He4_to_S30) { rates.fr = 0.0_rt; } } else { // Alpha capture case - if constexpr (rate == Mg22_2He4_to_S30) { - rates.frdt = state.y(He4) * rates1.frdt; - } - else { + if constexpr (rate == Mg22_8H1_to_S30) { rates.fr = 0.0_rt; } } @@ -894,23 +871,17 @@ namespace RHS { constexpr amrex::Real la2 = 1.0_rt / 15.0_rt; // mean rate from 30s to 56ni from p-capture and beta decays - rates.fr = amrex::max(la2, state.y(He4) * rates1.fr); + rates.fr = admath::max(la2, state.y(He4) * rates1.fr); if (rates.fr == la2) { // Proton capture case - if constexpr (rate == S30_26H1_to_Ni56) { - rates.frdt = 0.0_rt; - } - else { + if constexpr (rate == S30_6_5He4_to_Ni56) { rates.fr = 0.0_rt; } } else { // Alpha capture case - if constexpr (rate == S30_6_5He4_to_Ni56) { - rates.frdt = state.y(He4) * rates1.frdt; - } - else { + if constexpr (rate == S30_26H1_to_Ni56) { rates.fr = 0.0_rt; } } diff --git a/networks/rprox/rprox_rates.H b/networks/rprox/rprox_rates.H index 7d9394ac5f..3b9bd78403 100644 --- a/networks/rprox/rprox_rates.H +++ b/networks/rprox/rprox_rates.H @@ -3,70 +3,58 @@ #include #include +#include +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_p_c12_to_n13 (const tf_t& tfactors, amrex::Real& rate, amrex::Real& dratedt) +void rate_p_c12_to_n13 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dratedt = 0.0_rt; - amrex::Real ct9i = tfactors.t9i * (-3.77849e0_rt); - amrex::Real ct9i13 = tfactors.t9i13 * (-5.10735e0_rt); - amrex::Real ct913 = tfactors.t913 * (-2.24111e0_rt); - amrex::Real ct9 = tfactors.t9 * (0.148883e0_rt); - amrex::Real clnt9 = tfactors.lnt9 * (-1.5e0_rt); + number_t ct9i = tfactors.t9i * (-3.77849e0_rt); + number_t ct9i13 = tfactors.t9i13 * (-5.10735e0_rt); + number_t ct913 = tfactors.t913 * (-2.24111e0_rt); + number_t ct9 = tfactors.t9 * (0.148883e0_rt); + number_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r0 = std::exp(17.5428e0_rt + + number_t r0 = admath::exp(17.5428e0_rt + ct9i + ct9i13 + ct913 + ct9 + clnt9); - amrex::Real dr0dt = r0 * tfactors.t9i * (-ct9i - - (1.0_rt / 3.0_rt) * ct9i13 + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (-1.5e0_rt)); - ct9i13 = tfactors.t9i13 * (-13.692e0_rt); ct913 = tfactors.t913 * (-0.230881e0_rt); ct9 = tfactors.t9 * (4.44362e0_rt); - amrex::Real ct953 = tfactors.t953 * (-3.15898e0_rt); + number_t ct953 = tfactors.t953 * (-3.15898e0_rt); clnt9 = tfactors.lnt9 * (-0.666667e0_rt); - amrex::Real r1 = std::exp(17.1482e0_rt + + number_t r1 = admath::exp(17.1482e0_rt + ct9i13 + ct913 + ct9 + ct953 + clnt9); - amrex::Real dr1dt = r1 * tfactors.t9i * (-(1.0_rt / 3.0_rt) * ct9i13 + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (5.0_rt / 3.0_rt) * ct953 + - (-0.666667e0_rt)); - rate = r0 + r1 ; - dratedt = dr0dt + dr1dt; } +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_f17_to_p_o16 (const tf_t& tfactors, amrex::Real& rate, amrex::Real& dratedt) +void rate_f17_to_p_o16 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dratedt = 0.0_rt; - amrex::Real ct9i = tfactors.t9i * (-6.96583e0_rt); - amrex::Real ct9i13 = tfactors.t9i13 * (-16.696e0_rt); - amrex::Real ct913 = tfactors.t913 * (-1.16252e0_rt); - amrex::Real ct9 = tfactors.t9 * (0.267703e0_rt); - amrex::Real ct953 = tfactors.t953 * (-0.0338411e0_rt); - amrex::Real clnt9 = tfactors.lnt9 * (0.833333e0_rt); + number_t ct9i = tfactors.t9i * (-6.96583e0_rt); + number_t ct9i13 = tfactors.t9i13 * (-16.696e0_rt); + number_t ct913 = tfactors.t913 * (-1.16252e0_rt); + number_t ct9 = tfactors.t9 * (0.267703e0_rt); + number_t ct953 = tfactors.t953 * (-0.0338411e0_rt); + number_t clnt9 = tfactors.lnt9 * (0.833333e0_rt); - amrex::Real r0 = std::exp(40.9135e0_rt + + number_t r0 = admath::exp(40.9135e0_rt + ct9i + ct9i13 + ct913 + @@ -74,40 +62,32 @@ void rate_f17_to_p_o16 (const tf_t& tfactors, amrex::Real& rate, amrex::Real& dr ct953 + clnt9); - amrex::Real dr0dt = r0 * tfactors.t9i * (-ct9i - - (1.0_rt / 3.0_rt) * ct9i13 + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (5.0_rt / 3.0_rt) * ct953 + - (0.833333e0_rt)); - rate = r0; - dratedt = dr0dt; } +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_f17_to_o17 ([[maybe_unused]] const tf_t& tfactors, amrex::Real& rate, amrex::Real& dratedt) +void rate_f17_to_o17 ([[maybe_unused]] const tf_t& tfactors, number_t& rate) { rate = std::exp(-4.53302e0_rt); - dratedt = 0.0_rt; } +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_p_f17_to_ne18 (const tf_t& tfactors, amrex::Real& rate, amrex::Real& dratedt) +void rate_p_f17_to_ne18 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dratedt = 0.0_rt; - amrex::Real ct9i = tfactors.t9i * (-0.0323504e0_rt); - amrex::Real ct9i13 = tfactors.t9i13 * (-14.2191e0_rt); - amrex::Real ct913 = tfactors.t913 * (34.0647e0_rt); - amrex::Real ct9 = tfactors.t9 * (-16.5698e0_rt); - amrex::Real ct953 = tfactors.t953 * (2.48116e0_rt); - amrex::Real clnt9 = tfactors.lnt9 * (-2.13376e0_rt); + number_t ct9i = tfactors.t9i * (-0.0323504e0_rt); + number_t ct9i13 = tfactors.t9i13 * (-14.2191e0_rt); + number_t ct913 = tfactors.t913 * (34.0647e0_rt); + number_t ct9 = tfactors.t9 * (-16.5698e0_rt); + number_t ct953 = tfactors.t953 * (2.48116e0_rt); + number_t clnt9 = tfactors.lnt9 * (-2.13376e0_rt); - amrex::Real r0 = std::exp(-7.84708e0_rt + + number_t r0 = admath::exp(-7.84708e0_rt + ct9i + ct9i13 + ct913 + @@ -115,13 +95,6 @@ void rate_p_f17_to_ne18 (const tf_t& tfactors, amrex::Real& rate, amrex::Real& d ct953 + clnt9); - amrex::Real dr0dt = r0 * tfactors.t9i * (-ct9i - - (1.0_rt / 3.0_rt) * ct9i13 + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (5.0_rt / 3.0_rt) * ct953 + - (-2.13376e0_rt)); - ct9i = tfactors.t9i * (-4.95969e0_rt); ct9i13 = tfactors.t9i13 * (-21.3249e0_rt); ct913 = tfactors.t913 * (-0.230774e0_rt); @@ -129,39 +102,32 @@ void rate_p_f17_to_ne18 (const tf_t& tfactors, amrex::Real& rate, amrex::Real& d ct953 = tfactors.t953 * (-0.0440377e0_rt); clnt9 = tfactors.lnt9 * (-7.36014e0_rt); - amrex::Real r1 = std::exp(27.5778e0_rt + + number_t r1 = admath::exp(27.5778e0_rt + ct9i + ct9i13 + ct913 + ct9 + ct953 + clnt9); - amrex::Real dr1dt = r1 * tfactors.t9i * (-ct9i - - (1.0_rt / 3.0_rt) * ct9i13 + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (5.0_rt / 3.0_rt) * ct953 + - (-7.36014e0_rt)); rate = r0 + r1; - dratedt = dr0dt + dr1dt; } +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_he4_he4_he4_to_c12 (const tf_t& tfactors, amrex::Real& rate, amrex::Real& dratedt) +void rate_he4_he4_he4_to_c12 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dratedt = 0.0_rt; - amrex::Real ct9i = tfactors.t9i * (-1.02446e0_rt); - amrex::Real ct9i13 = tfactors.t9i13 * (-23.57e0_rt); - amrex::Real ct913 = tfactors.t913 * (20.4886e0_rt); - amrex::Real ct9 = tfactors.t9 * (-12.9882e0_rt); - amrex::Real ct953 = tfactors.t953 * (-20.0e0_rt); - amrex::Real clnt9 = tfactors.lnt9 * (-2.16667e0_rt); + number_t ct9i = tfactors.t9i * (-1.02446e0_rt); + number_t ct9i13 = tfactors.t9i13 * (-23.57e0_rt); + number_t ct913 = tfactors.t913 * (20.4886e0_rt); + number_t ct9 = tfactors.t9 * (-12.9882e0_rt); + number_t ct953 = tfactors.t953 * (-20.0e0_rt); + number_t clnt9 = tfactors.lnt9 * (-2.16667e0_rt); - amrex::Real r0 = std::exp(-11.7884e0_rt + + number_t r0 = admath::exp(-11.7884e0_rt + ct9i + ct9i13 + ct913 + @@ -169,32 +135,19 @@ void rate_he4_he4_he4_to_c12 (const tf_t& tfactors, amrex::Real& rate, amrex::Re ct953 + clnt9); - amrex::Real dr0dt = r0 * tfactors.t9i * (-ct9i - - (1.0_rt / 3.0_rt) * ct9i13 + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (5.0_rt / 3.0_rt) * ct953 + - (-2.16667e0_rt)); - ct9i13 = tfactors.t9i13 * (-37.06e0_rt); ct913 = tfactors.t913 * (29.3493e0_rt); ct9 = tfactors.t9 * (-115.507e0_rt); ct953 = tfactors.t953 * (-10.0e0_rt); clnt9 = tfactors.lnt9 * (-1.33333e0_rt); - amrex::Real r1 = std::exp(-0.971052e0_rt + + number_t r1 = admath::exp(-0.971052e0_rt + ct9i13 + ct913 + ct9 + ct953 + clnt9); - amrex::Real dr1dt = r1 * tfactors.t9i * (-(1.0_rt / 3.0_rt) * ct9i13 + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (5.0_rt / 3.0_rt) * ct953 + - (-1.33333e0_rt)); - ct9i = tfactors.t9i * (-4.12656e0_rt); ct9i13 = tfactors.t9i13 * (-13.49e0_rt); ct913 = tfactors.t913 * (21.4259e0_rt); @@ -202,7 +155,7 @@ void rate_he4_he4_he4_to_c12 (const tf_t& tfactors, amrex::Real& rate, amrex::Re ct953 = tfactors.t953 * (0.0879816e0_rt); clnt9 = tfactors.lnt9 * (-13.1653e0_rt); - amrex::Real r2 = std::exp(-24.3505e0_rt + + number_t r2 = admath::exp(-24.3505e0_rt + ct9i + ct9i13 + ct913 + @@ -210,151 +163,109 @@ void rate_he4_he4_he4_to_c12 (const tf_t& tfactors, amrex::Real& rate, amrex::Re ct953 + clnt9); - amrex::Real dr2dt = r2 * tfactors.t9i * (-ct9i - - (1.0_rt / 3.0_rt) * ct9i13 + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (5.0_rt / 3.0_rt) * ct953 + - (-13.1653e0_rt)); - rate = r0 + r1 + r2; - dratedt = dr0dt + dr1dt + dr2dt; } +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_p_n14_to_o15 (const tf_t& tfactors, amrex::Real& rate, amrex::Real& dratedt) +void rate_p_n14_to_o15 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dratedt = 0.0_rt; - amrex::Real ct9i13 = tfactors.t9i13 * (-15.193e0_rt); - amrex::Real ct913 = tfactors.t913 * (-4.63975e0_rt); - amrex::Real ct9 = tfactors.t9 * (9.73458e0_rt); - amrex::Real ct953 = tfactors.t953 * (-9.55051e0_rt); - amrex::Real clnt9 = tfactors.lnt9 * (0.333333e0_rt); + number_t ct9i13 = tfactors.t9i13 * (-15.193e0_rt); + number_t ct913 = tfactors.t913 * (-4.63975e0_rt); + number_t ct9 = tfactors.t9 * (9.73458e0_rt); + number_t ct953 = tfactors.t953 * (-9.55051e0_rt); + number_t clnt9 = tfactors.lnt9 * (0.333333e0_rt); - amrex::Real r0 = std::exp(20.1169e0_rt + + number_t r0 = admath::exp(20.1169e0_rt + ct9i13 + ct913 + ct9 + ct953 + clnt9); - amrex::Real dr0dt = r0 * tfactors.t9i * (-(1.0_rt / 3.0_rt) * ct9i13 + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (5.0_rt / 3.0_rt) * ct953 + - (0.333333e0_rt)); - ct9i13 = tfactors.t9i13 * (-15.193e0_rt); ct913 = tfactors.t913 * (-0.161954e0_rt); ct9 = tfactors.t9 * (-7.52123e0_rt); ct953 = tfactors.t953 * (-0.987565e0_rt); clnt9 = tfactors.lnt9 * (-0.666667e0_rt); - amrex::Real r1 = std::exp(17.01e0_rt + + number_t r1 = admath::exp(17.01e0_rt + ct9i13 + ct913 + ct9 + ct953 + clnt9); - amrex::Real dr1dt = r1 * tfactors.t9i * (-(1.0_rt / 3.0_rt) * ct9i13 + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (5.0_rt / 3.0_rt) * ct953 + - (-0.666667e0_rt)); - - amrex::Real ct9i = tfactors.t9i * (-4.891e0_rt); + number_t ct9i = tfactors.t9i * (-4.891e0_rt); clnt9 = tfactors.lnt9 * (0.0682e0_rt); - amrex::Real r2 = std::exp(6.73578e0_rt + + number_t r2 = admath::exp(6.73578e0_rt + ct9i + clnt9); - amrex::Real dr2dt = r2 * tfactors.t9i * (-ct9i + - (0.0682e0_rt)); - ct9i = tfactors.t9i * (-2.998e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r3 = std::exp(7.65444e0_rt + + number_t r3 = admath::exp(7.65444e0_rt + ct9i + clnt9); - amrex::Real dr3dt = r3 * tfactors.t9i * (-ct9i + - (-1.5e0_rt)); - rate = r0 + r1 + r2 + r3; - dratedt = dr0dt + dr1dt + dr2dt + dr3dt; } +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_he4_ne18_to_p_na21 (const tf_t& tfactors, amrex::Real& rate, amrex::Real& dratedt) +void rate_he4_ne18_to_p_na21 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dratedt = 0.0_rt; - amrex::Real ct9i = tfactors.t9i * (-24.7176e0_rt); - amrex::Real clnt9 = tfactors.lnt9 * (-1.5e0_rt); + number_t ct9i = tfactors.t9i * (-24.7176e0_rt); + number_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r0 = std::exp(19.4058e0_rt + + number_t r0 = admath::exp(19.4058e0_rt + ct9i + clnt9); - amrex::Real dr0dt = r0 * tfactors.t9i * (-ct9i + - (-1.5e0_rt)); - ct9i = tfactors.t9i * (-0.452576e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r1 = std::exp(-137.358e0_rt + + number_t r1 = admath::exp(-137.358e0_rt + ct9i + clnt9); - amrex::Real dr1dt = r1 * tfactors.t9i * (-ct9i + - (-1.5e0_rt)); - ct9i = tfactors.t9i * (-10.885e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r2 = std::exp(6.39797e0_rt + + number_t r2 = admath::exp(6.39797e0_rt + ct9i + clnt9); - amrex::Real dr2dt = r2 * tfactors.t9i * (-ct9i + - (-1.5e0_rt)); - ct9i = tfactors.t9i * (-7.45009e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r3 = std::exp(-1.15641e0_rt + + number_t r3 = admath::exp(-1.15641e0_rt + ct9i + +clnt9); - amrex::Real dr3dt = r3 * tfactors.t9i * (-ct9i + - (-1.5e0_rt)); - ct9i = tfactors.t9i * (-5.97632e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r4 = std::exp(-6.65137e0_rt + + number_t r4 = admath::exp(-6.65137e0_rt + ct9i + clnt9); - amrex::Real dr4dt = r4 * tfactors.t9i * (-ct9i + - (-1.5e0_rt)); - ct9i = tfactors.t9i * (-3.14078e0_rt); - amrex::Real ct9i13 = tfactors.t9i13 * (-17.7759e0_rt); - amrex::Real ct913 = tfactors.t913 * (36.0724e0_rt); - amrex::Real ct9 = tfactors.t9 * (-5.34039e0_rt); - amrex::Real ct953 = tfactors.t953 * (0.382679e0_rt); + number_t ct9i13 = tfactors.t9i13 * (-17.7759e0_rt); + number_t ct913 = tfactors.t913 * (36.0724e0_rt); + number_t ct9 = tfactors.t9 * (-5.34039e0_rt); + number_t ct953 = tfactors.t953 * (0.382679e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r5 = std::exp(-13.3392e0_rt + + number_t r5 = admath::exp(-13.3392e0_rt + ct9i + ct9i13 + ct913 + @@ -362,218 +273,165 @@ void rate_he4_ne18_to_p_na21 (const tf_t& tfactors, amrex::Real& rate, amrex::Re ct953 + clnt9); - amrex::Real dr5dt = r5 * tfactors.t9i * (-ct9i - - (1.0_rt / 3.0_rt) * ct9i13 + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (5.0_rt / 3.0_rt) * ct953 + - (-1.5e0_rt)); - ct9i = tfactors.t9i * (-2.81989e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r6 = std::exp(-28.6929e0_rt + + number_t r6 = admath::exp(-28.6929e0_rt + ct9i + clnt9); - amrex::Real dr6dt = r6 * tfactors.t9i * (-ct9i + - (-1.5e0_rt)); - rate = r0 + r1 + r2 + r3 + r4 + r5 + r6; - dratedt = dr0dt + dr1dt + dr2dt + dr3dt + dr4dt + dr5dt + dr6dt; } +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_ne18_to_f18 ([[maybe_unused]] const tf_t& tfactors, amrex::Real& rate, amrex::Real& dratedt) +void rate_ne18_to_f18 ([[maybe_unused]] const tf_t& tfactors, number_t& rate) { rate = std::exp(-0.880534e0_rt); - dratedt = 0.0_rt; } +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_ne19_to_f19 ([[maybe_unused]] const tf_t& tfactors, amrex::Real& rate, amrex::Real& dratedt) +void rate_ne19_to_f19 ([[maybe_unused]] const tf_t& tfactors, number_t& rate) { rate = std::exp(-3.21258e0_rt); - dratedt = 0.0_rt; } +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_p_ne19_to_na20 (const tf_t& tfactors, amrex::Real& rate, amrex::Real& dratedt) +void rate_p_ne19_to_na20 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dratedt = 0.0_rt; - amrex::Real ct9i = tfactors.t9i * (-5.07623e0_rt); - amrex::Real ct913 = tfactors.t913 * (1.23704e0_rt); - amrex::Real ct9 = tfactors.t9 * (0.337618e0_rt); - amrex::Real ct953 = tfactors.t953 * (-0.0562825e0_rt); - amrex::Real clnt9 = tfactors.lnt9 * (-1.5e0_rt); + number_t ct9i = tfactors.t9i * (-5.07623e0_rt); + number_t ct913 = tfactors.t913 * (1.23704e0_rt); + number_t ct9 = tfactors.t9 * (0.337618e0_rt); + number_t ct953 = tfactors.t953 * (-0.0562825e0_rt); + number_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r0 = std::exp(5.63289e0_rt + + number_t r0 = admath::exp(5.63289e0_rt + ct9i + ct913 + ct9 + ct953 + clnt9); - amrex::Real dr0dt = r0 * tfactors.t9i * (-ct9i + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (5.0_rt / 3.0_rt) * ct953 + - (-1.5e0_rt)); - - amrex::Real ct9i13 = tfactors.t9i13 * (-19.5908e0_rt); + number_t ct9i13 = tfactors.t9i13 * (-19.5908e0_rt); ct913 = tfactors.t913 * (-2.37696e0_rt); ct9 = tfactors.t9 * (3.26815e0_rt); ct953 = tfactors.t953 * (-1.06524e0_rt); clnt9 = tfactors.lnt9 * (-0.666667e0_rt); - amrex::Real r1 = std::exp(17.822e0_rt + + number_t r1 = admath::exp(17.822e0_rt + ct9i13 + ct913 + ct9 + ct953 + clnt9); - amrex::Real dr1dt = r1 * tfactors.t9i * (-(1.0_rt / 3.0_rt) * ct9i13 + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (5.0_rt / 3.0_rt) * ct953 + - (-0.666667e0_rt)); - rate = r0 + r1; - dratedt = dr0dt + dr1dt; } +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_he4_o14_to_p_f17 (const tf_t& tfactors, amrex::Real& rate, amrex::Real& dratedt) +void rate_he4_o14_to_p_f17 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dratedt = 0.0_rt; - amrex::Real ct9i = tfactors.t9i * (-12.0223e0_rt); - amrex::Real clnt9 = tfactors.lnt9 * (-1.5e0_rt); + number_t ct9i = tfactors.t9i * (-12.0223e0_rt); + number_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r0 = std::exp(12.1289e0_rt + + number_t r0 = admath::exp(12.1289e0_rt + ct9i + clnt9); - amrex::Real dr0dt = r0 * tfactors.t9i * (-ct9i + - (-1.5e0_rt)); - ct9i = tfactors.t9i * (-26.0e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r1 = std::exp(18.6518e0_rt + + number_t r1 = admath::exp(18.6518e0_rt + ct9i + clnt9); - amrex::Real dr1dt = r1 * tfactors.t9i * (-ct9i + - (-1.5e0_rt)); - - amrex::Real ct9i13 = tfactors.t9i13 * (-39.388e0_rt); - amrex::Real ct913 = tfactors.t913 * (-17.4673e0_rt); - amrex::Real ct9 = tfactors.t9 * (35.3029e0_rt); - amrex::Real ct953 = tfactors.t953 * (-24.8162e0_rt); + number_t ct9i13 = tfactors.t9i13 * (-39.388e0_rt); + number_t ct913 = tfactors.t913 * (-17.4673e0_rt); + number_t ct9 = tfactors.t9 * (35.3029e0_rt); + number_t ct953 = tfactors.t953 * (-24.8162e0_rt); clnt9 = tfactors.lnt9 * (-0.666667e0_rt); - amrex::Real r2 = std::exp(40.8358e0_rt + + number_t r2 = admath::exp(40.8358e0_rt + ct9i13 + ct913 + ct9 + ct953 + clnt9); - amrex::Real dr2dt = r2 * tfactors.t9i * (-(1.0_rt / 3.0_rt) * ct9i13 + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (5.0_rt / 3.0_rt) * ct953 + - (-0.666667e0_rt)); - ct9i = tfactors.t9i * (-22.51e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r3 = std::exp(16.3087e0_rt + + number_t r3 = admath::exp(16.3087e0_rt + ct9i + clnt9); - amrex::Real dr3dt = r3 * tfactors.t9i * (-ct9i + - (-1.5e0_rt)); - ct9i = tfactors.t9i * (-13.6e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r4 = std::exp(11.1184e0_rt + + number_t r4 = admath::exp(11.1184e0_rt + ct9i + clnt9); - amrex::Real dr4dt = r4 * tfactors.t9i * (-ct9i + - (-1.5e0_rt)); - ct9i = tfactors.t9i * (-0.453036e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r5 = std::exp(-106.091e0_rt + + number_t r5 = admath::exp(-106.091e0_rt + ct9i + clnt9); - amrex::Real dr5dt = r5 * tfactors.t9i * (-ct9i + - (-1.5e0_rt)); - rate = r0 + r1 + r2 + r3 + r4 + r5; - dratedt = dr0dt + dr1dt + dr2dt + dr3dt + dr4dt + dr5dt; } +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_o14_to_n14 ([[maybe_unused]] const tf_t& tfactors, amrex::Real& rate, amrex::Real& dratedt) +void rate_o14_to_n14 ([[maybe_unused]] const tf_t& tfactors, number_t& rate) { rate = std::exp(-4.62412e0_rt); - dratedt = 0.0_rt; } +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_he4_o15_to_ne19 (const tf_t& tfactors, amrex::Real& rate, amrex::Real& dratedt) +void rate_he4_o15_to_ne19 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dratedt = 0.0_rt; - amrex::Real ct9i = tfactors.t9i * (-5.88439e0_rt); - amrex::Real clnt9 = tfactors.lnt9 * (-1.5e0_rt); + number_t ct9i = tfactors.t9i * (-5.88439e0_rt); + number_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r0 = std::exp(-0.0452465e0_rt + + number_t r0 = admath::exp(-0.0452465e0_rt + ct9i + clnt9); - amrex::Real dr0dt = r0 * tfactors.t9i * (-ct9i + - (-1.5e0_rt)); - - amrex::Real ct9i13 = tfactors.t9i13 * (-39.578e0_rt); - amrex::Real ct953 = tfactors.t953 * (-3.0e0_rt); + number_t ct9i13 = tfactors.t9i13 * (-39.578e0_rt); + number_t ct953 = tfactors.t953 * (-3.0e0_rt); clnt9 = tfactors.lnt9 * (-0.666667e0_rt); - amrex::Real r1 = std::exp(26.2914e0_rt + + number_t r1 = admath::exp(26.2914e0_rt + ct9i13 + ct953 + clnt9); - amrex::Real dr1dt = r1 * tfactors.t9i * (-(1.0_rt / 3.0_rt) * ct9i13 + - (5.0_rt / 3.0_rt) * ct953 + - (-0.666667e0_rt)); - ct9i = tfactors.t9i * (-4.20439e0_rt); ct9i13 = tfactors.t9i13 * (-3.24609e0_rt); - amrex::Real ct913 = tfactors.t913 * (44.4647e0_rt); - amrex::Real ct9 = tfactors.t9 * (-9.79962e0_rt); + number_t ct913 = tfactors.t913 * (44.4647e0_rt); + number_t ct9 = tfactors.t9 * (-9.79962e0_rt); ct953 = tfactors.t953 * (0.841782e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r2 = std::exp(-32.2496e0_rt + + number_t r2 = admath::exp(-32.2496e0_rt + ct9i + ct9i13 + ct913 + @@ -581,159 +439,121 @@ void rate_he4_o15_to_ne19 (const tf_t& tfactors, amrex::Real& rate, amrex::Real& ct953 + clnt9); - amrex::Real dr2dt = r2 * tfactors.t9i * (-ct9i - - (1.0_rt / 3.0_rt) * ct9i13 + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (5.0_rt / 3.0_rt) * ct953 + - (-1.5e0_rt)); - rate = r0 + r1 + r2; - dratedt = dr0dt + dr1dt + dr2dt; } +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_o15_to_n15 ([[maybe_unused]] const tf_t& tfactors, amrex::Real& rate, amrex::Real& dratedt) +void rate_o15_to_n15 ([[maybe_unused]] const tf_t& tfactors, number_t& rate) { rate = std::exp(-5.1725e0_rt); - dratedt = 0.0_rt; } +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_he4_o16_to_ne20 (const tf_t& tfactors, amrex::Real& rate, amrex::Real& dratedt) +void rate_he4_o16_to_ne20 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dratedt = 0.0_rt; - amrex::Real ct9i = tfactors.t9i * (-10.3585e0_rt); - amrex::Real clnt9 = tfactors.lnt9 * (-1.5e0_rt); + number_t ct9i = tfactors.t9i * (-10.3585e0_rt); + number_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r0 = std::exp(3.88571e0_rt + + number_t r0 = admath::exp(3.88571e0_rt + ct9i + clnt9); - amrex::Real dr0dt = r0 * tfactors.t9i * (-ct9i + - (-1.5e0_rt)); - - amrex::Real ct9i13 = tfactors.t9i13 * (-39.7262e0_rt); - amrex::Real ct913 = tfactors.t913 * (-0.210799e0_rt); - amrex::Real ct9 = tfactors.t9 * (0.442879e0_rt); - amrex::Real ct953 = tfactors.t953 * (-0.0797753e0_rt); + number_t ct9i13 = tfactors.t9i13 * (-39.7262e0_rt); + number_t ct913 = tfactors.t913 * (-0.210799e0_rt); + number_t ct9 = tfactors.t9 * (0.442879e0_rt); + number_t ct953 = tfactors.t953 * (-0.0797753e0_rt); clnt9 = tfactors.lnt9 * (-0.666667e0_rt); - amrex::Real r1 = std::exp(23.903e0_rt + + number_t r1 = admath::exp(23.903e0_rt + ct9i13 + ct913 + ct9 + ct953 + clnt9); - amrex::Real dr1dt = r1 * tfactors.t9i * (-(1.0_rt / 3.0_rt) * ct9i13 + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (5.0_rt / 3.0_rt) * ct953 + - (-0.666667e0_rt)); - ct9i = tfactors.t9i * (-12.7643e0_rt); ct913 = tfactors.t913 * (-3.65925e0_rt); ct9 = tfactors.t9 * (0.714224e0_rt); ct953 = tfactors.t953 * (-0.00107508e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r2 = std::exp(9.50848e0_rt + + number_t r2 = admath::exp(9.50848e0_rt + ct9i + ct913 + ct9 + ct953 + clnt9); - amrex::Real dr2dt = r2 * tfactors.t9i * (-ct9i + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (5.0_rt / 3.0_rt) * ct953 + - (-1.5e0_rt)); - rate = r0 + r1 + r2; - dratedt = dr0dt + dr1dt + dr2dt; } +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_p_o16_to_f17 (const tf_t& tfactors, amrex::Real& rate, amrex::Real& dratedt) +void rate_p_o16_to_f17 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dratedt = 0.0_rt; - amrex::Real ct9i13 = tfactors.t9i13 * (-16.696e0_rt); - amrex::Real ct913 = tfactors.t913 * (-1.16252e0_rt); - amrex::Real ct9 = tfactors.t9 * (0.267703e0_rt); - amrex::Real ct953 = tfactors.t953 * (-0.0338411e0_rt); - amrex::Real clnt9 = tfactors.lnt9 * (-0.666667e0_rt); + number_t ct9i13 = tfactors.t9i13 * (-16.696e0_rt); + number_t ct913 = tfactors.t913 * (-1.16252e0_rt); + number_t ct9 = tfactors.t9 * (0.267703e0_rt); + number_t ct953 = tfactors.t953 * (-0.0338411e0_rt); + number_t clnt9 = tfactors.lnt9 * (-0.666667e0_rt); - amrex::Real r0 = std::exp(19.0904e0_rt + + number_t r0 = admath::exp(19.0904e0_rt + ct9i13 + ct913 + ct9 + ct953 + clnt9); - amrex::Real dr0dt = r0 * tfactors.t9i * (-(1.0_rt / 3.0_rt) * ct9i13 + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (5.0_rt / 3.0_rt) * ct953 + - (-0.666667e0_rt)); - rate = r0; - dratedt = dr0dt; } +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_he4_si26_to_p_p29 (const tf_t& tfactors, amrex::Real& rate, amrex::Real& dratedt) +void rate_he4_si26_to_p_p29 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dratedt = 0.0_rt; - amrex::Real ct9i13 = tfactors.t9i13 * (-59.3013e0_rt); - amrex::Real ct913 = tfactors.t913 * (0.480742e0_rt); - amrex::Real ct9 = tfactors.t9 * (-0.834505e0_rt); - amrex::Real ct953 = tfactors.t953 * (0.0621841e0_rt); - amrex::Real clnt9 = tfactors.lnt9 * (-0.666667e0_rt); + number_t ct9i13 = tfactors.t9i13 * (-59.3013e0_rt); + number_t ct913 = tfactors.t913 * (0.480742e0_rt); + number_t ct9 = tfactors.t9 * (-0.834505e0_rt); + number_t ct953 = tfactors.t953 * (0.0621841e0_rt); + number_t clnt9 = tfactors.lnt9 * (-0.666667e0_rt); - amrex::Real r0 = std::exp(48.8732e0_rt + + number_t r0 = admath::exp(48.8732e0_rt + ct9i13 + ct913 + ct9 + ct953 + clnt9); - amrex::Real dr0dt = r0 * tfactors.t9i * (-(1.0_rt / 3.0_rt) * ct9i13 + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (5.0_rt / 3.0_rt) * ct953 + - (-0.666667e0_rt)); - rate = r0; - dratedt = dr0dt; } +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_he4_ti44_to_p_v47 (const tf_t& tfactors, amrex::Real& rate, amrex::Real& dratedt) +void rate_he4_ti44_to_p_v47 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dratedt = 0.0_rt; - amrex::Real ct9i = tfactors.t9i * (-9.07869e0_rt); - amrex::Real ct9i13 = tfactors.t9i13 * (5.56533e0_rt); - amrex::Real ct913 = tfactors.t913 * (18.4415e0_rt); - amrex::Real ct9 = tfactors.t9 * (-4.10095e0_rt); - amrex::Real ct953 = tfactors.t953 * (0.24244e0_rt); - amrex::Real clnt9 = tfactors.lnt9 * (16.0516e0_rt); + number_t ct9i = tfactors.t9i * (-9.07869e0_rt); + number_t ct9i13 = tfactors.t9i13 * (5.56533e0_rt); + number_t ct913 = tfactors.t913 * (18.4415e0_rt); + number_t ct9 = tfactors.t9 * (-4.10095e0_rt); + number_t ct953 = tfactors.t953 * (0.24244e0_rt); + number_t clnt9 = tfactors.lnt9 * (16.0516e0_rt); - amrex::Real r0 = std::exp(-34.2468e0_rt + + number_t r0 = admath::exp(-34.2468e0_rt + ct9i + ct9i13 + ct913 + @@ -741,15 +561,7 @@ void rate_he4_ti44_to_p_v47 (const tf_t& tfactors, amrex::Real& rate, amrex::Rea ct953 + clnt9); - amrex::Real dr0dt = r0 * tfactors.t9i * (-ct9i - - (1.0_rt / 3.0_rt) * ct9i13 + - (1.0_rt / 3.0_rt) * ct913 + - ct9 + - (5.0_rt / 3.0_rt) * ct953 + - (16.0516e0_rt)); - rate = r0; - dratedt = dr0dt; } #endif diff --git a/networks/triple_alpha_plus_cago/actual_network.H b/networks/triple_alpha_plus_cago/actual_network.H index 8ec5d88d85..4ee1d0c075 100644 --- a/networks/triple_alpha_plus_cago/actual_network.H +++ b/networks/triple_alpha_plus_cago/actual_network.H @@ -151,23 +151,24 @@ namespace RHS { template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) + void evaluate_analytical_rate (const rhs_state_t& state, rate_t& rates) { using namespace Species; using namespace Rates; if constexpr (rate == He4_He4_He4_to_C12) { - rate_triplealf(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_triplealf(state.tf, 1.0_rt, rates.fr, rates.rr); } else if constexpr (rate == C12_He4_to_O16) { - rate_c12ag(state.tf, 1.0_rt, rates.fr, rates.frdt, rates.rr, rates.rrdt); + rate_c12ag(state.tf, 1.0_rt, rates.fr, rates.rr); } } template AMREX_GPU_HOST_DEVICE AMREX_INLINE - void postprocess_rate ([[maybe_unused]] const rhs_state_t& state, rate_t& rates, - rate_t& rates1, rate_t& rates2, rate_t& rates3) + void postprocess_rate ([[maybe_unused]] const rhs_state_t& state, [[maybe_unused]] rate_t& rates, + [[maybe_unused]] rate_t& rates1, [[maybe_unused]] rate_t& rates2, + [[maybe_unused]] rate_t& rates3) { using namespace Species; using namespace Rates; diff --git a/rates/aprox_rates.H b/rates/aprox_rates.H index 8f2db09354..1193a56017 100644 --- a/rates/aprox_rates.H +++ b/rates/aprox_rates.H @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -65,10 +66,9 @@ void rates_init() } } -AMREX_GPU_HOST_DEVICE inline -void rate_c12ag(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_c12ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { if (use_c12ag_deboer17) { // This version computes the nuclear reaction rate for 12C(a,g)16O and its inverse @@ -76,1916 +76,1237 @@ void rate_c12ag(const tf_t& tf, const amrex::Real den, amrex::Real& fr, // from Table XXVI of deboer + 2017 // non-resonant contributions to the reaction - const amrex::Real a0_nr = 24.1e0_rt; - const amrex::Real a1_nr = 0e0_rt; - const amrex::Real a2_nr = -32e0_rt; - const amrex::Real a3_nr = -5.9e0_rt; - const amrex::Real a4_nr = 1.8e0_rt; - const amrex::Real a5_nr = -0.17e0_rt; - const amrex::Real a6_nr = -2.0_rt/3.0_rt; + constexpr amrex::Real a0_nr = 24.1e0_rt; + constexpr amrex::Real a1_nr = 0e0_rt; + constexpr amrex::Real a2_nr = -32e0_rt; + constexpr amrex::Real a3_nr = -5.9e0_rt; + constexpr amrex::Real a4_nr = 1.8e0_rt; + constexpr amrex::Real a5_nr = -0.17e0_rt; + constexpr amrex::Real a6_nr = -2.0_rt/3.0_rt; const amrex::Real term_a0_nr = std::exp(a0_nr); - const amrex::Real term_a1_nr = std::exp(a1_nr*tf.t9i); - const amrex::Real term_a2_nr = std::exp(a2_nr*tf.t9i13); - const amrex::Real term_a3_nr = std::exp(a3_nr*tf.t913); - const amrex::Real term_a4_nr = std::exp(a4_nr*tf.t9); - const amrex::Real term_a5_nr = std::exp(a5_nr*tf.t953); - const amrex::Real term_a6_nr = std::pow(tf.t9,a6_nr); - - const amrex::Real term_nr = term_a0_nr * term_a1_nr * term_a2_nr * - term_a3_nr * term_a4_nr * term_a5_nr * - term_a6_nr; - - const amrex::Real dterm_a2_nr = -a2_nr*tf.t9i43*term_a2_nr/3e0_rt; - const amrex::Real dterm_a3_nr = a3_nr*tf.t9i23*term_a3_nr/3e0_rt; - const amrex::Real dterm_a4_nr = a4_nr*term_a4_nr; - const amrex::Real dterm_a5_nr = a5_nr*tf.t923*term_a5_nr*5.0_rt/3.0_rt; - const amrex::Real dterm_a6_nr = tf.t9i*a6_nr*std::pow(tf.t9,a6_nr); - - const amrex::Real dterm_nr = (term_a0_nr * term_a1_nr * dterm_a2_nr * term_a3_nr * term_a4_nr * term_a5_nr * term_a6_nr) + - (term_a0_nr * term_a1_nr * term_a2_nr * dterm_a3_nr * term_a4_nr * term_a5_nr * term_a6_nr) + - (term_a0_nr * term_a1_nr * term_a2_nr * term_a3_nr * dterm_a4_nr * term_a5_nr * term_a6_nr) + - (term_a0_nr * term_a1_nr * term_a2_nr * term_a3_nr * term_a4_nr * dterm_a5_nr * term_a6_nr) + - (term_a0_nr * term_a1_nr * term_a2_nr * term_a3_nr * term_a4_nr * term_a5_nr * dterm_a6_nr); + const number_t term_a1_nr = admath::exp(a1_nr*tf.t9i); + const number_t term_a2_nr = admath::exp(a2_nr*tf.t9i13); + const number_t term_a3_nr = admath::exp(a3_nr*tf.t913); + const number_t term_a4_nr = admath::exp(a4_nr*tf.t9); + const number_t term_a5_nr = admath::exp(a5_nr*tf.t953); + const number_t term_a6_nr = admath::pow(tf.t9,a6_nr); + + const number_t term_nr = term_a0_nr * term_a1_nr * term_a2_nr * + term_a3_nr * term_a4_nr * term_a5_nr * + term_a6_nr; // resonant contributions to the reaction - const amrex::Real a0_r = 7.4e0_rt; - const amrex::Real a1_r = -30e0_rt; - const amrex::Real a2_r = 0e0_rt; - const amrex::Real a3_r = 0e0_rt; - const amrex::Real a4_r = 0e0_rt; - const amrex::Real a5_r = 0e0_rt; - const amrex::Real a6_r = -3.0e0_rt/2.0e0_rt; + constexpr amrex::Real a0_r = 7.4e0_rt; + constexpr amrex::Real a1_r = -30e0_rt; + constexpr amrex::Real a2_r = 0e0_rt; + constexpr amrex::Real a3_r = 0e0_rt; + constexpr amrex::Real a4_r = 0e0_rt; + constexpr amrex::Real a5_r = 0e0_rt; + constexpr amrex::Real a6_r = -3.0e0_rt/2.0e0_rt; const amrex::Real term_a0_r = std::exp(a0_r); - const amrex::Real term_a1_r = std::exp(a1_r*tf.t9i); - const amrex::Real term_a2_r = std::exp(a2_r*tf.t9i13); - const amrex::Real term_a3_r = std::exp(a3_r*tf.t913); - const amrex::Real term_a4_r = std::exp(a4_r*tf.t9); - const amrex::Real term_a5_r = std::exp(a5_r*tf.t953); - const amrex::Real term_a6_r = std::pow(tf.t9,a6_r); - - const amrex::Real term_r = term_a0_r * term_a1_r * term_a2_r * - term_a3_r * term_a4_r * term_a5_r * - term_a6_r; + const number_t term_a1_r = admath::exp(a1_r*tf.t9i); + const number_t term_a2_r = admath::exp(a2_r*tf.t9i13); + const number_t term_a3_r = admath::exp(a3_r*tf.t913); + const number_t term_a4_r = admath::exp(a4_r*tf.t9); + const number_t term_a5_r = admath::exp(a5_r*tf.t953); + const number_t term_a6_r = admath::pow(tf.t9,a6_r); - const amrex::Real dterm_a1_r = -a1_r*tf.t9i2*term_a1_r; - const amrex::Real dterm_a6_r = tf.t9i*a6_r*std::pow(tf.t9,a6_r); - - const amrex::Real dterm_r = (term_a0_r * dterm_a1_r * term_a6_r) + - (term_a0_r * term_a1_r * dterm_a6_r); + const number_t term_r = term_a0_r * term_a1_r * term_a2_r * + term_a3_r * term_a4_r * term_a5_r * + term_a6_r; // full rate is the sum of resonant and non-resonant contributions - const amrex::Real term = term_nr + term_r; - const amrex::Real dtermdt = dterm_nr + dterm_r; + const number_t term = term_nr + term_r; fr = term * den; - dfrdt = dtermdt * den * 1.0e-9_rt; // first term is 9.8685e9_rt * T9**(2/3) * (M0*M1/M3)**(3/2) // see iliadis 2007 eqn. 3.44 // ratio of partition functions are assumed to be unity - const amrex::Real rev = 5.1345573e10_rt * tf.t932 * std::exp(-83.114082_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 83.114082_rt*tf.t9i2); + const number_t rev = 5.1345573e10_rt * tf.t932 * admath::exp(-83.114082_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt*term + rev*dtermdt) * 1.0e-9_rt; } else { - const amrex::Real q1 = 1.0e0_rt/12.222016e0_rt; + constexpr amrex::Real q1 = 1.0e0_rt/12.222016e0_rt; // c12(a,g)o16 - const amrex::Real aa = 1.0e0_rt + 0.0489e0_rt*tf.t9i23; - const amrex::Real daa = -2.0_rt/3.0_rt*0.0489e0_rt*tf.t9i53; + const number_t aa = 1.0e0_rt + 0.0489e0_rt*tf.t9i23; - const amrex::Real bb = tf.t92*aa*aa; - const amrex::Real dbb = 2.0e0_rt*(bb*tf.t9i + tf.t92*aa*daa); + const number_t bb = tf.t92*aa*aa; - const amrex::Real cc = std::exp(-32.120e0_rt*tf.t9i13 - tf.t92*q1); - const amrex::Real dcc = cc * (1.0_rt/3.0_rt*32.120e0_rt*tf.t9i43 - 2.0e0_rt*tf.t9*q1); + const number_t cc = admath::exp(-32.120e0_rt*tf.t9i13 - tf.t92*q1); - const amrex::Real dd = 1.0e0_rt + 0.2654e0_rt*tf.t9i23; - const amrex::Real ddd = -2.0_rt/3.0_rt*0.2654e0_rt*tf.t9i53; + const number_t dd = 1.0e0_rt + 0.2654e0_rt*tf.t9i23; - const amrex::Real ee = tf.t92*dd*dd; - const amrex::Real dee = 2.0e0_rt*(ee*tf.t9i + tf.t92*dd*ddd); + const number_t ee = tf.t92*dd*dd; - const amrex::Real ff = std::exp(-32.120e0_rt*tf.t9i13); - const amrex::Real dff = ff * 1.0_rt/3.0_rt*32.120e0_rt*tf.t9i43; + const number_t ff = admath::exp(-32.120e0_rt*tf.t9i13); - const amrex::Real gg = 1.25e3_rt * tf.t9i32 * std::exp(-27.499_rt*tf.t9i); - const amrex::Real dgg = gg*(-1.5e0_rt*tf.t9i + 27.499_rt*tf.t9i2); + const number_t gg = 1.25e3_rt * tf.t9i32 * admath::exp(-27.499_rt*tf.t9i); - const amrex::Real hh = 1.43e-2_rt * tf.t95 * std::exp(-15.541_rt*tf.t9i); - const amrex::Real dhh = hh*(5.0e0_rt*tf.t9i + 15.541_rt*tf.t9i2); + const number_t hh = 1.43e-2_rt * tf.t95 * admath::exp(-15.541_rt*tf.t9i); - amrex::Real zz = 1.0e0_rt/bb; - const amrex::Real f1 = cc*zz; - const amrex::Real df1 = (dcc - f1*dbb)*zz; + number_t zz = 1.0e0_rt/bb; + const number_t f1 = cc*zz; zz = 1.0e0_rt/ee; - const amrex::Real f2 = ff*zz; - const amrex::Real df2 = (dff - f2*dee)*zz; + const number_t f2 = ff*zz; - amrex::Real term = 1.04e8_rt*f1 + 1.76e8_rt*f2 + gg + hh; - amrex::Real dtermdt = 1.04e8_rt*df1 + 1.76e8_rt*df2 + dgg + dhh; + number_t term = 1.04e8_rt*f1 + 1.76e8_rt*f2 + gg + hh; // 1.7 times cf88 value term *= 1.7e0_rt; - dtermdt *= 1.7e0_rt; fr = term * den; - dfrdt = dtermdt * den * 1.0e-9_rt; - const amrex::Real rev = 5.13e10_rt * tf.t932 * std::exp(-83.111_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 83.111_rt*tf.t9i2); + const number_t rev = 5.13e10_rt * tf.t932 * admath::exp(-83.111_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt*term + rev*dtermdt) * 1.0e-9_rt; } } -AMREX_GPU_HOST_DEVICE inline -void rate_triplealf(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_triplealf(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { - const amrex::Real rc28 = 0.1_rt; - const amrex::Real q1 = 1.0_rt / 0.009604e0_rt; - const amrex::Real q2 = 1.0e0_rt/0.055225e0_rt; + constexpr amrex::Real rc28 = 0.1_rt; + constexpr amrex::Real q1 = 1.0_rt / 0.009604e0_rt; + constexpr amrex::Real q2 = 1.0e0_rt/0.055225e0_rt; // triple alfa to c12 // this is a(a,g)be8 - const amrex::Real aa = 7.40e5_rt * tf.t9i32 * std::exp(-1.0663_rt*tf.t9i); - const amrex::Real daa = aa*(-1.5e0_rt*tf.t9i + 1.0663_rt*tf.t9i2); - - const amrex::Real bb = 4.164e9_rt * tf.t9i23 * std::exp(-13.49_rt*tf.t9i13 - tf.t92*q1); - const amrex::Real dbb = bb*(-2.0_rt/3.0_rt*tf.t9i + 1.0_rt/3.0_rt*13.49_rt*tf.t9i43 - 2.0e0_rt*tf.t9*q1); - - const amrex::Real cc = 1.0e0_rt + 0.031_rt*tf.t913 + 8.009_rt*tf.t923 + 1.732_rt*tf.t9 + const number_t aa = 7.40e5_rt * tf.t9i32 * admath::exp(-1.0663_rt*tf.t9i); + const number_t bb = 4.164e9_rt * tf.t9i23 * admath::exp(-13.49_rt*tf.t9i13 - tf.t92*q1); + const number_t cc = 1.0e0_rt + 0.031_rt*tf.t913 + 8.009_rt*tf.t923 + 1.732_rt*tf.t9 + 49.883_rt*tf.t943 + 27.426_rt*tf.t953; - const amrex::Real dcc = 1.0_rt/3.0_rt*0.031_rt*tf.t9i23 + 2.0_rt/3.0_rt*8.009_rt*tf.t9i13 + 1.732_rt - + 4.0_rt/3.0_rt*49.883_rt*tf.t913 + 5.0_rt/3.0_rt*27.426_rt*tf.t923; - - const amrex::Real r2abe = aa + bb * cc; - const amrex::Real dr2abedt = daa + dbb*cc + bb*dcc; + const number_t r2abe = aa + bb * cc; // this is be8(a,g)c12 - const amrex::Real dd = 130.0e0_rt * tf.t9i32 * std::exp(-3.3364_rt*tf.t9i); - const amrex::Real ddd = dd*(-1.5e0_rt*tf.t9i + 3.3364_rt*tf.t9i2); - - const amrex::Real ee = 2.510e7_rt * tf.t9i23 * std::exp(-23.57_rt*tf.t9i13 - tf.t92*q2); - const amrex::Real dee = ee*(-2.0_rt/3.0_rt*tf.t9i + 1.0_rt/3.0_rt*23.57_rt*tf.t9i43 - 2.0e0_rt*tf.t9*q2); - - const amrex::Real ff = 1.0e0_rt + 0.018_rt*tf.t913 + 5.249_rt*tf.t923 + 0.650_rt*tf.t9 + + const number_t dd = 130.0e0_rt * tf.t9i32 * admath::exp(-3.3364_rt*tf.t9i); + const number_t ee = 2.510e7_rt * tf.t9i23 * admath::exp(-23.57_rt*tf.t9i13 - tf.t92*q2); + const number_t ff = 1.0e0_rt + 0.018_rt*tf.t913 + 5.249_rt*tf.t923 + 0.650_rt*tf.t9 + 19.176_rt*tf.t943 + 6.034_rt*tf.t953; - const amrex::Real dff = 1.0_rt/3.0_rt*0.018_rt*tf.t9i23 + 2.0_rt/3.0_rt*5.249_rt*tf.t9i13 + 0.650_rt - + 4.0_rt/3.0_rt*19.176_rt*tf.t913 + 5.0_rt/3.0_rt*6.034_rt*tf.t923; - - const amrex::Real rbeac = dd + ee * ff; - const amrex::Real drbeacdt = ddd + dee * ff + ee * dff; + const number_t rbeac = dd + ee * ff; // a factor - const amrex::Real xx = rc28 * 1.35e-07_rt * tf.t9i32 * std::exp(-24.811_rt*tf.t9i); - const amrex::Real dxx = xx*(-1.5e0_rt*tf.t9i + 24.811_rt*tf.t9i2); + const number_t xx = rc28 * 1.35e-07_rt * tf.t9i32 * admath::exp(-24.811_rt*tf.t9i); - amrex::Real term, dtermdt; + number_t term; // high temperature rate if (tf.t9 > 0.08_rt) { term = 2.90e-16_rt * r2abe * rbeac + xx; - dtermdt = 2.90e-16_rt * dr2abedt * rbeac - + 2.90e-16_rt * r2abe * drbeacdt - + dxx; // low temperature rate } else { - const amrex::Real uu = 0.8e0_rt*std::exp(-std::pow(0.025_rt*tf.t9i,3.263_rt)); - const amrex::Real yy = 0.2e0_rt + uu; + const number_t uu = 0.8e0_rt*admath::exp(-admath::pow(0.025_rt*tf.t9i,3.263_rt)); + const number_t yy = 0.2e0_rt + uu; // ! fxt yy = 0.01 + 0.2e0_rt + uu; - const amrex::Real dyy = uu * 3.263_rt*std::pow((0.025_rt*tf.t9i),2.263_rt) * (0.025_rt*tf.t9i2); - const amrex::Real vv = 4.0e0_rt*std::exp(-std::pow(tf.t9/0.025_rt, 9.227_rt)); - const amrex::Real zz = 1.0e0_rt + vv; - const amrex::Real dzz = vv * -9.227_rt*std::pow(tf.t9/0.025_rt,8.227_rt) * 40.0e0_rt; - const amrex::Real zzinv = 1.0e0_rt/zz; - const amrex::Real f1 = 0.01e0_rt + yy * zzinv; + const number_t vv = 4.0e0_rt*admath::exp(-admath::pow(tf.t9/0.025_rt, 9.227_rt)); + const number_t zz = 1.0e0_rt + vv; + const number_t zzinv = 1.0e0_rt/zz; + const number_t f1 = 0.01e0_rt + yy * zzinv; // ! fxt f1 = yy * 1/zz; - const amrex::Real df1 = (dyy - yy*zzinv*dzz)*zzinv; term = 2.90e-16_rt * r2abe * rbeac * f1 + xx; - dtermdt = 2.90e-16_rt * dr2abedt * rbeac * f1 - + 2.90e-16_rt * r2abe * drbeacdt * f1 - + 2.90e-16_rt * r2abe * rbeac * df1 - + dxx; } // rates // term = 1.2e0_rt * term - // dtermdt = 1.2e0_rt * term - fr = term * den * den; - dfrdt = dtermdt * den * den * 1.0e-9_rt; + fr = autodiff::eval(term * den) * den; - const amrex::Real rev = 2.00e20_rt*tf.t93*std::exp(-84.424_rt*tf.t9i); - const amrex::Real drevdt = rev*(3.0e0_rt*tf.t9i + 84.424_rt*tf.t9i2); + const number_t rev = 2.00e20_rt*tf.t93*admath::exp(-84.424_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt*term + rev*dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_c12c12(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_c12c12(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // c12 + c12 reaction // this is the C12(C12,g)Mg24 rate from Caughlin & Fowler (1988) - const amrex::Real aa = 1.0e0_rt + 0.0396_rt*tf.t9; - amrex::Real zz = 1.0e0_rt/aa; - - const amrex::Real t9a = tf.t9*zz; - const amrex::Real dt9a = (1.0e0_rt - t9a*0.0396_rt)*zz; - - zz = dt9a/t9a; - const amrex::Real t9a13 = std::cbrt(t9a); - const amrex::Real dt9a13 = 1.0_rt/3.0_rt*t9a13*zz; - - const amrex::Real t9a56 = std::pow(t9a,5.0_rt/6.0_rt); - const amrex::Real dt9a56 = 5.0_rt/6.0_rt*t9a56*zz; - - const amrex::Real term = 4.27e26_rt * t9a56 * tf.t9i32 * - std::exp(-84.165_rt/t9a13 - 2.12e-03_rt*tf.t93); - const amrex::Real dtermdt = term*(dt9a56/t9a56 - 1.5e0_rt*tf.t9i - + 84.165_rt/(t9a13*t9a13)*dt9a13 - 6.36e-3_rt*tf.t92); + const number_t aa = 1.0e0_rt + 0.0396_rt*tf.t9; + const number_t zz = 1.0e0_rt/aa; + const number_t t9a = tf.t9*zz; + const number_t t9a13 = admath::cbrt(t9a); + const number_t t9a56 = admath::pow(t9a,5.0_rt/6.0_rt); + const number_t term = 4.27e26_rt * t9a56 * tf.t9i32 * + admath::exp(-84.165_rt/t9a13 - 2.12e-03_rt*tf.t93); // rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - rr = 0.0e0_rt; - drrdt = 0.0e0_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_c12o16(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_c12o16(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // c12 + o16 reaction; see cf88 references 47-4 - amrex::Real term, dtermdt; + number_t term; if (tf.t9 >= 0.5_rt) { - amrex::Real aa = 1.0e0_rt + 0.055_rt*tf.t9; - amrex::Real zz = 1.0e0_rt/aa; - - amrex::Real t9a = tf.t9*zz; - amrex::Real dt9a = (1.0e0_rt - t9a*0.055_rt)*zz; - - zz = dt9a/t9a; - amrex::Real t9a13 = std::cbrt(t9a); - amrex::Real dt9a13 = 1.0_rt/3.0_rt*t9a13*zz; - - amrex::Real t9a23 = t9a13*t9a13; - amrex::Real dt9a23 = 2.0e0_rt * t9a13 * dt9a13; - - amrex::Real t9a56 = std::pow(t9a,5.0_rt/6.0_rt); - amrex::Real dt9a56 = 5.0_rt/6.0_rt*t9a56*zz; - - aa = std::exp(-0.18_rt*t9a*t9a); - amrex::Real daa = -aa * 0.36_rt * t9a * dt9a; - - amrex::Real bb = 1.06e-03_rt*std::exp(2.562_rt*t9a23); - amrex::Real dbb = bb * 2.562_rt * dt9a23; - - amrex::Real cc = aa + bb; - amrex::Real dcc = daa + dbb; - + number_t aa = 1.0e0_rt + 0.055_rt*tf.t9; + number_t zz = 1.0e0_rt/aa; + number_t t9a = tf.t9*zz; + number_t t9a13 = admath::cbrt(t9a); + number_t t9a23 = t9a13*t9a13; + number_t t9a56 = admath::pow(t9a,5.0_rt/6.0_rt); + + aa = admath::exp(-0.18_rt*t9a*t9a); + number_t bb = 1.06e-03_rt*admath::exp(2.562_rt*t9a23); + number_t cc = aa + bb; zz = 1.0e0_rt/cc; - term = 1.72e31_rt * t9a56 * tf.t9i32 * std::exp(-106.594_rt/t9a13) * zz; - dtermdt = term*(dt9a56/t9a56 - 1.5e0_rt*tf.t9i - + 106.594_rt/t9a23*dt9a13 - zz*dcc); + term = 1.72e31_rt * t9a56 * tf.t9i32 * admath::exp(-106.594_rt/t9a13) * zz; } else { // term = 2.6288035e-29_rt term = 0.0e0_rt; - dtermdt = 0.0e0_rt; } // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - rr = 0.0e0_rt; - drrdt = 0.0e0_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_o16o16(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_o16o16(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // o16 + o16 // this is the O16(O16,g)S32 rate from Caughlin & Fowler (1988) - const amrex::Real term = 7.10e36_rt * tf.t9i23 * - std::exp(-135.93_rt * tf.t9i13 - 0.629_rt*tf.t923 + const number_t term = 7.10e36_rt * tf.t9i23 * + admath::exp(-135.93_rt * tf.t9i13 - 0.629_rt*tf.t923 - 0.445_rt*tf.t943 + 0.0103_rt*tf.t9*tf.t9); - const amrex::Real dtermdt = -2.0_rt/3.0_rt*term*tf.t9i - + term * (1.0_rt/3.0_rt*135.93_rt*tf.t9i43 - 2.0_rt/3.0_rt*0.629_rt*tf.t9i13 - - 4.0_rt/3.0_rt*0.445_rt*tf.t913 + 0.0206_rt*tf.t9); - // rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - rr = 0.0e0_rt; - drrdt = 0.0e0_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_o16ag(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_o16ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { - const amrex::Real q1 = 1.0e0_rt/2.515396e0_rt; + constexpr amrex::Real q1 = 1.0e0_rt/2.515396e0_rt; // o16(a,g)ne20 - const amrex::Real term1 = 9.37e9_rt * tf.t9i23 * std::exp(-39.757_rt*tf.t9i13 - tf.t92*q1); - const amrex::Real dterm1 = term1*(-2.0_rt/3.0_rt*tf.t9i + 1.0_rt/3.0_rt*39.757_rt*tf.t9i43 - 2.0e0_rt*tf.t9*q1); - - const amrex::Real aa = 62.1_rt * tf.t9i32 * std::exp(-10.297_rt*tf.t9i); - const amrex::Real daa = aa*(-1.5e0_rt*tf.t9i + 10.297_rt*tf.t9i2); - - const amrex::Real bb = 538.0e0_rt * tf.t9i32 * std::exp(-12.226_rt*tf.t9i); - const amrex::Real dbb = bb*(-1.5e0_rt*tf.t9i + 12.226_rt*tf.t9i2); - - const amrex::Real cc = 13.0e0_rt * tf.t92 * std::exp(-20.093_rt*tf.t9i); - const amrex::Real dcc = cc*(2.0e0_rt*tf.t9i + 20.093_rt*tf.t9i2); + const number_t term1 = 9.37e9_rt * tf.t9i23 * admath::exp(-39.757_rt*tf.t9i13 - tf.t92*q1); - const amrex::Real term2 = aa + bb + cc; - const amrex::Real dterm2 = daa + dbb + dcc; + const number_t aa = 62.1_rt * tf.t9i32 * admath::exp(-10.297_rt*tf.t9i); + const number_t bb = 538.0e0_rt * tf.t9i32 * admath::exp(-12.226_rt*tf.t9i); + const number_t cc = 13.0e0_rt * tf.t92 * admath::exp(-20.093_rt*tf.t9i); + const number_t term2 = aa + bb + cc; - const amrex::Real term = term1 + term2; - const amrex::Real dtermdt = dterm1 + dterm2; + const number_t term = term1 + term2; // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 5.65e10_rt*tf.t932*std::exp(-54.937_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 54.937_rt*tf.t9i2); + const number_t rev = 5.65e10_rt*tf.t932*admath::exp(-54.937_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_ne20ag(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_ne20ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { - const amrex::Real rc102 = 0.1_rt; - const amrex::Real q1 = 1.0e0_rt/4.923961e0_rt; + constexpr amrex::Real rc102 = 0.1_rt; + constexpr amrex::Real q1 = 1.0e0_rt/4.923961e0_rt; // ne20(a,g)mg24 - amrex::Real aa = 4.11e11_rt * tf.t9i23 * std::exp(-46.766_rt*tf.t9i13 - tf.t92*q1); - amrex::Real daa = aa*(-2.0_rt/3.0_rt*tf.t9i + 1.0_rt/3.0_rt*46.766_rt*tf.t9i43 - 2.0e0_rt*tf.t9*q1); - - amrex::Real bb = 1.0e0_rt + 0.009_rt*tf.t913 + 0.882_rt*tf.t923 + 0.055_rt*tf.t9 + number_t aa = 4.11e11_rt * tf.t9i23 * admath::exp(-46.766_rt*tf.t9i13 - tf.t92*q1); + number_t bb = 1.0e0_rt + 0.009_rt*tf.t913 + 0.882_rt*tf.t923 + 0.055_rt*tf.t9 + 0.749_rt*tf.t943 + 0.119_rt*tf.t953; - amrex::Real dbb = 1.0_rt/3.0_rt*0.009_rt*tf.t9i23 + 2.0_rt/3.0_rt*0.882_rt*tf.t9i13 + 0.055_rt - + 4.0_rt/3.0_rt*0.749_rt*tf.t913 + 5.0_rt/3.0_rt*0.119_rt*tf.t923; - - const amrex::Real term1 = aa * bb; - const amrex::Real dterm1 = daa * bb + aa * dbb; - - aa = 5.27e3_rt * tf.t9i32 * std::exp(-15.869_rt*tf.t9i); - daa = aa*(-1.5e0_rt*tf.t9i + 15.869_rt*tf.t9i2); - - bb = 6.51e3_rt * tf.t912 * std::exp(-16.223_rt*tf.t9i); - dbb = bb*(0.5e0_rt*tf.t9i + 16.223_rt*tf.t9i2); - - const amrex::Real term2 = aa + bb; - const amrex::Real dterm2 = daa + dbb; + const number_t term1 = aa * bb; - aa = 42.1_rt * tf.t9i32 * std::exp(-9.115_rt*tf.t9i); - daa = aa*(-1.5e0_rt*tf.t9i + 9.115_rt*tf.t9i2); + aa = 5.27e3_rt * tf.t9i32 * admath::exp(-15.869_rt*tf.t9i); + bb = 6.51e3_rt * tf.t912 * admath::exp(-16.223_rt*tf.t9i); + const number_t term2 = aa + bb; - bb = 32.0_rt * tf.t9i23 * std::exp(-9.383_rt*tf.t9i); - dbb = bb*(-2.0_rt/3.0_rt*tf.t9i + 9.383_rt*tf.t9i2); - - const amrex::Real term3 = rc102 * (aa + bb); - const amrex::Real dterm3 = rc102 * (daa + dbb); - - aa = 5.0e0_rt*std::exp(-18.960_rt*tf.t9i); - daa = aa*18.960_rt*tf.t9i2; + aa = 42.1_rt * tf.t9i32 * admath::exp(-9.115_rt*tf.t9i); + bb = 32.0_rt * tf.t9i23 * admath::exp(-9.383_rt*tf.t9i); + const number_t term3 = rc102 * (aa + bb); + aa = 5.0e0_rt*admath::exp(-18.960_rt*tf.t9i); bb = 1.0e0_rt + aa; - dbb = daa; - - const amrex::Real zz = 1.0e0_rt/bb; - const amrex::Real term = (term1 + term2 + term3)*zz; - const amrex::Real dtermdt = ((dterm1 + dterm2 + dterm3) - term*dbb)*zz; + const number_t zz = 1.0e0_rt/bb; + const number_t term = (term1 + term2 + term3)*zz; // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 6.01e10_rt * tf.t932 * std::exp(-108.059_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 108.059_rt*tf.t9i2); + const number_t rev = 6.01e10_rt * tf.t932 * admath::exp(-108.059_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_mg24ag(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_mg24ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { - const amrex::Real rc121 = 0.1e0_rt; + constexpr amrex::Real rc121 = 0.1e0_rt; // 24mg(a,g)28si - const amrex::Real aa = 4.78e1_rt * tf.t9i32 * std::exp(-13.506_rt*tf.t9i); - const amrex::Real daa = aa*(-1.5e0_rt*tf.t9i + 13.506_rt*tf.t9i2); - - const amrex::Real bb = 2.38e3_rt * tf.t9i32 * std::exp(-15.218_rt*tf.t9i); - const amrex::Real dbb = bb*(-1.5e0_rt*tf.t9i + 15.218_rt*tf.t9i2); - - const amrex::Real cc = 2.47e2_rt * tf.t932 * std::exp(-15.147_rt*tf.t9i); - const amrex::Real dcc = cc*(1.5e0_rt*tf.t9i + 15.147_rt*tf.t9i2); - - const amrex::Real dd = rc121 * 1.72e-09_rt * tf.t9i32 * std::exp(-5.028_rt*tf.t9i); - const amrex::Real ddd = dd*(-1.5e0_rt*tf.t9i + 5.028_rt*tf.t9i2); - - const amrex::Real ee = rc121* 1.25e-03_rt * tf.t9i32 * std::exp(-7.929_rt*tf.t9i); - const amrex::Real dee = ee*(-1.5e0_rt*tf.t9i + 7.929_rt*tf.t9i2); - - const amrex::Real ff = rc121 * 2.43e1_rt * tf.t9i * std::exp(-11.523_rt*tf.t9i); - const amrex::Real dff = ff*(-tf.t9i + 11.523_rt*tf.t9i2); - - const amrex::Real gg = 5.0e0_rt*std::exp(-15.882_rt*tf.t9i); - const amrex::Real dgg = gg*15.882_rt*tf.t9i2; - - const amrex::Real hh = 1.0e0_rt + gg; - const amrex::Real hhi = 1.0e0_rt/hh; - - const amrex::Real term = (aa + bb + cc + dd + ee + ff) * hhi; - const amrex::Real dtermdt = (daa + dbb + dcc + ddd + dee + dff - term*dgg) * hhi; + const number_t aa = 4.78e1_rt * tf.t9i32 * admath::exp(-13.506_rt*tf.t9i); + const number_t bb = 2.38e3_rt * tf.t9i32 * admath::exp(-15.218_rt*tf.t9i); + const number_t cc = 2.47e2_rt * tf.t932 * admath::exp(-15.147_rt*tf.t9i); + const number_t dd = rc121 * 1.72e-09_rt * tf.t9i32 * admath::exp(-5.028_rt*tf.t9i); + const number_t ee = rc121* 1.25e-03_rt * tf.t9i32 * admath::exp(-7.929_rt*tf.t9i); + const number_t ff = rc121 * 2.43e1_rt * tf.t9i * admath::exp(-11.523_rt*tf.t9i); + + const number_t gg = 5.0e0_rt*admath::exp(-15.882_rt*tf.t9i); + const number_t hh = 1.0e0_rt + gg; + const number_t hhi = 1.0e0_rt/hh; + const number_t term = (aa + bb + cc + dd + ee + ff) * hhi; // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 6.27e10_rt * tf.t932 * std::exp(-115.862_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 115.862_rt*tf.t9i2); + const number_t rev = 6.27e10_rt * tf.t932 * admath::exp(-115.862_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_mg24ap(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_mg24ap(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { - const amrex::Real rc148 = 0.1_rt; - const amrex::Real q1 = 1.0_rt / 0.024649e0_rt; + constexpr amrex::Real rc148 = 0.1_rt; + constexpr amrex::Real q1 = 1.0_rt / 0.024649e0_rt; // 24mg(a,p)al27 - amrex::Real aa = 1.10e8_rt * tf.t9i23 * std::exp(-23.261_rt*tf.t9i13 - tf.t92*q1); - amrex::Real daa = -2.0_rt/3.0_rt*aa*tf.t9i + aa*(1.0_rt/3.0_rt*23.261_rt*tf.t9i43 - 2.0e0_rt*tf.t9*q1); - - amrex::Real bb = 1.0e0_rt + 0.018_rt*tf.t913 + 12.85_rt*tf.t923 + 1.61_rt*tf.t9 + number_t aa = 1.10e8_rt * tf.t9i23 * admath::exp(-23.261_rt*tf.t9i13 - tf.t92*q1); + number_t bb = 1.0e0_rt + 0.018_rt*tf.t913 + 12.85_rt*tf.t923 + 1.61_rt*tf.t9 + 89.87_rt*tf.t943 + 28.66_rt*tf.t953; - amrex::Real dbb = 1.0_rt/3.0_rt*0.018_rt*tf.t9i23 + 2.0_rt/3.0_rt*12.85_rt*tf.t9i13 + 1.61_rt - + 4.0_rt/3.0_rt*89.87_rt*tf.t913 + 5.0_rt/3.0_rt*28.66_rt*tf.t923; - - const amrex::Real term1 = aa * bb; - const amrex::Real dterm1 = daa * bb + aa * dbb; - - aa = 129.0e0_rt * tf.t9i32 * std::exp(-2.517_rt*tf.t9i); - daa = -1.5e0_rt*aa*tf.t9i + aa*2.517_rt*tf.t9i2; + const number_t term1 = aa * bb; - bb = 5660.0e0_rt * tf.t972 * std::exp(-3.421_rt*tf.t9i); - dbb = 3.5e0_rt*bb*tf.t9i + bb*3.421_rt*tf.t9i2; + aa = 129.0e0_rt * tf.t9i32 * admath::exp(-2.517_rt*tf.t9i); + bb = 5660.0e0_rt * tf.t972 * admath::exp(-3.421_rt*tf.t9i); + const number_t cc = rc148 * 3.89e-08_rt * tf.t9i32 * admath::exp(-0.853_rt*tf.t9i); + const number_t dd = rc148 * 8.18e-09_rt * tf.t9i32 * admath::exp(-1.001_rt*tf.t9i); + const number_t term2 = aa + bb + cc + dd; - const amrex::Real cc = rc148 * 3.89e-08_rt * tf.t9i32 * std::exp(-0.853_rt*tf.t9i); - const amrex::Real dcc = -1.5e0_rt*cc*tf.t9i + cc*0.853_rt*tf.t9i2; + const number_t ee = 1.0_rt/3.0_rt*admath::exp(-9.792_rt*tf.t9i); + const number_t ff = 2.0_rt/3.0_rt * admath::exp(-11.773_rt*tf.t9i); + const number_t gg = 1.0e0_rt + ee + ff; - const amrex::Real dd = rc148 * 8.18e-09_rt * tf.t9i32 * std::exp(-1.001_rt*tf.t9i); - const amrex::Real ddd = -1.5e0_rt*dd*tf.t9i + dd*1.001_rt*tf.t9i2; - - const amrex::Real term2 = aa + bb + cc + dd; - const amrex::Real dterm2 = daa + dbb + dcc + ddd; - - const amrex::Real ee = 1.0_rt/3.0_rt*std::exp(-9.792_rt*tf.t9i); - const amrex::Real dee = ee*9.792_rt*tf.t9i2; - - const amrex::Real ff = 2.0_rt/3.0_rt * std::exp(-11.773_rt*tf.t9i); - const amrex::Real dff = ff*11.773_rt*tf.t9i2; - - const amrex::Real gg = 1.0e0_rt + ee + ff; - const amrex::Real dgg = dee + dff; - - const amrex::Real term = (term1 + term2)/gg; - const amrex::Real dtermdt = ((dterm1 + dterm2) - term*dgg)/gg; + const number_t term = (term1 + term2)/gg; // the rates - const amrex::Real rev = 1.81_rt * std::exp(-18.572_rt*tf.t9i); - const amrex::Real drevdt = rev*18.572_rt*tf.t9i2; + const number_t rev = 1.81_rt * admath::exp(-18.572_rt*tf.t9i); fr = den * rev * term; - dfrdt = den * (drevdt * term + rev * dtermdt) * 1.0e-9_rt; - rr = den * term; - drrdt = den * dtermdt * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_al27pg(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_al27pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // al27(p,g)si28 // champagne 1996 - const amrex::Real aa = 1.32e9_rt * tf.t9i23 * std::exp(-23.26_rt*tf.t9i13); - const amrex::Real daa = aa*(-2.0_rt/3.0_rt*tf.t9i + 1.0_rt/3.0_rt*23.26_rt*tf.t9i43); - - const amrex::Real bb = 3.22e-10_rt * tf.t9i32 * std::exp(-0.836_rt*tf.t9i)*0.17_rt; - const amrex::Real dbb = bb*(-1.5e0_rt*tf.t9i + 0.836_rt*tf.t9i2); - - const amrex::Real cc = 1.74e0_rt * tf.t9i32 * std::exp(-2.269_rt*tf.t9i); - const amrex::Real dcc = cc*(-1.5e0_rt*tf.t9i + 2.269_rt*tf.t9i2); - - const amrex::Real dd = 9.92e0_rt * tf.t9i32 * std::exp(-2.492_rt*tf.t9i); - const amrex::Real ddd = dd*(-1.5e0_rt*tf.t9i + 2.492_rt*tf.t9i2); - - const amrex::Real ee = 4.29e1_rt * tf.t9i32 * std::exp(-3.273_rt*tf.t9i); - const amrex::Real dee = ee*(-1.5e0_rt*tf.t9i + 3.273_rt*tf.t9i2); - - const amrex::Real ff = 1.34e2_rt * tf.t9i32 * std::exp(-3.654_rt*tf.t9i); - const amrex::Real dff = ff*(-1.5e0_rt*tf.t9i + 3.654_rt*tf.t9i2); - - const amrex::Real gg = 1.77e4_rt * std::pow(tf.t9,0.53_rt) * std::exp(-4.588_rt*tf.t9i); - const amrex::Real dgg = gg*(0.53_rt*tf.t9i + 4.588_rt*tf.t9i2); - - const amrex::Real term = aa + bb + cc + dd + ee + ff + gg; - const amrex::Real dtermdt = daa + dbb + dcc + ddd + dee + dff + dgg; + const number_t aa = 1.32e9_rt * tf.t9i23 * admath::exp(-23.26_rt*tf.t9i13); + const number_t bb = autodiff::eval(3.22e-10_rt * tf.t9i32 * admath::exp(-0.836_rt*tf.t9i))*0.17_rt; + const number_t cc = 1.74e0_rt * tf.t9i32 * admath::exp(-2.269_rt*tf.t9i); + const number_t dd = 9.92e0_rt * tf.t9i32 * admath::exp(-2.492_rt*tf.t9i); + const number_t ee = 4.29e1_rt * tf.t9i32 * admath::exp(-3.273_rt*tf.t9i); + const number_t ff = 1.34e2_rt * tf.t9i32 * admath::exp(-3.654_rt*tf.t9i); + const number_t gg = 1.77e4_rt * admath::pow(tf.t9,0.53_rt) * admath::exp(-4.588_rt*tf.t9i); + const number_t term = aa + bb + cc + dd + ee + ff + gg; // rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 1.13e11_rt * tf.t932 * std::exp(-134.434_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 134.434_rt*tf.t9i2); + const number_t rev = 1.13e11_rt * tf.t932 * admath::exp(-134.434_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt*term + rev*dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_al27pg_old(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_al27pg_old(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { - const amrex::Real rc147 = 0.1_rt; - const amrex::Real q1 = 1.0e0_rt/0.024025e0_rt; + constexpr amrex::Real rc147 = 0.1_rt; + constexpr amrex::Real q1 = 1.0e0_rt/0.024025e0_rt; // 27al(p,g)si28 cf88 - const amrex::Real aa = 1.67e8_rt * tf.t9i23 * std::exp(-23.261_rt*tf.t9i13 - tf.t92*q1); - const amrex::Real daa = aa*(-2.0_rt/3.0_rt*tf.t9i + 1.0_rt/3.0_rt*23.261_rt*tf.t9i43 - 2.0e0_rt*tf.t9*q1); - - const amrex::Real bb = 1.0e0_rt + 0.018_rt*tf.t913 + 5.81_rt*tf.t923 + 0.728_rt*tf.t9 + const number_t aa = 1.67e8_rt * tf.t9i23 * admath::exp(-23.261_rt*tf.t9i13 - tf.t92*q1); + const number_t bb = 1.0e0_rt + 0.018_rt*tf.t913 + 5.81_rt*tf.t923 + 0.728_rt*tf.t9 + 27.31_rt*tf.t943 + 8.71_rt*tf.t953; - const amrex::Real dbb = 1.0_rt/3.0_rt*0.018_rt*tf.t9i23 + 2.0_rt/3.0_rt*5.81_rt*tf.t9i13 + 0.728_rt - + 4.0_rt/3.0_rt*27.31_rt*tf.t913 + 5.0_rt/3.0_rt*8.71_rt*tf.t923; - - const amrex::Real cc = aa*bb; - const amrex::Real dcc = daa*bb + aa*dbb; - - const amrex::Real dd = 2.20e0_rt * tf.t9i32 * std::exp(-2.269_rt*tf.t9i); - const amrex::Real ddd = dd*(-1.5e0_rt*tf.t9i + 2.269_rt*tf.t9i2); - - const amrex::Real ee = 1.22e1_rt * tf.t9i32 * std::exp(-2.491_rt*tf.t9i); - const amrex::Real dee = ee*(-1.5e0_rt*tf.t9i + 2.491_rt*tf.t9i2); - - const amrex::Real ff = 1.50e4_rt * tf.t9 * std::exp(-4.112_rt*tf.t9i); - const amrex::Real dff = ff*(tf.t9i + 4.112_rt*tf.t9i2); - - const amrex::Real gg = rc147 * 6.50e-10_rt * tf.t9i32 * std::exp(-0.853_rt*tf.t9i); - const amrex::Real dgg = gg*(-1.5e0_rt*tf.t9i + 0.853_rt*tf.t9i2); - - const amrex::Real hh = rc147 * 1.63e-10_rt * tf.t9i32 * std::exp(-1.001_rt*tf.t9i); - const amrex::Real dhh = hh*(-1.5e0_rt*tf.t9i + 1.001_rt*tf.t9i2); + const number_t cc = aa*bb; - const amrex::Real xx = 1.0_rt/3.0_rt*std::exp(-9.792_rt*tf.t9i); - const amrex::Real dxx = xx*9.792_rt*tf.t9i2; + const number_t dd = 2.20e0_rt * tf.t9i32 * admath::exp(-2.269_rt*tf.t9i); + const number_t ee = 1.22e1_rt * tf.t9i32 * admath::exp(-2.491_rt*tf.t9i); + const number_t ff = 1.50e4_rt * tf.t9 * admath::exp(-4.112_rt*tf.t9i); + const number_t gg = rc147 * 6.50e-10_rt * tf.t9i32 * admath::exp(-0.853_rt*tf.t9i); + const number_t hh = rc147 * 1.63e-10_rt * tf.t9i32 * admath::exp(-1.001_rt*tf.t9i); - const amrex::Real yy = 2.0_rt/3.0_rt * std::exp(-11.773_rt*tf.t9i); - const amrex::Real dyy = yy*11.773_rt*tf.t9i2; - - const amrex::Real zz = 1.0e0_rt + xx + yy; - const amrex::Real dzz = dxx + dyy; - - const amrex::Real pp = 1.0e0_rt/zz; - const amrex::Real term = (cc + dd + ee + ff + gg + hh)*pp; - const amrex::Real dtermdt = ((dcc + ddd + dee + dff + dgg + dhh) - term*dzz)*pp; + const number_t xx = 1.0_rt/3.0_rt*admath::exp(-9.792_rt*tf.t9i); + const number_t yy = 2.0_rt/3.0_rt * admath::exp(-11.773_rt*tf.t9i); + const number_t zz = 1.0e0_rt + xx + yy; + const number_t pp = 1.0e0_rt/zz; + const number_t term = (cc + dd + ee + ff + gg + hh)*pp; // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 1.13e11_rt*tf.t932*std::exp(-134.434_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 134.434_rt*tf.t9i2); + const number_t rev = 1.13e11_rt*tf.t932*admath::exp(-134.434_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_si28ag(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_si28ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // si28(a,g)s32 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 6.340e-2_rt*z + 2.541e-3_rt*z2 - 2.900e-4_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : 6.340e-2_rt + 2.0e0_rt*2.541e-3_rt*tf.t9 - 3.0e0_rt*2.900e-4_rt*tf.t92; - // if (z == 10.0_rt) { - // daa = 0 - // } else { - // daa = 6.340e-2_rt + 2.0e0_rt*2.541e-3_rt*tf.t9 - 3.0e0_rt*2.900e-4_rt*tf.t92 - // } - - const amrex::Real term = 4.82e22_rt * tf.t9i23 * std::exp(-61.015_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = term*(-2.0_rt/3.0_rt*tf.t9i + 61.015_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa)); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 6.340e-2_rt*z + 2.541e-3_rt*z2 - 2.900e-4_rt*z3; + + const number_t term = 4.82e22_rt * tf.t9i23 * admath::exp(-61.015_rt * tf.t9i13 * aa); // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 6.461e10_rt * tf.t932 * std::exp(-80.643_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 80.643_rt*tf.t9i2); + const number_t rev = 6.461e10_rt * tf.t932 * admath::exp(-80.643_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_si28ap(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_si28ap(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // si28(a,p)p31 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 2.798e-3_rt*z + 2.763e-3_rt*z2 - 2.341e-4_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : 2.798e-3_rt + 2.0e0_rt*2.763e-3_rt*tf.t9 - 3.0e0_rt*2.341e-4_rt*tf.t92; - // if (z == 10.0_rt) { - // daa = 0.0e0_rt - // } else { - // daa = 2.798e-3_rt + 2.0e0_rt*2.763e-3_rt*tf.t9 - 3.0e0_rt*2.341e-4_rt*tf.t92 - // } - - const amrex::Real term = 4.16e13_rt * tf.t9i23 * std::exp(-25.631_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = -2.0_rt/3.0_rt*term*tf.t9i + term*25.631_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 2.798e-3_rt*z + 2.763e-3_rt*z2 - 2.341e-4_rt*z3; + const number_t term = 4.16e13_rt * tf.t9i23 * admath::exp(-25.631_rt * tf.t9i13 * aa); // the rates - const amrex::Real rev = 0.5825e0_rt * std::exp(-22.224_rt*tf.t9i); - const amrex::Real drevdt = rev*22.224_rt*tf.t9i2; + const number_t rev = 0.5825e0_rt * admath::exp(-22.224_rt*tf.t9i); fr = den * rev * term; - dfrdt = den * (drevdt * term + rev * dtermdt) * 1.0e-9_rt; - rr = den * term; - drrdt = den * dtermdt * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_p31pg(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_p31pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // p31(p,g)s32 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 1.928e-1_rt*z - 1.540e-2_rt*z2 + 6.444e-4_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : 1.928e-1_rt - 2.0e0_rt*1.540e-2_rt*tf.t9 + 3.0e0_rt*6.444e-4_rt*tf.t92; - // if (z == 10.0_rt) { - // daa = 0.0e0_rt - // } else { - // daa = 1.928e-1_rt - 2.0e0_rt*1.540e-2_rt*tf.t9 + 3.0e0_rt*6.444e-4_rt*tf.t92 - // } - - const amrex::Real term = 1.08e16_rt * tf.t9i23 * std::exp(-27.042_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = term*(-2.0_rt/3.0_rt*tf.t9i + 27.042_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa)); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 1.928e-1_rt*z - 1.540e-2_rt*z2 + 6.444e-4_rt*z3; + + const number_t term = 1.08e16_rt * tf.t9i23 * admath::exp(-27.042_rt * tf.t9i13 * aa); // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 3.764e10_rt * tf.t932 * std::exp(-102.865_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 102.865_rt*tf.t9i2); + const number_t rev = 3.764e10_rt * tf.t932 * admath::exp(-102.865_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_s32ag(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_s32ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // s32(a,g)ar36 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 4.913e-2_rt*z + 4.637e-3_rt*z2 - 4.067e-4_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : 4.913e-2_rt + 2.0e0_rt*4.637e-3_rt*tf.t9 - 3.0e0_rt*4.067e-4_rt*tf.t92; - // if (z == 10.0_rt) { - // daa = 0.0e0_rt - // } else { - // daa = 4.913e-2_rt + 2.0e0_rt*4.637e-3_rt*tf.t9 - 3.0e0_rt*4.067e-4_rt*tf.t92 - // } - - const amrex::Real term = 1.16e24_rt * tf.t9i23 * std::exp(-66.690_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = term*(-2.0_rt/3.0_rt*tf.t9i + 66.690_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa)); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 4.913e-2_rt*z + 4.637e-3_rt*z2 - 4.067e-4_rt*z3; + + const number_t term = 1.16e24_rt * tf.t9i23 * admath::exp(-66.690_rt * tf.t9i13 * aa); // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 6.616e10_rt * tf.t932 * std::exp(-77.080_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 77.080_rt*tf.t9i2); + const number_t rev = 6.616e10_rt * tf.t932 * admath::exp(-77.080_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_s32ap(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_s32ap(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // s32(a,p)cl35 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 1.041e-1_rt*z - 1.368e-2_rt*z2 + 6.969e-4_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : 1.041e-1_rt - 2.0e0_rt*1.368e-2_rt*tf.t9 + 3.0e0_rt*6.969e-4_rt*tf.t92; - // if (z == 10) { - // daa = 0.0e0_rt - // } else { - // daa = 1.041e-1_rt - 2.0e0_rt*1.368e-2_rt*tf.t9 + 3.0e0_rt*6.969e-4_rt*tf.t92 - // } - - const amrex::Real term = 1.27e16_rt * tf.t9i23 * std::exp(-31.044_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = -2.0_rt/3.0_rt*term*tf.t9i + term*31.044_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 1.041e-1_rt*z - 1.368e-2_rt*z2 + 6.969e-4_rt*z3; + + const number_t term = 1.27e16_rt * tf.t9i23 * admath::exp(-31.044_rt * tf.t9i13 * aa); // the rates - const amrex::Real rev = 1.144_rt * std::exp(-21.643_rt*tf.t9i); - const amrex::Real drevdt = rev*21.643_rt*tf.t9i2; + const number_t rev = 1.144_rt * admath::exp(-21.643_rt*tf.t9i); fr = den * rev * term; - dfrdt = den * (drevdt*term + rev*dtermdt) * 1.0e-9_rt; - rr = den * term; - drrdt = den * dtermdt * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_cl35pg(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_cl35pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // cl35(p,g)ar36 - const amrex::Real aa = 1.0e0_rt + 1.761e-1_rt*tf.t9 - 1.322e-2_rt*tf.t92 + 5.245e-4_rt*tf.t93; - const amrex::Real daa = 1.761e-1_rt - 2.0e0_rt*1.322e-2_rt*tf.t9 + 3.0e0_rt*5.245e-4_rt*tf.t92; - - const amrex::Real term = 4.48e16_rt * tf.t9i23 * std::exp(-29.483_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = term*(-2.0_rt/3.0_rt*tf.t9i + 29.483_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa)); + const number_t aa = 1.0e0_rt + 1.761e-1_rt*tf.t9 - 1.322e-2_rt*tf.t92 + 5.245e-4_rt*tf.t93; + const number_t term = 4.48e16_rt * tf.t9i23 * admath::exp(-29.483_rt * tf.t9i13 * aa); // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 7.568e10_rt*tf.t932*std::exp(-98.722_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 98.722_rt*tf.t9i2); + const number_t rev = 7.568e10_rt*tf.t932*admath::exp(-98.722_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_ar36ag(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_ar36ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // ar36(a,g)ca40 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 1.458e-1_rt*z - 1.069e-2_rt*z2 + 3.790e-4_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : 1.458e-1_rt - 2.0e0_rt*1.069e-2_rt*tf.t9 + 3.0e0_rt*3.790e-4_rt*tf.t92; - // if (z == 10.0_rt) { - // daa = 0.0e0_rt - // } else { - // daa = 1.458e-1_rt - 2.0e0_rt*1.069e-2_rt*tf.t9 + 3.0e0_rt*3.790e-4_rt*tf.t92 - // } - - const amrex::Real term = 2.81e30_rt * tf.t9i23 * std::exp(-78.271_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = term*(-2.0_rt/3.0_rt*tf.t9i + 78.271_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa)); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 1.458e-1_rt*z - 1.069e-2_rt*z2 + 3.790e-4_rt*z3; + + const number_t term = 2.81e30_rt * tf.t9i23 * admath::exp(-78.271_rt * tf.t9i13 * aa); // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 6.740e10_rt * tf.t932 * std::exp(-81.711_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 81.711_rt*tf.t9i2); + const number_t rev = 6.740e10_rt * tf.t932 * admath::exp(-81.711_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_ar36ap(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_ar36ap(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // ar36(a,p)k39 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 4.826e-3_rt*z - 5.534e-3_rt*z2 + 4.021e-4_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : 4.826e-3_rt - 2.0e0_rt*5.534e-3_rt*tf.t9 + 3.0e0_rt*4.021e-4_rt*tf.t92; - // if (z == 10.0_rt) { - // daa = 0.0e0_rt - // } else { - // daa = 4.826e-3_rt - 2.0e0_rt*5.534e-3_rt*tf.t9 + 3.0e0_rt*4.021e-4_rt*tf.t92 - // } - - const amrex::Real term = 2.76e13_rt * tf.t9i23 * std::exp(-34.922_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = -2.0_rt/3.0_rt*term*tf.t9i + term*34.922_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 4.826e-3_rt*z - 5.534e-3_rt*z2 + 4.021e-4_rt*z3; + + const number_t term = 2.76e13_rt * tf.t9i23 * admath::exp(-34.922_rt * tf.t9i13 * aa); // the rates - const amrex::Real rev = 1.128_rt*std::exp(-14.959_rt*tf.t9i); - const amrex::Real drevdt = rev*14.959_rt*tf.t9i2; + const number_t rev = 1.128_rt*admath::exp(-14.959_rt*tf.t9i); fr = den * rev * term; - dfrdt = den * (drevdt*term + rev*dtermdt) * 1.0e-9_rt; rr = den * term; - drrdt = den * dtermdt * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_k39pg(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_k39pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // k39(p,g)ca40 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 1.622e-1_rt*z - 1.119e-2_rt*z2 + 3.910e-4_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : 1.622e-1_rt - 2.0e0_rt*1.119e-2_rt*tf.t9 + 3.0e0_rt*3.910e-4_rt*tf.t92; - // if (z == 10) { - // daa = 0.0e0_rt - // } else { - // daa = 1.622e-1_rt - 2.0e0_rt*1.119e-2_rt*tf.t9 + 3.0e0_rt*3.910e-4_rt*tf.t92 - // } - - const amrex::Real term = 4.09e16_rt * tf.t9i23 * std::exp(-31.727_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = term*(-2.0_rt/3.0_rt*tf.t9i + 31.727_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa)); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 1.622e-1_rt*z - 1.119e-2_rt*z2 + 3.910e-4_rt*z3; + + const number_t term = 4.09e16_rt * tf.t9i23 * admath::exp(-31.727_rt * tf.t9i13 * aa); // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 7.600e10_rt * tf.t932 * std::exp(-96.657_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 96.657_rt*tf.t9i2); + const number_t rev = 7.600e10_rt * tf.t932 * admath::exp(-96.657_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_ca40ag(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_ca40ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // ca40(a,g)ti44 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 1.650e-2_rt*z + 5.973e-3_rt*z2 - 3.889e-04_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : 1.650e-2_rt + 2.0e0_rt*5.973e-3_rt*tf.t9 - 3.0e0_rt*3.889e-4_rt*tf.t92; - // if (z == 10.0_rt) { - // daa = 0.0e0_rt - // } else { - // daa = 1.650e-2_rt + 2.0e0_rt*5.973e-3_rt*tf.t9 - 3.0e0_rt*3.889e-4_rt*tf.t92 - // } - - const amrex::Real term = 4.66e24_rt * tf.t9i23 * std::exp(-76.435_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = term*(-2.0_rt/3.0_rt*tf.t9i + 76.435_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa)); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 1.650e-2_rt*z + 5.973e-3_rt*z2 - 3.889e-04_rt*z3; + + const number_t term = 4.66e24_rt * tf.t9i23 * admath::exp(-76.435_rt * tf.t9i13 * aa); // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 6.843e10_rt * tf.t932 * std::exp(-59.510_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 59.510_rt*tf.t9i2); + const number_t rev = 6.843e10_rt * tf.t932 * admath::exp(-59.510_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_ca40ap(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_ca40ap(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // ca40(a,p)sc43 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt - 1.206e-2_rt*z + 7.753e-3_rt*z2 - 5.071e-4_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : -1.206e-2_rt + 2.0e0_rt*7.753e-3_rt*tf.t9 - 3.0e0_rt*5.071e-4_rt*tf.t92; - // if (z == 10.0_rt) { - // daa = 0.0e0_rt - // } else { - // daa = -1.206e-2_rt + 2.0e0_rt*7.753e-3_rt*tf.t9 - 3.0e0_rt*5.071e-4_rt*tf.t92 - // } - - const amrex::Real term = 4.54e14_rt * tf.t9i23 * std::exp(-32.177_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = -2.0_rt/3.0_rt*term*tf.t9i + term*32.177_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt - 1.206e-2_rt*z + 7.753e-3_rt*z2 - 5.071e-4_rt*z3; + + const number_t term = 4.54e14_rt * tf.t9i23 * admath::exp(-32.177_rt * tf.t9i13 * aa); // the rates - const amrex::Real rev = 2.229_rt * std::exp(-40.966_rt*tf.t9i); - const amrex::Real drevdt = rev*40.966_rt*tf.t9i2; + const number_t rev = 2.229_rt * admath::exp(-40.966_rt*tf.t9i); fr = den * rev * term; - dfrdt = den * (drevdt*term + rev*dtermdt) * 1.0e-9_rt; - rr = den * term; - drrdt = den * dtermdt * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_sc43pg(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_sc43pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // sc43(p,g)ca40 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 1.023e-1_rt*z - 2.242e-3_rt*z2 - 5.463e-5_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : 1.023e-1_rt - 2.0e0_rt*2.242e-3_rt*tf.t9 - 3.0e0_rt*5.463e-5_rt*tf.t92; - // if (z == 10.0_rt) { - // daa = 0.0e0_rt - // } else { - // daa = 1.023e-1_rt - 2.0e0_rt*2.242e-3_rt*tf.t9 - 3.0e0_rt*5.463e-5_rt*tf.t92 - // } - - const amrex::Real term = 3.85e16_rt * tf.t9i23 * std::exp(-33.234_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = term*(-2.0_rt/3.0_rt*tf.t9i + 33.234_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa)); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 1.023e-1_rt*z - 2.242e-3_rt*z2 - 5.463e-5_rt*z3; + + const number_t term = 3.85e16_rt * tf.t9i23 * admath::exp(-33.234_rt * tf.t9i13 * aa); // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 1.525e11_rt * tf.t932 * std::exp(-100.475_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 100.475_rt*tf.t9i2); + const number_t rev = 1.525e11_rt * tf.t932 * admath::exp(-100.475_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_ti44ag(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_ti44ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // ti44(a,g)cr48 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 1.066e-1_rt*z - 1.102e-2_rt*z2 + 5.324e-4_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : 1.066e-1_rt - 2.0e0_rt*1.102e-2_rt*tf.t9 + 3.0e0_rt*5.324e-4_rt*tf.t92; - // if (z == 10.0_rt) { - // daa = 0.0e0_rt - // } else { - // daa = 1.066e-1_rt - 2.0e0_rt*1.102e-2_rt*tf.t9 + 3.0e0_rt*5.324e-4_rt*tf.t92 - // } - - const amrex::Real term = 1.37e26_rt * tf.t9i23 * std::exp(-81.227_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = term*(-2.0_rt/3.0_rt*tf.t9i + 81.227_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa)); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 1.066e-1_rt*z - 1.102e-2_rt*z2 + 5.324e-4_rt*z3; + + const number_t term = 1.37e26_rt * tf.t9i23 * admath::exp(-81.227_rt * tf.t9i13 * aa); // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 6.928e10_rt*tf.t932*std::exp(-89.289_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 89.289_rt*tf.t9i2); + const number_t rev = 6.928e10_rt*tf.t932*admath::exp(-89.289_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_ti44ap(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_ti44ap(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // ti44(a,p)v47 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 2.655e-2_rt*z - 3.947e-3_rt*z2 + 2.522e-4_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : 2.655e-2_rt - 2.0e0_rt*3.947e-3_rt*tf.t9 + 3.0e0_rt*2.522e-4_rt*tf.t92; - // if (z == 10.0_rt) { - // daa = 0.0e0_rt - // } else { - // daa = 2.655e-2_rt - 2.0e0_rt*3.947e-3_rt*tf.t9 + 3.0e0_rt*2.522e-4_rt*tf.t92 - // } - - const amrex::Real term = 6.54e20_rt * tf.t9i23 * std::exp(-66.678_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = -2.0_rt/3.0_rt*term*tf.t9i + term*66.678_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 2.655e-2_rt*z - 3.947e-3_rt*z2 + 2.522e-4_rt*z3; + + const number_t term = 6.54e20_rt * tf.t9i23 * admath::exp(-66.678_rt * tf.t9i13 * aa); // the rates - const amrex::Real rev = 1.104_rt * std::exp(-4.723_rt*tf.t9i); - const amrex::Real drevdt = rev*4.723_rt*tf.t9i2; + const number_t rev = 1.104_rt * admath::exp(-4.723_rt*tf.t9i); fr = den * rev * term; - dfrdt = den * (drevdt*term + rev*dtermdt) * 1.0e-9_rt; - rr = den * term; - drrdt = den * dtermdt * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_v47pg(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_v47pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // v47(p,g)cr48 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 9.979e-2_rt*z - 2.269e-3_rt*z2 - 6.662e-5_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0 : 9.979e-2_rt - 2.0e0_rt*2.269e-3_rt*tf.t9 - 3.0e0_rt*6.662e-5_rt*tf.t92; - // if (z == 10.0_rt) { - // daa = 0.0e0_rt - // } else { - // daa = 9.979e-2_rt - 2.0e0_rt*2.269e-3_rt*tf.t9 - 3.0e0_rt*6.662e-5_rt*tf.t92 - // } - - const amrex::Real term = 2.05e17_rt * tf.t9i23 * std::exp(-35.568_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = term*(-2.0_rt/3.0_rt*tf.t9i + 35.568_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa)); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 9.979e-2_rt*z - 2.269e-3_rt*z2 - 6.662e-5_rt*z3; + + const number_t term = 2.05e17_rt * tf.t9i23 * admath::exp(-35.568_rt * tf.t9i13 * aa); // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 7.649e10_rt*tf.t932*std::exp(-93.999_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 93.999_rt*tf.t9i2); + const number_t rev = 7.649e10_rt*tf.t932*admath::exp(-93.999_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_cr48ag(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_cr48ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // cr48(a,g)fe52 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 6.325e-2_rt*z - 5.671e-3_rt*z2 + 2.848e-4_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : 6.325e-2_rt - 2.0e0_rt*5.671e-3_rt*tf.t9 + 3.0e0_rt*2.848e-4_rt*tf.t92; - // if (z == 10.0_rt) { - // daa = 0.0e0_rt - // } else { - // daa = 6.325e-2_rt - 2.0e0_rt*5.671e-3_rt*tf.t9 + 3.0e0_rt*2.848e-4_rt*tf.t92 - // } - - const amrex::Real term = 1.04e23_rt * tf.t9i23 * std::exp(-81.420_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = term*(-2.0_rt/3.0_rt*tf.t9i + 81.420_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa)); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 6.325e-2_rt*z - 5.671e-3_rt*z2 + 2.848e-4_rt*z3; + + const number_t term = 1.04e23_rt * tf.t9i23 * admath::exp(-81.420_rt * tf.t9i13 * aa); // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 7.001e10_rt * tf.t932 * std::exp(-92.177_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 92.177_rt*tf.t9i2); + const number_t rev = 7.001e10_rt * tf.t932 * admath::exp(-92.177_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_cr48ap(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_cr48ap(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // cr48(a,p)mn51 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 1.384e-2_rt*z + 1.081e-3_rt*z2 - 5.933e-5_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : 1.384e-2_rt + 2.0e0_rt*1.081e-3_rt*tf.t9 - 3.0e0_rt*5.933e-5_rt*tf.t92; - // if (z == 10.0_rt) { - // daa = 0.0e0_rt - // } else { - // daa = 1.384e-2_rt + 2.0e0_rt*1.081e-3_rt*tf.t9 - 3.0e0_rt*5.933e-5_rt*tf.t92 - // } - - const amrex::Real term = 1.83e26_rt * tf.t9i23 * std::exp(-86.741_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = -2.0_rt/3.0_rt*term*tf.t9i + term*86.741_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 1.384e-2_rt*z + 1.081e-3_rt*z2 - 5.933e-5_rt*z3; + + const number_t term = 1.83e26_rt * tf.t9i23 * admath::exp(-86.741_rt * tf.t9i13 * aa); // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 0.6087_rt*std::exp(-6.510_rt*tf.t9i); - const amrex::Real drevdt = rev*6.510_rt*tf.t9i2; + const number_t rev = 0.6087_rt*admath::exp(-6.510_rt*tf.t9i); rr = den * rev * term; - drrdt = den * (drevdt*term + rev*dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_mn51pg(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_mn51pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // mn51(p,g)fe52 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 8.922e-2_rt*z - 1.256e-3_rt*z2 - 9.453e-5_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : 8.922e-2_rt - 2.0e0_rt*1.256e-3_rt*tf.t9 - 3.0e0_rt*9.453e-5_rt*tf.t92; - // if (z == 10.0_rt) { - // daa = 0.0e0_rt - // } else { - // daa = 8.922e-2_rt - 2.0e0_rt*1.256e-3_rt*tf.t9 - 3.0e0_rt*9.453e-5_rt*tf.t92 - // } - - const amrex::Real term = 3.77e17_rt * tf.t9i23 * std::exp(-37.516_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = term*(-2.0_rt/3.0_rt*tf.t9i + 37.516_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa)); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 8.922e-2_rt*z - 1.256e-3_rt*z2 - 9.453e-5_rt*z3; + + const number_t term = 3.77e17_rt * tf.t9i23 * admath::exp(-37.516_rt * tf.t9i13 * aa); // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 1.150e11_rt*tf.t932*std::exp(-85.667_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 85.667_rt*tf.t9i2); + const number_t rev = 1.150e11_rt*tf.t932*admath::exp(-85.667_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_fe52ag(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_fe52ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // fe52(a,g)ni56 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 7.846e-2_rt*z - 7.430e-3_rt*z2 + 3.723e-4_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : 7.846e-2_rt - 2.0e0_rt*7.430e-3_rt*tf.t9 + 3.0e0_rt*3.723e-4_rt*tf.t92; - // if (z == 10.0_rt) { - // daa = 0.0e0_rt - // } else { - // daa = 7.846e-2_rt - 2.0e0_rt*7.430e-3_rt*tf.t9 + 3.0e0_rt*3.723e-4_rt*tf.t92 - // } - - const amrex::Real term = 1.05e27_rt * tf.t9i23 * std::exp(-91.674_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = term*(-2.0_rt/3.0_rt*tf.t9i + 91.674_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa)); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 7.846e-2_rt*z - 7.430e-3_rt*z2 + 3.723e-4_rt*z3; + + const number_t term = 1.05e27_rt * tf.t9i23 * admath::exp(-91.674_rt * tf.t9i13 * aa); // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 7.064e10_rt*tf.t932*std::exp(-92.850_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 92.850_rt*tf.t9i2); + const number_t rev = 7.064e10_rt*tf.t932*admath::exp(-92.850_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_fe52ap(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_fe52ap(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // fe52(a,p)co55 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 1.367e-2_rt*z + 7.428e-4_rt*z2 - 3.050e-5_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : 1.367e-2_rt + 2.0e0_rt*7.428e-4_rt*tf.t9 - 3.0e0_rt*3.050e-5_rt*tf.t92; - // if (z == 10.0_rt) { - // daa = 0.0e0_rt - // } else { - // daa = 1.367e-2_rt + 2.0e0_rt*7.428e-4_rt*tf.t9 - 3.0e0_rt*3.050e-5_rt*tf.t92 - // } - - const amrex::Real term = 1.30e27_rt * tf.t9i23 * std::exp(-91.674_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = -2.0_rt/3.0_rt*term*tf.t9i + term*91.674_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 1.367e-2_rt*z + 7.428e-4_rt*z2 - 3.050e-5_rt*z3; + + const number_t term = 1.30e27_rt * tf.t9i23 * admath::exp(-91.674_rt * tf.t9i13 * aa); // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 0.4597_rt*std::exp(-9.470_rt*tf.t9i); - const amrex::Real drevdt = rev*9.470_rt*tf.t9i2; + const number_t rev = 0.4597_rt*admath::exp(-9.470_rt*tf.t9i); rr = den * rev * term; - drrdt = den * (drevdt*term + rev*dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_co55pg(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_co55pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // co55(p,g)ni56 - const amrex::Real z = amrex::min(tf.t9, 10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 9.894e-2_rt*z - 3.131e-3_rt*z2 - 2.160e-5_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : 9.894e-2_rt - 2.0e0_rt*3.131e-3_rt*tf.t9 - 3.0e0_rt*2.160e-5_rt*tf.t92; - // if (z == 10.0_rt) { - // daa = 0.0e0_rt - // } else { - // daa = 9.894e-2_rt - 2.0e0_rt*3.131e-3_rt*tf.t9 - 3.0e0_rt*2.160e-5_rt*tf.t92 - // } - - const amrex::Real term = 1.21e18_rt * tf.t9i23 * std::exp(-39.604_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = term*(-2.0_rt/3.0_rt*tf.t9i + 39.604_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa)); + const number_t z = admath::min(10.0e0_rt, tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 9.894e-2_rt*z - 3.131e-3_rt*z2 - 2.160e-5_rt*z3; + + const number_t term = 1.21e18_rt * tf.t9i23 * admath::exp(-39.604_rt * tf.t9i13 * aa); // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 1.537e11_rt*tf.t932*std::exp(-83.382_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 83.382_rt*tf.t9i2); + const number_t rev = 1.537e11_rt*tf.t932*admath::exp(-83.382_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_pp(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_pp(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // p(p,e+nu)d - amrex::Real term, dtermdt; + number_t term; if (tf.t9 <= 3.0_rt) { - const amrex::Real aa = 4.01e-15_rt * tf.t9i23 * std::exp(-3.380e0_rt*tf.t9i13); - const amrex::Real daa = aa*(-2.0_rt/3.0_rt*tf.t9i + 1.0_rt/3.0_rt*3.380e0_rt*tf.t9i43); - - const amrex::Real bb = 1.0e0_rt + 0.123e0_rt*tf.t913 + 1.09e0_rt*tf.t923 + 0.938e0_rt*tf.t9; - const amrex::Real dbb = 1.0_rt/3.0_rt*0.123e0_rt*tf.t9i23 + 2.0_rt/3.0_rt*1.09e0_rt*tf.t9i13 + 0.938e0_rt; - + const number_t aa = 4.01e-15_rt * tf.t9i23 * admath::exp(-3.380e0_rt*tf.t9i13); + const number_t bb = 1.0e0_rt + 0.123e0_rt*tf.t913 + 1.09e0_rt*tf.t923 + 0.938e0_rt*tf.t9; term = aa * bb; - dtermdt = daa * bb + aa * dbb; - } else { term = 1.1581136e-15_rt; - dtermdt = 0.0e0_rt; } // rate fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - rr = 0.0e0_rt; - drrdt = 0.0e0_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_png(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_png(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // p(n,g)d // smith,kawano,malany 1992 - const amrex::Real aa = 1.0e0_rt - 0.8504_rt*tf.t912 + 0.4895_rt*tf.t9 + const number_t aa = 1.0e0_rt - 0.8504_rt*tf.t912 + 0.4895_rt*tf.t9 - 0.09623_rt*tf.t932 + 8.471e-3_rt*tf.t92 - 2.80e-4_rt*tf.t952; - - const amrex::Real daa = -0.5e0_rt*0.8504_rt*tf.t9i12 + 0.4895_rt - - 1.5e0_rt*0.09623_rt*tf.t912 + 2.0e0_rt*8.471e-3_rt*tf.t9 - - 2.5e0_rt*2.80e-4_rt*tf.t932; - - const amrex::Real term = 4.742e4_rt * aa; - const amrex::Real dtermdt = 4.742e4_rt * daa; + const number_t term = 4.742e4_rt * aa; // wagoner,schramm 1977 // aa = 1.0e0_rt - 0.86*tf.t912 + 0.429*tf.t9 - // daa = -0.5e0_rt*0.86*tf.t9i12 + 0.429 - // term = 4.4e4_rt * aa - // dtermdt = 4.4e4_rt * daa // rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 4.71e9_rt * tf.t932 * std::exp(-25.82_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 25.82_rt*tf.t9i2); + const number_t rev = 4.71e9_rt * tf.t932 * admath::exp(-25.82_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_dpg(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_dpg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // d(p,g)he3 - const amrex::Real aa = 2.24e3_rt * tf.t9i23 * std::exp(-3.720_rt*tf.t9i13); - const amrex::Real daa = aa*(-2.0_rt/3.0_rt*tf.t9i + 1.0_rt/3.0_rt*3.720_rt*tf.t9i43); - - const amrex::Real bb = 1.0e0_rt + 0.112_rt*tf.t913 + 3.38_rt*tf.t923 + 2.65_rt*tf.t9; - const amrex::Real dbb = 1.0_rt/3.0_rt*0.112_rt*tf.t9i23 + 2.0_rt/3.0_rt*3.38_rt*tf.t9i13 + 2.65_rt; - - const amrex::Real term = aa * bb; - const amrex::Real dtermdt = daa * bb + aa * dbb; + const number_t aa = 2.24e3_rt * tf.t9i23 * admath::exp(-3.720_rt*tf.t9i13); + const number_t bb = 1.0e0_rt + 0.112_rt*tf.t913 + 3.38_rt*tf.t923 + 2.65_rt*tf.t9; + const number_t term = aa * bb; // rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 1.63e10_rt * tf.t932 * std::exp(-63.750_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 63.750_rt*tf.t9i2); + const number_t rev = 1.63e10_rt * tf.t932 * admath::exp(-63.750_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_he3ng(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_he3ng(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // he3(n,g)he4 - const amrex::Real term = 6.62_rt * (1.0e0_rt + 905.0_rt*tf.t9); - const amrex::Real dtermdt = 5.9911e3_rt; + const number_t term = 6.62_rt * (1.0e0_rt + 905.0_rt*tf.t9); // rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 2.61e10_rt * tf.t932 * std::exp(-238.81_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 238.81_rt*tf.t9i2); + const number_t rev = 2.61e10_rt * tf.t932 * admath::exp(-238.81_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_he3he3(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_he3he3(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // he3(he3,2p)he4 - const amrex::Real aa = 6.04e10_rt * tf.t9i23 * std::exp(-12.276_rt*tf.t9i13); - const amrex::Real daa = aa*(-2.0_rt/3.0_rt*tf.t9i + 1.0_rt/3.0_rt*12.276_rt*tf.t9i43); - - const amrex::Real bb = 1.0e0_rt + 0.034_rt*tf.t913 - 0.522_rt*tf.t923 - 0.124_rt*tf.t9 + const number_t aa = 6.04e10_rt * tf.t9i23 * admath::exp(-12.276_rt*tf.t9i13); + const number_t bb = 1.0e0_rt + 0.034_rt*tf.t913 - 0.522_rt*tf.t923 - 0.124_rt*tf.t9 + 0.353_rt*tf.t943 + 0.213_rt*tf.t953; - const amrex::Real dbb = 1.0_rt/3.0_rt*0.034_rt*tf.t9i23 - 2.0_rt/3.0_rt*0.522_rt*tf.t9i13 - 0.124_rt - + 4.0_rt/3.0_rt*0.353_rt*tf.t913 + 5.0_rt/3.0_rt*0.213_rt*tf.t923; - - const amrex::Real term = aa * bb; - const amrex::Real dtermdt = daa*bb + aa*dbb; + const number_t term = aa * bb; // rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 3.39e-10_rt * tf.t9i32 * std::exp(-149.230_rt*tf.t9i); - const amrex::Real drevdt = rev*(-1.5e0_rt*tf.t9i + 149.230_rt*tf.t9i2); + const number_t rev = 3.39e-10_rt * tf.t9i32 * admath::exp(-149.230_rt*tf.t9i); rr = den * den * rev * term; - drrdt = den * den * (drevdt*term + rev*dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_he3he4(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_he3he4(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // he3(he4,g)be7 - const amrex::Real aa = 1.0e0_rt + 0.0495_rt*tf.t9; - const amrex::Real daa = 0.0495_rt; - - amrex::Real zz = 1.0e0_rt/aa;; - const amrex::Real t9a = tf.t9*zz; - const amrex::Real dt9a = (1.0e0_rt - t9a*daa)*zz; - - zz = dt9a/t9a; - const amrex::Real t9a13 = std::cbrt(t9a); - const amrex::Real dt9a13 = 1.0_rt/3.0_rt*t9a13*zz; + const number_t aa = 1.0e0_rt + 0.0495_rt*tf.t9; - const amrex::Real t9a56 = std::pow(t9a,5.0_rt/6.0_rt); - const amrex::Real dt9a56 = 5.0_rt/6.0_rt*t9a56*zz; + number_t zz = 1.0e0_rt/aa; + const number_t t9a = tf.t9*zz; + const number_t t9a13 = admath::cbrt(t9a); + const number_t t9a56 = admath::pow(t9a,5.0_rt/6.0_rt); - const amrex::Real term = 5.61e6_rt * t9a56 * tf.t9i32 * std::exp(-12.826_rt/t9a13); - const amrex::Real dtermdt = term*(dt9a56/t9a56 - 1.5e0_rt*tf.t9i - + 12.826_rt/(t9a13*t9a13) * dt9a13); + const number_t term = 5.61e6_rt * t9a56 * tf.t9i32 * admath::exp(-12.826_rt/t9a13); // rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 1.11e10_rt * tf.t932 * std::exp(-18.423_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 18.423_rt*tf.t9i2); + const number_t rev = 1.11e10_rt * tf.t932 * admath::exp(-18.423_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt*term + rev*dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_c12pg(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_c12pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { - const amrex::Real q1 = 1.0e0_rt/2.25e0_rt; + constexpr amrex::Real q1 = 1.0e0_rt/2.25e0_rt; // c12(p,g)13n - const amrex::Real aa = 2.04e7_rt * tf.t9i23 * std::exp(-13.69_rt*tf.t9i13 - tf.t92*q1); - const amrex::Real daa = aa*(-2.0_rt/3.0_rt*tf.t9i + 1.0_rt/3.0_rt*13.69_rt*tf.t9i43 - 2.0e0_rt*tf.t9*q1); - - const amrex::Real bb = 1.0e0_rt + 0.03_rt*tf.t913 + 1.19_rt*tf.t923 + 0.254_rt*tf.t9 + const number_t aa = 2.04e7_rt * tf.t9i23 * admath::exp(-13.69_rt*tf.t9i13 - tf.t92*q1); + const number_t bb = 1.0e0_rt + 0.03_rt*tf.t913 + 1.19_rt*tf.t923 + 0.254_rt*tf.t9 + 2.06_rt*tf.t943 + 1.12_rt*tf.t953; - const amrex::Real dbb = 1.0_rt/3.0_rt*0.03_rt*tf.t9i23 + 2.0_rt/3.0_rt*1.19_rt*tf.t9i13 + 0.254_rt - + 4.0_rt/3.0_rt*2.06_rt*tf.t913 + 5.0_rt/3.0_rt*1.12_rt*tf.t923; - - const amrex::Real cc = aa * bb; - const amrex::Real dcc = daa*bb + aa*dbb; + const number_t cc = aa * bb; - const amrex::Real dd = 1.08e5_rt * tf.t9i32 * std::exp(-4.925_rt*tf.t9i); - const amrex::Real ddd = dd*(-1.5e0_rt*tf.t9i + 4.925_rt*tf.t9i2); + const number_t dd = 1.08e5_rt * tf.t9i32 * admath::exp(-4.925_rt*tf.t9i); - const amrex::Real ee = 2.15e5_rt * tf.t9i32 * std::exp(-18.179_rt*tf.t9i); - const amrex::Real dee = ee*(-1.5e0_rt*tf.t9i + 18.179_rt*tf.t9i2); + const number_t ee = 2.15e5_rt * tf.t9i32 * admath::exp(-18.179_rt*tf.t9i); - const amrex::Real term = cc + dd + ee; - const amrex::Real dtermdt = dcc + ddd + dee; + const number_t term = cc + dd + ee; // rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 8.84e9_rt * tf.t932 * std::exp(-22.553_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 22.553_rt*tf.t9i2); + const number_t rev = 8.84e9_rt * tf.t932 * admath::exp(-22.553_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt*term + rev*dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_n14pg(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_n14pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { - const amrex::Real q1 = 1.0e0_rt/10.850436e0_rt; + constexpr amrex::Real q1 = 1.0e0_rt/10.850436e0_rt; // n14(p,g)o15 - const amrex::Real aa = 4.90e7_rt * tf.t9i23 * std::exp(-15.228_rt*tf.t9i13 - tf.t92*q1); - const amrex::Real daa = aa*(-2.0_rt/3.0_rt*tf.t9i + 1.0_rt/3.0_rt*15.228_rt*tf.t9i43 - 2.0e0_rt*tf.t9*q1); - - const amrex::Real bb = 1.0e0_rt + 0.027_rt*tf.t913 - 0.778_rt*tf.t923 - 0.149_rt*tf.t9 + const number_t aa = 4.90e7_rt * tf.t9i23 * admath::exp(-15.228_rt*tf.t9i13 - tf.t92*q1); + const number_t bb = 1.0e0_rt + 0.027_rt*tf.t913 - 0.778_rt*tf.t923 - 0.149_rt*tf.t9 + 0.261_rt*tf.t943 + 0.127_rt*tf.t953; - const amrex::Real dbb = 1.0_rt/3.0_rt*0.027_rt*tf.t9i23 - 2.0_rt/3.0_rt*0.778_rt*tf.t9i13 - 0.149_rt - + 4.0_rt/3.0_rt*0.261_rt*tf.t913 + 5.0_rt/3.0_rt*0.127_rt*tf.t923; - - const amrex::Real cc = aa * bb; - const amrex::Real dcc = daa*bb + aa*dbb; + const number_t cc = aa * bb; - const amrex::Real dd = 2.37e3_rt * tf.t9i32 * std::exp(-3.011_rt*tf.t9i); - const amrex::Real ddd = dd*(-1.5e0_rt*tf.t9i + 3.011_rt*tf.t9i2); + const number_t dd = 2.37e3_rt * tf.t9i32 * admath::exp(-3.011_rt*tf.t9i); - const amrex::Real ee = 2.19e4_rt * std::exp(-12.530_rt*tf.t9i); - const amrex::Real dee = ee*12.530_rt*tf.t9i2; + const number_t ee = 2.19e4_rt * admath::exp(-12.530_rt*tf.t9i); - const amrex::Real term = cc + dd + ee; - const amrex::Real dtermdt = dcc + ddd + dee; + const number_t term = cc + dd + ee; // rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 2.70e10_rt * tf.t932 * std::exp(-84.678_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 84.678_rt*tf.t9i2); + const number_t rev = 2.70e10_rt * tf.t932 * admath::exp(-84.678_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt*term + rev*dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_n15pg(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_n15pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { - const amrex::Real q1 = 1.0_rt / 0.2025_rt; + constexpr amrex::Real q1 = 1.0_rt / 0.2025_rt; // n15(p,g)o16 - const amrex::Real aa = 9.78e8_rt * tf.t9i23 * std::exp(-15.251_rt*tf.t9i13 - tf.t92*q1); - const amrex::Real daa = aa*(-2.0_rt/3.0_rt*tf.t9i + 1.0_rt/3.0_rt*15.251_rt*tf.t9i43 - 2.0e0_rt*tf.t9*q1); - - const amrex::Real bb = 1.0e0_rt + 0.027_rt*tf.t913 + 0.219_rt*tf.t923 + 0.042_rt*tf.t9 + const number_t aa = 9.78e8_rt * tf.t9i23 * admath::exp(-15.251_rt*tf.t9i13 - tf.t92*q1); + const number_t bb = 1.0e0_rt + 0.027_rt*tf.t913 + 0.219_rt*tf.t923 + 0.042_rt*tf.t9 + 6.83_rt*tf.t943 + 3.32_rt*tf.t953; - const amrex::Real dbb = 1.0_rt/3.0_rt*0.027_rt*tf.t9i23 + 2.0_rt/3.0_rt*0.219_rt*tf.t9i13 + 0.042_rt - + 4.0_rt/3.0_rt*6.83_rt*tf.t913 + 5.0_rt/3.0_rt*3.32_rt*tf.t923; - - const amrex::Real cc = aa * bb; - const amrex::Real dcc = daa*bb + aa*dbb; + const number_t cc = aa * bb; - const amrex::Real dd = 1.11e4_rt*tf.t9i32*std::exp(-3.328_rt*tf.t9i); - const amrex::Real ddd = dd*(-1.5e0_rt*tf.t9i + 3.328_rt*tf.t9i2); + const number_t dd = 1.11e4_rt*tf.t9i32*admath::exp(-3.328_rt*tf.t9i); - const amrex::Real ee = 1.49e4_rt*tf.t9i32*std::exp(-4.665_rt*tf.t9i); - const amrex::Real dee = ee*(-1.5e0_rt*tf.t9i + 4.665_rt*tf.t9i2); + const number_t ee = 1.49e4_rt*tf.t9i32*admath::exp(-4.665_rt*tf.t9i); - const amrex::Real ff = 3.8e6_rt*tf.t9i32*std::exp(-11.048_rt*tf.t9i); - const amrex::Real dff = ff*(-1.5e0_rt*tf.t9i + 11.048_rt*tf.t9i2); + const number_t ff = 3.8e6_rt*tf.t9i32*admath::exp(-11.048_rt*tf.t9i); - const amrex::Real term = cc + dd + ee + ff; - const amrex::Real dtermdt = dcc + ddd + dee + dff; + const number_t term = cc + dd + ee + ff; // rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 3.62e10_rt * tf.t932 * std::exp(-140.734_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 140.734_rt*tf.t9i2); + const number_t rev = 3.62e10_rt * tf.t932 * admath::exp(-140.734_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt*term + rev*dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_n15pa(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_n15pa(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { - const amrex::Real theta = 0.1_rt; - const amrex::Real q1 = 1.0_rt / 0.272484_rt; + constexpr amrex::Real theta = 0.1_rt; + constexpr amrex::Real q1 = 1.0_rt / 0.272484_rt; // n15(p,a)c12 - const amrex::Real aa = 1.08e12_rt*tf.t9i23*std::exp(-15.251_rt*tf.t9i13 - tf.t92*q1); - const amrex::Real daa = aa*(-2.0_rt/3.0_rt*tf.t9i + 1.0_rt/3.0_rt*15.251_rt*tf.t9i43 - 2.0e0_rt*tf.t9*q1); - - const amrex::Real bb = 1.0e0_rt + 0.027_rt*tf.t913 + 2.62_rt*tf.t923 + 0.501_rt*tf.t9 + const number_t aa = 1.08e12_rt*tf.t9i23*admath::exp(-15.251_rt*tf.t9i13 - tf.t92*q1); + const number_t bb = 1.0e0_rt + 0.027_rt*tf.t913 + 2.62_rt*tf.t923 + 0.501_rt*tf.t9 + 5.36_rt*tf.t943 + 2.60_rt*tf.t953; - const amrex::Real dbb = 1.0_rt/3.0_rt*0.027_rt*tf.t9i23 + 2.0_rt/3.0_rt*2.62_rt*tf.t9i13 + 0.501_rt - + 4.0_rt/3.0_rt*5.36_rt*tf.t913 + 5.0_rt/3.0_rt*2.60_rt*tf.t923; + const number_t cc = aa * bb; - const amrex::Real cc = aa * bb; - const amrex::Real dcc = daa*bb + aa*dbb; + const number_t dd = 1.19e8_rt * tf.t9i32 * admath::exp(-3.676_rt*tf.t9i); - const amrex::Real dd = 1.19e8_rt * tf.t9i32 * std::exp(-3.676_rt*tf.t9i); - const amrex::Real ddd = dd*(-1.5e0_rt*tf.t9i + 3.676_rt*tf.t9i2); + const number_t ee = 5.41e8_rt * tf.t9i12 * admath::exp(-8.926_rt*tf.t9i); - const amrex::Real ee = 5.41e8_rt * tf.t9i12 * std::exp(-8.926_rt*tf.t9i); - const amrex::Real dee = ee*(-0.5e0_rt*tf.t9i + 8.926_rt*tf.t9i2); + const number_t ff = theta * 4.72e8_rt * tf.t9i32 * admath::exp(-7.721_rt*tf.t9i); - const amrex::Real ff = theta * 4.72e8_rt * tf.t9i32 * std::exp(-7.721_rt*tf.t9i); - const amrex::Real dff = ff*(-1.5e0_rt*tf.t9i + 7.721_rt*tf.t9i2); + const number_t gg = theta * 2.20e9_rt * tf.t9i32 * admath::exp(-11.418_rt*tf.t9i); - const amrex::Real gg = theta * 2.20e9_rt * tf.t9i32 * std::exp(-11.418_rt*tf.t9i); - const amrex::Real dgg = gg*(-1.5e0_rt*tf.t9i + 11.418_rt*tf.t9i2); - - const amrex::Real term = cc + dd + ee + ff + gg; - const amrex::Real dtermdt = dcc + ddd + dee + dff + dgg; + const number_t term = cc + dd + ee + ff + gg; // rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 7.06e-01_rt*std::exp(-57.625_rt*tf.t9i); - const amrex::Real drevdt = rev*57.625_rt*tf.t9i2; + const number_t rev = 7.06e-01_rt*admath::exp(-57.625_rt*tf.t9i); rr = den * rev * term; - drrdt = den * (drevdt*term + rev*dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_o16pg(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_o16pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // o16(p,g)f17 - const amrex::Real aa = std::exp(-0.728_rt*tf.t923); - const amrex::Real daa = -2.0_rt/3.0_rt*aa*0.728_rt*tf.t9i13; - - const amrex::Real bb = 1.0e0_rt + 2.13_rt * (1.0e0_rt - aa); - const amrex::Real dbb = -2.13_rt*daa; - - const amrex::Real cc = tf.t923 * bb; - const amrex::Real dcc = 2.0_rt/3.0_rt*cc*tf.t9i + tf.t923*dbb; - - const amrex::Real dd = std::exp(-16.692_rt*tf.t9i13); - const amrex::Real ddd = 1.0_rt/3.0_rt*dd*16.692_rt*tf.t9i43; - - const amrex::Real zz = 1.0e0_rt/cc; - const amrex::Real ee = dd*zz; - const amrex::Real dee = (ddd - ee*dcc)*zz; - - const amrex::Real term = 1.50e8_rt * ee; - const amrex::Real dtermdt = 1.50e8_rt * dee; + const number_t aa = admath::exp(-0.728_rt*tf.t923); + const number_t bb = 1.0e0_rt + 2.13_rt * (1.0e0_rt - aa); + const number_t cc = tf.t923 * bb; + const number_t dd = admath::exp(-16.692_rt*tf.t9i13); + const number_t zz = 1.0e0_rt/cc; + const number_t ee = dd*zz; + const number_t term = 1.50e8_rt * ee; // rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 3.03e9_rt*tf.t932*std::exp(-6.968_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 6.968_rt*tf.t9i2); + const number_t rev = 3.03e9_rt*tf.t932*admath::exp(-6.968_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt*term + rev*dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_n14ag(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_n14ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { - const amrex::Real q1 = 1.0e0_rt/0.776161e0_rt; + constexpr amrex::Real q1 = 1.0e0_rt/0.776161e0_rt; // n14(a,g)f18 - const amrex::Real aa = 7.78e9_rt * tf.t9i23 * std::exp(-36.031_rt*tf.t9i13- tf.t92*q1); - const amrex::Real daa = aa*(-2.0_rt/3.0_rt*tf.t9i + 1.0_rt/3.0_rt*36.031_rt*tf.t9i43 - 2.0e0_rt*tf.t9*q1); - - const amrex::Real bb = 1.0e0_rt + 0.012_rt*tf.t913 + 1.45_rt*tf.t923 + 0.117_rt*tf.t9 + const number_t aa = 7.78e9_rt * tf.t9i23 * admath::exp(-36.031_rt*tf.t9i13- tf.t92*q1); + const number_t bb = 1.0e0_rt + 0.012_rt*tf.t913 + 1.45_rt*tf.t923 + 0.117_rt*tf.t9 + 1.97_rt*tf.t943 + 0.406_rt*tf.t953; - const amrex::Real dbb = 1.0_rt/3.0_rt*0.012_rt*tf.t9i23 + 2.0_rt/3.0_rt*1.45_rt*tf.t9i13 + 0.117_rt - + 4.0_rt/3.0_rt*1.97_rt*tf.t913 + 5.0_rt/3.0_rt*0.406_rt*tf.t923; + const number_t cc = aa * bb; - const amrex::Real cc = aa * bb; - const amrex::Real dcc = daa*bb + aa*dbb; + const number_t dd = 2.36e-10_rt * tf.t9i32 * admath::exp(-2.798_rt*tf.t9i); - const amrex::Real dd = 2.36e-10_rt * tf.t9i32 * std::exp(-2.798_rt*tf.t9i); - const amrex::Real ddd = dd*(-1.5e0_rt*tf.t9i + 2.798_rt*tf.t9i2); + const number_t ee = 2.03_rt * tf.t9i32 * admath::exp(-5.054_rt*tf.t9i); - const amrex::Real ee = 2.03_rt * tf.t9i32 * std::exp(-5.054_rt*tf.t9i); - const amrex::Real dee = ee*(-1.5e0_rt*tf.t9i + 5.054_rt*tf.t9i2); + const number_t ff = 1.15e4_rt * tf.t9i23 * admath::exp(-12.310_rt*tf.t9i); - const amrex::Real ff = 1.15e4_rt * tf.t9i23 * std::exp(-12.310_rt*tf.t9i); - const amrex::Real dff = ff*(-2.0_rt/3.0_rt*tf.t9i + 12.310_rt*tf.t9i2); - - const amrex::Real term = cc + dd + ee + ff; - const amrex::Real dtermdt = dcc + ddd + dee + dff; + const number_t term = cc + dd + ee + ff; // rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 5.42e10_rt * tf.t932 * std::exp(-51.236_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 51.236_rt*tf.t9i2); + const number_t rev = 5.42e10_rt * tf.t932 * admath::exp(-51.236_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt*term + rev*dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_fe52ng(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_fe52ng(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // fe52(n,g)fe53 - const amrex::Real tq2 = tf.t9 - 0.348e0_rt; - const amrex::Real term = 9.604e5_rt * std::exp(-0.0626_rt*tq2); - const amrex::Real dtermdt = -term*0.0626_rt; + const number_t tq2 = tf.t9 - 0.348e0_rt; + const number_t term = 9.604e5_rt * admath::exp(-0.0626_rt*tq2); // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 2.43e9_rt * tf.t932 * std::exp(-123.951_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 123.951_rt*tf.t9i2); + const number_t rev = 2.43e9_rt * tf.t932 * admath::exp(-123.951_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_fe53ng(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_fe53ng(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // fe53(n,g)fe54 - const amrex::Real tq1 = tf.t9/0.348_rt; - const amrex::Real tq10 = std::pow(tq1, 0.10_rt); - const amrex::Real dtq10 = 0.1e0_rt*tq10/(0.348_rt*tq1); - const amrex::Real tq2 = tf.t9 - 0.348e0_rt; + const number_t tq1 = tf.t9/0.348_rt; + const number_t tq10 = admath::pow(tq1, 0.10_rt); + const number_t tq2 = tf.t9 - 0.348e0_rt; - const amrex::Real term = 1.817e6_rt * tq10 * std::exp(-0.06319_rt*tq2); - const amrex::Real dtermdt = term/tq10*dtq10 - term*0.06319_rt; + const number_t term = 1.817e6_rt * tq10 * admath::exp(-0.06319_rt*tq2); // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 1.56e11_rt * tf.t932 * std::exp(-155.284_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 155.284_rt*tf.t9i2); + const number_t rev = 1.56e11_rt * tf.t932 * admath::exp(-155.284_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_fe54ng(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_fe54ng(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // fe54(n,g)fe55 - const amrex::Real aa = 2.307390e1_rt - 7.931795e-02_rt * tf.t9i + 7.535681e0_rt * tf.t9i13 + const number_t aa = 2.307390e1_rt - 7.931795e-02_rt * tf.t9i + 7.535681e0_rt * tf.t9i13 - 1.595025e1_rt * tf.t913 + 1.377715e0_rt * tf.t9 - 1.291479e-01_rt * tf.t953 - + 6.707473e0_rt * std::log(tf.t9); - - const amrex::Real daa = 7.931795e-02_rt * tf.t9i2 - 1.0_rt/3.0_rt * 7.535681e0_rt * tf.t9i43 - - 1.0_rt/3.0_rt * 1.595025e1_rt *tf.t9i23 + 1.377715e0_rt - 5.0_rt/3.0_rt * 1.291479e-01_rt *tf.t923 - + 6.707473e0_rt * tf.t9i; + + 6.707473e0_rt * admath::log(tf.t9); - amrex::Real term, dtermdt; + number_t term; if (aa < 200.0_rt) { - term = std::exp(aa); - dtermdt = term*daa*1.0e-9_rt; + term = admath::exp(aa); } else { term = std::exp(200.0e0_rt); - dtermdt = 0.0e0_rt; } - const amrex::Real bb = 4.800293e9_rt * tf.t932 * std::exp(-1.078986e2_rt * tf.t9i); - const amrex::Real dbb = bb*(1.5e0_rt*tf.t9i + 1.078986e2_rt * tf.t9i2); + const number_t bb = 4.800293e9_rt * tf.t932 * admath::exp(-1.078986e2_rt * tf.t9i); // reverse rate rr = term*bb; - drrdt = dtermdt*bb + term*dbb*1.0e-9_rt; // forward rate fr = term*den; - dfrdt = dtermdt*den; } -AMREX_GPU_HOST_DEVICE inline -void rate_fe54pg(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_fe54pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // fe54(p,g)co55 - const amrex::Real z = amrex::min(tf.t9,10.0e0_rt); - const amrex::Real z2 = z*z; - const amrex::Real z3 = z2*z; - const amrex::Real aa = 1.0e0_rt + 9.593e-2_rt*z - 3.445e-3_rt*z2 + 8.594e-5_rt*z3; - const amrex::Real daa = (z == 10.0_rt) ? 0.0_rt : 9.593e-2_rt - 2.0e0_rt*3.445e-3_rt*tf.t9 + 3.0e0_rt*8.594e-5_rt*tf.t92; - // if (z == 10.0_rt) { - // daa = 0.0e0_rt - // } else { - // daa = 9.593e-2_rt - 2.0e0_rt*3.445e-3_rt*tf.t9 + 3.0e0_rt*8.594e-5_rt*tf.t92 - // } - - const amrex::Real term = 4.51e17_rt * tf.t9i23 * std::exp(-38.483_rt * tf.t9i13 * aa); - const amrex::Real dtermdt = term*(-2.0_rt/3.0_rt*tf.t9i + 38.483_rt*tf.t9i13*(1.0_rt/3.0_rt*tf.t9i*aa - daa)); + const number_t z = admath::min(10.0e0_rt,tf.t9); + const number_t z2 = z*z; + const number_t z3 = z2*z; + const number_t aa = 1.0e0_rt + 9.593e-2_rt*z - 3.445e-3_rt*z2 + 8.594e-5_rt*z3; + + const number_t term = 4.51e17_rt * tf.t9i23 * admath::exp(-38.483_rt * tf.t9i13 * aa); // the rates fr = den * term; - dfrdt = den * dtermdt * 1.0e-9_rt; - const amrex::Real rev = 2.400e9_rt * tf.t932 * std::exp(-58.605_rt*tf.t9i); - const amrex::Real drevdt = rev*(1.5e0_rt*tf.t9i + 58.605_rt*tf.t9i2); + const number_t rev = 2.400e9_rt * tf.t932 * admath::exp(-58.605_rt*tf.t9i); rr = rev * term; - drrdt = (drevdt * term + rev * dtermdt) * 1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_fe54ap(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_fe54ap(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // fe54(a,p)co57 - const amrex::Real aa = 3.97474900e1_rt - 6.06543100e0_rt * tf.t9i + 1.63239600e2_rt * tf.t9i13 + const number_t aa = 3.97474900e1_rt - 6.06543100e0_rt * tf.t9i + 1.63239600e2_rt * tf.t9i13 - 2.20457700e2_rt * tf.t913 + 8.63980400e0_rt * tf.t9 - 3.45841300e-01_rt * tf.t953 - + 1.31464200e2_rt * std::log(tf.t9); + + 1.31464200e2_rt * admath::log(tf.t9); - const amrex::Real daa = 6.06543100e0_rt * tf.t9i2 - 1.0_rt/3.0_rt * 1.63239600e2_rt * tf.t9i43 - - 1.0_rt/3.0_rt * 2.20457700e2_rt * tf.t9i23 + 8.63980400e0_rt - 5.0_rt/3.0_rt * 3.45841300e-01_rt * tf.t923 - + 1.31464200e2_rt * tf.t9i; - - amrex::Real term, dtermdt; + number_t term; if (aa < 200.0_rt) { - term = std::exp(aa); - dtermdt = term*daa*1.0e-9_rt; + term = admath::exp(aa); } else { term = std::exp(200.0e0_rt); - dtermdt = 0.0e0_rt; } - const amrex::Real bb = 2.16896000e0_rt * std::exp(-2.05631700e1_rt * tf.t9i); - const amrex::Real dbb = bb * 2.05631700e1_rt * tf.t9i2; + const number_t bb = 2.16896000e0_rt * admath::exp(-2.05631700e1_rt * tf.t9i); // reverse rate rr = term*den; - drrdt = dtermdt*den; // forward rate fr = rr*bb; - dfrdt = drrdt*bb + rr*dbb*1.0e-9_rt; } -AMREX_GPU_HOST_DEVICE inline -void rate_fe55ng(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_fe55ng(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // fe55(n,g)fe56 - const amrex::Real aa = 1.954115e1_rt - 6.834029e-02_rt * tf.t9i + 5.379859e0_rt * tf.t9i13 + const number_t aa = 1.954115e1_rt - 6.834029e-02_rt * tf.t9i + 5.379859e0_rt * tf.t9i13 - 8.758150e0_rt * tf.t913 + 5.285107e-01_rt * tf.t9 - 4.973739e-02_rt * tf.t953 - + 4.065564e0_rt * std::log(tf.t9); - - const amrex::Real daa = 6.834029e-02_rt * tf.t9i2 - 1.0_rt/3.0_rt * 5.379859e0_rt * tf.t9i43 - - 1.0_rt/3.0_rt * 8.758150e0_rt * tf.t9i23 + 5.285107e-01_rt - 5.0_rt/3.0_rt * 4.973739e-02_rt *tf.t923 - + 4.065564e0_rt * tf.t9i; + + 4.065564e0_rt * admath::log(tf.t9); - amrex::Real term, dtermdt; + number_t term; if (aa < 200.0_rt) { - term = std::exp(aa); - dtermdt = term*daa*1.0e-9_rt; + term = admath::exp(aa); } else { term = std::exp(200.0e0_rt); - dtermdt = 0.0e0_rt; } - const amrex::Real bb = 7.684279e10_rt * tf.t932 * std::exp(-1.299472e2_rt * tf.t9i); - const amrex::Real dbb = bb*(1.5e0_rt*tf.t9i + 1.299472e2_rt * tf.t9i2); + const number_t bb = 7.684279e10_rt * tf.t932 * admath::exp(-1.299472e2_rt * tf.t9i); // reverse rate rr = term*bb; - drrdt = dtermdt*bb + term*dbb*1.0e-9_rt; // forward rate fr = term*den; - dfrdt = dtermdt*den; } -AMREX_GPU_HOST_DEVICE inline -void rate_fe56pg(const tf_t& tf, const amrex::Real den, amrex::Real& fr, - amrex::Real& dfrdt, amrex::Real& rr, - amrex::Real& drrdt) +template +AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline +void rate_fe56pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // fe56(p,g)co57 - const amrex::Real aa = 1.755960e2_rt - 7.018872e0_rt * tf.t9i + 2.800131e2_rt * tf.t9i13 + const auto aa = 1.755960e2_rt - 7.018872e0_rt * tf.t9i + 2.800131e2_rt * tf.t9i13 - 4.749343e2_rt * tf.t913 + 2.683860e1_rt * tf.t9 - 1.542324e0_rt * tf.t953 - + 2.315911e2_rt * std::log(tf.t9); - - const amrex::Real daa = 7.018872e0_rt * tf.t9i2 - 1.0_rt/3.0_rt * 2.800131e2_rt * tf.t9i43 - - 1.0_rt/3.0_rt * 4.749343e2_rt * tf.t9i23 + 2.683860e1_rt - 5.0_rt/3.0_rt * 1.542324e0_rt *tf.t923 - + 2.315911e2_rt * tf.t9i; + + 2.315911e2_rt * admath::log(tf.t9); - amrex::Real term, dtermdt; + number_t term; if (aa < 200.0_rt) { - term = std::exp(aa); - dtermdt = term*daa*1.0e-9_rt; + term = admath::exp(aa); } else { term = std::exp(200.0e0_rt); - dtermdt = 0.0e0_rt; } - const amrex::Real bb = 2.402486e9_rt * tf.t932 * std::exp(-6.995192e1_rt * tf.t9i); - const amrex::Real dbb = bb*(1.5e0_rt*tf.t9i + 6.995192e1_rt * tf.t9i2); + const number_t bb = 2.402486e9_rt * tf.t932 * admath::exp(-6.995192e1_rt * tf.t9i); // reverse rate rr = term*bb; - drrdt = dtermdt*bb + term*dbb*1.0e-9_rt; // forward rate fr = term*den; - dfrdt = dtermdt*den; } @@ -2061,16 +1382,16 @@ void ecapnuc(const amrex::Real etakep, const amrex::Real temp, amrex::Real& rpen, amrex::Real& rnep, amrex::Real& spenc, amrex::Real& snepc) { - const amrex::Real qn1 = -2.0716446e-06_rt; - const amrex::Real ftinv = 1.0e0_rt/1083.9269e0_rt; - const amrex::Real twoln = 0.6931472e0_rt; - const amrex::Real cmk5 = 1.3635675e-49_rt; - const amrex::Real cmk6 = 2.2993864e-59_rt; - const amrex::Real bk = 1.38062e-16_rt; - const amrex::Real qn2 = 2.0716446e-06_rt; - const amrex::Real c2me = 8.1872665e-07_rt; - const amrex::Real pi = 3.1415927e0_rt; - const amrex::Real pi2 = pi * pi; + constexpr amrex::Real qn1 = -2.0716446e-06_rt; + constexpr amrex::Real ftinv = 1.0e0_rt/1083.9269e0_rt; + constexpr amrex::Real twoln = 0.6931472e0_rt; + constexpr amrex::Real cmk5 = 1.3635675e-49_rt; + constexpr amrex::Real cmk6 = 2.2993864e-59_rt; + constexpr amrex::Real bk = 1.38062e-16_rt; + constexpr amrex::Real qn2 = 2.0716446e-06_rt; + constexpr amrex::Real c2me = 8.1872665e-07_rt; + constexpr amrex::Real pi = 3.1415927e0_rt; + constexpr amrex::Real pi2 = pi * pi; // c2me is the constant used to convert the neutrino energy // loss rate from mec2/s (as in the paper) to ergs/particle/sec. diff --git a/unit_test/burn_cell/ci-benchmarks/chamulak_VODE_unit_test.out b/unit_test/burn_cell/ci-benchmarks/chamulak_VODE_unit_test.out index 8de1d8384c..2f73a7431c 100644 --- a/unit_test/burn_cell/ci-benchmarks/chamulak_VODE_unit_test.out +++ b/unit_test/burn_cell/ci-benchmarks/chamulak_VODE_unit_test.out @@ -13,21 +13,21 @@ RHS at t = 0 ash 0.01230280576 ------------------------------------ successful? 1 - - Hnuc = 5.277406331e+17 - - added e = 8.364689034e+15 - - final T = 1433713030 + - Hnuc = 5.277400893e+17 + - added e = 8.364680415e+15 + - final T = 1433712612 ------------------------------------ e initial = 1.253426044e+18 -e final = 1.261790733e+18 +e final = 1.261790725e+18 ------------------------------------ new mass fractions: -C12 0.9657894806 +C12 0.9657895158 O16 1e-30 -ash 0.03421051942 +ash 0.03421048417 ------------------------------------ species creation rates: -omegadot(C12): -2.158392392 +omegadot(C12): -2.158390168 omegadot(O16): 8.840999775e-44 -omegadot(ash): 2.158392392 +omegadot(ash): 2.158390168 number of steps taken: 381 AMReX (24.07-16-gdcb9cc0383dc) finalized diff --git a/unit_test/test_aprox_rates/aprox_rates_util.cpp b/unit_test/test_aprox_rates/aprox_rates_util.cpp index d6c094a4a0..65c0dfe2d8 100644 --- a/unit_test/test_aprox_rates/aprox_rates_util.cpp +++ b/unit_test/test_aprox_rates/aprox_rates_util.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include @@ -28,8 +29,9 @@ void aprox_rates_test(const Box& bx, eos_extra_t eos_state; - amrex::Real temp_zone = std::pow(10.0_rt, std::log10(temp_min) + static_cast(j)*dlogT); - eos_state.T = temp_zone; + autodiff::dual temp_zone = std::pow(10.0_rt, std::log10(temp_min) + static_cast(j)*dlogT); + autodiff::seed(temp_zone); + eos_state.T = autodiff::val(temp_zone); amrex::Real dens_zone = std::pow(10.0, std::log10(dens_min) + static_cast(i)*dlogrho); eos_state.rho = dens_zone; @@ -48,374 +50,373 @@ void aprox_rates_test(const Box& bx, // store state sp(i, j, k, vars.irho) = dens_zone; - sp(i, j, k, vars.itemp) = temp_zone; + sp(i, j, k, vars.itemp) = autodiff::val(temp_zone); sp(i, j, k, vars.ini56) = ni56; - amrex::Real fr; - amrex::Real dfrdt; - amrex::Real rr; - amrex::Real drrdt; + autodiff::dual fr; + autodiff::dual rr; - rate_c12ag(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_c12ag(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ic12ag) = fr; - sp(i, j, k, vars.ic12ag+1) = dfrdt; - sp(i, j, k, vars.ic12ag+2) = rr; - sp(i, j, k, vars.ic12ag+3) = drrdt; + sp(i, j, k, vars.ic12ag) = autodiff::val(fr); + sp(i, j, k, vars.ic12ag+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ic12ag+2) = autodiff::val(rr); + sp(i, j, k, vars.ic12ag+3) = autodiff::derivative(rr); - rate_triplealf(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_triplealf(tf, dens_zone, fr, rr); - sp(i, j, k, vars.itriplealf) = fr; - sp(i, j, k, vars.itriplealf+1) = dfrdt; - sp(i, j, k, vars.itriplealf+2) = rr; - sp(i, j, k, vars.itriplealf+3) = drrdt; + sp(i, j, k, vars.itriplealf) = autodiff::val(fr); + sp(i, j, k, vars.itriplealf+1) = autodiff::derivative(fr); + sp(i, j, k, vars.itriplealf+2) = autodiff::val(rr); + sp(i, j, k, vars.itriplealf+3) = autodiff::derivative(rr); - rate_c12c12(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_c12c12(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ic12c12) = fr; - sp(i, j, k, vars.ic12c12+1) = dfrdt; - sp(i, j, k, vars.ic12c12+2) = rr; - sp(i, j, k, vars.ic12c12+3) = drrdt; + sp(i, j, k, vars.ic12c12) = autodiff::val(fr); + sp(i, j, k, vars.ic12c12+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ic12c12+2) = autodiff::val(rr); + sp(i, j, k, vars.ic12c12+3) = autodiff::derivative(rr); - rate_c12o16(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_c12o16(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ic12o16) = fr; - sp(i, j, k, vars.ic12o16+1) = dfrdt; - sp(i, j, k, vars.ic12o16+2) = rr; - sp(i, j, k, vars.ic12o16+3) = drrdt; + sp(i, j, k, vars.ic12o16) = autodiff::val(fr); + sp(i, j, k, vars.ic12o16+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ic12o16+2) = autodiff::val(rr); + sp(i, j, k, vars.ic12o16+3) = autodiff::derivative(rr); - rate_o16o16(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_o16o16(tf, dens_zone, fr, rr); - sp(i, j, k, vars.io16o16) = fr; - sp(i, j, k, vars.io16o16+1) = dfrdt; - sp(i, j, k, vars.io16o16+2) = rr; - sp(i, j, k, vars.io16o16+3) = drrdt; + sp(i, j, k, vars.io16o16) = autodiff::val(fr); + sp(i, j, k, vars.io16o16+1) = autodiff::derivative(fr); + sp(i, j, k, vars.io16o16+2) = autodiff::val(rr); + sp(i, j, k, vars.io16o16+3) = autodiff::derivative(rr); - rate_o16ag(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_o16ag(tf, dens_zone, fr, rr); - sp(i, j, k, vars.io16ag) = fr; - sp(i, j, k, vars.io16ag+1) = dfrdt; - sp(i, j, k, vars.io16ag+2) = rr; - sp(i, j, k, vars.io16ag+3) = drrdt; + sp(i, j, k, vars.io16ag) = autodiff::val(fr); + sp(i, j, k, vars.io16ag+1) = autodiff::derivative(fr); + sp(i, j, k, vars.io16ag+2) = autodiff::val(rr); + sp(i, j, k, vars.io16ag+3) = autodiff::derivative(rr); - rate_ne20ag(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_ne20ag(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ine20ag) = fr; - sp(i, j, k, vars.ine20ag+1) = dfrdt; - sp(i, j, k, vars.ine20ag+2) = rr; - sp(i, j, k, vars.ine20ag+3) = drrdt; + sp(i, j, k, vars.ine20ag) = autodiff::val(fr); + sp(i, j, k, vars.ine20ag+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ine20ag+2) = autodiff::val(rr); + sp(i, j, k, vars.ine20ag+3) = autodiff::derivative(rr); - rate_mg24ag(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_mg24ag(tf, dens_zone, fr, rr); - sp(i, j, k, vars.img24ag) = fr; - sp(i, j, k, vars.img24ag+1) = dfrdt; - sp(i, j, k, vars.img24ag+2) = rr; - sp(i, j, k, vars.img24ag+3) = drrdt; + sp(i, j, k, vars.img24ag) = autodiff::val(fr); + sp(i, j, k, vars.img24ag+1) = autodiff::derivative(fr); + sp(i, j, k, vars.img24ag+2) = autodiff::val(rr); + sp(i, j, k, vars.img24ag+3) = autodiff::derivative(rr); - rate_mg24ap(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_mg24ap(tf, dens_zone, fr, rr); - sp(i, j, k, vars.img24ap) = fr; - sp(i, j, k, vars.img24ap+1) = dfrdt; - sp(i, j, k, vars.img24ap+2) = rr; - sp(i, j, k, vars.img24ap+3) = drrdt; + sp(i, j, k, vars.img24ap) = autodiff::val(fr); + sp(i, j, k, vars.img24ap+1) = autodiff::derivative(fr); + sp(i, j, k, vars.img24ap+2) = autodiff::val(rr); + sp(i, j, k, vars.img24ap+3) = autodiff::derivative(rr); - rate_al27pg(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_al27pg(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ial27pg) = fr; - sp(i, j, k, vars.ial27pg+1) = dfrdt; - sp(i, j, k, vars.ial27pg+2) = rr; - sp(i, j, k, vars.ial27pg+3) = drrdt; + sp(i, j, k, vars.ial27pg) = autodiff::val(fr); + sp(i, j, k, vars.ial27pg+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ial27pg+2) = autodiff::val(rr); + sp(i, j, k, vars.ial27pg+3) = autodiff::derivative(rr); - rate_al27pg_old(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_al27pg_old(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ial27pg_old) = fr; - sp(i, j, k, vars.ial27pg_old+1) = dfrdt; - sp(i, j, k, vars.ial27pg_old+2) = rr; - sp(i, j, k, vars.ial27pg_old+3) = drrdt; + sp(i, j, k, vars.ial27pg_old) = autodiff::val(fr); + sp(i, j, k, vars.ial27pg_old+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ial27pg_old+2) = autodiff::val(rr); + sp(i, j, k, vars.ial27pg_old+3) = autodiff::derivative(rr); - rate_si28ag(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_si28ag(tf, dens_zone, fr, rr); - sp(i, j, k, vars.isi28ag) = fr; - sp(i, j, k, vars.isi28ag+1) = dfrdt; - sp(i, j, k, vars.isi28ag+2) = rr; - sp(i, j, k, vars.isi28ag+3) = drrdt; + sp(i, j, k, vars.isi28ag) = autodiff::val(fr); + sp(i, j, k, vars.isi28ag+1) = autodiff::derivative(fr); + sp(i, j, k, vars.isi28ag+2) = autodiff::val(rr); + sp(i, j, k, vars.isi28ag+3) = autodiff::derivative(rr); - rate_si28ap(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_si28ap(tf, dens_zone, fr, rr); - sp(i, j, k, vars.isi28ap) = fr; - sp(i, j, k, vars.isi28ap+1) = dfrdt; - sp(i, j, k, vars.isi28ap+2) = rr; - sp(i, j, k, vars.isi28ap+3) = drrdt; + sp(i, j, k, vars.isi28ap) = autodiff::val(fr); + sp(i, j, k, vars.isi28ap+1) = autodiff::derivative(fr); + sp(i, j, k, vars.isi28ap+2) = autodiff::val(rr); + sp(i, j, k, vars.isi28ap+3) = autodiff::derivative(rr); - rate_p31pg(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_p31pg(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ip31pg) = fr; - sp(i, j, k, vars.ip31pg+1) = dfrdt; - sp(i, j, k, vars.ip31pg+2) = rr; - sp(i, j, k, vars.ip31pg+3) = drrdt; + sp(i, j, k, vars.ip31pg) = autodiff::val(fr); + sp(i, j, k, vars.ip31pg+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ip31pg+2) = autodiff::val(rr); + sp(i, j, k, vars.ip31pg+3) = autodiff::derivative(rr); - rate_s32ag(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_s32ag(tf, dens_zone, fr, rr); - sp(i, j, k, vars.is32ag) = fr; - sp(i, j, k, vars.is32ag+1) = dfrdt; - sp(i, j, k, vars.is32ag+2) = rr; - sp(i, j, k, vars.is32ag+3) = drrdt; + sp(i, j, k, vars.is32ag) = autodiff::val(fr); + sp(i, j, k, vars.is32ag+1) = autodiff::derivative(fr); + sp(i, j, k, vars.is32ag+2) = autodiff::val(rr); + sp(i, j, k, vars.is32ag+3) = autodiff::derivative(rr); - rate_s32ap(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_s32ap(tf, dens_zone, fr, rr); - sp(i, j, k, vars.is32ap) = fr; - sp(i, j, k, vars.is32ap+1) = dfrdt; - sp(i, j, k, vars.is32ap+2) = rr; - sp(i, j, k, vars.is32ap+3) = drrdt; + sp(i, j, k, vars.is32ap) = autodiff::val(fr); + sp(i, j, k, vars.is32ap+1) = autodiff::derivative(fr); + sp(i, j, k, vars.is32ap+2) = autodiff::val(rr); + sp(i, j, k, vars.is32ap+3) = autodiff::derivative(rr); - rate_cl35pg(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_cl35pg(tf, dens_zone, fr, rr); - sp(i, j, k, vars.icl35pg) = fr; - sp(i, j, k, vars.icl35pg+1) = dfrdt; - sp(i, j, k, vars.icl35pg+2) = rr; - sp(i, j, k, vars.icl35pg+3) = drrdt; + sp(i, j, k, vars.icl35pg) = autodiff::val(fr); + sp(i, j, k, vars.icl35pg+1) = autodiff::derivative(fr); + sp(i, j, k, vars.icl35pg+2) = autodiff::val(rr); + sp(i, j, k, vars.icl35pg+3) = autodiff::derivative(rr); - rate_ar36ag(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_ar36ag(tf, dens_zone, fr, rr); - sp(i, j, k, vars.iar36ag) = fr; - sp(i, j, k, vars.iar36ag+1) = dfrdt; - sp(i, j, k, vars.iar36ag+2) = rr; - sp(i, j, k, vars.iar36ag+3) = drrdt; + sp(i, j, k, vars.iar36ag) = autodiff::val(fr); + sp(i, j, k, vars.iar36ag+1) = autodiff::derivative(fr); + sp(i, j, k, vars.iar36ag+2) = autodiff::val(rr); + sp(i, j, k, vars.iar36ag+3) = autodiff::derivative(rr); - rate_ar36ap(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_ar36ap(tf, dens_zone, fr, rr); - sp(i, j, k, vars.iar36ap) = fr; - sp(i, j, k, vars.iar36ap+1) = dfrdt; - sp(i, j, k, vars.iar36ap+2) = rr; - sp(i, j, k, vars.iar36ap+3) = drrdt; + sp(i, j, k, vars.iar36ap) = autodiff::val(fr); + sp(i, j, k, vars.iar36ap+1) = autodiff::derivative(fr); + sp(i, j, k, vars.iar36ap+2) = autodiff::val(rr); + sp(i, j, k, vars.iar36ap+3) = autodiff::derivative(rr); - rate_k39pg(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_k39pg(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ik39pg) = fr; - sp(i, j, k, vars.ik39pg+1) = dfrdt; - sp(i, j, k, vars.ik39pg+2) = rr; - sp(i, j, k, vars.ik39pg+3) = drrdt; + sp(i, j, k, vars.ik39pg) = autodiff::val(fr); + sp(i, j, k, vars.ik39pg+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ik39pg+2) = autodiff::val(rr); + sp(i, j, k, vars.ik39pg+3) = autodiff::derivative(rr); - rate_ca40ag(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_ca40ag(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ica40ag) = fr; - sp(i, j, k, vars.ica40ag+1) = dfrdt; - sp(i, j, k, vars.ica40ag+2) = rr; - sp(i, j, k, vars.ica40ag+3) = drrdt; + sp(i, j, k, vars.ica40ag) = autodiff::val(fr); + sp(i, j, k, vars.ica40ag+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ica40ag+2) = autodiff::val(rr); + sp(i, j, k, vars.ica40ag+3) = autodiff::derivative(rr); - rate_ca40ap(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_ca40ap(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ica40ap) = fr; - sp(i, j, k, vars.ica40ap+1) = dfrdt; - sp(i, j, k, vars.ica40ap+2) = rr; - sp(i, j, k, vars.ica40ap+3) = drrdt; + sp(i, j, k, vars.ica40ap) = autodiff::val(fr); + sp(i, j, k, vars.ica40ap+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ica40ap+2) = autodiff::val(rr); + sp(i, j, k, vars.ica40ap+3) = autodiff::derivative(rr); - rate_sc43pg(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_sc43pg(tf, dens_zone, fr, rr); - sp(i, j, k, vars.isc43pg) = fr; - sp(i, j, k, vars.isc43pg+1) = dfrdt; - sp(i, j, k, vars.isc43pg+2) = rr; - sp(i, j, k, vars.isc43pg+3) = drrdt; + sp(i, j, k, vars.isc43pg) = autodiff::val(fr); + sp(i, j, k, vars.isc43pg+1) = autodiff::derivative(fr); + sp(i, j, k, vars.isc43pg+2) = autodiff::val(rr); + sp(i, j, k, vars.isc43pg+3) = autodiff::derivative(rr); - rate_ti44ag(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_ti44ag(tf, dens_zone, fr, rr); - sp(i, j, k, vars.iti44ag) = fr; - sp(i, j, k, vars.iti44ag+1) = dfrdt; - sp(i, j, k, vars.iti44ag+2) = rr; - sp(i, j, k, vars.iti44ag+3) = drrdt; + sp(i, j, k, vars.iti44ag) = autodiff::val(fr); + sp(i, j, k, vars.iti44ag+1) = autodiff::derivative(fr); + sp(i, j, k, vars.iti44ag+2) = autodiff::val(rr); + sp(i, j, k, vars.iti44ag+3) = autodiff::derivative(rr); - rate_ti44ap(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_ti44ap(tf, dens_zone, fr, rr); - sp(i, j, k, vars.iti44ap) = fr; - sp(i, j, k, vars.iti44ap+1) = dfrdt; - sp(i, j, k, vars.iti44ap+2) = rr; - sp(i, j, k, vars.iti44ap+3) = drrdt; + sp(i, j, k, vars.iti44ap) = autodiff::val(fr); + sp(i, j, k, vars.iti44ap+1) = autodiff::derivative(fr); + sp(i, j, k, vars.iti44ap+2) = autodiff::val(rr); + sp(i, j, k, vars.iti44ap+3) = autodiff::derivative(rr); - rate_v47pg(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_v47pg(tf, dens_zone, fr, rr); - sp(i, j, k, vars.iv47pg) = fr; - sp(i, j, k, vars.iv47pg+1) = dfrdt; - sp(i, j, k, vars.iv47pg+2) = rr; - sp(i, j, k, vars.iv47pg+3) = drrdt; + sp(i, j, k, vars.iv47pg) = autodiff::val(fr); + sp(i, j, k, vars.iv47pg+1) = autodiff::derivative(fr); + sp(i, j, k, vars.iv47pg+2) = autodiff::val(rr); + sp(i, j, k, vars.iv47pg+3) = autodiff::derivative(rr); - rate_cr48ag(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_cr48ag(tf, dens_zone, fr, rr); - sp(i, j, k, vars.icr48ag) = fr; - sp(i, j, k, vars.icr48ag+1) = dfrdt; - sp(i, j, k, vars.icr48ag+2) = rr; - sp(i, j, k, vars.icr48ag+3) = drrdt; + sp(i, j, k, vars.icr48ag) = autodiff::val(fr); + sp(i, j, k, vars.icr48ag+1) = autodiff::derivative(fr); + sp(i, j, k, vars.icr48ag+2) = autodiff::val(rr); + sp(i, j, k, vars.icr48ag+3) = autodiff::derivative(rr); - rate_cr48ap(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_cr48ap(tf, dens_zone, fr, rr); - sp(i, j, k, vars.icr48ap) = fr; - sp(i, j, k, vars.icr48ap+1) = dfrdt; - sp(i, j, k, vars.icr48ap+2) = rr; - sp(i, j, k, vars.icr48ap+3) = drrdt; + sp(i, j, k, vars.icr48ap) = autodiff::val(fr); + sp(i, j, k, vars.icr48ap+1) = autodiff::derivative(fr); + sp(i, j, k, vars.icr48ap+2) = autodiff::val(rr); + sp(i, j, k, vars.icr48ap+3) = autodiff::derivative(rr); - rate_mn51pg(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_mn51pg(tf, dens_zone, fr, rr); - sp(i, j, k, vars.imn51pg) = fr; - sp(i, j, k, vars.imn51pg+1) = dfrdt; - sp(i, j, k, vars.imn51pg+2) = rr; - sp(i, j, k, vars.imn51pg+3) = drrdt; + sp(i, j, k, vars.imn51pg) = autodiff::val(fr); + sp(i, j, k, vars.imn51pg+1) = autodiff::derivative(fr); + sp(i, j, k, vars.imn51pg+2) = autodiff::val(rr); + sp(i, j, k, vars.imn51pg+3) = autodiff::derivative(rr); - rate_fe52ag(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_fe52ag(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ife52ag) = fr; - sp(i, j, k, vars.ife52ag+1) = dfrdt; - sp(i, j, k, vars.ife52ag+2) = rr; - sp(i, j, k, vars.ife52ag+3) = drrdt; + sp(i, j, k, vars.ife52ag) = autodiff::val(fr); + sp(i, j, k, vars.ife52ag+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ife52ag+2) = autodiff::val(rr); + sp(i, j, k, vars.ife52ag+3) = autodiff::derivative(rr); - rate_fe52ap(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_fe52ap(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ife52ap) = fr; - sp(i, j, k, vars.ife52ap+1) = dfrdt; - sp(i, j, k, vars.ife52ap+2) = rr; - sp(i, j, k, vars.ife52ap+3) = drrdt; + sp(i, j, k, vars.ife52ap) = autodiff::val(fr); + sp(i, j, k, vars.ife52ap+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ife52ap+2) = autodiff::val(rr); + sp(i, j, k, vars.ife52ap+3) = autodiff::derivative(rr); - rate_co55pg(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_co55pg(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ico55pg) = fr; - sp(i, j, k, vars.ico55pg+1) = dfrdt; - sp(i, j, k, vars.ico55pg+2) = rr; - sp(i, j, k, vars.ico55pg+3) = drrdt; + sp(i, j, k, vars.ico55pg) = autodiff::val(fr); + sp(i, j, k, vars.ico55pg+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ico55pg+2) = autodiff::val(rr); + sp(i, j, k, vars.ico55pg+3) = autodiff::derivative(rr); - rate_pp(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_pp(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ipp) = fr; - sp(i, j, k, vars.ipp+1) = dfrdt; - sp(i, j, k, vars.ipp+2) = rr; - sp(i, j, k, vars.ipp+3) = drrdt; + sp(i, j, k, vars.ipp) = autodiff::val(fr); + sp(i, j, k, vars.ipp+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ipp+2) = autodiff::val(rr); + sp(i, j, k, vars.ipp+3) = autodiff::derivative(rr); - rate_png(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_png(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ipng) = fr; - sp(i, j, k, vars.ipng+1) = dfrdt; - sp(i, j, k, vars.ipng+2) = rr; - sp(i, j, k, vars.ipng+3) = drrdt; + sp(i, j, k, vars.ipng) = autodiff::val(fr); + sp(i, j, k, vars.ipng+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ipng+2) = autodiff::val(rr); + sp(i, j, k, vars.ipng+3) = autodiff::derivative(rr); - rate_dpg(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_dpg(tf, dens_zone, fr, rr); - sp(i, j, k, vars.idpg) = fr; - sp(i, j, k, vars.idpg+1) = dfrdt; - sp(i, j, k, vars.idpg+2) = rr; - sp(i, j, k, vars.idpg+3) = drrdt; + sp(i, j, k, vars.idpg) = autodiff::val(fr); + sp(i, j, k, vars.idpg+1) = autodiff::derivative(fr); + sp(i, j, k, vars.idpg+2) = autodiff::val(rr); + sp(i, j, k, vars.idpg+3) = autodiff::derivative(rr); - rate_he3ng(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_he3ng(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ihe3ng) = fr; - sp(i, j, k, vars.ihe3ng+1) = dfrdt; - sp(i, j, k, vars.ihe3ng+2) = rr; - sp(i, j, k, vars.ihe3ng+3) = drrdt; + sp(i, j, k, vars.ihe3ng) = autodiff::val(fr); + sp(i, j, k, vars.ihe3ng+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ihe3ng+2) = autodiff::val(rr); + sp(i, j, k, vars.ihe3ng+3) = autodiff::derivative(rr); - rate_he3he3(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_he3he3(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ihe3he3) = fr; - sp(i, j, k, vars.ihe3he3+1) = dfrdt; - sp(i, j, k, vars.ihe3he3+2) = rr; - sp(i, j, k, vars.ihe3he3+3) = drrdt; + sp(i, j, k, vars.ihe3he3) = autodiff::val(fr); + sp(i, j, k, vars.ihe3he3+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ihe3he3+2) = autodiff::val(rr); + sp(i, j, k, vars.ihe3he3+3) = autodiff::derivative(rr); - rate_he3he4(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_he3he4(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ihe3he4) = fr; - sp(i, j, k, vars.ihe3he4+1) = dfrdt; - sp(i, j, k, vars.ihe3he4+2) = rr; - sp(i, j, k, vars.ihe3he4+3) = drrdt; + sp(i, j, k, vars.ihe3he4) = autodiff::val(fr); + sp(i, j, k, vars.ihe3he4+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ihe3he4+2) = autodiff::val(rr); + sp(i, j, k, vars.ihe3he4+3) = autodiff::derivative(rr); - rate_c12pg(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_c12pg(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ic12pg) = fr; - sp(i, j, k, vars.ic12pg+1) = dfrdt; - sp(i, j, k, vars.ic12pg+2) = rr; - sp(i, j, k, vars.ic12pg+3) = drrdt; + sp(i, j, k, vars.ic12pg) = autodiff::val(fr); + sp(i, j, k, vars.ic12pg+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ic12pg+2) = autodiff::val(rr); + sp(i, j, k, vars.ic12pg+3) = autodiff::derivative(rr); - rate_n14pg(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_n14pg(tf, dens_zone, fr, rr); - sp(i, j, k, vars.in14pg) = fr; - sp(i, j, k, vars.in14pg+1) = dfrdt; - sp(i, j, k, vars.in14pg+2) = rr; - sp(i, j, k, vars.in14pg+3) = drrdt; + sp(i, j, k, vars.in14pg) = autodiff::val(fr); + sp(i, j, k, vars.in14pg+1) = autodiff::derivative(fr); + sp(i, j, k, vars.in14pg+2) = autodiff::val(rr); + sp(i, j, k, vars.in14pg+3) = autodiff::derivative(rr); - rate_n15pg(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_n15pg(tf, dens_zone, fr, rr); - sp(i, j, k, vars.in15pg) = fr; - sp(i, j, k, vars.in15pg+1) = dfrdt; - sp(i, j, k, vars.in15pg+2) = rr; - sp(i, j, k, vars.in15pg+3) = drrdt; + sp(i, j, k, vars.in15pg) = autodiff::val(fr); + sp(i, j, k, vars.in15pg+1) = autodiff::derivative(fr); + sp(i, j, k, vars.in15pg+2) = autodiff::val(rr); + sp(i, j, k, vars.in15pg+3) = autodiff::derivative(rr); - rate_n15pa(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_n15pa(tf, dens_zone, fr, rr); - sp(i, j, k, vars.in15pa) = fr; - sp(i, j, k, vars.in15pa+1) = dfrdt; - sp(i, j, k, vars.in15pa+2) = rr; - sp(i, j, k, vars.in15pa+3) = drrdt; + sp(i, j, k, vars.in15pa) = autodiff::val(fr); + sp(i, j, k, vars.in15pa+1) = autodiff::derivative(fr); + sp(i, j, k, vars.in15pa+2) = autodiff::val(rr); + sp(i, j, k, vars.in15pa+3) = autodiff::derivative(rr); - rate_o16pg(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_o16pg(tf, dens_zone, fr, rr); - sp(i, j, k, vars.io16pg) = fr; - sp(i, j, k, vars.io16pg+1) = dfrdt; - sp(i, j, k, vars.io16pg+2) = rr; - sp(i, j, k, vars.io16pg+3) = drrdt; + sp(i, j, k, vars.io16pg) = autodiff::val(fr); + sp(i, j, k, vars.io16pg+1) = autodiff::derivative(fr); + sp(i, j, k, vars.io16pg+2) = autodiff::val(rr); + sp(i, j, k, vars.io16pg+3) = autodiff::derivative(rr); - rate_n14ag(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_n14ag(tf, dens_zone, fr, rr); - sp(i, j, k, vars.in14ag) = fr; - sp(i, j, k, vars.in14ag+1) = dfrdt; - sp(i, j, k, vars.in14ag+2) = rr; - sp(i, j, k, vars.in14ag+3) = drrdt; + sp(i, j, k, vars.in14ag) = autodiff::val(fr); + sp(i, j, k, vars.in14ag+1) = autodiff::derivative(fr); + sp(i, j, k, vars.in14ag+2) = autodiff::val(rr); + sp(i, j, k, vars.in14ag+3) = autodiff::derivative(rr); - rate_fe52ng(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_fe52ng(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ife52ng) = fr; - sp(i, j, k, vars.ife52ng+1) = dfrdt; - sp(i, j, k, vars.ife52ng+2) = rr; - sp(i, j, k, vars.ife52ng+3) = drrdt; + sp(i, j, k, vars.ife52ng) = autodiff::val(fr); + sp(i, j, k, vars.ife52ng+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ife52ng+2) = autodiff::val(rr); + sp(i, j, k, vars.ife52ng+3) = autodiff::derivative(rr); - rate_fe53ng(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_fe53ng(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ife53ng) = fr; - sp(i, j, k, vars.ife53ng+1) = dfrdt; - sp(i, j, k, vars.ife53ng+2) = rr; - sp(i, j, k, vars.ife53ng+3) = drrdt; + sp(i, j, k, vars.ife53ng) = autodiff::val(fr); + sp(i, j, k, vars.ife53ng+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ife53ng+2) = autodiff::val(rr); + sp(i, j, k, vars.ife53ng+3) = autodiff::derivative(rr); - rate_fe54ng(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_fe54ng(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ife54ng) = fr; - sp(i, j, k, vars.ife54ng+1) = dfrdt; - sp(i, j, k, vars.ife54ng+2) = rr; - sp(i, j, k, vars.ife54ng+3) = drrdt; + sp(i, j, k, vars.ife54ng) = autodiff::val(fr); + sp(i, j, k, vars.ife54ng+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ife54ng+2) = autodiff::val(rr); + sp(i, j, k, vars.ife54ng+3) = autodiff::derivative(rr); - rate_fe54pg(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_fe54pg(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ife54pg) = fr; - sp(i, j, k, vars.ife54pg+1) = dfrdt; - sp(i, j, k, vars.ife54pg+2) = rr; - sp(i, j, k, vars.ife54pg+3) = drrdt; + sp(i, j, k, vars.ife54pg) = autodiff::val(fr); + sp(i, j, k, vars.ife54pg+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ife54pg+2) = autodiff::val(rr); + sp(i, j, k, vars.ife54pg+3) = autodiff::derivative(rr); - rate_fe54ap(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_fe54ap(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ife54ap) = fr; - sp(i, j, k, vars.ife54ap+1) = dfrdt; - sp(i, j, k, vars.ife54ap+2) = rr; - sp(i, j, k, vars.ife54ap+3) = drrdt; + sp(i, j, k, vars.ife54ap) = autodiff::val(fr); + sp(i, j, k, vars.ife54ap+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ife54ap+2) = autodiff::val(rr); + sp(i, j, k, vars.ife54ap+3) = autodiff::derivative(rr); - rate_fe55ng(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_fe55ng(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ife55ng) = fr; - sp(i, j, k, vars.ife55ng+1) = dfrdt; - sp(i, j, k, vars.ife55ng+2) = rr; - sp(i, j, k, vars.ife55ng+3) = drrdt; + sp(i, j, k, vars.ife55ng) = autodiff::val(fr); + sp(i, j, k, vars.ife55ng+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ife55ng+2) = autodiff::val(rr); + sp(i, j, k, vars.ife55ng+3) = autodiff::derivative(rr); - rate_fe56pg(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_fe56pg(tf, dens_zone, fr, rr); + + sp(i, j, k, vars.ife56pg) = autodiff::val(fr); + sp(i, j, k, vars.ife56pg+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ife56pg+2) = autodiff::val(rr); + sp(i, j, k, vars.ife56pg+3) = autodiff::derivative(rr); - sp(i, j, k, vars.ife56pg) = fr; - sp(i, j, k, vars.ife56pg+1) = dfrdt; - sp(i, j, k, vars.ife56pg+2) = rr; - sp(i, j, k, vars.ife56pg+3) = drrdt; amrex::Real rn56ec; amrex::Real sn56ec; - langanke(temp_zone, dens_zone, eos_state.xn[ini56], + langanke(autodiff::val(temp_zone), dens_zone, eos_state.xn[ini56], eos_state.y_e, rn56ec, sn56ec); sp(i, j, k, vars.ilanganke) = rn56ec; @@ -448,8 +449,9 @@ void aprox_rates_extra_c12ag(const Box& bx, eos_extra_t eos_state; - amrex::Real temp_zone = std::pow(10.0_rt, std::log10(temp_min) + static_cast(j)*dlogT); - eos_state.T = temp_zone; + autodiff::dual temp_zone = std::pow(10.0_rt, std::log10(temp_min) + static_cast(j)*dlogT); + autodiff::seed(temp_zone); + eos_state.T = autodiff::val(temp_zone); amrex::Real dens_zone = std::pow(10.0, std::log10(dens_min) + static_cast(i)*dlogrho); eos_state.rho = dens_zone; @@ -466,20 +468,18 @@ void aprox_rates_extra_c12ag(const Box& bx, auto tf = get_tfactors(temp_zone); - amrex::Real fr; - amrex::Real dfrdt; - amrex::Real rr; - amrex::Real drrdt; + autodiff::dual fr; + autodiff::dual rr; // override to get the other rate use_c12ag_deboer17 = 1; - rate_c12ag(tf, dens_zone, fr, dfrdt, rr, drrdt); + rate_c12ag(tf, dens_zone, fr, rr); - sp(i, j, k, vars.ic12ag_deboer17) = fr; - sp(i, j, k, vars.ic12ag_deboer17+1) = dfrdt; - sp(i, j, k, vars.ic12ag_deboer17+2) = rr; - sp(i, j, k, vars.ic12ag_deboer17+3) = drrdt; + sp(i, j, k, vars.ic12ag_deboer17) = autodiff::val(fr); + sp(i, j, k, vars.ic12ag_deboer17+1) = autodiff::derivative(fr); + sp(i, j, k, vars.ic12ag_deboer17+2) = autodiff::val(rr); + sp(i, j, k, vars.ic12ag_deboer17+3) = autodiff::derivative(rr); }); } diff --git a/unit_test/test_rhs/ci-benchmarks/powerlaw.out b/unit_test/test_rhs/ci-benchmarks/powerlaw.out index ca088ef1c0..ef4289bc2a 100644 --- a/unit_test/test_rhs/ci-benchmarks/powerlaw.out +++ b/unit_test/test_rhs/ci-benchmarks/powerlaw.out @@ -22,8 +22,8 @@ J_ash_inert 0 0 J_inert_inert 0 0 J_E_inert 0 0 - J_fuel_E 0 0 - J_ash_E 0 0 + J_fuel_E -9120177709.1 -10061.863238 + J_ash_E 5030.9316188 4560088854.6 J_inert_E 0 0 - J_E_E 0 0 + J_E_E 201237.26475 1.8240355418e+11 From b42f18126706deceebf484548dbe727cc2a6e04f Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Sun, 28 Jul 2024 17:05:25 -0400 Subject: [PATCH 29/33] remove "using namespace eos" from headers (#1631) --- EOS/breakout/actual_eos.H | 6 +-- EOS/gamma_law/actual_eos.H | 24 ++++----- EOS/multigamma/actual_eos.H | 16 +++--- EOS/polytrope/actual_eos.H | 14 +++-- EOS/primordial_chem/actual_eos.H | 88 ++++++++++++++++---------------- EOS/rad_power_law/actual_eos.H | 14 +++-- EOS/tillotson/actual_eos.H | 54 ++++++++++---------- 7 files changed, 101 insertions(+), 115 deletions(-) diff --git a/EOS/breakout/actual_eos.H b/EOS/breakout/actual_eos.H index 0674931872..ac0ba24bca 100644 --- a/EOS/breakout/actual_eos.H +++ b/EOS/breakout/actual_eos.H @@ -8,8 +8,6 @@ #include #include -using namespace eos_rp; - const std::string eos_name = "breakout"; inline @@ -17,8 +15,8 @@ void actual_eos_init () { // constant ratio of specific heats - if (eos_gamma > 0.e0_rt) { - gamma_const = eos_gamma; + if (eos_rp::eos_gamma > 0.e0_rt) { + gamma_const = eos_rp::eos_gamma; } else { gamma_const = 5.0_rt / 3.0_rt; } diff --git a/EOS/gamma_law/actual_eos.H b/EOS/gamma_law/actual_eos.H index 41eba41423..174a870ef6 100644 --- a/EOS/gamma_law/actual_eos.H +++ b/EOS/gamma_law/actual_eos.H @@ -6,8 +6,6 @@ #include #include -using namespace eos_rp; - // This is a constant gamma equation of state, using an ideal gas. // // The gas may either be completely ionized or completely neutral. @@ -22,7 +20,7 @@ inline void actual_eos_init() { // constant ratio of specific heats - if (eos_gamma <= 0.0) { + if (eos_rp::eos_gamma <= 0.0) { amrex::Error("gamma_const cannot be < 0"); } @@ -56,7 +54,7 @@ void actual_eos (I input, T& state) const amrex::Real m_nucleon = C::m_u; if constexpr (has_xn::value) { - if (eos_assume_neutral) { + if (eos_rp::eos_assume_neutral) { state.mu = state.abar; } else { amrex::Real sum = 0.0; @@ -88,7 +86,7 @@ void actual_eos (I input, T& state) // h = e + p/rho = (p/rho)*[1 + 1/(gamma-1)] = (p/rho)*gamma/(gamma-1) if constexpr (has_enthalpy::value) { - state.T = (state.h * state.mu * m_nucleon / C::k_B)*(eos_gamma - 1.0)/eos_gamma; + state.T = (state.h * state.mu * m_nucleon / C::k_B)*(eos_rp::eos_gamma - 1.0)/eos_rp::eos_gamma; } break; @@ -127,7 +125,7 @@ void actual_eos (I input, T& state) // e = k T / [(mu m_nucleon)*(gamma-1)] if constexpr (has_energy::value) { - state.T = state.e * state.mu * m_nucleon * (eos_gamma - 1.0) / C::k_B; + state.T = state.e * state.mu * m_nucleon * (eos_rp::eos_gamma - 1.0) / C::k_B; } break; @@ -162,7 +160,7 @@ void actual_eos (I input, T& state) // Solve for temperature and density if constexpr (has_pressure::value && has_enthalpy::value) { - state.rho = state.p / state.h * eos_gamma / (eos_gamma - 1.0); + state.rho = state.p / state.h * eos_rp::eos_gamma / (eos_rp::eos_gamma - 1.0); state.T = state.p * state.mu * m_nucleon / (C::k_B * state.rho); } @@ -199,7 +197,7 @@ void actual_eos (I input, T& state) // Compute the pressure simply from the ideal gas law, and the // specific internal energy using the gamma-law EOS relation. amrex::Real pressure = state.rho * state.T * C::k_B / (state.mu * m_nucleon); - amrex::Real energy = pressure / (eos_gamma - 1.0) * rhoinv; + amrex::Real energy = pressure / (eos_rp::eos_gamma - 1.0) * rhoinv; if constexpr (has_pressure::value) { state.p = pressure; } @@ -256,17 +254,17 @@ void actual_eos (I input, T& state) state.cv = state.dedT; if constexpr (has_pressure::value) { - state.cp = eos_gamma * state.cv; + state.cp = eos_rp::eos_gamma * state.cv; - state.gam1 = eos_gamma; + state.gam1 = eos_rp::eos_gamma; state.dpdr_e = state.dpdr - state.dpdT * state.dedr * (1.0 / state.dedT); state.dpde = state.dpdT * (1.0 / state.dedT); // sound speed - state.cs = std::sqrt(eos_gamma * state.p * rhoinv); + state.cs = std::sqrt(eos_rp::eos_gamma * state.p * rhoinv); if constexpr (has_G::value) { - state.G = 0.5 * (1.0 + eos_gamma); + state.G = 0.5 * (1.0 + eos_rp::eos_gamma); } } } @@ -278,7 +276,7 @@ void actual_eos (I input, T& state) state.dedA = - state.e * (1.0 / state.abar); } - if (eos_assume_neutral) { + if (eos_rp::eos_assume_neutral) { if constexpr (has_dpdZ::value) { state.dpdZ = 0.0; } diff --git a/EOS/multigamma/actual_eos.H b/EOS/multigamma/actual_eos.H index e673474f7c..7c8189b0d7 100644 --- a/EOS/multigamma/actual_eos.H +++ b/EOS/multigamma/actual_eos.H @@ -14,8 +14,6 @@ #include #include -using namespace eos_rp; - const std::string eos_name = "multigamma"; inline @@ -26,24 +24,24 @@ void actual_eos_init () // that can override the default gammas for a few named species. for (int n = 0; n < NumSpec; ++n) { - gammas[n] = eos_gamma_default; + gammas[n] = eos_rp::eos_gamma_default; } int idx; - idx = network_spec_index(species_a_name); + idx = network_spec_index(eos_rp::species_a_name); if (idx >= 0) { - gammas[idx] = species_a_gamma; + gammas[idx] = eos_rp::species_a_gamma; } - idx = network_spec_index(species_b_name); + idx = network_spec_index(eos_rp::species_b_name); if (idx >= 0) { - gammas[idx] = species_b_gamma; + gammas[idx] = eos_rp::species_b_gamma; } - idx = network_spec_index(species_c_name); + idx = network_spec_index(eos_rp::species_c_name); if (idx >= 0) { - gammas[idx] = species_c_gamma; + gammas[idx] = eos_rp::species_c_gamma; } } diff --git a/EOS/polytrope/actual_eos.H b/EOS/polytrope/actual_eos.H index 3f0108a8e5..639fa72a0e 100644 --- a/EOS/polytrope/actual_eos.H +++ b/EOS/polytrope/actual_eos.H @@ -28,8 +28,6 @@ #include #include -using namespace eos_rp; - const std::string eos_name = "polytrope"; inline @@ -41,9 +39,9 @@ void actual_eos_init () // 1: Non-relativistic, fully degenerate electron gas // 2: Relativistic, fully degenerate electron gas - if (polytrope_type > 0) { - mu_e = polytrope_mu_e; - polytrope = polytrope_type; + if (eos_rp::polytrope_type > 0) { + mu_e = eos_rp::polytrope_mu_e; + polytrope = eos_rp::polytrope_type; if (polytrope == 1) { gamma_const = 5.0_rt / 3.0_rt; @@ -59,9 +57,9 @@ void actual_eos_init () amrex::Error("EOS: Polytrope type currently not defined"); } } - else if (polytrope_gamma > 0.0_rt && polytrope_K > 0.0_rt) { - gamma_const = polytrope_gamma; - K_const = polytrope_K; + else if (eos_rp::polytrope_gamma > 0.0_rt && eos_rp::polytrope_K > 0.0_rt) { + gamma_const = eos_rp::polytrope_gamma; + K_const = eos_rp::polytrope_K; mu_e = 2.0_rt; // This will not be used } else { diff --git a/EOS/primordial_chem/actual_eos.H b/EOS/primordial_chem/actual_eos.H index 3d50fa76b9..9d743432ab 100644 --- a/EOS/primordial_chem/actual_eos.H +++ b/EOS/primordial_chem/actual_eos.H @@ -12,8 +12,6 @@ #include #include -using namespace eos_rp; - const std::string eos_name = "multigamma"; inline @@ -23,94 +21,94 @@ void actual_eos_init () // Set the gammas & masses for the species for (int n = 0; n < NumSpec; ++n) { - gammas[n] = eos_gamma_default; + gammas[n] = eos_rp::eos_gamma_default; spmasses[n] = 1.67353251819e-24; } int idx; - idx = network_spec_index(species_a_name); + idx = network_spec_index(eos_rp::species_a_name); if (idx >= 0) { - gammas[idx] = species_a_gamma; - spmasses[idx] = species_a_mass; + gammas[idx] = eos_rp::species_a_gamma; + spmasses[idx] = eos_rp::species_a_mass; } - idx = network_spec_index(species_b_name); + idx = network_spec_index(eos_rp::species_b_name); if (idx >= 0) { - gammas[idx] = species_b_gamma; - spmasses[idx] = species_b_mass; + gammas[idx] = eos_rp::species_b_gamma; + spmasses[idx] = eos_rp::species_b_mass; } - idx = network_spec_index(species_c_name); + idx = network_spec_index(eos_rp::species_c_name); if (idx >= 0) { - gammas[idx] = species_c_gamma; - spmasses[idx] = species_c_mass; + gammas[idx] = eos_rp::species_c_gamma; + spmasses[idx] = eos_rp::species_c_mass; } - idx = network_spec_index(species_d_name); + idx = network_spec_index(eos_rp::species_d_name); if (idx >= 0) { - gammas[idx] = species_d_gamma; - spmasses[idx] = species_d_mass; + gammas[idx] = eos_rp::species_d_gamma; + spmasses[idx] = eos_rp::species_d_mass; } - idx = network_spec_index(species_e_name); + idx = network_spec_index(eos_rp::species_e_name); if (idx >= 0) { - gammas[idx] = species_e_gamma; - spmasses[idx] = species_e_mass; + gammas[idx] = eos_rp::species_e_gamma; + spmasses[idx] = eos_rp::species_e_mass; } - idx = network_spec_index(species_f_name); + idx = network_spec_index(eos_rp::species_f_name); if (idx >= 0) { - gammas[idx] = species_f_gamma; - spmasses[idx] = species_f_mass; + gammas[idx] = eos_rp::species_f_gamma; + spmasses[idx] = eos_rp::species_f_mass; } - idx = network_spec_index(species_g_name); + idx = network_spec_index(eos_rp::species_g_name); if (idx >= 0) { - gammas[idx] = species_g_gamma; - spmasses[idx] = species_g_mass; + gammas[idx] = eos_rp::species_g_gamma; + spmasses[idx] = eos_rp::species_g_mass; } - idx = network_spec_index(species_h_name); + idx = network_spec_index(eos_rp::species_h_name); if (idx >= 0) { - gammas[idx] = species_h_gamma; - spmasses[idx] = species_h_mass; + gammas[idx] = eos_rp::species_h_gamma; + spmasses[idx] = eos_rp::species_h_mass; } - idx = network_spec_index(species_i_name); + idx = network_spec_index(eos_rp::species_i_name); if (idx >= 0) { - gammas[idx] = species_i_gamma; - spmasses[idx] = species_i_mass; + gammas[idx] = eos_rp::species_i_gamma; + spmasses[idx] = eos_rp::species_i_mass; } - idx = network_spec_index(species_j_name); + idx = network_spec_index(eos_rp::species_j_name); if (idx >= 0) { - gammas[idx] = species_j_gamma; - spmasses[idx] = species_j_mass; + gammas[idx] = eos_rp::species_j_gamma; + spmasses[idx] = eos_rp::species_j_mass; } - idx = network_spec_index(species_k_name); + idx = network_spec_index(eos_rp::species_k_name); if (idx >= 0) { - gammas[idx] = species_k_gamma; - spmasses[idx] = species_k_mass; + gammas[idx] = eos_rp::species_k_gamma; + spmasses[idx] = eos_rp::species_k_mass; } - idx = network_spec_index(species_l_name); + idx = network_spec_index(eos_rp::species_l_name); if (idx >= 0) { - gammas[idx] = species_l_gamma; - spmasses[idx] = species_l_mass; + gammas[idx] = eos_rp::species_l_gamma; + spmasses[idx] = eos_rp::species_l_mass; } - idx = network_spec_index(species_m_name); + idx = network_spec_index(eos_rp::species_m_name); if (idx >= 0) { - gammas[idx] = species_m_gamma; - spmasses[idx] = species_m_mass; + gammas[idx] = eos_rp::species_m_gamma; + spmasses[idx] = eos_rp::species_m_mass; } - idx = network_spec_index(species_n_name); + idx = network_spec_index(eos_rp::species_n_name); if (idx >= 0) { - gammas[idx] = species_n_gamma; - spmasses[idx] = species_n_mass; + gammas[idx] = eos_rp::species_n_gamma; + spmasses[idx] = eos_rp::species_n_mass; } } diff --git a/EOS/rad_power_law/actual_eos.H b/EOS/rad_power_law/actual_eos.H index 5a1fabbca6..4a3ed428b2 100644 --- a/EOS/rad_power_law/actual_eos.H +++ b/EOS/rad_power_law/actual_eos.H @@ -18,19 +18,17 @@ #include #include -using namespace eos_rp; - const std::string eos_name = "rad_power_law"; inline void actual_eos_init () { - if (eos_const_c_v <= 0.e0_rt) { + if (eos_rp::eos_const_c_v <= 0.e0_rt) { amrex::Error("eos_const_c_v must be > 0"); } - if (eos_c_v_exp_n == 1.0e0_rt) { + if (eos_rp::eos_c_v_exp_n == 1.0e0_rt) { amrex::Error("eos_c_v_exp_n == 1 is unsupported"); } @@ -77,8 +75,8 @@ void actual_eos (I input, T& state) case eos_input_rt: if constexpr (has_energy::value) { - state.cv = eos_const_c_v * std::pow(state.rho, eos_c_v_exp_m) * std::pow(state.T, -eos_c_v_exp_n); - state.e = eos_const_c_v * std::pow(state.rho, eos_c_v_exp_m) * std::pow(state.T, 1 - eos_c_v_exp_n) / (1 - eos_c_v_exp_n); + state.cv = eos_rp::eos_const_c_v * std::pow(state.rho, eos_rp::eos_c_v_exp_m) * std::pow(state.T, -eos_rp::eos_c_v_exp_n); + state.e = eos_rp::eos_const_c_v * std::pow(state.rho, eos_rp::eos_c_v_exp_m) * std::pow(state.T, 1 - eos_rp::eos_c_v_exp_n) / (1 - eos_rp::eos_c_v_exp_n); } break; @@ -86,8 +84,8 @@ void actual_eos (I input, T& state) case eos_input_re: if constexpr (has_energy::value) { - state.T = std::pow((1 - eos_c_v_exp_n) * state.e * std::pow(state.rho, -eos_c_v_exp_m) / eos_const_c_v, 1.0_rt / (1.0_rt - eos_c_v_exp_n)); - state.cv = eos_const_c_v * std::pow(state.rho, eos_c_v_exp_m) * std::pow(state.T, -eos_c_v_exp_n); + state.T = std::pow((1 - eos_rp::eos_c_v_exp_n) * state.e * std::pow(state.rho, -eos_rp::eos_c_v_exp_m) / eos_rp::eos_const_c_v, 1.0_rt / (1.0_rt - eos_rp::eos_c_v_exp_n)); + state.cv = eos_rp::eos_const_c_v * std::pow(state.rho, eos_rp::eos_c_v_exp_m) * std::pow(state.T, -eos_rp::eos_c_v_exp_n); } break; diff --git a/EOS/tillotson/actual_eos.H b/EOS/tillotson/actual_eos.H index c9df21832a..a7805d4d15 100644 --- a/EOS/tillotson/actual_eos.H +++ b/EOS/tillotson/actual_eos.H @@ -7,8 +7,6 @@ #include #include -using namespace eos_rp; - const std::string eos_name = "tillotson"; inline @@ -19,7 +17,7 @@ void actual_eos_init() { // (Note that rho_0 is not the minimum density but rather just // a reference density.) - EOSData::mine = eos_e_0; + EOSData::mine = eos_rp::eos_e_0; } @@ -56,55 +54,55 @@ void actual_eos (I input, T& state) // that we are consistent with eos_input_re. if (input == eos_input_re) { - state.T = amrex::max((state.e - eos_e_0) / eos_c_v, EOSData::mintemp); + state.T = amrex::max((state.e - eos_rp::eos_e_0) / eos_rp::eos_c_v, EOSData::mintemp); } else if (input == eos_input_rt) { - state.e = amrex::max(eos_e_0 + eos_c_v * state.T, EOSData::mine); + state.e = amrex::max(eos_rp::eos_e_0 + eos_rp::eos_c_v * state.T, EOSData::mine); } - amrex::Real eta = state.rho / eos_rho_0; + amrex::Real eta = state.rho / eos_rp::eos_rho_0; amrex::Real mu = eta - 1.0_rt; - amrex::Real omega = state.e / (eos_e_0 * eta * eta) + 1.0_rt; + amrex::Real omega = state.e / (eos_rp::eos_e_0 * eta * eta) + 1.0_rt; amrex::Real z = (1.0_rt / eta - 1.0_rt); - amrex::Real g_c = eos_la + eos_lb / omega; - amrex::Real g_e = eos_la + eos_lb / omega * std::exp(-eos_beta * z * z); + amrex::Real g_c = eos_rp::eos_la + eos_rp::eos_lb / omega; + amrex::Real g_e = eos_rp::eos_la + eos_rp::eos_lb / omega * std::exp(-eos_rp::eos_beta * z * z); - amrex::Real P_c = g_c * state.e * state.rho + eos_A * mu + eos_B * mu * mu; - amrex::Real P_e = g_e * state.e * state.rho + eos_A * mu * std::exp(-eos_alpha * z - eos_beta * z * z); + amrex::Real P_c = g_c * state.e * state.rho + eos_rp::eos_A * mu + eos_rp::eos_B * mu * mu; + amrex::Real P_e = g_e * state.e * state.rho + eos_rp::eos_A * mu * std::exp(-eos_rp::eos_alpha * z - eos_rp::eos_beta * z * z); // Floor the pressure since the above expressions can be negative P_c = amrex::max(P_c, EOSData::minp); P_e = amrex::max(P_e, EOSData::minp); - amrex::Real cs_squared_c = (g_c + 2.0_rt * eos_lb * (omega - 1.0_rt) / (omega * omega)) * state.e + - (eos_A + 2.0_rt * eos_B * mu) / eos_rho_0; - amrex::Real cs_squared_e = (g_e + (2.0_rt * eos_lb / omega) * std::exp(-eos_beta * z * z) * - ((omega - 1.0_rt) / omega + eos_beta * z / eta)) * state.e + - (eos_A / eos_rho_0) * std::exp(-eos_alpha * z - eos_beta * z * z) * - (1.0_rt + mu / (eta * eta) * (eos_alpha + 2.0_rt * eos_beta * z)); + amrex::Real cs_squared_c = (g_c + 2.0_rt * eos_rp::eos_lb * (omega - 1.0_rt) / (omega * omega)) * state.e + + (eos_rp::eos_A + 2.0_rt * eos_rp::eos_B * mu) / eos_rp::eos_rho_0; + amrex::Real cs_squared_e = (g_e + (2.0_rt * eos_rp::eos_lb / omega) * std::exp(-eos_rp::eos_beta * z * z) * + ((omega - 1.0_rt) / omega + eos_rp::eos_beta * z / eta)) * state.e + + (eos_rp::eos_A / eos_rp::eos_rho_0) * std::exp(-eos_rp::eos_alpha * z - eos_rp::eos_beta * z * z) * + (1.0_rt + mu / (eta * eta) * (eos_rp::eos_alpha + 2.0_rt * eos_rp::eos_beta * z)); // Floor the sound speed as well (and make sure we get the floor dimensionally right) cs_squared_c = amrex::max(cs_squared_c, EOSData::minp / state.rho); cs_squared_e = amrex::max(cs_squared_e, EOSData::minp / state.rho); - amrex::Real dPde_c = eos_la * state.rho + eos_lb * state.rho / (omega * omega); - amrex::Real dPde_e = eos_la * state.rho + eos_lb * state.rho / (omega * omega) * std::exp(-eos_beta * z * z); + amrex::Real dPde_c = eos_rp::eos_la * state.rho + eos_rp::eos_lb * state.rho / (omega * omega); + amrex::Real dPde_e = eos_rp::eos_la * state.rho + eos_rp::eos_lb * state.rho / (omega * omega) * std::exp(-eos_rp::eos_beta * z * z); // At this point we should have valid (rho, e); compute P = P(rho, e). amrex::Real pres, dpdr_e, dpde; - if (state.rho >= eos_rho_0 || (state.rho < eos_rho_0 && state.e < eos_e_s)) { + if (state.rho >= eos_rp::eos_rho_0 || (state.rho < eos_rp::eos_rho_0 && state.e < eos_rp::eos_e_s)) { // Region I, II (compressed state) pres = P_c; dpdr_e = cs_squared_c; dpde = dPde_c; } - else if (state.rho < eos_rho_0 && state.e > eos_e_s_prime) { + else if (state.rho < eos_rp::eos_rho_0 && state.e > eos_rp::eos_e_s_prime) { // Region IV (expanded state) pres = P_e; @@ -114,9 +112,9 @@ void actual_eos (I input, T& state) else { // Region III (interpolate between compressed and expanded state) - amrex::Real denom = (eos_e_s_prime - eos_e_s); - amrex::Real xi_c = (state.e - eos_e_s) / denom; - amrex::Real xi_e = (eos_e_s_prime - state.e) / denom; + amrex::Real denom = (eos_rp::eos_e_s_prime - eos_rp::eos_e_s); + amrex::Real xi_c = (state.e - eos_rp::eos_e_s) / denom; + amrex::Real xi_e = (eos_rp::eos_e_s_prime - state.e) / denom; pres = P_c * xi_c + P_e * xi_e; dpdr_e = cs_squared_c * xi_c + cs_squared_e * xi_e; @@ -137,7 +135,7 @@ void actual_eos (I input, T& state) state.dpdr = state.dpdr_e; // Use chain rule to get dp/dT from de/dT - state.dpdT = state.dpde * eos_c_v; + state.dpdT = state.dpde * eos_rp::eos_c_v; } // Sound speed @@ -154,15 +152,15 @@ void actual_eos (I input, T& state) // Fill in heat capacity (c_v from provided data, c_p from c_v) - state.cv = eos_c_v; + state.cv = eos_rp::eos_c_v; if constexpr (has_pressure::value) { - state.cp = state.gam1 * eos_c_v; + state.cp = state.gam1 * eos_rp::eos_c_v; } // de/dT == specific heat at constant volume - state.dedT = eos_c_v; + state.dedT = eos_rp::eos_c_v; // de/drho is not relevant for this EOS From 83ce77ce56536cdcf2a2e91f553d18e196fff0fb Mon Sep 17 00:00:00 2001 From: "Eric T. Johnson" Date: Sun, 28 Jul 2024 20:34:59 -0400 Subject: [PATCH 30/33] Fix some incorrect derivative terms in sneut5 (#1633) --- neutrinos/sneut5.H | 13 ++++++++----- unit_test/test_rhs/ci-benchmarks/ecsn.out | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/neutrinos/sneut5.H b/neutrinos/sneut5.H index 2ebf212078..8f63e6cd6d 100644 --- a/neutrinos/sneut5.H +++ b/neutrinos/sneut5.H @@ -686,7 +686,7 @@ void nu_photo(const sneutf_t& sf, // and table 2 written out for speed amrex::Real tau; - amrex::Real cc; + amrex::Real cc, ccdt; amrex::Real c00, c01, c02, c03, c04, c05, c06; amrex::Real c10, c11, c12, c13, c14, c15, c16; amrex::Real c20, c21, c22, c23, c24, c25, c26; @@ -694,12 +694,15 @@ void nu_photo(const sneutf_t& sf, amrex::Real dd11, dd12, dd13, dd14, dd15; amrex::Real dd21, dd22, dd23, dd24, dd25; + amrex::Real taudt = nu_constants::iln10 * sf.tempi; + if (sf.temp < 1.0e8_rt) { // note: we already bailed above for T < 1.e7, so this is really 1.e7 <= T < 1.e8 tau = std::log10(sf.temp * 1.0e-7_rt); cc = 0.5654e0_rt + tau; + ccdt = taudt; c00 = 1.008e11_rt; c01 = 0.0e0_rt; c02 = 0.0e0_rt; @@ -741,6 +744,7 @@ void nu_photo(const sneutf_t& sf, tau = std::log10(sf.temp * 1.0e-8_rt); cc = 1.5654e0_rt; + ccdt = 0.0e0_rt; c00 = 9.889e10_rt; c01 = -4.524e8_rt; c02 = -6.088e6_rt; @@ -784,6 +788,7 @@ void nu_photo(const sneutf_t& sf, tau = std::log10(sf.t9); cc = 1.5654e0_rt; + ccdt = 0.0e0_rt; c00 = 9.581e10_rt; c01 = 4.107e8_rt; c02 = 2.305e8_rt; @@ -823,8 +828,6 @@ void nu_photo(const sneutf_t& sf, } - amrex::Real taudt = nu_constants::iln10 * sf.tempi; - // equation 3.7 const auto [sin1, cos1] = amrex::Math::sincos(nu_constants::fac1 * tau); @@ -902,7 +905,7 @@ void nu_photo(const sneutf_t& sf, amrex::Real xnum = dum * z; amrex::Real xnumdt, xnumda, xnumdz; if constexpr (do_derivatives) { - xnumdt = dumdt * z - dum * z * cc * sf.zetadt; + xnumdt = dumdt * z - dum * z * (cc * sf.zetadt + sf.zeta * ccdt); xnumda = dumda * z - dum * z * cc * sf.zetada; xnumdz = dumdz * z - dum * z * cc * sf.zetadz; } @@ -1383,7 +1386,7 @@ void nu_recomb(const sneutf_t& sf, } amrex::Real c00 = 1.0e0_rt / (1.0e0_rt + f1 * nu + f2 * nu2 + f3 * nu3); - amrex::Real c01 = f1 + f2 * 2.0e0_rt * nu + f3 * 3.0e0_rt * nu2; + amrex::Real c01 = -(f1 + f2 * 2.0e0_rt * nu + f3 * 3.0e0_rt * nu2) * c00 * c00; amrex::Real dum = zeta * c00; amrex::Real dumdt, dumda, dumdz; if constexpr (do_derivatives) { diff --git a/unit_test/test_rhs/ci-benchmarks/ecsn.out b/unit_test/test_rhs/ci-benchmarks/ecsn.out index 9489ba5c4d..1c696133b0 100644 --- a/unit_test/test_rhs/ci-benchmarks/ecsn.out +++ b/unit_test/test_rhs/ci-benchmarks/ecsn.out @@ -157,7 +157,7 @@ J_silicon-28_sulfur-32 0 0 J_phosphorus-31_sulfur-32 0 0 J_sulfur-32_sulfur-32 0 0 - J_E_sulfur-32 -1.2066886642e+15 7.8006383744e+14 + J_E_sulfur-32 -1.2066886642e+15 7.8006373177e+14 J_hydrogen-1_E -0.12580793235 1.2089803642e+12 J_helium-4_E -0.0078065301852 1.4905283338e+12 J_oxygen-16_E -5.3990173959e+12 1.2739583515e-06 From 727afa9883669194c6cf2311f1181c455ab8b213 Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Mon, 29 Jul 2024 18:53:29 -0400 Subject: [PATCH 31/33] fix some burn failure diagonstics on GPUs (#1635) if we are on the GPU with printf allowed, we weren't backing up the thermo state --- integration/integrator_setup_sdc.H | 13 +++++++------ integration/integrator_setup_strang.H | 7 +++++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/integration/integrator_setup_sdc.H b/integration/integrator_setup_sdc.H index f55c46ff62..97942c4e86 100644 --- a/integration/integrator_setup_sdc.H +++ b/integration/integrator_setup_sdc.H @@ -103,28 +103,29 @@ IntegratorT integrator_setup (BurnT& state, amrex::Real dt, bool is_retry) return int_state; } +/// +/// Save the initial composition and thermodynamic state for +/// diagnostics. +/// template AMREX_GPU_HOST_DEVICE AMREX_INLINE state_backup_t integrator_backup (const BurnT& state) { - // Save the initial composition and temperature for our later - // diagnostics. - state_backup_t state_save; #ifndef AMREX_USE_GPU for (int n = 0; n < NumSpec; ++n) { state_save.xn_in[n] = state.y[SFS+n] / state.y[SRHO]; } - // we are assuming that the temperature was valid on input - state_save.T_in = state.T; #ifdef AUX_THERMO for (int n = 0; n < NumAux; ++n) { state_save.aux_in[n] = state.y[SFX+n] / state.y[SRHO]; } #endif - state_save.rhoe_in = state.y[SEINT]; #endif + // we are assuming that the temperature was valid on input + state_save.T_in = state.T; + state_save.rhoe_in = state.y[SEINT]; return state_save; diff --git a/integration/integrator_setup_strang.H b/integration/integrator_setup_strang.H index e4fcb9eb86..32ec74342c 100644 --- a/integration/integrator_setup_strang.H +++ b/integration/integrator_setup_strang.H @@ -95,7 +95,10 @@ IntegratorT integrator_setup (BurnT& state, amrex::Real dt, bool is_retry) return int_state; } - +/// +/// Save the initial composition and thermodynamic state for +/// diagnostics. +/// template AMREX_GPU_HOST_DEVICE AMREX_INLINE state_backup_t integrator_backup (const BurnT& state) { @@ -106,8 +109,8 @@ state_backup_t integrator_backup (const BurnT& state) { for (int n = 0; n < NumSpec; ++n) { state_save.xn_in[n] = state.xn[n]; } - state_save.T_in = state.T; #endif + state_save.T_in = state.T; state_save.e_in = state.e; return state_save; From 8924bd8d2c17abf930fa1e0301cb05266957d424 Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Wed, 31 Jul 2024 14:06:17 -0400 Subject: [PATCH 32/33] reorder some loops over Jacobians (#1639) the MathArray2D is Fortran-ordered. Some of the loops should be more efficient if their order is swapped. --- integration/integrator_rhs_sdc.H | 28 ++++++++++---------------- integration/integrator_rhs_strang.H | 9 +-------- integration/utils/numerical_jacobian.H | 13 +++--------- 3 files changed, 15 insertions(+), 35 deletions(-) diff --git a/integration/integrator_rhs_sdc.H b/integration/integrator_rhs_sdc.H index a953d253b5..dead4a6544 100644 --- a/integration/integrator_rhs_sdc.H +++ b/integration/integrator_rhs_sdc.H @@ -105,15 +105,8 @@ void jac (const amrex::Real time, BurnT& state, T& int_state, MatrixType& pd) if (state.T <= EOSData::mintemp || state.T >= integrator_rp::MAX_TEMP) { - - for (int j = 1; j <= INT_NEQS; ++j) { - for (int i = 1; i <= INT_NEQS; ++i) { - pd(i,j) = 0.0_rt; - } - } - + pd.zero(); return; - } // Call the specific network routine to get the Jacobian. @@ -122,15 +115,16 @@ void jac (const amrex::Real time, BurnT& state, T& int_state, MatrixType& pd) // The Jacobian from the nets is in terms of dYdot/dY, but we want // it was dXdot/dX, so convert here. - for (int n = 1; n <= NumSpec; n++) { - for (int m = 1; m <= neqs; m++) { - pd(n,m) = pd(n,m) * aion[n-1]; + + for (int jcol = 1; jcol <= neqs; ++jcol) { + for (int irow = 1; irow <= NumSpec; irow++) { + pd(irow, jcol) = pd(irow, jcol) * aion[irow-1]; } } - for (int m = 1; m <= neqs; m++) { - for (int n = 1; n <= NumSpec; n++) { - pd(m,n) = pd(m,n) * aion_inv[n-1]; + for (int jcol = 1; jcol <= NumSpec; ++jcol) { + for (int irow = 1; irow <= neqs; ++irow) { + pd(irow, jcol) = pd(irow, jcol) * aion_inv[jcol-1]; } } @@ -170,9 +164,9 @@ void jac (const amrex::Real time, BurnT& state, T& int_state, MatrixType& pd) eos_xderivs_t eos_xderivs = composition_derivatives(eos_state); - for (int m = 1; m <= neqs; m++) { - for (int n = 1; n <= NumSpec; n++) { - pd(m, n) -= eos_xderivs.dedX[n-1] * pd(m, net_ienuc); + for (int jcol = 1; jcol <= NumSpec;++jcol) { + for (int irow = 1; irow <= neqs; ++irow) { + pd(irow, jcol) -= eos_xderivs.dedX[jcol-1] * pd(irow, net_ienuc); } } diff --git a/integration/integrator_rhs_strang.H b/integration/integrator_rhs_strang.H index 8c9d6f4a97..90b35a167e 100644 --- a/integration/integrator_rhs_strang.H +++ b/integration/integrator_rhs_strang.H @@ -119,15 +119,8 @@ void jac ([[maybe_unused]] const amrex::Real time, BurnT& state, T& int_state, M // bounds. Otherwise set the Jacobian to zero and return. if (state.T <= EOSData::mintemp || state.T >= integrator_rp::MAX_TEMP) { - - for (int j = 1; j <= INT_NEQS; ++j) { - for (int i = 1; i <= INT_NEQS; ++i) { - pd(i,j) = 0.0_rt; - } - } - + pd.zero(); return; - } // Call the specific network routine to get the Jacobian. diff --git a/integration/utils/numerical_jacobian.H b/integration/utils/numerical_jacobian.H index 7c367fcee9..9822380410 100644 --- a/integration/utils/numerical_jacobian.H +++ b/integration/utils/numerical_jacobian.H @@ -136,15 +136,8 @@ void numerical_jac(BurnT& state, const jac_info_t& jac_info, JacNetArray2D& jac) state_delp.T += dy; if (state_delp.T <= EOSData::mintemp || state_delp.T >= integrator_rp::MAX_TEMP) { - - for (int i = 1; i <= int_neqs; i++) { - for (int j = 1; j <= int_neqs; j++) { - jac(i,j) = 0.0_rt; - } - } - + jac.zero(); return; - } @@ -195,8 +188,8 @@ void numerical_jac(BurnT& state, const jac_info_t& jac_info, JacNetArray2D& jac) // now correct the species derivatives // this constructs dy/dX_k |_e = dy/dX_k |_T - e_{X_k} |_T dy/dT / c_v - for (int m = 1; m <= int_neqs; m++) { - for (int n = 1; n <= NumSpec; n++) { + for (int n = 1; n <= NumSpec; n++) { + for (int m = 1; m <= int_neqs; m++) { jac(m, n) -= eos_xderivs.dedX[n-1] * jac(m, net_ienuc); } } From 14b8b0e3173041968943d4bbac2c4803a33abceb Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Thu, 1 Aug 2024 07:55:46 -0400 Subject: [PATCH 33/33] update CHANGES.md for 24.08 (#1632) --- CHANGES.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 5f91931e1e..0b17ad85db 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,54 @@ +# 24.08 + + * autodiff is now used with the templated reaction networks (#1614) + + some autodiff clean-ups and derivative fixes (#1604, #1612, + #1613, #1616, #1619, #1633) + + * we can now output warnings from GPUs if you compile with + `USE_GPU_PRINTF=TRUE` (#1629, #1635) + + * documentation improvements (#1570, #1628) + + * a new jacobian unit (`jac_cell`) test was added that compares the + numerical and analytic Jacobians (#1618) + + * support for Strang + NSE has been removed. NSE only works with + SDC now (#1549, #1621) + + * the network `CNO_He_burn` was added for explosive H/He burning + (#1622) + + * code clean-ups (#1582, #1602, #1609, #1623, #1624, #1625, #1626, + #1627, #1631, #1639) + + * `test_nse_net` now also tests the NSE EOS interface (#1621) + + * the self-consistent NSE + SDC update has been synced with the + tabular NSE implementation (#1569, #1607, #1617) + + * `test_jac` was not correctly evaluating the numerical Jacobian + (#1615) + + * the `fast_atan` function is now more accurate (#1611) + + * `test_ase` was renamed `test_nse_net` and the old `test_nse` was + removed (#1610) + + * the old `test_screening` unit test was removed (#1608) + + * the RKC integrator now supports NSE bailout (#1544) + + * a second temperature check for tabular NSE was added -- above this + temperature we don't consider composition (#1547) + + * a SDC+NSE unit test was added (#1548) + + * a fast log and fast pow approximation was added (#1591) + + * the primordial_chem network now uses the fast math routines (#1605) + + * fix potential Inf in constexpr linear algebra (#1603) + # 24.07 * added an autodiff library and converted all of the screening

AnvILt$-fAM=reYY>V~fxqc>F@I4IM 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 CI$Lc2KaGfVUFUXy^x`OLKDrex1t&qBT|L_ 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 bSZ{KhzOnu4Bha~Z#6;z~=I=#U{|NpsZFCX7 literal 0 HcmV?d00001 diff --git a/networks/CNO_He_burn/CNO_He_burn.py b/networks/CNO_He_burn/CNO_He_burn.py new file mode 100644 index 0000000000..945d1d69d0 --- /dev/null +++ b/networks/CNO_He_burn/CNO_He_burn.py @@ -0,0 +1,123 @@ +# a blend of CNO_extras and subch_simple + +import pynucastro as pyna +from pynucastro.networks import AmrexAstroCxxNetwork + +DO_DERIVED_RATES = False + +def get_library(): + + reaclib_lib = pyna.ReacLibLibrary() + + all_reactants = ["h1", "he4", + "c12", "c13", + "n13", "n14", "n15", + "o14", "o15", "o16", "o17", "o18", + "f17", "f18", "f19", + "ne18", "ne19", "ne20", "ne21", + "na22", "na23", + "mg22", "mg24", + "al27", "si28", "p31", "s32", + "cl35", "ar36", "k39", "ca40", + "sc43", "ti44", "v47", "cr48", + "mn51", "fe52", "co55", "ni56"] + + subch = reaclib_lib.linking_nuclei(all_reactants) + + # in this list, we have the reactants, the actual reactants, + # and modified products that we will use instead + other_rates = [("c12(c12,n)mg23", "mg24"), + ("o16(o16,n)s31", "s32"), + ("o16(c12,n)si27", "si28")] + + for r, mp in other_rates: + _r = reaclib_lib.get_rate_by_name(r) + _r.modify_products(mp) + subch += pyna.Library(rates=[_r]) + + # finally, the aprox nets don't include the reverse rates for + # C12+C12, C12+O16, and O16+O16, so remove those + + for r in subch.get_rates(): + if sorted(r.products) in [[pyna.Nucleus("c12"), pyna.Nucleus("c12")], + [pyna.Nucleus("c12"), pyna.Nucleus("o16")], + [pyna.Nucleus("o16"), pyna.Nucleus("o16")]]: + subch.remove_rate(r) + + # C12+Ne20 and reverse + # (a,g) links between Na23 and Al27 + # (a,g) links between Al27 and P31 + + rates_to_remove = ["p31(p,c12)ne20", + "si28(a,c12)ne20", + "ne20(c12,p)p31", + "ne20(c12,a)si28", + "na23(a,g)al27", + "al27(g,a)na23", + "al27(a,g)p31", + "p31(g,a)al27"] + + for r in rates_to_remove: + print("removing: ", r) + _r = subch.get_rate_by_name(r) + subch.remove_rate(_r) + + if DO_DERIVED_RATES: + rates_to_derive = [] + for r in subch.get_rates(): + if r.reverse: + # this rate was computed using detailed balance, regardless + # of whether Q < 0 or not. We want to remove it and then + # recompute it + rates_to_derive.append(r) + + # now for each of those derived rates, look to see if the pair exists + + for r in rates_to_derive: + fr = subch.get_rate_by_nuclei(r.products, r.reactants) + if fr: + print(f"modifying {r} from {fr}") + subch.remove_rate(r) + d = pyna.DerivedRate(rate=fr, compute_Q=False, use_pf=True) + subch.add_rate(d) + + return subch + +def doit(): + + subch = get_library() + + # these are the rates that we are going to allow to be optionally + # zeroed + r1 = subch.get_rate_by_name("c12(p,g)n13") + r2 = subch.get_rate_by_name("n13(he4,p)o16") + + net = AmrexAstroCxxNetwork(libraries=[subch], symmetric_screening=True, disable_rate_params=[r1, r2]) + net.make_ap_pg_approx(intermediate_nuclei=["cl35", "k39", "sc43", "v47", "mn51", "co55"]) + net.remove_nuclei(["cl35", "k39", "sc43", "v47", "mn51", "co55"]) + + # finally, the aprox nets don't include the reverse rates for + # C12+C12, C12+O16, and O16+O16, so remove those + + print(f"number of nuclei: {len(net.unique_nuclei)}") + print(f"number of rates: {len(net.rates)}") + + comp = pyna.Composition(net.get_nuclei()) + comp.set_all(0.1) + comp.set_nuc("he4", 0.95) + comp.normalize() + + rho = 1.e6 + T = 1.e9 + + net.plot(rho, T, comp, outfile="CNO_He_burn.png", + rotated=True, hide_xalpha=True, curved_edges=True, + size=(1500, 450), + node_size=500, node_font_size=11, node_color="#337dff", node_shape="s", + Z_range=(1,29)) + + net.write_network() + + +if __name__ == "__main__": + doit() diff --git a/networks/CNO_He_burn/Make.package b/networks/CNO_He_burn/Make.package new file mode 100644 index 0000000000..39c65eca7b --- /dev/null +++ b/networks/CNO_He_burn/Make.package @@ -0,0 +1,14 @@ +CEXE_headers += network_properties.H + +ifeq ($(USE_REACT),TRUE) + CEXE_sources += actual_network_data.cpp + CEXE_headers += actual_network.H + CEXE_headers += tfactors.H + CEXE_headers += partition_functions.H + CEXE_headers += actual_rhs.H + CEXE_headers += reaclib_rates.H + CEXE_headers += table_rates.H + CEXE_sources += table_rates_data.cpp + USE_SCREENING = TRUE + USE_NEUTRINOS = TRUE +endif diff --git a/networks/CNO_He_burn/_parameters b/networks/CNO_He_burn/_parameters new file mode 100644 index 0000000000..e98e970b5e --- /dev/null +++ b/networks/CNO_He_burn/_parameters @@ -0,0 +1,4 @@ +@namespace: network + +disable_p_C12_to_N13 int 0 +disable_He4_N13_to_p_O16 int 0 diff --git a/networks/CNO_He_burn/actual_network.H b/networks/CNO_He_burn/actual_network.H new file mode 100644 index 0000000000..a4c922e623 --- /dev/null +++ b/networks/CNO_He_burn/actual_network.H @@ -0,0 +1,518 @@ +#ifndef actual_network_H +#define actual_network_H + +#include +#include +#include + +#include +#include + +using namespace amrex; + +void actual_network_init(); + +const std::string network_name = "pynucastro-cxx"; + +namespace network +{ + + template + AMREX_GPU_HOST_DEVICE AMREX_INLINE + constexpr amrex::Real bion () { + using namespace Species; + + static_assert(spec >= 1 && spec <= NumSpec); + + // Set the binding energy of the element + + if constexpr (spec == H1) { + return 0.0_rt; + } + else if constexpr (spec == He4) { + return 28.29566_rt; + } + else if constexpr (spec == C12) { + return 92.16172800000001_rt; + } + else if constexpr (spec == C13) { + return 97.108037_rt; + } + else if constexpr (spec == N13) { + return 94.105219_rt; + } + else if constexpr (spec == N14) { + return 104.65859599999999_rt; + } + else if constexpr (spec == N15) { + return 115.4919_rt; + } + else if constexpr (spec == O14) { + return 98.731892_rt; + } + else if constexpr (spec == O15) { + return 111.95538_rt; + } + else if constexpr (spec == O16) { + return 127.619296_rt; + } + else if constexpr (spec == O17) { + return 131.76237600000002_rt; + } + else if constexpr (spec == O18) { + return 139.807746_rt; + } + else if constexpr (spec == F17) { + return 128.21957600000002_rt; + } + else if constexpr (spec == F18) { + return 137.369484_rt; + } + else if constexpr (spec == F19) { + return 147.801342_rt; + } + else if constexpr (spec == Ne18) { + return 132.142626_rt; + } + else if constexpr (spec == Ne19) { + return 143.779517_rt; + } + else if constexpr (spec == Ne20) { + return 160.6448_rt; + } + else if constexpr (spec == Ne21) { + return 167.405973_rt; + } + else if constexpr (spec == Na22) { + return 174.144674_rt; + } + else if constexpr (spec == Na23) { + return 186.56433900000002_rt; + } + else if constexpr (spec == Mg22) { + return 168.58074200000001_rt; + } + else if constexpr (spec == Mg24) { + return 198.25701600000002_rt; + } + else if constexpr (spec == Al27) { + return 224.951931_rt; + } + else if constexpr (spec == Si28) { + return 236.536832_rt; + } + else if constexpr (spec == P31) { + return 262.91617699999995_rt; + } + else if constexpr (spec == S32) { + return 271.78012800000005_rt; + } + else if constexpr (spec == Ar36) { + return 306.716724_rt; + } + else if constexpr (spec == Ca40) { + return 342.05212000000006_rt; + } + else if constexpr (spec == Ti44) { + return 375.47488000000004_rt; + } + else if constexpr (spec == Cr48) { + return 411.46891200000005_rt; + } + else if constexpr (spec == Fe52) { + return 447.697848_rt; + } + else if constexpr (spec == Ni56) { + return 483.995624_rt; + } + + + // Return zero if we don't recognize the species. + return 0.0_rt; + } + + template + AMREX_GPU_HOST_DEVICE AMREX_INLINE + constexpr amrex::Real mion () { + static_assert(spec >= 1 && spec <= NumSpec); + + constexpr amrex::Real A = NetworkProperties::aion(spec); + constexpr amrex::Real Z = NetworkProperties::zion(spec); + + return (A - Z) * C::Legacy::m_n + Z * (C::Legacy::m_p + C::Legacy::m_e) - bion() * C::Legacy::MeV2gr; + } + + // Legacy (non-templated) interfaces + + AMREX_GPU_HOST_DEVICE AMREX_INLINE + amrex::Real bion (int spec) { + using namespace Species; + + amrex::Real b = 0.0_rt; + + // Set the binding energy of the element + constexpr_for<1, NumSpec+1>([&] (auto n) { + if (n == spec) { + b = bion(); + } + }); + + return b; + } + + AMREX_GPU_HOST_DEVICE AMREX_INLINE + amrex::Real mion (int spec) { + using namespace Species; + + amrex::Real m = 0.0_rt; + + constexpr_for<1, NumSpec+1>([&] (auto n) { + if (n == spec) { + m = mion(); + } + }); + + return m; + } +} + +namespace Rates +{ + + enum NetworkRates + { + k_N13_to_C13_weak_wc12 = 1, + k_O14_to_N14_weak_wc12 = 2, + k_O15_to_N15_weak_wc12 = 3, + k_F17_to_O17_weak_wc12 = 4, + k_F18_to_O18_weak_wc12 = 5, + k_Ne18_to_F18_weak_wc12 = 6, + k_Ne19_to_F19_weak_wc12 = 7, + k_Mg22_to_Na22_weak_wc12 = 8, + k_N13_to_p_C12 = 9, + k_N14_to_p_C13 = 10, + k_O14_to_p_N13 = 11, + k_O15_to_p_N14 = 12, + k_O16_to_p_N15 = 13, + k_O16_to_He4_C12 = 14, + k_F17_to_p_O16 = 15, + k_F18_to_p_O17 = 16, + k_F18_to_He4_N14 = 17, + k_F19_to_p_O18 = 18, + k_F19_to_He4_N15 = 19, + k_Ne18_to_p_F17 = 20, + k_Ne18_to_He4_O14 = 21, + k_Ne19_to_p_F18 = 22, + k_Ne19_to_He4_O15 = 23, + k_Ne20_to_p_F19 = 24, + k_Ne20_to_He4_O16 = 25, + k_Ne21_to_He4_O17 = 26, + k_Na22_to_p_Ne21 = 27, + k_Na22_to_He4_F18 = 28, + k_Na23_to_He4_F19 = 29, + k_Mg22_to_He4_Ne18 = 30, + k_Mg24_to_p_Na23 = 31, + k_Mg24_to_He4_Ne20 = 32, + k_Si28_to_p_Al27 = 33, + k_Si28_to_He4_Mg24 = 34, + k_S32_to_p_P31 = 35, + k_S32_to_He4_Si28 = 36, + k_C12_to_He4_He4_He4 = 37, + k_p_C12_to_N13 = 38, + k_He4_C12_to_O16 = 39, + k_p_C13_to_N14 = 40, + k_p_N13_to_O14 = 41, + k_p_N14_to_O15 = 42, + k_He4_N14_to_F18 = 43, + k_p_N15_to_O16 = 44, + k_He4_N15_to_F19 = 45, + k_He4_O14_to_Ne18 = 46, + k_He4_O15_to_Ne19 = 47, + k_p_O16_to_F17 = 48, + k_He4_O16_to_Ne20 = 49, + k_p_O17_to_F18 = 50, + k_He4_O17_to_Ne21 = 51, + k_p_O18_to_F19 = 52, + k_p_F17_to_Ne18 = 53, + k_p_F18_to_Ne19 = 54, + k_He4_F18_to_Na22 = 55, + k_p_F19_to_Ne20 = 56, + k_He4_F19_to_Na23 = 57, + k_He4_Ne18_to_Mg22 = 58, + k_He4_Ne20_to_Mg24 = 59, + k_p_Ne21_to_Na22 = 60, + k_p_Na23_to_Mg24 = 61, + k_He4_Mg24_to_Si28 = 62, + k_p_Al27_to_Si28 = 63, + k_He4_Si28_to_S32 = 64, + k_p_P31_to_S32 = 65, + k_He4_C12_to_p_N15 = 66, + k_C12_C12_to_p_Na23 = 67, + k_C12_C12_to_He4_Ne20 = 68, + k_He4_N13_to_p_O16 = 69, + k_He4_N14_to_p_O17 = 70, + k_p_N15_to_He4_C12 = 71, + k_He4_N15_to_p_O18 = 72, + k_He4_O14_to_p_F17 = 73, + k_He4_O15_to_p_F18 = 74, + k_p_O16_to_He4_N13 = 75, + k_He4_O16_to_p_F19 = 76, + k_C12_O16_to_p_Al27 = 77, + k_C12_O16_to_He4_Mg24 = 78, + k_O16_O16_to_p_P31 = 79, + k_O16_O16_to_He4_Si28 = 80, + k_p_O17_to_He4_N14 = 81, + k_p_O18_to_He4_N15 = 82, + k_p_F17_to_He4_O14 = 83, + k_He4_F17_to_p_Ne20 = 84, + k_p_F18_to_He4_O15 = 85, + k_He4_F18_to_p_Ne21 = 86, + k_p_F19_to_He4_O16 = 87, + k_He4_Ne19_to_p_Na22 = 88, + k_p_Ne20_to_He4_F17 = 89, + k_He4_Ne20_to_p_Na23 = 90, + k_p_Ne21_to_He4_F18 = 91, + k_p_Na22_to_He4_Ne19 = 92, + k_p_Na23_to_He4_Ne20 = 93, + k_He4_Mg24_to_p_Al27 = 94, + k_p_Al27_to_He4_Mg24 = 95, + k_He4_Si28_to_p_P31 = 96, + k_p_P31_to_He4_Si28 = 97, + k_He4_He4_He4_to_C12 = 98, + k_C12_C12_to_Mg24_modified = 99, + k_O16_O16_to_S32_modified = 100, + k_C12_O16_to_Si28_modified = 101, + k_He4_S32_to_Ar36_removed = 102, + k_He4_S32_to_p_Cl35_removed = 103, + k_p_Cl35_to_Ar36_removed = 104, + k_Ar36_to_He4_S32_removed = 105, + k_Ar36_to_p_Cl35_removed = 106, + k_p_Cl35_to_He4_S32_removed = 107, + k_He4_Ar36_to_Ca40_removed = 108, + k_He4_Ar36_to_p_K39_removed = 109, + k_p_K39_to_Ca40_removed = 110, + k_Ca40_to_He4_Ar36_removed = 111, + k_Ca40_to_p_K39_removed = 112, + k_p_K39_to_He4_Ar36_removed = 113, + k_He4_Ca40_to_Ti44_removed = 114, + k_He4_Ca40_to_p_Sc43_removed = 115, + k_p_Sc43_to_Ti44_removed = 116, + k_Ti44_to_He4_Ca40_removed = 117, + k_Ti44_to_p_Sc43_removed = 118, + k_p_Sc43_to_He4_Ca40_removed = 119, + k_He4_Ti44_to_Cr48_removed = 120, + k_He4_Ti44_to_p_V47_removed = 121, + k_p_V47_to_Cr48_removed = 122, + k_Cr48_to_He4_Ti44_removed = 123, + k_Cr48_to_p_V47_removed = 124, + k_p_V47_to_He4_Ti44_removed = 125, + k_He4_Cr48_to_Fe52_removed = 126, + k_He4_Cr48_to_p_Mn51_removed = 127, + k_p_Mn51_to_Fe52_removed = 128, + k_Fe52_to_He4_Cr48_removed = 129, + k_Fe52_to_p_Mn51_removed = 130, + k_p_Mn51_to_He4_Cr48_removed = 131, + k_He4_Fe52_to_Ni56_removed = 132, + k_He4_Fe52_to_p_Co55_removed = 133, + k_p_Co55_to_Ni56_removed = 134, + k_Ni56_to_He4_Fe52_removed = 135, + k_Ni56_to_p_Co55_removed = 136, + k_p_Co55_to_He4_Fe52_removed = 137, + k_S32_He4_to_Ar36_approx = 138, + k_Ar36_to_S32_He4_approx = 139, + k_Ar36_He4_to_Ca40_approx = 140, + k_Ca40_to_Ar36_He4_approx = 141, + k_Ca40_He4_to_Ti44_approx = 142, + k_Ti44_to_Ca40_He4_approx = 143, + k_Ti44_He4_to_Cr48_approx = 144, + k_Cr48_to_Ti44_He4_approx = 145, + k_Cr48_He4_to_Fe52_approx = 146, + k_Fe52_to_Cr48_He4_approx = 147, + k_Fe52_He4_to_Ni56_approx = 148, + k_Ni56_to_Fe52_He4_approx = 149, + NumRates = k_Ni56_to_Fe52_He4_approx + }; + + // number of reaclib rates + + const int NrateReaclib = 137; + + // number of tabular rates + + const int NrateTabular = 0; + + // rate names -- note: the rates are 1-based, not zero-based, so we pad + // this vector with rate_names[0] = "" so the indices line up with the + // NetworkRates enum + + static const std::vector rate_names = { + "", // 0 + "N13_to_C13_weak_wc12", // 1, + "O14_to_N14_weak_wc12", // 2, + "O15_to_N15_weak_wc12", // 3, + "F17_to_O17_weak_wc12", // 4, + "F18_to_O18_weak_wc12", // 5, + "Ne18_to_F18_weak_wc12", // 6, + "Ne19_to_F19_weak_wc12", // 7, + "Mg22_to_Na22_weak_wc12", // 8, + "N13_to_p_C12", // 9, + "N14_to_p_C13", // 10, + "O14_to_p_N13", // 11, + "O15_to_p_N14", // 12, + "O16_to_p_N15", // 13, + "O16_to_He4_C12", // 14, + "F17_to_p_O16", // 15, + "F18_to_p_O17", // 16, + "F18_to_He4_N14", // 17, + "F19_to_p_O18", // 18, + "F19_to_He4_N15", // 19, + "Ne18_to_p_F17", // 20, + "Ne18_to_He4_O14", // 21, + "Ne19_to_p_F18", // 22, + "Ne19_to_He4_O15", // 23, + "Ne20_to_p_F19", // 24, + "Ne20_to_He4_O16", // 25, + "Ne21_to_He4_O17", // 26, + "Na22_to_p_Ne21", // 27, + "Na22_to_He4_F18", // 28, + "Na23_to_He4_F19", // 29, + "Mg22_to_He4_Ne18", // 30, + "Mg24_to_p_Na23", // 31, + "Mg24_to_He4_Ne20", // 32, + "Si28_to_p_Al27", // 33, + "Si28_to_He4_Mg24", // 34, + "S32_to_p_P31", // 35, + "S32_to_He4_Si28", // 36, + "C12_to_He4_He4_He4", // 37, + "p_C12_to_N13", // 38, + "He4_C12_to_O16", // 39, + "p_C13_to_N14", // 40, + "p_N13_to_O14", // 41, + "p_N14_to_O15", // 42, + "He4_N14_to_F18", // 43, + "p_N15_to_O16", // 44, + "He4_N15_to_F19", // 45, + "He4_O14_to_Ne18", // 46, + "He4_O15_to_Ne19", // 47, + "p_O16_to_F17", // 48, + "He4_O16_to_Ne20", // 49, + "p_O17_to_F18", // 50, + "He4_O17_to_Ne21", // 51, + "p_O18_to_F19", // 52, + "p_F17_to_Ne18", // 53, + "p_F18_to_Ne19", // 54, + "He4_F18_to_Na22", // 55, + "p_F19_to_Ne20", // 56, + "He4_F19_to_Na23", // 57, + "He4_Ne18_to_Mg22", // 58, + "He4_Ne20_to_Mg24", // 59, + "p_Ne21_to_Na22", // 60, + "p_Na23_to_Mg24", // 61, + "He4_Mg24_to_Si28", // 62, + "p_Al27_to_Si28", // 63, + "He4_Si28_to_S32", // 64, + "p_P31_to_S32", // 65, + "He4_C12_to_p_N15", // 66, + "C12_C12_to_p_Na23", // 67, + "C12_C12_to_He4_Ne20", // 68, + "He4_N13_to_p_O16", // 69, + "He4_N14_to_p_O17", // 70, + "p_N15_to_He4_C12", // 71, + "He4_N15_to_p_O18", // 72, + "He4_O14_to_p_F17", // 73, + "He4_O15_to_p_F18", // 74, + "p_O16_to_He4_N13", // 75, + "He4_O16_to_p_F19", // 76, + "C12_O16_to_p_Al27", // 77, + "C12_O16_to_He4_Mg24", // 78, + "O16_O16_to_p_P31", // 79, + "O16_O16_to_He4_Si28", // 80, + "p_O17_to_He4_N14", // 81, + "p_O18_to_He4_N15", // 82, + "p_F17_to_He4_O14", // 83, + "He4_F17_to_p_Ne20", // 84, + "p_F18_to_He4_O15", // 85, + "He4_F18_to_p_Ne21", // 86, + "p_F19_to_He4_O16", // 87, + "He4_Ne19_to_p_Na22", // 88, + "p_Ne20_to_He4_F17", // 89, + "He4_Ne20_to_p_Na23", // 90, + "p_Ne21_to_He4_F18", // 91, + "p_Na22_to_He4_Ne19", // 92, + "p_Na23_to_He4_Ne20", // 93, + "He4_Mg24_to_p_Al27", // 94, + "p_Al27_to_He4_Mg24", // 95, + "He4_Si28_to_p_P31", // 96, + "p_P31_to_He4_Si28", // 97, + "He4_He4_He4_to_C12", // 98, + "C12_C12_to_Mg24_modified", // 99, + "O16_O16_to_S32_modified", // 100, + "C12_O16_to_Si28_modified", // 101, + "He4_S32_to_Ar36_removed", // 102, + "He4_S32_to_p_Cl35_removed", // 103, + "p_Cl35_to_Ar36_removed", // 104, + "Ar36_to_He4_S32_removed", // 105, + "Ar36_to_p_Cl35_removed", // 106, + "p_Cl35_to_He4_S32_removed", // 107, + "He4_Ar36_to_Ca40_removed", // 108, + "He4_Ar36_to_p_K39_removed", // 109, + "p_K39_to_Ca40_removed", // 110, + "Ca40_to_He4_Ar36_removed", // 111, + "Ca40_to_p_K39_removed", // 112, + "p_K39_to_He4_Ar36_removed", // 113, + "He4_Ca40_to_Ti44_removed", // 114, + "He4_Ca40_to_p_Sc43_removed", // 115, + "p_Sc43_to_Ti44_removed", // 116, + "Ti44_to_He4_Ca40_removed", // 117, + "Ti44_to_p_Sc43_removed", // 118, + "p_Sc43_to_He4_Ca40_removed", // 119, + "He4_Ti44_to_Cr48_removed", // 120, + "He4_Ti44_to_p_V47_removed", // 121, + "p_V47_to_Cr48_removed", // 122, + "Cr48_to_He4_Ti44_removed", // 123, + "Cr48_to_p_V47_removed", // 124, + "p_V47_to_He4_Ti44_removed", // 125, + "He4_Cr48_to_Fe52_removed", // 126, + "He4_Cr48_to_p_Mn51_removed", // 127, + "p_Mn51_to_Fe52_removed", // 128, + "Fe52_to_He4_Cr48_removed", // 129, + "Fe52_to_p_Mn51_removed", // 130, + "p_Mn51_to_He4_Cr48_removed", // 131, + "He4_Fe52_to_Ni56_removed", // 132, + "He4_Fe52_to_p_Co55_removed", // 133, + "p_Co55_to_Ni56_removed", // 134, + "Ni56_to_He4_Fe52_removed", // 135, + "Ni56_to_p_Co55_removed", // 136, + "p_Co55_to_He4_Fe52_removed", // 137, + "S32_He4_to_Ar36_approx", // 138, + "Ar36_to_S32_He4_approx", // 139, + "Ar36_He4_to_Ca40_approx", // 140, + "Ca40_to_Ar36_He4_approx", // 141, + "Ca40_He4_to_Ti44_approx", // 142, + "Ti44_to_Ca40_He4_approx", // 143, + "Ti44_He4_to_Cr48_approx", // 144, + "Cr48_to_Ti44_He4_approx", // 145, + "Cr48_He4_to_Fe52_approx", // 146, + "Fe52_to_Cr48_He4_approx", // 147, + "Fe52_He4_to_Ni56_approx", // 148, + "Ni56_to_Fe52_He4_approx" // 149, + }; + +} + +#ifdef NSE_NET +namespace NSE_INDEX +{ + constexpr int H1_index = 0; + constexpr int N_index = -1; + constexpr int He4_index = 1; + + // Each row corresponds to the rate in NetworkRates enum + // First 3 row indices for reactants, followed by 3 product indices + // last index is the corresponding reverse rate index. + + extern AMREX_GPU_MANAGED amrex::Array2D rate_indices; +} +#endif + +#endif diff --git a/networks/CNO_He_burn/actual_network_data.cpp b/networks/CNO_He_burn/actual_network_data.cpp new file mode 100644 index 0000000000..7d0e4cf495 --- /dev/null +++ b/networks/CNO_He_burn/actual_network_data.cpp @@ -0,0 +1,164 @@ +#include + + +#ifdef NSE_NET +namespace NSE_INDEX +{ + AMREX_GPU_MANAGED amrex::Array2D rate_indices { + -1, -1, 4, -1, -1, 3, -1, + -1, -1, 7, -1, -1, 5, -1, + -1, -1, 8, -1, -1, 6, -1, + -1, -1, 12, -1, -1, 10, -1, + -1, -1, 13, -1, -1, 11, -1, + -1, -1, 15, -1, -1, 13, -1, + -1, -1, 16, -1, -1, 14, -1, + -1, -1, 21, -1, -1, 19, -1, + -1, -1, 4, -1, 0, 2, -1, + -1, -1, 5, -1, 0, 3, -1, + -1, -1, 7, -1, 0, 4, -1, + -1, -1, 8, -1, 0, 5, -1, + -1, -1, 9, -1, 0, 6, -1, + -1, -1, 9, -1, 1, 2, -1, + -1, -1, 12, -1, 0, 9, -1, + -1, -1, 13, -1, 0, 10, -1, + -1, -1, 13, -1, 1, 5, -1, + -1, -1, 14, -1, 0, 11, -1, + -1, -1, 14, -1, 1, 6, -1, + -1, -1, 15, -1, 0, 12, -1, + -1, -1, 15, -1, 1, 7, -1, + -1, -1, 16, -1, 0, 13, -1, + -1, -1, 16, -1, 1, 8, -1, + -1, -1, 17, -1, 0, 14, -1, + -1, -1, 17, -1, 1, 9, -1, + -1, -1, 18, -1, 1, 10, -1, + -1, -1, 19, -1, 0, 18, -1, + -1, -1, 19, -1, 1, 13, -1, + -1, -1, 20, -1, 1, 14, -1, + -1, -1, 21, -1, 1, 15, -1, + -1, -1, 22, -1, 0, 20, -1, + -1, -1, 22, -1, 1, 17, -1, + -1, -1, 24, -1, 0, 23, -1, + -1, -1, 24, -1, 1, 22, -1, + -1, -1, 26, -1, 0, 25, -1, + -1, -1, 26, -1, 1, 24, -1, + -1, -1, 2, 1, 1, 1, -1, + -1, 0, 2, -1, -1, 4, 9, + -1, 1, 2, -1, -1, 9, 14, + -1, 0, 3, -1, -1, 5, 10, + -1, 0, 4, -1, -1, 7, 11, + -1, 0, 5, -1, -1, 8, 12, + -1, 1, 5, -1, -1, 13, 17, + -1, 0, 6, -1, -1, 9, 13, + -1, 1, 6, -1, -1, 14, 19, + -1, 1, 7, -1, -1, 15, 21, + -1, 1, 8, -1, -1, 16, 23, + -1, 0, 9, -1, -1, 12, 15, + -1, 1, 9, -1, -1, 17, 25, + -1, 0, 10, -1, -1, 13, 16, + -1, 1, 10, -1, -1, 18, 26, + -1, 0, 11, -1, -1, 14, 18, + -1, 0, 12, -1, -1, 15, 20, + -1, 0, 13, -1, -1, 16, 22, + -1, 1, 13, -1, -1, 19, 28, + -1, 0, 14, -1, -1, 17, 24, + -1, 1, 14, -1, -1, 20, 29, + -1, 1, 15, -1, -1, 21, 30, + -1, 1, 17, -1, -1, 22, 32, + -1, 0, 18, -1, -1, 19, 27, + -1, 0, 20, -1, -1, 22, 31, + -1, 1, 22, -1, -1, 24, 34, + -1, 0, 23, -1, -1, 24, 33, + -1, 1, 24, -1, -1, 26, 36, + -1, 0, 25, -1, -1, 26, 35, + -1, 1, 2, -1, 0, 6, -1, + -1, 2, 2, -1, 0, 20, -1, + -1, 2, 2, -1, 1, 17, -1, + -1, 1, 4, -1, 0, 9, 75, + -1, 1, 5, -1, 0, 10, -1, + -1, 0, 6, -1, 1, 2, 66, + -1, 1, 6, -1, 0, 11, -1, + -1, 1, 7, -1, 0, 12, 83, + -1, 1, 8, -1, 0, 13, -1, + -1, 0, 9, -1, 1, 4, -1, + -1, 1, 9, -1, 0, 14, -1, + -1, 2, 9, -1, 0, 23, -1, + -1, 2, 9, -1, 1, 22, -1, + -1, 9, 9, -1, 0, 25, -1, + -1, 9, 9, -1, 1, 24, -1, + -1, 0, 10, -1, 1, 5, 70, + -1, 0, 11, -1, 1, 6, 72, + -1, 0, 12, -1, 1, 7, -1, + -1, 1, 12, -1, 0, 17, 89, + -1, 0, 13, -1, 1, 8, 74, + -1, 1, 13, -1, 0, 18, 91, + -1, 0, 14, -1, 1, 9, 76, + -1, 1, 16, -1, 0, 19, 92, + -1, 0, 17, -1, 1, 12, -1, + -1, 1, 17, -1, 0, 20, -1, + -1, 0, 18, -1, 1, 13, -1, + -1, 0, 19, -1, 1, 16, -1, + -1, 0, 20, -1, 1, 17, 90, + -1, 1, 22, -1, 0, 23, -1, + -1, 0, 23, -1, 1, 22, 94, + -1, 1, 24, -1, 0, 25, -1, + -1, 0, 25, -1, 1, 24, 96, + 1, 1, 1, -1, -1, 2, 37, + -1, 2, 2, -1, -1, 22, -1, + -1, 9, 9, -1, -1, 26, -1, + -1, 2, 9, -1, -1, 24, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, 1, 26, -1, -1, 27, 139, + -1, -1, 27, -1, 1, 26, -1, + -1, 1, 27, -1, -1, 28, 141, + -1, -1, 28, -1, 1, 27, -1, + -1, 1, 28, -1, -1, 29, 143, + -1, -1, 29, -1, 1, 28, -1, + -1, 1, 29, -1, -1, 30, 145, + -1, -1, 30, -1, 1, 29, -1, + -1, 1, 30, -1, -1, 31, 147, + -1, -1, 31, -1, 1, 30, -1, + -1, 1, 31, -1, -1, 32, 149, + -1, -1, 32, -1, 1, 31, -1 + }; +} +#endif + +void actual_network_init() +{ + +} diff --git a/networks/CNO_He_burn/actual_rhs.H b/networks/CNO_He_burn/actual_rhs.H new file mode 100644 index 0000000000..7985edf788 --- /dev/null +++ b/networks/CNO_He_burn/actual_rhs.H @@ -0,0 +1,2873 @@ +#ifndef actual_rhs_H +#define actual_rhs_H + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace amrex; +using namespace ArrayUtil; + +using namespace Species; +using namespace Rates; + +using namespace rate_tables; + + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void ener_gener_rate(T const& dydt, amrex::Real& enuc) +{ + + // Computes the instantaneous energy generation rate (from the nuclei) + + // This is basically e = m c**2 + + enuc = 0.0_rt; + + for (int n = 1; n <= NumSpec; ++n) { + enuc += dydt(n) * network::mion(n); + } + + enuc *= C::Legacy::enuc_conv2; +} + + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void evaluate_rates(const burn_t& state, T& rate_eval) { + + + // create molar fractions + + amrex::Array1D Y; + for (int n = 1; n <= NumSpec; ++n) { + Y(n) = state.xn[n-1] * aion_inv[n-1]; + } + + [[maybe_unused]] amrex::Real rhoy = state.rho * state.y_e; + + // Calculate Reaclib rates + + using number_t = std::conditional_t; + number_t temp = state.T; + if constexpr (do_T_derivatives) { + // seed the dual number for temperature before calculating anything with it + autodiff::seed(temp); + } + plasma_state_t pstate{}; + fill_plasma_state(pstate, temp, state.rho, Y); + + tf_t tfactors = evaluate_tfactors(state.T); + + fill_reaclib_rates(tfactors, rate_eval); + + if (disable_p_C12_to_N13) { + rate_eval.screened_rates(k_p_C12_to_N13) = 0.0; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_C12_to_N13) = 0.0; + } + rate_eval.screened_rates(k_N13_to_p_C12) = 0.0; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_N13_to_p_C12) = 0.0; + } + } + + if (disable_He4_N13_to_p_O16) { + rate_eval.screened_rates(k_He4_N13_to_p_O16) = 0.0; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_N13_to_p_O16) = 0.0; + } + rate_eval.screened_rates(k_p_O16_to_He4_N13) = 0.0; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_O16_to_He4_N13) = 0.0; + } + } + + + + // Evaluate screening factors + + amrex::Real ratraw, dratraw_dT; + amrex::Real scor, dscor_dt; + [[maybe_unused]] amrex::Real scor2, dscor2_dt; + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 6.0_rt, 12.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_N13_to_p_C12); + rate_eval.screened_rates(k_N13_to_p_C12) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_N13_to_p_C12); + rate_eval.dscreened_rates_dT(k_N13_to_p_C12) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_C12_to_N13); + rate_eval.screened_rates(k_p_C12_to_N13) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_C12_to_N13); + rate_eval.dscreened_rates_dT(k_p_C12_to_N13) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 6.0_rt, 13.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_N14_to_p_C13); + rate_eval.screened_rates(k_N14_to_p_C13) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_N14_to_p_C13); + rate_eval.dscreened_rates_dT(k_N14_to_p_C13) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_C13_to_N14); + rate_eval.screened_rates(k_p_C13_to_N14) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_C13_to_N14); + rate_eval.dscreened_rates_dT(k_p_C13_to_N14) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 7.0_rt, 13.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_O14_to_p_N13); + rate_eval.screened_rates(k_O14_to_p_N13) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_O14_to_p_N13); + rate_eval.dscreened_rates_dT(k_O14_to_p_N13) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_N13_to_O14); + rate_eval.screened_rates(k_p_N13_to_O14) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_N13_to_O14); + rate_eval.dscreened_rates_dT(k_p_N13_to_O14) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 7.0_rt, 14.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_O15_to_p_N14); + rate_eval.screened_rates(k_O15_to_p_N14) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_O15_to_p_N14); + rate_eval.dscreened_rates_dT(k_O15_to_p_N14) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_N14_to_O15); + rate_eval.screened_rates(k_p_N14_to_O15) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_N14_to_O15); + rate_eval.dscreened_rates_dT(k_p_N14_to_O15) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 7.0_rt, 15.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_O16_to_p_N15); + rate_eval.screened_rates(k_O16_to_p_N15) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_O16_to_p_N15); + rate_eval.dscreened_rates_dT(k_O16_to_p_N15) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_N15_to_O16); + rate_eval.screened_rates(k_p_N15_to_O16) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_N15_to_O16); + rate_eval.dscreened_rates_dT(k_p_N15_to_O16) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_C12_to_p_N15); + rate_eval.screened_rates(k_He4_C12_to_p_N15) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_C12_to_p_N15); + rate_eval.dscreened_rates_dT(k_He4_C12_to_p_N15) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_N15_to_He4_C12); + rate_eval.screened_rates(k_p_N15_to_He4_C12) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_N15_to_He4_C12); + rate_eval.dscreened_rates_dT(k_p_N15_to_He4_C12) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 6.0_rt, 12.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_O16_to_He4_C12); + rate_eval.screened_rates(k_O16_to_He4_C12) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_O16_to_He4_C12); + rate_eval.dscreened_rates_dT(k_O16_to_He4_C12) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_C12_to_O16); + rate_eval.screened_rates(k_He4_C12_to_O16) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_C12_to_O16); + rate_eval.dscreened_rates_dT(k_He4_C12_to_O16) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 8.0_rt, 16.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_F17_to_p_O16); + rate_eval.screened_rates(k_F17_to_p_O16) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_F17_to_p_O16); + rate_eval.dscreened_rates_dT(k_F17_to_p_O16) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_O16_to_F17); + rate_eval.screened_rates(k_p_O16_to_F17) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_O16_to_F17); + rate_eval.dscreened_rates_dT(k_p_O16_to_F17) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 8.0_rt, 17.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_F18_to_p_O17); + rate_eval.screened_rates(k_F18_to_p_O17) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_F18_to_p_O17); + rate_eval.dscreened_rates_dT(k_F18_to_p_O17) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_O17_to_F18); + rate_eval.screened_rates(k_p_O17_to_F18) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_O17_to_F18); + rate_eval.dscreened_rates_dT(k_p_O17_to_F18) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_N14_to_p_O17); + rate_eval.screened_rates(k_He4_N14_to_p_O17) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_N14_to_p_O17); + rate_eval.dscreened_rates_dT(k_He4_N14_to_p_O17) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_O17_to_He4_N14); + rate_eval.screened_rates(k_p_O17_to_He4_N14) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_O17_to_He4_N14); + rate_eval.dscreened_rates_dT(k_p_O17_to_He4_N14) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 7.0_rt, 14.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_F18_to_He4_N14); + rate_eval.screened_rates(k_F18_to_He4_N14) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_F18_to_He4_N14); + rate_eval.dscreened_rates_dT(k_F18_to_He4_N14) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_N14_to_F18); + rate_eval.screened_rates(k_He4_N14_to_F18) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_N14_to_F18); + rate_eval.dscreened_rates_dT(k_He4_N14_to_F18) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 8.0_rt, 18.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_F19_to_p_O18); + rate_eval.screened_rates(k_F19_to_p_O18) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_F19_to_p_O18); + rate_eval.dscreened_rates_dT(k_F19_to_p_O18) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_O18_to_F19); + rate_eval.screened_rates(k_p_O18_to_F19) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_O18_to_F19); + rate_eval.dscreened_rates_dT(k_p_O18_to_F19) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_N15_to_p_O18); + rate_eval.screened_rates(k_He4_N15_to_p_O18) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_N15_to_p_O18); + rate_eval.dscreened_rates_dT(k_He4_N15_to_p_O18) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_O18_to_He4_N15); + rate_eval.screened_rates(k_p_O18_to_He4_N15) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_O18_to_He4_N15); + rate_eval.dscreened_rates_dT(k_p_O18_to_He4_N15) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 7.0_rt, 15.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_F19_to_He4_N15); + rate_eval.screened_rates(k_F19_to_He4_N15) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_F19_to_He4_N15); + rate_eval.dscreened_rates_dT(k_F19_to_He4_N15) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_N15_to_F19); + rate_eval.screened_rates(k_He4_N15_to_F19) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_N15_to_F19); + rate_eval.dscreened_rates_dT(k_He4_N15_to_F19) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 9.0_rt, 17.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_Ne18_to_p_F17); + rate_eval.screened_rates(k_Ne18_to_p_F17) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Ne18_to_p_F17); + rate_eval.dscreened_rates_dT(k_Ne18_to_p_F17) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_F17_to_Ne18); + rate_eval.screened_rates(k_p_F17_to_Ne18) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_F17_to_Ne18); + rate_eval.dscreened_rates_dT(k_p_F17_to_Ne18) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 8.0_rt, 14.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_Ne18_to_He4_O14); + rate_eval.screened_rates(k_Ne18_to_He4_O14) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Ne18_to_He4_O14); + rate_eval.dscreened_rates_dT(k_Ne18_to_He4_O14) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_O14_to_Ne18); + rate_eval.screened_rates(k_He4_O14_to_Ne18) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_O14_to_Ne18); + rate_eval.dscreened_rates_dT(k_He4_O14_to_Ne18) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_O14_to_p_F17); + rate_eval.screened_rates(k_He4_O14_to_p_F17) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_O14_to_p_F17); + rate_eval.dscreened_rates_dT(k_He4_O14_to_p_F17) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_F17_to_He4_O14); + rate_eval.screened_rates(k_p_F17_to_He4_O14) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_F17_to_He4_O14); + rate_eval.dscreened_rates_dT(k_p_F17_to_He4_O14) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 9.0_rt, 18.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_Ne19_to_p_F18); + rate_eval.screened_rates(k_Ne19_to_p_F18) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Ne19_to_p_F18); + rate_eval.dscreened_rates_dT(k_Ne19_to_p_F18) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_F18_to_Ne19); + rate_eval.screened_rates(k_p_F18_to_Ne19) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_F18_to_Ne19); + rate_eval.dscreened_rates_dT(k_p_F18_to_Ne19) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_O15_to_p_F18); + rate_eval.screened_rates(k_He4_O15_to_p_F18) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_O15_to_p_F18); + rate_eval.dscreened_rates_dT(k_He4_O15_to_p_F18) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_F18_to_He4_O15); + rate_eval.screened_rates(k_p_F18_to_He4_O15) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_F18_to_He4_O15); + rate_eval.dscreened_rates_dT(k_p_F18_to_He4_O15) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 8.0_rt, 15.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_Ne19_to_He4_O15); + rate_eval.screened_rates(k_Ne19_to_He4_O15) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Ne19_to_He4_O15); + rate_eval.dscreened_rates_dT(k_Ne19_to_He4_O15) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_O15_to_Ne19); + rate_eval.screened_rates(k_He4_O15_to_Ne19) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_O15_to_Ne19); + rate_eval.dscreened_rates_dT(k_He4_O15_to_Ne19) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 9.0_rt, 19.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_Ne20_to_p_F19); + rate_eval.screened_rates(k_Ne20_to_p_F19) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Ne20_to_p_F19); + rate_eval.dscreened_rates_dT(k_Ne20_to_p_F19) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_F19_to_Ne20); + rate_eval.screened_rates(k_p_F19_to_Ne20) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_F19_to_Ne20); + rate_eval.dscreened_rates_dT(k_p_F19_to_Ne20) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_O16_to_p_F19); + rate_eval.screened_rates(k_He4_O16_to_p_F19) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_O16_to_p_F19); + rate_eval.dscreened_rates_dT(k_He4_O16_to_p_F19) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_F19_to_He4_O16); + rate_eval.screened_rates(k_p_F19_to_He4_O16) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_F19_to_He4_O16); + rate_eval.dscreened_rates_dT(k_p_F19_to_He4_O16) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 8.0_rt, 16.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_Ne20_to_He4_O16); + rate_eval.screened_rates(k_Ne20_to_He4_O16) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Ne20_to_He4_O16); + rate_eval.dscreened_rates_dT(k_Ne20_to_He4_O16) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_O16_to_Ne20); + rate_eval.screened_rates(k_He4_O16_to_Ne20) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_O16_to_Ne20); + rate_eval.dscreened_rates_dT(k_He4_O16_to_Ne20) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 8.0_rt, 17.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_Ne21_to_He4_O17); + rate_eval.screened_rates(k_Ne21_to_He4_O17) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Ne21_to_He4_O17); + rate_eval.dscreened_rates_dT(k_Ne21_to_He4_O17) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_O17_to_Ne21); + rate_eval.screened_rates(k_He4_O17_to_Ne21) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_O17_to_Ne21); + rate_eval.dscreened_rates_dT(k_He4_O17_to_Ne21) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 10.0_rt, 21.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_Na22_to_p_Ne21); + rate_eval.screened_rates(k_Na22_to_p_Ne21) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Na22_to_p_Ne21); + rate_eval.dscreened_rates_dT(k_Na22_to_p_Ne21) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Ne21_to_Na22); + rate_eval.screened_rates(k_p_Ne21_to_Na22) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Ne21_to_Na22); + rate_eval.dscreened_rates_dT(k_p_Ne21_to_Na22) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 9.0_rt, 18.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_Na22_to_He4_F18); + rate_eval.screened_rates(k_Na22_to_He4_F18) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Na22_to_He4_F18); + rate_eval.dscreened_rates_dT(k_Na22_to_He4_F18) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_F18_to_Na22); + rate_eval.screened_rates(k_He4_F18_to_Na22) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_F18_to_Na22); + rate_eval.dscreened_rates_dT(k_He4_F18_to_Na22) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_F18_to_p_Ne21); + rate_eval.screened_rates(k_He4_F18_to_p_Ne21) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_F18_to_p_Ne21); + rate_eval.dscreened_rates_dT(k_He4_F18_to_p_Ne21) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Ne21_to_He4_F18); + rate_eval.screened_rates(k_p_Ne21_to_He4_F18) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Ne21_to_He4_F18); + rate_eval.dscreened_rates_dT(k_p_Ne21_to_He4_F18) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 9.0_rt, 19.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_Na23_to_He4_F19); + rate_eval.screened_rates(k_Na23_to_He4_F19) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Na23_to_He4_F19); + rate_eval.dscreened_rates_dT(k_Na23_to_He4_F19) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_F19_to_Na23); + rate_eval.screened_rates(k_He4_F19_to_Na23) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_F19_to_Na23); + rate_eval.dscreened_rates_dT(k_He4_F19_to_Na23) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 10.0_rt, 18.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_Mg22_to_He4_Ne18); + rate_eval.screened_rates(k_Mg22_to_He4_Ne18) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Mg22_to_He4_Ne18); + rate_eval.dscreened_rates_dT(k_Mg22_to_He4_Ne18) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_Ne18_to_Mg22); + rate_eval.screened_rates(k_He4_Ne18_to_Mg22) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Ne18_to_Mg22); + rate_eval.dscreened_rates_dT(k_He4_Ne18_to_Mg22) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 11.0_rt, 23.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_Mg24_to_p_Na23); + rate_eval.screened_rates(k_Mg24_to_p_Na23) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Mg24_to_p_Na23); + rate_eval.dscreened_rates_dT(k_Mg24_to_p_Na23) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Na23_to_Mg24); + rate_eval.screened_rates(k_p_Na23_to_Mg24) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Na23_to_Mg24); + rate_eval.dscreened_rates_dT(k_p_Na23_to_Mg24) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_Ne20_to_p_Na23); + rate_eval.screened_rates(k_He4_Ne20_to_p_Na23) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Ne20_to_p_Na23); + rate_eval.dscreened_rates_dT(k_He4_Ne20_to_p_Na23) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Na23_to_He4_Ne20); + rate_eval.screened_rates(k_p_Na23_to_He4_Ne20) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Na23_to_He4_Ne20); + rate_eval.dscreened_rates_dT(k_p_Na23_to_He4_Ne20) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 10.0_rt, 20.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_Mg24_to_He4_Ne20); + rate_eval.screened_rates(k_Mg24_to_He4_Ne20) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Mg24_to_He4_Ne20); + rate_eval.dscreened_rates_dT(k_Mg24_to_He4_Ne20) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_Ne20_to_Mg24); + rate_eval.screened_rates(k_He4_Ne20_to_Mg24) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Ne20_to_Mg24); + rate_eval.dscreened_rates_dT(k_He4_Ne20_to_Mg24) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 13.0_rt, 27.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_Si28_to_p_Al27); + rate_eval.screened_rates(k_Si28_to_p_Al27) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Si28_to_p_Al27); + rate_eval.dscreened_rates_dT(k_Si28_to_p_Al27) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Al27_to_Si28); + rate_eval.screened_rates(k_p_Al27_to_Si28) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Al27_to_Si28); + rate_eval.dscreened_rates_dT(k_p_Al27_to_Si28) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_Mg24_to_p_Al27); + rate_eval.screened_rates(k_He4_Mg24_to_p_Al27) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Mg24_to_p_Al27); + rate_eval.dscreened_rates_dT(k_He4_Mg24_to_p_Al27) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Al27_to_He4_Mg24); + rate_eval.screened_rates(k_p_Al27_to_He4_Mg24) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Al27_to_He4_Mg24); + rate_eval.dscreened_rates_dT(k_p_Al27_to_He4_Mg24) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 12.0_rt, 24.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_Si28_to_He4_Mg24); + rate_eval.screened_rates(k_Si28_to_He4_Mg24) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Si28_to_He4_Mg24); + rate_eval.dscreened_rates_dT(k_Si28_to_He4_Mg24) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_Mg24_to_Si28); + rate_eval.screened_rates(k_He4_Mg24_to_Si28) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Mg24_to_Si28); + rate_eval.dscreened_rates_dT(k_He4_Mg24_to_Si28) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 15.0_rt, 31.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_S32_to_p_P31); + rate_eval.screened_rates(k_S32_to_p_P31) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_S32_to_p_P31); + rate_eval.dscreened_rates_dT(k_S32_to_p_P31) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_P31_to_S32); + rate_eval.screened_rates(k_p_P31_to_S32) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_P31_to_S32); + rate_eval.dscreened_rates_dT(k_p_P31_to_S32) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_Si28_to_p_P31); + rate_eval.screened_rates(k_He4_Si28_to_p_P31) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Si28_to_p_P31); + rate_eval.dscreened_rates_dT(k_He4_Si28_to_p_P31) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_P31_to_He4_Si28); + rate_eval.screened_rates(k_p_P31_to_He4_Si28) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_P31_to_He4_Si28); + rate_eval.dscreened_rates_dT(k_p_P31_to_He4_Si28) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 14.0_rt, 28.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_S32_to_He4_Si28); + rate_eval.screened_rates(k_S32_to_He4_Si28) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_S32_to_He4_Si28); + rate_eval.dscreened_rates_dT(k_S32_to_He4_Si28) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_Si28_to_S32); + rate_eval.screened_rates(k_He4_Si28_to_S32) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Si28_to_S32); + rate_eval.dscreened_rates_dT(k_He4_Si28_to_S32) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 2.0_rt, 4.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + + { + constexpr auto scn_fac2 = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 4.0_rt, 8.0_rt); + + + static_assert(scn_fac2.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac2, scor2, dscor2_dt); + + } + + + ratraw = rate_eval.screened_rates(k_C12_to_He4_He4_He4); + rate_eval.screened_rates(k_C12_to_He4_He4_He4) *= scor * scor2; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_C12_to_He4_He4_He4); + rate_eval.dscreened_rates_dT(k_C12_to_He4_He4_He4) = ratraw * (scor * dscor2_dt + dscor_dt * scor2) + dratraw_dT * scor * scor2; + } + + ratraw = rate_eval.screened_rates(k_He4_He4_He4_to_C12); + rate_eval.screened_rates(k_He4_He4_He4_to_C12) *= scor * scor2; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_He4_He4_to_C12); + rate_eval.dscreened_rates_dT(k_He4_He4_He4_to_C12) = ratraw * (scor * dscor2_dt + dscor_dt * scor2) + dratraw_dT * scor * scor2; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(6.0_rt, 12.0_rt, 6.0_rt, 12.0_rt); + + + static_assert(scn_fac.z1 == 6.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_C12_C12_to_p_Na23); + rate_eval.screened_rates(k_C12_C12_to_p_Na23) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_C12_C12_to_p_Na23); + rate_eval.dscreened_rates_dT(k_C12_C12_to_p_Na23) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_C12_C12_to_He4_Ne20); + rate_eval.screened_rates(k_C12_C12_to_He4_Ne20) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_C12_C12_to_He4_Ne20); + rate_eval.dscreened_rates_dT(k_C12_C12_to_He4_Ne20) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_C12_C12_to_Mg24_modified); + rate_eval.screened_rates(k_C12_C12_to_Mg24_modified) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_C12_C12_to_Mg24_modified); + rate_eval.dscreened_rates_dT(k_C12_C12_to_Mg24_modified) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 7.0_rt, 13.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_N13_to_p_O16); + rate_eval.screened_rates(k_He4_N13_to_p_O16) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_N13_to_p_O16); + rate_eval.dscreened_rates_dT(k_He4_N13_to_p_O16) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_O16_to_He4_N13); + rate_eval.screened_rates(k_p_O16_to_He4_N13) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_O16_to_He4_N13); + rate_eval.dscreened_rates_dT(k_p_O16_to_He4_N13) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(6.0_rt, 12.0_rt, 8.0_rt, 16.0_rt); + + + static_assert(scn_fac.z1 == 6.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_C12_O16_to_p_Al27); + rate_eval.screened_rates(k_C12_O16_to_p_Al27) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_C12_O16_to_p_Al27); + rate_eval.dscreened_rates_dT(k_C12_O16_to_p_Al27) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_C12_O16_to_He4_Mg24); + rate_eval.screened_rates(k_C12_O16_to_He4_Mg24) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_C12_O16_to_He4_Mg24); + rate_eval.dscreened_rates_dT(k_C12_O16_to_He4_Mg24) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_C12_O16_to_Si28_modified); + rate_eval.screened_rates(k_C12_O16_to_Si28_modified) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_C12_O16_to_Si28_modified); + rate_eval.dscreened_rates_dT(k_C12_O16_to_Si28_modified) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(8.0_rt, 16.0_rt, 8.0_rt, 16.0_rt); + + + static_assert(scn_fac.z1 == 8.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_O16_O16_to_p_P31); + rate_eval.screened_rates(k_O16_O16_to_p_P31) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_O16_O16_to_p_P31); + rate_eval.dscreened_rates_dT(k_O16_O16_to_p_P31) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_O16_O16_to_He4_Si28); + rate_eval.screened_rates(k_O16_O16_to_He4_Si28) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_O16_O16_to_He4_Si28); + rate_eval.dscreened_rates_dT(k_O16_O16_to_He4_Si28) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_O16_O16_to_S32_modified); + rate_eval.screened_rates(k_O16_O16_to_S32_modified) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_O16_O16_to_S32_modified); + rate_eval.dscreened_rates_dT(k_O16_O16_to_S32_modified) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 9.0_rt, 17.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_F17_to_p_Ne20); + rate_eval.screened_rates(k_He4_F17_to_p_Ne20) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_F17_to_p_Ne20); + rate_eval.dscreened_rates_dT(k_He4_F17_to_p_Ne20) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Ne20_to_He4_F17); + rate_eval.screened_rates(k_p_Ne20_to_He4_F17) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Ne20_to_He4_F17); + rate_eval.dscreened_rates_dT(k_p_Ne20_to_He4_F17) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 10.0_rt, 19.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_Ne19_to_p_Na22); + rate_eval.screened_rates(k_He4_Ne19_to_p_Na22) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Ne19_to_p_Na22); + rate_eval.dscreened_rates_dT(k_He4_Ne19_to_p_Na22) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Na22_to_He4_Ne19); + rate_eval.screened_rates(k_p_Na22_to_He4_Ne19) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Na22_to_He4_Ne19); + rate_eval.dscreened_rates_dT(k_p_Na22_to_He4_Ne19) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 16.0_rt, 32.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_S32_to_Ar36_removed); + rate_eval.screened_rates(k_He4_S32_to_Ar36_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_S32_to_Ar36_removed); + rate_eval.dscreened_rates_dT(k_He4_S32_to_Ar36_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_Ar36_to_He4_S32_removed); + rate_eval.screened_rates(k_Ar36_to_He4_S32_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Ar36_to_He4_S32_removed); + rate_eval.dscreened_rates_dT(k_Ar36_to_He4_S32_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 17.0_rt, 35.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_S32_to_p_Cl35_removed); + rate_eval.screened_rates(k_He4_S32_to_p_Cl35_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_S32_to_p_Cl35_removed); + rate_eval.dscreened_rates_dT(k_He4_S32_to_p_Cl35_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Cl35_to_Ar36_removed); + rate_eval.screened_rates(k_p_Cl35_to_Ar36_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Cl35_to_Ar36_removed); + rate_eval.dscreened_rates_dT(k_p_Cl35_to_Ar36_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_Ar36_to_p_Cl35_removed); + rate_eval.screened_rates(k_Ar36_to_p_Cl35_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Ar36_to_p_Cl35_removed); + rate_eval.dscreened_rates_dT(k_Ar36_to_p_Cl35_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Cl35_to_He4_S32_removed); + rate_eval.screened_rates(k_p_Cl35_to_He4_S32_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Cl35_to_He4_S32_removed); + rate_eval.dscreened_rates_dT(k_p_Cl35_to_He4_S32_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 18.0_rt, 36.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_Ar36_to_Ca40_removed); + rate_eval.screened_rates(k_He4_Ar36_to_Ca40_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Ar36_to_Ca40_removed); + rate_eval.dscreened_rates_dT(k_He4_Ar36_to_Ca40_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_Ca40_to_He4_Ar36_removed); + rate_eval.screened_rates(k_Ca40_to_He4_Ar36_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Ca40_to_He4_Ar36_removed); + rate_eval.dscreened_rates_dT(k_Ca40_to_He4_Ar36_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 19.0_rt, 39.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_Ar36_to_p_K39_removed); + rate_eval.screened_rates(k_He4_Ar36_to_p_K39_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Ar36_to_p_K39_removed); + rate_eval.dscreened_rates_dT(k_He4_Ar36_to_p_K39_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_K39_to_Ca40_removed); + rate_eval.screened_rates(k_p_K39_to_Ca40_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_K39_to_Ca40_removed); + rate_eval.dscreened_rates_dT(k_p_K39_to_Ca40_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_Ca40_to_p_K39_removed); + rate_eval.screened_rates(k_Ca40_to_p_K39_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Ca40_to_p_K39_removed); + rate_eval.dscreened_rates_dT(k_Ca40_to_p_K39_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_K39_to_He4_Ar36_removed); + rate_eval.screened_rates(k_p_K39_to_He4_Ar36_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_K39_to_He4_Ar36_removed); + rate_eval.dscreened_rates_dT(k_p_K39_to_He4_Ar36_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 20.0_rt, 40.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_Ca40_to_Ti44_removed); + rate_eval.screened_rates(k_He4_Ca40_to_Ti44_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Ca40_to_Ti44_removed); + rate_eval.dscreened_rates_dT(k_He4_Ca40_to_Ti44_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_Ti44_to_He4_Ca40_removed); + rate_eval.screened_rates(k_Ti44_to_He4_Ca40_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Ti44_to_He4_Ca40_removed); + rate_eval.dscreened_rates_dT(k_Ti44_to_He4_Ca40_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 21.0_rt, 43.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_Ca40_to_p_Sc43_removed); + rate_eval.screened_rates(k_He4_Ca40_to_p_Sc43_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Ca40_to_p_Sc43_removed); + rate_eval.dscreened_rates_dT(k_He4_Ca40_to_p_Sc43_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Sc43_to_Ti44_removed); + rate_eval.screened_rates(k_p_Sc43_to_Ti44_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Sc43_to_Ti44_removed); + rate_eval.dscreened_rates_dT(k_p_Sc43_to_Ti44_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_Ti44_to_p_Sc43_removed); + rate_eval.screened_rates(k_Ti44_to_p_Sc43_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Ti44_to_p_Sc43_removed); + rate_eval.dscreened_rates_dT(k_Ti44_to_p_Sc43_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Sc43_to_He4_Ca40_removed); + rate_eval.screened_rates(k_p_Sc43_to_He4_Ca40_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Sc43_to_He4_Ca40_removed); + rate_eval.dscreened_rates_dT(k_p_Sc43_to_He4_Ca40_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 22.0_rt, 44.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_Ti44_to_Cr48_removed); + rate_eval.screened_rates(k_He4_Ti44_to_Cr48_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Ti44_to_Cr48_removed); + rate_eval.dscreened_rates_dT(k_He4_Ti44_to_Cr48_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_Cr48_to_He4_Ti44_removed); + rate_eval.screened_rates(k_Cr48_to_He4_Ti44_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Cr48_to_He4_Ti44_removed); + rate_eval.dscreened_rates_dT(k_Cr48_to_He4_Ti44_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 23.0_rt, 47.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_Ti44_to_p_V47_removed); + rate_eval.screened_rates(k_He4_Ti44_to_p_V47_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Ti44_to_p_V47_removed); + rate_eval.dscreened_rates_dT(k_He4_Ti44_to_p_V47_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_V47_to_Cr48_removed); + rate_eval.screened_rates(k_p_V47_to_Cr48_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_V47_to_Cr48_removed); + rate_eval.dscreened_rates_dT(k_p_V47_to_Cr48_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_Cr48_to_p_V47_removed); + rate_eval.screened_rates(k_Cr48_to_p_V47_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Cr48_to_p_V47_removed); + rate_eval.dscreened_rates_dT(k_Cr48_to_p_V47_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_V47_to_He4_Ti44_removed); + rate_eval.screened_rates(k_p_V47_to_He4_Ti44_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_V47_to_He4_Ti44_removed); + rate_eval.dscreened_rates_dT(k_p_V47_to_He4_Ti44_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 24.0_rt, 48.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_Cr48_to_Fe52_removed); + rate_eval.screened_rates(k_He4_Cr48_to_Fe52_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Cr48_to_Fe52_removed); + rate_eval.dscreened_rates_dT(k_He4_Cr48_to_Fe52_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_Cr48_to_p_Mn51_removed); + rate_eval.screened_rates(k_He4_Cr48_to_p_Mn51_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Cr48_to_p_Mn51_removed); + rate_eval.dscreened_rates_dT(k_He4_Cr48_to_p_Mn51_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_Fe52_to_He4_Cr48_removed); + rate_eval.screened_rates(k_Fe52_to_He4_Cr48_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Fe52_to_He4_Cr48_removed); + rate_eval.dscreened_rates_dT(k_Fe52_to_He4_Cr48_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Mn51_to_He4_Cr48_removed); + rate_eval.screened_rates(k_p_Mn51_to_He4_Cr48_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Mn51_to_He4_Cr48_removed); + rate_eval.dscreened_rates_dT(k_p_Mn51_to_He4_Cr48_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 25.0_rt, 51.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_p_Mn51_to_Fe52_removed); + rate_eval.screened_rates(k_p_Mn51_to_Fe52_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Mn51_to_Fe52_removed); + rate_eval.dscreened_rates_dT(k_p_Mn51_to_Fe52_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_Fe52_to_p_Mn51_removed); + rate_eval.screened_rates(k_Fe52_to_p_Mn51_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Fe52_to_p_Mn51_removed); + rate_eval.dscreened_rates_dT(k_Fe52_to_p_Mn51_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 26.0_rt, 52.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_Fe52_to_Ni56_removed); + rate_eval.screened_rates(k_He4_Fe52_to_Ni56_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Fe52_to_Ni56_removed); + rate_eval.dscreened_rates_dT(k_He4_Fe52_to_Ni56_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_Fe52_to_p_Co55_removed); + rate_eval.screened_rates(k_He4_Fe52_to_p_Co55_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Fe52_to_p_Co55_removed); + rate_eval.dscreened_rates_dT(k_He4_Fe52_to_p_Co55_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_Ni56_to_He4_Fe52_removed); + rate_eval.screened_rates(k_Ni56_to_He4_Fe52_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Ni56_to_He4_Fe52_removed); + rate_eval.dscreened_rates_dT(k_Ni56_to_He4_Fe52_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Co55_to_He4_Fe52_removed); + rate_eval.screened_rates(k_p_Co55_to_He4_Fe52_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Co55_to_He4_Fe52_removed); + rate_eval.dscreened_rates_dT(k_p_Co55_to_He4_Fe52_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 27.0_rt, 55.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_p_Co55_to_Ni56_removed); + rate_eval.screened_rates(k_p_Co55_to_Ni56_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Co55_to_Ni56_removed); + rate_eval.dscreened_rates_dT(k_p_Co55_to_Ni56_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_Ni56_to_p_Co55_removed); + rate_eval.screened_rates(k_Ni56_to_p_Co55_removed) *= scor; + if constexpr (std::is_same_v) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_Ni56_to_p_Co55_removed); + rate_eval.dscreened_rates_dT(k_Ni56_to_p_Co55_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + // Fill approximate rates + + fill_approx_rates(tfactors, rate_eval); + + // Calculate tabular rates + + [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; + + rate_eval.enuc_weak = 0.0_rt; + + +} + +#ifdef NSE_NET +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void get_ydot_weak(const burn_t& state, + amrex::Array1D& ydot_nuc, + amrex::Real& enuc_weak, + [[maybe_unused]] const amrex::Array1D& Y) { + /// + /// Calculate Ydots contribute only from weak reactions. + /// This is used to calculate dyedt and energy generation from + /// weak reactions for self-consistent NSE + /// + + + // initialize ydot_nuc to 0 + + for (int i = 1; i <= neqs; ++i) { + ydot_nuc(i) = 0.0_rt; + } + + rate_t rate_eval; + + [[maybe_unused]] amrex::Real rate, drate_dt, edot_nu, edot_gamma; + [[maybe_unused]] amrex::Real rhoy = state.rho * state.y_e; + + rate_eval.enuc_weak = 0.0_rt; + + // Calculate tabular rates and get ydot_weak + + + ydot_nuc(H1) = 0.0_rt; + + ydot_nuc(He4) = 0.0_rt; + + ydot_nuc(C12) = 0.0_rt; + + ydot_nuc(C13) = 0.0_rt; + + ydot_nuc(N13) = 0.0_rt; + + ydot_nuc(N14) = 0.0_rt; + + ydot_nuc(N15) = 0.0_rt; + + ydot_nuc(O14) = 0.0_rt; + + ydot_nuc(O15) = 0.0_rt; + + ydot_nuc(O16) = 0.0_rt; + + ydot_nuc(O17) = 0.0_rt; + + ydot_nuc(O18) = 0.0_rt; + + ydot_nuc(F17) = 0.0_rt; + + ydot_nuc(F18) = 0.0_rt; + + ydot_nuc(F19) = 0.0_rt; + + ydot_nuc(Ne18) = 0.0_rt; + + ydot_nuc(Ne19) = 0.0_rt; + + ydot_nuc(Ne20) = 0.0_rt; + + ydot_nuc(Ne21) = 0.0_rt; + + ydot_nuc(Na22) = 0.0_rt; + + ydot_nuc(Na23) = 0.0_rt; + + ydot_nuc(Mg22) = 0.0_rt; + + ydot_nuc(Mg24) = 0.0_rt; + + ydot_nuc(Al27) = 0.0_rt; + + ydot_nuc(Si28) = 0.0_rt; + + ydot_nuc(P31) = 0.0_rt; + + ydot_nuc(S32) = 0.0_rt; + + ydot_nuc(Ar36) = 0.0_rt; + + ydot_nuc(Ca40) = 0.0_rt; + + ydot_nuc(Ti44) = 0.0_rt; + + ydot_nuc(Cr48) = 0.0_rt; + + ydot_nuc(Fe52) = 0.0_rt; + + ydot_nuc(Ni56) = 0.0_rt; + + enuc_weak = rate_eval.enuc_weak; +} +#endif + + +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rhs_nuc(const burn_t& state, + amrex::Array1D& ydot_nuc, + const amrex::Array1D& Y, + const amrex::Array1D& screened_rates) { + + using namespace Rates; + + ydot_nuc(H1) = + (-screened_rates(k_p_C12_to_N13)*Y(C12)*Y(H1)*state.rho + screened_rates(k_N13_to_p_C12)*Y(N13)) + + (-screened_rates(k_p_C13_to_N14)*Y(C13)*Y(H1)*state.rho + screened_rates(k_N14_to_p_C13)*Y(N14)) + + (-screened_rates(k_p_N13_to_O14)*Y(N13)*Y(H1)*state.rho + screened_rates(k_O14_to_p_N13)*Y(O14)) + + (-screened_rates(k_p_N14_to_O15)*Y(N14)*Y(H1)*state.rho + screened_rates(k_O15_to_p_N14)*Y(O15)) + + (-screened_rates(k_p_N15_to_O16)*Y(N15)*Y(H1)*state.rho + screened_rates(k_O16_to_p_N15)*Y(O16)) + + (-screened_rates(k_p_O16_to_F17)*Y(O16)*Y(H1)*state.rho + screened_rates(k_F17_to_p_O16)*Y(F17)) + + (-screened_rates(k_p_O17_to_F18)*Y(O17)*Y(H1)*state.rho + screened_rates(k_F18_to_p_O17)*Y(F18)) + + (-screened_rates(k_p_O18_to_F19)*Y(O18)*Y(H1)*state.rho + screened_rates(k_F19_to_p_O18)*Y(F19)) + + (-screened_rates(k_p_F17_to_Ne18)*Y(F17)*Y(H1)*state.rho + screened_rates(k_Ne18_to_p_F17)*Y(Ne18)) + + (-screened_rates(k_p_F18_to_Ne19)*Y(F18)*Y(H1)*state.rho + screened_rates(k_Ne19_to_p_F18)*Y(Ne19)) + + (-screened_rates(k_p_F19_to_Ne20)*Y(F19)*Y(H1)*state.rho + screened_rates(k_Ne20_to_p_F19)*Y(Ne20)) + + (-screened_rates(k_p_Ne21_to_Na22)*Y(Ne21)*Y(H1)*state.rho + screened_rates(k_Na22_to_p_Ne21)*Y(Na22)) + + (-screened_rates(k_p_Na23_to_Mg24)*Y(Na23)*Y(H1)*state.rho + screened_rates(k_Mg24_to_p_Na23)*Y(Mg24)) + + (-screened_rates(k_p_Al27_to_Si28)*Y(Al27)*Y(H1)*state.rho + screened_rates(k_Si28_to_p_Al27)*Y(Si28)) + + (-screened_rates(k_p_P31_to_S32)*Y(P31)*Y(H1)*state.rho + screened_rates(k_S32_to_p_P31)*Y(S32)) + + 0.5*screened_rates(k_C12_C12_to_p_Na23)*amrex::Math::powi<2>(Y(C12))*state.rho + + (screened_rates(k_He4_N13_to_p_O16)*Y(He4)*Y(N13)*state.rho + -screened_rates(k_p_O16_to_He4_N13)*Y(O16)*Y(H1)*state.rho) + + (-screened_rates(k_p_N15_to_He4_C12)*Y(N15)*Y(H1)*state.rho + screened_rates(k_He4_C12_to_p_N15)*Y(C12)*Y(He4)*state.rho) + + (screened_rates(k_He4_O14_to_p_F17)*Y(He4)*Y(O14)*state.rho + -screened_rates(k_p_F17_to_He4_O14)*Y(F17)*Y(H1)*state.rho) + + screened_rates(k_C12_O16_to_p_Al27)*Y(C12)*Y(O16)*state.rho + + 0.5*screened_rates(k_O16_O16_to_p_P31)*amrex::Math::powi<2>(Y(O16))*state.rho + + (-screened_rates(k_p_O17_to_He4_N14)*Y(O17)*Y(H1)*state.rho + screened_rates(k_He4_N14_to_p_O17)*Y(He4)*Y(N14)*state.rho) + + (-screened_rates(k_p_O18_to_He4_N15)*Y(O18)*Y(H1)*state.rho + screened_rates(k_He4_N15_to_p_O18)*Y(He4)*Y(N15)*state.rho) + + (screened_rates(k_He4_F17_to_p_Ne20)*Y(F17)*Y(He4)*state.rho + -screened_rates(k_p_Ne20_to_He4_F17)*Y(Ne20)*Y(H1)*state.rho) + + (-screened_rates(k_p_F18_to_He4_O15)*Y(F18)*Y(H1)*state.rho + screened_rates(k_He4_O15_to_p_F18)*Y(He4)*Y(O15)*state.rho) + + (screened_rates(k_He4_F18_to_p_Ne21)*Y(F18)*Y(He4)*state.rho + -screened_rates(k_p_Ne21_to_He4_F18)*Y(Ne21)*Y(H1)*state.rho) + + (-screened_rates(k_p_F19_to_He4_O16)*Y(F19)*Y(H1)*state.rho + screened_rates(k_He4_O16_to_p_F19)*Y(He4)*Y(O16)*state.rho) + + (screened_rates(k_He4_Ne19_to_p_Na22)*Y(He4)*Y(Ne19)*state.rho + -screened_rates(k_p_Na22_to_He4_Ne19)*Y(Na22)*Y(H1)*state.rho) + + (-screened_rates(k_p_Na23_to_He4_Ne20)*Y(Na23)*Y(H1)*state.rho + screened_rates(k_He4_Ne20_to_p_Na23)*Y(He4)*Y(Ne20)*state.rho) + + (-screened_rates(k_p_Al27_to_He4_Mg24)*Y(Al27)*Y(H1)*state.rho + screened_rates(k_He4_Mg24_to_p_Al27)*Y(He4)*Y(Mg24)*state.rho) + + (-screened_rates(k_p_P31_to_He4_Si28)*Y(P31)*Y(H1)*state.rho + screened_rates(k_He4_Si28_to_p_P31)*Y(He4)*Y(Si28)*state.rho); + + ydot_nuc(He4) = + (-screened_rates(k_He4_C12_to_O16)*Y(C12)*Y(He4)*state.rho + screened_rates(k_O16_to_He4_C12)*Y(O16)) + + (-screened_rates(k_He4_N14_to_F18)*Y(He4)*Y(N14)*state.rho + screened_rates(k_F18_to_He4_N14)*Y(F18)) + + (-screened_rates(k_He4_N15_to_F19)*Y(He4)*Y(N15)*state.rho + screened_rates(k_F19_to_He4_N15)*Y(F19)) + + (-screened_rates(k_He4_O14_to_Ne18)*Y(He4)*Y(O14)*state.rho + screened_rates(k_Ne18_to_He4_O14)*Y(Ne18)) + + (-screened_rates(k_He4_O15_to_Ne19)*Y(He4)*Y(O15)*state.rho + screened_rates(k_Ne19_to_He4_O15)*Y(Ne19)) + + (-screened_rates(k_He4_O16_to_Ne20)*Y(He4)*Y(O16)*state.rho + screened_rates(k_Ne20_to_He4_O16)*Y(Ne20)) + + (-screened_rates(k_He4_O17_to_Ne21)*Y(He4)*Y(O17)*state.rho + screened_rates(k_Ne21_to_He4_O17)*Y(Ne21)) + + (-screened_rates(k_He4_F18_to_Na22)*Y(F18)*Y(He4)*state.rho + screened_rates(k_Na22_to_He4_F18)*Y(Na22)) + + (-screened_rates(k_He4_F19_to_Na23)*Y(F19)*Y(He4)*state.rho + screened_rates(k_Na23_to_He4_F19)*Y(Na23)) + + (-screened_rates(k_He4_Ne18_to_Mg22)*Y(He4)*Y(Ne18)*state.rho + screened_rates(k_Mg22_to_He4_Ne18)*Y(Mg22)) + + (-screened_rates(k_He4_Ne20_to_Mg24)*Y(He4)*Y(Ne20)*state.rho + screened_rates(k_Mg24_to_He4_Ne20)*Y(Mg24)) + + (-screened_rates(k_He4_Mg24_to_Si28)*Y(He4)*Y(Mg24)*state.rho + screened_rates(k_Si28_to_He4_Mg24)*Y(Si28)) + + (-screened_rates(k_He4_Si28_to_S32)*Y(He4)*Y(Si28)*state.rho + screened_rates(k_S32_to_He4_Si28)*Y(S32)) + + 0.5*screened_rates(k_C12_C12_to_He4_Ne20)*amrex::Math::powi<2>(Y(C12))*state.rho + + (-screened_rates(k_He4_N13_to_p_O16)*Y(He4)*Y(N13)*state.rho + screened_rates(k_p_O16_to_He4_N13)*Y(O16)*Y(H1)*state.rho) + + (screened_rates(k_p_N15_to_He4_C12)*Y(N15)*Y(H1)*state.rho + -screened_rates(k_He4_C12_to_p_N15)*Y(C12)*Y(He4)*state.rho) + + (-screened_rates(k_He4_O14_to_p_F17)*Y(He4)*Y(O14)*state.rho + screened_rates(k_p_F17_to_He4_O14)*Y(F17)*Y(H1)*state.rho) + + screened_rates(k_C12_O16_to_He4_Mg24)*Y(C12)*Y(O16)*state.rho + + 0.5*screened_rates(k_O16_O16_to_He4_Si28)*amrex::Math::powi<2>(Y(O16))*state.rho + + (screened_rates(k_p_O17_to_He4_N14)*Y(O17)*Y(H1)*state.rho + -screened_rates(k_He4_N14_to_p_O17)*Y(He4)*Y(N14)*state.rho) + + (screened_rates(k_p_O18_to_He4_N15)*Y(O18)*Y(H1)*state.rho + -screened_rates(k_He4_N15_to_p_O18)*Y(He4)*Y(N15)*state.rho) + + (-screened_rates(k_He4_F17_to_p_Ne20)*Y(F17)*Y(He4)*state.rho + screened_rates(k_p_Ne20_to_He4_F17)*Y(Ne20)*Y(H1)*state.rho) + + (screened_rates(k_p_F18_to_He4_O15)*Y(F18)*Y(H1)*state.rho + -screened_rates(k_He4_O15_to_p_F18)*Y(He4)*Y(O15)*state.rho) + + (-screened_rates(k_He4_F18_to_p_Ne21)*Y(F18)*Y(He4)*state.rho + screened_rates(k_p_Ne21_to_He4_F18)*Y(Ne21)*Y(H1)*state.rho) + + (screened_rates(k_p_F19_to_He4_O16)*Y(F19)*Y(H1)*state.rho + -screened_rates(k_He4_O16_to_p_F19)*Y(He4)*Y(O16)*state.rho) + + (-screened_rates(k_He4_Ne19_to_p_Na22)*Y(He4)*Y(Ne19)*state.rho + screened_rates(k_p_Na22_to_He4_Ne19)*Y(Na22)*Y(H1)*state.rho) + + (screened_rates(k_p_Na23_to_He4_Ne20)*Y(Na23)*Y(H1)*state.rho + -screened_rates(k_He4_Ne20_to_p_Na23)*Y(He4)*Y(Ne20)*state.rho) + + (screened_rates(k_p_Al27_to_He4_Mg24)*Y(Al27)*Y(H1)*state.rho + -screened_rates(k_He4_Mg24_to_p_Al27)*Y(He4)*Y(Mg24)*state.rho) + + (screened_rates(k_p_P31_to_He4_Si28)*Y(P31)*Y(H1)*state.rho + -screened_rates(k_He4_Si28_to_p_P31)*Y(He4)*Y(Si28)*state.rho) + + (-0.5*screened_rates(k_He4_He4_He4_to_C12)*amrex::Math::powi<3>(Y(He4))*amrex::Math::powi<2>(state.rho) + 3.0*screened_rates(k_C12_to_He4_He4_He4)*Y(C12)) + + (-screened_rates(k_S32_He4_to_Ar36_approx)*Y(He4)*Y(S32)*state.rho + screened_rates(k_Ar36_to_S32_He4_approx)*Y(Ar36)) + + (-screened_rates(k_Ar36_He4_to_Ca40_approx)*Y(Ar36)*Y(He4)*state.rho + screened_rates(k_Ca40_to_Ar36_He4_approx)*Y(Ca40)) + + (-screened_rates(k_Ca40_He4_to_Ti44_approx)*Y(Ca40)*Y(He4)*state.rho + screened_rates(k_Ti44_to_Ca40_He4_approx)*Y(Ti44)) + + (-screened_rates(k_Ti44_He4_to_Cr48_approx)*Y(He4)*Y(Ti44)*state.rho + screened_rates(k_Cr48_to_Ti44_He4_approx)*Y(Cr48)) + + (-screened_rates(k_Cr48_He4_to_Fe52_approx)*Y(Cr48)*Y(He4)*state.rho + screened_rates(k_Fe52_to_Cr48_He4_approx)*Y(Fe52)) + + (-screened_rates(k_Fe52_He4_to_Ni56_approx)*Y(Fe52)*Y(He4)*state.rho + screened_rates(k_Ni56_to_Fe52_He4_approx)*Y(Ni56)); + + ydot_nuc(C12) = + (-screened_rates(k_p_C12_to_N13)*Y(C12)*Y(H1)*state.rho + screened_rates(k_N13_to_p_C12)*Y(N13)) + + (-screened_rates(k_He4_C12_to_O16)*Y(C12)*Y(He4)*state.rho + screened_rates(k_O16_to_He4_C12)*Y(O16)) + + -screened_rates(k_C12_C12_to_p_Na23)*amrex::Math::powi<2>(Y(C12))*state.rho + + -screened_rates(k_C12_C12_to_He4_Ne20)*amrex::Math::powi<2>(Y(C12))*state.rho + + (screened_rates(k_p_N15_to_He4_C12)*Y(N15)*Y(H1)*state.rho + -screened_rates(k_He4_C12_to_p_N15)*Y(C12)*Y(He4)*state.rho) + + -screened_rates(k_C12_O16_to_p_Al27)*Y(C12)*Y(O16)*state.rho + + -screened_rates(k_C12_O16_to_He4_Mg24)*Y(C12)*Y(O16)*state.rho + + (0.16666666666666667*screened_rates(k_He4_He4_He4_to_C12)*amrex::Math::powi<3>(Y(He4))*amrex::Math::powi<2>(state.rho) + -screened_rates(k_C12_to_He4_He4_He4)*Y(C12)) + + -screened_rates(k_C12_C12_to_Mg24_modified)*amrex::Math::powi<2>(Y(C12))*state.rho + + -screened_rates(k_C12_O16_to_Si28_modified)*Y(C12)*Y(O16)*state.rho; + + ydot_nuc(C13) = + screened_rates(k_N13_to_C13_weak_wc12)*Y(N13) + + (-screened_rates(k_p_C13_to_N14)*Y(C13)*Y(H1)*state.rho + screened_rates(k_N14_to_p_C13)*Y(N14)); + + ydot_nuc(N13) = + -screened_rates(k_N13_to_C13_weak_wc12)*Y(N13) + + (screened_rates(k_p_C12_to_N13)*Y(C12)*Y(H1)*state.rho + -screened_rates(k_N13_to_p_C12)*Y(N13)) + + (-screened_rates(k_p_N13_to_O14)*Y(N13)*Y(H1)*state.rho + screened_rates(k_O14_to_p_N13)*Y(O14)) + + (-screened_rates(k_He4_N13_to_p_O16)*Y(He4)*Y(N13)*state.rho + screened_rates(k_p_O16_to_He4_N13)*Y(O16)*Y(H1)*state.rho); + + ydot_nuc(N14) = + screened_rates(k_O14_to_N14_weak_wc12)*Y(O14) + + (screened_rates(k_p_C13_to_N14)*Y(C13)*Y(H1)*state.rho + -screened_rates(k_N14_to_p_C13)*Y(N14)) + + (-screened_rates(k_p_N14_to_O15)*Y(N14)*Y(H1)*state.rho + screened_rates(k_O15_to_p_N14)*Y(O15)) + + (-screened_rates(k_He4_N14_to_F18)*Y(He4)*Y(N14)*state.rho + screened_rates(k_F18_to_He4_N14)*Y(F18)) + + (screened_rates(k_p_O17_to_He4_N14)*Y(O17)*Y(H1)*state.rho + -screened_rates(k_He4_N14_to_p_O17)*Y(He4)*Y(N14)*state.rho); + + ydot_nuc(N15) = + screened_rates(k_O15_to_N15_weak_wc12)*Y(O15) + + (-screened_rates(k_p_N15_to_O16)*Y(N15)*Y(H1)*state.rho + screened_rates(k_O16_to_p_N15)*Y(O16)) + + (-screened_rates(k_He4_N15_to_F19)*Y(He4)*Y(N15)*state.rho + screened_rates(k_F19_to_He4_N15)*Y(F19)) + + (-screened_rates(k_p_N15_to_He4_C12)*Y(N15)*Y(H1)*state.rho + screened_rates(k_He4_C12_to_p_N15)*Y(C12)*Y(He4)*state.rho) + + (screened_rates(k_p_O18_to_He4_N15)*Y(O18)*Y(H1)*state.rho + -screened_rates(k_He4_N15_to_p_O18)*Y(He4)*Y(N15)*state.rho); + + ydot_nuc(O14) = + -screened_rates(k_O14_to_N14_weak_wc12)*Y(O14) + + (screened_rates(k_p_N13_to_O14)*Y(N13)*Y(H1)*state.rho + -screened_rates(k_O14_to_p_N13)*Y(O14)) + + (-screened_rates(k_He4_O14_to_Ne18)*Y(He4)*Y(O14)*state.rho + screened_rates(k_Ne18_to_He4_O14)*Y(Ne18)) + + (-screened_rates(k_He4_O14_to_p_F17)*Y(He4)*Y(O14)*state.rho + screened_rates(k_p_F17_to_He4_O14)*Y(F17)*Y(H1)*state.rho); + + ydot_nuc(O15) = + -screened_rates(k_O15_to_N15_weak_wc12)*Y(O15) + + (screened_rates(k_p_N14_to_O15)*Y(N14)*Y(H1)*state.rho + -screened_rates(k_O15_to_p_N14)*Y(O15)) + + (-screened_rates(k_He4_O15_to_Ne19)*Y(He4)*Y(O15)*state.rho + screened_rates(k_Ne19_to_He4_O15)*Y(Ne19)) + + (screened_rates(k_p_F18_to_He4_O15)*Y(F18)*Y(H1)*state.rho + -screened_rates(k_He4_O15_to_p_F18)*Y(He4)*Y(O15)*state.rho); + + ydot_nuc(O16) = + (screened_rates(k_He4_C12_to_O16)*Y(C12)*Y(He4)*state.rho + -screened_rates(k_O16_to_He4_C12)*Y(O16)) + + (screened_rates(k_p_N15_to_O16)*Y(N15)*Y(H1)*state.rho + -screened_rates(k_O16_to_p_N15)*Y(O16)) + + (-screened_rates(k_p_O16_to_F17)*Y(O16)*Y(H1)*state.rho + screened_rates(k_F17_to_p_O16)*Y(F17)) + + (-screened_rates(k_He4_O16_to_Ne20)*Y(He4)*Y(O16)*state.rho + screened_rates(k_Ne20_to_He4_O16)*Y(Ne20)) + + (screened_rates(k_He4_N13_to_p_O16)*Y(He4)*Y(N13)*state.rho + -screened_rates(k_p_O16_to_He4_N13)*Y(O16)*Y(H1)*state.rho) + + -screened_rates(k_C12_O16_to_p_Al27)*Y(C12)*Y(O16)*state.rho + + -screened_rates(k_C12_O16_to_He4_Mg24)*Y(C12)*Y(O16)*state.rho + + -screened_rates(k_O16_O16_to_p_P31)*amrex::Math::powi<2>(Y(O16))*state.rho + + -screened_rates(k_O16_O16_to_He4_Si28)*amrex::Math::powi<2>(Y(O16))*state.rho + + (screened_rates(k_p_F19_to_He4_O16)*Y(F19)*Y(H1)*state.rho + -screened_rates(k_He4_O16_to_p_F19)*Y(He4)*Y(O16)*state.rho) + + -screened_rates(k_O16_O16_to_S32_modified)*amrex::Math::powi<2>(Y(O16))*state.rho + + -screened_rates(k_C12_O16_to_Si28_modified)*Y(C12)*Y(O16)*state.rho; + + ydot_nuc(O17) = + screened_rates(k_F17_to_O17_weak_wc12)*Y(F17) + + (-screened_rates(k_p_O17_to_F18)*Y(O17)*Y(H1)*state.rho + screened_rates(k_F18_to_p_O17)*Y(F18)) + + (-screened_rates(k_He4_O17_to_Ne21)*Y(He4)*Y(O17)*state.rho + screened_rates(k_Ne21_to_He4_O17)*Y(Ne21)) + + (-screened_rates(k_p_O17_to_He4_N14)*Y(O17)*Y(H1)*state.rho + screened_rates(k_He4_N14_to_p_O17)*Y(He4)*Y(N14)*state.rho); + + ydot_nuc(O18) = + screened_rates(k_F18_to_O18_weak_wc12)*Y(F18) + + (-screened_rates(k_p_O18_to_F19)*Y(O18)*Y(H1)*state.rho + screened_rates(k_F19_to_p_O18)*Y(F19)) + + (-screened_rates(k_p_O18_to_He4_N15)*Y(O18)*Y(H1)*state.rho + screened_rates(k_He4_N15_to_p_O18)*Y(He4)*Y(N15)*state.rho); + + ydot_nuc(F17) = + -screened_rates(k_F17_to_O17_weak_wc12)*Y(F17) + + (screened_rates(k_p_O16_to_F17)*Y(O16)*Y(H1)*state.rho + -screened_rates(k_F17_to_p_O16)*Y(F17)) + + (-screened_rates(k_p_F17_to_Ne18)*Y(F17)*Y(H1)*state.rho + screened_rates(k_Ne18_to_p_F17)*Y(Ne18)) + + (screened_rates(k_He4_O14_to_p_F17)*Y(He4)*Y(O14)*state.rho + -screened_rates(k_p_F17_to_He4_O14)*Y(F17)*Y(H1)*state.rho) + + (-screened_rates(k_He4_F17_to_p_Ne20)*Y(F17)*Y(He4)*state.rho + screened_rates(k_p_Ne20_to_He4_F17)*Y(Ne20)*Y(H1)*state.rho); + + ydot_nuc(F18) = + -screened_rates(k_F18_to_O18_weak_wc12)*Y(F18) + + screened_rates(k_Ne18_to_F18_weak_wc12)*Y(Ne18) + + (screened_rates(k_He4_N14_to_F18)*Y(He4)*Y(N14)*state.rho + -screened_rates(k_F18_to_He4_N14)*Y(F18)) + + (screened_rates(k_p_O17_to_F18)*Y(O17)*Y(H1)*state.rho + -screened_rates(k_F18_to_p_O17)*Y(F18)) + + (-screened_rates(k_p_F18_to_Ne19)*Y(F18)*Y(H1)*state.rho + screened_rates(k_Ne19_to_p_F18)*Y(Ne19)) + + (-screened_rates(k_He4_F18_to_Na22)*Y(F18)*Y(He4)*state.rho + screened_rates(k_Na22_to_He4_F18)*Y(Na22)) + + (-screened_rates(k_p_F18_to_He4_O15)*Y(F18)*Y(H1)*state.rho + screened_rates(k_He4_O15_to_p_F18)*Y(He4)*Y(O15)*state.rho) + + (-screened_rates(k_He4_F18_to_p_Ne21)*Y(F18)*Y(He4)*state.rho + screened_rates(k_p_Ne21_to_He4_F18)*Y(Ne21)*Y(H1)*state.rho); + + ydot_nuc(F19) = + screened_rates(k_Ne19_to_F19_weak_wc12)*Y(Ne19) + + (screened_rates(k_He4_N15_to_F19)*Y(He4)*Y(N15)*state.rho + -screened_rates(k_F19_to_He4_N15)*Y(F19)) + + (screened_rates(k_p_O18_to_F19)*Y(O18)*Y(H1)*state.rho + -screened_rates(k_F19_to_p_O18)*Y(F19)) + + (-screened_rates(k_p_F19_to_Ne20)*Y(F19)*Y(H1)*state.rho + screened_rates(k_Ne20_to_p_F19)*Y(Ne20)) + + (-screened_rates(k_He4_F19_to_Na23)*Y(F19)*Y(He4)*state.rho + screened_rates(k_Na23_to_He4_F19)*Y(Na23)) + + (-screened_rates(k_p_F19_to_He4_O16)*Y(F19)*Y(H1)*state.rho + screened_rates(k_He4_O16_to_p_F19)*Y(He4)*Y(O16)*state.rho); + + ydot_nuc(Ne18) = + -screened_rates(k_Ne18_to_F18_weak_wc12)*Y(Ne18) + + (screened_rates(k_He4_O14_to_Ne18)*Y(He4)*Y(O14)*state.rho + -screened_rates(k_Ne18_to_He4_O14)*Y(Ne18)) + + (screened_rates(k_p_F17_to_Ne18)*Y(F17)*Y(H1)*state.rho + -screened_rates(k_Ne18_to_p_F17)*Y(Ne18)) + + (-screened_rates(k_He4_Ne18_to_Mg22)*Y(He4)*Y(Ne18)*state.rho + screened_rates(k_Mg22_to_He4_Ne18)*Y(Mg22)); + + ydot_nuc(Ne19) = + -screened_rates(k_Ne19_to_F19_weak_wc12)*Y(Ne19) + + (screened_rates(k_He4_O15_to_Ne19)*Y(He4)*Y(O15)*state.rho + -screened_rates(k_Ne19_to_He4_O15)*Y(Ne19)) + + (screened_rates(k_p_F18_to_Ne19)*Y(F18)*Y(H1)*state.rho + -screened_rates(k_Ne19_to_p_F18)*Y(Ne19)) + + (-screened_rates(k_He4_Ne19_to_p_Na22)*Y(He4)*Y(Ne19)*state.rho + screened_rates(k_p_Na22_to_He4_Ne19)*Y(Na22)*Y(H1)*state.rho); + + ydot_nuc(Ne20) = + (screened_rates(k_He4_O16_to_Ne20)*Y(He4)*Y(O16)*state.rho + -screened_rates(k_Ne20_to_He4_O16)*Y(Ne20)) + + (screened_rates(k_p_F19_to_Ne20)*Y(F19)*Y(H1)*state.rho + -screened_rates(k_Ne20_to_p_F19)*Y(Ne20)) + + (-screened_rates(k_He4_Ne20_to_Mg24)*Y(He4)*Y(Ne20)*state.rho + screened_rates(k_Mg24_to_He4_Ne20)*Y(Mg24)) + + 0.5*screened_rates(k_C12_C12_to_He4_Ne20)*amrex::Math::powi<2>(Y(C12))*state.rho + + (screened_rates(k_He4_F17_to_p_Ne20)*Y(F17)*Y(He4)*state.rho + -screened_rates(k_p_Ne20_to_He4_F17)*Y(Ne20)*Y(H1)*state.rho) + + (screened_rates(k_p_Na23_to_He4_Ne20)*Y(Na23)*Y(H1)*state.rho + -screened_rates(k_He4_Ne20_to_p_Na23)*Y(He4)*Y(Ne20)*state.rho); + + ydot_nuc(Ne21) = + (screened_rates(k_He4_O17_to_Ne21)*Y(He4)*Y(O17)*state.rho + -screened_rates(k_Ne21_to_He4_O17)*Y(Ne21)) + + (-screened_rates(k_p_Ne21_to_Na22)*Y(Ne21)*Y(H1)*state.rho + screened_rates(k_Na22_to_p_Ne21)*Y(Na22)) + + (screened_rates(k_He4_F18_to_p_Ne21)*Y(F18)*Y(He4)*state.rho + -screened_rates(k_p_Ne21_to_He4_F18)*Y(Ne21)*Y(H1)*state.rho); + + ydot_nuc(Na22) = + screened_rates(k_Mg22_to_Na22_weak_wc12)*Y(Mg22) + + (screened_rates(k_He4_F18_to_Na22)*Y(F18)*Y(He4)*state.rho + -screened_rates(k_Na22_to_He4_F18)*Y(Na22)) + + (screened_rates(k_p_Ne21_to_Na22)*Y(Ne21)*Y(H1)*state.rho + -screened_rates(k_Na22_to_p_Ne21)*Y(Na22)) + + (screened_rates(k_He4_Ne19_to_p_Na22)*Y(He4)*Y(Ne19)*state.rho + -screened_rates(k_p_Na22_to_He4_Ne19)*Y(Na22)*Y(H1)*state.rho); + + ydot_nuc(Na23) = + (screened_rates(k_He4_F19_to_Na23)*Y(F19)*Y(He4)*state.rho + -screened_rates(k_Na23_to_He4_F19)*Y(Na23)) + + (-screened_rates(k_p_Na23_to_Mg24)*Y(Na23)*Y(H1)*state.rho + screened_rates(k_Mg24_to_p_Na23)*Y(Mg24)) + + 0.5*screened_rates(k_C12_C12_to_p_Na23)*amrex::Math::powi<2>(Y(C12))*state.rho + + (-screened_rates(k_p_Na23_to_He4_Ne20)*Y(Na23)*Y(H1)*state.rho + screened_rates(k_He4_Ne20_to_p_Na23)*Y(He4)*Y(Ne20)*state.rho); + + ydot_nuc(Mg22) = + -screened_rates(k_Mg22_to_Na22_weak_wc12)*Y(Mg22) + + (screened_rates(k_He4_Ne18_to_Mg22)*Y(He4)*Y(Ne18)*state.rho + -screened_rates(k_Mg22_to_He4_Ne18)*Y(Mg22)); + + ydot_nuc(Mg24) = + (screened_rates(k_He4_Ne20_to_Mg24)*Y(He4)*Y(Ne20)*state.rho + -screened_rates(k_Mg24_to_He4_Ne20)*Y(Mg24)) + + (screened_rates(k_p_Na23_to_Mg24)*Y(Na23)*Y(H1)*state.rho + -screened_rates(k_Mg24_to_p_Na23)*Y(Mg24)) + + (-screened_rates(k_He4_Mg24_to_Si28)*Y(He4)*Y(Mg24)*state.rho + screened_rates(k_Si28_to_He4_Mg24)*Y(Si28)) + + screened_rates(k_C12_O16_to_He4_Mg24)*Y(C12)*Y(O16)*state.rho + + (screened_rates(k_p_Al27_to_He4_Mg24)*Y(Al27)*Y(H1)*state.rho + -screened_rates(k_He4_Mg24_to_p_Al27)*Y(He4)*Y(Mg24)*state.rho) + + 0.5*screened_rates(k_C12_C12_to_Mg24_modified)*amrex::Math::powi<2>(Y(C12))*state.rho; + + ydot_nuc(Al27) = + (-screened_rates(k_p_Al27_to_Si28)*Y(Al27)*Y(H1)*state.rho + screened_rates(k_Si28_to_p_Al27)*Y(Si28)) + + screened_rates(k_C12_O16_to_p_Al27)*Y(C12)*Y(O16)*state.rho + + (-screened_rates(k_p_Al27_to_He4_Mg24)*Y(Al27)*Y(H1)*state.rho + screened_rates(k_He4_Mg24_to_p_Al27)*Y(He4)*Y(Mg24)*state.rho); + + ydot_nuc(Si28) = + (screened_rates(k_He4_Mg24_to_Si28)*Y(He4)*Y(Mg24)*state.rho + -screened_rates(k_Si28_to_He4_Mg24)*Y(Si28)) + + (screened_rates(k_p_Al27_to_Si28)*Y(Al27)*Y(H1)*state.rho + -screened_rates(k_Si28_to_p_Al27)*Y(Si28)) + + (-screened_rates(k_He4_Si28_to_S32)*Y(He4)*Y(Si28)*state.rho + screened_rates(k_S32_to_He4_Si28)*Y(S32)) + + 0.5*screened_rates(k_O16_O16_to_He4_Si28)*amrex::Math::powi<2>(Y(O16))*state.rho + + (screened_rates(k_p_P31_to_He4_Si28)*Y(P31)*Y(H1)*state.rho + -screened_rates(k_He4_Si28_to_p_P31)*Y(He4)*Y(Si28)*state.rho) + + screened_rates(k_C12_O16_to_Si28_modified)*Y(C12)*Y(O16)*state.rho; + + ydot_nuc(P31) = + (-screened_rates(k_p_P31_to_S32)*Y(P31)*Y(H1)*state.rho + screened_rates(k_S32_to_p_P31)*Y(S32)) + + 0.5*screened_rates(k_O16_O16_to_p_P31)*amrex::Math::powi<2>(Y(O16))*state.rho + + (-screened_rates(k_p_P31_to_He4_Si28)*Y(P31)*Y(H1)*state.rho + screened_rates(k_He4_Si28_to_p_P31)*Y(He4)*Y(Si28)*state.rho); + + ydot_nuc(S32) = + (screened_rates(k_He4_Si28_to_S32)*Y(He4)*Y(Si28)*state.rho + -screened_rates(k_S32_to_He4_Si28)*Y(S32)) + + (screened_rates(k_p_P31_to_S32)*Y(P31)*Y(H1)*state.rho + -screened_rates(k_S32_to_p_P31)*Y(S32)) + + 0.5*screened_rates(k_O16_O16_to_S32_modified)*amrex::Math::powi<2>(Y(O16))*state.rho + + (-screened_rates(k_S32_He4_to_Ar36_approx)*Y(He4)*Y(S32)*state.rho + screened_rates(k_Ar36_to_S32_He4_approx)*Y(Ar36)); + + ydot_nuc(Ar36) = + (screened_rates(k_S32_He4_to_Ar36_approx)*Y(He4)*Y(S32)*state.rho + -screened_rates(k_Ar36_to_S32_He4_approx)*Y(Ar36)) + + (-screened_rates(k_Ar36_He4_to_Ca40_approx)*Y(Ar36)*Y(He4)*state.rho + screened_rates(k_Ca40_to_Ar36_He4_approx)*Y(Ca40)); + + ydot_nuc(Ca40) = + (screened_rates(k_Ar36_He4_to_Ca40_approx)*Y(Ar36)*Y(He4)*state.rho + -screened_rates(k_Ca40_to_Ar36_He4_approx)*Y(Ca40)) + + (-screened_rates(k_Ca40_He4_to_Ti44_approx)*Y(Ca40)*Y(He4)*state.rho + screened_rates(k_Ti44_to_Ca40_He4_approx)*Y(Ti44)); + + ydot_nuc(Ti44) = + (screened_rates(k_Ca40_He4_to_Ti44_approx)*Y(Ca40)*Y(He4)*state.rho + -screened_rates(k_Ti44_to_Ca40_He4_approx)*Y(Ti44)) + + (-screened_rates(k_Ti44_He4_to_Cr48_approx)*Y(He4)*Y(Ti44)*state.rho + screened_rates(k_Cr48_to_Ti44_He4_approx)*Y(Cr48)); + + ydot_nuc(Cr48) = + (screened_rates(k_Ti44_He4_to_Cr48_approx)*Y(He4)*Y(Ti44)*state.rho + -screened_rates(k_Cr48_to_Ti44_He4_approx)*Y(Cr48)) + + (-screened_rates(k_Cr48_He4_to_Fe52_approx)*Y(Cr48)*Y(He4)*state.rho + screened_rates(k_Fe52_to_Cr48_He4_approx)*Y(Fe52)); + + ydot_nuc(Fe52) = + (screened_rates(k_Cr48_He4_to_Fe52_approx)*Y(Cr48)*Y(He4)*state.rho + -screened_rates(k_Fe52_to_Cr48_He4_approx)*Y(Fe52)) + + (-screened_rates(k_Fe52_He4_to_Ni56_approx)*Y(Fe52)*Y(He4)*state.rho + screened_rates(k_Ni56_to_Fe52_He4_approx)*Y(Ni56)); + + ydot_nuc(Ni56) = + (screened_rates(k_Fe52_He4_to_Ni56_approx)*Y(Fe52)*Y(He4)*state.rho + -screened_rates(k_Ni56_to_Fe52_He4_approx)*Y(Ni56)); + +} + + +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void actual_rhs (burn_t& state, amrex::Array1D& ydot) +{ + for (int i = 1; i <= neqs; ++i) { + ydot(i) = 0.0_rt; + } + + + // Set molar abundances + amrex::Array1D Y; + for (int i = 1; i <= NumSpec; ++i) { + Y(i) = state.xn[i-1] * aion_inv[i-1]; + } + + // build the rates + + rate_t rate_eval; + + constexpr int do_T_derivatives = 0; + + evaluate_rates(state, rate_eval); + + rhs_nuc(state, ydot, Y, rate_eval.screened_rates); + + // ion binding energy contributions + + amrex::Real enuc; + ener_gener_rate(ydot, enuc); + + // include any weak rate neutrino losses + enuc += rate_eval.enuc_weak; + + // Get the thermal neutrino losses + + amrex::Real sneut, dsneutdt, dsneutdd, dsnuda, dsnudz; + constexpr int do_derivatives{0}; + sneut5(state.T, state.rho, state.abar, state.zbar, sneut, dsneutdt, dsneutdd, dsnuda, dsnudz); + + // Append the energy equation (this is erg/g/s) + + ydot(net_ienuc) = enuc - sneut; + +} + + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void jac_nuc(const burn_t& state, + MatrixType& jac, + const amrex::Array1D& Y, + const amrex::Array1D& screened_rates) +{ + + amrex::Real scratch; + + scratch = -screened_rates(k_p_Al27_to_He4_Mg24)*Y(Al27)*state.rho - screened_rates(k_p_Al27_to_Si28)*Y(Al27)*state.rho - screened_rates(k_p_C12_to_N13)*Y(C12)*state.rho - screened_rates(k_p_C13_to_N14)*Y(C13)*state.rho - screened_rates(k_p_F17_to_He4_O14)*Y(F17)*state.rho - screened_rates(k_p_F17_to_Ne18)*Y(F17)*state.rho - screened_rates(k_p_F18_to_He4_O15)*Y(F18)*state.rho - screened_rates(k_p_F18_to_Ne19)*Y(F18)*state.rho - screened_rates(k_p_F19_to_He4_O16)*Y(F19)*state.rho - screened_rates(k_p_F19_to_Ne20)*Y(F19)*state.rho - screened_rates(k_p_N13_to_O14)*Y(N13)*state.rho - screened_rates(k_p_N14_to_O15)*Y(N14)*state.rho - screened_rates(k_p_N15_to_He4_C12)*Y(N15)*state.rho - screened_rates(k_p_N15_to_O16)*Y(N15)*state.rho - screened_rates(k_p_Na22_to_He4_Ne19)*Y(Na22)*state.rho - screened_rates(k_p_Na23_to_He4_Ne20)*Y(Na23)*state.rho - screened_rates(k_p_Na23_to_Mg24)*Y(Na23)*state.rho - screened_rates(k_p_Ne20_to_He4_F17)*Y(Ne20)*state.rho - screened_rates(k_p_Ne21_to_He4_F18)*Y(Ne21)*state.rho - screened_rates(k_p_Ne21_to_Na22)*Y(Ne21)*state.rho - screened_rates(k_p_O16_to_F17)*Y(O16)*state.rho - screened_rates(k_p_O16_to_He4_N13)*Y(O16)*state.rho - screened_rates(k_p_O17_to_F18)*Y(O17)*state.rho - screened_rates(k_p_O17_to_He4_N14)*Y(O17)*state.rho - screened_rates(k_p_O18_to_F19)*Y(O18)*state.rho - screened_rates(k_p_O18_to_He4_N15)*Y(O18)*state.rho - screened_rates(k_p_P31_to_He4_Si28)*Y(P31)*state.rho - screened_rates(k_p_P31_to_S32)*Y(P31)*state.rho; + jac.set(H1, H1, scratch); + + scratch = screened_rates(k_He4_C12_to_p_N15)*Y(C12)*state.rho + screened_rates(k_He4_F17_to_p_Ne20)*Y(F17)*state.rho + screened_rates(k_He4_F18_to_p_Ne21)*Y(F18)*state.rho + screened_rates(k_He4_Mg24_to_p_Al27)*Y(Mg24)*state.rho + screened_rates(k_He4_N13_to_p_O16)*Y(N13)*state.rho + screened_rates(k_He4_N14_to_p_O17)*Y(N14)*state.rho + screened_rates(k_He4_N15_to_p_O18)*Y(N15)*state.rho + screened_rates(k_He4_Ne19_to_p_Na22)*Y(Ne19)*state.rho + screened_rates(k_He4_Ne20_to_p_Na23)*Y(Ne20)*state.rho + screened_rates(k_He4_O14_to_p_F17)*Y(O14)*state.rho + screened_rates(k_He4_O15_to_p_F18)*Y(O15)*state.rho + screened_rates(k_He4_O16_to_p_F19)*Y(O16)*state.rho + screened_rates(k_He4_Si28_to_p_P31)*Y(Si28)*state.rho; + jac.set(H1, He4, scratch); + + scratch = 1.0*screened_rates(k_C12_C12_to_p_Na23)*Y(C12)*state.rho + screened_rates(k_C12_O16_to_p_Al27)*Y(O16)*state.rho + screened_rates(k_He4_C12_to_p_N15)*Y(He4)*state.rho - screened_rates(k_p_C12_to_N13)*Y(H1)*state.rho; + jac.set(H1, C12, scratch); + + scratch = -screened_rates(k_p_C13_to_N14)*Y(H1)*state.rho; + jac.set(H1, C13, scratch); + + scratch = screened_rates(k_He4_N13_to_p_O16)*Y(He4)*state.rho + screened_rates(k_N13_to_p_C12) - screened_rates(k_p_N13_to_O14)*Y(H1)*state.rho; + jac.set(H1, N13, scratch); + + scratch = screened_rates(k_He4_N14_to_p_O17)*Y(He4)*state.rho + screened_rates(k_N14_to_p_C13) - screened_rates(k_p_N14_to_O15)*Y(H1)*state.rho; + jac.set(H1, N14, scratch); + + scratch = screened_rates(k_He4_N15_to_p_O18)*Y(He4)*state.rho - screened_rates(k_p_N15_to_He4_C12)*Y(H1)*state.rho - screened_rates(k_p_N15_to_O16)*Y(H1)*state.rho; + jac.set(H1, N15, scratch); + + scratch = screened_rates(k_He4_O14_to_p_F17)*Y(He4)*state.rho + screened_rates(k_O14_to_p_N13); + jac.set(H1, O14, scratch); + + scratch = screened_rates(k_He4_O15_to_p_F18)*Y(He4)*state.rho + screened_rates(k_O15_to_p_N14); + jac.set(H1, O15, scratch); + + scratch = screened_rates(k_C12_O16_to_p_Al27)*Y(C12)*state.rho + screened_rates(k_He4_O16_to_p_F19)*Y(He4)*state.rho + 1.0*screened_rates(k_O16_O16_to_p_P31)*Y(O16)*state.rho + screened_rates(k_O16_to_p_N15) - screened_rates(k_p_O16_to_F17)*Y(H1)*state.rho - screened_rates(k_p_O16_to_He4_N13)*Y(H1)*state.rho; + jac.set(H1, O16, scratch); + + scratch = -screened_rates(k_p_O17_to_F18)*Y(H1)*state.rho - screened_rates(k_p_O17_to_He4_N14)*Y(H1)*state.rho; + jac.set(H1, O17, scratch); + + scratch = -screened_rates(k_p_O18_to_F19)*Y(H1)*state.rho - screened_rates(k_p_O18_to_He4_N15)*Y(H1)*state.rho; + jac.set(H1, O18, scratch); + + scratch = screened_rates(k_F17_to_p_O16) + screened_rates(k_He4_F17_to_p_Ne20)*Y(He4)*state.rho - screened_rates(k_p_F17_to_He4_O14)*Y(H1)*state.rho - screened_rates(k_p_F17_to_Ne18)*Y(H1)*state.rho; + jac.set(H1, F17, scratch); + + scratch = screened_rates(k_F18_to_p_O17) + screened_rates(k_He4_F18_to_p_Ne21)*Y(He4)*state.rho - screened_rates(k_p_F18_to_He4_O15)*Y(H1)*state.rho - screened_rates(k_p_F18_to_Ne19)*Y(H1)*state.rho; + jac.set(H1, F18, scratch); + + scratch = screened_rates(k_F19_to_p_O18) - screened_rates(k_p_F19_to_He4_O16)*Y(H1)*state.rho - screened_rates(k_p_F19_to_Ne20)*Y(H1)*state.rho; + jac.set(H1, F19, scratch); + + scratch = screened_rates(k_Ne18_to_p_F17); + jac.set(H1, Ne18, scratch); + + scratch = screened_rates(k_He4_Ne19_to_p_Na22)*Y(He4)*state.rho + screened_rates(k_Ne19_to_p_F18); + jac.set(H1, Ne19, scratch); + + scratch = screened_rates(k_He4_Ne20_to_p_Na23)*Y(He4)*state.rho + screened_rates(k_Ne20_to_p_F19) - screened_rates(k_p_Ne20_to_He4_F17)*Y(H1)*state.rho; + jac.set(H1, Ne20, scratch); + + scratch = -screened_rates(k_p_Ne21_to_He4_F18)*Y(H1)*state.rho - screened_rates(k_p_Ne21_to_Na22)*Y(H1)*state.rho; + jac.set(H1, Ne21, scratch); + + scratch = screened_rates(k_Na22_to_p_Ne21) - screened_rates(k_p_Na22_to_He4_Ne19)*Y(H1)*state.rho; + jac.set(H1, Na22, scratch); + + scratch = -screened_rates(k_p_Na23_to_He4_Ne20)*Y(H1)*state.rho - screened_rates(k_p_Na23_to_Mg24)*Y(H1)*state.rho; + jac.set(H1, Na23, scratch); + + scratch = screened_rates(k_He4_Mg24_to_p_Al27)*Y(He4)*state.rho + screened_rates(k_Mg24_to_p_Na23); + jac.set(H1, Mg24, scratch); + + scratch = -screened_rates(k_p_Al27_to_He4_Mg24)*Y(H1)*state.rho - screened_rates(k_p_Al27_to_Si28)*Y(H1)*state.rho; + jac.set(H1, Al27, scratch); + + scratch = screened_rates(k_He4_Si28_to_p_P31)*Y(He4)*state.rho + screened_rates(k_Si28_to_p_Al27); + jac.set(H1, Si28, scratch); + + scratch = -screened_rates(k_p_P31_to_He4_Si28)*Y(H1)*state.rho - screened_rates(k_p_P31_to_S32)*Y(H1)*state.rho; + jac.set(H1, P31, scratch); + + scratch = screened_rates(k_S32_to_p_P31); + jac.set(H1, S32, scratch); + + scratch = screened_rates(k_p_Al27_to_He4_Mg24)*Y(Al27)*state.rho + screened_rates(k_p_F17_to_He4_O14)*Y(F17)*state.rho + screened_rates(k_p_F18_to_He4_O15)*Y(F18)*state.rho + screened_rates(k_p_F19_to_He4_O16)*Y(F19)*state.rho + screened_rates(k_p_N15_to_He4_C12)*Y(N15)*state.rho + screened_rates(k_p_Na22_to_He4_Ne19)*Y(Na22)*state.rho + screened_rates(k_p_Na23_to_He4_Ne20)*Y(Na23)*state.rho + screened_rates(k_p_Ne20_to_He4_F17)*Y(Ne20)*state.rho + screened_rates(k_p_Ne21_to_He4_F18)*Y(Ne21)*state.rho + screened_rates(k_p_O16_to_He4_N13)*Y(O16)*state.rho + screened_rates(k_p_O17_to_He4_N14)*Y(O17)*state.rho + screened_rates(k_p_O18_to_He4_N15)*Y(O18)*state.rho + screened_rates(k_p_P31_to_He4_Si28)*Y(P31)*state.rho; + jac.set(He4, H1, scratch); + + scratch = -screened_rates(k_Ar36_He4_to_Ca40_approx)*Y(Ar36)*state.rho - screened_rates(k_Ca40_He4_to_Ti44_approx)*Y(Ca40)*state.rho - screened_rates(k_Cr48_He4_to_Fe52_approx)*Y(Cr48)*state.rho - screened_rates(k_Fe52_He4_to_Ni56_approx)*Y(Fe52)*state.rho - screened_rates(k_He4_C12_to_O16)*Y(C12)*state.rho - screened_rates(k_He4_C12_to_p_N15)*Y(C12)*state.rho - screened_rates(k_He4_F17_to_p_Ne20)*Y(F17)*state.rho - screened_rates(k_He4_F18_to_Na22)*Y(F18)*state.rho - screened_rates(k_He4_F18_to_p_Ne21)*Y(F18)*state.rho - screened_rates(k_He4_F19_to_Na23)*Y(F19)*state.rho - 1.5*screened_rates(k_He4_He4_He4_to_C12)*amrex::Math::powi<2>(Y(He4))*amrex::Math::powi<2>(state.rho) - screened_rates(k_He4_Mg24_to_Si28)*Y(Mg24)*state.rho - screened_rates(k_He4_Mg24_to_p_Al27)*Y(Mg24)*state.rho - screened_rates(k_He4_N13_to_p_O16)*Y(N13)*state.rho - screened_rates(k_He4_N14_to_F18)*Y(N14)*state.rho - screened_rates(k_He4_N14_to_p_O17)*Y(N14)*state.rho - screened_rates(k_He4_N15_to_F19)*Y(N15)*state.rho - screened_rates(k_He4_N15_to_p_O18)*Y(N15)*state.rho - screened_rates(k_He4_Ne18_to_Mg22)*Y(Ne18)*state.rho - screened_rates(k_He4_Ne19_to_p_Na22)*Y(Ne19)*state.rho - screened_rates(k_He4_Ne20_to_Mg24)*Y(Ne20)*state.rho - screened_rates(k_He4_Ne20_to_p_Na23)*Y(Ne20)*state.rho - screened_rates(k_He4_O14_to_Ne18)*Y(O14)*state.rho - screened_rates(k_He4_O14_to_p_F17)*Y(O14)*state.rho - screened_rates(k_He4_O15_to_Ne19)*Y(O15)*state.rho - screened_rates(k_He4_O15_to_p_F18)*Y(O15)*state.rho - screened_rates(k_He4_O16_to_Ne20)*Y(O16)*state.rho - screened_rates(k_He4_O16_to_p_F19)*Y(O16)*state.rho - screened_rates(k_He4_O17_to_Ne21)*Y(O17)*state.rho - screened_rates(k_He4_Si28_to_S32)*Y(Si28)*state.rho - screened_rates(k_He4_Si28_to_p_P31)*Y(Si28)*state.rho - screened_rates(k_S32_He4_to_Ar36_approx)*Y(S32)*state.rho - screened_rates(k_Ti44_He4_to_Cr48_approx)*Y(Ti44)*state.rho; + jac.set(He4, He4, scratch); + + scratch = 1.0*screened_rates(k_C12_C12_to_He4_Ne20)*Y(C12)*state.rho + screened_rates(k_C12_O16_to_He4_Mg24)*Y(O16)*state.rho + 3.0*screened_rates(k_C12_to_He4_He4_He4) - screened_rates(k_He4_C12_to_O16)*Y(He4)*state.rho - screened_rates(k_He4_C12_to_p_N15)*Y(He4)*state.rho; + jac.set(He4, C12, scratch); + + scratch = -screened_rates(k_He4_N13_to_p_O16)*Y(He4)*state.rho; + jac.set(He4, N13, scratch); + + scratch = -screened_rates(k_He4_N14_to_F18)*Y(He4)*state.rho - screened_rates(k_He4_N14_to_p_O17)*Y(He4)*state.rho; + jac.set(He4, N14, scratch); + + scratch = -screened_rates(k_He4_N15_to_F19)*Y(He4)*state.rho - screened_rates(k_He4_N15_to_p_O18)*Y(He4)*state.rho + screened_rates(k_p_N15_to_He4_C12)*Y(H1)*state.rho; + jac.set(He4, N15, scratch); + + scratch = -screened_rates(k_He4_O14_to_Ne18)*Y(He4)*state.rho - screened_rates(k_He4_O14_to_p_F17)*Y(He4)*state.rho; + jac.set(He4, O14, scratch); + + scratch = -screened_rates(k_He4_O15_to_Ne19)*Y(He4)*state.rho - screened_rates(k_He4_O15_to_p_F18)*Y(He4)*state.rho; + jac.set(He4, O15, scratch); + + scratch = screened_rates(k_C12_O16_to_He4_Mg24)*Y(C12)*state.rho - screened_rates(k_He4_O16_to_Ne20)*Y(He4)*state.rho - screened_rates(k_He4_O16_to_p_F19)*Y(He4)*state.rho + 1.0*screened_rates(k_O16_O16_to_He4_Si28)*Y(O16)*state.rho + screened_rates(k_O16_to_He4_C12) + screened_rates(k_p_O16_to_He4_N13)*Y(H1)*state.rho; + jac.set(He4, O16, scratch); + + scratch = -screened_rates(k_He4_O17_to_Ne21)*Y(He4)*state.rho + screened_rates(k_p_O17_to_He4_N14)*Y(H1)*state.rho; + jac.set(He4, O17, scratch); + + scratch = screened_rates(k_p_O18_to_He4_N15)*Y(H1)*state.rho; + jac.set(He4, O18, scratch); + + scratch = -screened_rates(k_He4_F17_to_p_Ne20)*Y(He4)*state.rho + screened_rates(k_p_F17_to_He4_O14)*Y(H1)*state.rho; + jac.set(He4, F17, scratch); + + scratch = screened_rates(k_F18_to_He4_N14) - screened_rates(k_He4_F18_to_Na22)*Y(He4)*state.rho - screened_rates(k_He4_F18_to_p_Ne21)*Y(He4)*state.rho + screened_rates(k_p_F18_to_He4_O15)*Y(H1)*state.rho; + jac.set(He4, F18, scratch); + + scratch = screened_rates(k_F19_to_He4_N15) - screened_rates(k_He4_F19_to_Na23)*Y(He4)*state.rho + screened_rates(k_p_F19_to_He4_O16)*Y(H1)*state.rho; + jac.set(He4, F19, scratch); + + scratch = -screened_rates(k_He4_Ne18_to_Mg22)*Y(He4)*state.rho + screened_rates(k_Ne18_to_He4_O14); + jac.set(He4, Ne18, scratch); + + scratch = -screened_rates(k_He4_Ne19_to_p_Na22)*Y(He4)*state.rho + screened_rates(k_Ne19_to_He4_O15); + jac.set(He4, Ne19, scratch); + + scratch = -screened_rates(k_He4_Ne20_to_Mg24)*Y(He4)*state.rho - screened_rates(k_He4_Ne20_to_p_Na23)*Y(He4)*state.rho + screened_rates(k_Ne20_to_He4_O16) + screened_rates(k_p_Ne20_to_He4_F17)*Y(H1)*state.rho; + jac.set(He4, Ne20, scratch); + + scratch = screened_rates(k_Ne21_to_He4_O17) + screened_rates(k_p_Ne21_to_He4_F18)*Y(H1)*state.rho; + jac.set(He4, Ne21, scratch); + + scratch = screened_rates(k_Na22_to_He4_F18) + screened_rates(k_p_Na22_to_He4_Ne19)*Y(H1)*state.rho; + jac.set(He4, Na22, scratch); + + scratch = screened_rates(k_Na23_to_He4_F19) + screened_rates(k_p_Na23_to_He4_Ne20)*Y(H1)*state.rho; + jac.set(He4, Na23, scratch); + + scratch = screened_rates(k_Mg22_to_He4_Ne18); + jac.set(He4, Mg22, scratch); + + scratch = -screened_rates(k_He4_Mg24_to_Si28)*Y(He4)*state.rho - screened_rates(k_He4_Mg24_to_p_Al27)*Y(He4)*state.rho + screened_rates(k_Mg24_to_He4_Ne20); + jac.set(He4, Mg24, scratch); + + scratch = screened_rates(k_p_Al27_to_He4_Mg24)*Y(H1)*state.rho; + jac.set(He4, Al27, scratch); + + scratch = -screened_rates(k_He4_Si28_to_S32)*Y(He4)*state.rho - screened_rates(k_He4_Si28_to_p_P31)*Y(He4)*state.rho + screened_rates(k_Si28_to_He4_Mg24); + jac.set(He4, Si28, scratch); + + scratch = screened_rates(k_p_P31_to_He4_Si28)*Y(H1)*state.rho; + jac.set(He4, P31, scratch); + + scratch = -screened_rates(k_S32_He4_to_Ar36_approx)*Y(He4)*state.rho + screened_rates(k_S32_to_He4_Si28); + jac.set(He4, S32, scratch); + + scratch = -screened_rates(k_Ar36_He4_to_Ca40_approx)*Y(He4)*state.rho + screened_rates(k_Ar36_to_S32_He4_approx); + jac.set(He4, Ar36, scratch); + + scratch = -screened_rates(k_Ca40_He4_to_Ti44_approx)*Y(He4)*state.rho + screened_rates(k_Ca40_to_Ar36_He4_approx); + jac.set(He4, Ca40, scratch); + + scratch = -screened_rates(k_Ti44_He4_to_Cr48_approx)*Y(He4)*state.rho + screened_rates(k_Ti44_to_Ca40_He4_approx); + jac.set(He4, Ti44, scratch); + + scratch = -screened_rates(k_Cr48_He4_to_Fe52_approx)*Y(He4)*state.rho + screened_rates(k_Cr48_to_Ti44_He4_approx); + jac.set(He4, Cr48, scratch); + + scratch = -screened_rates(k_Fe52_He4_to_Ni56_approx)*Y(He4)*state.rho + screened_rates(k_Fe52_to_Cr48_He4_approx); + jac.set(He4, Fe52, scratch); + + scratch = screened_rates(k_Ni56_to_Fe52_He4_approx); + jac.set(He4, Ni56, scratch); + + scratch = -screened_rates(k_p_C12_to_N13)*Y(C12)*state.rho + screened_rates(k_p_N15_to_He4_C12)*Y(N15)*state.rho; + jac.set(C12, H1, scratch); + + scratch = -screened_rates(k_He4_C12_to_O16)*Y(C12)*state.rho - screened_rates(k_He4_C12_to_p_N15)*Y(C12)*state.rho + 0.5*screened_rates(k_He4_He4_He4_to_C12)*amrex::Math::powi<2>(Y(He4))*amrex::Math::powi<2>(state.rho); + jac.set(C12, He4, scratch); + + scratch = -2.0*screened_rates(k_C12_C12_to_He4_Ne20)*Y(C12)*state.rho - 2.0*screened_rates(k_C12_C12_to_Mg24_modified)*Y(C12)*state.rho - 2.0*screened_rates(k_C12_C12_to_p_Na23)*Y(C12)*state.rho - screened_rates(k_C12_O16_to_He4_Mg24)*Y(O16)*state.rho - screened_rates(k_C12_O16_to_Si28_modified)*Y(O16)*state.rho - screened_rates(k_C12_O16_to_p_Al27)*Y(O16)*state.rho - screened_rates(k_C12_to_He4_He4_He4) - screened_rates(k_He4_C12_to_O16)*Y(He4)*state.rho - screened_rates(k_He4_C12_to_p_N15)*Y(He4)*state.rho - screened_rates(k_p_C12_to_N13)*Y(H1)*state.rho; + jac.set(C12, C12, scratch); + + scratch = screened_rates(k_N13_to_p_C12); + jac.set(C12, N13, scratch); + + scratch = screened_rates(k_p_N15_to_He4_C12)*Y(H1)*state.rho; + jac.set(C12, N15, scratch); + + scratch = -screened_rates(k_C12_O16_to_He4_Mg24)*Y(C12)*state.rho - screened_rates(k_C12_O16_to_Si28_modified)*Y(C12)*state.rho - screened_rates(k_C12_O16_to_p_Al27)*Y(C12)*state.rho + screened_rates(k_O16_to_He4_C12); + jac.set(C12, O16, scratch); + + scratch = -screened_rates(k_p_C13_to_N14)*Y(C13)*state.rho; + jac.set(C13, H1, scratch); + + scratch = -screened_rates(k_p_C13_to_N14)*Y(H1)*state.rho; + jac.set(C13, C13, scratch); + + scratch = screened_rates(k_N13_to_C13_weak_wc12); + jac.set(C13, N13, scratch); + + scratch = screened_rates(k_N14_to_p_C13); + jac.set(C13, N14, scratch); + + scratch = screened_rates(k_p_C12_to_N13)*Y(C12)*state.rho - screened_rates(k_p_N13_to_O14)*Y(N13)*state.rho + screened_rates(k_p_O16_to_He4_N13)*Y(O16)*state.rho; + jac.set(N13, H1, scratch); + + scratch = -screened_rates(k_He4_N13_to_p_O16)*Y(N13)*state.rho; + jac.set(N13, He4, scratch); + + scratch = screened_rates(k_p_C12_to_N13)*Y(H1)*state.rho; + jac.set(N13, C12, scratch); + + scratch = -screened_rates(k_He4_N13_to_p_O16)*Y(He4)*state.rho - screened_rates(k_N13_to_C13_weak_wc12) - screened_rates(k_N13_to_p_C12) - screened_rates(k_p_N13_to_O14)*Y(H1)*state.rho; + jac.set(N13, N13, scratch); + + scratch = screened_rates(k_O14_to_p_N13); + jac.set(N13, O14, scratch); + + scratch = screened_rates(k_p_O16_to_He4_N13)*Y(H1)*state.rho; + jac.set(N13, O16, scratch); + + scratch = screened_rates(k_p_C13_to_N14)*Y(C13)*state.rho - screened_rates(k_p_N14_to_O15)*Y(N14)*state.rho + screened_rates(k_p_O17_to_He4_N14)*Y(O17)*state.rho; + jac.set(N14, H1, scratch); + + scratch = -screened_rates(k_He4_N14_to_F18)*Y(N14)*state.rho - screened_rates(k_He4_N14_to_p_O17)*Y(N14)*state.rho; + jac.set(N14, He4, scratch); + + scratch = screened_rates(k_p_C13_to_N14)*Y(H1)*state.rho; + jac.set(N14, C13, scratch); + + scratch = -screened_rates(k_He4_N14_to_F18)*Y(He4)*state.rho - screened_rates(k_He4_N14_to_p_O17)*Y(He4)*state.rho - screened_rates(k_N14_to_p_C13) - screened_rates(k_p_N14_to_O15)*Y(H1)*state.rho; + jac.set(N14, N14, scratch); + + scratch = screened_rates(k_O14_to_N14_weak_wc12); + jac.set(N14, O14, scratch); + + scratch = screened_rates(k_O15_to_p_N14); + jac.set(N14, O15, scratch); + + scratch = screened_rates(k_p_O17_to_He4_N14)*Y(H1)*state.rho; + jac.set(N14, O17, scratch); + + scratch = screened_rates(k_F18_to_He4_N14); + jac.set(N14, F18, scratch); + + scratch = -screened_rates(k_p_N15_to_He4_C12)*Y(N15)*state.rho - screened_rates(k_p_N15_to_O16)*Y(N15)*state.rho + screened_rates(k_p_O18_to_He4_N15)*Y(O18)*state.rho; + jac.set(N15, H1, scratch); + + scratch = screened_rates(k_He4_C12_to_p_N15)*Y(C12)*state.rho - screened_rates(k_He4_N15_to_F19)*Y(N15)*state.rho - screened_rates(k_He4_N15_to_p_O18)*Y(N15)*state.rho; + jac.set(N15, He4, scratch); + + scratch = screened_rates(k_He4_C12_to_p_N15)*Y(He4)*state.rho; + jac.set(N15, C12, scratch); + + scratch = -screened_rates(k_He4_N15_to_F19)*Y(He4)*state.rho - screened_rates(k_He4_N15_to_p_O18)*Y(He4)*state.rho - screened_rates(k_p_N15_to_He4_C12)*Y(H1)*state.rho - screened_rates(k_p_N15_to_O16)*Y(H1)*state.rho; + jac.set(N15, N15, scratch); + + scratch = screened_rates(k_O15_to_N15_weak_wc12); + jac.set(N15, O15, scratch); + + scratch = screened_rates(k_O16_to_p_N15); + jac.set(N15, O16, scratch); + + scratch = screened_rates(k_p_O18_to_He4_N15)*Y(H1)*state.rho; + jac.set(N15, O18, scratch); + + scratch = screened_rates(k_F19_to_He4_N15); + jac.set(N15, F19, scratch); + + scratch = screened_rates(k_p_F17_to_He4_O14)*Y(F17)*state.rho + screened_rates(k_p_N13_to_O14)*Y(N13)*state.rho; + jac.set(O14, H1, scratch); + + scratch = -screened_rates(k_He4_O14_to_Ne18)*Y(O14)*state.rho - screened_rates(k_He4_O14_to_p_F17)*Y(O14)*state.rho; + jac.set(O14, He4, scratch); + + scratch = screened_rates(k_p_N13_to_O14)*Y(H1)*state.rho; + jac.set(O14, N13, scratch); + + scratch = -screened_rates(k_He4_O14_to_Ne18)*Y(He4)*state.rho - screened_rates(k_He4_O14_to_p_F17)*Y(He4)*state.rho - screened_rates(k_O14_to_N14_weak_wc12) - screened_rates(k_O14_to_p_N13); + jac.set(O14, O14, scratch); + + scratch = screened_rates(k_p_F17_to_He4_O14)*Y(H1)*state.rho; + jac.set(O14, F17, scratch); + + scratch = screened_rates(k_Ne18_to_He4_O14); + jac.set(O14, Ne18, scratch); + + scratch = screened_rates(k_p_F18_to_He4_O15)*Y(F18)*state.rho + screened_rates(k_p_N14_to_O15)*Y(N14)*state.rho; + jac.set(O15, H1, scratch); + + scratch = -screened_rates(k_He4_O15_to_Ne19)*Y(O15)*state.rho - screened_rates(k_He4_O15_to_p_F18)*Y(O15)*state.rho; + jac.set(O15, He4, scratch); + + scratch = screened_rates(k_p_N14_to_O15)*Y(H1)*state.rho; + jac.set(O15, N14, scratch); + + scratch = -screened_rates(k_He4_O15_to_Ne19)*Y(He4)*state.rho - screened_rates(k_He4_O15_to_p_F18)*Y(He4)*state.rho - screened_rates(k_O15_to_N15_weak_wc12) - screened_rates(k_O15_to_p_N14); + jac.set(O15, O15, scratch); + + scratch = screened_rates(k_p_F18_to_He4_O15)*Y(H1)*state.rho; + jac.set(O15, F18, scratch); + + scratch = screened_rates(k_Ne19_to_He4_O15); + jac.set(O15, Ne19, scratch); + + scratch = screened_rates(k_p_F19_to_He4_O16)*Y(F19)*state.rho + screened_rates(k_p_N15_to_O16)*Y(N15)*state.rho - screened_rates(k_p_O16_to_F17)*Y(O16)*state.rho - screened_rates(k_p_O16_to_He4_N13)*Y(O16)*state.rho; + jac.set(O16, H1, scratch); + + scratch = screened_rates(k_He4_C12_to_O16)*Y(C12)*state.rho + screened_rates(k_He4_N13_to_p_O16)*Y(N13)*state.rho - screened_rates(k_He4_O16_to_Ne20)*Y(O16)*state.rho - screened_rates(k_He4_O16_to_p_F19)*Y(O16)*state.rho; + jac.set(O16, He4, scratch); + + scratch = -screened_rates(k_C12_O16_to_He4_Mg24)*Y(O16)*state.rho - screened_rates(k_C12_O16_to_Si28_modified)*Y(O16)*state.rho - screened_rates(k_C12_O16_to_p_Al27)*Y(O16)*state.rho + screened_rates(k_He4_C12_to_O16)*Y(He4)*state.rho; + jac.set(O16, C12, scratch); + + scratch = screened_rates(k_He4_N13_to_p_O16)*Y(He4)*state.rho; + jac.set(O16, N13, scratch); + + scratch = screened_rates(k_p_N15_to_O16)*Y(H1)*state.rho; + jac.set(O16, N15, scratch); + + scratch = -screened_rates(k_C12_O16_to_He4_Mg24)*Y(C12)*state.rho - screened_rates(k_C12_O16_to_Si28_modified)*Y(C12)*state.rho - screened_rates(k_C12_O16_to_p_Al27)*Y(C12)*state.rho - screened_rates(k_He4_O16_to_Ne20)*Y(He4)*state.rho - screened_rates(k_He4_O16_to_p_F19)*Y(He4)*state.rho - 2.0*screened_rates(k_O16_O16_to_He4_Si28)*Y(O16)*state.rho - 2.0*screened_rates(k_O16_O16_to_S32_modified)*Y(O16)*state.rho - 2.0*screened_rates(k_O16_O16_to_p_P31)*Y(O16)*state.rho - screened_rates(k_O16_to_He4_C12) - screened_rates(k_O16_to_p_N15) - screened_rates(k_p_O16_to_F17)*Y(H1)*state.rho - screened_rates(k_p_O16_to_He4_N13)*Y(H1)*state.rho; + jac.set(O16, O16, scratch); + + scratch = screened_rates(k_F17_to_p_O16); + jac.set(O16, F17, scratch); + + scratch = screened_rates(k_p_F19_to_He4_O16)*Y(H1)*state.rho; + jac.set(O16, F19, scratch); + + scratch = screened_rates(k_Ne20_to_He4_O16); + jac.set(O16, Ne20, scratch); + + scratch = -screened_rates(k_p_O17_to_F18)*Y(O17)*state.rho - screened_rates(k_p_O17_to_He4_N14)*Y(O17)*state.rho; + jac.set(O17, H1, scratch); + + scratch = screened_rates(k_He4_N14_to_p_O17)*Y(N14)*state.rho - screened_rates(k_He4_O17_to_Ne21)*Y(O17)*state.rho; + jac.set(O17, He4, scratch); + + scratch = screened_rates(k_He4_N14_to_p_O17)*Y(He4)*state.rho; + jac.set(O17, N14, scratch); + + scratch = -screened_rates(k_He4_O17_to_Ne21)*Y(He4)*state.rho - screened_rates(k_p_O17_to_F18)*Y(H1)*state.rho - screened_rates(k_p_O17_to_He4_N14)*Y(H1)*state.rho; + jac.set(O17, O17, scratch); + + scratch = screened_rates(k_F17_to_O17_weak_wc12); + jac.set(O17, F17, scratch); + + scratch = screened_rates(k_F18_to_p_O17); + jac.set(O17, F18, scratch); + + scratch = screened_rates(k_Ne21_to_He4_O17); + jac.set(O17, Ne21, scratch); + + scratch = -screened_rates(k_p_O18_to_F19)*Y(O18)*state.rho - screened_rates(k_p_O18_to_He4_N15)*Y(O18)*state.rho; + jac.set(O18, H1, scratch); + + scratch = screened_rates(k_He4_N15_to_p_O18)*Y(N15)*state.rho; + jac.set(O18, He4, scratch); + + scratch = screened_rates(k_He4_N15_to_p_O18)*Y(He4)*state.rho; + jac.set(O18, N15, scratch); + + scratch = -screened_rates(k_p_O18_to_F19)*Y(H1)*state.rho - screened_rates(k_p_O18_to_He4_N15)*Y(H1)*state.rho; + jac.set(O18, O18, scratch); + + scratch = screened_rates(k_F18_to_O18_weak_wc12); + jac.set(O18, F18, scratch); + + scratch = screened_rates(k_F19_to_p_O18); + jac.set(O18, F19, scratch); + + scratch = -screened_rates(k_p_F17_to_He4_O14)*Y(F17)*state.rho - screened_rates(k_p_F17_to_Ne18)*Y(F17)*state.rho + screened_rates(k_p_Ne20_to_He4_F17)*Y(Ne20)*state.rho + screened_rates(k_p_O16_to_F17)*Y(O16)*state.rho; + jac.set(F17, H1, scratch); + + scratch = -screened_rates(k_He4_F17_to_p_Ne20)*Y(F17)*state.rho + screened_rates(k_He4_O14_to_p_F17)*Y(O14)*state.rho; + jac.set(F17, He4, scratch); + + scratch = screened_rates(k_He4_O14_to_p_F17)*Y(He4)*state.rho; + jac.set(F17, O14, scratch); + + scratch = screened_rates(k_p_O16_to_F17)*Y(H1)*state.rho; + jac.set(F17, O16, scratch); + + scratch = -screened_rates(k_F17_to_O17_weak_wc12) - screened_rates(k_F17_to_p_O16) - screened_rates(k_He4_F17_to_p_Ne20)*Y(He4)*state.rho - screened_rates(k_p_F17_to_He4_O14)*Y(H1)*state.rho - screened_rates(k_p_F17_to_Ne18)*Y(H1)*state.rho; + jac.set(F17, F17, scratch); + + scratch = screened_rates(k_Ne18_to_p_F17); + jac.set(F17, Ne18, scratch); + + scratch = screened_rates(k_p_Ne20_to_He4_F17)*Y(H1)*state.rho; + jac.set(F17, Ne20, scratch); + + scratch = -screened_rates(k_p_F18_to_He4_O15)*Y(F18)*state.rho - screened_rates(k_p_F18_to_Ne19)*Y(F18)*state.rho + screened_rates(k_p_Ne21_to_He4_F18)*Y(Ne21)*state.rho + screened_rates(k_p_O17_to_F18)*Y(O17)*state.rho; + jac.set(F18, H1, scratch); + + scratch = -screened_rates(k_He4_F18_to_Na22)*Y(F18)*state.rho - screened_rates(k_He4_F18_to_p_Ne21)*Y(F18)*state.rho + screened_rates(k_He4_N14_to_F18)*Y(N14)*state.rho + screened_rates(k_He4_O15_to_p_F18)*Y(O15)*state.rho; + jac.set(F18, He4, scratch); + + scratch = screened_rates(k_He4_N14_to_F18)*Y(He4)*state.rho; + jac.set(F18, N14, scratch); + + scratch = screened_rates(k_He4_O15_to_p_F18)*Y(He4)*state.rho; + jac.set(F18, O15, scratch); + + scratch = screened_rates(k_p_O17_to_F18)*Y(H1)*state.rho; + jac.set(F18, O17, scratch); + + scratch = -screened_rates(k_F18_to_He4_N14) - screened_rates(k_F18_to_O18_weak_wc12) - screened_rates(k_F18_to_p_O17) - screened_rates(k_He4_F18_to_Na22)*Y(He4)*state.rho - screened_rates(k_He4_F18_to_p_Ne21)*Y(He4)*state.rho - screened_rates(k_p_F18_to_He4_O15)*Y(H1)*state.rho - screened_rates(k_p_F18_to_Ne19)*Y(H1)*state.rho; + jac.set(F18, F18, scratch); + + scratch = screened_rates(k_Ne18_to_F18_weak_wc12); + jac.set(F18, Ne18, scratch); + + scratch = screened_rates(k_Ne19_to_p_F18); + jac.set(F18, Ne19, scratch); + + scratch = screened_rates(k_p_Ne21_to_He4_F18)*Y(H1)*state.rho; + jac.set(F18, Ne21, scratch); + + scratch = screened_rates(k_Na22_to_He4_F18); + jac.set(F18, Na22, scratch); + + scratch = -screened_rates(k_p_F19_to_He4_O16)*Y(F19)*state.rho - screened_rates(k_p_F19_to_Ne20)*Y(F19)*state.rho + screened_rates(k_p_O18_to_F19)*Y(O18)*state.rho; + jac.set(F19, H1, scratch); + + scratch = -screened_rates(k_He4_F19_to_Na23)*Y(F19)*state.rho + screened_rates(k_He4_N15_to_F19)*Y(N15)*state.rho + screened_rates(k_He4_O16_to_p_F19)*Y(O16)*state.rho; + jac.set(F19, He4, scratch); + + scratch = screened_rates(k_He4_N15_to_F19)*Y(He4)*state.rho; + jac.set(F19, N15, scratch); + + scratch = screened_rates(k_He4_O16_to_p_F19)*Y(He4)*state.rho; + jac.set(F19, O16, scratch); + + scratch = screened_rates(k_p_O18_to_F19)*Y(H1)*state.rho; + jac.set(F19, O18, scratch); + + scratch = -screened_rates(k_F19_to_He4_N15) - screened_rates(k_F19_to_p_O18) - screened_rates(k_He4_F19_to_Na23)*Y(He4)*state.rho - screened_rates(k_p_F19_to_He4_O16)*Y(H1)*state.rho - screened_rates(k_p_F19_to_Ne20)*Y(H1)*state.rho; + jac.set(F19, F19, scratch); + + scratch = screened_rates(k_Ne19_to_F19_weak_wc12); + jac.set(F19, Ne19, scratch); + + scratch = screened_rates(k_Ne20_to_p_F19); + jac.set(F19, Ne20, scratch); + + scratch = screened_rates(k_Na23_to_He4_F19); + jac.set(F19, Na23, scratch); + + scratch = screened_rates(k_p_F17_to_Ne18)*Y(F17)*state.rho; + jac.set(Ne18, H1, scratch); + + scratch = -screened_rates(k_He4_Ne18_to_Mg22)*Y(Ne18)*state.rho + screened_rates(k_He4_O14_to_Ne18)*Y(O14)*state.rho; + jac.set(Ne18, He4, scratch); + + scratch = screened_rates(k_He4_O14_to_Ne18)*Y(He4)*state.rho; + jac.set(Ne18, O14, scratch); + + scratch = screened_rates(k_p_F17_to_Ne18)*Y(H1)*state.rho; + jac.set(Ne18, F17, scratch); + + scratch = -screened_rates(k_He4_Ne18_to_Mg22)*Y(He4)*state.rho - screened_rates(k_Ne18_to_F18_weak_wc12) - screened_rates(k_Ne18_to_He4_O14) - screened_rates(k_Ne18_to_p_F17); + jac.set(Ne18, Ne18, scratch); + + scratch = screened_rates(k_Mg22_to_He4_Ne18); + jac.set(Ne18, Mg22, scratch); + + scratch = screened_rates(k_p_F18_to_Ne19)*Y(F18)*state.rho + screened_rates(k_p_Na22_to_He4_Ne19)*Y(Na22)*state.rho; + jac.set(Ne19, H1, scratch); + + scratch = -screened_rates(k_He4_Ne19_to_p_Na22)*Y(Ne19)*state.rho + screened_rates(k_He4_O15_to_Ne19)*Y(O15)*state.rho; + jac.set(Ne19, He4, scratch); + + scratch = screened_rates(k_He4_O15_to_Ne19)*Y(He4)*state.rho; + jac.set(Ne19, O15, scratch); + + scratch = screened_rates(k_p_F18_to_Ne19)*Y(H1)*state.rho; + jac.set(Ne19, F18, scratch); + + scratch = -screened_rates(k_He4_Ne19_to_p_Na22)*Y(He4)*state.rho - screened_rates(k_Ne19_to_F19_weak_wc12) - screened_rates(k_Ne19_to_He4_O15) - screened_rates(k_Ne19_to_p_F18); + jac.set(Ne19, Ne19, scratch); + + scratch = screened_rates(k_p_Na22_to_He4_Ne19)*Y(H1)*state.rho; + jac.set(Ne19, Na22, scratch); + + scratch = screened_rates(k_p_F19_to_Ne20)*Y(F19)*state.rho + screened_rates(k_p_Na23_to_He4_Ne20)*Y(Na23)*state.rho - screened_rates(k_p_Ne20_to_He4_F17)*Y(Ne20)*state.rho; + jac.set(Ne20, H1, scratch); + + scratch = screened_rates(k_He4_F17_to_p_Ne20)*Y(F17)*state.rho - screened_rates(k_He4_Ne20_to_Mg24)*Y(Ne20)*state.rho - screened_rates(k_He4_Ne20_to_p_Na23)*Y(Ne20)*state.rho + screened_rates(k_He4_O16_to_Ne20)*Y(O16)*state.rho; + jac.set(Ne20, He4, scratch); + + scratch = 1.0*screened_rates(k_C12_C12_to_He4_Ne20)*Y(C12)*state.rho; + jac.set(Ne20, C12, scratch); + + scratch = screened_rates(k_He4_O16_to_Ne20)*Y(He4)*state.rho; + jac.set(Ne20, O16, scratch); + + scratch = screened_rates(k_He4_F17_to_p_Ne20)*Y(He4)*state.rho; + jac.set(Ne20, F17, scratch); + + scratch = screened_rates(k_p_F19_to_Ne20)*Y(H1)*state.rho; + jac.set(Ne20, F19, scratch); + + scratch = -screened_rates(k_He4_Ne20_to_Mg24)*Y(He4)*state.rho - screened_rates(k_He4_Ne20_to_p_Na23)*Y(He4)*state.rho - screened_rates(k_Ne20_to_He4_O16) - screened_rates(k_Ne20_to_p_F19) - screened_rates(k_p_Ne20_to_He4_F17)*Y(H1)*state.rho; + jac.set(Ne20, Ne20, scratch); + + scratch = screened_rates(k_p_Na23_to_He4_Ne20)*Y(H1)*state.rho; + jac.set(Ne20, Na23, scratch); + + scratch = screened_rates(k_Mg24_to_He4_Ne20); + jac.set(Ne20, Mg24, scratch); + + scratch = -screened_rates(k_p_Ne21_to_He4_F18)*Y(Ne21)*state.rho - screened_rates(k_p_Ne21_to_Na22)*Y(Ne21)*state.rho; + jac.set(Ne21, H1, scratch); + + scratch = screened_rates(k_He4_F18_to_p_Ne21)*Y(F18)*state.rho + screened_rates(k_He4_O17_to_Ne21)*Y(O17)*state.rho; + jac.set(Ne21, He4, scratch); + + scratch = screened_rates(k_He4_O17_to_Ne21)*Y(He4)*state.rho; + jac.set(Ne21, O17, scratch); + + scratch = screened_rates(k_He4_F18_to_p_Ne21)*Y(He4)*state.rho; + jac.set(Ne21, F18, scratch); + + scratch = -screened_rates(k_Ne21_to_He4_O17) - screened_rates(k_p_Ne21_to_He4_F18)*Y(H1)*state.rho - screened_rates(k_p_Ne21_to_Na22)*Y(H1)*state.rho; + jac.set(Ne21, Ne21, scratch); + + scratch = screened_rates(k_Na22_to_p_Ne21); + jac.set(Ne21, Na22, scratch); + + scratch = -screened_rates(k_p_Na22_to_He4_Ne19)*Y(Na22)*state.rho + screened_rates(k_p_Ne21_to_Na22)*Y(Ne21)*state.rho; + jac.set(Na22, H1, scratch); + + scratch = screened_rates(k_He4_F18_to_Na22)*Y(F18)*state.rho + screened_rates(k_He4_Ne19_to_p_Na22)*Y(Ne19)*state.rho; + jac.set(Na22, He4, scratch); + + scratch = screened_rates(k_He4_F18_to_Na22)*Y(He4)*state.rho; + jac.set(Na22, F18, scratch); + + scratch = screened_rates(k_He4_Ne19_to_p_Na22)*Y(He4)*state.rho; + jac.set(Na22, Ne19, scratch); + + scratch = screened_rates(k_p_Ne21_to_Na22)*Y(H1)*state.rho; + jac.set(Na22, Ne21, scratch); + + scratch = -screened_rates(k_Na22_to_He4_F18) - screened_rates(k_Na22_to_p_Ne21) - screened_rates(k_p_Na22_to_He4_Ne19)*Y(H1)*state.rho; + jac.set(Na22, Na22, scratch); + + scratch = screened_rates(k_Mg22_to_Na22_weak_wc12); + jac.set(Na22, Mg22, scratch); + + scratch = -screened_rates(k_p_Na23_to_He4_Ne20)*Y(Na23)*state.rho - screened_rates(k_p_Na23_to_Mg24)*Y(Na23)*state.rho; + jac.set(Na23, H1, scratch); + + scratch = screened_rates(k_He4_F19_to_Na23)*Y(F19)*state.rho + screened_rates(k_He4_Ne20_to_p_Na23)*Y(Ne20)*state.rho; + jac.set(Na23, He4, scratch); + + scratch = 1.0*screened_rates(k_C12_C12_to_p_Na23)*Y(C12)*state.rho; + jac.set(Na23, C12, scratch); + + scratch = screened_rates(k_He4_F19_to_Na23)*Y(He4)*state.rho; + jac.set(Na23, F19, scratch); + + scratch = screened_rates(k_He4_Ne20_to_p_Na23)*Y(He4)*state.rho; + jac.set(Na23, Ne20, scratch); + + scratch = -screened_rates(k_Na23_to_He4_F19) - screened_rates(k_p_Na23_to_He4_Ne20)*Y(H1)*state.rho - screened_rates(k_p_Na23_to_Mg24)*Y(H1)*state.rho; + jac.set(Na23, Na23, scratch); + + scratch = screened_rates(k_Mg24_to_p_Na23); + jac.set(Na23, Mg24, scratch); + + scratch = screened_rates(k_He4_Ne18_to_Mg22)*Y(Ne18)*state.rho; + jac.set(Mg22, He4, scratch); + + scratch = screened_rates(k_He4_Ne18_to_Mg22)*Y(He4)*state.rho; + jac.set(Mg22, Ne18, scratch); + + scratch = -screened_rates(k_Mg22_to_He4_Ne18) - screened_rates(k_Mg22_to_Na22_weak_wc12); + jac.set(Mg22, Mg22, scratch); + + scratch = screened_rates(k_p_Al27_to_He4_Mg24)*Y(Al27)*state.rho + screened_rates(k_p_Na23_to_Mg24)*Y(Na23)*state.rho; + jac.set(Mg24, H1, scratch); + + scratch = -screened_rates(k_He4_Mg24_to_Si28)*Y(Mg24)*state.rho - screened_rates(k_He4_Mg24_to_p_Al27)*Y(Mg24)*state.rho + screened_rates(k_He4_Ne20_to_Mg24)*Y(Ne20)*state.rho; + jac.set(Mg24, He4, scratch); + + scratch = 1.0*screened_rates(k_C12_C12_to_Mg24_modified)*Y(C12)*state.rho + screened_rates(k_C12_O16_to_He4_Mg24)*Y(O16)*state.rho; + jac.set(Mg24, C12, scratch); + + scratch = screened_rates(k_C12_O16_to_He4_Mg24)*Y(C12)*state.rho; + jac.set(Mg24, O16, scratch); + + scratch = screened_rates(k_He4_Ne20_to_Mg24)*Y(He4)*state.rho; + jac.set(Mg24, Ne20, scratch); + + scratch = screened_rates(k_p_Na23_to_Mg24)*Y(H1)*state.rho; + jac.set(Mg24, Na23, scratch); + + scratch = -screened_rates(k_He4_Mg24_to_Si28)*Y(He4)*state.rho - screened_rates(k_He4_Mg24_to_p_Al27)*Y(He4)*state.rho - screened_rates(k_Mg24_to_He4_Ne20) - screened_rates(k_Mg24_to_p_Na23); + jac.set(Mg24, Mg24, scratch); + + scratch = screened_rates(k_p_Al27_to_He4_Mg24)*Y(H1)*state.rho; + jac.set(Mg24, Al27, scratch); + + scratch = screened_rates(k_Si28_to_He4_Mg24); + jac.set(Mg24, Si28, scratch); + + scratch = -screened_rates(k_p_Al27_to_He4_Mg24)*Y(Al27)*state.rho - screened_rates(k_p_Al27_to_Si28)*Y(Al27)*state.rho; + jac.set(Al27, H1, scratch); + + scratch = screened_rates(k_He4_Mg24_to_p_Al27)*Y(Mg24)*state.rho; + jac.set(Al27, He4, scratch); + + scratch = screened_rates(k_C12_O16_to_p_Al27)*Y(O16)*state.rho; + jac.set(Al27, C12, scratch); + + scratch = screened_rates(k_C12_O16_to_p_Al27)*Y(C12)*state.rho; + jac.set(Al27, O16, scratch); + + scratch = screened_rates(k_He4_Mg24_to_p_Al27)*Y(He4)*state.rho; + jac.set(Al27, Mg24, scratch); + + scratch = -screened_rates(k_p_Al27_to_He4_Mg24)*Y(H1)*state.rho - screened_rates(k_p_Al27_to_Si28)*Y(H1)*state.rho; + jac.set(Al27, Al27, scratch); + + scratch = screened_rates(k_Si28_to_p_Al27); + jac.set(Al27, Si28, scratch); + + scratch = screened_rates(k_p_Al27_to_Si28)*Y(Al27)*state.rho + screened_rates(k_p_P31_to_He4_Si28)*Y(P31)*state.rho; + jac.set(Si28, H1, scratch); + + scratch = screened_rates(k_He4_Mg24_to_Si28)*Y(Mg24)*state.rho - screened_rates(k_He4_Si28_to_S32)*Y(Si28)*state.rho - screened_rates(k_He4_Si28_to_p_P31)*Y(Si28)*state.rho; + jac.set(Si28, He4, scratch); + + scratch = screened_rates(k_C12_O16_to_Si28_modified)*Y(O16)*state.rho; + jac.set(Si28, C12, scratch); + + scratch = screened_rates(k_C12_O16_to_Si28_modified)*Y(C12)*state.rho + 1.0*screened_rates(k_O16_O16_to_He4_Si28)*Y(O16)*state.rho; + jac.set(Si28, O16, scratch); + + scratch = screened_rates(k_He4_Mg24_to_Si28)*Y(He4)*state.rho; + jac.set(Si28, Mg24, scratch); + + scratch = screened_rates(k_p_Al27_to_Si28)*Y(H1)*state.rho; + jac.set(Si28, Al27, scratch); + + scratch = -screened_rates(k_He4_Si28_to_S32)*Y(He4)*state.rho - screened_rates(k_He4_Si28_to_p_P31)*Y(He4)*state.rho - screened_rates(k_Si28_to_He4_Mg24) - screened_rates(k_Si28_to_p_Al27); + jac.set(Si28, Si28, scratch); + + scratch = screened_rates(k_p_P31_to_He4_Si28)*Y(H1)*state.rho; + jac.set(Si28, P31, scratch); + + scratch = screened_rates(k_S32_to_He4_Si28); + jac.set(Si28, S32, scratch); + + scratch = -screened_rates(k_p_P31_to_He4_Si28)*Y(P31)*state.rho - screened_rates(k_p_P31_to_S32)*Y(P31)*state.rho; + jac.set(P31, H1, scratch); + + scratch = screened_rates(k_He4_Si28_to_p_P31)*Y(Si28)*state.rho; + jac.set(P31, He4, scratch); + + scratch = 1.0*screened_rates(k_O16_O16_to_p_P31)*Y(O16)*state.rho; + jac.set(P31, O16, scratch); + + scratch = screened_rates(k_He4_Si28_to_p_P31)*Y(He4)*state.rho; + jac.set(P31, Si28, scratch); + + scratch = -screened_rates(k_p_P31_to_He4_Si28)*Y(H1)*state.rho - screened_rates(k_p_P31_to_S32)*Y(H1)*state.rho; + jac.set(P31, P31, scratch); + + scratch = screened_rates(k_S32_to_p_P31); + jac.set(P31, S32, scratch); + + scratch = screened_rates(k_p_P31_to_S32)*Y(P31)*state.rho; + jac.set(S32, H1, scratch); + + scratch = screened_rates(k_He4_Si28_to_S32)*Y(Si28)*state.rho - screened_rates(k_S32_He4_to_Ar36_approx)*Y(S32)*state.rho; + jac.set(S32, He4, scratch); + + scratch = 1.0*screened_rates(k_O16_O16_to_S32_modified)*Y(O16)*state.rho; + jac.set(S32, O16, scratch); + + scratch = screened_rates(k_He4_Si28_to_S32)*Y(He4)*state.rho; + jac.set(S32, Si28, scratch); + + scratch = screened_rates(k_p_P31_to_S32)*Y(H1)*state.rho; + jac.set(S32, P31, scratch); + + scratch = -screened_rates(k_S32_He4_to_Ar36_approx)*Y(He4)*state.rho - screened_rates(k_S32_to_He4_Si28) - screened_rates(k_S32_to_p_P31); + jac.set(S32, S32, scratch); + + scratch = screened_rates(k_Ar36_to_S32_He4_approx); + jac.set(S32, Ar36, scratch); + + scratch = -screened_rates(k_Ar36_He4_to_Ca40_approx)*Y(Ar36)*state.rho + screened_rates(k_S32_He4_to_Ar36_approx)*Y(S32)*state.rho; + jac.set(Ar36, He4, scratch); + + scratch = screened_rates(k_S32_He4_to_Ar36_approx)*Y(He4)*state.rho; + jac.set(Ar36, S32, scratch); + + scratch = -screened_rates(k_Ar36_He4_to_Ca40_approx)*Y(He4)*state.rho - screened_rates(k_Ar36_to_S32_He4_approx); + jac.set(Ar36, Ar36, scratch); + + scratch = screened_rates(k_Ca40_to_Ar36_He4_approx); + jac.set(Ar36, Ca40, scratch); + + scratch = screened_rates(k_Ar36_He4_to_Ca40_approx)*Y(Ar36)*state.rho - screened_rates(k_Ca40_He4_to_Ti44_approx)*Y(Ca40)*state.rho; + jac.set(Ca40, He4, scratch); + + scratch = screened_rates(k_Ar36_He4_to_Ca40_approx)*Y(He4)*state.rho; + jac.set(Ca40, Ar36, scratch); + + scratch = -screened_rates(k_Ca40_He4_to_Ti44_approx)*Y(He4)*state.rho - screened_rates(k_Ca40_to_Ar36_He4_approx); + jac.set(Ca40, Ca40, scratch); + + scratch = screened_rates(k_Ti44_to_Ca40_He4_approx); + jac.set(Ca40, Ti44, scratch); + + scratch = screened_rates(k_Ca40_He4_to_Ti44_approx)*Y(Ca40)*state.rho - screened_rates(k_Ti44_He4_to_Cr48_approx)*Y(Ti44)*state.rho; + jac.set(Ti44, He4, scratch); + + scratch = screened_rates(k_Ca40_He4_to_Ti44_approx)*Y(He4)*state.rho; + jac.set(Ti44, Ca40, scratch); + + scratch = -screened_rates(k_Ti44_He4_to_Cr48_approx)*Y(He4)*state.rho - screened_rates(k_Ti44_to_Ca40_He4_approx); + jac.set(Ti44, Ti44, scratch); + + scratch = screened_rates(k_Cr48_to_Ti44_He4_approx); + jac.set(Ti44, Cr48, scratch); + + scratch = -screened_rates(k_Cr48_He4_to_Fe52_approx)*Y(Cr48)*state.rho + screened_rates(k_Ti44_He4_to_Cr48_approx)*Y(Ti44)*state.rho; + jac.set(Cr48, He4, scratch); + + scratch = screened_rates(k_Ti44_He4_to_Cr48_approx)*Y(He4)*state.rho; + jac.set(Cr48, Ti44, scratch); + + scratch = -screened_rates(k_Cr48_He4_to_Fe52_approx)*Y(He4)*state.rho - screened_rates(k_Cr48_to_Ti44_He4_approx); + jac.set(Cr48, Cr48, scratch); + + scratch = screened_rates(k_Fe52_to_Cr48_He4_approx); + jac.set(Cr48, Fe52, scratch); + + scratch = screened_rates(k_Cr48_He4_to_Fe52_approx)*Y(Cr48)*state.rho - screened_rates(k_Fe52_He4_to_Ni56_approx)*Y(Fe52)*state.rho; + jac.set(Fe52, He4, scratch); + + scratch = screened_rates(k_Cr48_He4_to_Fe52_approx)*Y(He4)*state.rho; + jac.set(Fe52, Cr48, scratch); + + scratch = -screened_rates(k_Fe52_He4_to_Ni56_approx)*Y(He4)*state.rho - screened_rates(k_Fe52_to_Cr48_He4_approx); + jac.set(Fe52, Fe52, scratch); + + scratch = screened_rates(k_Ni56_to_Fe52_He4_approx); + jac.set(Fe52, Ni56, scratch); + + scratch = screened_rates(k_Fe52_He4_to_Ni56_approx)*Y(Fe52)*state.rho; + jac.set(Ni56, He4, scratch); + + scratch = screened_rates(k_Fe52_He4_to_Ni56_approx)*Y(He4)*state.rho; + jac.set(Ni56, Fe52, scratch); + + scratch = -screened_rates(k_Ni56_to_Fe52_He4_approx); + jac.set(Ni56, Ni56, scratch); + + +} + + + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void actual_jac(const burn_t& state, MatrixType& jac) +{ + + // Set molar abundances + amrex::Array1D Y; + for (int i = 1; i <= NumSpec; ++i) { + Y(i) = state.xn[i-1] * aion_inv[i-1]; + } + + + jac.zero(); + + rate_derivs_t rate_eval; + + constexpr int do_T_derivatives = 1; + + evaluate_rates(state, rate_eval); + + // Species Jacobian elements with respect to other species + + jac_nuc(state, jac, Y, rate_eval.screened_rates); + + // Energy generation rate Jacobian elements with respect to species + + for (int j = 1; j <= NumSpec; ++j) { + auto jac_slice_2 = [&](int i) -> amrex::Real { return jac.get(i, j); }; + ener_gener_rate(jac_slice_2, jac(net_ienuc,j)); + } + + // Account for the thermal neutrino losses + + amrex::Real sneut, dsneutdt, dsneutdd, dsnuda, dsnudz; + constexpr int do_derivatives{1}; + sneut5(state.T, state.rho, state.abar, state.zbar, sneut, dsneutdt, dsneutdd, dsnuda, dsnudz); + + for (int j = 1; j <= NumSpec; ++j) { + amrex::Real b1 = (-state.abar * state.abar * dsnuda + (zion[j-1] - state.zbar) * state.abar * dsnudz); + jac.add(net_ienuc, j, -b1); + } + + + // Evaluate the Jacobian elements with respect to energy by + // calling the RHS using d(rate) / dT and then transform them + // to our energy integration variable. + + amrex::Array1D yderivs; + + rhs_nuc(state, yderivs, Y, rate_eval.dscreened_rates_dT); + + for (int k = 1; k <= NumSpec; k++) { + jac.set(k, net_ienuc, temperature_to_energy_jacobian(state, yderivs(k))); + } + + + // finally, d(de/dt)/de + + amrex::Real jac_e_T; + ener_gener_rate(yderivs, jac_e_T); + jac_e_T -= dsneutdt; + jac.set(net_ienuc, net_ienuc, temperature_to_energy_jacobian(state, jac_e_T)); + +} + + +AMREX_INLINE +void actual_rhs_init () { + + init_tabular(); + +} + + +#endif diff --git a/networks/CNO_He_burn/inputs.burn_cell.VODE b/networks/CNO_He_burn/inputs.burn_cell.VODE new file mode 100644 index 0000000000..6615a6c258 --- /dev/null +++ b/networks/CNO_He_burn/inputs.burn_cell.VODE @@ -0,0 +1,59 @@ +unit_test.run_prefix = "react_pynucastro_" + +unit_test.small_temp = 1e5 +unit_test.small_dens = 1e5 + +integrator.burner_verbose = 0 + +# Set which jacobian to use +# 1 = analytic jacobian +# 2 = numerical jacobian +integrator.jacobian = 1 + +integrator.renormalize_abundances = 0 + +integrator.rtol_spec = 1.0e-6 +integrator.rtol_enuc = 1.0e-6 +integrator.atol_spec = 1.0e-6 +integrator.atol_enuc = 1.0e-6 + + +unit_test.tmax = 1.0 +unit_test.nsteps = 1000 + +unit_test.density = 1.0e7 +unit_test.temperature = 1.0e8 + +unit_test.X1 = 1.0 +unit_test.X2 = 0.0 +unit_test.X3 = 0.0 +unit_test.X4 = 0.0 +unit_test.X5 = 0.0 +unit_test.X6 = 0.0 +unit_test.X7 = 0.0 +unit_test.X8 = 0.0 +unit_test.X9 = 0.0 +unit_test.X10 = 0.0 +unit_test.X11 = 0.0 +unit_test.X12 = 0.0 +unit_test.X13 = 0.0 +unit_test.X14 = 0.0 +unit_test.X15 = 0.0 +unit_test.X16 = 0.0 +unit_test.X17 = 0.0 +unit_test.X18 = 0.0 +unit_test.X19 = 0.0 +unit_test.X20 = 0.0 +unit_test.X21 = 0.0 +unit_test.X22 = 0.0 +unit_test.X23 = 0.0 +unit_test.X24 = 0.0 +unit_test.X25 = 0.0 +unit_test.X26 = 0.0 +unit_test.X27 = 0.0 +unit_test.X28 = 0.0 +unit_test.X29 = 0.0 +unit_test.X30 = 0.0 +unit_test.X31 = 0.0 +unit_test.X32 = 0.0 +unit_test.X33 = 0.0 diff --git a/networks/CNO_He_burn/partition_functions.H b/networks/CNO_He_burn/partition_functions.H new file mode 100644 index 0000000000..38f06a550b --- /dev/null +++ b/networks/CNO_He_burn/partition_functions.H @@ -0,0 +1,192 @@ +#ifndef PARTITION_FUNCTIONS_H +#define PARTITION_FUNCTIONS_H + +#include +#include + +#include +#include +#include + +using namespace amrex; +using namespace Species; + +namespace part_fun { + + + + // interpolation routine + + template + AMREX_GPU_HOST_DEVICE AMREX_INLINE + void interpolate_pf(const amrex::Real t9, const amrex::Real (&temp_array)[npts], const amrex::Real (&pf_array)[npts], + amrex::Real& pf, amrex::Real& dpf_dT) { + + if (t9 >= temp_array[0] && t9 < temp_array[npts-1]) { + + // find the largest temperature element <= t9 using a binary search + + int left = 0; + int right = npts; + + while (left < right) { + int mid = (left + right) / 2; + if (temp_array[mid] > t9) { + right = mid; + } else { + left = mid + 1; + } + } + + const int idx = right - 1; + + // now we have temp_array[idx] <= t9 < temp_array[idx+1] + + // construct the slope -- this is (log10(pf_{i+1}) - log10(pf_i)) / (T_{i+1} - T_i) + + amrex::Real slope = (pf_array[idx+1] - pf_array[idx]) / (temp_array[idx+1] - temp_array[idx]); + + // find the PF + + amrex::Real log10_pf = pf_array[idx] + slope * (t9 - temp_array[idx]); + pf = std::pow(10.0_rt, log10_pf); + + // find the derivative (with respect to T, not T9) + + amrex::Real dpf_dT9 = pf * M_LN10 * slope; + dpf_dT = dpf_dT9 / 1.e9_rt; + + } else { + + // T < the smallest T or >= the largest T in the partition function table + pf = 1.0; + dpf_dT = 0.0; + + } + + } + + struct pf_cache_t { + // Store the coefficient and derivative adjacent in memory, as they're + // always accessed at the same time. + // The entries will be default-initialized to zero, which is fine since + // log10(x) is never zero. + amrex::Array2D data{}; + }; + +} + +// main interface + +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void get_partition_function(const int inuc, [[maybe_unused]] const tf_t& tfactors, + amrex::Real& pf, amrex::Real& dpf_dT) { + + // inuc is the 1-based index for the species + + switch (inuc) { + + + default: + + pf = 1.0_rt; + dpf_dT = 0.0_rt; + + } + +} + +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void get_partition_function_cached(const int inuc, const tf_t& tfactors, + part_fun::pf_cache_t& pf_cache, + amrex::Real& pf, amrex::Real& dpf_dT) { + if (pf_cache.data(inuc, 1) != 0.0_rt) { + // present in cache + amrex::ignore_unused(tfactors); + pf = pf_cache.data(inuc, 1); + dpf_dT = pf_cache.data(inuc, 2); + } else { + get_partition_function(inuc, tfactors, pf, dpf_dT); + pf_cache.data(inuc, 1) = pf; + pf_cache.data(inuc, 2) = dpf_dT; + } +} + +// spins + +AMREX_GPU_HOST_DEVICE AMREX_INLINE +constexpr amrex::Real get_spin_state(const int inuc) { + + amrex::Real spin = -1.0; + + switch (inuc) { // NOLINT(bugprone-switch-missing-default-case) + + case He4: + case C12: + case O14: + case O16: + case O18: + case Ne18: + case Ne20: + case Mg22: + case Mg24: + case Si28: + case S32: + case Ar36: + case Ca40: + case Ti44: + case Cr48: + case Fe52: + case Ni56: + spin = 1; + break; + + case H1: + case C13: + case N13: + case N15: + case O15: + case F19: + case Ne19: + case P31: + spin = 2; + break; + + case N14: + case F18: + spin = 3; + break; + + case Ne21: + case Na23: + case Cl35: + case K39: + case V47: + spin = 4; + break; + + case O17: + case F17: + case Al27: + case Mn51: + spin = 6; + break; + + case Na22: + spin = 7; + break; + + case Sc43: + case Co55: + spin = 8; + break; + + + } + + return spin; + +} + + +#endif diff --git a/networks/CNO_He_burn/pynucastro.net b/networks/CNO_He_burn/pynucastro.net new file mode 100644 index 0000000000..fe105064bd --- /dev/null +++ b/networks/CNO_He_burn/pynucastro.net @@ -0,0 +1,39 @@ +hydrogen-1 H1 1.0 1.0 +helium-4 He4 4.0 2.0 +carbon-12 C12 12.0 6.0 +carbon-13 C13 13.0 6.0 +nitrogen-13 N13 13.0 7.0 +nitrogen-14 N14 14.0 7.0 +nitrogen-15 N15 15.0 7.0 +oxygen-14 O14 14.0 8.0 +oxygen-15 O15 15.0 8.0 +oxygen-16 O16 16.0 8.0 +oxygen-17 O17 17.0 8.0 +oxygen-18 O18 18.0 8.0 +fluorine-17 F17 17.0 9.0 +fluorine-18 F18 18.0 9.0 +fluorine-19 F19 19.0 9.0 +neon-18 Ne18 18.0 10.0 +neon-19 Ne19 19.0 10.0 +neon-20 Ne20 20.0 10.0 +neon-21 Ne21 21.0 10.0 +sodium-22 Na22 22.0 11.0 +sodium-23 Na23 23.0 11.0 +magnesium-22 Mg22 22.0 12.0 +magnesium-24 Mg24 24.0 12.0 +aluminum-27 Al27 27.0 13.0 +silicon-28 Si28 28.0 14.0 +phosphorus-31 P31 31.0 15.0 +sulfur-32 S32 32.0 16.0 +argon-36 Ar36 36.0 18.0 +calcium-40 Ca40 40.0 20.0 +titanium-44 Ti44 44.0 22.0 +chromium-48 Cr48 48.0 24.0 +iron-52 Fe52 52.0 26.0 +nickel-56 Ni56 56.0 28.0 +__extra_chlorine-35 Cl35 35.0 17.0 +__extra_potassium-39 K39 39.0 19.0 +__extra_scandium-43 Sc43 43.0 21.0 +__extra_vanadium-47 V47 47.0 23.0 +__extra_manganese-51 Mn51 51.0 25.0 +__extra_cobalt-55 Co55 55.0 27.0 diff --git a/networks/CNO_He_burn/reaclib_rates.H b/networks/CNO_He_burn/reaclib_rates.H new file mode 100644 index 0000000000..f4078948a9 --- /dev/null +++ b/networks/CNO_He_burn/reaclib_rates.H @@ -0,0 +1,8426 @@ +#ifndef REACLIB_RATES_H +#define REACLIB_RATES_H + +#include +#include + +#include +#include +#include + +using namespace Rates; +using namespace Species; + +struct rate_t { + amrex::Array1D screened_rates; + amrex::Real enuc_weak; +}; + +struct rate_derivs_t { + amrex::Array1D screened_rates; + amrex::Array1D dscreened_rates_dT; + amrex::Real enuc_weak; +}; + + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_N13_to_C13_weak_wc12(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // N13 --> C13 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // wc12w + ln_set_rate = -6.7601; + amrex::ignore_unused(tfactors); + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.0; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_O14_to_N14_weak_wc12(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O14 --> N14 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // wc12w + ln_set_rate = -4.62354; + amrex::ignore_unused(tfactors); + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.0; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_O15_to_N15_weak_wc12(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O15 --> N15 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // wc12w + ln_set_rate = -5.17053; + amrex::ignore_unused(tfactors); + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.0; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_F17_to_O17_weak_wc12(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // F17 --> O17 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // wc12w + ln_set_rate = -4.53318; + amrex::ignore_unused(tfactors); + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.0; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_F18_to_O18_weak_wc12(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // F18 --> O18 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // wc12w + ln_set_rate = -9.15982; + amrex::ignore_unused(tfactors); + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.0; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ne18_to_F18_weak_wc12(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ne18 --> F18 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // wc12w + ln_set_rate = -0.879336; + amrex::ignore_unused(tfactors); + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.0; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ne19_to_F19_weak_wc12(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ne19 --> F19 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // wc12w + ln_set_rate = -3.21142; + amrex::ignore_unused(tfactors); + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.0; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Mg22_to_Na22_weak_wc12(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Mg22 --> Na22 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // wc12w + ln_set_rate = -1.72235; + amrex::ignore_unused(tfactors); + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.0; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_N13_to_p_C12(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // N13 --> p + C12 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ls09r + ln_set_rate = 40.4354 + -26.326 * tfactors.T9i + -5.10735 * tfactors.T913i + -2.24111 * tfactors.T913 + + 0.148883 * tfactors.T9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 26.326 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -5.10735 * tfactors.T943i + (1.0/3.0) * -2.24111 * tfactors.T923i + + 0.148883; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // ls09n + ln_set_rate = 40.0408 + -22.5475 * tfactors.T9i + -13.692 * tfactors.T913i + -0.230881 * tfactors.T913 + + 4.44362 * tfactors.T9 + -3.15898 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 22.5475 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -13.692 * tfactors.T943i + (1.0/3.0) * -0.230881 * tfactors.T923i + + 4.44362 + (5.0/3.0) * -3.15898 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_N14_to_p_C13(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // N14 --> p + C13 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // nacrr + ln_set_rate = 37.1528 + -93.4071 * tfactors.T9i + -0.196703 * tfactors.T913 + + 0.142126 * tfactors.T9 + -0.0238912 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 93.4071 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * -0.196703 * tfactors.T923i + + 0.142126 + (5.0/3.0) * -0.0238912 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacrr + ln_set_rate = 38.3716 + -101.18 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 101.18 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacrn + ln_set_rate = 41.7046 + -87.6256 * tfactors.T9i + -13.72 * tfactors.T913i + -0.450018 * tfactors.T913 + + 3.70823 * tfactors.T9 + -1.70545 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 87.6256 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -13.72 * tfactors.T943i + (1.0/3.0) * -0.450018 * tfactors.T923i + + 3.70823 + (5.0/3.0) * -1.70545 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_O14_to_p_N13(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O14 --> p + N13 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // lg06r + ln_set_rate = 35.2849 + -59.8313 * tfactors.T9i + 1.57122 * tfactors.T913i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 59.8313 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 1.57122 * tfactors.T943i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // lg06n + ln_set_rate = 42.4234 + -53.7053 * tfactors.T9i + -15.1676 * tfactors.T913i + 0.0955166 * tfactors.T913 + + 3.0659 * tfactors.T9 + -0.507339 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 53.7053 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -15.1676 * tfactors.T943i + (1.0/3.0) * 0.0955166 * tfactors.T923i + + 3.0659 + (5.0/3.0) * -0.507339 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_O15_to_p_N14(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O15 --> p + N14 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // im05r + ln_set_rate = 30.7435 + -89.5667 * tfactors.T9i + + 1.5682 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 89.5667 * tfactors.T9i * tfactors.T9i + + 1.5682 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // im05r + ln_set_rate = 31.6622 + -87.6737 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 87.6737 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // im05n + ln_set_rate = 44.1246 + -84.6757 * tfactors.T9i + -15.193 * tfactors.T913i + -4.63975 * tfactors.T913 + + 9.73458 * tfactors.T9 + -9.55051 * tfactors.T953 + 1.83333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 84.6757 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -15.193 * tfactors.T943i + (1.0/3.0) * -4.63975 * tfactors.T923i + + 9.73458 + (5.0/3.0) * -9.55051 * tfactors.T923 + 1.83333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // im05n + ln_set_rate = 41.0177 + -84.6757 * tfactors.T9i + -15.193 * tfactors.T913i + -0.161954 * tfactors.T913 + + -7.52123 * tfactors.T9 + -0.987565 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 84.6757 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -15.193 * tfactors.T943i + (1.0/3.0) * -0.161954 * tfactors.T923i + + -7.52123 + (5.0/3.0) * -0.987565 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_O16_to_p_N15(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O16 --> p + N15 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // li10r + ln_set_rate = 38.8465 + -150.962 * tfactors.T9i + + 0.0459037 * tfactors.T9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 150.962 * tfactors.T9i * tfactors.T9i + + 0.0459037; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // li10r + ln_set_rate = 30.8927 + -143.656 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 143.656 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // li10n + ln_set_rate = 44.3197 + -140.732 * tfactors.T9i + -15.24 * tfactors.T913i + 0.334926 * tfactors.T913 + + 4.59088 * tfactors.T9 + -4.78468 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 140.732 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -15.24 * tfactors.T943i + (1.0/3.0) * 0.334926 * tfactors.T923i + + 4.59088 + (5.0/3.0) * -4.78468 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_O16_to_He4_C12(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O16 --> He4 + C12 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // nac2 + ln_set_rate = 279.295 + -84.9515 * tfactors.T9i + 103.411 * tfactors.T913i + -420.567 * tfactors.T913 + + 64.0874 * tfactors.T9 + -12.4624 * tfactors.T953 + 138.803 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 84.9515 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 103.411 * tfactors.T943i + (1.0/3.0) * -420.567 * tfactors.T923i + + 64.0874 + (5.0/3.0) * -12.4624 * tfactors.T923 + 138.803 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nac2 + ln_set_rate = 94.3131 + -84.503 * tfactors.T9i + 58.9128 * tfactors.T913i + -148.273 * tfactors.T913 + + 9.08324 * tfactors.T9 + -0.541041 * tfactors.T953 + 71.8554 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 84.503 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 58.9128 * tfactors.T943i + (1.0/3.0) * -148.273 * tfactors.T923i + + 9.08324 + (5.0/3.0) * -0.541041 * tfactors.T923 + 71.8554 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_F17_to_p_O16(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // F17 --> p + O16 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ia08n + ln_set_rate = 40.9135 + -6.96583 * tfactors.T9i + -16.696 * tfactors.T913i + -1.16252 * tfactors.T913 + + 0.267703 * tfactors.T9 + -0.0338411 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 6.96583 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -16.696 * tfactors.T943i + (1.0/3.0) * -1.16252 * tfactors.T923i + + 0.267703 + (5.0/3.0) * -0.0338411 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_F18_to_p_O17(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // F18 --> p + O17 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = 33.7037 + -71.2889 * tfactors.T9i + 2.31435 * tfactors.T913 + + -0.302835 * tfactors.T9 + 0.020133 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 71.2889 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 2.31435 * tfactors.T923i + + -0.302835 + (5.0/3.0) * 0.020133 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 11.2362 + -65.8069 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 65.8069 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 40.2061 + -65.0606 * tfactors.T9i + -16.4035 * tfactors.T913i + 4.31885 * tfactors.T913 + + -0.709921 * tfactors.T9 + -2.0 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 65.0606 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -16.4035 * tfactors.T943i + (1.0/3.0) * 4.31885 * tfactors.T923i + + -0.709921 + (5.0/3.0) * -2.0 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_F18_to_He4_N14(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // F18 --> He4 + N14 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10n + ln_set_rate = 46.249 + -51.2292 * tfactors.T9i + -36.2504 * tfactors.T913i + + -5.0 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 51.2292 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -36.2504 * tfactors.T943i + + (5.0/3.0) * -5.0 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 38.6146 + -62.1948 * tfactors.T9i + -5.6227 * tfactors.T913i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 62.1948 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -5.6227 * tfactors.T943i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 24.9119 + -56.3896 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 56.3896 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_F19_to_p_O18(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // F19 --> p + O18 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10n + ln_set_rate = 42.8485 + -92.7757 * tfactors.T9i + -16.7246 * tfactors.T913i + + -3.0 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 92.7757 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -16.7246 * tfactors.T943i + + (5.0/3.0) * -3.0 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 30.2003 + -99.501 * tfactors.T9i + 3.99059 * tfactors.T913 + + -0.593127 * tfactors.T9 + 0.0877534 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 99.501 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 3.99059 * tfactors.T923i + + -0.593127 + (5.0/3.0) * 0.0877534 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 28.008 + -94.4325 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 94.4325 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -12.0764 + -93.0204 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 93.0204 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_F19_to_He4_N15(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // F19 --> He4 + N15 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = 15.3186 + -50.7554 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 50.7554 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 50.1291 + -46.5774 * tfactors.T9i + -36.2324 * tfactors.T913i + + -2.0 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 46.5774 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -36.2324 * tfactors.T943i + + (5.0/3.0) * -2.0 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -4.06142 + -50.7773 * tfactors.T9i + 35.4292 * tfactors.T913 + + -5.5767 * tfactors.T9 + 0.441293 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 50.7773 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 35.4292 * tfactors.T923i + + -5.5767 + (5.0/3.0) * 0.441293 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 28.2717 + -53.5621 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 53.5621 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ne18_to_p_F17(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ne18 --> p + F17 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // cb09 + ln_set_rate = 52.9895 + -50.492 * tfactors.T9i + -21.3249 * tfactors.T913i + -0.230774 * tfactors.T913 + + 0.917931 * tfactors.T9 + -0.0440377 * tfactors.T953 + -5.86014 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 50.492 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -21.3249 * tfactors.T943i + (1.0/3.0) * -0.230774 * tfactors.T923i + + 0.917931 + (5.0/3.0) * -0.0440377 * tfactors.T923 + -5.86014 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // cb09 + ln_set_rate = 17.5646 + -45.5647 * tfactors.T9i + -14.2191 * tfactors.T913i + 34.0647 * tfactors.T913 + + -16.5698 * tfactors.T9 + 2.48116 * tfactors.T953 + -0.63376 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 45.5647 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -14.2191 * tfactors.T943i + (1.0/3.0) * 34.0647 * tfactors.T923i + + -16.5698 + (5.0/3.0) * 2.48116 * tfactors.T923 + -0.63376 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ne18_to_He4_O14(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ne18 --> He4 + O14 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // wh87r + ln_set_rate = 20.0156 + -71.5044 * tfactors.T9i + + 6.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 71.5044 * tfactors.T9i * tfactors.T9i + + 6.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // wh87r + ln_set_rate = 28.2415 + -81.9554 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 81.9554 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // wh87r + ln_set_rate = 22.5609 + -71.0754 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 71.0754 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // wh87n + ln_set_rate = 51.158 + -59.3454 * tfactors.T9i + -39.38 * tfactors.T913i + -0.0772187 * tfactors.T913 + + -0.635361 * tfactors.T9 + 0.106236 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 59.3454 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -39.38 * tfactors.T943i + (1.0/3.0) * -0.0772187 * tfactors.T923i + + -0.635361 + (5.0/3.0) * 0.106236 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ne19_to_p_F18(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ne19 --> p + F18 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = -5.41887 + -74.7977 * tfactors.T9i + 22.4903 * tfactors.T913 + + 0.307872 * tfactors.T9 + -0.296226 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 74.7977 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 22.4903 * tfactors.T923i + + 0.307872 + (5.0/3.0) * -0.296226 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 81.4385 + -74.3988 * tfactors.T9i + -21.4023 * tfactors.T913i + -93.766 * tfactors.T913 + + 179.258 * tfactors.T9 + -202.561 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 74.3988 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -21.4023 * tfactors.T943i + (1.0/3.0) * -93.766 * tfactors.T923i + + 179.258 + (5.0/3.0) * -202.561 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 18.1729 + -77.2902 * tfactors.T9i + 13.1683 * tfactors.T913 + + -1.92023 * tfactors.T9 + 0.16901 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 77.2902 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 13.1683 * tfactors.T923i + + -1.92023 + (5.0/3.0) * 0.16901 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ne19_to_He4_O15(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ne19 --> He4 + O15 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // dc11n + ln_set_rate = 51.0289 + -40.9534 * tfactors.T9i + -39.578 * tfactors.T913i + + -3.0 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 40.9534 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -39.578 * tfactors.T943i + + (5.0/3.0) * -3.0 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // dc11r + ln_set_rate = -7.51212 + -45.1578 * tfactors.T9i + -3.24609 * tfactors.T913i + 44.4647 * tfactors.T913 + + -9.79962 * tfactors.T9 + 0.841782 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 45.1578 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -3.24609 * tfactors.T943i + (1.0/3.0) * 44.4647 * tfactors.T923i + + -9.79962 + (5.0/3.0) * 0.841782 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // dc11r + ln_set_rate = 24.6922 + -46.8378 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 46.8378 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ne20_to_p_F19(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ne20 --> p + F19 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // nacrr + ln_set_rate = 18.691 + -156.781 * tfactors.T9i + 31.6442 * tfactors.T913i + -58.6563 * tfactors.T913 + + 67.7365 * tfactors.T9 + -22.9721 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 156.781 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 31.6442 * tfactors.T943i + (1.0/3.0) * -58.6563 * tfactors.T923i + + 67.7365 + (5.0/3.0) * -22.9721 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacrr + ln_set_rate = 36.7036 + -150.75 * tfactors.T9i + -11.3832 * tfactors.T913i + 5.47872 * tfactors.T913 + + -1.07203 * tfactors.T9 + 0.11196 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 150.75 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -11.3832 * tfactors.T943i + (1.0/3.0) * 5.47872 * tfactors.T923i + + -1.07203 + (5.0/3.0) * 0.11196 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacrn + ln_set_rate = 42.6027 + -149.037 * tfactors.T9i + -18.116 * tfactors.T913i + -1.4622 * tfactors.T913 + + 6.95113 * tfactors.T9 + -2.90366 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 149.037 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -18.116 * tfactors.T943i + (1.0/3.0) * -1.4622 * tfactors.T923i + + 6.95113 + (5.0/3.0) * -2.90366 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ne20_to_He4_O16(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ne20 --> He4 + O16 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // co10r + ln_set_rate = 34.2658 + -67.6518 * tfactors.T9i + -3.65925 * tfactors.T913 + + 0.714224 * tfactors.T9 + -0.00107508 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 67.6518 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * -3.65925 * tfactors.T923i + + 0.714224 + (5.0/3.0) * -0.00107508 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // co10r + ln_set_rate = 28.6431 + -65.246 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 65.246 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // co10n + ln_set_rate = 48.6604 + -54.8875 * tfactors.T9i + -39.7262 * tfactors.T913i + -0.210799 * tfactors.T913 + + 0.442879 * tfactors.T9 + -0.0797753 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 54.8875 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -39.7262 * tfactors.T943i + (1.0/3.0) * -0.210799 * tfactors.T923i + + 0.442879 + (5.0/3.0) * -0.0797753 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ne21_to_He4_O17(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ne21 --> He4 + O17 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // be13r + ln_set_rate = 27.3205 + -91.2722 * tfactors.T9i + 2.87641 * tfactors.T913i + -3.54489 * tfactors.T913 + + -2.11222e-08 * tfactors.T9 + -3.90649e-09 * tfactors.T953 + 6.25778 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 91.2722 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 2.87641 * tfactors.T943i + (1.0/3.0) * -3.54489 * tfactors.T923i + + -2.11222e-08 + (5.0/3.0) * -3.90649e-09 * tfactors.T923 + 6.25778 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // be13r + ln_set_rate = 0.0906657 + -90.782 * tfactors.T9i + 123.363 * tfactors.T913i + -87.4351 * tfactors.T913 + + -3.40974e-06 * tfactors.T9 + -57.0469 * tfactors.T953 + 83.7218 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 90.782 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 123.363 * tfactors.T943i + (1.0/3.0) * -87.4351 * tfactors.T923i + + -3.40974e-06 + (5.0/3.0) * -57.0469 * tfactors.T923 + 83.7218 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // be13r + ln_set_rate = -91.954 + -98.9487 * tfactors.T9i + 3.31162e-08 * tfactors.T913i + 130.258 * tfactors.T913 + + -7.92551e-05 * tfactors.T9 + -4.13772 * tfactors.T953 + -41.2753 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 98.9487 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 3.31162e-08 * tfactors.T943i + (1.0/3.0) * 130.258 * tfactors.T923i + + -7.92551e-05 + (5.0/3.0) * -4.13772 * tfactors.T923 + -41.2753 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Na22_to_p_Ne21(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Na22 --> p + Ne21 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = -16.4098 + -82.4235 * tfactors.T9i + 21.1176 * tfactors.T913i + 34.0411 * tfactors.T913 + + -4.45593 * tfactors.T9 + 0.328613 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 82.4235 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 21.1176 * tfactors.T943i + (1.0/3.0) * 34.0411 * tfactors.T923i + + -4.45593 + (5.0/3.0) * 0.328613 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 24.8334 + -79.6093 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 79.6093 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -24.579 + -78.4059 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 78.4059 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 42.146 + -78.2097 * tfactors.T9i + -19.2096 * tfactors.T913i + + -1.0 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 78.2097 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -19.2096 * tfactors.T943i + + (5.0/3.0) * -1.0 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Na22_to_He4_F18(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Na22 --> He4 + F18 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // rpsmr + ln_set_rate = 59.3224 + -100.236 * tfactors.T9i + 18.8956 * tfactors.T913i + -65.6134 * tfactors.T913 + + 1.71114 * tfactors.T9 + -0.0260999 * tfactors.T953 + 39.3396 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 100.236 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 18.8956 * tfactors.T943i + (1.0/3.0) * -65.6134 * tfactors.T923i + + 1.71114 + (5.0/3.0) * -0.0260999 * tfactors.T923 + 39.3396 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Na23_to_He4_F19(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Na23 --> He4 + F19 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // rpsmr + ln_set_rate = 76.8979 + -123.578 * tfactors.T9i + 39.7219 * tfactors.T913i + -100.401 * tfactors.T913 + + 3.15808 * tfactors.T9 + -0.0629822 * tfactors.T953 + 55.9823 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 123.578 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 39.7219 * tfactors.T943i + (1.0/3.0) * -100.401 * tfactors.T923i + + 3.15808 + (5.0/3.0) * -0.0629822 * tfactors.T923 + 55.9823 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Mg22_to_He4_Ne18(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Mg22 --> He4 + Ne18 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 57.6776 + -94.4496 * tfactors.T9i + -46.4859 * tfactors.T913i + 0.956741 * tfactors.T913 + + -0.914402 * tfactors.T9 + 0.0722478 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 94.4496 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -46.4859 * tfactors.T943i + (1.0/3.0) * 0.956741 * tfactors.T923i + + -0.914402 + (5.0/3.0) * 0.0722478 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Mg24_to_p_Na23(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Mg24 --> p + Na23 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = 34.0876 + -138.968 * tfactors.T9i + -0.360588 * tfactors.T913 + + 1.4187 * tfactors.T9 + -0.184061 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 138.968 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * -0.360588 * tfactors.T923i + + 1.4187 + (5.0/3.0) * -0.184061 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 20.0024 + -137.3 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 137.3 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 43.9357 + -135.688 * tfactors.T9i + -20.6428 * tfactors.T913i + 1.52954 * tfactors.T913 + + 2.7487 * tfactors.T9 + -1.0 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 135.688 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -20.6428 * tfactors.T943i + (1.0/3.0) * 1.52954 * tfactors.T923i + + 2.7487 + (5.0/3.0) * -1.0 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Mg24_to_He4_Ne20(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Mg24 --> He4 + Ne20 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10n + ln_set_rate = 49.3244 + -108.114 * tfactors.T9i + -46.2525 * tfactors.T913i + 5.58901 * tfactors.T913 + + 7.61843 * tfactors.T9 + -3.683 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 108.114 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -46.2525 * tfactors.T943i + (1.0/3.0) * 5.58901 * tfactors.T923i + + 7.61843 + (5.0/3.0) * -3.683 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 16.0203 + -120.895 * tfactors.T9i + 16.9229 * tfactors.T913 + + -2.57325 * tfactors.T9 + 0.208997 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 120.895 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 16.9229 * tfactors.T923i + + -2.57325 + (5.0/3.0) * 0.208997 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 26.8017 + -117.334 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 117.334 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -13.8869 + -110.62 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 110.62 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Si28_to_p_Al27(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Si28 --> p + Al27 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = 11.7765 + -136.349 * tfactors.T9i + 23.8634 * tfactors.T913 + + -3.70135 * tfactors.T9 + 0.28964 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 136.349 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 23.8634 * tfactors.T923i + + -3.70135 + (5.0/3.0) * 0.28964 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 46.5494 + -134.445 * tfactors.T9i + -23.2205 * tfactors.T913i + + -2.0 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 134.445 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -23.2205 * tfactors.T943i + + (5.0/3.0) * -2.0 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 111.466 + -134.832 * tfactors.T9i + -26.8327 * tfactors.T913i + -116.137 * tfactors.T913 + + 0.00950567 * tfactors.T9 + 0.00999755 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 134.832 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -26.8327 * tfactors.T943i + (1.0/3.0) * -116.137 * tfactors.T923i + + 0.00950567 + (5.0/3.0) * 0.00999755 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Si28_to_He4_Mg24(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Si28 --> He4 + Mg24 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // st08r + ln_set_rate = 32.9006 + -131.488 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 131.488 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // st08r + ln_set_rate = -25.6886 + -128.693 * tfactors.T9i + 21.3721 * tfactors.T913i + 37.7649 * tfactors.T913 + + -4.10635 * tfactors.T9 + 0.249618 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 128.693 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 21.3721 * tfactors.T943i + (1.0/3.0) * 37.7649 * tfactors.T923i + + -4.10635 + (5.0/3.0) * 0.249618 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_S32_to_p_P31(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // S32 --> p + P31 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = 25.1729 + -106.637 * tfactors.T9i + 8.09341 * tfactors.T913 + + -0.615971 * tfactors.T9 + 0.031159 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 106.637 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 8.09341 * tfactors.T923i + + -0.615971 + (5.0/3.0) * 0.031159 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 21.6829 + -105.119 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 105.119 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 43.6109 + -102.86 * tfactors.T9i + -25.3278 * tfactors.T913i + 6.4931 * tfactors.T913 + + -9.27513 * tfactors.T9 + -0.610439 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 102.86 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -25.3278 * tfactors.T943i + (1.0/3.0) * 6.4931 * tfactors.T923i + + -9.27513 + (5.0/3.0) * -0.610439 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_S32_to_He4_Si28(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // S32 --> He4 + Si28 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 72.813 + -80.626 * tfactors.T9i + -59.4896 * tfactors.T913i + 4.47205 * tfactors.T913 + + -4.78989 * tfactors.T9 + 0.557201 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 80.626 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -59.4896 * tfactors.T943i + (1.0/3.0) * 4.47205 * tfactors.T923i + + -4.78989 + (5.0/3.0) * 0.557201 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_C12_to_He4_He4_He4(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // C12 --> He4 + He4 + He4 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // fy05n + ln_set_rate = 45.7734 + -84.4227 * tfactors.T9i + -37.06 * tfactors.T913i + 29.3493 * tfactors.T913 + + -115.507 * tfactors.T9 + -10.0 * tfactors.T953 + 1.66667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 84.4227 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -37.06 * tfactors.T943i + (1.0/3.0) * 29.3493 * tfactors.T923i + + -115.507 + (5.0/3.0) * -10.0 * tfactors.T923 + 1.66667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // fy05r + ln_set_rate = 22.394 + -88.5493 * tfactors.T9i + -13.49 * tfactors.T913i + 21.4259 * tfactors.T913 + + -1.34769 * tfactors.T9 + 0.0879816 * tfactors.T953 + -10.1653 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 88.5493 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -13.49 * tfactors.T943i + (1.0/3.0) * 21.4259 * tfactors.T923i + + -1.34769 + (5.0/3.0) * 0.0879816 * tfactors.T923 + -10.1653 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // fy05r + ln_set_rate = 34.9561 + -85.4472 * tfactors.T9i + -23.57 * tfactors.T913i + 20.4886 * tfactors.T913 + + -12.9882 * tfactors.T9 + -20.0 * tfactors.T953 + 0.83333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 85.4472 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -23.57 * tfactors.T943i + (1.0/3.0) * 20.4886 * tfactors.T923i + + -12.9882 + (5.0/3.0) * -20.0 * tfactors.T923 + 0.83333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_C12_to_N13(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // C12 + p --> N13 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ls09n + ln_set_rate = 17.1482 + -13.692 * tfactors.T913i + -0.230881 * tfactors.T913 + + 4.44362 * tfactors.T9 + -3.15898 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -13.692 * tfactors.T943i + (1.0/3.0) * -0.230881 * tfactors.T923i + + 4.44362 + (5.0/3.0) * -3.15898 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // ls09r + ln_set_rate = 17.5428 + -3.77849 * tfactors.T9i + -5.10735 * tfactors.T913i + -2.24111 * tfactors.T913 + + 0.148883 * tfactors.T9 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 3.77849 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -5.10735 * tfactors.T943i + (1.0/3.0) * -2.24111 * tfactors.T923i + + 0.148883 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_C12_to_O16(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // C12 + He4 --> O16 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // nac2 + ln_set_rate = 254.634 + -1.84097 * tfactors.T9i + 103.411 * tfactors.T913i + -420.567 * tfactors.T913 + + 64.0874 * tfactors.T9 + -12.4624 * tfactors.T953 + 137.303 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.84097 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 103.411 * tfactors.T943i + (1.0/3.0) * -420.567 * tfactors.T923i + + 64.0874 + (5.0/3.0) * -12.4624 * tfactors.T923 + 137.303 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nac2 + ln_set_rate = 69.6526 + -1.39254 * tfactors.T9i + 58.9128 * tfactors.T913i + -148.273 * tfactors.T913 + + 9.08324 * tfactors.T9 + -0.541041 * tfactors.T953 + 70.3554 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.39254 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 58.9128 * tfactors.T943i + (1.0/3.0) * -148.273 * tfactors.T923i + + 9.08324 + (5.0/3.0) * -0.541041 * tfactors.T923 + 70.3554 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_C13_to_N14(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // C13 + p --> N14 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // nacrr + ln_set_rate = 15.1825 + -13.5543 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 13.5543 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacrn + ln_set_rate = 18.5155 + -13.72 * tfactors.T913i + -0.450018 * tfactors.T913 + + 3.70823 * tfactors.T9 + -1.70545 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -13.72 * tfactors.T943i + (1.0/3.0) * -0.450018 * tfactors.T923i + + 3.70823 + (5.0/3.0) * -1.70545 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacrr + ln_set_rate = 13.9637 + -5.78147 * tfactors.T9i + -0.196703 * tfactors.T913 + + 0.142126 * tfactors.T9 + -0.0238912 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 5.78147 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * -0.196703 * tfactors.T923i + + 0.142126 + (5.0/3.0) * -0.0238912 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_N13_to_O14(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // N13 + p --> O14 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // lg06r + ln_set_rate = 10.9971 + -6.12602 * tfactors.T9i + 1.57122 * tfactors.T913i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 6.12602 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 1.57122 * tfactors.T943i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // lg06n + ln_set_rate = 18.1356 + -15.1676 * tfactors.T913i + 0.0955166 * tfactors.T913 + + 3.0659 * tfactors.T9 + -0.507339 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -15.1676 * tfactors.T943i + (1.0/3.0) * 0.0955166 * tfactors.T923i + + 3.0659 + (5.0/3.0) * -0.507339 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_N14_to_O15(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // N14 + p --> O15 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // im05n + ln_set_rate = 17.01 + -15.193 * tfactors.T913i + -0.161954 * tfactors.T913 + + -7.52123 * tfactors.T9 + -0.987565 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -15.193 * tfactors.T943i + (1.0/3.0) * -0.161954 * tfactors.T923i + + -7.52123 + (5.0/3.0) * -0.987565 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // im05r + ln_set_rate = 6.73578 + -4.891 * tfactors.T9i + + 0.0682 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 4.891 * tfactors.T9i * tfactors.T9i + + 0.0682 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // im05r + ln_set_rate = 7.65444 + -2.998 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 2.998 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // im05n + ln_set_rate = 20.1169 + -15.193 * tfactors.T913i + -4.63975 * tfactors.T913 + + 9.73458 * tfactors.T9 + -9.55051 * tfactors.T953 + 0.333333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -15.193 * tfactors.T943i + (1.0/3.0) * -4.63975 * tfactors.T923i + + 9.73458 + (5.0/3.0) * -9.55051 * tfactors.T923 + 0.333333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_N14_to_F18(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // N14 + He4 --> F18 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10n + ln_set_rate = 21.5339 + -36.2504 * tfactors.T913i + + -5.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -36.2504 * tfactors.T943i + + (5.0/3.0) * -5.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 13.8995 + -10.9656 * tfactors.T9i + -5.6227 * tfactors.T913i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 10.9656 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -5.6227 * tfactors.T943i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 0.196838 + -5.16034 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 5.16034 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_N15_to_O16(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // N15 + p --> O16 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // li10n + ln_set_rate = 20.0176 + -15.24 * tfactors.T913i + 0.334926 * tfactors.T913 + + 4.59088 * tfactors.T9 + -4.78468 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -15.24 * tfactors.T943i + (1.0/3.0) * 0.334926 * tfactors.T923i + + 4.59088 + (5.0/3.0) * -4.78468 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // li10r + ln_set_rate = 14.5444 + -10.2295 * tfactors.T9i + + 0.0459037 * tfactors.T9 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 10.2295 * tfactors.T9i * tfactors.T9i + + 0.0459037 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // li10r + ln_set_rate = 6.59056 + -2.92315 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 2.92315 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_N15_to_F19(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // N15 + He4 --> F19 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = -9.41892 + -4.17795 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 4.17795 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 25.3916 + -36.2324 * tfactors.T913i + + -2.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -36.2324 * tfactors.T943i + + (5.0/3.0) * -2.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -28.7989 + -4.19986 * tfactors.T9i + 35.4292 * tfactors.T913 + + -5.5767 * tfactors.T9 + 0.441293 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 4.19986 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 35.4292 * tfactors.T923i + + -5.5767 + (5.0/3.0) * 0.441293 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 3.5342 + -6.98462 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 6.98462 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_O14_to_Ne18(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O14 + He4 --> Ne18 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // wh87r + ln_set_rate = -4.69948 + -12.159 * tfactors.T9i + + 5.0 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 12.159 * tfactors.T9i * tfactors.T9i + + 5.0 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // wh87r + ln_set_rate = 3.52636 + -22.61 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 22.61 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // wh87r + ln_set_rate = -2.15417 + -11.73 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 11.73 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // wh87n + ln_set_rate = 26.4429 + -39.38 * tfactors.T913i + -0.0772187 * tfactors.T913 + + -0.635361 * tfactors.T9 + 0.106236 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -39.38 * tfactors.T943i + (1.0/3.0) * -0.0772187 * tfactors.T923i + + -0.635361 + (5.0/3.0) * 0.106236 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_O15_to_Ne19(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O15 + He4 --> Ne19 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // dc11r + ln_set_rate = -32.2496 + -4.20439 * tfactors.T9i + -3.24609 * tfactors.T913i + 44.4647 * tfactors.T913 + + -9.79962 * tfactors.T9 + 0.841782 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 4.20439 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -3.24609 * tfactors.T943i + (1.0/3.0) * 44.4647 * tfactors.T923i + + -9.79962 + (5.0/3.0) * 0.841782 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // dc11r + ln_set_rate = -0.0452465 + -5.88439 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 5.88439 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // dc11n + ln_set_rate = 26.2914 + -39.578 * tfactors.T913i + + -3.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -39.578 * tfactors.T943i + + (5.0/3.0) * -3.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_O16_to_F17(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O16 + p --> F17 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ia08n + ln_set_rate = 19.0904 + -16.696 * tfactors.T913i + -1.16252 * tfactors.T913 + + 0.267703 * tfactors.T9 + -0.0338411 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -16.696 * tfactors.T943i + (1.0/3.0) * -1.16252 * tfactors.T923i + + 0.267703 + (5.0/3.0) * -0.0338411 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_O16_to_Ne20(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O16 + He4 --> Ne20 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // co10r + ln_set_rate = 9.50848 + -12.7643 * tfactors.T9i + -3.65925 * tfactors.T913 + + 0.714224 * tfactors.T9 + -0.00107508 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 12.7643 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * -3.65925 * tfactors.T923i + + 0.714224 + (5.0/3.0) * -0.00107508 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // co10r + ln_set_rate = 3.88571 + -10.3585 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 10.3585 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // co10n + ln_set_rate = 23.903 + -39.7262 * tfactors.T913i + -0.210799 * tfactors.T913 + + 0.442879 * tfactors.T9 + -0.0797753 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -39.7262 * tfactors.T943i + (1.0/3.0) * -0.210799 * tfactors.T923i + + 0.442879 + (5.0/3.0) * -0.0797753 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_O17_to_F18(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O17 + p --> F18 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10n + ln_set_rate = 15.8929 + -16.4035 * tfactors.T913i + 4.31885 * tfactors.T913 + + -0.709921 * tfactors.T9 + -2.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -16.4035 * tfactors.T943i + (1.0/3.0) * 4.31885 * tfactors.T923i + + -0.709921 + (5.0/3.0) * -2.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 9.39048 + -6.22828 * tfactors.T9i + 2.31435 * tfactors.T913 + + -0.302835 * tfactors.T9 + 0.020133 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 6.22828 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 2.31435 * tfactors.T923i + + -0.302835 + (5.0/3.0) * 0.020133 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -13.077 + -0.746296 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.746296 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_O17_to_Ne21(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O17 + He4 --> Ne21 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // be13r + ln_set_rate = -25.0898 + -5.50926 * tfactors.T9i + 123.363 * tfactors.T913i + -87.4351 * tfactors.T913 + + -3.40974e-06 * tfactors.T9 + -57.0469 * tfactors.T953 + 82.2218 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 5.50926 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 123.363 * tfactors.T943i + (1.0/3.0) * -87.4351 * tfactors.T923i + + -3.40974e-06 + (5.0/3.0) * -57.0469 * tfactors.T923 + 82.2218 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // be13r + ln_set_rate = -117.134 + -13.6759 * tfactors.T9i + 3.31162e-08 * tfactors.T913i + 130.258 * tfactors.T913 + + -7.92551e-05 * tfactors.T9 + -4.13772 * tfactors.T953 + -42.7753 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 13.6759 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 3.31162e-08 * tfactors.T943i + (1.0/3.0) * 130.258 * tfactors.T923i + + -7.92551e-05 + (5.0/3.0) * -4.13772 * tfactors.T923 + -42.7753 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // be13r + ln_set_rate = 2.14 + -5.99952 * tfactors.T9i + 2.87641 * tfactors.T913i + -3.54489 * tfactors.T913 + + -2.11222e-08 * tfactors.T9 + -3.90649e-09 * tfactors.T953 + 4.75778 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 5.99952 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 2.87641 * tfactors.T943i + (1.0/3.0) * -3.54489 * tfactors.T923i + + -2.11222e-08 + (5.0/3.0) * -3.90649e-09 * tfactors.T923 + 4.75778 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_O18_to_F19(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O18 + p --> F19 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = -35.0079 + -0.244743 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.244743 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 19.917 + -16.7246 * tfactors.T913i + + -3.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -16.7246 * tfactors.T943i + + (5.0/3.0) * -3.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 7.26876 + -6.7253 * tfactors.T9i + 3.99059 * tfactors.T913 + + -0.593127 * tfactors.T9 + 0.0877534 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 6.7253 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 3.99059 * tfactors.T923i + + -0.593127 + (5.0/3.0) * 0.0877534 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 5.07648 + -1.65681 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.65681 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_F17_to_Ne18(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // F17 + p --> Ne18 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // cb09 + ln_set_rate = -7.84708 + -0.0323504 * tfactors.T9i + -14.2191 * tfactors.T913i + 34.0647 * tfactors.T913 + + -16.5698 * tfactors.T9 + 2.48116 * tfactors.T953 + -2.13376 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.0323504 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -14.2191 * tfactors.T943i + (1.0/3.0) * 34.0647 * tfactors.T923i + + -16.5698 + (5.0/3.0) * 2.48116 * tfactors.T923 + -2.13376 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // cb09 + ln_set_rate = 27.5778 + -4.95969 * tfactors.T9i + -21.3249 * tfactors.T913i + -0.230774 * tfactors.T913 + + 0.917931 * tfactors.T9 + -0.0440377 * tfactors.T953 + -7.36014 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 4.95969 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -21.3249 * tfactors.T943i + (1.0/3.0) * -0.230774 * tfactors.T923i + + 0.917931 + (5.0/3.0) * -0.0440377 * tfactors.T923 + -7.36014 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_F18_to_Ne19(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // F18 + p --> Ne19 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10n + ln_set_rate = 57.4084 + -21.4023 * tfactors.T913i + -93.766 * tfactors.T913 + + 179.258 * tfactors.T9 + -202.561 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -21.4023 * tfactors.T943i + (1.0/3.0) * -93.766 * tfactors.T923i + + 179.258 + (5.0/3.0) * -202.561 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -5.85727 + -2.89147 * tfactors.T9i + 13.1683 * tfactors.T913 + + -1.92023 * tfactors.T9 + 0.16901 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 2.89147 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 13.1683 * tfactors.T923i + + -1.92023 + (5.0/3.0) * 0.16901 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -29.449 + -0.39895 * tfactors.T9i + 22.4903 * tfactors.T913 + + 0.307872 * tfactors.T9 + -0.296226 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.39895 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 22.4903 * tfactors.T923i + + 0.307872 + (5.0/3.0) * -0.296226 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_F18_to_Na22(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // F18 + He4 --> Na22 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // rpsmr + ln_set_rate = 35.3786 + -1.82957 * tfactors.T9i + 18.8956 * tfactors.T913i + -65.6134 * tfactors.T913 + + 1.71114 * tfactors.T9 + -0.0260999 * tfactors.T953 + 37.8396 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.82957 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 18.8956 * tfactors.T943i + (1.0/3.0) * -65.6134 * tfactors.T923i + + 1.71114 + (5.0/3.0) * -0.0260999 * tfactors.T923 + 37.8396 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_F19_to_Ne20(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // F19 + p --> Ne20 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // nacrr + ln_set_rate = -5.63093 + -7.74414 * tfactors.T9i + 31.6442 * tfactors.T913i + -58.6563 * tfactors.T913 + + 67.7365 * tfactors.T9 + -22.9721 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 7.74414 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 31.6442 * tfactors.T943i + (1.0/3.0) * -58.6563 * tfactors.T923i + + 67.7365 + (5.0/3.0) * -22.9721 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacrr + ln_set_rate = 12.3816 + -1.71383 * tfactors.T9i + -11.3832 * tfactors.T913i + 5.47872 * tfactors.T913 + + -1.07203 * tfactors.T9 + 0.11196 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.71383 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -11.3832 * tfactors.T943i + (1.0/3.0) * 5.47872 * tfactors.T923i + + -1.07203 + (5.0/3.0) * 0.11196 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacrn + ln_set_rate = 18.2807 + -18.116 * tfactors.T913i + -1.4622 * tfactors.T913 + + 6.95113 * tfactors.T9 + -2.90366 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -18.116 * tfactors.T943i + (1.0/3.0) * -1.4622 * tfactors.T923i + + 6.95113 + (5.0/3.0) * -2.90366 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_F19_to_Na23(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // F19 + He4 --> Na23 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // rpsmr + ln_set_rate = 52.7856 + -2.11408 * tfactors.T9i + 39.7219 * tfactors.T913i + -100.401 * tfactors.T913 + + 3.15808 * tfactors.T9 + -0.0629822 * tfactors.T953 + 54.4823 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 2.11408 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 39.7219 * tfactors.T943i + (1.0/3.0) * -100.401 * tfactors.T923i + + 3.15808 + (5.0/3.0) * -0.0629822 * tfactors.T923 + 54.4823 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Ne18_to_Mg22(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ne18 + He4 --> Mg22 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 32.8865 + -46.4859 * tfactors.T913i + 0.956741 * tfactors.T913 + + -0.914402 * tfactors.T9 + 0.0722478 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -46.4859 * tfactors.T943i + (1.0/3.0) * 0.956741 * tfactors.T923i + + -0.914402 + (5.0/3.0) * 0.0722478 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Ne20_to_Mg24(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ne20 + He4 --> Mg24 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = -38.7055 + -2.50605 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 2.50605 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 24.5058 + -46.2525 * tfactors.T913i + 5.58901 * tfactors.T913 + + 7.61843 * tfactors.T9 + -3.683 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -46.2525 * tfactors.T943i + (1.0/3.0) * 5.58901 * tfactors.T923i + + 7.61843 + (5.0/3.0) * -3.683 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -8.79827 + -12.7809 * tfactors.T9i + 16.9229 * tfactors.T913 + + -2.57325 * tfactors.T9 + 0.208997 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 12.7809 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 16.9229 * tfactors.T923i + + -2.57325 + (5.0/3.0) * 0.208997 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 1.98307 + -9.22026 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 9.22026 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Ne21_to_Na22(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ne21 + p --> Na22 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = -47.6554 + -0.19618 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.19618 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 19.0696 + -19.2096 * tfactors.T913i + + -1.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -19.2096 * tfactors.T943i + + (5.0/3.0) * -1.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -39.4862 + -4.21385 * tfactors.T9i + 21.1176 * tfactors.T913i + 34.0411 * tfactors.T913 + + -4.45593 * tfactors.T9 + 0.328613 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 4.21385 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 21.1176 * tfactors.T943i + (1.0/3.0) * 34.0411 * tfactors.T923i + + -4.45593 + (5.0/3.0) * 0.328613 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 1.75704 + -1.39957 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.39957 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Na23_to_Mg24(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Na23 + p --> Mg24 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10n + ln_set_rate = 18.9075 + -20.6428 * tfactors.T913i + 1.52954 * tfactors.T913 + + 2.7487 * tfactors.T9 + -1.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -20.6428 * tfactors.T943i + (1.0/3.0) * 1.52954 * tfactors.T923i + + 2.7487 + (5.0/3.0) * -1.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 9.0594 + -3.28029 * tfactors.T9i + -0.360588 * tfactors.T913 + + 1.4187 * tfactors.T9 + -0.184061 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 3.28029 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * -0.360588 * tfactors.T923i + + 1.4187 + (5.0/3.0) * -0.184061 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -5.02585 + -1.61219 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.61219 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Mg24_to_Si28(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Mg24 + He4 --> Si28 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // st08r + ln_set_rate = -50.5494 + -12.8332 * tfactors.T9i + 21.3721 * tfactors.T913i + 37.7649 * tfactors.T913 + + -4.10635 * tfactors.T9 + 0.249618 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 12.8332 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 21.3721 * tfactors.T943i + (1.0/3.0) * 37.7649 * tfactors.T923i + + -4.10635 + (5.0/3.0) * 0.249618 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // st08r + ln_set_rate = 8.03977 + -15.629 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 15.629 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Al27_to_Si28(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Al27 + p --> Si28 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = -13.6664 + -1.90396 * tfactors.T9i + 23.8634 * tfactors.T913 + + -3.70135 * tfactors.T9 + 0.28964 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.90396 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 23.8634 * tfactors.T923i + + -3.70135 + (5.0/3.0) * 0.28964 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 86.0234 + -0.387313 * tfactors.T9i + -26.8327 * tfactors.T913i + -116.137 * tfactors.T913 + + 0.00950567 * tfactors.T9 + 0.00999755 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.387313 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -26.8327 * tfactors.T943i + (1.0/3.0) * -116.137 * tfactors.T923i + + 0.00950567 + (5.0/3.0) * 0.00999755 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 21.1065 + -23.2205 * tfactors.T913i + + -2.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -23.2205 * tfactors.T943i + + (5.0/3.0) * -2.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Si28_to_S32(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Si28 + He4 --> S32 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 47.9212 + -59.4896 * tfactors.T913i + 4.47205 * tfactors.T913 + + -4.78989 * tfactors.T9 + 0.557201 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -59.4896 * tfactors.T943i + (1.0/3.0) * 4.47205 * tfactors.T923i + + -4.78989 + (5.0/3.0) * 0.557201 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_P31_to_S32(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // P31 + p --> S32 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = 0.821556 + -3.77704 * tfactors.T9i + 8.09341 * tfactors.T913 + + -0.615971 * tfactors.T9 + 0.031159 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 3.77704 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 8.09341 * tfactors.T923i + + -0.615971 + (5.0/3.0) * 0.031159 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -2.66839 + -2.25958 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 2.25958 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 19.2596 + -25.3278 * tfactors.T913i + 6.4931 * tfactors.T913 + + -9.27513 * tfactors.T9 + -0.610439 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -25.3278 * tfactors.T943i + (1.0/3.0) * 6.4931 * tfactors.T923i + + -9.27513 + (5.0/3.0) * -0.610439 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_C12_to_p_N15(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // C12 + He4 --> p + N15 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // nacrn + ln_set_rate = 27.118 + -57.6279 * tfactors.T9i + -15.253 * tfactors.T913i + 1.59318 * tfactors.T913 + + 2.4479 * tfactors.T9 + -2.19708 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 57.6279 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -15.253 * tfactors.T943i + (1.0/3.0) * 1.59318 * tfactors.T923i + + 2.4479 + (5.0/3.0) * -2.19708 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacrr + ln_set_rate = -6.93365 + -58.7917 * tfactors.T9i + 22.7105 * tfactors.T913 + + -2.90707 * tfactors.T9 + 0.205754 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 58.7917 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 22.7105 * tfactors.T923i + + -2.90707 + (5.0/3.0) * 0.205754 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacrr + ln_set_rate = 20.5388 + -65.034 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 65.034 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacrr + ln_set_rate = -5.2319 + -59.6491 * tfactors.T9i + 30.8497 * tfactors.T913 + + -8.50433 * tfactors.T9 + -1.54426 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 59.6491 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 30.8497 * tfactors.T923i + + -8.50433 + (5.0/3.0) * -1.54426 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_C12_C12_to_p_Na23(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // C12 + C12 --> p + Na23 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // cf88r + ln_set_rate = 60.9649 + -84.165 * tfactors.T913i + -1.4191 * tfactors.T913 + + -0.114619 * tfactors.T9 + -0.070307 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -84.165 * tfactors.T943i + (1.0/3.0) * -1.4191 * tfactors.T923i + + -0.114619 + (5.0/3.0) * -0.070307 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_C12_C12_to_He4_Ne20(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // C12 + C12 --> He4 + Ne20 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // cf88r + ln_set_rate = 61.2863 + -84.165 * tfactors.T913i + -1.56627 * tfactors.T913 + + -0.0736084 * tfactors.T9 + -0.072797 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -84.165 * tfactors.T943i + (1.0/3.0) * -1.56627 * tfactors.T923i + + -0.0736084 + (5.0/3.0) * -0.072797 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_N13_to_p_O16(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // N13 + He4 --> p + O16 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // cf88n + ln_set_rate = 40.4644 + -35.829 * tfactors.T913i + -0.530275 * tfactors.T913 + + -0.982462 * tfactors.T9 + 0.0808059 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -35.829 * tfactors.T943i + (1.0/3.0) * -0.530275 * tfactors.T923i + + -0.982462 + (5.0/3.0) * 0.0808059 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_N14_to_p_O17(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // N14 + He4 --> p + O17 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = -7.60954 + -14.5839 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 14.5839 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 19.1771 + -13.8305 * tfactors.T9i + -16.9078 * tfactors.T913i + + -2.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 13.8305 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -16.9078 * tfactors.T943i + + (5.0/3.0) * -2.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 9.77209 + -18.7891 * tfactors.T9i + 5.10182 * tfactors.T913 + + 0.379373 * tfactors.T9 + -0.0672515 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 18.7891 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 5.10182 * tfactors.T923i + + 0.379373 + (5.0/3.0) * -0.0672515 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 5.13169 + -15.9452 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 15.9452 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_N15_to_He4_C12(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // N15 + p --> He4 + C12 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // nacrn + ln_set_rate = 27.4764 + -15.253 * tfactors.T913i + 1.59318 * tfactors.T913 + + 2.4479 * tfactors.T9 + -2.19708 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -15.253 * tfactors.T943i + (1.0/3.0) * 1.59318 * tfactors.T923i + + 2.4479 + (5.0/3.0) * -2.19708 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacrr + ln_set_rate = -6.57522 + -1.1638 * tfactors.T9i + 22.7105 * tfactors.T913 + + -2.90707 * tfactors.T9 + 0.205754 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.1638 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 22.7105 * tfactors.T923i + + -2.90707 + (5.0/3.0) * 0.205754 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacrr + ln_set_rate = 20.8972 + -7.406 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 7.406 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacrr + ln_set_rate = -4.87347 + -2.02117 * tfactors.T9i + 30.8497 * tfactors.T913 + + -8.50433 * tfactors.T9 + -1.54426 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 2.02117 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 30.8497 * tfactors.T923i + + -8.50433 + (5.0/3.0) * -1.54426 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_N15_to_p_O18(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // N15 + He4 --> p + O18 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = -29.7104 + -46.4444 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 46.4444 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 25.1611 + -46.1986 * tfactors.T9i + -16.6979 * tfactors.T913i + + -3.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 46.1986 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -16.6979 * tfactors.T943i + + (5.0/3.0) * -3.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 7.13756 + -51.5219 * tfactors.T9i + 11.6568 * tfactors.T913 + + -2.16303 * tfactors.T9 + 0.209965 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 51.5219 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 11.6568 * tfactors.T923i + + -2.16303 + (5.0/3.0) * 0.209965 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 8.46654 + -47.8616 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 47.8616 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_O14_to_p_F17(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O14 + He4 --> p + F17 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // Ha96n + ln_set_rate = 40.8358 + -39.388 * tfactors.T913i + -17.4673 * tfactors.T913 + + 35.3029 * tfactors.T9 + -24.8162 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -39.388 * tfactors.T943i + (1.0/3.0) * -17.4673 * tfactors.T923i + + 35.3029 + (5.0/3.0) * -24.8162 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // Ha96r + ln_set_rate = 16.3087 + -22.51 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 22.51 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // Ha96r + ln_set_rate = 11.1184 + -13.6 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 13.6 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // Ha96r + ln_set_rate = -106.091 + -0.453036 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.453036 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // Ha96r + ln_set_rate = 12.1289 + -12.0223 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 12.0223 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // Ha96r + ln_set_rate = 18.6518 + -26.0 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 26.0 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_O15_to_p_F18(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O15 + He4 --> p + F18 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = 1.04969 + -36.4627 * tfactors.T9i + 13.3223 * tfactors.T913 + + -1.36696 * tfactors.T9 + 0.0757363 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 36.4627 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 13.3223 * tfactors.T923i + + -1.36696 + (5.0/3.0) * 0.0757363 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -32.4461 + -33.8223 * tfactors.T9i + 61.738 * tfactors.T913 + + -108.29 * tfactors.T9 + -34.2365 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 33.8223 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 61.738 * tfactors.T923i + + -108.29 + (5.0/3.0) * -34.2365 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 61.2985 + -33.4459 * tfactors.T9i + -21.4023 * tfactors.T913i + -80.8891 * tfactors.T913 + + 134.6 * tfactors.T9 + -126.504 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 33.4459 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -21.4023 * tfactors.T943i + (1.0/3.0) * -80.8891 * tfactors.T923i + + 134.6 + (5.0/3.0) * -126.504 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_O16_to_He4_N13(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O16 + p --> He4 + N13 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // cf88n + ln_set_rate = 42.2324 + -60.5523 * tfactors.T9i + -35.829 * tfactors.T913i + -0.530275 * tfactors.T913 + + -0.982462 * tfactors.T9 + 0.0808059 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 60.5523 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -35.829 * tfactors.T943i + (1.0/3.0) * -0.530275 * tfactors.T923i + + -0.982462 + (5.0/3.0) * 0.0808059 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_O16_to_p_F19(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O16 + He4 --> p + F19 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // nacr + ln_set_rate = -53.1397 + -94.2866 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 94.2866 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacr + ln_set_rate = 25.8562 + -94.1589 * tfactors.T9i + -18.116 * tfactors.T913i + + 1.86674 * tfactors.T9 + -7.5666 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 94.1589 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -18.116 * tfactors.T943i + + 1.86674 + (5.0/3.0) * -7.5666 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacrr + ln_set_rate = 13.9232 + -97.4449 * tfactors.T9i + + -0.21103 * tfactors.T9 + 2.87702 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 97.4449 * tfactors.T9i * tfactors.T9i + + -0.21103 + 2.87702 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacr + ln_set_rate = 14.7601 + -97.9108 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 97.9108 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacr + ln_set_rate = 7.80363 + -96.6272 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 96.6272 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_C12_O16_to_p_Al27(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O16 + C12 --> p + Al27 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // cf88r + ln_set_rate = 68.5253 + 0.205134 * tfactors.T9i + -119.242 * tfactors.T913i + 13.3667 * tfactors.T913 + + 0.295425 * tfactors.T9 + -0.267288 * tfactors.T953 + -9.91729 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = -0.205134 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -119.242 * tfactors.T943i + (1.0/3.0) * 13.3667 * tfactors.T923i + + 0.295425 + (5.0/3.0) * -0.267288 * tfactors.T923 + -9.91729 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_C12_O16_to_He4_Mg24(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O16 + C12 --> He4 + Mg24 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // cf88r + ln_set_rate = 48.5341 + 0.37204 * tfactors.T9i + -133.413 * tfactors.T913i + 50.1572 * tfactors.T913 + + -3.15987 * tfactors.T9 + 0.0178251 * tfactors.T953 + -23.7027 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = -0.37204 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -133.413 * tfactors.T943i + (1.0/3.0) * 50.1572 * tfactors.T923i + + -3.15987 + (5.0/3.0) * 0.0178251 * tfactors.T923 + -23.7027 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_O16_O16_to_p_P31(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O16 + O16 --> p + P31 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // cf88r + ln_set_rate = 85.2628 + 0.223453 * tfactors.T9i + -145.844 * tfactors.T913i + 8.72612 * tfactors.T913 + + -0.554035 * tfactors.T9 + -0.137562 * tfactors.T953 + -6.88807 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = -0.223453 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -145.844 * tfactors.T943i + (1.0/3.0) * 8.72612 * tfactors.T923i + + -0.554035 + (5.0/3.0) * -0.137562 * tfactors.T923 + -6.88807 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_O16_O16_to_He4_Si28(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O16 + O16 --> He4 + Si28 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // cf88r + ln_set_rate = 97.2435 + -0.268514 * tfactors.T9i + -119.324 * tfactors.T913i + -32.2497 * tfactors.T913 + + 1.46214 * tfactors.T9 + -0.200893 * tfactors.T953 + 13.2148 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.268514 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -119.324 * tfactors.T943i + (1.0/3.0) * -32.2497 * tfactors.T923i + + 1.46214 + (5.0/3.0) * -0.200893 * tfactors.T923 + 13.2148 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_O17_to_He4_N14(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O17 + p --> He4 + N14 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = 5.5336 + -2.11477 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 2.11477 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -7.20763 + -0.753395 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.753395 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 19.579 + -16.9078 * tfactors.T913i + + -2.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -16.9078 * tfactors.T943i + + (5.0/3.0) * -2.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 10.174 + -4.95865 * tfactors.T9i + 5.10182 * tfactors.T913 + + 0.379373 * tfactors.T9 + -0.0672515 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 4.95865 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 5.10182 * tfactors.T923i + + 0.379373 + (5.0/3.0) * -0.0672515 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_O18_to_He4_N15(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O18 + p --> He4 + N15 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = 10.2725 + -1.663 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.663 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -27.9044 + -0.245884 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.245884 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 26.9671 + -16.6979 * tfactors.T913i + + -3.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -16.6979 * tfactors.T943i + + (5.0/3.0) * -3.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 8.94352 + -5.32335 * tfactors.T9i + 11.6568 * tfactors.T913 + + -2.16303 * tfactors.T9 + 0.209965 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 5.32335 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 11.6568 * tfactors.T923i + + -2.16303 + (5.0/3.0) * 0.209965 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_F17_to_He4_O14(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // F17 + p --> He4 + O14 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // Ha96r + ln_set_rate = 15.612 + -36.3426 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 36.3426 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // Ha96r + ln_set_rate = 10.4217 + -27.4326 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 27.4326 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // Ha96r + ln_set_rate = -106.788 + -14.2856 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 14.2856 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // Ha96r + ln_set_rate = 11.4322 + -25.8549 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 25.8549 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // Ha96r + ln_set_rate = 17.9551 + -39.8326 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 39.8326 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // Ha96n + ln_set_rate = 40.1391 + -13.8326 * tfactors.T9i + -39.388 * tfactors.T913i + -17.4673 * tfactors.T913 + + 35.3029 * tfactors.T9 + -24.8162 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 13.8326 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -39.388 * tfactors.T943i + (1.0/3.0) * -17.4673 * tfactors.T923i + + 35.3029 + (5.0/3.0) * -24.8162 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_F17_to_p_Ne20(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // F17 + He4 --> p + Ne20 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // nacr + ln_set_rate = 38.6287 + -43.18 * tfactors.T913i + 4.46827 * tfactors.T913 + + -1.63915 * tfactors.T9 + 0.123483 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -43.18 * tfactors.T943i + (1.0/3.0) * 4.46827 * tfactors.T923i + + -1.63915 + (5.0/3.0) * 0.123483 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_F18_to_He4_O15(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // F18 + p --> He4 + O15 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10n + ln_set_rate = 62.0058 + -21.4023 * tfactors.T913i + -80.8891 * tfactors.T913 + + 134.6 * tfactors.T9 + -126.504 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -21.4023 * tfactors.T943i + (1.0/3.0) * -80.8891 * tfactors.T923i + + 134.6 + (5.0/3.0) * -126.504 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 1.75704 + -3.01675 * tfactors.T9i + 13.3223 * tfactors.T913 + + -1.36696 * tfactors.T9 + 0.0757363 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 3.01675 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 13.3223 * tfactors.T923i + + -1.36696 + (5.0/3.0) * 0.0757363 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -31.7388 + -0.376432 * tfactors.T9i + 61.738 * tfactors.T913 + + -108.29 * tfactors.T9 + -34.2365 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.376432 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 61.738 * tfactors.T923i + + -108.29 + (5.0/3.0) * -34.2365 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_F18_to_p_Ne21(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // F18 + He4 --> p + Ne21 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // rpsmr + ln_set_rate = 49.7863 + -1.84559 * tfactors.T9i + 21.4461 * tfactors.T913i + -73.252 * tfactors.T913 + + 2.42329 * tfactors.T9 + -0.077278 * tfactors.T953 + 40.7604 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.84559 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 21.4461 * tfactors.T943i + (1.0/3.0) * -73.252 * tfactors.T923i + + 2.42329 + (5.0/3.0) * -0.077278 * tfactors.T923 + 40.7604 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_F19_to_He4_O16(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // F19 + p --> He4 + O16 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // nacr + ln_set_rate = 8.239 + -2.46828 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 2.46828 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacr + ln_set_rate = -52.7043 + -0.12765 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.12765 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacr + ln_set_rate = 26.2916 + -18.116 * tfactors.T913i + + 1.86674 * tfactors.T9 + -7.5666 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -18.116 * tfactors.T943i + + 1.86674 + (5.0/3.0) * -7.5666 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacrr + ln_set_rate = 14.3586 + -3.286 * tfactors.T9i + + -0.21103 * tfactors.T9 + 2.87702 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 3.286 * tfactors.T9i * tfactors.T9i + + -0.21103 + 2.87702 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nacr + ln_set_rate = 15.1955 + -3.75185 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 3.75185 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Ne19_to_p_Na22(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ne19 + He4 --> p + Na22 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 43.1874 + -46.6346 * tfactors.T913i + 0.866532 * tfactors.T913 + + -0.893541 * tfactors.T9 + 0.0747971 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -46.6346 * tfactors.T943i + (1.0/3.0) * 0.866532 * tfactors.T923i + + -0.893541 + (5.0/3.0) * 0.0747971 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Ne20_to_He4_F17(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ne20 + p --> He4 + F17 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // nacr + ln_set_rate = 41.563 + -47.9266 * tfactors.T9i + -43.18 * tfactors.T913i + 4.46827 * tfactors.T913 + + -1.63915 * tfactors.T9 + 0.123483 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 47.9266 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -43.18 * tfactors.T943i + (1.0/3.0) * 4.46827 * tfactors.T923i + + -1.63915 + (5.0/3.0) * 0.123483 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Ne20_to_p_Na23(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ne20 + He4 --> p + Na23 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = 0.227472 + -29.4348 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 29.4348 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 19.1852 + -27.5738 * tfactors.T9i + -20.0024 * tfactors.T913i + 11.5988 * tfactors.T913 + + -1.37398 * tfactors.T9 + -1.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 27.5738 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -20.0024 * tfactors.T943i + (1.0/3.0) * 11.5988 * tfactors.T923i + + -1.37398 + (5.0/3.0) * -1.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -6.37772 + -29.8896 * tfactors.T9i + 19.7297 * tfactors.T913 + + -2.20987 * tfactors.T9 + 0.153374 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 29.8896 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 19.7297 * tfactors.T923i + + -2.20987 + (5.0/3.0) * 0.153374 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Ne21_to_He4_F18(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ne21 + p --> He4 + F18 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // rpsmr + ln_set_rate = 50.6536 + -22.049 * tfactors.T9i + 21.4461 * tfactors.T913i + -73.252 * tfactors.T913 + + 2.42329 * tfactors.T9 + -0.077278 * tfactors.T953 + 40.7604 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 22.049 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 21.4461 * tfactors.T943i + (1.0/3.0) * -73.252 * tfactors.T923i + + 2.42329 + (5.0/3.0) * -0.077278 * tfactors.T923 + 40.7604 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Na22_to_He4_Ne19(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Na22 + p --> He4 + Ne19 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 43.101 + -24.0192 * tfactors.T9i + -46.6346 * tfactors.T913i + 0.866532 * tfactors.T913 + + -0.893541 * tfactors.T9 + 0.0747971 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 24.0192 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -46.6346 * tfactors.T943i + (1.0/3.0) * 0.866532 * tfactors.T923i + + -0.893541 + (5.0/3.0) * 0.0747971 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Na23_to_He4_Ne20(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Na23 + p --> He4 + Ne20 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = -6.58736 + -2.31577 * tfactors.T9i + 19.7297 * tfactors.T913 + + -2.20987 * tfactors.T9 + 0.153374 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 2.31577 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 19.7297 * tfactors.T923i + + -2.20987 + (5.0/3.0) * 0.153374 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 0.0178295 + -1.86103 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.86103 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 18.9756 + -20.0024 * tfactors.T913i + 11.5988 * tfactors.T913 + + -1.37398 * tfactors.T9 + -1.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -20.0024 * tfactors.T943i + (1.0/3.0) * 11.5988 * tfactors.T923i + + -1.37398 + (5.0/3.0) * -1.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Mg24_to_p_Al27(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Mg24 + He4 --> p + Al27 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10n + ln_set_rate = 30.0397 + -18.5791 * tfactors.T9i + -26.4162 * tfactors.T913i + + -2.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 18.5791 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -26.4162 * tfactors.T943i + + (5.0/3.0) * -2.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -26.2862 + -19.5422 * tfactors.T9i + 5.18642 * tfactors.T913i + -34.7936 * tfactors.T913 + + 168.225 * tfactors.T9 + -115.825 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 19.5422 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 5.18642 * tfactors.T943i + (1.0/3.0) * -34.7936 * tfactors.T923i + + 168.225 + (5.0/3.0) * -115.825 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -6.44575 + -22.8216 * tfactors.T9i + 18.0416 * tfactors.T913 + + -1.54137 * tfactors.T9 + 0.0847506 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 22.8216 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 18.0416 * tfactors.T923i + + -1.54137 + (5.0/3.0) * 0.0847506 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Al27_to_He4_Mg24(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Al27 + p --> He4 + Mg24 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = -7.02789 + -4.2425 * tfactors.T9i + 18.0416 * tfactors.T913 + + -1.54137 * tfactors.T9 + 0.0847506 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 4.2425 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 18.0416 * tfactors.T923i + + -1.54137 + (5.0/3.0) * 0.0847506 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -26.8683 + -0.963012 * tfactors.T9i + 5.18642 * tfactors.T913i + -34.7936 * tfactors.T913 + + 168.225 * tfactors.T9 + -115.825 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.963012 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 5.18642 * tfactors.T943i + (1.0/3.0) * -34.7936 * tfactors.T923i + + 168.225 + (5.0/3.0) * -115.825 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 29.4576 + -26.4162 * tfactors.T913i + + -2.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -26.4162 * tfactors.T943i + + (5.0/3.0) * -2.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Si28_to_p_P31(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Si28 + He4 --> p + P31 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = -11.4335 + -25.6606 * tfactors.T9i + 21.521 * tfactors.T913 + + -1.90355 * tfactors.T9 + 0.092724 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 25.6606 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 21.521 * tfactors.T923i + + -1.90355 + (5.0/3.0) * 0.092724 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 60.3424 + -22.2348 * tfactors.T9i + -31.932 * tfactors.T913i + -77.0334 * tfactors.T913 + + -43.6847 * tfactors.T9 + -4.28955 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 22.2348 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -31.932 * tfactors.T943i + (1.0/3.0) * -77.0334 * tfactors.T923i + + -43.6847 + (5.0/3.0) * -4.28955 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -13.4595 + -24.112 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 24.112 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_P31_to_He4_Si28(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // P31 + p --> He4 + Si28 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = -10.893 + -3.42575 * tfactors.T9i + 21.521 * tfactors.T913 + + -1.90355 * tfactors.T9 + 0.092724 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 3.42575 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 21.521 * tfactors.T923i + + -1.90355 + (5.0/3.0) * 0.092724 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -12.919 + -1.87716 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.87716 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 60.8829 + -31.932 * tfactors.T913i + -77.0334 * tfactors.T913 + + -43.6847 * tfactors.T9 + -4.28955 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -31.932 * tfactors.T943i + (1.0/3.0) * -77.0334 * tfactors.T923i + + -43.6847 + (5.0/3.0) * -4.28955 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_He4_He4_to_C12(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // He4 + He4 + He4 --> C12 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // fy05r + ln_set_rate = -24.3505 + -4.12656 * tfactors.T9i + -13.49 * tfactors.T913i + 21.4259 * tfactors.T913 + + -1.34769 * tfactors.T9 + 0.0879816 * tfactors.T953 + -13.1653 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 4.12656 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -13.49 * tfactors.T943i + (1.0/3.0) * 21.4259 * tfactors.T923i + + -1.34769 + (5.0/3.0) * 0.0879816 * tfactors.T923 + -13.1653 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // fy05r + ln_set_rate = -11.7884 + -1.02446 * tfactors.T9i + -23.57 * tfactors.T913i + 20.4886 * tfactors.T913 + + -12.9882 * tfactors.T9 + -20.0 * tfactors.T953 + -2.16667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.02446 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -23.57 * tfactors.T943i + (1.0/3.0) * 20.4886 * tfactors.T923i + + -12.9882 + (5.0/3.0) * -20.0 * tfactors.T923 + -2.16667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // fy05n + ln_set_rate = -0.971052 + -37.06 * tfactors.T913i + 29.3493 * tfactors.T913 + + -115.507 * tfactors.T9 + -10.0 * tfactors.T953 + -1.33333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -37.06 * tfactors.T943i + (1.0/3.0) * 29.3493 * tfactors.T923i + + -115.507 + (5.0/3.0) * -10.0 * tfactors.T923 + -1.33333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_C12_C12_to_Mg24_modified(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // C12 + C12 --> Mg24 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // cf88r + ln_set_rate = -12.8056 + -30.1498 * tfactors.T9i + 11.4826 * tfactors.T913 + + 1.82849 * tfactors.T9 + -0.34844 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 30.1498 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 11.4826 * tfactors.T923i + + 1.82849 + (5.0/3.0) * -0.34844 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_O16_O16_to_S32_modified(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O16 + O16 --> S32 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // cf88r + ln_set_rate = 77.5491 + -0.373641 * tfactors.T9i + -120.83 * tfactors.T913i + -7.72334 * tfactors.T913 + + -2.27939 * tfactors.T9 + 0.167655 * tfactors.T953 + 7.62001 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.373641 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -120.83 * tfactors.T943i + (1.0/3.0) * -7.72334 * tfactors.T923i + + -2.27939 + (5.0/3.0) * 0.167655 * tfactors.T923 + 7.62001 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_C12_O16_to_Si28_modified(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // O16 + C12 --> Si28 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // cf88r + ln_set_rate = -132.213 + -1.46479 * tfactors.T9i + -293.089 * tfactors.T913i + 414.404 * tfactors.T913 + + -28.0562 * tfactors.T9 + 1.61807 * tfactors.T953 + -178.28 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.46479 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -293.089 * tfactors.T943i + (1.0/3.0) * 414.404 * tfactors.T923i + + -28.0562 + (5.0/3.0) * 1.61807 * tfactors.T923 + -178.28 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_S32_to_Ar36_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // S32 + He4 --> Ar36 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 48.901 + -65.3709 * tfactors.T913i + 5.68294 * tfactors.T913 + + -5.00388 * tfactors.T9 + 0.571407 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -65.3709 * tfactors.T943i + (1.0/3.0) * 5.68294 * tfactors.T923i + + -5.00388 + (5.0/3.0) * 0.571407 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_S32_to_p_Cl35_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // S32 + He4 --> p + Cl35 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = 2.42563 + -27.6662 * tfactors.T9i + 5.33756 * tfactors.T913 + + 1.64418 * tfactors.T9 + -0.246167 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 27.6662 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 5.33756 * tfactors.T923i + + 1.64418 + (5.0/3.0) * -0.246167 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -0.877602 + -25.5914 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 25.5914 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -57.395 + -22.1894 * tfactors.T9i + 25.5338 * tfactors.T913 + + 6.45824 * tfactors.T9 + -0.950294 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 22.1894 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 25.5338 * tfactors.T923i + + 6.45824 + (5.0/3.0) * -0.950294 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 32.2544 + -21.6564 * tfactors.T9i + -30.9147 * tfactors.T913i + -1.2345 * tfactors.T913 + + 22.5118 * tfactors.T9 + -33.0589 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 21.6564 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -30.9147 * tfactors.T943i + (1.0/3.0) * -1.2345 * tfactors.T923i + + 22.5118 + (5.0/3.0) * -33.0589 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Cl35_to_Ar36_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Cl35 + p --> Ar36 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = -9.03294 + -2.00996 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 2.00996 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -42.5249 + -0.564651 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.564651 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 35.6868 + -27.8971 * tfactors.T913i + -16.2304 * tfactors.T913 + + 35.255 * tfactors.T9 + -25.8411 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -27.8971 * tfactors.T943i + (1.0/3.0) * -16.2304 * tfactors.T923i + + 35.255 + (5.0/3.0) * -25.8411 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -7.84699 + -3.65092 * tfactors.T9i + 18.0179 * tfactors.T913 + + -2.86304 * tfactors.T9 + 0.250854 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 3.65092 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 18.0179 * tfactors.T923i + + -2.86304 + (5.0/3.0) * 0.250854 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ar36_to_He4_S32_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ar36 --> He4 + S32 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 73.8164 + -77.0627 * tfactors.T9i + -65.3709 * tfactors.T913i + 5.68294 * tfactors.T913 + + -5.00388 * tfactors.T9 + 0.571407 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 77.0627 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -65.3709 * tfactors.T943i + (1.0/3.0) * 5.68294 * tfactors.T923i + + -5.00388 + (5.0/3.0) * 0.571407 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ar36_to_p_Cl35_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ar36 --> p + Cl35 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10n + ln_set_rate = 60.7366 + -98.7191 * tfactors.T9i + -27.8971 * tfactors.T913i + -16.2304 * tfactors.T913 + + 35.255 * tfactors.T9 + -25.8411 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 98.7191 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -27.8971 * tfactors.T943i + (1.0/3.0) * -16.2304 * tfactors.T923i + + 35.255 + (5.0/3.0) * -25.8411 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 17.2028 + -102.37 * tfactors.T9i + 18.0179 * tfactors.T913 + + -2.86304 * tfactors.T9 + 0.250854 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 102.37 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 18.0179 * tfactors.T923i + + -2.86304 + (5.0/3.0) * 0.250854 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 16.0169 + -100.729 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 100.729 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -17.4751 + -99.2838 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 99.2838 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Cl35_to_He4_S32_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Cl35 + p --> He4 + S32 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // il10r + ln_set_rate = 2.29121 + -6.00976 * tfactors.T9i + 5.33756 * tfactors.T913 + + 1.64418 * tfactors.T9 + -0.246167 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 6.00976 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 5.33756 * tfactors.T923i + + 1.64418 + (5.0/3.0) * -0.246167 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -1.01202 + -3.93495 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 3.93495 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -57.5294 + -0.532931 * tfactors.T9i + 25.5338 * tfactors.T913 + + 6.45824 * tfactors.T9 + -0.950294 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.532931 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 25.5338 * tfactors.T923i + + 6.45824 + (5.0/3.0) * -0.950294 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 32.12 + -30.9147 * tfactors.T913i + -1.2345 * tfactors.T913 + + 22.5118 * tfactors.T9 + -33.0589 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -30.9147 * tfactors.T943i + (1.0/3.0) * -1.2345 * tfactors.T923i + + 22.5118 + (5.0/3.0) * -33.0589 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Ar36_to_Ca40_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ar36 + He4 --> Ca40 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 52.3486 + -71.0046 * tfactors.T913i + 4.0656 * tfactors.T913 + + -5.26509 * tfactors.T9 + 0.683546 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -71.0046 * tfactors.T943i + (1.0/3.0) * 4.0656 * tfactors.T923i + + -5.26509 + (5.0/3.0) * 0.683546 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Ar36_to_p_K39_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ar36 + He4 --> p + K39 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 20.6367 + -14.9533 * tfactors.T9i + -30.0732 * tfactors.T913i + 7.03263 * tfactors.T913 + + -1.10085 * tfactors.T9 + 0.133768 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 14.9533 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -30.0732 * tfactors.T943i + (1.0/3.0) * 7.03263 * tfactors.T923i + + -1.10085 + (5.0/3.0) * 0.133768 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_K39_to_Ca40_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // K39 + p --> Ca40 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // lo18r + ln_set_rate = 2761.38 + -5.22234 * tfactors.T9i + 802.18 * tfactors.T913i + -4010.27 * tfactors.T913 + + 1136.19 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 5.22234 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 802.18 * tfactors.T943i + (1.0/3.0) * -4010.27 * tfactors.T923i + + 1136.19 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // lo18r + ln_set_rate = 588.099 + -12.5647 * tfactors.T9i + 641.844 * tfactors.T913i + -1248.49 * tfactors.T913 + + 564.926 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 12.5647 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 641.844 * tfactors.T943i + (1.0/3.0) * -1248.49 * tfactors.T923i + + 564.926 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // lo18r + ln_set_rate = 102.252 + -1.66508 * tfactors.T9i + 41.1723 * tfactors.T913i + -149.299 * tfactors.T913 + + 10.5229 * tfactors.T9 + -0.68208 * tfactors.T953 + 59.2367 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.66508 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 41.1723 * tfactors.T943i + (1.0/3.0) * -149.299 * tfactors.T923i + + 10.5229 + (5.0/3.0) * -0.68208 * tfactors.T923 + 59.2367 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ca40_to_He4_Ar36_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ca40 --> He4 + Ar36 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 77.2826 + -81.6916 * tfactors.T9i + -71.0046 * tfactors.T913i + 4.0656 * tfactors.T913 + + -5.26509 * tfactors.T9 + 0.683546 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 81.6916 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -71.0046 * tfactors.T943i + (1.0/3.0) * 4.0656 * tfactors.T923i + + -5.26509 + (5.0/3.0) * 0.683546 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ca40_to_p_K39_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ca40 --> p + K39 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // lo18r + ln_set_rate = 613.153 + -109.213 * tfactors.T9i + 641.844 * tfactors.T913i + -1248.49 * tfactors.T913 + + 566.426 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 109.213 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 641.844 * tfactors.T943i + (1.0/3.0) * -1248.49 * tfactors.T923i + + 566.426 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // lo18r + ln_set_rate = 127.306 + -98.3134 * tfactors.T9i + 41.1723 * tfactors.T913i + -149.299 * tfactors.T913 + + 10.5229 * tfactors.T9 + -0.68208 * tfactors.T953 + 60.7367 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 98.3134 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 41.1723 * tfactors.T943i + (1.0/3.0) * -149.299 * tfactors.T923i + + 10.5229 + (5.0/3.0) * -0.68208 * tfactors.T923 + 60.7367 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // lo18r + ln_set_rate = 2786.44 + -101.871 * tfactors.T9i + 802.18 * tfactors.T913i + -4010.27 * tfactors.T913 + + 1137.69 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 101.871 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 802.18 * tfactors.T943i + (1.0/3.0) * -4010.27 * tfactors.T923i + + 1137.69 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_K39_to_He4_Ar36_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // K39 + p --> He4 + Ar36 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 20.5166 + -30.0732 * tfactors.T913i + 7.03263 * tfactors.T913 + + -1.10085 * tfactors.T9 + 0.133768 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -30.0732 * tfactors.T943i + (1.0/3.0) * 7.03263 * tfactors.T923i + + -1.10085 + (5.0/3.0) * 0.133768 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Ca40_to_Ti44_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ca40 + He4 --> Ti44 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // chw0 + ln_set_rate = 53.75 + -76.4273 * tfactors.T913i + 3.87451 * tfactors.T913 + + -3.61477 * tfactors.T9 + 0.367451 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -76.4273 * tfactors.T943i + (1.0/3.0) * 3.87451 * tfactors.T923i + + -3.61477 + (5.0/3.0) * 0.367451 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Ca40_to_p_Sc43_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ca40 + He4 --> p + Sc43 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 35.6575 + -40.8757 * tfactors.T9i + -32.1734 * tfactors.T913i + 0.0296879 * tfactors.T913 + + -0.95232 * tfactors.T9 + 0.129022 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 40.8757 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -32.1734 * tfactors.T943i + (1.0/3.0) * 0.0296879 * tfactors.T923i + + -0.95232 + (5.0/3.0) * 0.129022 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Sc43_to_Ti44_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Sc43 + p --> Ti44 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 36.8432 + -32.1734 * tfactors.T913i + -1.77078 * tfactors.T913 + + -2.21706 * tfactors.T9 + 0.298499 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -32.1734 * tfactors.T943i + (1.0/3.0) * -1.77078 * tfactors.T923i + + -2.21706 + (5.0/3.0) * 0.298499 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ti44_to_He4_Ca40_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ti44 --> He4 + Ca40 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // chw0 + ln_set_rate = 78.6991 + -59.4974 * tfactors.T9i + -76.4273 * tfactors.T913i + 3.87451 * tfactors.T913 + + -3.61477 * tfactors.T9 + 0.367451 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 59.4974 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -76.4273 * tfactors.T943i + (1.0/3.0) * 3.87451 * tfactors.T923i + + -3.61477 + (5.0/3.0) * 0.367451 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ti44_to_p_Sc43_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ti44 --> p + Sc43 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 62.5939 + -100.373 * tfactors.T9i + -32.1734 * tfactors.T913i + -1.77078 * tfactors.T913 + + -2.21706 * tfactors.T9 + 0.298499 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 100.373 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -32.1734 * tfactors.T943i + (1.0/3.0) * -1.77078 * tfactors.T923i + + -2.21706 + (5.0/3.0) * 0.298499 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Sc43_to_He4_Ca40_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Sc43 + p --> He4 + Ca40 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 34.8559 + -32.1734 * tfactors.T913i + 0.0296879 * tfactors.T913 + + -0.95232 * tfactors.T9 + 0.129022 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -32.1734 * tfactors.T943i + (1.0/3.0) * 0.0296879 * tfactors.T923i + + -0.95232 + (5.0/3.0) * 0.129022 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Ti44_to_Cr48_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ti44 + He4 --> Cr48 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 64.7958 + -81.667 * tfactors.T913i + -10.6333 * tfactors.T913 + + -0.672613 * tfactors.T9 + 0.161209 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -81.667 * tfactors.T943i + (1.0/3.0) * -10.6333 * tfactors.T923i + + -0.672613 + (5.0/3.0) * 0.161209 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Ti44_to_p_V47_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ti44 + He4 --> p + V47 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // chw0r + ln_set_rate = -76.5154 + -10.7931 * tfactors.T9i + 70.2835 * tfactors.T913 + + -7.99061 * tfactors.T9 + 0.486213 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 10.7931 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 70.2835 * tfactors.T923i + + -7.99061 + (5.0/3.0) * 0.486213 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_V47_to_Cr48_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // V47 + p --> Cr48 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // nfisn + ln_set_rate = 42.6798 + -6.0593 * tfactors.T9i + -34.0548 * tfactors.T913i + -3.41973 * tfactors.T913 + + 1.16501 * tfactors.T9 + -0.105543 * tfactors.T953 + -7.70886 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 6.0593 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -34.0548 * tfactors.T943i + (1.0/3.0) * -3.41973 * tfactors.T923i + + 1.16501 + (5.0/3.0) * -0.105543 * tfactors.T923 + -7.70886 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nfisn + ln_set_rate = 511.463 + -5.29491 * tfactors.T9i + 317.171 * tfactors.T913i + -911.679 * tfactors.T913 + + 94.4245 * tfactors.T9 + -10.1973 * tfactors.T953 + 330.727 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 5.29491 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 317.171 * tfactors.T943i + (1.0/3.0) * -911.679 * tfactors.T923i + + 94.4245 + (5.0/3.0) * -10.1973 * tfactors.T923 + 330.727 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nfisn + ln_set_rate = 23.8315 + 0.246665 * tfactors.T9i + -45.9868 * tfactors.T913i + 13.6822 * tfactors.T913 + + -0.376902 * tfactors.T9 + -0.0194875 * tfactors.T953 + -8.42325 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = -0.246665 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -45.9868 * tfactors.T943i + (1.0/3.0) * 13.6822 * tfactors.T923i + + -0.376902 + (5.0/3.0) * -0.0194875 * tfactors.T923 + -8.42325 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nfisn + ln_set_rate = 40.5626 + -0.514414 * tfactors.T9i + -110.655 * tfactors.T913i + 83.0232 * tfactors.T913 + + -19.7762 * tfactors.T9 + 3.03961 * tfactors.T953 + -49.4742 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.514414 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -110.655 * tfactors.T943i + (1.0/3.0) * 83.0232 * tfactors.T923i + + -19.7762 + (5.0/3.0) * 3.03961 * tfactors.T923 + -49.4742 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Cr48_to_He4_Ti44_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Cr48 --> He4 + Ti44 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 89.7573 + -89.3041 * tfactors.T9i + -81.667 * tfactors.T913i + -10.6333 * tfactors.T913 + + -0.672613 * tfactors.T9 + 0.161209 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 89.3041 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -81.667 * tfactors.T943i + (1.0/3.0) * -10.6333 * tfactors.T923i + + -0.672613 + (5.0/3.0) * 0.161209 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Cr48_to_p_V47_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Cr48 --> p + V47 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // nfisn + ln_set_rate = 65.6231 + -94.5854 * tfactors.T9i + -110.655 * tfactors.T913i + 83.0232 * tfactors.T913 + + -19.7762 * tfactors.T9 + 3.03961 * tfactors.T953 + -47.9742 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 94.5854 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -110.655 * tfactors.T943i + (1.0/3.0) * 83.0232 * tfactors.T923i + + -19.7762 + (5.0/3.0) * 3.03961 * tfactors.T923 + -47.9742 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nfisn + ln_set_rate = 67.7403 + -100.13 * tfactors.T9i + -34.0548 * tfactors.T913i + -3.41973 * tfactors.T913 + + 1.16501 * tfactors.T9 + -0.105543 * tfactors.T953 + -6.20886 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 100.13 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -34.0548 * tfactors.T943i + (1.0/3.0) * -3.41973 * tfactors.T923i + + 1.16501 + (5.0/3.0) * -0.105543 * tfactors.T923 + -6.20886 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nfisn + ln_set_rate = 536.523 + -99.3659 * tfactors.T9i + 317.171 * tfactors.T913i + -911.679 * tfactors.T913 + + 94.4245 * tfactors.T9 + -10.1973 * tfactors.T953 + 332.227 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 99.3659 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 317.171 * tfactors.T943i + (1.0/3.0) * -911.679 * tfactors.T923i + + 94.4245 + (5.0/3.0) * -10.1973 * tfactors.T923 + 332.227 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nfisn + ln_set_rate = 48.892 + -93.8243 * tfactors.T9i + -45.9868 * tfactors.T913i + 13.6822 * tfactors.T913 + + -0.376902 * tfactors.T9 + -0.0194875 * tfactors.T953 + -6.92325 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 93.8243 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -45.9868 * tfactors.T943i + (1.0/3.0) * 13.6822 * tfactors.T923i + + -0.376902 + (5.0/3.0) * -0.0194875 * tfactors.T923 + -6.92325 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_V47_to_He4_Ti44_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // V47 + p --> He4 + Ti44 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // chw0r + ln_set_rate = -76.6143 + -6.02945 * tfactors.T9i + 70.2835 * tfactors.T913 + + -7.99061 * tfactors.T9 + 0.486213 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 6.02945 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 70.2835 * tfactors.T923i + + -7.99061 + (5.0/3.0) * 0.486213 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Cr48_to_Fe52_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Cr48 + He4 --> Fe52 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 65.1754 + -86.7459 * tfactors.T913i + -9.79373 * tfactors.T913 + + -0.772169 * tfactors.T9 + 0.155883 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -86.7459 * tfactors.T943i + (1.0/3.0) * -9.79373 * tfactors.T923i + + -0.772169 + (5.0/3.0) * 0.155883 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Cr48_to_p_Mn51_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Cr48 + He4 --> p + Mn51 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 59.2276 + -86.7459 * tfactors.T913i + 1.05653 * tfactors.T913 + + -1.15757 * tfactors.T9 + 0.0877546 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -86.7459 * tfactors.T943i + (1.0/3.0) * 1.05653 * tfactors.T923i + + -1.15757 + (5.0/3.0) * 0.0877546 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Mn51_to_Fe52_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Mn51 + p --> Fe52 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 36.2596 + -36.1825 * tfactors.T913i + 0.873042 * tfactors.T913 + + -2.89731 * tfactors.T9 + 0.364394 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -36.1825 * tfactors.T943i + (1.0/3.0) * 0.873042 * tfactors.T923i + + -2.89731 + (5.0/3.0) * 0.364394 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Fe52_to_He4_Cr48_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Fe52 --> He4 + Cr48 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 90.1474 + -92.109 * tfactors.T9i + -86.7459 * tfactors.T913i + -9.79373 * tfactors.T913 + + -0.772169 * tfactors.T9 + 0.155883 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 92.109 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -86.7459 * tfactors.T943i + (1.0/3.0) * -9.79373 * tfactors.T923i + + -0.772169 + (5.0/3.0) * 0.155883 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Fe52_to_p_Mn51_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Fe52 --> p + Mn51 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 61.728 + -85.6325 * tfactors.T9i + -36.1825 * tfactors.T913i + 0.873042 * tfactors.T913 + + -2.89731 * tfactors.T9 + 0.364394 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 85.6325 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -36.1825 * tfactors.T943i + (1.0/3.0) * 0.873042 * tfactors.T923i + + -2.89731 + (5.0/3.0) * 0.364394 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Mn51_to_He4_Cr48_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Mn51 + p --> He4 + Cr48 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 58.7312 + -6.47654 * tfactors.T9i + -86.7459 * tfactors.T913i + 1.05653 * tfactors.T913 + + -1.15757 * tfactors.T9 + 0.0877546 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 6.47654 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -86.7459 * tfactors.T943i + (1.0/3.0) * 1.05653 * tfactors.T923i + + -1.15757 + (5.0/3.0) * 0.0877546 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Fe52_to_Ni56_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Fe52 + He4 --> Ni56 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 66.6417 + -91.6819 * tfactors.T913i + -9.51885 * tfactors.T913 + + -0.533014 * tfactors.T9 + 0.0892607 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -91.6819 * tfactors.T943i + (1.0/3.0) * -9.51885 * tfactors.T923i + + -0.533014 + (5.0/3.0) * 0.0892607 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Fe52_to_p_Co55_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Fe52 + He4 --> p + Co55 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 62.2207 + -91.6819 * tfactors.T913i + -0.329235 * tfactors.T913 + + -0.780924 * tfactors.T9 + 0.0425179 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -91.6819 * tfactors.T943i + (1.0/3.0) * -0.329235 * tfactors.T923i + + -0.780924 + (5.0/3.0) * 0.0425179 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Co55_to_Ni56_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Co55 + p --> Ni56 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 37.3736 + -38.1053 * tfactors.T913i + -0.210947 * tfactors.T913 + + -2.68377 * tfactors.T9 + 0.355814 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -38.1053 * tfactors.T943i + (1.0/3.0) * -0.210947 * tfactors.T923i + + -2.68377 + (5.0/3.0) * 0.355814 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ni56_to_He4_Fe52_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ni56 --> He4 + Fe52 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 91.6226 + -92.801 * tfactors.T9i + -91.6819 * tfactors.T913i + -9.51885 * tfactors.T913 + + -0.533014 * tfactors.T9 + 0.0892607 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 92.801 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -91.6819 * tfactors.T943i + (1.0/3.0) * -9.51885 * tfactors.T923i + + -0.533014 + (5.0/3.0) * 0.0892607 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ni56_to_p_Co55_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Ni56 --> p + Co55 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 63.1318 + -83.1473 * tfactors.T9i + -38.1053 * tfactors.T913i + -0.210947 * tfactors.T913 + + -2.68377 * tfactors.T9 + 0.355814 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 83.1473 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -38.1053 * tfactors.T943i + (1.0/3.0) * -0.210947 * tfactors.T923i + + -2.68377 + (5.0/3.0) * 0.355814 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Co55_to_He4_Fe52_removed(const tf_t& tfactors, amrex::Real& rate, amrex::Real& drate_dT) { + + // Co55 + p --> He4 + Fe52 + + rate = 0.0; + drate_dT = 0.0; + + amrex::Real ln_set_rate{0.0}; + amrex::Real dln_set_rate_dT9{0.0}; + amrex::Real set_rate{0.0}; + + // ths8r + ln_set_rate = 61.4434 + -9.65363 * tfactors.T9i + -91.6819 * tfactors.T913i + -0.329235 * tfactors.T913 + + -0.780924 * tfactors.T9 + 0.0425179 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 9.65363 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -91.6819 * tfactors.T943i + (1.0/3.0) * -0.329235 * tfactors.T923i + + -0.780924 + (5.0/3.0) * 0.0425179 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_S32_He4_to_Ar36_approx(const T& rate_eval, amrex::Real& rate, amrex::Real& drate_dT) { + + amrex::Real r_ag = rate_eval.screened_rates(k_He4_S32_to_Ar36_removed); + amrex::Real r_ap = rate_eval.screened_rates(k_He4_S32_to_p_Cl35_removed); + amrex::Real r_pg = rate_eval.screened_rates(k_p_Cl35_to_Ar36_removed); + amrex::Real r_pa = rate_eval.screened_rates(k_p_Cl35_to_He4_S32_removed); + amrex::Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ag + r_ap * r_pg * dd; + if constexpr (std::is_same_v) { + amrex::Real drdT_ag = rate_eval.dscreened_rates_dT(k_He4_S32_to_Ar36_removed); + amrex::Real drdT_ap = rate_eval.dscreened_rates_dT(k_He4_S32_to_p_Cl35_removed); + amrex::Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_Cl35_to_Ar36_removed); + amrex::Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_Cl35_to_He4_S32_removed); + drate_dT = drdT_ag + drdT_ap * r_pg * dd + r_ap * drdT_pg * dd - r_ap * r_pg * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ar36_to_S32_He4_approx(const T& rate_eval, amrex::Real& rate, amrex::Real& drate_dT) { + + amrex::Real r_ga = rate_eval.screened_rates(k_Ar36_to_He4_S32_removed); + amrex::Real r_pa = rate_eval.screened_rates(k_p_Cl35_to_He4_S32_removed); + amrex::Real r_gp = rate_eval.screened_rates(k_Ar36_to_p_Cl35_removed); + amrex::Real r_pg = rate_eval.screened_rates(k_p_Cl35_to_Ar36_removed); + amrex::Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ga + r_gp * r_pa * dd; + if constexpr (std::is_same_v) { + amrex::Real drdT_ga = rate_eval.dscreened_rates_dT(k_Ar36_to_He4_S32_removed); + amrex::Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_Cl35_to_He4_S32_removed); + amrex::Real drdT_gp = rate_eval.dscreened_rates_dT(k_Ar36_to_p_Cl35_removed); + amrex::Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_Cl35_to_Ar36_removed); + drate_dT = drdT_ga + drdT_gp * r_pa * dd + r_gp * drdT_pa * dd - r_gp * r_pa * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ar36_He4_to_Ca40_approx(const T& rate_eval, amrex::Real& rate, amrex::Real& drate_dT) { + + amrex::Real r_ag = rate_eval.screened_rates(k_He4_Ar36_to_Ca40_removed); + amrex::Real r_ap = rate_eval.screened_rates(k_He4_Ar36_to_p_K39_removed); + amrex::Real r_pg = rate_eval.screened_rates(k_p_K39_to_Ca40_removed); + amrex::Real r_pa = rate_eval.screened_rates(k_p_K39_to_He4_Ar36_removed); + amrex::Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ag + r_ap * r_pg * dd; + if constexpr (std::is_same_v) { + amrex::Real drdT_ag = rate_eval.dscreened_rates_dT(k_He4_Ar36_to_Ca40_removed); + amrex::Real drdT_ap = rate_eval.dscreened_rates_dT(k_He4_Ar36_to_p_K39_removed); + amrex::Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_K39_to_Ca40_removed); + amrex::Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_K39_to_He4_Ar36_removed); + drate_dT = drdT_ag + drdT_ap * r_pg * dd + r_ap * drdT_pg * dd - r_ap * r_pg * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ca40_to_Ar36_He4_approx(const T& rate_eval, amrex::Real& rate, amrex::Real& drate_dT) { + + amrex::Real r_ga = rate_eval.screened_rates(k_Ca40_to_He4_Ar36_removed); + amrex::Real r_pa = rate_eval.screened_rates(k_p_K39_to_He4_Ar36_removed); + amrex::Real r_gp = rate_eval.screened_rates(k_Ca40_to_p_K39_removed); + amrex::Real r_pg = rate_eval.screened_rates(k_p_K39_to_Ca40_removed); + amrex::Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ga + r_gp * r_pa * dd; + if constexpr (std::is_same_v) { + amrex::Real drdT_ga = rate_eval.dscreened_rates_dT(k_Ca40_to_He4_Ar36_removed); + amrex::Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_K39_to_He4_Ar36_removed); + amrex::Real drdT_gp = rate_eval.dscreened_rates_dT(k_Ca40_to_p_K39_removed); + amrex::Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_K39_to_Ca40_removed); + drate_dT = drdT_ga + drdT_gp * r_pa * dd + r_gp * drdT_pa * dd - r_gp * r_pa * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ca40_He4_to_Ti44_approx(const T& rate_eval, amrex::Real& rate, amrex::Real& drate_dT) { + + amrex::Real r_ag = rate_eval.screened_rates(k_He4_Ca40_to_Ti44_removed); + amrex::Real r_ap = rate_eval.screened_rates(k_He4_Ca40_to_p_Sc43_removed); + amrex::Real r_pg = rate_eval.screened_rates(k_p_Sc43_to_Ti44_removed); + amrex::Real r_pa = rate_eval.screened_rates(k_p_Sc43_to_He4_Ca40_removed); + amrex::Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ag + r_ap * r_pg * dd; + if constexpr (std::is_same_v) { + amrex::Real drdT_ag = rate_eval.dscreened_rates_dT(k_He4_Ca40_to_Ti44_removed); + amrex::Real drdT_ap = rate_eval.dscreened_rates_dT(k_He4_Ca40_to_p_Sc43_removed); + amrex::Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_Sc43_to_Ti44_removed); + amrex::Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_Sc43_to_He4_Ca40_removed); + drate_dT = drdT_ag + drdT_ap * r_pg * dd + r_ap * drdT_pg * dd - r_ap * r_pg * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ti44_to_Ca40_He4_approx(const T& rate_eval, amrex::Real& rate, amrex::Real& drate_dT) { + + amrex::Real r_ga = rate_eval.screened_rates(k_Ti44_to_He4_Ca40_removed); + amrex::Real r_pa = rate_eval.screened_rates(k_p_Sc43_to_He4_Ca40_removed); + amrex::Real r_gp = rate_eval.screened_rates(k_Ti44_to_p_Sc43_removed); + amrex::Real r_pg = rate_eval.screened_rates(k_p_Sc43_to_Ti44_removed); + amrex::Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ga + r_gp * r_pa * dd; + if constexpr (std::is_same_v) { + amrex::Real drdT_ga = rate_eval.dscreened_rates_dT(k_Ti44_to_He4_Ca40_removed); + amrex::Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_Sc43_to_He4_Ca40_removed); + amrex::Real drdT_gp = rate_eval.dscreened_rates_dT(k_Ti44_to_p_Sc43_removed); + amrex::Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_Sc43_to_Ti44_removed); + drate_dT = drdT_ga + drdT_gp * r_pa * dd + r_gp * drdT_pa * dd - r_gp * r_pa * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ti44_He4_to_Cr48_approx(const T& rate_eval, amrex::Real& rate, amrex::Real& drate_dT) { + + amrex::Real r_ag = rate_eval.screened_rates(k_He4_Ti44_to_Cr48_removed); + amrex::Real r_ap = rate_eval.screened_rates(k_He4_Ti44_to_p_V47_removed); + amrex::Real r_pg = rate_eval.screened_rates(k_p_V47_to_Cr48_removed); + amrex::Real r_pa = rate_eval.screened_rates(k_p_V47_to_He4_Ti44_removed); + amrex::Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ag + r_ap * r_pg * dd; + if constexpr (std::is_same_v) { + amrex::Real drdT_ag = rate_eval.dscreened_rates_dT(k_He4_Ti44_to_Cr48_removed); + amrex::Real drdT_ap = rate_eval.dscreened_rates_dT(k_He4_Ti44_to_p_V47_removed); + amrex::Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_V47_to_Cr48_removed); + amrex::Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_V47_to_He4_Ti44_removed); + drate_dT = drdT_ag + drdT_ap * r_pg * dd + r_ap * drdT_pg * dd - r_ap * r_pg * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Cr48_to_Ti44_He4_approx(const T& rate_eval, amrex::Real& rate, amrex::Real& drate_dT) { + + amrex::Real r_ga = rate_eval.screened_rates(k_Cr48_to_He4_Ti44_removed); + amrex::Real r_pa = rate_eval.screened_rates(k_p_V47_to_He4_Ti44_removed); + amrex::Real r_gp = rate_eval.screened_rates(k_Cr48_to_p_V47_removed); + amrex::Real r_pg = rate_eval.screened_rates(k_p_V47_to_Cr48_removed); + amrex::Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ga + r_gp * r_pa * dd; + if constexpr (std::is_same_v) { + amrex::Real drdT_ga = rate_eval.dscreened_rates_dT(k_Cr48_to_He4_Ti44_removed); + amrex::Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_V47_to_He4_Ti44_removed); + amrex::Real drdT_gp = rate_eval.dscreened_rates_dT(k_Cr48_to_p_V47_removed); + amrex::Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_V47_to_Cr48_removed); + drate_dT = drdT_ga + drdT_gp * r_pa * dd + r_gp * drdT_pa * dd - r_gp * r_pa * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Cr48_He4_to_Fe52_approx(const T& rate_eval, amrex::Real& rate, amrex::Real& drate_dT) { + + amrex::Real r_ag = rate_eval.screened_rates(k_He4_Cr48_to_Fe52_removed); + amrex::Real r_ap = rate_eval.screened_rates(k_He4_Cr48_to_p_Mn51_removed); + amrex::Real r_pg = rate_eval.screened_rates(k_p_Mn51_to_Fe52_removed); + amrex::Real r_pa = rate_eval.screened_rates(k_p_Mn51_to_He4_Cr48_removed); + amrex::Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ag + r_ap * r_pg * dd; + if constexpr (std::is_same_v) { + amrex::Real drdT_ag = rate_eval.dscreened_rates_dT(k_He4_Cr48_to_Fe52_removed); + amrex::Real drdT_ap = rate_eval.dscreened_rates_dT(k_He4_Cr48_to_p_Mn51_removed); + amrex::Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_Mn51_to_Fe52_removed); + amrex::Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_Mn51_to_He4_Cr48_removed); + drate_dT = drdT_ag + drdT_ap * r_pg * dd + r_ap * drdT_pg * dd - r_ap * r_pg * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Fe52_to_Cr48_He4_approx(const T& rate_eval, amrex::Real& rate, amrex::Real& drate_dT) { + + amrex::Real r_ga = rate_eval.screened_rates(k_Fe52_to_He4_Cr48_removed); + amrex::Real r_pa = rate_eval.screened_rates(k_p_Mn51_to_He4_Cr48_removed); + amrex::Real r_gp = rate_eval.screened_rates(k_Fe52_to_p_Mn51_removed); + amrex::Real r_pg = rate_eval.screened_rates(k_p_Mn51_to_Fe52_removed); + amrex::Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ga + r_gp * r_pa * dd; + if constexpr (std::is_same_v) { + amrex::Real drdT_ga = rate_eval.dscreened_rates_dT(k_Fe52_to_He4_Cr48_removed); + amrex::Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_Mn51_to_He4_Cr48_removed); + amrex::Real drdT_gp = rate_eval.dscreened_rates_dT(k_Fe52_to_p_Mn51_removed); + amrex::Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_Mn51_to_Fe52_removed); + drate_dT = drdT_ga + drdT_gp * r_pa * dd + r_gp * drdT_pa * dd - r_gp * r_pa * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Fe52_He4_to_Ni56_approx(const T& rate_eval, amrex::Real& rate, amrex::Real& drate_dT) { + + amrex::Real r_ag = rate_eval.screened_rates(k_He4_Fe52_to_Ni56_removed); + amrex::Real r_ap = rate_eval.screened_rates(k_He4_Fe52_to_p_Co55_removed); + amrex::Real r_pg = rate_eval.screened_rates(k_p_Co55_to_Ni56_removed); + amrex::Real r_pa = rate_eval.screened_rates(k_p_Co55_to_He4_Fe52_removed); + amrex::Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ag + r_ap * r_pg * dd; + if constexpr (std::is_same_v) { + amrex::Real drdT_ag = rate_eval.dscreened_rates_dT(k_He4_Fe52_to_Ni56_removed); + amrex::Real drdT_ap = rate_eval.dscreened_rates_dT(k_He4_Fe52_to_p_Co55_removed); + amrex::Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_Co55_to_Ni56_removed); + amrex::Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_Co55_to_He4_Fe52_removed); + drate_dT = drdT_ag + drdT_ap * r_pg * dd + r_ap * drdT_pg * dd - r_ap * r_pg * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ni56_to_Fe52_He4_approx(const T& rate_eval, amrex::Real& rate, amrex::Real& drate_dT) { + + amrex::Real r_ga = rate_eval.screened_rates(k_Ni56_to_He4_Fe52_removed); + amrex::Real r_pa = rate_eval.screened_rates(k_p_Co55_to_He4_Fe52_removed); + amrex::Real r_gp = rate_eval.screened_rates(k_Ni56_to_p_Co55_removed); + amrex::Real r_pg = rate_eval.screened_rates(k_p_Co55_to_Ni56_removed); + amrex::Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ga + r_gp * r_pa * dd; + if constexpr (std::is_same_v) { + amrex::Real drdT_ga = rate_eval.dscreened_rates_dT(k_Ni56_to_He4_Fe52_removed); + amrex::Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_Co55_to_He4_Fe52_removed); + amrex::Real drdT_gp = rate_eval.dscreened_rates_dT(k_Ni56_to_p_Co55_removed); + amrex::Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_Co55_to_Ni56_removed); + drate_dT = drdT_ga + drdT_gp * r_pa * dd + r_gp * drdT_pa * dd - r_gp * r_pa * dd * dd * (drdT_pg + drdT_pa); + } +} + + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void +fill_reaclib_rates(const tf_t& tfactors, T& rate_eval) +{ + + amrex::Real rate; + amrex::Real drate_dT; + + rate_N13_to_C13_weak_wc12(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_N13_to_C13_weak_wc12) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_N13_to_C13_weak_wc12) = drate_dT; + + } + rate_O14_to_N14_weak_wc12(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_O14_to_N14_weak_wc12) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_O14_to_N14_weak_wc12) = drate_dT; + + } + rate_O15_to_N15_weak_wc12(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_O15_to_N15_weak_wc12) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_O15_to_N15_weak_wc12) = drate_dT; + + } + rate_F17_to_O17_weak_wc12(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_F17_to_O17_weak_wc12) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_F17_to_O17_weak_wc12) = drate_dT; + + } + rate_F18_to_O18_weak_wc12(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_F18_to_O18_weak_wc12) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_F18_to_O18_weak_wc12) = drate_dT; + + } + rate_Ne18_to_F18_weak_wc12(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ne18_to_F18_weak_wc12) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ne18_to_F18_weak_wc12) = drate_dT; + + } + rate_Ne19_to_F19_weak_wc12(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ne19_to_F19_weak_wc12) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ne19_to_F19_weak_wc12) = drate_dT; + + } + rate_Mg22_to_Na22_weak_wc12(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Mg22_to_Na22_weak_wc12) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Mg22_to_Na22_weak_wc12) = drate_dT; + + } + rate_N13_to_p_C12(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_N13_to_p_C12) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_N13_to_p_C12) = drate_dT; + + } + rate_N14_to_p_C13(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_N14_to_p_C13) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_N14_to_p_C13) = drate_dT; + + } + rate_O14_to_p_N13(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_O14_to_p_N13) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_O14_to_p_N13) = drate_dT; + + } + rate_O15_to_p_N14(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_O15_to_p_N14) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_O15_to_p_N14) = drate_dT; + + } + rate_O16_to_p_N15(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_O16_to_p_N15) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_O16_to_p_N15) = drate_dT; + + } + rate_O16_to_He4_C12(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_O16_to_He4_C12) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_O16_to_He4_C12) = drate_dT; + + } + rate_F17_to_p_O16(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_F17_to_p_O16) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_F17_to_p_O16) = drate_dT; + + } + rate_F18_to_p_O17(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_F18_to_p_O17) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_F18_to_p_O17) = drate_dT; + + } + rate_F18_to_He4_N14(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_F18_to_He4_N14) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_F18_to_He4_N14) = drate_dT; + + } + rate_F19_to_p_O18(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_F19_to_p_O18) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_F19_to_p_O18) = drate_dT; + + } + rate_F19_to_He4_N15(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_F19_to_He4_N15) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_F19_to_He4_N15) = drate_dT; + + } + rate_Ne18_to_p_F17(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ne18_to_p_F17) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ne18_to_p_F17) = drate_dT; + + } + rate_Ne18_to_He4_O14(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ne18_to_He4_O14) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ne18_to_He4_O14) = drate_dT; + + } + rate_Ne19_to_p_F18(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ne19_to_p_F18) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ne19_to_p_F18) = drate_dT; + + } + rate_Ne19_to_He4_O15(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ne19_to_He4_O15) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ne19_to_He4_O15) = drate_dT; + + } + rate_Ne20_to_p_F19(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ne20_to_p_F19) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ne20_to_p_F19) = drate_dT; + + } + rate_Ne20_to_He4_O16(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ne20_to_He4_O16) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ne20_to_He4_O16) = drate_dT; + + } + rate_Ne21_to_He4_O17(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ne21_to_He4_O17) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ne21_to_He4_O17) = drate_dT; + + } + rate_Na22_to_p_Ne21(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Na22_to_p_Ne21) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Na22_to_p_Ne21) = drate_dT; + + } + rate_Na22_to_He4_F18(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Na22_to_He4_F18) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Na22_to_He4_F18) = drate_dT; + + } + rate_Na23_to_He4_F19(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Na23_to_He4_F19) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Na23_to_He4_F19) = drate_dT; + + } + rate_Mg22_to_He4_Ne18(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Mg22_to_He4_Ne18) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Mg22_to_He4_Ne18) = drate_dT; + + } + rate_Mg24_to_p_Na23(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Mg24_to_p_Na23) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Mg24_to_p_Na23) = drate_dT; + + } + rate_Mg24_to_He4_Ne20(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Mg24_to_He4_Ne20) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Mg24_to_He4_Ne20) = drate_dT; + + } + rate_Si28_to_p_Al27(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Si28_to_p_Al27) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Si28_to_p_Al27) = drate_dT; + + } + rate_Si28_to_He4_Mg24(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Si28_to_He4_Mg24) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Si28_to_He4_Mg24) = drate_dT; + + } + rate_S32_to_p_P31(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_S32_to_p_P31) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_S32_to_p_P31) = drate_dT; + + } + rate_S32_to_He4_Si28(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_S32_to_He4_Si28) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_S32_to_He4_Si28) = drate_dT; + + } + rate_C12_to_He4_He4_He4(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_C12_to_He4_He4_He4) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_C12_to_He4_He4_He4) = drate_dT; + + } + rate_p_C12_to_N13(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_C12_to_N13) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_C12_to_N13) = drate_dT; + + } + rate_He4_C12_to_O16(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_C12_to_O16) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_C12_to_O16) = drate_dT; + + } + rate_p_C13_to_N14(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_C13_to_N14) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_C13_to_N14) = drate_dT; + + } + rate_p_N13_to_O14(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_N13_to_O14) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_N13_to_O14) = drate_dT; + + } + rate_p_N14_to_O15(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_N14_to_O15) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_N14_to_O15) = drate_dT; + + } + rate_He4_N14_to_F18(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_N14_to_F18) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_N14_to_F18) = drate_dT; + + } + rate_p_N15_to_O16(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_N15_to_O16) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_N15_to_O16) = drate_dT; + + } + rate_He4_N15_to_F19(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_N15_to_F19) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_N15_to_F19) = drate_dT; + + } + rate_He4_O14_to_Ne18(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_O14_to_Ne18) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_O14_to_Ne18) = drate_dT; + + } + rate_He4_O15_to_Ne19(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_O15_to_Ne19) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_O15_to_Ne19) = drate_dT; + + } + rate_p_O16_to_F17(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_O16_to_F17) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_O16_to_F17) = drate_dT; + + } + rate_He4_O16_to_Ne20(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_O16_to_Ne20) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_O16_to_Ne20) = drate_dT; + + } + rate_p_O17_to_F18(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_O17_to_F18) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_O17_to_F18) = drate_dT; + + } + rate_He4_O17_to_Ne21(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_O17_to_Ne21) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_O17_to_Ne21) = drate_dT; + + } + rate_p_O18_to_F19(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_O18_to_F19) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_O18_to_F19) = drate_dT; + + } + rate_p_F17_to_Ne18(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_F17_to_Ne18) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_F17_to_Ne18) = drate_dT; + + } + rate_p_F18_to_Ne19(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_F18_to_Ne19) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_F18_to_Ne19) = drate_dT; + + } + rate_He4_F18_to_Na22(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_F18_to_Na22) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_F18_to_Na22) = drate_dT; + + } + rate_p_F19_to_Ne20(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_F19_to_Ne20) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_F19_to_Ne20) = drate_dT; + + } + rate_He4_F19_to_Na23(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_F19_to_Na23) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_F19_to_Na23) = drate_dT; + + } + rate_He4_Ne18_to_Mg22(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Ne18_to_Mg22) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_Ne18_to_Mg22) = drate_dT; + + } + rate_He4_Ne20_to_Mg24(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Ne20_to_Mg24) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_Ne20_to_Mg24) = drate_dT; + + } + rate_p_Ne21_to_Na22(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Ne21_to_Na22) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_Ne21_to_Na22) = drate_dT; + + } + rate_p_Na23_to_Mg24(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Na23_to_Mg24) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_Na23_to_Mg24) = drate_dT; + + } + rate_He4_Mg24_to_Si28(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Mg24_to_Si28) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_Mg24_to_Si28) = drate_dT; + + } + rate_p_Al27_to_Si28(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Al27_to_Si28) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_Al27_to_Si28) = drate_dT; + + } + rate_He4_Si28_to_S32(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Si28_to_S32) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_Si28_to_S32) = drate_dT; + + } + rate_p_P31_to_S32(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_P31_to_S32) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_P31_to_S32) = drate_dT; + + } + rate_He4_C12_to_p_N15(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_C12_to_p_N15) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_C12_to_p_N15) = drate_dT; + + } + rate_C12_C12_to_p_Na23(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_C12_C12_to_p_Na23) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_C12_C12_to_p_Na23) = drate_dT; + + } + rate_C12_C12_to_He4_Ne20(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_C12_C12_to_He4_Ne20) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_C12_C12_to_He4_Ne20) = drate_dT; + + } + rate_He4_N13_to_p_O16(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_N13_to_p_O16) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_N13_to_p_O16) = drate_dT; + + } + rate_He4_N14_to_p_O17(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_N14_to_p_O17) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_N14_to_p_O17) = drate_dT; + + } + rate_p_N15_to_He4_C12(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_N15_to_He4_C12) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_N15_to_He4_C12) = drate_dT; + + } + rate_He4_N15_to_p_O18(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_N15_to_p_O18) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_N15_to_p_O18) = drate_dT; + + } + rate_He4_O14_to_p_F17(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_O14_to_p_F17) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_O14_to_p_F17) = drate_dT; + + } + rate_He4_O15_to_p_F18(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_O15_to_p_F18) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_O15_to_p_F18) = drate_dT; + + } + rate_p_O16_to_He4_N13(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_O16_to_He4_N13) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_O16_to_He4_N13) = drate_dT; + + } + rate_He4_O16_to_p_F19(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_O16_to_p_F19) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_O16_to_p_F19) = drate_dT; + + } + rate_C12_O16_to_p_Al27(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_C12_O16_to_p_Al27) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_C12_O16_to_p_Al27) = drate_dT; + + } + rate_C12_O16_to_He4_Mg24(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_C12_O16_to_He4_Mg24) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_C12_O16_to_He4_Mg24) = drate_dT; + + } + rate_O16_O16_to_p_P31(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_O16_O16_to_p_P31) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_O16_O16_to_p_P31) = drate_dT; + + } + rate_O16_O16_to_He4_Si28(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_O16_O16_to_He4_Si28) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_O16_O16_to_He4_Si28) = drate_dT; + + } + rate_p_O17_to_He4_N14(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_O17_to_He4_N14) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_O17_to_He4_N14) = drate_dT; + + } + rate_p_O18_to_He4_N15(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_O18_to_He4_N15) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_O18_to_He4_N15) = drate_dT; + + } + rate_p_F17_to_He4_O14(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_F17_to_He4_O14) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_F17_to_He4_O14) = drate_dT; + + } + rate_He4_F17_to_p_Ne20(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_F17_to_p_Ne20) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_F17_to_p_Ne20) = drate_dT; + + } + rate_p_F18_to_He4_O15(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_F18_to_He4_O15) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_F18_to_He4_O15) = drate_dT; + + } + rate_He4_F18_to_p_Ne21(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_F18_to_p_Ne21) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_F18_to_p_Ne21) = drate_dT; + + } + rate_p_F19_to_He4_O16(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_F19_to_He4_O16) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_F19_to_He4_O16) = drate_dT; + + } + rate_He4_Ne19_to_p_Na22(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Ne19_to_p_Na22) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_Ne19_to_p_Na22) = drate_dT; + + } + rate_p_Ne20_to_He4_F17(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Ne20_to_He4_F17) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_Ne20_to_He4_F17) = drate_dT; + + } + rate_He4_Ne20_to_p_Na23(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Ne20_to_p_Na23) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_Ne20_to_p_Na23) = drate_dT; + + } + rate_p_Ne21_to_He4_F18(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Ne21_to_He4_F18) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_Ne21_to_He4_F18) = drate_dT; + + } + rate_p_Na22_to_He4_Ne19(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Na22_to_He4_Ne19) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_Na22_to_He4_Ne19) = drate_dT; + + } + rate_p_Na23_to_He4_Ne20(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Na23_to_He4_Ne20) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_Na23_to_He4_Ne20) = drate_dT; + + } + rate_He4_Mg24_to_p_Al27(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Mg24_to_p_Al27) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_Mg24_to_p_Al27) = drate_dT; + + } + rate_p_Al27_to_He4_Mg24(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Al27_to_He4_Mg24) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_Al27_to_He4_Mg24) = drate_dT; + + } + rate_He4_Si28_to_p_P31(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Si28_to_p_P31) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_Si28_to_p_P31) = drate_dT; + + } + rate_p_P31_to_He4_Si28(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_P31_to_He4_Si28) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_P31_to_He4_Si28) = drate_dT; + + } + rate_He4_He4_He4_to_C12(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_He4_He4_to_C12) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_He4_He4_to_C12) = drate_dT; + + } + rate_C12_C12_to_Mg24_modified(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_C12_C12_to_Mg24_modified) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_C12_C12_to_Mg24_modified) = drate_dT; + + } + rate_O16_O16_to_S32_modified(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_O16_O16_to_S32_modified) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_O16_O16_to_S32_modified) = drate_dT; + + } + rate_C12_O16_to_Si28_modified(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_C12_O16_to_Si28_modified) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_C12_O16_to_Si28_modified) = drate_dT; + + } + rate_He4_S32_to_Ar36_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_S32_to_Ar36_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_S32_to_Ar36_removed) = drate_dT; + + } + rate_He4_S32_to_p_Cl35_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_S32_to_p_Cl35_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_S32_to_p_Cl35_removed) = drate_dT; + + } + rate_p_Cl35_to_Ar36_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Cl35_to_Ar36_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_Cl35_to_Ar36_removed) = drate_dT; + + } + rate_Ar36_to_He4_S32_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ar36_to_He4_S32_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ar36_to_He4_S32_removed) = drate_dT; + + } + rate_Ar36_to_p_Cl35_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ar36_to_p_Cl35_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ar36_to_p_Cl35_removed) = drate_dT; + + } + rate_p_Cl35_to_He4_S32_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Cl35_to_He4_S32_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_Cl35_to_He4_S32_removed) = drate_dT; + + } + rate_He4_Ar36_to_Ca40_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Ar36_to_Ca40_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_Ar36_to_Ca40_removed) = drate_dT; + + } + rate_He4_Ar36_to_p_K39_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Ar36_to_p_K39_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_Ar36_to_p_K39_removed) = drate_dT; + + } + rate_p_K39_to_Ca40_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_K39_to_Ca40_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_K39_to_Ca40_removed) = drate_dT; + + } + rate_Ca40_to_He4_Ar36_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ca40_to_He4_Ar36_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ca40_to_He4_Ar36_removed) = drate_dT; + + } + rate_Ca40_to_p_K39_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ca40_to_p_K39_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ca40_to_p_K39_removed) = drate_dT; + + } + rate_p_K39_to_He4_Ar36_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_K39_to_He4_Ar36_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_K39_to_He4_Ar36_removed) = drate_dT; + + } + rate_He4_Ca40_to_Ti44_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Ca40_to_Ti44_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_Ca40_to_Ti44_removed) = drate_dT; + + } + rate_He4_Ca40_to_p_Sc43_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Ca40_to_p_Sc43_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_Ca40_to_p_Sc43_removed) = drate_dT; + + } + rate_p_Sc43_to_Ti44_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Sc43_to_Ti44_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_Sc43_to_Ti44_removed) = drate_dT; + + } + rate_Ti44_to_He4_Ca40_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ti44_to_He4_Ca40_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ti44_to_He4_Ca40_removed) = drate_dT; + + } + rate_Ti44_to_p_Sc43_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ti44_to_p_Sc43_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ti44_to_p_Sc43_removed) = drate_dT; + + } + rate_p_Sc43_to_He4_Ca40_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Sc43_to_He4_Ca40_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_Sc43_to_He4_Ca40_removed) = drate_dT; + + } + rate_He4_Ti44_to_Cr48_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Ti44_to_Cr48_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_Ti44_to_Cr48_removed) = drate_dT; + + } + rate_He4_Ti44_to_p_V47_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Ti44_to_p_V47_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_Ti44_to_p_V47_removed) = drate_dT; + + } + rate_p_V47_to_Cr48_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_V47_to_Cr48_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_V47_to_Cr48_removed) = drate_dT; + + } + rate_Cr48_to_He4_Ti44_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Cr48_to_He4_Ti44_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Cr48_to_He4_Ti44_removed) = drate_dT; + + } + rate_Cr48_to_p_V47_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Cr48_to_p_V47_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Cr48_to_p_V47_removed) = drate_dT; + + } + rate_p_V47_to_He4_Ti44_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_V47_to_He4_Ti44_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_V47_to_He4_Ti44_removed) = drate_dT; + + } + rate_He4_Cr48_to_Fe52_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Cr48_to_Fe52_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_Cr48_to_Fe52_removed) = drate_dT; + + } + rate_He4_Cr48_to_p_Mn51_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Cr48_to_p_Mn51_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_Cr48_to_p_Mn51_removed) = drate_dT; + + } + rate_p_Mn51_to_Fe52_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Mn51_to_Fe52_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_Mn51_to_Fe52_removed) = drate_dT; + + } + rate_Fe52_to_He4_Cr48_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Fe52_to_He4_Cr48_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Fe52_to_He4_Cr48_removed) = drate_dT; + + } + rate_Fe52_to_p_Mn51_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Fe52_to_p_Mn51_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Fe52_to_p_Mn51_removed) = drate_dT; + + } + rate_p_Mn51_to_He4_Cr48_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Mn51_to_He4_Cr48_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_Mn51_to_He4_Cr48_removed) = drate_dT; + + } + rate_He4_Fe52_to_Ni56_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Fe52_to_Ni56_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_Fe52_to_Ni56_removed) = drate_dT; + + } + rate_He4_Fe52_to_p_Co55_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Fe52_to_p_Co55_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_He4_Fe52_to_p_Co55_removed) = drate_dT; + + } + rate_p_Co55_to_Ni56_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Co55_to_Ni56_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_Co55_to_Ni56_removed) = drate_dT; + + } + rate_Ni56_to_He4_Fe52_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ni56_to_He4_Fe52_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ni56_to_He4_Fe52_removed) = drate_dT; + + } + rate_Ni56_to_p_Co55_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ni56_to_p_Co55_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ni56_to_p_Co55_removed) = drate_dT; + + } + rate_p_Co55_to_He4_Fe52_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Co55_to_He4_Fe52_removed) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_p_Co55_to_He4_Fe52_removed) = drate_dT; + + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void +fill_approx_rates([[maybe_unused]] const tf_t& tfactors, [[maybe_unused]] T& rate_eval) +{ + + [[maybe_unused]] amrex::Real rate{}; + [[maybe_unused]] amrex::Real drate_dT{}; + + rate_S32_He4_to_Ar36_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_S32_He4_to_Ar36_approx) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_S32_He4_to_Ar36_approx) = drate_dT; + + } + rate_Ar36_to_S32_He4_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Ar36_to_S32_He4_approx) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ar36_to_S32_He4_approx) = drate_dT; + + } + rate_Ar36_He4_to_Ca40_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Ar36_He4_to_Ca40_approx) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ar36_He4_to_Ca40_approx) = drate_dT; + + } + rate_Ca40_to_Ar36_He4_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Ca40_to_Ar36_He4_approx) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ca40_to_Ar36_He4_approx) = drate_dT; + + } + rate_Ca40_He4_to_Ti44_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Ca40_He4_to_Ti44_approx) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ca40_He4_to_Ti44_approx) = drate_dT; + + } + rate_Ti44_to_Ca40_He4_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Ti44_to_Ca40_He4_approx) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ti44_to_Ca40_He4_approx) = drate_dT; + + } + rate_Ti44_He4_to_Cr48_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Ti44_He4_to_Cr48_approx) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ti44_He4_to_Cr48_approx) = drate_dT; + + } + rate_Cr48_to_Ti44_He4_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Cr48_to_Ti44_He4_approx) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Cr48_to_Ti44_He4_approx) = drate_dT; + + } + rate_Cr48_He4_to_Fe52_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Cr48_He4_to_Fe52_approx) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Cr48_He4_to_Fe52_approx) = drate_dT; + + } + rate_Fe52_to_Cr48_He4_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Fe52_to_Cr48_He4_approx) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Fe52_to_Cr48_He4_approx) = drate_dT; + + } + rate_Fe52_He4_to_Ni56_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Fe52_He4_to_Ni56_approx) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Fe52_He4_to_Ni56_approx) = drate_dT; + + } + rate_Ni56_to_Fe52_He4_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Ni56_to_Fe52_He4_approx) = rate; + if constexpr (std::is_same_v) { + rate_eval.dscreened_rates_dT(k_Ni56_to_Fe52_He4_approx) = drate_dT; + + } + +} + +#endif diff --git a/networks/CNO_He_burn/table_rates.H b/networks/CNO_He_burn/table_rates.H new file mode 100644 index 0000000000..a2c5b79b54 --- /dev/null +++ b/networks/CNO_He_burn/table_rates.H @@ -0,0 +1,399 @@ +#ifndef TABLE_RATES_H +#define TABLE_RATES_H + +#include +#include +#include +#include + +#include + +using namespace amrex; + +void init_tabular(); + +// Table is expected to be in terms of dens*ye and temp (logarithmic, cgs units) +// Table energy units are expected in terms of ergs + +// all tables are expected to have columns: +// Log(rhoY) Log(T) mu dQ Vs Log(e-cap-rate) Log(nu-energy-loss) Log(gamma-energy) +// Log(g/cm^3) Log(K) erg erg erg Log(1/s) Log(erg/s) Log(erg/s) +// + +const int num_tables = 0; + +enum TableVars +{ + jtab_mu = 1, + jtab_dq = 2, + jtab_vs = 3, + jtab_rate = 4, + jtab_nuloss = 5, + jtab_gamma = 6, + num_vars = jtab_gamma +}; + + +struct table_t +{ + int ntemp; + int nrhoy; + int nvars; + int nheader; +}; + +// we add a 7th index, k_index_dlogr_dlogt used for computing the derivative +// of Log(rate) with respect of Log(temperature) by using the table +// values. It isn't an index into the table but into the 'entries' +// array. Is important to mention that although we compute dlogr/dlogT is +// the computed quantity in 'entries', we pursue ultimately +// dr/dt as the final desired quantity to be computed for this index. + +const int k_index_dlogr_dlogt = 7; +const int add_vars = 1; // 1 Additional Var in entries + + +namespace rate_tables +{ +} + +template +void init_tab_info(const table_t& tf, const std::string& file, R& log_rhoy_table, T& log_temp_table, D& data) +{ + // This function initializes the selected tabular-rate tables. From the tables we are interested + // on the rate, neutrino-energy-loss and the gamma-energy entries. + + std::ifstream table; + table.open(file); + + if (!table.is_open()) { + // the table was not present or we could not open it; abort + amrex::Error("table could not be opened"); + } + + std::string line; + + // read and skip over the header + + for (int i = 0; i < tf.nheader; ++i) { + std::getline(table, line); + } + + // now the data -- there are 2 extra columns, for log_temp and log_rhoy + + for (int j = 1; j <= tf.nrhoy; ++j) { + for (int i = 1; i <= tf.ntemp; ++i) { + std::getline(table, line); + if (line.empty()) { + amrex::Error("Error reading table data"); + } + + std::istringstream sdata(line); + + sdata >> log_rhoy_table(j) >> log_temp_table(i); + + for (int n = 1; n <= tf.nvars; ++n) { + sdata >> data(i, j, n); + } + } + } + table.close(); +} + + +template +AMREX_INLINE AMREX_GPU_HOST_DEVICE +int vector_index_lu(const int vlen, const V& vector, const amrex::Real fvar) +{ + + // Returns the greatest index of vector for which vector(index) < fvar. + // Return 1 if fvar < vector(1) + // Return size(vector)-1 if fvar > vector(size(vector)) + // The interval [index, index+1] brackets fvar for fvar within the range of vector. + + int index; + + if (fvar < vector(1)) { + index = 1; + } else if (fvar > vector(vlen)) { + index = vlen - 1; + } else { + int nup = vlen; + int ndn = 1; + for (int i = 1; i <= vlen; ++i) { + int j = ndn + (nup - ndn)/2; + if (fvar < vector(j)) { + nup = j; + } else { + ndn = j; + } + if ((nup - ndn) == 1) { + break; + } + } + index = ndn; + } + return index; +} + + +AMREX_INLINE AMREX_GPU_HOST_DEVICE +amrex::Real +evaluate_linear_1d(const amrex::Real fhi, const amrex::Real flo, const amrex::Real xhi, const amrex::Real xlo, const amrex::Real x) +{ + // This function is a 1-D linear interpolator, that keeps x constant to xlo or xhi, based + // on the side, if x is outside [xlo, xhi] respectively. + + amrex::Real xx = Clamp(x, xlo, xhi); + amrex::Real f = flo + (fhi - flo) * (xx - xlo) / (xhi - xlo); + + return f; +} + +AMREX_INLINE AMREX_GPU_HOST_DEVICE +amrex::Real +evaluate_linear_2d(const amrex::Real fip1jp1, const amrex::Real fip1j, const amrex::Real fijp1, const amrex::Real fij, + const amrex::Real xhi, const amrex::Real xlo, const amrex::Real yhi, const amrex::Real ylo, + const amrex::Real x, const amrex::Real y) +{ + // This is the 2-D linear interpolator, as an extension of evaluate_linear_1d. + + amrex::Real f; + amrex::Real dx = xhi - xlo; + amrex::Real dy = yhi - ylo; + + amrex::Real E = fij; + amrex::Real C = (fijp1 - fij) / dy; + amrex::Real B = (fip1j - fij) / dx; + amrex::Real A = (fip1jp1 - B * dx - C * dy - E) / (dx * dy); + + amrex::Real xx = Clamp(x, xlo, xhi); + amrex::Real yy = Clamp(y, ylo, yhi); + + f = A * (xx - xlo) * (yy - ylo) + + B * (xx - xlo) + + C * (yy - ylo) + + E; + + return f; +} + + +template +AMREX_INLINE AMREX_GPU_HOST_DEVICE +amrex::Real +evaluate_vars(const table_t& table_meta, const R& log_rhoy_table, const T& log_temp_table, const D& data, + const amrex::Real log_rhoy, const amrex::Real log_temp, const int component) +{ + // This function evaluates the 2-D interpolator, for several pairs of rho_ye and temperature. + + int jtemp_lo = vector_index_lu(table_meta.ntemp, log_temp_table, log_temp); + int jtemp_hi = jtemp_lo + 1; + + int irhoy_lo = vector_index_lu(table_meta.nrhoy, log_rhoy_table, log_rhoy); + int irhoy_hi = irhoy_lo + 1; + + amrex::Real rhoy_lo = log_rhoy_table(irhoy_lo); + amrex::Real rhoy_hi = log_rhoy_table(irhoy_hi); + + amrex::Real t_lo = log_temp_table(jtemp_lo); + amrex::Real t_hi = log_temp_table(jtemp_hi); + + amrex::Real fij = data(jtemp_lo, irhoy_lo, component); + amrex::Real fip1j = data(jtemp_lo, irhoy_hi, component); + amrex::Real fijp1 = data(jtemp_hi, irhoy_lo, component); + amrex::Real fip1jp1 = data(jtemp_hi, irhoy_hi, component); + + amrex::Real r = evaluate_linear_2d(fip1jp1, fip1j, fijp1, fij, + rhoy_hi, rhoy_lo, t_hi, t_lo, log_rhoy, log_temp); + + return r; +} + + +template +AMREX_INLINE AMREX_GPU_HOST_DEVICE +amrex::Real +evaluate_dr_dtemp(const table_t& table_meta, const R& log_rhoy_table, const T& log_temp_table, const D& data, + const amrex::Real log_rhoy, const amrex::Real log_temp) +{ + // The main objective of this function is compute dlogr_dlogt. + + int irhoy_lo = vector_index_lu(table_meta.nrhoy, log_rhoy_table, log_rhoy); + int irhoy_hi = irhoy_lo + 1; + + int jtemp_lo = vector_index_lu(table_meta.ntemp, log_temp_table, log_temp); + int jtemp_hi = jtemp_lo + 1; + + amrex::Real dlogr_dlogt; + + //Now we compute the forward finite difference on the boundary + + if ((jtemp_lo - 1 < 1) || (jtemp_hi + 1 > table_meta.ntemp)) { + + // In this case we are in the boundaries of the table. + // At the boundary, we compute the forward-j finite difference + // to compute dlogr_dlogt_i and dlogr_dlogt_ip1, using the + // following stencil: + // + // + // fijp1-----------fip1jp1 + // | | + // | | + // | | + // | | + // | | + // | | + // | | + // fij-------------fip1j + // + // with the following result: + // + // dlogr_dlogt_i --------dlogr_dlogt_ip1 + // + // Finally, we perform a 1d-linear interpolation between dlogr_dlogt_ip1 + // and dlogr_dlogt_i to compute dlogr_dlogt + + amrex::Real log_rhoy_lo = log_rhoy_table(irhoy_lo); + amrex::Real log_rhoy_hi = log_rhoy_table(irhoy_hi); + + amrex::Real log_temp_lo = log_temp_table(jtemp_lo); + amrex::Real log_temp_hi = log_temp_table(jtemp_hi); + + amrex::Real fij = data(jtemp_lo, irhoy_lo, jtab_rate); + amrex::Real fip1j = data(jtemp_lo, irhoy_hi, jtab_rate); + amrex::Real fijp1 = data(jtemp_hi, irhoy_lo, jtab_rate); + amrex::Real fip1jp1 = data(jtemp_hi, irhoy_hi, jtab_rate); + + amrex::Real dlogr_dlogt_i = (fijp1 - fij) / (log_temp_hi - log_temp_lo); + amrex::Real dlogr_dlogt_ip1 = (fip1jp1 - fip1j) / (log_temp_hi - log_temp_lo); + + if ((log_temp < log_temp_lo) || (log_temp > log_temp_hi)) { + dlogr_dlogt = 0.0_rt; + } else { + dlogr_dlogt = evaluate_linear_1d(dlogr_dlogt_ip1, dlogr_dlogt_i, log_rhoy_hi, log_rhoy_lo, log_rhoy); + } + + } else { + + // In this case, we use a bigger stencil to reconstruct the + // temperature derivatives in the j and j+1 temperature positions, + // using the cetral-j finite differences: + // + // fijp2 ------------fip1jp2 + // | | + // | | + // | | + // | | + // | | + // | | + // | | + // fijp1------------fip1jp1 + // | | + // | | + // | | + // | | + // | | + // | | + // | | + // fij------------- fip1j + // | | + // | | + // | | + // | | + // | | + // | | + // | | + // fijm1------------fip1jm1 + // + // with the following result: + // + // + // dr_dt_ijp1 --------dr_dt_ip1jp1 + // | | + // | | + // | | + // | | + // | | + // | | + // | | + // dr_dt_ij-----------dr_dt_ip1j + // + // Finally, we perform a 2d-linear interpolation to + // compute dlogr_dlogt. + + amrex::Real log_temp_jm1 = log_temp_table(jtemp_lo-1); + amrex::Real log_temp_j = log_temp_table(jtemp_lo); + amrex::Real log_temp_jp1 = log_temp_table(jtemp_hi); + amrex::Real log_temp_jp2 = log_temp_table(jtemp_hi+1); + + amrex::Real log_rhoy_lo = log_rhoy_table(irhoy_lo); + amrex::Real log_rhoy_hi = log_rhoy_table(irhoy_hi); + + amrex::Real fijm1 = data(jtemp_lo-1, irhoy_lo, jtab_rate); + amrex::Real fij = data(jtemp_lo, irhoy_lo, jtab_rate); + amrex::Real fijp1 = data(jtemp_hi, irhoy_lo, jtab_rate); + amrex::Real fijp2 = data(jtemp_hi+1, irhoy_lo, jtab_rate); + + amrex::Real fip1jm1 = data(jtemp_lo-1, irhoy_hi, jtab_rate); + amrex::Real fip1j = data(jtemp_lo, irhoy_hi, jtab_rate); + amrex::Real fip1jp1 = data(jtemp_hi, irhoy_hi, jtab_rate); + amrex::Real fip1jp2 = data(jtemp_hi+1, irhoy_hi, jtab_rate); + + amrex::Real dlogr_dlogt_ij = (fijp1 - fijm1)/(log_temp_jp1 - log_temp_jm1); + amrex::Real dlogr_dlogt_ijp1 = (fijp2 - fij)/(log_temp_jp2 - log_temp_j); + amrex::Real dlogr_dlogt_ip1j = (fip1jp1 - fip1jm1)/(log_temp_jp1 - log_temp_jm1); + amrex::Real dlogr_dlogt_ip1jp1 = (fip1jp2 - fip1j)/(log_temp_jp2 - log_temp_j); + + dlogr_dlogt = evaluate_linear_2d(dlogr_dlogt_ip1jp1, dlogr_dlogt_ip1j, dlogr_dlogt_ijp1, dlogr_dlogt_ij, + log_rhoy_hi, log_rhoy_lo, log_temp_jp1, log_temp_j, + log_rhoy, log_temp); + + } + return dlogr_dlogt; +} + + +template +AMREX_INLINE AMREX_GPU_HOST_DEVICE +void +get_entries(const table_t& table_meta, const R& log_rhoy_table, const T& log_temp_table, const D& data, + const amrex::Real log_rhoy, const amrex::Real log_temp, amrex::Array1D& entries) +{ + for (int ivar = 1; ivar <= num_vars; ivar++) { + entries(ivar) = evaluate_vars(table_meta, log_rhoy_table, log_temp_table, data, + log_rhoy, log_temp, ivar); + } + + entries(k_index_dlogr_dlogt) = evaluate_dr_dtemp(table_meta, log_rhoy_table, log_temp_table, data, + log_rhoy, log_temp); +} + +template +AMREX_INLINE AMREX_GPU_HOST_DEVICE +void +tabular_evaluate(const table_t& table_meta, + const R& log_rhoy_table, const T& log_temp_table, const D& data, + const amrex::Real rhoy, const amrex::Real temp, + amrex::Real& rate, amrex::Real& drate_dt, amrex::Real& edot_nu, amrex::Real& edot_gamma) +{ + amrex::Array1D entries; + + // Get the table entries at this rhoy, temp + + amrex::Real log_rhoy = std::log10(rhoy); + amrex::Real log_temp = std::log10(temp); + + get_entries(table_meta, log_rhoy_table, log_temp_table, data, + log_rhoy, log_temp, entries); + + // Fill outputs: rate, d(rate)/d(temperature), and + // (negative) neutrino loss contribution to energy generation + + rate = std::pow(10.0_rt, entries(jtab_rate)); + drate_dt = rate * entries(k_index_dlogr_dlogt) / temp; + edot_nu = -std::pow(10.0_rt, entries(jtab_nuloss)); + edot_gamma = std::pow(10.0_rt, entries(jtab_gamma)); +} + +#endif diff --git a/networks/CNO_He_burn/table_rates_data.cpp b/networks/CNO_He_burn/table_rates_data.cpp new file mode 100644 index 0000000000..63b38aff19 --- /dev/null +++ b/networks/CNO_He_burn/table_rates_data.cpp @@ -0,0 +1,23 @@ +#include +#include +#include +#include + +using namespace amrex; + +namespace rate_tables +{ + + +} + + +void init_tabular() +{ + + amrex::Print() << "reading in network electron-capture / beta-decay tables..." << std::endl; + + using namespace rate_tables; + + +} diff --git a/networks/CNO_He_burn/tfactors.H b/networks/CNO_He_burn/tfactors.H new file mode 100644 index 0000000000..3ec02d562f --- /dev/null +++ b/networks/CNO_He_burn/tfactors.H @@ -0,0 +1,34 @@ +#ifndef TFACTORS_H +#define TFACTORS_H + +struct tf_t { + amrex::Real T9; + amrex::Real T9i; + amrex::Real T943i; + amrex::Real T923i; + amrex::Real T913i; + amrex::Real T913; + amrex::Real T923; + amrex::Real T953; + amrex::Real lnT9; +}; + +AMREX_GPU_HOST_DEVICE AMREX_INLINE +tf_t evaluate_tfactors(const amrex::Real T) +{ + + tf_t tf; + tf.T9 = T / 1.e9_rt; + tf.T9i = 1.0_rt / tf.T9; + tf.T913 = std::cbrt(tf.T9); + tf.T913i = 1.0_rt / tf.T913; + tf.T923i = tf.T913i * tf.T913i; + tf.T943i = tf.T9i * tf.T913i; + tf.T923 = tf.T913 * tf.T913; + tf.T953 = tf.T9 * tf.T923; + tf.lnT9 = std::log(tf.T9); + + return tf; +} + +#endif From 4c8331dfa46c3a973352353e2d7fe7edf3b3e7a4 Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Sun, 21 Jul 2024 16:59:58 -0400 Subject: [PATCH 23/33] fix compilation of nse_table_cell (#1620) we need SDC now --- unit_test/nse_table_cell/GNUmakefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/unit_test/nse_table_cell/GNUmakefile b/unit_test/nse_table_cell/GNUmakefile index 1b443926cb..e25e3df662 100644 --- a/unit_test/nse_table_cell/GNUmakefile +++ b/unit_test/nse_table_cell/GNUmakefile @@ -10,6 +10,8 @@ COMP = gnu USE_MPI = FALSE USE_OMP = FALSE +USE_SIMPLIFIED_SDC = TRUE + USE_REACT = TRUE EBASE = main From 495d3f5cce97b777b3c0d9dc3c4a31a084e7bf01 Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Thu, 25 Jul 2024 11:19:18 -0400 Subject: [PATCH 24/33] add jac_cell unit test (#1618) this simply displays the analytic and numerical Jacobian elements for comparison --- .github/workflows/jac_cell.yml | 45 ++++ sphinx_docs/source/unit_tests.rst | 7 + unit_test/jac_cell/GNUmakefile | 39 ++++ unit_test/jac_cell/Make.package | 2 + unit_test/jac_cell/README.md | 5 + unit_test/jac_cell/_parameters | 21 ++ .../ci-benchmarks/jac_cell_aprox13.out | 214 ++++++++++++++++++ unit_test/jac_cell/inputs_aprox13 | 38 ++++ unit_test/jac_cell/jac_cell.H | 79 +++++++ unit_test/jac_cell/main.cpp | 28 +++ 10 files changed, 478 insertions(+) create mode 100644 .github/workflows/jac_cell.yml create mode 100644 unit_test/jac_cell/GNUmakefile create mode 100644 unit_test/jac_cell/Make.package create mode 100644 unit_test/jac_cell/README.md create mode 100644 unit_test/jac_cell/_parameters create mode 100644 unit_test/jac_cell/ci-benchmarks/jac_cell_aprox13.out create mode 100644 unit_test/jac_cell/inputs_aprox13 create mode 100644 unit_test/jac_cell/jac_cell.H create mode 100644 unit_test/jac_cell/main.cpp diff --git a/.github/workflows/jac_cell.yml b/.github/workflows/jac_cell.yml new file mode 100644 index 0000000000..91a05a46cd --- /dev/null +++ b/.github/workflows/jac_cell.yml @@ -0,0 +1,45 @@ +name: jac_cell + +on: [pull_request] +jobs: + nse_table: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Get AMReX + run: | + mkdir external + cd external + git clone https://github.com/AMReX-Codes/amrex.git + cd amrex + git checkout development + echo 'AMREX_HOME=$(GITHUB_WORKSPACE)/external/amrex' >> $GITHUB_ENV + echo $AMREX_HOME + if [[ -n "${AMREX_HOME}" ]]; then exit 1; fi + cd ../.. + + - name: Install dependencies + run: | + sudo apt-get update -y -qq + sudo apt-get -qq -y install curl cmake jq clang g++>=9.3.0 + + - name: Compile jac_cell + run: | + cd unit_test/jac_cell + make -j 4 + + - name: Run jac_cell + run: | + cd unit_test/jac_cell + ./main3d.gnu.ex inputs_aprox13 > test.out + + - name: Compare to stored output + run: | + cd unit_test/jac_cell + diff -I "^Initializing AMReX" -I "^AMReX" test.out ci-benchmarks/jac_cell_aprox13.out + + + diff --git a/sphinx_docs/source/unit_tests.rst b/sphinx_docs/source/unit_tests.rst index d9ba9c5d1e..a95a18de72 100644 --- a/sphinx_docs/source/unit_tests.rst +++ b/sphinx_docs/source/unit_tests.rst @@ -131,6 +131,13 @@ One-zone tests given a $\rho$, $T$, and $X_k$, call the equation of state and print out the thermodynamic information. +* ``jac_cell`` : + + for a single thermodynamic state, compute the analytic Jacobian + (using the functions provided by the network) and a numerical + finite-difference approximation to the Jacobian and output them, + element-by-element, to the display. + * ``nse_table_cell`` : given a $\rho$, $T$, and $Y_e$, evaluate the NSE state via table interpolation diff --git a/unit_test/jac_cell/GNUmakefile b/unit_test/jac_cell/GNUmakefile new file mode 100644 index 0000000000..8372650ebb --- /dev/null +++ b/unit_test/jac_cell/GNUmakefile @@ -0,0 +1,39 @@ +PRECISION = DOUBLE +PROFILE = FALSE + +DEBUG = FALSE + +DIM = 3 + +COMP = gnu + +USE_MPI = FALSE +USE_OMP = FALSE + +USE_REACT = TRUE + +EBASE = main + +BL_NO_FORT = TRUE + +# define the location of the Microphysics top directory +MICROPHYSICS_HOME := ../.. + +# This sets the EOS directory +EOS_DIR := helmholtz + +# This sets the network directory +NETWORK_DIR := aprox13 + +CONDUCTIVITY_DIR := stellar + +INTEGRATOR_DIR = VODE + +EXTERN_SEARCH += . .. + +Bpack := ./Make.package +Blocs := . + +include $(MICROPHYSICS_HOME)/unit_test/Make.unit_test + + diff --git a/unit_test/jac_cell/Make.package b/unit_test/jac_cell/Make.package new file mode 100644 index 0000000000..daf293f4db --- /dev/null +++ b/unit_test/jac_cell/Make.package @@ -0,0 +1,2 @@ +CEXE_sources += main.cpp +CEXE_headers += jac_cell.H diff --git a/unit_test/jac_cell/README.md b/unit_test/jac_cell/README.md new file mode 100644 index 0000000000..0d972f1f25 --- /dev/null +++ b/unit_test/jac_cell/README.md @@ -0,0 +1,5 @@ +# jac_cell + +For a single thermodynamic condition, evaluate the Jacobian using both +the analytic version from the network and the finite-difference +numerical approximation. diff --git a/unit_test/jac_cell/_parameters b/unit_test/jac_cell/_parameters new file mode 100644 index 0000000000..9047a84f8e --- /dev/null +++ b/unit_test/jac_cell/_parameters @@ -0,0 +1,21 @@ +@namespace: unit_test + +run_prefix string "" + +small_temp real 1.e5 +small_dens real 1.e5 + +# the final time to integrate to +tmax real 1.e-2 + +# first output time -- we will output in nsteps logarithmically spaced steps between [tfirst, tmax] +tfirst real 0.0 + +# number of steps (logarithmically spaced) +nsteps int 100 + +density real 1.e7 + +temperature real 3.e9 + +skip_initial_normalization bool 0 diff --git a/unit_test/jac_cell/ci-benchmarks/jac_cell_aprox13.out b/unit_test/jac_cell/ci-benchmarks/jac_cell_aprox13.out new file mode 100644 index 0000000000..b85220eaee --- /dev/null +++ b/unit_test/jac_cell/ci-benchmarks/jac_cell_aprox13.out @@ -0,0 +1,214 @@ +Initializing AMReX (24.07-16-gdcb9cc0383dc)... +AMReX (24.07-16-gdcb9cc0383dc) initialized +starting the single zone burn... +J( 1, 1) = -22.83252156 -22.76871089 +J( 1, 2) = -7074.184809 -7070.885902 +J( 1, 3) = -146332.0024 -146331.961 +J( 1, 4) = -2840218.246 -2840216.758 +J( 1, 5) = -1480087.416 -1480081.685 +J( 1, 6) = -150293.5967 -150288.8284 +J( 1, 7) = -155563.9558 -155558.7711 +J( 1, 8) = -90256.26203 -90254.79555 +J( 1, 9) = -4338.739586 -4338.971348 +J( 1, 10) = -1367.526773 -1364.641738 +J( 1, 11) = -754.4182788 -751.4739669 +J( 1, 12) = -164.8910475 -163.1314012 +J( 1, 13) = 0.177283612 8.045249939e-06 +J( 1, 14) = 2.036804679e-18 2.036804635e-18 + +J( 2, 1) = 22.83252156 22.76871089 +J( 2, 2) = -21223.06355 -21215.80687 +J( 2, 3) = -0.1431906097 0.01577663496 +J( 2, 4) = -0.1527366503 0 +J( 2, 5) = -0.1591006774 0 +J( 2, 6) = -0.1636464111 0 +J( 2, 7) = -0.1670557113 0 +J( 2, 8) = -0.1697073892 0 +J( 2, 9) = -0.1718287316 0 +J( 2, 10) = -0.1735643754 0 +J( 2, 11) = -0.1750107452 0 +J( 2, 12) = -0.1762345965 0 +J( 2, 13) = -0.177283612 0 +J( 2, 14) = -2.036804679e-18 -2.036804635e-18 + +J( 3, 1) = -5.632962675e-25 -5.570411722e-25 +J( 3, 2) = 28286.69277 28286.69277 +J( 3, 3) = -585327.8861 -585327.8861 +J( 3, 4) = 6128.217777 6128.217777 +J( 3, 5) = -1.739488553e-26 0 +J( 3, 6) = -1.789188226e-26 0 +J( 3, 7) = -1.826462981e-26 0 +J( 3, 8) = -1.855454457e-26 0 +J( 3, 9) = -1.878647638e-26 0 +J( 3, 10) = -1.897623876e-26 0 +J( 3, 11) = -1.913437409e-26 0 +J( 3, 12) = -1.92681809e-26 0 +J( 3, 13) = -1.938287245e-26 0 +J( 3, 14) = -2.226890848e-43 -2.226890927e-43 + +J( 4, 1) = -1.366807088e-23 -1.347708423e-23 +J( 4, 2) = 4.753870727e-12 1.2621475e-25 +J( 4, 3) = 731659.8313 731659.8313 +J( 4, 4) = -14216404.34 -14216404.34 +J( 4, 5) = 0.003363940593 0.003363940593 +J( 4, 6) = -1.093051048e-24 0 +J( 4, 7) = -1.115822945e-24 0 +J( 4, 8) = -1.13353442e-24 0 +J( 4, 9) = -1.1477036e-24 0 +J( 4, 10) = -1.159296566e-24 0 +J( 4, 11) = -1.168957371e-24 0 +J( 4, 12) = -1.177131898e-24 0 +J( 4, 13) = -1.184138635e-24 0 +J( 4, 14) = -1.360452377e-41 -1.360452352e-41 + +J( 5, 1) = 8.302657095e-24 8.170002764e-24 +J( 5, 2) = 3.153014201e-25 1.88760336e-28 +J( 5, 3) = 3.547140976e-25 1.88760336e-28 +J( 5, 4) = 17050492.88 17050492.88 +J( 5, 5) = -8880490.115 -8880490.115 +J( 5, 6) = 0.0001669112793 0.0001669112793 +J( 5, 7) = -5.810350496e-23 0 +J( 5, 8) = -5.809693618e-23 0 +J( 5, 9) = -5.809168116e-23 0 +J( 5, 10) = -5.808738159e-23 0 +J( 5, 11) = -5.808379862e-23 0 +J( 5, 12) = -5.808076688e-23 0 +J( 5, 13) = -5.807816824e-23 0 +J( 5, 14) = 5.045605543e-42 5.045605749e-42 + +J( 6, 1) = 9.417373366e-24 9.308549997e-24 +J( 6, 2) = 7.540626412e-25 2.20220392e-28 +J( 6, 3) = 6.930014139e-18 2.204043829e-28 +J( 6, 4) = 5.942221324e-23 0 +J( 6, 5) = 10360571.8 10360571.8 +J( 6, 6) = -1052021.799 -1052021.799 +J( 6, 7) = 2.618223472 2.618223472 +J( 6, 8) = 5.952275493e-23 0 +J( 6, 9) = 5.953532264e-23 0 +J( 6, 10) = 5.954560531e-23 0 +J( 6, 11) = 5.955417421e-23 0 +J( 6, 12) = 5.956142481e-23 0 +J( 6, 13) = 5.956763961e-23 0 +J( 6, 14) = 1.206687442e-41 1.206687398e-41 + +J( 7, 1) = -4.433213398e-26 -4.216253314e-26 +J( 7, 2) = -1.713032535e-26 0 +J( 7, 3) = 9.755839735e-19 2.590167837e-32 +J( 7, 4) = -2.055639042e-26 0 +J( 7, 5) = -2.141290668e-26 0 +J( 7, 6) = 1202310.628 1202310.628 +J( 7, 7) = -1244476.153 -1244476.153 +J( 7, 8) = 10.56270301 10.56270301 +J( 7, 9) = -2.312593922e-26 0 +J( 7, 10) = -2.335953456e-26 0 +J( 7, 11) = -2.355419735e-26 0 +J( 7, 12) = -2.371891202e-26 0 +J( 7, 13) = -2.386009602e-26 0 +J( 7, 14) = -2.741277362e-43 -2.741278343e-43 + +J( 8, 1) = 5.935462112e-25 5.877272628e-25 +J( 8, 2) = 4.909905946e-26 0 +J( 8, 3) = 5.523644189e-26 0 +J( 8, 4) = 5.891887135e-26 0 +J( 8, 5) = 6.137382433e-26 0 +J( 8, 6) = 6.312736216e-26 0 +J( 8, 7) = 1400032.306 1400032.306 +J( 8, 8) = -812316.926 -812316.926 +J( 8, 9) = 1.524756764 1.524756764 +J( 8, 10) = 6.69532629e-26 0 +J( 8, 11) = 6.751120676e-26 0 +J( 8, 12) = 6.79833131e-26 0 +J( 8, 13) = 6.838797568e-26 0 +J( 8, 14) = 7.857068531e-43 7.857069044e-43 + +J( 9, 1) = 8.75876269e-25 8.591697512e-25 +J( 9, 2) = 1.000399222e-25 0 +J( 9, 3) = 1.125449125e-25 0 +J( 9, 4) = 1.200479066e-25 0 +J( 9, 5) = 1.250499028e-25 0 +J( 9, 6) = 1.286227571e-25 0 +J( 9, 7) = 1.313023979e-25 0 +J( 9, 8) = 902561.1588 902561.1588 +J( 9, 9) = -43393.10183 -43393.10183 +J( 9, 10) = 136.1591093 136.1591093 +J( 9, 11) = 1.37554893e-25 0 +J( 9, 12) = 1.385168154e-25 0 +J( 9, 13) = 1.393413202e-25 0 +J( 9, 14) = 1.600887132e-42 1.600887039e-42 + +J( 10, 1) = 3.341465689e-26 3.256971428e-26 +J( 10, 2) = 3.653921958e-27 0 +J( 10, 3) = 4.110662202e-27 0 +J( 10, 4) = 4.384706349e-27 0 +J( 10, 5) = 4.567402447e-27 0 +J( 10, 6) = 4.69789966e-27 0 +J( 10, 7) = 4.79577257e-27 0 +J( 10, 8) = 4.871895944e-27 0 +J( 10, 9) = 47730.54842 47730.54842 +J( 10, 10) = -15310.60916 -15310.60916 +J( 10, 11) = 0.002383888334 0.002383888334 +J( 10, 12) = 5.059276557e-27 0 +J( 10, 13) = 5.089391298e-27 0 +J( 10, 14) = 5.847182318e-44 5.847181188e-44 + +J( 11, 1) = 7.727968776e-27 7.52140159e-27 +J( 11, 2) = 1.166347238e-27 0 +J( 11, 3) = 1.312140643e-27 0 +J( 11, 4) = 1.399616686e-27 0 +J( 11, 5) = 1.457934048e-27 0 +J( 11, 6) = 1.499589306e-27 0 +J( 11, 7) = 1.53083075e-27 0 +J( 11, 8) = 1.555129651e-27 0 +J( 11, 9) = 1.574568772e-27 0 +J( 11, 10) = 16539.09179 16539.09179 +J( 11, 11) = -9017.692804 -9017.692804 +J( 11, 12) = 0.000548515294 0.000548515294 +J( 11, 13) = 1.624555082e-27 0 +J( 11, 14) = 1.866445159e-44 1.866444877e-44 + +J( 12, 1) = 7.899733031e-27 7.648455578e-27 +J( 12, 2) = 1.384355059e-27 0 +J( 12, 3) = 1.557399442e-27 0 +J( 12, 4) = 1.661226071e-27 0 +J( 12, 5) = 1.730443824e-27 0 +J( 12, 6) = 1.779885076e-27 0 +J( 12, 7) = 1.816966015e-27 0 +J( 12, 8) = 1.845806746e-27 0 +J( 12, 9) = 1.86887933e-27 0 +J( 12, 10) = 1.887756899e-27 0 +J( 12, 11) = 9769.164387 9769.164387 +J( 12, 12) = -2120.709403 -2120.709403 +J( 12, 13) = 0.0001045882492 0.0001045882492 +J( 12, 14) = 2.215311799e-44 2.215311465e-44 + +J( 13, 1) = 2.36704737e-27 2.283840256e-27 +J( 13, 2) = 4.518871185e-28 0 +J( 13, 3) = 5.083730083e-28 0 +J( 13, 4) = 5.422645422e-28 0 +J( 13, 5) = 5.648588981e-28 0 +J( 13, 6) = 5.809977238e-28 0 +J( 13, 7) = 5.93101843e-28 0 +J( 13, 8) = 6.02516158e-28 0 +J( 13, 9) = 6.1004761e-28 0 +J( 13, 10) = 6.16209707e-28 0 +J( 13, 11) = 6.213447879e-28 0 +J( 13, 12) = 2283.840256 2283.840256 +J( 13, 13) = -0.0001126334991 -0.0001126334991 +J( 13, 14) = 7.231315828e-45 7.231315425e-45 + +J( 14, 1) = 1.335535433e+19 1.331810907e+19 +J( 14, 2) = 1.672678172e+22 1.221628179e+22 +J( 14, 3) = 1.764169333e+23 1.669883326e+23 +J( 14, 4) = 6.38519349e+24 6.382691446e+24 +J( 14, 5) = 3.575435081e+24 3.56443165e+24 +J( 14, 6) = 2.522960852e+23 2.518972785e+23 +J( 14, 7) = 2.567887496e+23 2.492143743e+23 +J( 14, 8) = 1.63734141e+23 1.532779936e+23 +J( 14, 9) = 1.46197563e+22 5.363178614e+21 +J( 14, 10) = 1.41303877e+22 2.541660459e+21 +J( 14, 11) = 7.680250114e+21 1.43978686e+21 +J( 14, 12) = 6.72190453e+21 3.147552442e+20 +J( 14, 13) = -1.03705583e+17 -1.56260658e+13 +J( 14, 14) = -1.191469501 -1.191474366 + +AMReX (24.07-16-gdcb9cc0383dc) finalized diff --git a/unit_test/jac_cell/inputs_aprox13 b/unit_test/jac_cell/inputs_aprox13 new file mode 100644 index 0000000000..5e138fc92d --- /dev/null +++ b/unit_test/jac_cell/inputs_aprox13 @@ -0,0 +1,38 @@ +unit_test.run_prefix = "react_aprox13_" + +unit_test.small_temp = 1.e5 +unit_test.small_dens = 1.e5 + +integrator.burner_verbose = 0 + +# Set which jacobian to use +# 1 = analytic jacobian +# 2 = numerical jacobian + +integrator.jacobian = 2 + +integrator.renormalize_abundances = 0 + +integrator.rtol_spec = 1.0e-6 +integrator.rtol_enuc = 1.0e-6 +integrator.atol_spec = 1.0e-6 +integrator.atol_enuc = 1.0e-6 + +unit_test.tmax = 1.e-2 + +unit_test.density = 1.e6 +unit_test.temperature = 3.e9 + +unit_test.X1 = 1.0 +unit_test.X2 = 0.0 +unit_test.X3 = 0.0 +unit_test.X4 = 0.0 +unit_test.X5 = 0.0 +unit_test.X6 = 0.0 +unit_test.X7 = 0.0 +unit_test.X8 = 0.0 +unit_test.X9 = 0.0 +unit_test.X10 = 0.0 +unit_test.X11 = 0.0 +unit_test.X12 = 0.0 +unit_test.X13 = 0.0 diff --git a/unit_test/jac_cell/jac_cell.H b/unit_test/jac_cell/jac_cell.H new file mode 100644 index 0000000000..fd49859883 --- /dev/null +++ b/unit_test/jac_cell/jac_cell.H @@ -0,0 +1,79 @@ +#ifndef BURN_CELL_H +#define BURN_CELL_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace unit_test_rp; + +AMREX_INLINE +void jac_cell_c() +{ + + amrex::Real massfractions[NumSpec] = {-1.0}; + + // Make sure user set all the mass fractions to values in the interval [0, 1] + for (int n = 1; n <= NumSpec; ++n) { + + massfractions[n-1] = get_xn(n); + + 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]!"); + } + + } + + burn_t burn_state; + + burn_state.rho = density; + burn_state.T = temperature; + for (int n = 0; n < NumSpec; ++n) { + burn_state.xn[n] = massfractions[n]; + } + + normalize_abundances_burn(burn_state); + + // get the energy + + eos(eos_input_rt, burn_state); + + JacNetArray2D jac_analytic; + JacNetArray2D jac_numerical; + + actual_jac(burn_state, jac_analytic); + + // we need to convert this to be in terms of X instead of Y + + for (int j = 1; j <= NumSpec; ++j) { + for (int i = 1; i <= neqs; ++i) { + jac_analytic(j, i) *= aion[j-1]; + jac_analytic(i, j) *= aion_inv[j-1]; + } + } + + jac_info_t jac_info; + jac_info.h = 1.e-5_rt; // timestep really doesn't make sense here + + numerical_jac(burn_state, jac_info, jac_numerical); + + // output + + for (int ii = 1; ii <= neqs; ++ii) { + for (int jj = 1; jj <= neqs; ++jj) { + std::cout << "J(" << std::setw(3) << ii << ", " << std::setw(3) << jj << ") = " + << std::setw(20) << jac_numerical(ii,jj) << " " + << std::setw(20) << jac_analytic(ii,jj) << std::endl; + } + std::cout << std::endl; + } + + +} +#endif diff --git a/unit_test/jac_cell/main.cpp b/unit_test/jac_cell/main.cpp new file mode 100644 index 0000000000..692a38d8f9 --- /dev/null +++ b/unit_test/jac_cell/main.cpp @@ -0,0 +1,28 @@ +#include + +#include +#include +#include +#include +#include + +using namespace unit_test_rp; + +int main(int argc, char *argv[]) { + + amrex::Initialize(argc, argv); + + std::cout << "starting the single zone burn..." << std::endl; + + init_unit_test(); + + // C++ EOS initialization (must be done after Fortran eos_init and init_extern_parameters) + eos_init(small_temp, small_dens); + + // C++ Network, RHS, screening, rates initialization + network_init(); + + jac_cell_c(); + + amrex::Finalize(); +} From 997a42627d1df73afb25199fdfc58ece3657f981 Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Thu, 25 Jul 2024 11:19:43 -0400 Subject: [PATCH 25/33] more network documentation (#1628) this removes some deleted networks and adds in some new ones --- networks/ECSN/ecsn_network_generation.py | 8 +- sphinx_docs/source/CNO_He_burn.png | Bin 0 -> 114151 bytes sphinx_docs/source/ECSN.png | Bin 0 -> 54118 bytes sphinx_docs/source/cno_extras_hide_alpha.png | Bin 0 -> 85600 bytes sphinx_docs/source/networks.rst | 169 +++++++++++-------- sphinx_docs/source/nova.png | Bin 0 -> 47467 bytes sphinx_docs/source/nova2.png | Bin 0 -> 63679 bytes sphinx_docs/source/subch_approx.png | Bin 92928 -> 0 bytes sphinx_docs/source/subch_full.png | Bin 101336 -> 0 bytes 9 files changed, 109 insertions(+), 68 deletions(-) create mode 100644 sphinx_docs/source/CNO_He_burn.png create mode 100644 sphinx_docs/source/ECSN.png create mode 100644 sphinx_docs/source/cno_extras_hide_alpha.png create mode 100644 sphinx_docs/source/nova.png create mode 100644 sphinx_docs/source/nova2.png delete mode 100644 sphinx_docs/source/subch_approx.png delete mode 100644 sphinx_docs/source/subch_full.png diff --git a/networks/ECSN/ecsn_network_generation.py b/networks/ECSN/ecsn_network_generation.py index c9f7fd97df..2a1a7e766b 100644 --- a/networks/ECSN/ecsn_network_generation.py +++ b/networks/ECSN/ecsn_network_generation.py @@ -29,10 +29,16 @@ # Only select the rates which are >= 1.e-20 at 1.e9 K and 7.e9 g/cm3 # Do not select weak rates from "20180319default2" new_rate_list = [] -ydots = rc.evaluate_rates(rho=7.e9, T=1.e9, composition=comp) +rho = 7.e9 +T = 1.e9 +ydots = rc.evaluate_rates(rho=rho, T=T, composition=comp) for rate in rc.rates: if ydots[rate] >= 1.e-20 and rate.weak == False: new_rate_list.append(rate) wd_net = AmrexAstroCxxNetwork(rates=new_rate_list, rate_files=escn_tabular) wd_net.write_network() + +wd_net.plot(rho, T, comp, outfile="ECSN.png", + hide_xalpha=True, curved_edges=True, + node_size=500, node_font_size=11, node_color="#337dff", node_shape="s") diff --git a/sphinx_docs/source/CNO_He_burn.png b/sphinx_docs/source/CNO_He_burn.png new file mode 100644 index 0000000000000000000000000000000000000000..24c454e17c45b28b699c5ba4e65ee219d0a453b0 GIT binary patch literal 114151 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