From ec07beb2a6d3c35bcd00cfd43051e93fc62b82fd Mon Sep 17 00:00:00 2001 From: "Eric T. Johnson" Date: Wed, 17 Jul 2024 12:01:11 -0400 Subject: [PATCH 01/12] Template tf_t and rate_t on dual_t --- interfaces/rhs_type.H | 14 ++--- interfaces/tfactors.H | 142 ++++++++++++++++++++++-------------------- 2 files changed, 80 insertions(+), 76 deletions(-) diff --git a/interfaces/rhs_type.H b/interfaces/rhs_type.H index d0af2a2c35..dcc0118cbb 100644 --- a/interfaces/rhs_type.H +++ b/interfaces/rhs_type.H @@ -95,12 +95,13 @@ struct rate_tab_t } }; -// dual_t is currently only used in the screening routines -template +// dual_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; + dual_t fr; + dual_t rr; }; } // namespace RHS diff --git a/interfaces/tfactors.H b/interfaces/tfactors.H index ba54d9eef2..75a3b9316d 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; + dual_t temp; + dual_t t9; + dual_t t92; + dual_t t93; + // dual_t t94; + dual_t t95; + // dual_t t96; + dual_t t912; + dual_t t932; + dual_t t952; + dual_t t972; + dual_t t913; + dual_t t923; + dual_t t943; + dual_t t953; + // dual_t t973; + // dual_t t9113; + // dual_t t914; + // dual_t t934; + // dual_t t954; + // dual_t t974; + // dual_t t915; + // dual_t t935; + // dual_t t945; + // dual_t t965; + // dual_t t917; + // dual_t t927; + // dual_t t947; + // dual_t t918; + // dual_t t938; + // dual_t t958; + dual_t t9i; + dual_t t9i2; + // dual_t t9i3; + dual_t t9i12; + dual_t t9i32; + // dual_t t9i52; + // dual_t t9i72; + dual_t t9i13; + dual_t t9i23; + dual_t t9i43; + dual_t t9i53; + // dual_t t9i14; + // dual_t t9i34; + // dual_t t9i54; + // dual_t t9i15; + // dual_t t9i35; + // dual_t t9i45; + // dual_t t9i65; + // dual_t t9i17; + // dual_t t9i27; + // dual_t t9i47; + // dual_t t9i18; + // dual_t t9i38; + // dual_t t9i58; + // dual_t t916; + // dual_t t976; + // dual_t t9i76; + dual_t lnt9; }; +template AMREX_GPU_HOST_DEVICE inline -tf_t get_tfactors(amrex::Real temp) +tf_t get_tfactors(dual_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; } From 8cc40133fec7d6d5f242195f57f250c64d000240 Mon Sep 17 00:00:00 2001 From: "Eric T. Johnson" Date: Wed, 17 Jul 2024 12:18:04 -0400 Subject: [PATCH 02/12] Update rhs.H to use templated rate_t --- networks/rhs.H | 156 ++++++++++++++++++++--------------------------- networks/rhs.cpp | 3 +- 2 files changed, 67 insertions(+), 92 deletions(-) diff --git a/networks/rhs.H b/networks/rhs.H index 26e3c096e1..1608c40848 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 dual_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 dual_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 dual_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 dual_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 dual_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 From e866293e057d19a2214440bbbcd1e6003e9ddb95 Mon Sep 17 00:00:00 2001 From: "Eric T. Johnson" Date: Wed, 17 Jul 2024 12:23:47 -0400 Subject: [PATCH 03/12] Update aprox_rates.H and test_aprox_rates --- rates/aprox_rates.H | 1843 ++++++----------- .../test_aprox_rates/aprox_rates_util.cpp | 548 ++--- 2 files changed, 856 insertions(+), 1535 deletions(-) diff --git a/rates/aprox_rates.H b/rates/aprox_rates.H index 8f2db09354..d8f3a5c53d 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, dual_t& fr, dual_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 * + const dual_t term_a1_nr = admath::exp(a1_nr*tf.t9i); + const dual_t term_a2_nr = admath::exp(a2_nr*tf.t9i13); + const dual_t term_a3_nr = admath::exp(a3_nr*tf.t913); + const dual_t term_a4_nr = admath::exp(a4_nr*tf.t9); + const dual_t term_a5_nr = admath::exp(a5_nr*tf.t953); + const dual_t term_a6_nr = admath::pow(tf.t9,a6_nr); + + const dual_t 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); - // 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 * + const dual_t term_a1_r = admath::exp(a1_r*tf.t9i); + const dual_t term_a2_r = admath::exp(a2_r*tf.t9i13); + const dual_t term_a3_r = admath::exp(a3_r*tf.t913); + const dual_t term_a4_r = admath::exp(a4_r*tf.t9); + const dual_t term_a5_r = admath::exp(a5_r*tf.t953); + const dual_t term_a6_r = admath::pow(tf.t9,a6_r); + + const dual_t term_r = term_a0_r * term_a1_r * term_a2_r * term_a3_r * term_a4_r * term_a5_r * term_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); - // 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 dual_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 dual_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 dual_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 dual_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 dual_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 dual_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 dual_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 dual_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 dual_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 dual_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; + dual_t zz = 1.0e0_rt/bb; + const dual_t f1 = cc*zz; zz = 1.0e0_rt/ee; - const amrex::Real f2 = ff*zz; - const amrex::Real df2 = (dff - f2*dee)*zz; + const dual_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; + dual_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 dual_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, dual_t& fr, dual_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 dual_t aa = 7.40e5_rt * tf.t9i32 * admath::exp(-1.0663_rt*tf.t9i); + const dual_t bb = 4.164e9_rt * tf.t9i23 * admath::exp(-13.49_rt*tf.t9i13 - tf.t92*q1); + const dual_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 dual_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 dual_t dd = 130.0e0_rt * tf.t9i32 * admath::exp(-3.3364_rt*tf.t9i); + const dual_t ee = 2.510e7_rt * tf.t9i23 * admath::exp(-23.57_rt*tf.t9i13 - tf.t92*q2); + const dual_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 dual_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 dual_t xx = rc28 * 1.35e-07_rt * tf.t9i32 * admath::exp(-24.811_rt*tf.t9i); - amrex::Real term, dtermdt; + dual_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 dual_t uu = 0.8e0_rt*admath::exp(-admath::pow(0.025_rt*tf.t9i,3.263_rt)); + const dual_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 dual_t vv = 4.0e0_rt*admath::exp(-admath::pow(tf.t9/0.025_rt, 9.227_rt)); + const dual_t zz = 1.0e0_rt + vv; + const dual_t zzinv = 1.0e0_rt/zz; + const dual_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 dual_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, dual_t& fr, dual_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 dual_t aa = 1.0e0_rt + 0.0396_rt*tf.t9; + const dual_t zz = 1.0e0_rt/aa; + const dual_t t9a = tf.t9*zz; + const dual_t t9a13 = admath::cbrt(t9a); + const dual_t t9a56 = admath::pow(t9a,5.0_rt/6.0_rt); + const dual_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, dual_t& fr, dual_t& rr) { // c12 + o16 reaction; see cf88 references 47-4 - amrex::Real term, dtermdt; + dual_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; - + dual_t aa = 1.0e0_rt + 0.055_rt*tf.t9; + dual_t zz = 1.0e0_rt/aa; + dual_t t9a = tf.t9*zz; + dual_t t9a13 = admath::cbrt(t9a); + dual_t t9a23 = t9a13*t9a13; + dual_t t9a56 = admath::pow(t9a,5.0_rt/6.0_rt); + + aa = admath::exp(-0.18_rt*t9a*t9a); + dual_t bb = 1.06e-03_rt*admath::exp(2.562_rt*t9a23); + dual_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, dual_t& fr, dual_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 - - 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); + const dual_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.t92); // 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, dual_t& fr, dual_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 dual_t term1 = 9.37e9_rt * tf.t9i23 * admath::exp(-39.757_rt*tf.t9i13 - tf.t92*q1); - 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 dual_t aa = 62.1_rt * tf.t9i32 * admath::exp(-10.297_rt*tf.t9i); + const dual_t bb = 538.0e0_rt * tf.t9i32 * admath::exp(-12.226_rt*tf.t9i); + const dual_t cc = 13.0e0_rt * tf.t92 * admath::exp(-20.093_rt*tf.t9i); + const dual_t term2 = aa + bb + cc; - const amrex::Real term2 = aa + bb + cc; - const amrex::Real dterm2 = daa + dbb + dcc; - - const amrex::Real term = term1 + term2; - const amrex::Real dtermdt = dterm1 + dterm2; + const dual_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 dual_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, dual_t& fr, dual_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 + dual_t aa = 4.11e11_rt * tf.t9i23 * admath::exp(-46.766_rt*tf.t9i13 - tf.t92*q1); + dual_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 dual_t term1 = aa * bb; - const amrex::Real term2 = aa + bb; - const amrex::Real dterm2 = daa + dbb; + 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 dual_t term2 = 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); - - 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 dual_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 dual_t zz = 1.0e0_rt/bb; + const dual_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 dual_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, dual_t& fr, dual_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 dual_t aa = 4.78e1_rt * tf.t9i32 * admath::exp(-13.506_rt*tf.t9i); + const dual_t bb = 2.38e3_rt * tf.t9i32 * admath::exp(-15.218_rt*tf.t9i); + const dual_t cc = 2.47e2_rt * tf.t932 * admath::exp(-15.147_rt*tf.t9i); + const dual_t dd = rc121 * 1.72e-09_rt * tf.t9i32 * admath::exp(-5.028_rt*tf.t9i); + const dual_t ee = rc121* 1.25e-03_rt * tf.t9i32 * admath::exp(-7.929_rt*tf.t9i); + const dual_t ff = rc121 * 2.43e1_rt * tf.t9i * admath::exp(-11.523_rt*tf.t9i); + + const dual_t gg = 5.0e0_rt*admath::exp(-15.882_rt*tf.t9i); + const dual_t hh = 1.0e0_rt + gg; + const dual_t hhi = 1.0e0_rt/hh; + const dual_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 dual_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, dual_t& fr, dual_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 + dual_t aa = 1.10e8_rt * tf.t9i23 * admath::exp(-23.261_rt*tf.t9i13 - tf.t92*q1); + dual_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 dual_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 dual_t cc = rc148 * 3.89e-08_rt * tf.t9i32 * admath::exp(-0.853_rt*tf.t9i); + const dual_t dd = rc148 * 8.18e-09_rt * tf.t9i32 * admath::exp(-1.001_rt*tf.t9i); + const dual_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 dual_t ee = 1.0_rt/3.0_rt*admath::exp(-9.792_rt*tf.t9i); + const dual_t ff = 2.0_rt/3.0_rt * admath::exp(-11.773_rt*tf.t9i); + const dual_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 dual_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 dual_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, dual_t& fr, dual_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 dual_t aa = 1.32e9_rt * tf.t9i23 * admath::exp(-23.26_rt*tf.t9i13); + const dual_t bb = autodiff::eval(3.22e-10_rt * tf.t9i32 * admath::exp(-0.836_rt*tf.t9i))*0.17_rt; + const dual_t cc = 1.74e0_rt * tf.t9i32 * admath::exp(-2.269_rt*tf.t9i); + const dual_t dd = 9.92e0_rt * tf.t9i32 * admath::exp(-2.492_rt*tf.t9i); + const dual_t ee = 4.29e1_rt * tf.t9i32 * admath::exp(-3.273_rt*tf.t9i); + const dual_t ff = 1.34e2_rt * tf.t9i32 * admath::exp(-3.654_rt*tf.t9i); + const dual_t gg = 1.77e4_rt * admath::pow(tf.t9,0.53_rt) * admath::exp(-4.588_rt*tf.t9i); + const dual_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 dual_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, dual_t& fr, dual_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 dual_t aa = 1.67e8_rt * tf.t9i23 * admath::exp(-23.261_rt*tf.t9i13 - tf.t92*q1); + const dual_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 dual_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 dual_t dd = 2.20e0_rt * tf.t9i32 * admath::exp(-2.269_rt*tf.t9i); + const dual_t ee = 1.22e1_rt * tf.t9i32 * admath::exp(-2.491_rt*tf.t9i); + const dual_t ff = 1.50e4_rt * tf.t9 * admath::exp(-4.112_rt*tf.t9i); + const dual_t gg = rc147 * 6.50e-10_rt * tf.t9i32 * admath::exp(-0.853_rt*tf.t9i); + const dual_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 dual_t xx = 1.0_rt/3.0_rt*admath::exp(-9.792_rt*tf.t9i); + const dual_t yy = 2.0_rt/3.0_rt * admath::exp(-11.773_rt*tf.t9i); + const dual_t zz = 1.0e0_rt + xx + yy; + const dual_t pp = 1.0e0_rt/zz; + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 6.340e-2_rt*z + 2.541e-3_rt*z2 - 2.900e-4_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 2.798e-3_rt*z + 2.763e-3_rt*z2 - 2.341e-4_rt*z3; + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 1.928e-1_rt*z - 1.540e-2_rt*z2 + 6.444e-4_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 4.913e-2_rt*z + 4.637e-3_rt*z2 - 4.067e-4_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 1.041e-1_rt*z - 1.368e-2_rt*z2 + 6.969e-4_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_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 dual_t aa = 1.0e0_rt + 1.761e-1_rt*tf.t9 - 1.322e-2_rt*tf.t92 + 5.245e-4_rt*tf.t93; + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 1.458e-1_rt*z - 1.069e-2_rt*z2 + 3.790e-4_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 4.826e-3_rt*z - 5.534e-3_rt*z2 + 4.021e-4_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 1.622e-1_rt*z - 1.119e-2_rt*z2 + 3.910e-4_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 1.650e-2_rt*z + 5.973e-3_rt*z2 - 3.889e-04_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt - 1.206e-2_rt*z + 7.753e-3_rt*z2 - 5.071e-4_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 1.023e-1_rt*z - 2.242e-3_rt*z2 - 5.463e-5_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 1.066e-1_rt*z - 1.102e-2_rt*z2 + 5.324e-4_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 2.655e-2_rt*z - 3.947e-3_rt*z2 + 2.522e-4_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 9.979e-2_rt*z - 2.269e-3_rt*z2 - 6.662e-5_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 6.325e-2_rt*z - 5.671e-3_rt*z2 + 2.848e-4_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 1.384e-2_rt*z + 1.081e-3_rt*z2 - 5.933e-5_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 8.922e-2_rt*z - 1.256e-3_rt*z2 - 9.453e-5_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 7.846e-2_rt*z - 7.430e-3_rt*z2 + 3.723e-4_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 1.367e-2_rt*z + 7.428e-4_rt*z2 - 3.050e-5_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt, tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 9.894e-2_rt*z - 3.131e-3_rt*z2 - 2.160e-5_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_t& rr) { // p(p,e+nu)d - amrex::Real term, dtermdt; + dual_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 dual_t aa = 4.01e-15_rt * tf.t9i23 * admath::exp(-3.380e0_rt*tf.t9i13); + const dual_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, dual_t& fr, dual_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 dual_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 dual_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 dual_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, dual_t& fr, dual_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 dual_t aa = 2.24e3_rt * tf.t9i23 * admath::exp(-3.720_rt*tf.t9i13); + const dual_t bb = 1.0e0_rt + 0.112_rt*tf.t913 + 3.38_rt*tf.t923 + 2.65_rt*tf.t9; + const dual_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 dual_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, dual_t& fr, dual_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 dual_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 dual_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, dual_t& fr, dual_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 dual_t aa = 6.04e10_rt * tf.t9i23 * admath::exp(-12.276_rt*tf.t9i13); + const dual_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 dual_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 dual_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, dual_t& fr, dual_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 dual_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; + dual_t zz = 1.0e0_rt/aa; + const dual_t t9a = tf.t9*zz; + const dual_t t9a13 = admath::cbrt(t9a); + const dual_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 dual_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 dual_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, dual_t& fr, dual_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 dual_t aa = 2.04e7_rt * tf.t9i23 * admath::exp(-13.69_rt*tf.t9i13 - tf.t92*q1); + const dual_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 dual_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 dual_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 dual_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 dual_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 dual_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, dual_t& fr, dual_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 dual_t aa = 4.90e7_rt * tf.t9i23 * admath::exp(-15.228_rt*tf.t9i13 - tf.t92*q1); + const dual_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 dual_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 dual_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 dual_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 dual_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 dual_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, dual_t& fr, dual_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 dual_t aa = 9.78e8_rt * tf.t9i23 * admath::exp(-15.251_rt*tf.t9i13 - tf.t92*q1); + const dual_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 dual_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 dual_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 dual_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 dual_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 dual_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 dual_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, dual_t& fr, dual_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 dual_t aa = 1.08e12_rt*tf.t9i23*admath::exp(-15.251_rt*tf.t9i13 - tf.t92*q1); + const dual_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 dual_t cc = aa * bb; - const amrex::Real cc = aa * bb; - const amrex::Real dcc = daa*bb + aa*dbb; + const dual_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 dual_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 dual_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 dual_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 dual_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 dual_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, dual_t& fr, dual_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 dual_t aa = admath::exp(-0.728_rt*tf.t923); + const dual_t bb = 1.0e0_rt + 2.13_rt * (1.0e0_rt - aa); + const dual_t cc = tf.t923 * bb; + const dual_t dd = admath::exp(-16.692_rt*tf.t9i13); + const dual_t zz = 1.0e0_rt/cc; + const dual_t ee = dd*zz; + const dual_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 dual_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, dual_t& fr, dual_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 dual_t aa = 7.78e9_rt * tf.t9i23 * admath::exp(-36.031_rt*tf.t9i13- tf.t92*q1); + const dual_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 dual_t cc = aa * bb; - const amrex::Real cc = aa * bb; - const amrex::Real dcc = daa*bb + aa*dbb; + const dual_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 dual_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 dual_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 dual_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 dual_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, dual_t& fr, dual_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 dual_t tq2 = tf.t9 - 0.348e0_rt; + const dual_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 dual_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, dual_t& fr, dual_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 dual_t tq1 = tf.t9/0.348_rt; + const dual_t tq10 = admath::pow(tq1, 0.10_rt); + const dual_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 dual_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 dual_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, dual_t& fr, dual_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 dual_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; + dual_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 dual_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, dual_t& fr, dual_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 dual_t z = admath::min(10.0e0_rt,tf.t9); + const dual_t z2 = z*z; + const dual_t z3 = z2*z; + const dual_t aa = 1.0e0_rt + 9.593e-2_rt*z - 3.445e-3_rt*z2 + 8.594e-5_rt*z3; + + const dual_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 dual_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, dual_t& fr, dual_t& rr) { // fe54(a,p)co57 - const amrex::Real aa = 3.97474900e1_rt - 6.06543100e0_rt * tf.t9i + 1.63239600e2_rt * tf.t9i13 + const dual_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; + dual_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 dual_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, dual_t& fr, dual_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 dual_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; + dual_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 dual_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, dual_t& fr, dual_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; + dual_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 dual_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/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); }); } From 98c70e14bed6f6780c7504d452f6a8c28eaff927 Mon Sep 17 00:00:00 2001 From: "Eric T. Johnson" Date: Wed, 17 Jul 2024 12:30:12 -0400 Subject: [PATCH 04/12] Update networks that use aprox_rates.H --- networks/aprox13/actual_network.H | 101 +++--- networks/aprox19/actual_network.H | 248 ++++++-------- networks/aprox21/actual_network.H | 303 ++++++++---------- networks/ignition_simple/actual_network.H | 9 +- networks/iso7/actual_network.H | 46 ++- .../triple_alpha_plus_cago/actual_network.H | 11 +- 6 files changed, 298 insertions(+), 420 deletions(-) diff --git a/networks/aprox13/actual_network.H b/networks/aprox13/actual_network.H index b4f97034d9..3fe260bf42 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; + dual_t rate_ir = 0.0e0_rt; + dual_t denom = rates1.rr + rates2.fr; if (denom > 1.0e-30_rt) { - amrex::Real zz = 1.0_rt / denom; + dual_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; + dual_t rate_ir = 0.0e0_rt; + dual_t denom = rates1.rr + rates2.fr; if (denom > 1.0e-30_rt) { - amrex::Real zz = 1.0_rt / denom; + dual_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; + dual_t rate_ir = 0.0e0_rt; + dual_t denom = rates1.rr + rates2.fr; if (denom > 1.0e-30_rt) { - amrex::Real zz = 1.0_rt / denom; + dual_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 97b0b5fc27..f8e887b142 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); + dual_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); + dual_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); + dual_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; + dual_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; + dual_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; + dual_t rate_ir = 0.0e0_rt; + dual_t denom = rates1.rr + rates2.fr; if (denom > 1.0e-30_rt) { - amrex::Real zz = 1.0_rt / denom; + dual_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; + dual_t rate_ir = 0.0e0_rt; + dual_t denom = rates1.rr + rates2.fr; if (denom > 1.0e-30_rt) { - amrex::Real zz = 1.0_rt / denom; + dual_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; + dual_t rate_ir = 0.0e0_rt; + dual_t denom = rates1.rr + rates2.fr; if (denom > 1.0e-30_rt) { - amrex::Real zz = 1.0_rt / denom; + dual_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; + dual_t tot = rates2.fr + rates3.fr; + dual_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; + dual_t tot = rates2.fr + rates3.fr; + dual_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; + dual_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; + dual_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); + dual_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; + dual_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); + dual_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; + dual_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); + dual_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; + dual_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; + dual_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; + dual_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 539aefa2ba..0362453e6d 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); + dual_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); + dual_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); + dual_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; + dual_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; + dual_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; + dual_t rate_ir = 0.0e0_rt; + dual_t denom = rates1.rr + rates2.fr; if (denom > 1.0e-30_rt) { - amrex::Real zz = 1.0_rt / denom; + dual_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; + dual_t rate_ir = 0.0e0_rt; + dual_t denom = rates1.rr + rates2.fr; if (denom > 1.0e-30_rt) { - amrex::Real zz = 1.0_rt / denom; + dual_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; + dual_t rate_ir = 0.0e0_rt; + dual_t denom = rates1.rr + rates2.fr; if (denom > 1.0e-30_rt) { - amrex::Real zz = 1.0_rt / denom; + dual_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; + dual_t tot = rates2.fr + rates3.fr; + dual_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; + dual_t tot = rates2.fr + rates3.fr; + dual_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; + dual_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; + dual_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); + dual_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; + dual_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); + dual_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; + dual_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); + dual_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; + dual_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; + dual_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; + dual_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; + dual_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; + dual_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; + dual_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; + dual_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; } } } @@ -2035,4 +1964,36 @@ namespace RHS { } // namespace RHS +#ifdef AMREX_DEBUG +namespace { +template +AMREX_GPU_HOST_DEVICE +void _lint_aprox21_network_helper() { + using namespace RHS; + rhs_state_t rhs_state{}; + amrex::constexpr_for<1, Rates::NumRates+1>([&] (auto n) + { + constexpr int rate = n; + + rate_t rates{}; + + evaluate_analytical_rate(rhs_state, rates); + + rate_t rates1{}, rates2{}, rates3{}; + + // Perform rate postprocessing, using additional reactions as inputs. + // If there is no postprocessing for this rate, this will be a no-op. + + postprocess_rate(rhs_state, rates, rates1, rates2, rates3); + }); +} +AMREX_GPU_HOST_DEVICE +[[maybe_unused]] void _lint_aprox21_network() { + _lint_aprox21_network_helper(); + _lint_aprox21_network_helper(); + _lint_aprox21_network_helper>(); +} +} +#endif + #endif diff --git a/networks/ignition_simple/actual_network.H b/networks/ignition_simple/actual_network.H index 3c277e68ec..a7d05a9df2 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 a8c8a5b1fe..b078168517 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; + dual_t t992 = state.tf.t972 * state.tf.t9; + dual_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); + dual_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); + dual_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/triple_alpha_plus_cago/actual_network.H b/networks/triple_alpha_plus_cago/actual_network.H index 4b8d1d4fe6..5c5c10cb57 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; From 53ca9a77366550bae56735cf7bac94b60e97edea Mon Sep 17 00:00:00 2001 From: "Eric T. Johnson" Date: Wed, 17 Jul 2024 12:31:25 -0400 Subject: [PATCH 05/12] Update rprox --- networks/rprox/actual_network.H | 97 +++---- networks/rprox/rprox_rates.H | 486 ++++++++++---------------------- 2 files changed, 183 insertions(+), 400 deletions(-) diff --git a/networks/rprox/actual_network.H b/networks/rprox/actual_network.H index 09c7266b8e..9d81b8616a 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); + dual_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); + dual_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); + dual_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); + dual_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..20ee497e8e 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, dual_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); + dual_t ct9i = tfactors.t9i * (-3.77849e0_rt); + dual_t ct9i13 = tfactors.t9i13 * (-5.10735e0_rt); + dual_t ct913 = tfactors.t913 * (-2.24111e0_rt); + dual_t ct9 = tfactors.t9 * (0.148883e0_rt); + dual_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r0 = std::exp(17.5428e0_rt + + dual_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); + dual_t ct953 = tfactors.t953 * (-3.15898e0_rt); clnt9 = tfactors.lnt9 * (-0.666667e0_rt); - amrex::Real r1 = std::exp(17.1482e0_rt + + dual_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, dual_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); + dual_t ct9i = tfactors.t9i * (-6.96583e0_rt); + dual_t ct9i13 = tfactors.t9i13 * (-16.696e0_rt); + dual_t ct913 = tfactors.t913 * (-1.16252e0_rt); + dual_t ct9 = tfactors.t9 * (0.267703e0_rt); + dual_t ct953 = tfactors.t953 * (-0.0338411e0_rt); + dual_t clnt9 = tfactors.lnt9 * (0.833333e0_rt); - amrex::Real r0 = std::exp(40.9135e0_rt + + dual_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, dual_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, dual_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); + dual_t ct9i = tfactors.t9i * (-0.0323504e0_rt); + dual_t ct9i13 = tfactors.t9i13 * (-14.2191e0_rt); + dual_t ct913 = tfactors.t913 * (34.0647e0_rt); + dual_t ct9 = tfactors.t9 * (-16.5698e0_rt); + dual_t ct953 = tfactors.t953 * (2.48116e0_rt); + dual_t clnt9 = tfactors.lnt9 * (-2.13376e0_rt); - amrex::Real r0 = std::exp(-7.84708e0_rt + + dual_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 + + dual_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, dual_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); + dual_t ct9i = tfactors.t9i * (-1.02446e0_rt); + dual_t ct9i13 = tfactors.t9i13 * (-23.57e0_rt); + dual_t ct913 = tfactors.t913 * (20.4886e0_rt); + dual_t ct9 = tfactors.t9 * (-12.9882e0_rt); + dual_t ct953 = tfactors.t953 * (-20.0e0_rt); + dual_t clnt9 = tfactors.lnt9 * (-2.16667e0_rt); - amrex::Real r0 = std::exp(-11.7884e0_rt + + dual_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 + + dual_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 + + dual_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, dual_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); + dual_t ct9i13 = tfactors.t9i13 * (-15.193e0_rt); + dual_t ct913 = tfactors.t913 * (-4.63975e0_rt); + dual_t ct9 = tfactors.t9 * (9.73458e0_rt); + dual_t ct953 = tfactors.t953 * (-9.55051e0_rt); + dual_t clnt9 = tfactors.lnt9 * (0.333333e0_rt); - amrex::Real r0 = std::exp(20.1169e0_rt + + dual_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 + + dual_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); + dual_t ct9i = tfactors.t9i * (-4.891e0_rt); clnt9 = tfactors.lnt9 * (0.0682e0_rt); - amrex::Real r2 = std::exp(6.73578e0_rt + + dual_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 + + dual_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, dual_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); + dual_t ct9i = tfactors.t9i * (-24.7176e0_rt); + dual_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r0 = std::exp(19.4058e0_rt + + dual_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 + + dual_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 + + dual_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 + + dual_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 + + dual_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); + dual_t ct9i13 = tfactors.t9i13 * (-17.7759e0_rt); + dual_t ct913 = tfactors.t913 * (36.0724e0_rt); + dual_t ct9 = tfactors.t9 * (-5.34039e0_rt); + dual_t ct953 = tfactors.t953 * (0.382679e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r5 = std::exp(-13.3392e0_rt + + dual_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 + + dual_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, dual_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, dual_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, dual_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); + dual_t ct9i = tfactors.t9i * (-5.07623e0_rt); + dual_t ct913 = tfactors.t913 * (1.23704e0_rt); + dual_t ct9 = tfactors.t9 * (0.337618e0_rt); + dual_t ct953 = tfactors.t953 * (-0.0562825e0_rt); + dual_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r0 = std::exp(5.63289e0_rt + + dual_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); + dual_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 + + dual_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, dual_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); + dual_t ct9i = tfactors.t9i * (-12.0223e0_rt); + dual_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r0 = std::exp(12.1289e0_rt + + dual_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 + + dual_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); + dual_t ct9i13 = tfactors.t9i13 * (-39.388e0_rt); + dual_t ct913 = tfactors.t913 * (-17.4673e0_rt); + dual_t ct9 = tfactors.t9 * (35.3029e0_rt); + dual_t ct953 = tfactors.t953 * (-24.8162e0_rt); clnt9 = tfactors.lnt9 * (-0.666667e0_rt); - amrex::Real r2 = std::exp(40.8358e0_rt + + dual_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 + + dual_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 + + dual_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 + + dual_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, dual_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, dual_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); + dual_t ct9i = tfactors.t9i * (-5.88439e0_rt); + dual_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r0 = std::exp(-0.0452465e0_rt + + dual_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); + dual_t ct9i13 = tfactors.t9i13 * (-39.578e0_rt); + dual_t ct953 = tfactors.t953 * (-3.0e0_rt); clnt9 = tfactors.lnt9 * (-0.666667e0_rt); - amrex::Real r1 = std::exp(26.2914e0_rt + + dual_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); + dual_t ct913 = tfactors.t913 * (44.4647e0_rt); + dual_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 + + dual_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, dual_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, dual_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); + dual_t ct9i = tfactors.t9i * (-10.3585e0_rt); + dual_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); - amrex::Real r0 = std::exp(3.88571e0_rt + + dual_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); + dual_t ct9i13 = tfactors.t9i13 * (-39.7262e0_rt); + dual_t ct913 = tfactors.t913 * (-0.210799e0_rt); + dual_t ct9 = tfactors.t9 * (0.442879e0_rt); + dual_t ct953 = tfactors.t953 * (-0.0797753e0_rt); clnt9 = tfactors.lnt9 * (-0.666667e0_rt); - amrex::Real r1 = std::exp(23.903e0_rt + + dual_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 + + dual_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, dual_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); + dual_t ct9i13 = tfactors.t9i13 * (-16.696e0_rt); + dual_t ct913 = tfactors.t913 * (-1.16252e0_rt); + dual_t ct9 = tfactors.t9 * (0.267703e0_rt); + dual_t ct953 = tfactors.t953 * (-0.0338411e0_rt); + dual_t clnt9 = tfactors.lnt9 * (-0.666667e0_rt); - amrex::Real r0 = std::exp(19.0904e0_rt + + dual_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, dual_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); + dual_t ct9i13 = tfactors.t9i13 * (-59.3013e0_rt); + dual_t ct913 = tfactors.t913 * (0.480742e0_rt); + dual_t ct9 = tfactors.t9 * (-0.834505e0_rt); + dual_t ct953 = tfactors.t953 * (0.0621841e0_rt); + dual_t clnt9 = tfactors.lnt9 * (-0.666667e0_rt); - amrex::Real r0 = std::exp(48.8732e0_rt + + dual_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, dual_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); + dual_t ct9i = tfactors.t9i * (-9.07869e0_rt); + dual_t ct9i13 = tfactors.t9i13 * (5.56533e0_rt); + dual_t ct913 = tfactors.t913 * (18.4415e0_rt); + dual_t ct9 = tfactors.t9 * (-4.10095e0_rt); + dual_t ct953 = tfactors.t953 * (0.24244e0_rt); + dual_t clnt9 = tfactors.lnt9 * (16.0516e0_rt); - amrex::Real r0 = std::exp(-34.2468e0_rt + + dual_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 From 0d89086d6df213bc47d01747b59ae8be988da4f6 Mon Sep 17 00:00:00 2001 From: "Eric T. Johnson" Date: Wed, 17 Jul 2024 12:31:37 -0400 Subject: [PATCH 06/12] Update the remaining templated networks --- networks/ignition_chamulak/actual_network.H | 26 +++++++-------------- networks/powerlaw/actual_network.H | 8 +++---- 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/networks/ignition_chamulak/actual_network.H b/networks/ignition_chamulak/actual_network.H index f5ee22ac01..897a7edc2e 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; + dual_t T9 = state.tf.t9; + dual_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; + dual_t scratch = admath::cbrt(T9a); - 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; + dual_t a = 4.27e26_rt * admath::pow(T9a, 5.0_rt / 6.0_rt) * admath::pow(T9, -1.5e0_rt); + dual_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/powerlaw/actual_network.H b/networks/powerlaw/actual_network.H index 1fca7a8095..e3de638a24 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. } From 41aef6fa65d154f370e4fe5ceb5909bd7ec51e8b Mon Sep 17 00:00:00 2001 From: "Eric T. Johnson" Date: Wed, 17 Jul 2024 12:47:46 -0400 Subject: [PATCH 07/12] Remove some debugging stuff from aprox21 --- networks/aprox21/actual_network.H | 32 ------------------------------- 1 file changed, 32 deletions(-) diff --git a/networks/aprox21/actual_network.H b/networks/aprox21/actual_network.H index 0362453e6d..de03feda30 100644 --- a/networks/aprox21/actual_network.H +++ b/networks/aprox21/actual_network.H @@ -1964,36 +1964,4 @@ namespace RHS { } // namespace RHS -#ifdef AMREX_DEBUG -namespace { -template -AMREX_GPU_HOST_DEVICE -void _lint_aprox21_network_helper() { - using namespace RHS; - rhs_state_t rhs_state{}; - amrex::constexpr_for<1, Rates::NumRates+1>([&] (auto n) - { - constexpr int rate = n; - - rate_t rates{}; - - evaluate_analytical_rate(rhs_state, rates); - - rate_t rates1{}, rates2{}, rates3{}; - - // Perform rate postprocessing, using additional reactions as inputs. - // If there is no postprocessing for this rate, this will be a no-op. - - postprocess_rate(rhs_state, rates, rates1, rates2, rates3); - }); -} -AMREX_GPU_HOST_DEVICE -[[maybe_unused]] void _lint_aprox21_network() { - _lint_aprox21_network_helper(); - _lint_aprox21_network_helper(); - _lint_aprox21_network_helper>(); -} -} -#endif - #endif From d4173ded5829904df8592b1a20fcdc521e1ff15b Mon Sep 17 00:00:00 2001 From: "Eric T. Johnson" Date: Wed, 17 Jul 2024 13:11:08 -0400 Subject: [PATCH 08/12] Update test_rhs benchmark for powerlaw This wasn't computing any derivatives before. --- unit_test/test_rhs/ci-benchmarks/powerlaw.out | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 ec2c29746739529b03a2108a48686aba065a9f88 Mon Sep 17 00:00:00 2001 From: "Eric T. Johnson" Date: Wed, 17 Jul 2024 16:09:37 -0400 Subject: [PATCH 09/12] Update burn_cell benchmark for ignition_chamulak --- .../ci-benchmarks/chamulak_VODE_unit_test.out | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 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 8de1d8384c..2392f9db86 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.277118955e+17 + - added e = 8.364233544e+15 + - final T = 1433690903 ------------------------------------ e initial = 1.253426044e+18 -e final = 1.261790733e+18 +e final = 1.261790278e+18 ------------------------------------ new mass fractions: -C12 0.9657894806 +C12 0.9657913435 O16 1e-30 -ash 0.03421051942 +ash 0.03420865652 ------------------------------------ species creation rates: -omegadot(C12): -2.158392392 -omegadot(O16): 8.840999775e-44 -omegadot(ash): 2.158392392 +omegadot(C12): -2.158274859 +omegadot(O16): 1.105124972e-43 +omegadot(ash): 2.158274859 number of steps taken: 381 AMReX (24.07-16-gdcb9cc0383dc) finalized From 21f9e71c74160380ff5644515d75b5f2d22c644f Mon Sep 17 00:00:00 2001 From: "Eric T. Johnson" Date: Mon, 22 Jul 2024 23:03:51 -0400 Subject: [PATCH 10/12] Revert some optimizations that were changing results slightly We can restore these later in a separate PR. --- networks/ignition_chamulak/actual_network.H | 2 +- rates/aprox_rates.H | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/networks/ignition_chamulak/actual_network.H b/networks/ignition_chamulak/actual_network.H index 5d45d9fa65..23716fa6fc 100644 --- a/networks/ignition_chamulak/actual_network.H +++ b/networks/ignition_chamulak/actual_network.H @@ -78,7 +78,7 @@ namespace RHS { number_t T9a = T9 / (1.0_rt + 0.0396e0_rt * T9); // compute the CF88 rate - number_t scratch = admath::cbrt(T9a); + number_t scratch = admath::pow(T9a, 1.0_rt / 3.0_rt); 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); diff --git a/rates/aprox_rates.H b/rates/aprox_rates.H index d8f3a5c53d..7f85f25c69 100644 --- a/rates/aprox_rates.H +++ b/rates/aprox_rates.H @@ -285,7 +285,7 @@ void rate_o16o16(const tf_t& tf, const amrex::Real den, dual_t& fr, dual const dual_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.t92); + - 0.445_rt*tf.t943 + 0.0103_rt*tf.t9*tf.t9); // rates fr = den * term; From 350928a819396379702f06ef51c9938801e7ca99 Mon Sep 17 00:00:00 2001 From: "Eric T. Johnson" Date: Mon, 22 Jul 2024 23:20:34 -0400 Subject: [PATCH 11/12] Update ignition_chamulak benchmark The diffs are smaller now. --- .../ci-benchmarks/chamulak_VODE_unit_test.out | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 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 2392f9db86..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.277118955e+17 - - added e = 8.364233544e+15 - - final T = 1433690903 + - Hnuc = 5.277400893e+17 + - added e = 8.364680415e+15 + - final T = 1433712612 ------------------------------------ e initial = 1.253426044e+18 -e final = 1.261790278e+18 +e final = 1.261790725e+18 ------------------------------------ new mass fractions: -C12 0.9657913435 +C12 0.9657895158 O16 1e-30 -ash 0.03420865652 +ash 0.03421048417 ------------------------------------ species creation rates: -omegadot(C12): -2.158274859 -omegadot(O16): 1.105124972e-43 -omegadot(ash): 2.158274859 +omegadot(C12): -2.158390168 +omegadot(O16): 8.840999775e-44 +omegadot(ash): 2.158390168 number of steps taken: 381 AMReX (24.07-16-gdcb9cc0383dc) finalized From 3afa5ef141d117394fbfafb3a1b38576e15ebe6f Mon Sep 17 00:00:00 2001 From: "Eric T. Johnson" Date: Mon, 22 Jul 2024 23:22:56 -0400 Subject: [PATCH 12/12] Replace dual_t with number_t in the newly-converted code --- interfaces/tfactors.H | 126 ++--- networks/rprox/rprox_rates.H | 296 ++++++------ rates/aprox_rates.H | 894 +++++++++++++++++------------------ 3 files changed, 658 insertions(+), 658 deletions(-) diff --git a/interfaces/tfactors.H b/interfaces/tfactors.H index 75a3b9316d..8ea11c87fc 100644 --- a/interfaces/tfactors.H +++ b/interfaces/tfactors.H @@ -8,74 +8,74 @@ using namespace amrex::literals; -template +template struct tf_t { - dual_t temp; - dual_t t9; - dual_t t92; - dual_t t93; - // dual_t t94; - dual_t t95; - // dual_t t96; - dual_t t912; - dual_t t932; - dual_t t952; - dual_t t972; - dual_t t913; - dual_t t923; - dual_t t943; - dual_t t953; - // dual_t t973; - // dual_t t9113; - // dual_t t914; - // dual_t t934; - // dual_t t954; - // dual_t t974; - // dual_t t915; - // dual_t t935; - // dual_t t945; - // dual_t t965; - // dual_t t917; - // dual_t t927; - // dual_t t947; - // dual_t t918; - // dual_t t938; - // dual_t t958; - dual_t t9i; - dual_t t9i2; - // dual_t t9i3; - dual_t t9i12; - dual_t t9i32; - // dual_t t9i52; - // dual_t t9i72; - dual_t t9i13; - dual_t t9i23; - dual_t t9i43; - dual_t t9i53; - // dual_t t9i14; - // dual_t t9i34; - // dual_t t9i54; - // dual_t t9i15; - // dual_t t9i35; - // dual_t t9i45; - // dual_t t9i65; - // dual_t t9i17; - // dual_t t9i27; - // dual_t t9i47; - // dual_t t9i18; - // dual_t t9i38; - // dual_t t9i58; - // dual_t t916; - // dual_t t976; - // dual_t t9i76; - dual_t 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 +template AMREX_GPU_HOST_DEVICE inline -tf_t get_tfactors(dual_t temp) +tf_t get_tfactors(number_t temp) { - tf_t tf; + tf_t tf; tf.temp = temp; diff --git a/networks/rprox/rprox_rates.H b/networks/rprox/rprox_rates.H index 20ee497e8e..3b9bd78403 100644 --- a/networks/rprox/rprox_rates.H +++ b/networks/rprox/rprox_rates.H @@ -5,19 +5,19 @@ #include #include -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_p_c12_to_n13 (const tf_t& tfactors, dual_t& rate) +void rate_p_c12_to_n13 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dual_t ct9i = tfactors.t9i * (-3.77849e0_rt); - dual_t ct9i13 = tfactors.t9i13 * (-5.10735e0_rt); - dual_t ct913 = tfactors.t913 * (-2.24111e0_rt); - dual_t ct9 = tfactors.t9 * (0.148883e0_rt); - dual_t 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); - dual_t r0 = admath::exp(17.5428e0_rt + + number_t r0 = admath::exp(17.5428e0_rt + ct9i + ct9i13 + ct913 + @@ -27,10 +27,10 @@ void rate_p_c12_to_n13 (const tf_t& tfactors, dual_t& rate) ct9i13 = tfactors.t9i13 * (-13.692e0_rt); ct913 = tfactors.t913 * (-0.230881e0_rt); ct9 = tfactors.t9 * (4.44362e0_rt); - dual_t ct953 = tfactors.t953 * (-3.15898e0_rt); + number_t ct953 = tfactors.t953 * (-3.15898e0_rt); clnt9 = tfactors.lnt9 * (-0.666667e0_rt); - dual_t r1 = admath::exp(17.1482e0_rt + + number_t r1 = admath::exp(17.1482e0_rt + ct9i13 + ct913 + ct9 + @@ -41,20 +41,20 @@ void rate_p_c12_to_n13 (const tf_t& tfactors, dual_t& rate) } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_f17_to_p_o16 (const tf_t& tfactors, dual_t& rate) +void rate_f17_to_p_o16 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dual_t ct9i = tfactors.t9i * (-6.96583e0_rt); - dual_t ct9i13 = tfactors.t9i13 * (-16.696e0_rt); - dual_t ct913 = tfactors.t913 * (-1.16252e0_rt); - dual_t ct9 = tfactors.t9 * (0.267703e0_rt); - dual_t ct953 = tfactors.t953 * (-0.0338411e0_rt); - dual_t 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); - dual_t r0 = admath::exp(40.9135e0_rt + + number_t r0 = admath::exp(40.9135e0_rt + ct9i + ct9i13 + ct913 + @@ -66,28 +66,28 @@ void rate_f17_to_p_o16 (const tf_t& tfactors, dual_t& rate) } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_f17_to_o17 ([[maybe_unused]] const tf_t& tfactors, dual_t& rate) +void rate_f17_to_o17 ([[maybe_unused]] const tf_t& tfactors, number_t& rate) { rate = std::exp(-4.53302e0_rt); } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_p_f17_to_ne18 (const tf_t& tfactors, dual_t& rate) +void rate_p_f17_to_ne18 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dual_t ct9i = tfactors.t9i * (-0.0323504e0_rt); - dual_t ct9i13 = tfactors.t9i13 * (-14.2191e0_rt); - dual_t ct913 = tfactors.t913 * (34.0647e0_rt); - dual_t ct9 = tfactors.t9 * (-16.5698e0_rt); - dual_t ct953 = tfactors.t953 * (2.48116e0_rt); - dual_t 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); - dual_t r0 = admath::exp(-7.84708e0_rt + + number_t r0 = admath::exp(-7.84708e0_rt + ct9i + ct9i13 + ct913 + @@ -102,7 +102,7 @@ void rate_p_f17_to_ne18 (const tf_t& tfactors, dual_t& rate) ct953 = tfactors.t953 * (-0.0440377e0_rt); clnt9 = tfactors.lnt9 * (-7.36014e0_rt); - dual_t r1 = admath::exp(27.5778e0_rt + + number_t r1 = admath::exp(27.5778e0_rt + ct9i + ct9i13 + ct913 + @@ -114,20 +114,20 @@ void rate_p_f17_to_ne18 (const tf_t& tfactors, dual_t& rate) } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_he4_he4_he4_to_c12 (const tf_t& tfactors, dual_t& rate) +void rate_he4_he4_he4_to_c12 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dual_t ct9i = tfactors.t9i * (-1.02446e0_rt); - dual_t ct9i13 = tfactors.t9i13 * (-23.57e0_rt); - dual_t ct913 = tfactors.t913 * (20.4886e0_rt); - dual_t ct9 = tfactors.t9 * (-12.9882e0_rt); - dual_t ct953 = tfactors.t953 * (-20.0e0_rt); - dual_t 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); - dual_t r0 = admath::exp(-11.7884e0_rt + + number_t r0 = admath::exp(-11.7884e0_rt + ct9i + ct9i13 + ct913 + @@ -141,7 +141,7 @@ void rate_he4_he4_he4_to_c12 (const tf_t& tfactors, dual_t& rate) ct953 = tfactors.t953 * (-10.0e0_rt); clnt9 = tfactors.lnt9 * (-1.33333e0_rt); - dual_t r1 = admath::exp(-0.971052e0_rt + + number_t r1 = admath::exp(-0.971052e0_rt + ct9i13 + ct913 + ct9 + @@ -155,7 +155,7 @@ void rate_he4_he4_he4_to_c12 (const tf_t& tfactors, dual_t& rate) ct953 = tfactors.t953 * (0.0879816e0_rt); clnt9 = tfactors.lnt9 * (-13.1653e0_rt); - dual_t r2 = admath::exp(-24.3505e0_rt + + number_t r2 = admath::exp(-24.3505e0_rt + ct9i + ct9i13 + ct913 + @@ -167,19 +167,19 @@ void rate_he4_he4_he4_to_c12 (const tf_t& tfactors, dual_t& rate) } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_p_n14_to_o15 (const tf_t& tfactors, dual_t& rate) +void rate_p_n14_to_o15 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dual_t ct9i13 = tfactors.t9i13 * (-15.193e0_rt); - dual_t ct913 = tfactors.t913 * (-4.63975e0_rt); - dual_t ct9 = tfactors.t9 * (9.73458e0_rt); - dual_t ct953 = tfactors.t953 * (-9.55051e0_rt); - dual_t 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); - dual_t r0 = admath::exp(20.1169e0_rt + + number_t r0 = admath::exp(20.1169e0_rt + ct9i13 + ct913 + ct9 + @@ -192,24 +192,24 @@ void rate_p_n14_to_o15 (const tf_t& tfactors, dual_t& rate) ct953 = tfactors.t953 * (-0.987565e0_rt); clnt9 = tfactors.lnt9 * (-0.666667e0_rt); - dual_t r1 = admath::exp(17.01e0_rt + + number_t r1 = admath::exp(17.01e0_rt + ct9i13 + ct913 + ct9 + ct953 + clnt9); - dual_t ct9i = tfactors.t9i * (-4.891e0_rt); + number_t ct9i = tfactors.t9i * (-4.891e0_rt); clnt9 = tfactors.lnt9 * (0.0682e0_rt); - dual_t r2 = admath::exp(6.73578e0_rt + + number_t r2 = admath::exp(6.73578e0_rt + ct9i + clnt9); ct9i = tfactors.t9i * (-2.998e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - dual_t r3 = admath::exp(7.65444e0_rt + + number_t r3 = admath::exp(7.65444e0_rt + ct9i + clnt9); @@ -217,55 +217,55 @@ void rate_p_n14_to_o15 (const tf_t& tfactors, dual_t& rate) } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_he4_ne18_to_p_na21 (const tf_t& tfactors, dual_t& rate) +void rate_he4_ne18_to_p_na21 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dual_t ct9i = tfactors.t9i * (-24.7176e0_rt); - dual_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); + number_t ct9i = tfactors.t9i * (-24.7176e0_rt); + number_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); - dual_t r0 = admath::exp(19.4058e0_rt + + number_t r0 = admath::exp(19.4058e0_rt + ct9i + clnt9); ct9i = tfactors.t9i * (-0.452576e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - dual_t r1 = admath::exp(-137.358e0_rt + + number_t r1 = admath::exp(-137.358e0_rt + ct9i + clnt9); ct9i = tfactors.t9i * (-10.885e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - dual_t r2 = admath::exp(6.39797e0_rt + + number_t r2 = admath::exp(6.39797e0_rt + ct9i + clnt9); ct9i = tfactors.t9i * (-7.45009e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - dual_t r3 = admath::exp(-1.15641e0_rt + + number_t r3 = admath::exp(-1.15641e0_rt + ct9i + +clnt9); ct9i = tfactors.t9i * (-5.97632e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - dual_t r4 = admath::exp(-6.65137e0_rt + + number_t r4 = admath::exp(-6.65137e0_rt + ct9i + clnt9); ct9i = tfactors.t9i * (-3.14078e0_rt); - dual_t ct9i13 = tfactors.t9i13 * (-17.7759e0_rt); - dual_t ct913 = tfactors.t913 * (36.0724e0_rt); - dual_t ct9 = tfactors.t9 * (-5.34039e0_rt); - dual_t 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); - dual_t r5 = admath::exp(-13.3392e0_rt + + number_t r5 = admath::exp(-13.3392e0_rt + ct9i + ct9i13 + ct913 + @@ -276,7 +276,7 @@ void rate_he4_ne18_to_p_na21 (const tf_t& tfactors, dual_t& rate) ct9i = tfactors.t9i * (-2.81989e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - dual_t r6 = admath::exp(-28.6929e0_rt + + number_t r6 = admath::exp(-28.6929e0_rt + ct9i + clnt9); @@ -284,48 +284,48 @@ void rate_he4_ne18_to_p_na21 (const tf_t& tfactors, dual_t& rate) } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_ne18_to_f18 ([[maybe_unused]] const tf_t& tfactors, dual_t& rate) +void rate_ne18_to_f18 ([[maybe_unused]] const tf_t& tfactors, number_t& rate) { rate = std::exp(-0.880534e0_rt); } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_ne19_to_f19 ([[maybe_unused]] const tf_t& tfactors, dual_t& rate) +void rate_ne19_to_f19 ([[maybe_unused]] const tf_t& tfactors, number_t& rate) { rate = std::exp(-3.21258e0_rt); } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_p_ne19_to_na20 (const tf_t& tfactors, dual_t& rate) +void rate_p_ne19_to_na20 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dual_t ct9i = tfactors.t9i * (-5.07623e0_rt); - dual_t ct913 = tfactors.t913 * (1.23704e0_rt); - dual_t ct9 = tfactors.t9 * (0.337618e0_rt); - dual_t ct953 = tfactors.t953 * (-0.0562825e0_rt); - dual_t 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); - dual_t r0 = admath::exp(5.63289e0_rt + + number_t r0 = admath::exp(5.63289e0_rt + ct9i + ct913 + ct9 + ct953 + clnt9); - dual_t 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); - dual_t r1 = admath::exp(17.822e0_rt + + number_t r1 = admath::exp(17.822e0_rt + ct9i13 + ct913 + ct9 + @@ -336,33 +336,33 @@ void rate_p_ne19_to_na20 (const tf_t& tfactors, dual_t& rate) } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_he4_o14_to_p_f17 (const tf_t& tfactors, dual_t& rate) +void rate_he4_o14_to_p_f17 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dual_t ct9i = tfactors.t9i * (-12.0223e0_rt); - dual_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); + number_t ct9i = tfactors.t9i * (-12.0223e0_rt); + number_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); - dual_t r0 = admath::exp(12.1289e0_rt + + number_t r0 = admath::exp(12.1289e0_rt + ct9i + clnt9); ct9i = tfactors.t9i * (-26.0e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - dual_t r1 = admath::exp(18.6518e0_rt + + number_t r1 = admath::exp(18.6518e0_rt + ct9i + clnt9); - dual_t ct9i13 = tfactors.t9i13 * (-39.388e0_rt); - dual_t ct913 = tfactors.t913 * (-17.4673e0_rt); - dual_t ct9 = tfactors.t9 * (35.3029e0_rt); - dual_t 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); - dual_t r2 = admath::exp(40.8358e0_rt + + number_t r2 = admath::exp(40.8358e0_rt + ct9i13 + ct913 + ct9 + @@ -372,21 +372,21 @@ void rate_he4_o14_to_p_f17 (const tf_t& tfactors, dual_t& rate) ct9i = tfactors.t9i * (-22.51e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - dual_t r3 = admath::exp(16.3087e0_rt + + number_t r3 = admath::exp(16.3087e0_rt + ct9i + clnt9); ct9i = tfactors.t9i * (-13.6e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - dual_t r4 = admath::exp(11.1184e0_rt + + number_t r4 = admath::exp(11.1184e0_rt + ct9i + clnt9); ct9i = tfactors.t9i * (-0.453036e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - dual_t r5 = admath::exp(-106.091e0_rt + + number_t r5 = admath::exp(-106.091e0_rt + ct9i + clnt9); @@ -394,44 +394,44 @@ void rate_he4_o14_to_p_f17 (const tf_t& tfactors, dual_t& rate) } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_o14_to_n14 ([[maybe_unused]] const tf_t& tfactors, dual_t& rate) +void rate_o14_to_n14 ([[maybe_unused]] const tf_t& tfactors, number_t& rate) { rate = std::exp(-4.62412e0_rt); } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_he4_o15_to_ne19 (const tf_t& tfactors, dual_t& rate) +void rate_he4_o15_to_ne19 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dual_t ct9i = tfactors.t9i * (-5.88439e0_rt); - dual_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); + number_t ct9i = tfactors.t9i * (-5.88439e0_rt); + number_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); - dual_t r0 = admath::exp(-0.0452465e0_rt + + number_t r0 = admath::exp(-0.0452465e0_rt + ct9i + clnt9); - dual_t ct9i13 = tfactors.t9i13 * (-39.578e0_rt); - dual_t 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); - dual_t r1 = admath::exp(26.2914e0_rt + + number_t r1 = admath::exp(26.2914e0_rt + ct9i13 + ct953 + clnt9); ct9i = tfactors.t9i * (-4.20439e0_rt); ct9i13 = tfactors.t9i13 * (-3.24609e0_rt); - dual_t ct913 = tfactors.t913 * (44.4647e0_rt); - dual_t 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); - dual_t r2 = admath::exp(-32.2496e0_rt + + number_t r2 = admath::exp(-32.2496e0_rt + ct9i + ct9i13 + ct913 + @@ -443,34 +443,34 @@ void rate_he4_o15_to_ne19 (const tf_t& tfactors, dual_t& rate) } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_o15_to_n15 ([[maybe_unused]] const tf_t& tfactors, dual_t& rate) +void rate_o15_to_n15 ([[maybe_unused]] const tf_t& tfactors, number_t& rate) { rate = std::exp(-5.1725e0_rt); } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_he4_o16_to_ne20 (const tf_t& tfactors, dual_t& rate) +void rate_he4_o16_to_ne20 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dual_t ct9i = tfactors.t9i * (-10.3585e0_rt); - dual_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); + number_t ct9i = tfactors.t9i * (-10.3585e0_rt); + number_t clnt9 = tfactors.lnt9 * (-1.5e0_rt); - dual_t r0 = admath::exp(3.88571e0_rt + + number_t r0 = admath::exp(3.88571e0_rt + ct9i + clnt9); - dual_t ct9i13 = tfactors.t9i13 * (-39.7262e0_rt); - dual_t ct913 = tfactors.t913 * (-0.210799e0_rt); - dual_t ct9 = tfactors.t9 * (0.442879e0_rt); - dual_t 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); - dual_t r1 = admath::exp(23.903e0_rt + + number_t r1 = admath::exp(23.903e0_rt + ct9i13 + ct913 + ct9 + @@ -483,7 +483,7 @@ void rate_he4_o16_to_ne20 (const tf_t& tfactors, dual_t& rate) ct953 = tfactors.t953 * (-0.00107508e0_rt); clnt9 = tfactors.lnt9 * (-1.5e0_rt); - dual_t r2 = admath::exp(9.50848e0_rt + + number_t r2 = admath::exp(9.50848e0_rt + ct9i + ct913 + ct9 + @@ -494,19 +494,19 @@ void rate_he4_o16_to_ne20 (const tf_t& tfactors, dual_t& rate) } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_p_o16_to_f17 (const tf_t& tfactors, dual_t& rate) +void rate_p_o16_to_f17 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dual_t ct9i13 = tfactors.t9i13 * (-16.696e0_rt); - dual_t ct913 = tfactors.t913 * (-1.16252e0_rt); - dual_t ct9 = tfactors.t9 * (0.267703e0_rt); - dual_t ct953 = tfactors.t953 * (-0.0338411e0_rt); - dual_t 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); - dual_t r0 = admath::exp(19.0904e0_rt + + number_t r0 = admath::exp(19.0904e0_rt + ct9i13 + ct913 + ct9 + @@ -517,19 +517,19 @@ void rate_p_o16_to_f17 (const tf_t& tfactors, dual_t& rate) } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_he4_si26_to_p_p29 (const tf_t& tfactors, dual_t& rate) +void rate_he4_si26_to_p_p29 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dual_t ct9i13 = tfactors.t9i13 * (-59.3013e0_rt); - dual_t ct913 = tfactors.t913 * (0.480742e0_rt); - dual_t ct9 = tfactors.t9 * (-0.834505e0_rt); - dual_t ct953 = tfactors.t953 * (0.0621841e0_rt); - dual_t 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); - dual_t r0 = admath::exp(48.8732e0_rt + + number_t r0 = admath::exp(48.8732e0_rt + ct9i13 + ct913 + ct9 + @@ -540,20 +540,20 @@ void rate_he4_si26_to_p_p29 (const tf_t& tfactors, dual_t& rate) } -template +template AMREX_GPU_HOST_DEVICE AMREX_INLINE -void rate_he4_ti44_to_p_v47 (const tf_t& tfactors, dual_t& rate) +void rate_he4_ti44_to_p_v47 (const tf_t& tfactors, number_t& rate) { rate = 0.0_rt; - dual_t ct9i = tfactors.t9i * (-9.07869e0_rt); - dual_t ct9i13 = tfactors.t9i13 * (5.56533e0_rt); - dual_t ct913 = tfactors.t913 * (18.4415e0_rt); - dual_t ct9 = tfactors.t9 * (-4.10095e0_rt); - dual_t ct953 = tfactors.t953 * (0.24244e0_rt); - dual_t 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); - dual_t r0 = admath::exp(-34.2468e0_rt + + number_t r0 = admath::exp(-34.2468e0_rt + ct9i + ct9i13 + ct913 + diff --git a/rates/aprox_rates.H b/rates/aprox_rates.H index 7f85f25c69..1193a56017 100644 --- a/rates/aprox_rates.H +++ b/rates/aprox_rates.H @@ -66,9 +66,9 @@ void rates_init() } } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_c12ag(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +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 @@ -85,16 +85,16 @@ void rate_c12ag(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_ constexpr amrex::Real a6_nr = -2.0_rt/3.0_rt; const amrex::Real term_a0_nr = std::exp(a0_nr); - const dual_t term_a1_nr = admath::exp(a1_nr*tf.t9i); - const dual_t term_a2_nr = admath::exp(a2_nr*tf.t9i13); - const dual_t term_a3_nr = admath::exp(a3_nr*tf.t913); - const dual_t term_a4_nr = admath::exp(a4_nr*tf.t9); - const dual_t term_a5_nr = admath::exp(a5_nr*tf.t953); - const dual_t term_a6_nr = admath::pow(tf.t9,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 dual_t term_nr = term_a0_nr * term_a1_nr * term_a2_nr * - term_a3_nr * term_a4_nr * term_a5_nr * - term_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 constexpr amrex::Real a0_r = 7.4e0_rt; @@ -106,26 +106,26 @@ void rate_c12ag(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_ constexpr amrex::Real a6_r = -3.0e0_rt/2.0e0_rt; const amrex::Real term_a0_r = std::exp(a0_r); - const dual_t term_a1_r = admath::exp(a1_r*tf.t9i); - const dual_t term_a2_r = admath::exp(a2_r*tf.t9i13); - const dual_t term_a3_r = admath::exp(a3_r*tf.t913); - const dual_t term_a4_r = admath::exp(a4_r*tf.t9); - const dual_t term_a5_r = admath::exp(a5_r*tf.t953); - const dual_t term_a6_r = admath::pow(tf.t9,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 dual_t 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_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 dual_t term = term_nr + term_r; + const number_t term = term_nr + term_r; fr = term * den; // 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 dual_t rev = 5.1345573e10_rt * tf.t932 * admath::exp(-83.114082_rt*tf.t9i); + const number_t rev = 5.1345573e10_rt * tf.t932 * admath::exp(-83.114082_rt*tf.t9i); rr = rev * term; @@ -135,36 +135,36 @@ void rate_c12ag(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_ constexpr amrex::Real q1 = 1.0e0_rt/12.222016e0_rt; // c12(a,g)o16 - const dual_t aa = 1.0e0_rt + 0.0489e0_rt*tf.t9i23; + const number_t aa = 1.0e0_rt + 0.0489e0_rt*tf.t9i23; - const dual_t bb = tf.t92*aa*aa; + const number_t bb = tf.t92*aa*aa; - const dual_t cc = admath::exp(-32.120e0_rt*tf.t9i13 - tf.t92*q1); + const number_t cc = admath::exp(-32.120e0_rt*tf.t9i13 - tf.t92*q1); - const dual_t dd = 1.0e0_rt + 0.2654e0_rt*tf.t9i23; + const number_t dd = 1.0e0_rt + 0.2654e0_rt*tf.t9i23; - const dual_t ee = tf.t92*dd*dd; + const number_t ee = tf.t92*dd*dd; - const dual_t ff = admath::exp(-32.120e0_rt*tf.t9i13); + const number_t ff = admath::exp(-32.120e0_rt*tf.t9i13); - const dual_t gg = 1.25e3_rt * tf.t9i32 * admath::exp(-27.499_rt*tf.t9i); + const number_t gg = 1.25e3_rt * tf.t9i32 * admath::exp(-27.499_rt*tf.t9i); - const dual_t hh = 1.43e-2_rt * tf.t95 * admath::exp(-15.541_rt*tf.t9i); + const number_t hh = 1.43e-2_rt * tf.t95 * admath::exp(-15.541_rt*tf.t9i); - dual_t zz = 1.0e0_rt/bb; - const dual_t f1 = cc*zz; + number_t zz = 1.0e0_rt/bb; + const number_t f1 = cc*zz; zz = 1.0e0_rt/ee; - const dual_t f2 = ff*zz; + const number_t f2 = ff*zz; - dual_t term = 1.04e8_rt*f1 + 1.76e8_rt*f2 + gg + hh; + number_t term = 1.04e8_rt*f1 + 1.76e8_rt*f2 + gg + hh; // 1.7 times cf88 value term *= 1.7e0_rt; fr = term * den; - const dual_t rev = 5.13e10_rt * tf.t932 * admath::exp(-83.111_rt*tf.t9i); + const number_t rev = 5.13e10_rt * tf.t932 * admath::exp(-83.111_rt*tf.t9i); rr = rev * term; @@ -172,9 +172,9 @@ void rate_c12ag(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_ } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_triplealf(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_triplealf(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { constexpr amrex::Real rc28 = 0.1_rt; constexpr amrex::Real q1 = 1.0_rt / 0.009604e0_rt; @@ -182,36 +182,36 @@ void rate_triplealf(const tf_t& tf, const amrex::Real den, dual_t& fr, d // triple alfa to c12 // this is a(a,g)be8 - const dual_t aa = 7.40e5_rt * tf.t9i32 * admath::exp(-1.0663_rt*tf.t9i); - const dual_t bb = 4.164e9_rt * tf.t9i23 * admath::exp(-13.49_rt*tf.t9i13 - tf.t92*q1); - const dual_t 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 dual_t r2abe = aa + bb * cc; + const number_t r2abe = aa + bb * cc; // this is be8(a,g)c12 - const dual_t dd = 130.0e0_rt * tf.t9i32 * admath::exp(-3.3364_rt*tf.t9i); - const dual_t ee = 2.510e7_rt * tf.t9i23 * admath::exp(-23.57_rt*tf.t9i13 - tf.t92*q2); - const dual_t 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 dual_t rbeac = dd + ee * ff; + const number_t rbeac = dd + ee * ff; // a factor - const dual_t xx = rc28 * 1.35e-07_rt * tf.t9i32 * admath::exp(-24.811_rt*tf.t9i); + const number_t xx = rc28 * 1.35e-07_rt * tf.t9i32 * admath::exp(-24.811_rt*tf.t9i); - dual_t term; + number_t term; // high temperature rate if (tf.t9 > 0.08_rt) { term = 2.90e-16_rt * r2abe * rbeac + xx; // low temperature rate } else { - const dual_t uu = 0.8e0_rt*admath::exp(-admath::pow(0.025_rt*tf.t9i,3.263_rt)); - const dual_t 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 dual_t vv = 4.0e0_rt*admath::exp(-admath::pow(tf.t9/0.025_rt, 9.227_rt)); - const dual_t zz = 1.0e0_rt + vv; - const dual_t zzinv = 1.0e0_rt/zz; - const dual_t 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; term = 2.90e-16_rt * r2abe * rbeac * f1 + xx; } @@ -221,24 +221,24 @@ void rate_triplealf(const tf_t& tf, const amrex::Real den, dual_t& fr, d fr = autodiff::eval(term * den) * den; - const dual_t rev = 2.00e20_rt*tf.t93*admath::exp(-84.424_rt*tf.t9i); + const number_t rev = 2.00e20_rt*tf.t93*admath::exp(-84.424_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_c12c12(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +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 dual_t aa = 1.0e0_rt + 0.0396_rt*tf.t9; - const dual_t zz = 1.0e0_rt/aa; - const dual_t t9a = tf.t9*zz; - const dual_t t9a13 = admath::cbrt(t9a); - const dual_t t9a56 = admath::pow(t9a,5.0_rt/6.0_rt); - const dual_t term = 4.27e26_rt * t9a56 * tf.t9i32 * + 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 @@ -246,23 +246,23 @@ void rate_c12c12(const tf_t& tf, const amrex::Real den, dual_t& fr, dual rr = 0.0e0_rt; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_c12o16(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +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 - dual_t term; + number_t term; if (tf.t9 >= 0.5_rt) { - dual_t aa = 1.0e0_rt + 0.055_rt*tf.t9; - dual_t zz = 1.0e0_rt/aa; - dual_t t9a = tf.t9*zz; - dual_t t9a13 = admath::cbrt(t9a); - dual_t t9a23 = t9a13*t9a13; - dual_t t9a56 = admath::pow(t9a,5.0_rt/6.0_rt); + 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); - dual_t bb = 1.06e-03_rt*admath::exp(2.562_rt*t9a23); - dual_t cc = aa + bb; + 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 * admath::exp(-106.594_rt/t9a13) * zz; @@ -276,14 +276,14 @@ void rate_c12o16(const tf_t& tf, const amrex::Real den, dual_t& fr, dual rr = 0.0e0_rt; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_o16o16(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +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 dual_t term = 7.10e36_rt * tf.t9i23 * + 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); @@ -292,601 +292,601 @@ void rate_o16o16(const tf_t& tf, const amrex::Real den, dual_t& fr, dual rr = 0.0e0_rt; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_o16ag(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_o16ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { constexpr amrex::Real q1 = 1.0e0_rt/2.515396e0_rt; // o16(a,g)ne20 - const dual_t term1 = 9.37e9_rt * tf.t9i23 * admath::exp(-39.757_rt*tf.t9i13 - tf.t92*q1); + const number_t term1 = 9.37e9_rt * tf.t9i23 * admath::exp(-39.757_rt*tf.t9i13 - tf.t92*q1); - const dual_t aa = 62.1_rt * tf.t9i32 * admath::exp(-10.297_rt*tf.t9i); - const dual_t bb = 538.0e0_rt * tf.t9i32 * admath::exp(-12.226_rt*tf.t9i); - const dual_t cc = 13.0e0_rt * tf.t92 * admath::exp(-20.093_rt*tf.t9i); - const dual_t term2 = aa + bb + cc; + 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 dual_t term = term1 + term2; + const number_t term = term1 + term2; // the rates fr = den * term; - const dual_t rev = 5.65e10_rt*tf.t932*admath::exp(-54.937_rt*tf.t9i); + const number_t rev = 5.65e10_rt*tf.t932*admath::exp(-54.937_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_ne20ag(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_ne20ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { constexpr amrex::Real rc102 = 0.1_rt; constexpr amrex::Real q1 = 1.0e0_rt/4.923961e0_rt; // ne20(a,g)mg24 - dual_t aa = 4.11e11_rt * tf.t9i23 * admath::exp(-46.766_rt*tf.t9i13 - tf.t92*q1); - dual_t 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; - const dual_t term1 = aa * bb; + const number_t term1 = aa * bb; 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 dual_t term2 = aa + bb; + const number_t term2 = aa + bb; 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 dual_t term3 = rc102 * (aa + bb); + const number_t term3 = rc102 * (aa + bb); aa = 5.0e0_rt*admath::exp(-18.960_rt*tf.t9i); bb = 1.0e0_rt + aa; - const dual_t zz = 1.0e0_rt/bb; - const dual_t term = (term1 + term2 + term3)*zz; + const number_t zz = 1.0e0_rt/bb; + const number_t term = (term1 + term2 + term3)*zz; // the rates fr = den * term; - const dual_t rev = 6.01e10_rt * tf.t932 * admath::exp(-108.059_rt*tf.t9i); + const number_t rev = 6.01e10_rt * tf.t932 * admath::exp(-108.059_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_mg24ag(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_mg24ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { constexpr amrex::Real rc121 = 0.1e0_rt; // 24mg(a,g)28si - const dual_t aa = 4.78e1_rt * tf.t9i32 * admath::exp(-13.506_rt*tf.t9i); - const dual_t bb = 2.38e3_rt * tf.t9i32 * admath::exp(-15.218_rt*tf.t9i); - const dual_t cc = 2.47e2_rt * tf.t932 * admath::exp(-15.147_rt*tf.t9i); - const dual_t dd = rc121 * 1.72e-09_rt * tf.t9i32 * admath::exp(-5.028_rt*tf.t9i); - const dual_t ee = rc121* 1.25e-03_rt * tf.t9i32 * admath::exp(-7.929_rt*tf.t9i); - const dual_t ff = rc121 * 2.43e1_rt * tf.t9i * admath::exp(-11.523_rt*tf.t9i); - - const dual_t gg = 5.0e0_rt*admath::exp(-15.882_rt*tf.t9i); - const dual_t hh = 1.0e0_rt + gg; - const dual_t hhi = 1.0e0_rt/hh; - const dual_t term = (aa + bb + cc + dd + ee + ff) * 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; - const dual_t rev = 6.27e10_rt * tf.t932 * admath::exp(-115.862_rt*tf.t9i); + const number_t rev = 6.27e10_rt * tf.t932 * admath::exp(-115.862_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_mg24ap(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_mg24ap(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { constexpr amrex::Real rc148 = 0.1_rt; constexpr amrex::Real q1 = 1.0_rt / 0.024649e0_rt; // 24mg(a,p)al27 - dual_t aa = 1.10e8_rt * tf.t9i23 * admath::exp(-23.261_rt*tf.t9i13 - tf.t92*q1); - dual_t 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; - const dual_t term1 = aa * bb; + const number_t term1 = aa * bb; 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 dual_t cc = rc148 * 3.89e-08_rt * tf.t9i32 * admath::exp(-0.853_rt*tf.t9i); - const dual_t dd = rc148 * 8.18e-09_rt * tf.t9i32 * admath::exp(-1.001_rt*tf.t9i); - const dual_t term2 = aa + bb + cc + dd; + 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 dual_t ee = 1.0_rt/3.0_rt*admath::exp(-9.792_rt*tf.t9i); - const dual_t ff = 2.0_rt/3.0_rt * admath::exp(-11.773_rt*tf.t9i); - const dual_t gg = 1.0e0_rt + ee + ff; + 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 dual_t term = (term1 + term2)/gg; + const number_t term = (term1 + term2)/gg; // the rates - const dual_t rev = 1.81_rt * admath::exp(-18.572_rt*tf.t9i); + const number_t rev = 1.81_rt * admath::exp(-18.572_rt*tf.t9i); fr = den * rev * term; rr = den * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_al27pg(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_al27pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // al27(p,g)si28 // champagne 1996 - const dual_t aa = 1.32e9_rt * tf.t9i23 * admath::exp(-23.26_rt*tf.t9i13); - const dual_t bb = autodiff::eval(3.22e-10_rt * tf.t9i32 * admath::exp(-0.836_rt*tf.t9i))*0.17_rt; - const dual_t cc = 1.74e0_rt * tf.t9i32 * admath::exp(-2.269_rt*tf.t9i); - const dual_t dd = 9.92e0_rt * tf.t9i32 * admath::exp(-2.492_rt*tf.t9i); - const dual_t ee = 4.29e1_rt * tf.t9i32 * admath::exp(-3.273_rt*tf.t9i); - const dual_t ff = 1.34e2_rt * tf.t9i32 * admath::exp(-3.654_rt*tf.t9i); - const dual_t gg = 1.77e4_rt * admath::pow(tf.t9,0.53_rt) * admath::exp(-4.588_rt*tf.t9i); - const dual_t term = aa + bb + cc + dd + ee + ff + gg; + 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; - const dual_t rev = 1.13e11_rt * tf.t932 * admath::exp(-134.434_rt*tf.t9i); + const number_t rev = 1.13e11_rt * tf.t932 * admath::exp(-134.434_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_al27pg_old(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_al27pg_old(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { constexpr amrex::Real rc147 = 0.1_rt; constexpr amrex::Real q1 = 1.0e0_rt/0.024025e0_rt; // 27al(p,g)si28 cf88 - const dual_t aa = 1.67e8_rt * tf.t9i23 * admath::exp(-23.261_rt*tf.t9i13 - tf.t92*q1); - const dual_t 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 dual_t cc = aa*bb; + const number_t cc = aa*bb; - const dual_t dd = 2.20e0_rt * tf.t9i32 * admath::exp(-2.269_rt*tf.t9i); - const dual_t ee = 1.22e1_rt * tf.t9i32 * admath::exp(-2.491_rt*tf.t9i); - const dual_t ff = 1.50e4_rt * tf.t9 * admath::exp(-4.112_rt*tf.t9i); - const dual_t gg = rc147 * 6.50e-10_rt * tf.t9i32 * admath::exp(-0.853_rt*tf.t9i); - const dual_t hh = rc147 * 1.63e-10_rt * tf.t9i32 * admath::exp(-1.001_rt*tf.t9i); + 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 dual_t xx = 1.0_rt/3.0_rt*admath::exp(-9.792_rt*tf.t9i); - const dual_t yy = 2.0_rt/3.0_rt * admath::exp(-11.773_rt*tf.t9i); - const dual_t zz = 1.0e0_rt + xx + yy; - const dual_t pp = 1.0e0_rt/zz; - const dual_t term = (cc + dd + ee + ff + gg + hh)*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; - const dual_t rev = 1.13e11_rt*tf.t932*admath::exp(-134.434_rt*tf.t9i); + const number_t rev = 1.13e11_rt*tf.t932*admath::exp(-134.434_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_si28ag(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_si28ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // si28(a,g)s32 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 6.340e-2_rt*z + 2.541e-3_rt*z2 - 2.900e-4_rt*z3; + 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 dual_t term = 4.82e22_rt * tf.t9i23 * admath::exp(-61.015_rt * tf.t9i13 * aa); + const number_t term = 4.82e22_rt * tf.t9i23 * admath::exp(-61.015_rt * tf.t9i13 * aa); // the rates fr = den * term; - const dual_t rev = 6.461e10_rt * tf.t932 * admath::exp(-80.643_rt*tf.t9i); + const number_t rev = 6.461e10_rt * tf.t932 * admath::exp(-80.643_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_si28ap(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_si28ap(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // si28(a,p)p31 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 2.798e-3_rt*z + 2.763e-3_rt*z2 - 2.341e-4_rt*z3; + 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 dual_t term = 4.16e13_rt * tf.t9i23 * admath::exp(-25.631_rt * tf.t9i13 * aa); + const number_t term = 4.16e13_rt * tf.t9i23 * admath::exp(-25.631_rt * tf.t9i13 * aa); // the rates - const dual_t rev = 0.5825e0_rt * admath::exp(-22.224_rt*tf.t9i); + const number_t rev = 0.5825e0_rt * admath::exp(-22.224_rt*tf.t9i); fr = den * rev * term; rr = den * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_p31pg(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_p31pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // p31(p,g)s32 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 1.928e-1_rt*z - 1.540e-2_rt*z2 + 6.444e-4_rt*z3; + 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 dual_t term = 1.08e16_rt * tf.t9i23 * admath::exp(-27.042_rt * tf.t9i13 * aa); + const number_t term = 1.08e16_rt * tf.t9i23 * admath::exp(-27.042_rt * tf.t9i13 * aa); // the rates fr = den * term; - const dual_t rev = 3.764e10_rt * tf.t932 * admath::exp(-102.865_rt*tf.t9i); + const number_t rev = 3.764e10_rt * tf.t932 * admath::exp(-102.865_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_s32ag(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_s32ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // s32(a,g)ar36 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 4.913e-2_rt*z + 4.637e-3_rt*z2 - 4.067e-4_rt*z3; + 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 dual_t term = 1.16e24_rt * tf.t9i23 * admath::exp(-66.690_rt * tf.t9i13 * aa); + const number_t term = 1.16e24_rt * tf.t9i23 * admath::exp(-66.690_rt * tf.t9i13 * aa); // the rates fr = den * term; - const dual_t rev = 6.616e10_rt * tf.t932 * admath::exp(-77.080_rt*tf.t9i); + const number_t rev = 6.616e10_rt * tf.t932 * admath::exp(-77.080_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_s32ap(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_s32ap(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // s32(a,p)cl35 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 1.041e-1_rt*z - 1.368e-2_rt*z2 + 6.969e-4_rt*z3; + 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 dual_t term = 1.27e16_rt * tf.t9i23 * admath::exp(-31.044_rt * tf.t9i13 * aa); + const number_t term = 1.27e16_rt * tf.t9i23 * admath::exp(-31.044_rt * tf.t9i13 * aa); // the rates - const dual_t rev = 1.144_rt * admath::exp(-21.643_rt*tf.t9i); + const number_t rev = 1.144_rt * admath::exp(-21.643_rt*tf.t9i); fr = den * rev * term; rr = den * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_cl35pg(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_cl35pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // cl35(p,g)ar36 - const dual_t aa = 1.0e0_rt + 1.761e-1_rt*tf.t9 - 1.322e-2_rt*tf.t92 + 5.245e-4_rt*tf.t93; - const dual_t term = 4.48e16_rt * tf.t9i23 * admath::exp(-29.483_rt * tf.t9i13 * aa); + 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; - const dual_t rev = 7.568e10_rt*tf.t932*admath::exp(-98.722_rt*tf.t9i); + const number_t rev = 7.568e10_rt*tf.t932*admath::exp(-98.722_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_ar36ag(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_ar36ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // ar36(a,g)ca40 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 1.458e-1_rt*z - 1.069e-2_rt*z2 + 3.790e-4_rt*z3; + 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 dual_t term = 2.81e30_rt * tf.t9i23 * admath::exp(-78.271_rt * tf.t9i13 * aa); + const number_t term = 2.81e30_rt * tf.t9i23 * admath::exp(-78.271_rt * tf.t9i13 * aa); // the rates fr = den * term; - const dual_t rev = 6.740e10_rt * tf.t932 * admath::exp(-81.711_rt*tf.t9i); + const number_t rev = 6.740e10_rt * tf.t932 * admath::exp(-81.711_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_ar36ap(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_ar36ap(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // ar36(a,p)k39 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 4.826e-3_rt*z - 5.534e-3_rt*z2 + 4.021e-4_rt*z3; + 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 dual_t term = 2.76e13_rt * tf.t9i23 * admath::exp(-34.922_rt * tf.t9i13 * aa); + const number_t term = 2.76e13_rt * tf.t9i23 * admath::exp(-34.922_rt * tf.t9i13 * aa); // the rates - const dual_t rev = 1.128_rt*admath::exp(-14.959_rt*tf.t9i); + const number_t rev = 1.128_rt*admath::exp(-14.959_rt*tf.t9i); fr = den * rev * term; rr = den * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_k39pg(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_k39pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // k39(p,g)ca40 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 1.622e-1_rt*z - 1.119e-2_rt*z2 + 3.910e-4_rt*z3; + 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 dual_t term = 4.09e16_rt * tf.t9i23 * admath::exp(-31.727_rt * tf.t9i13 * aa); + const number_t term = 4.09e16_rt * tf.t9i23 * admath::exp(-31.727_rt * tf.t9i13 * aa); // the rates fr = den * term; - const dual_t rev = 7.600e10_rt * tf.t932 * admath::exp(-96.657_rt*tf.t9i); + const number_t rev = 7.600e10_rt * tf.t932 * admath::exp(-96.657_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_ca40ag(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_ca40ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // ca40(a,g)ti44 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 1.650e-2_rt*z + 5.973e-3_rt*z2 - 3.889e-04_rt*z3; + 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 dual_t term = 4.66e24_rt * tf.t9i23 * admath::exp(-76.435_rt * tf.t9i13 * aa); + const number_t term = 4.66e24_rt * tf.t9i23 * admath::exp(-76.435_rt * tf.t9i13 * aa); // the rates fr = den * term; - const dual_t rev = 6.843e10_rt * tf.t932 * admath::exp(-59.510_rt*tf.t9i); + const number_t rev = 6.843e10_rt * tf.t932 * admath::exp(-59.510_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_ca40ap(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_ca40ap(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // ca40(a,p)sc43 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt - 1.206e-2_rt*z + 7.753e-3_rt*z2 - 5.071e-4_rt*z3; + 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 dual_t term = 4.54e14_rt * tf.t9i23 * admath::exp(-32.177_rt * tf.t9i13 * aa); + const number_t term = 4.54e14_rt * tf.t9i23 * admath::exp(-32.177_rt * tf.t9i13 * aa); // the rates - const dual_t rev = 2.229_rt * admath::exp(-40.966_rt*tf.t9i); + const number_t rev = 2.229_rt * admath::exp(-40.966_rt*tf.t9i); fr = den * rev * term; rr = den * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_sc43pg(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_sc43pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // sc43(p,g)ca40 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 1.023e-1_rt*z - 2.242e-3_rt*z2 - 5.463e-5_rt*z3; + 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 dual_t term = 3.85e16_rt * tf.t9i23 * admath::exp(-33.234_rt * tf.t9i13 * aa); + const number_t term = 3.85e16_rt * tf.t9i23 * admath::exp(-33.234_rt * tf.t9i13 * aa); // the rates fr = den * term; - const dual_t rev = 1.525e11_rt * tf.t932 * admath::exp(-100.475_rt*tf.t9i); + const number_t rev = 1.525e11_rt * tf.t932 * admath::exp(-100.475_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_ti44ag(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_ti44ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // ti44(a,g)cr48 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 1.066e-1_rt*z - 1.102e-2_rt*z2 + 5.324e-4_rt*z3; + 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 dual_t term = 1.37e26_rt * tf.t9i23 * admath::exp(-81.227_rt * tf.t9i13 * aa); + const number_t term = 1.37e26_rt * tf.t9i23 * admath::exp(-81.227_rt * tf.t9i13 * aa); // the rates fr = den * term; - const dual_t rev = 6.928e10_rt*tf.t932*admath::exp(-89.289_rt*tf.t9i); + const number_t rev = 6.928e10_rt*tf.t932*admath::exp(-89.289_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_ti44ap(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_ti44ap(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // ti44(a,p)v47 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 2.655e-2_rt*z - 3.947e-3_rt*z2 + 2.522e-4_rt*z3; + 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 dual_t term = 6.54e20_rt * tf.t9i23 * admath::exp(-66.678_rt * tf.t9i13 * aa); + const number_t term = 6.54e20_rt * tf.t9i23 * admath::exp(-66.678_rt * tf.t9i13 * aa); // the rates - const dual_t rev = 1.104_rt * admath::exp(-4.723_rt*tf.t9i); + const number_t rev = 1.104_rt * admath::exp(-4.723_rt*tf.t9i); fr = den * rev * term; rr = den * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_v47pg(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_v47pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // v47(p,g)cr48 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 9.979e-2_rt*z - 2.269e-3_rt*z2 - 6.662e-5_rt*z3; + 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 dual_t term = 2.05e17_rt * tf.t9i23 * admath::exp(-35.568_rt * tf.t9i13 * aa); + const number_t term = 2.05e17_rt * tf.t9i23 * admath::exp(-35.568_rt * tf.t9i13 * aa); // the rates fr = den * term; - const dual_t rev = 7.649e10_rt*tf.t932*admath::exp(-93.999_rt*tf.t9i); + const number_t rev = 7.649e10_rt*tf.t932*admath::exp(-93.999_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_cr48ag(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_cr48ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // cr48(a,g)fe52 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 6.325e-2_rt*z - 5.671e-3_rt*z2 + 2.848e-4_rt*z3; + 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 dual_t term = 1.04e23_rt * tf.t9i23 * admath::exp(-81.420_rt * tf.t9i13 * aa); + const number_t term = 1.04e23_rt * tf.t9i23 * admath::exp(-81.420_rt * tf.t9i13 * aa); // the rates fr = den * term; - const dual_t rev = 7.001e10_rt * tf.t932 * admath::exp(-92.177_rt*tf.t9i); + const number_t rev = 7.001e10_rt * tf.t932 * admath::exp(-92.177_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_cr48ap(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_cr48ap(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // cr48(a,p)mn51 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 1.384e-2_rt*z + 1.081e-3_rt*z2 - 5.933e-5_rt*z3; + 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 dual_t term = 1.83e26_rt * tf.t9i23 * admath::exp(-86.741_rt * tf.t9i13 * aa); + const number_t term = 1.83e26_rt * tf.t9i23 * admath::exp(-86.741_rt * tf.t9i13 * aa); // the rates fr = den * term; - const dual_t rev = 0.6087_rt*admath::exp(-6.510_rt*tf.t9i); + const number_t rev = 0.6087_rt*admath::exp(-6.510_rt*tf.t9i); rr = den * rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_mn51pg(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_mn51pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // mn51(p,g)fe52 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 8.922e-2_rt*z - 1.256e-3_rt*z2 - 9.453e-5_rt*z3; + 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 dual_t term = 3.77e17_rt * tf.t9i23 * admath::exp(-37.516_rt * tf.t9i13 * aa); + const number_t term = 3.77e17_rt * tf.t9i23 * admath::exp(-37.516_rt * tf.t9i13 * aa); // the rates fr = den * term; - const dual_t rev = 1.150e11_rt*tf.t932*admath::exp(-85.667_rt*tf.t9i); + const number_t rev = 1.150e11_rt*tf.t932*admath::exp(-85.667_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_fe52ag(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_fe52ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // fe52(a,g)ni56 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 7.846e-2_rt*z - 7.430e-3_rt*z2 + 3.723e-4_rt*z3; + 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 dual_t term = 1.05e27_rt * tf.t9i23 * admath::exp(-91.674_rt * tf.t9i13 * aa); + const number_t term = 1.05e27_rt * tf.t9i23 * admath::exp(-91.674_rt * tf.t9i13 * aa); // the rates fr = den * term; - const dual_t rev = 7.064e10_rt*tf.t932*admath::exp(-92.850_rt*tf.t9i); + const number_t rev = 7.064e10_rt*tf.t932*admath::exp(-92.850_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_fe52ap(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_fe52ap(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // fe52(a,p)co55 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 1.367e-2_rt*z + 7.428e-4_rt*z2 - 3.050e-5_rt*z3; + 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 dual_t term = 1.30e27_rt * tf.t9i23 * admath::exp(-91.674_rt * tf.t9i13 * aa); + const number_t term = 1.30e27_rt * tf.t9i23 * admath::exp(-91.674_rt * tf.t9i13 * aa); // the rates fr = den * term; - const dual_t rev = 0.4597_rt*admath::exp(-9.470_rt*tf.t9i); + const number_t rev = 0.4597_rt*admath::exp(-9.470_rt*tf.t9i); rr = den * rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_co55pg(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_co55pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // co55(p,g)ni56 - const dual_t z = admath::min(10.0e0_rt, tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 9.894e-2_rt*z - 3.131e-3_rt*z2 - 2.160e-5_rt*z3; + 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 dual_t term = 1.21e18_rt * tf.t9i23 * admath::exp(-39.604_rt * tf.t9i13 * aa); + const number_t term = 1.21e18_rt * tf.t9i23 * admath::exp(-39.604_rt * tf.t9i13 * aa); // the rates fr = den * term; - const dual_t rev = 1.537e11_rt*tf.t932*admath::exp(-83.382_rt*tf.t9i); + const number_t rev = 1.537e11_rt*tf.t932*admath::exp(-83.382_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_pp(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_pp(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // p(p,e+nu)d - dual_t term; + number_t term; if (tf.t9 <= 3.0_rt) { - const dual_t aa = 4.01e-15_rt * tf.t9i23 * admath::exp(-3.380e0_rt*tf.t9i13); - const dual_t bb = 1.0e0_rt + 0.123e0_rt*tf.t913 + 1.09e0_rt*tf.t923 + 0.938e0_rt*tf.t9; + 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; } else { term = 1.1581136e-15_rt; @@ -897,17 +897,17 @@ void rate_pp(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr = 0.0e0_rt; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_png(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +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 dual_t 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 dual_t term = 4.742e4_rt * aa; + const number_t term = 4.742e4_rt * aa; // wagoner,schramm 1977 // aa = 1.0e0_rt - 0.86*tf.t912 + 0.429*tf.t9 @@ -916,295 +916,295 @@ void rate_png(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& // rates fr = den * term; - const dual_t rev = 4.71e9_rt * tf.t932 * admath::exp(-25.82_rt*tf.t9i); + const number_t rev = 4.71e9_rt * tf.t932 * admath::exp(-25.82_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_dpg(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_dpg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // d(p,g)he3 - const dual_t aa = 2.24e3_rt * tf.t9i23 * admath::exp(-3.720_rt*tf.t9i13); - const dual_t bb = 1.0e0_rt + 0.112_rt*tf.t913 + 3.38_rt*tf.t923 + 2.65_rt*tf.t9; - const dual_t term = aa * bb; + 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; - const dual_t rev = 1.63e10_rt * tf.t932 * admath::exp(-63.750_rt*tf.t9i); + const number_t rev = 1.63e10_rt * tf.t932 * admath::exp(-63.750_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_he3ng(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_he3ng(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // he3(n,g)he4 - const dual_t term = 6.62_rt * (1.0e0_rt + 905.0_rt*tf.t9); + const number_t term = 6.62_rt * (1.0e0_rt + 905.0_rt*tf.t9); // rates fr = den * term; - const dual_t rev = 2.61e10_rt * tf.t932 * admath::exp(-238.81_rt*tf.t9i); + const number_t rev = 2.61e10_rt * tf.t932 * admath::exp(-238.81_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_he3he3(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_he3he3(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // he3(he3,2p)he4 - const dual_t aa = 6.04e10_rt * tf.t9i23 * admath::exp(-12.276_rt*tf.t9i13); - const dual_t 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 dual_t term = aa * bb; + const number_t term = aa * bb; // rates fr = den * term; - const dual_t rev = 3.39e-10_rt * tf.t9i32 * admath::exp(-149.230_rt*tf.t9i); + const number_t rev = 3.39e-10_rt * tf.t9i32 * admath::exp(-149.230_rt*tf.t9i); rr = den * den * rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_he3he4(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_he3he4(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // he3(he4,g)be7 - const dual_t aa = 1.0e0_rt + 0.0495_rt*tf.t9; + const number_t aa = 1.0e0_rt + 0.0495_rt*tf.t9; - dual_t zz = 1.0e0_rt/aa; - const dual_t t9a = tf.t9*zz; - const dual_t t9a13 = admath::cbrt(t9a); - const dual_t t9a56 = admath::pow(t9a,5.0_rt/6.0_rt); + 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 dual_t term = 5.61e6_rt * t9a56 * tf.t9i32 * admath::exp(-12.826_rt/t9a13); + const number_t term = 5.61e6_rt * t9a56 * tf.t9i32 * admath::exp(-12.826_rt/t9a13); // rates fr = den * term; - const dual_t rev = 1.11e10_rt * tf.t932 * admath::exp(-18.423_rt*tf.t9i); + const number_t rev = 1.11e10_rt * tf.t932 * admath::exp(-18.423_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_c12pg(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_c12pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { constexpr amrex::Real q1 = 1.0e0_rt/2.25e0_rt; // c12(p,g)13n - const dual_t aa = 2.04e7_rt * tf.t9i23 * admath::exp(-13.69_rt*tf.t9i13 - tf.t92*q1); - const dual_t 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 dual_t cc = aa * bb; + const number_t cc = aa * bb; - const dual_t dd = 1.08e5_rt * tf.t9i32 * admath::exp(-4.925_rt*tf.t9i); + const number_t dd = 1.08e5_rt * tf.t9i32 * admath::exp(-4.925_rt*tf.t9i); - const dual_t ee = 2.15e5_rt * tf.t9i32 * admath::exp(-18.179_rt*tf.t9i); + const number_t ee = 2.15e5_rt * tf.t9i32 * admath::exp(-18.179_rt*tf.t9i); - const dual_t term = cc + dd + ee; + const number_t term = cc + dd + ee; // rates fr = den * term; - const dual_t rev = 8.84e9_rt * tf.t932 * admath::exp(-22.553_rt*tf.t9i); + const number_t rev = 8.84e9_rt * tf.t932 * admath::exp(-22.553_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_n14pg(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_n14pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { constexpr amrex::Real q1 = 1.0e0_rt/10.850436e0_rt; // n14(p,g)o15 - const dual_t aa = 4.90e7_rt * tf.t9i23 * admath::exp(-15.228_rt*tf.t9i13 - tf.t92*q1); - const dual_t 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 dual_t cc = aa * bb; + const number_t cc = aa * bb; - const dual_t dd = 2.37e3_rt * tf.t9i32 * admath::exp(-3.011_rt*tf.t9i); + const number_t dd = 2.37e3_rt * tf.t9i32 * admath::exp(-3.011_rt*tf.t9i); - const dual_t ee = 2.19e4_rt * admath::exp(-12.530_rt*tf.t9i); + const number_t ee = 2.19e4_rt * admath::exp(-12.530_rt*tf.t9i); - const dual_t term = cc + dd + ee; + const number_t term = cc + dd + ee; // rates fr = den * term; - const dual_t rev = 2.70e10_rt * tf.t932 * admath::exp(-84.678_rt*tf.t9i); + const number_t rev = 2.70e10_rt * tf.t932 * admath::exp(-84.678_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_n15pg(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_n15pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { constexpr amrex::Real q1 = 1.0_rt / 0.2025_rt; // n15(p,g)o16 - const dual_t aa = 9.78e8_rt * tf.t9i23 * admath::exp(-15.251_rt*tf.t9i13 - tf.t92*q1); - const dual_t 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 dual_t cc = aa * bb; + const number_t cc = aa * bb; - const dual_t dd = 1.11e4_rt*tf.t9i32*admath::exp(-3.328_rt*tf.t9i); + const number_t dd = 1.11e4_rt*tf.t9i32*admath::exp(-3.328_rt*tf.t9i); - const dual_t ee = 1.49e4_rt*tf.t9i32*admath::exp(-4.665_rt*tf.t9i); + const number_t ee = 1.49e4_rt*tf.t9i32*admath::exp(-4.665_rt*tf.t9i); - const dual_t ff = 3.8e6_rt*tf.t9i32*admath::exp(-11.048_rt*tf.t9i); + const number_t ff = 3.8e6_rt*tf.t9i32*admath::exp(-11.048_rt*tf.t9i); - const dual_t term = cc + dd + ee + ff; + const number_t term = cc + dd + ee + ff; // rates fr = den * term; - const dual_t rev = 3.62e10_rt * tf.t932 * admath::exp(-140.734_rt*tf.t9i); + const number_t rev = 3.62e10_rt * tf.t932 * admath::exp(-140.734_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_n15pa(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_n15pa(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { constexpr amrex::Real theta = 0.1_rt; constexpr amrex::Real q1 = 1.0_rt / 0.272484_rt; // n15(p,a)c12 - const dual_t aa = 1.08e12_rt*tf.t9i23*admath::exp(-15.251_rt*tf.t9i13 - tf.t92*q1); - const dual_t 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 dual_t cc = aa * bb; + const number_t cc = aa * bb; - const dual_t dd = 1.19e8_rt * tf.t9i32 * admath::exp(-3.676_rt*tf.t9i); + const number_t dd = 1.19e8_rt * tf.t9i32 * admath::exp(-3.676_rt*tf.t9i); - const dual_t ee = 5.41e8_rt * tf.t9i12 * admath::exp(-8.926_rt*tf.t9i); + const number_t ee = 5.41e8_rt * tf.t9i12 * admath::exp(-8.926_rt*tf.t9i); - const dual_t ff = theta * 4.72e8_rt * tf.t9i32 * admath::exp(-7.721_rt*tf.t9i); + const number_t ff = theta * 4.72e8_rt * tf.t9i32 * admath::exp(-7.721_rt*tf.t9i); - const dual_t gg = theta * 2.20e9_rt * tf.t9i32 * admath::exp(-11.418_rt*tf.t9i); + const number_t gg = theta * 2.20e9_rt * tf.t9i32 * admath::exp(-11.418_rt*tf.t9i); - const dual_t term = cc + dd + ee + ff + gg; + const number_t term = cc + dd + ee + ff + gg; // rates fr = den * term; - const dual_t rev = 7.06e-01_rt*admath::exp(-57.625_rt*tf.t9i); + const number_t rev = 7.06e-01_rt*admath::exp(-57.625_rt*tf.t9i); rr = den * rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_o16pg(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_o16pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // o16(p,g)f17 - const dual_t aa = admath::exp(-0.728_rt*tf.t923); - const dual_t bb = 1.0e0_rt + 2.13_rt * (1.0e0_rt - aa); - const dual_t cc = tf.t923 * bb; - const dual_t dd = admath::exp(-16.692_rt*tf.t9i13); - const dual_t zz = 1.0e0_rt/cc; - const dual_t ee = dd*zz; - const dual_t term = 1.50e8_rt * ee; + 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; - const dual_t rev = 3.03e9_rt*tf.t932*admath::exp(-6.968_rt*tf.t9i); + const number_t rev = 3.03e9_rt*tf.t932*admath::exp(-6.968_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_n14ag(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_n14ag(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { constexpr amrex::Real q1 = 1.0e0_rt/0.776161e0_rt; // n14(a,g)f18 - const dual_t aa = 7.78e9_rt * tf.t9i23 * admath::exp(-36.031_rt*tf.t9i13- tf.t92*q1); - const dual_t 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 dual_t cc = aa * bb; + const number_t cc = aa * bb; - const dual_t dd = 2.36e-10_rt * tf.t9i32 * admath::exp(-2.798_rt*tf.t9i); + const number_t dd = 2.36e-10_rt * tf.t9i32 * admath::exp(-2.798_rt*tf.t9i); - const dual_t ee = 2.03_rt * tf.t9i32 * admath::exp(-5.054_rt*tf.t9i); + const number_t ee = 2.03_rt * tf.t9i32 * admath::exp(-5.054_rt*tf.t9i); - const dual_t ff = 1.15e4_rt * tf.t9i23 * admath::exp(-12.310_rt*tf.t9i); + const number_t ff = 1.15e4_rt * tf.t9i23 * admath::exp(-12.310_rt*tf.t9i); - const dual_t term = cc + dd + ee + ff; + const number_t term = cc + dd + ee + ff; // rates fr = den * term; - const dual_t rev = 5.42e10_rt * tf.t932 * admath::exp(-51.236_rt*tf.t9i); + const number_t rev = 5.42e10_rt * tf.t932 * admath::exp(-51.236_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_fe52ng(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_fe52ng(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // fe52(n,g)fe53 - const dual_t tq2 = tf.t9 - 0.348e0_rt; - const dual_t term = 9.604e5_rt * admath::exp(-0.0626_rt*tq2); + 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; - const dual_t rev = 2.43e9_rt * tf.t932 * admath::exp(-123.951_rt*tf.t9i); + const number_t rev = 2.43e9_rt * tf.t932 * admath::exp(-123.951_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_fe53ng(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_fe53ng(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // fe53(n,g)fe54 - const dual_t tq1 = tf.t9/0.348_rt; - const dual_t tq10 = admath::pow(tq1, 0.10_rt); - const dual_t 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 dual_t term = 1.817e6_rt * tq10 * admath::exp(-0.06319_rt*tq2); + const number_t term = 1.817e6_rt * tq10 * admath::exp(-0.06319_rt*tq2); // the rates fr = den * term; - const dual_t rev = 1.56e11_rt * tf.t932 * admath::exp(-155.284_rt*tf.t9i); + const number_t rev = 1.56e11_rt * tf.t932 * admath::exp(-155.284_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_fe54ng(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_fe54ng(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // fe54(n,g)fe55 - const dual_t 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 * admath::log(tf.t9); - dual_t term; + number_t term; if (aa < 200.0_rt) { term = admath::exp(aa); } else { term = std::exp(200.0e0_rt); } - const dual_t bb = 4.800293e9_rt * tf.t932 * admath::exp(-1.078986e2_rt * tf.t9i); + const number_t bb = 4.800293e9_rt * tf.t932 * admath::exp(-1.078986e2_rt * tf.t9i); // reverse rate rr = term*bb; @@ -1213,43 +1213,43 @@ void rate_fe54ng(const tf_t& tf, const amrex::Real den, dual_t& fr, dual fr = term*den; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_fe54pg(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_fe54pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // fe54(p,g)co55 - const dual_t z = admath::min(10.0e0_rt,tf.t9); - const dual_t z2 = z*z; - const dual_t z3 = z2*z; - const dual_t aa = 1.0e0_rt + 9.593e-2_rt*z - 3.445e-3_rt*z2 + 8.594e-5_rt*z3; + 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 dual_t term = 4.51e17_rt * tf.t9i23 * admath::exp(-38.483_rt * tf.t9i13 * aa); + const number_t term = 4.51e17_rt * tf.t9i23 * admath::exp(-38.483_rt * tf.t9i13 * aa); // the rates fr = den * term; - const dual_t rev = 2.400e9_rt * tf.t932 * admath::exp(-58.605_rt*tf.t9i); + const number_t rev = 2.400e9_rt * tf.t932 * admath::exp(-58.605_rt*tf.t9i); rr = rev * term; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_fe54ap(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_fe54ap(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // fe54(a,p)co57 - const dual_t 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 * admath::log(tf.t9); - dual_t term; + number_t term; if (aa < 200.0_rt) { term = admath::exp(aa); } else { term = std::exp(200.0e0_rt); } - const dual_t bb = 2.16896000e0_rt * admath::exp(-2.05631700e1_rt * tf.t9i); + const number_t bb = 2.16896000e0_rt * admath::exp(-2.05631700e1_rt * tf.t9i); // reverse rate rr = term*den; @@ -1258,23 +1258,23 @@ void rate_fe54ap(const tf_t& tf, const amrex::Real den, dual_t& fr, dual fr = rr*bb; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_fe55ng(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_fe55ng(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // fe55(n,g)fe56 - const dual_t 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 * admath::log(tf.t9); - dual_t term; + number_t term; if (aa < 200.0_rt) { term = admath::exp(aa); } else { term = std::exp(200.0e0_rt); } - const dual_t bb = 7.684279e10_rt * tf.t932 * admath::exp(-1.299472e2_rt * tf.t9i); + const number_t bb = 7.684279e10_rt * tf.t932 * admath::exp(-1.299472e2_rt * tf.t9i); // reverse rate rr = term*bb; @@ -1283,9 +1283,9 @@ void rate_fe55ng(const tf_t& tf, const amrex::Real den, dual_t& fr, dual fr = term*den; } -template +template AMREX_GPU_HOST_DEVICE AMREX_FLATTEN inline -void rate_fe56pg(const tf_t& tf, const amrex::Real den, dual_t& fr, dual_t& rr) +void rate_fe56pg(const tf_t& tf, const amrex::Real den, number_t& fr, number_t& rr) { // fe56(p,g)co57 @@ -1293,14 +1293,14 @@ void rate_fe56pg(const tf_t& tf, const amrex::Real den, dual_t& fr, dual - 4.749343e2_rt * tf.t913 + 2.683860e1_rt * tf.t9 - 1.542324e0_rt * tf.t953 + 2.315911e2_rt * admath::log(tf.t9); - dual_t term; + number_t term; if (aa < 200.0_rt) { term = admath::exp(aa); } else { term = std::exp(200.0e0_rt); } - const dual_t bb = 2.402486e9_rt * tf.t932 * admath::exp(-6.995192e1_rt * tf.t9i); + const number_t bb = 2.402486e9_rt * tf.t932 * admath::exp(-6.995192e1_rt * tf.t9i); // reverse rate rr = term*bb;