From 4533640a19152306798cbd89c2e604a754367d35 Mon Sep 17 00:00:00 2001 From: Zhi Chen <62574124+zhichen3@users.noreply.github.com> Date: Wed, 22 Nov 2023 12:50:58 -0500 Subject: [PATCH] Add subch base network (#1393) This network is a further simplification of subch_simple by excluding N14, F18, Ne21, and Na22. These nuclei were added to include n14(a, g)f18(a, p)ne21 rate sequence, which allows an enhancement to the c12(p, g)n13(a, p)o16 rate due to the proton release. However, we find that the effect is not very significant, and they also caused an artificial endpoint at Na22. --- networks/subch_base/Make.package | 14 + networks/subch_base/README.md | 8 + networks/subch_base/_parameters | 4 + networks/subch_base/actual_network.H | 233 + networks/subch_base/actual_network_data.cpp | 140 + networks/subch_base/actual_rhs.H | 1436 ++++++ networks/subch_base/inputs.burn_cell.VODE | 44 + networks/subch_base/partition_functions.H | 650 +++ networks/subch_base/pynucastro.net | 24 + networks/subch_base/reaclib_rates.H | 5083 +++++++++++++++++++ networks/subch_base/subch_base.png | Bin 0 -> 108703 bytes networks/subch_base/subch_base.py | 121 + networks/subch_base/table_rates.H | 399 ++ networks/subch_base/table_rates_data.cpp | 23 + networks/subch_base/tfactors.H | 34 + networks/subch_full/README.md | 6 +- 16 files changed, 8217 insertions(+), 2 deletions(-) create mode 100644 networks/subch_base/Make.package create mode 100644 networks/subch_base/README.md create mode 100644 networks/subch_base/_parameters create mode 100644 networks/subch_base/actual_network.H create mode 100644 networks/subch_base/actual_network_data.cpp create mode 100644 networks/subch_base/actual_rhs.H create mode 100644 networks/subch_base/inputs.burn_cell.VODE create mode 100644 networks/subch_base/partition_functions.H create mode 100644 networks/subch_base/pynucastro.net create mode 100644 networks/subch_base/reaclib_rates.H create mode 100644 networks/subch_base/subch_base.png create mode 100644 networks/subch_base/subch_base.py create mode 100644 networks/subch_base/table_rates.H create mode 100644 networks/subch_base/table_rates_data.cpp create mode 100644 networks/subch_base/tfactors.H diff --git a/networks/subch_base/Make.package b/networks/subch_base/Make.package new file mode 100644 index 0000000000..39c65eca7b --- /dev/null +++ b/networks/subch_base/Make.package @@ -0,0 +1,14 @@ +CEXE_headers += network_properties.H + +ifeq ($(USE_REACT),TRUE) + CEXE_sources += actual_network_data.cpp + CEXE_headers += actual_network.H + CEXE_headers += tfactors.H + CEXE_headers += partition_functions.H + CEXE_headers += actual_rhs.H + CEXE_headers += reaclib_rates.H + CEXE_headers += table_rates.H + CEXE_sources += table_rates_data.cpp + USE_SCREENING = TRUE + USE_NEUTRINOS = TRUE +endif diff --git a/networks/subch_base/README.md b/networks/subch_base/README.md new file mode 100644 index 0000000000..130aaf0b30 --- /dev/null +++ b/networks/subch_base/README.md @@ -0,0 +1,8 @@ +# subch_base + +This network is a further simplification of subch_simple by +excluding N14, F18, Ne21, and Na22. +These nuclei were added to include n14(a, g)f18(a, p)ne21 rate sequence, +which allows an enhancement to the c12(p, g)n13(a, p)o16 rate due to the +proton release. However, we find that the effect is not very significant, +and they also caused an artificial endpoint at Na22. diff --git a/networks/subch_base/_parameters b/networks/subch_base/_parameters new file mode 100644 index 0000000000..e98e970b5e --- /dev/null +++ b/networks/subch_base/_parameters @@ -0,0 +1,4 @@ +@namespace: network + +disable_p_C12_to_N13 int 0 +disable_He4_N13_to_p_O16 int 0 diff --git a/networks/subch_base/actual_network.H b/networks/subch_base/actual_network.H new file mode 100644 index 0000000000..c68b18904d --- /dev/null +++ b/networks/subch_base/actual_network.H @@ -0,0 +1,233 @@ +#ifndef actual_network_H +#define actual_network_H + +#include +#include + +#include +#include + +using namespace amrex; + +void actual_network_init(); + +const std::string network_name = "pynucastro-cxx"; + +namespace network +{ + extern AMREX_GPU_MANAGED amrex::Array1D bion; + extern AMREX_GPU_MANAGED amrex::Array1D mion; +} + +namespace Rates +{ + + enum NetworkRates + { + k_p_C12_to_N13 = 1, + k_He4_C12_to_O16 = 2, + k_He4_O16_to_Ne20 = 3, + k_He4_Ne20_to_Mg24 = 4, + k_p_Na23_to_Mg24 = 5, + k_He4_Mg24_to_Si28 = 6, + k_p_Al27_to_Si28 = 7, + k_He4_Si28_to_S32 = 8, + k_p_P31_to_S32 = 9, + k_C12_C12_to_p_Na23 = 10, + k_C12_C12_to_He4_Ne20 = 11, + k_He4_N13_to_p_O16 = 12, + k_C12_O16_to_p_Al27 = 13, + k_C12_O16_to_He4_Mg24 = 14, + k_O16_O16_to_p_P31 = 15, + k_O16_O16_to_He4_Si28 = 16, + k_p_Na23_to_He4_Ne20 = 17, + k_p_Al27_to_He4_Mg24 = 18, + k_p_P31_to_He4_Si28 = 19, + k_He4_He4_He4_to_C12 = 20, + k_C12_C12_to_Mg24_modified = 21, + k_O16_O16_to_S32_modified = 22, + k_C12_O16_to_Si28_modified = 23, + k_He4_S32_to_Ar36_removed = 24, + k_p_Cl35_to_Ar36_removed = 25, + k_p_Cl35_to_He4_S32_removed = 26, + k_He4_Ar36_to_Ca40_removed = 27, + k_p_K39_to_Ca40_removed = 28, + k_p_K39_to_He4_Ar36_removed = 29, + k_He4_Ca40_to_Ti44_removed = 30, + k_p_Sc43_to_Ti44_removed = 31, + k_p_Sc43_to_He4_Ca40_removed = 32, + k_He4_Ti44_to_Cr48_removed = 33, + k_He4_Ti44_to_p_V47_removed = 34, + k_p_V47_to_Cr48_removed = 35, + k_He4_Cr48_to_Fe52_removed = 36, + k_He4_Cr48_to_p_Mn51_removed = 37, + k_p_Mn51_to_Fe52_removed = 38, + k_He4_Fe52_to_Ni56_removed = 39, + k_He4_Fe52_to_p_Co55_removed = 40, + k_p_Co55_to_Ni56_removed = 41, + k_S32_He4_to_Ar36_approx = 42, + k_Ar36_to_S32_He4_approx = 43, + k_Ar36_He4_to_Ca40_approx = 44, + k_Ca40_to_Ar36_He4_approx = 45, + k_Ca40_He4_to_Ti44_approx = 46, + k_Ti44_to_Ca40_He4_approx = 47, + k_Ti44_He4_to_Cr48_approx = 48, + k_Cr48_to_Ti44_He4_approx = 49, + k_Cr48_He4_to_Fe52_approx = 50, + k_Fe52_to_Cr48_He4_approx = 51, + k_Fe52_He4_to_Ni56_approx = 52, + k_Ni56_to_Fe52_He4_approx = 53, + k_N13_to_p_C12_derived = 54, + k_O16_to_He4_C12_derived = 55, + k_Ne20_to_He4_O16_derived = 56, + k_Mg24_to_p_Na23_derived = 57, + k_Mg24_to_He4_Ne20_derived = 58, + k_Si28_to_p_Al27_derived = 59, + k_Si28_to_He4_Mg24_derived = 60, + k_S32_to_p_P31_derived = 61, + k_S32_to_He4_Si28_derived = 62, + k_C12_to_He4_He4_He4_derived = 63, + k_p_O16_to_He4_N13_derived = 64, + k_He4_Ne20_to_p_Na23_derived = 65, + k_He4_Mg24_to_p_Al27_derived = 66, + k_He4_Si28_to_p_P31_derived = 67, + k_He4_S32_to_p_Cl35_derived_removed = 68, + k_Ar36_to_He4_S32_derived_removed = 69, + k_Ar36_to_p_Cl35_derived_removed = 70, + k_He4_Ar36_to_p_K39_derived_removed = 71, + k_Ca40_to_He4_Ar36_derived_removed = 72, + k_Ca40_to_p_K39_derived_removed = 73, + k_He4_Ca40_to_p_Sc43_derived_removed = 74, + k_Ti44_to_He4_Ca40_derived_removed = 75, + k_Ti44_to_p_Sc43_derived_removed = 76, + k_Cr48_to_He4_Ti44_derived_removed = 77, + k_Cr48_to_p_V47_derived_removed = 78, + k_p_V47_to_He4_Ti44_derived_removed = 79, + k_Fe52_to_He4_Cr48_derived_removed = 80, + k_Fe52_to_p_Mn51_derived_removed = 81, + k_p_Mn51_to_He4_Cr48_derived_removed = 82, + k_Ni56_to_He4_Fe52_derived_removed = 83, + k_Ni56_to_p_Co55_derived_removed = 84, + k_p_Co55_to_He4_Fe52_derived_removed = 85, + NumRates = k_p_Co55_to_He4_Fe52_derived_removed + }; + + // number of reaclib rates + + const int NrateReaclib = 73; + + // number of tabular rates + + const int NrateTabular = 0; + + // rate names -- note: the rates are 1-based, not zero-based, so we pad + // this vector with rate_names[0] = "" so the indices line up with the + // NetworkRates enum + + static const std::vector rate_names = { + "", // 0 + "p_C12_to_N13", // 1, + "He4_C12_to_O16", // 2, + "He4_O16_to_Ne20", // 3, + "He4_Ne20_to_Mg24", // 4, + "p_Na23_to_Mg24", // 5, + "He4_Mg24_to_Si28", // 6, + "p_Al27_to_Si28", // 7, + "He4_Si28_to_S32", // 8, + "p_P31_to_S32", // 9, + "C12_C12_to_p_Na23", // 10, + "C12_C12_to_He4_Ne20", // 11, + "He4_N13_to_p_O16", // 12, + "C12_O16_to_p_Al27", // 13, + "C12_O16_to_He4_Mg24", // 14, + "O16_O16_to_p_P31", // 15, + "O16_O16_to_He4_Si28", // 16, + "p_Na23_to_He4_Ne20", // 17, + "p_Al27_to_He4_Mg24", // 18, + "p_P31_to_He4_Si28", // 19, + "He4_He4_He4_to_C12", // 20, + "C12_C12_to_Mg24_modified", // 21, + "O16_O16_to_S32_modified", // 22, + "C12_O16_to_Si28_modified", // 23, + "He4_S32_to_Ar36_removed", // 24, + "p_Cl35_to_Ar36_removed", // 25, + "p_Cl35_to_He4_S32_removed", // 26, + "He4_Ar36_to_Ca40_removed", // 27, + "p_K39_to_Ca40_removed", // 28, + "p_K39_to_He4_Ar36_removed", // 29, + "He4_Ca40_to_Ti44_removed", // 30, + "p_Sc43_to_Ti44_removed", // 31, + "p_Sc43_to_He4_Ca40_removed", // 32, + "He4_Ti44_to_Cr48_removed", // 33, + "He4_Ti44_to_p_V47_removed", // 34, + "p_V47_to_Cr48_removed", // 35, + "He4_Cr48_to_Fe52_removed", // 36, + "He4_Cr48_to_p_Mn51_removed", // 37, + "p_Mn51_to_Fe52_removed", // 38, + "He4_Fe52_to_Ni56_removed", // 39, + "He4_Fe52_to_p_Co55_removed", // 40, + "p_Co55_to_Ni56_removed", // 41, + "S32_He4_to_Ar36_approx", // 42, + "Ar36_to_S32_He4_approx", // 43, + "Ar36_He4_to_Ca40_approx", // 44, + "Ca40_to_Ar36_He4_approx", // 45, + "Ca40_He4_to_Ti44_approx", // 46, + "Ti44_to_Ca40_He4_approx", // 47, + "Ti44_He4_to_Cr48_approx", // 48, + "Cr48_to_Ti44_He4_approx", // 49, + "Cr48_He4_to_Fe52_approx", // 50, + "Fe52_to_Cr48_He4_approx", // 51, + "Fe52_He4_to_Ni56_approx", // 52, + "Ni56_to_Fe52_He4_approx", // 53, + "N13_to_p_C12_derived", // 54, + "O16_to_He4_C12_derived", // 55, + "Ne20_to_He4_O16_derived", // 56, + "Mg24_to_p_Na23_derived", // 57, + "Mg24_to_He4_Ne20_derived", // 58, + "Si28_to_p_Al27_derived", // 59, + "Si28_to_He4_Mg24_derived", // 60, + "S32_to_p_P31_derived", // 61, + "S32_to_He4_Si28_derived", // 62, + "C12_to_He4_He4_He4_derived", // 63, + "p_O16_to_He4_N13_derived", // 64, + "He4_Ne20_to_p_Na23_derived", // 65, + "He4_Mg24_to_p_Al27_derived", // 66, + "He4_Si28_to_p_P31_derived", // 67, + "He4_S32_to_p_Cl35_derived_removed", // 68, + "Ar36_to_He4_S32_derived_removed", // 69, + "Ar36_to_p_Cl35_derived_removed", // 70, + "He4_Ar36_to_p_K39_derived_removed", // 71, + "Ca40_to_He4_Ar36_derived_removed", // 72, + "Ca40_to_p_K39_derived_removed", // 73, + "He4_Ca40_to_p_Sc43_derived_removed", // 74, + "Ti44_to_He4_Ca40_derived_removed", // 75, + "Ti44_to_p_Sc43_derived_removed", // 76, + "Cr48_to_He4_Ti44_derived_removed", // 77, + "Cr48_to_p_V47_derived_removed", // 78, + "p_V47_to_He4_Ti44_derived_removed", // 79, + "Fe52_to_He4_Cr48_derived_removed", // 80, + "Fe52_to_p_Mn51_derived_removed", // 81, + "p_Mn51_to_He4_Cr48_derived_removed", // 82, + "Ni56_to_He4_Fe52_derived_removed", // 83, + "Ni56_to_p_Co55_derived_removed", // 84, + "p_Co55_to_He4_Fe52_derived_removed" // 85, + }; + +} + +#ifdef NSE_NET +namespace NSE_INDEX +{ + constexpr int H1_index = 0; + constexpr int N_index = -1; + constexpr int He4_index = 1; + + // Each row corresponds to the rate in NetworkRates enum + // First 3 row indices for reactants, followed by 3 product indices + // last index is the corresponding reverse rate index. + + extern AMREX_GPU_MANAGED amrex::Array2D rate_indices; +} +#endif + +#endif diff --git a/networks/subch_base/actual_network_data.cpp b/networks/subch_base/actual_network_data.cpp new file mode 100644 index 0000000000..f113c3de9c --- /dev/null +++ b/networks/subch_base/actual_network_data.cpp @@ -0,0 +1,140 @@ +#include + + +namespace network +{ + AMREX_GPU_MANAGED amrex::Array1D bion; + AMREX_GPU_MANAGED amrex::Array1D mion; +} + +#ifdef NSE_NET +namespace NSE_INDEX +{ + AMREX_GPU_MANAGED amrex::Array2D rate_indices { + -1, 0, 2, -1, -1, 3, 54, + -1, 1, 2, -1, -1, 4, 55, + -1, 1, 4, -1, -1, 5, 56, + -1, 1, 5, -1, -1, 7, 58, + -1, 0, 6, -1, -1, 7, 57, + -1, 1, 7, -1, -1, 9, 60, + -1, 0, 8, -1, -1, 9, 59, + -1, 1, 9, -1, -1, 11, 62, + -1, 0, 10, -1, -1, 11, 61, + -1, 2, 2, -1, 0, 6, -1, + -1, 2, 2, -1, 1, 5, -1, + -1, 1, 3, -1, 0, 4, 64, + -1, 2, 4, -1, 0, 8, -1, + -1, 2, 4, -1, 1, 7, -1, + -1, 4, 4, -1, 0, 10, -1, + -1, 4, 4, -1, 1, 9, -1, + -1, 0, 6, -1, 1, 5, 65, + -1, 0, 8, -1, 1, 7, 66, + -1, 0, 10, -1, 1, 9, 67, + 1, 1, 1, -1, -1, 2, 63, + -1, 2, 2, -1, -1, 7, -1, + -1, 4, 4, -1, -1, 11, -1, + -1, 2, 4, -1, -1, 9, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, 1, 11, -1, -1, 12, 43, + -1, -1, 12, -1, 1, 11, -1, + -1, 1, 12, -1, -1, 13, 45, + -1, -1, 13, -1, 1, 12, -1, + -1, 1, 13, -1, -1, 14, 47, + -1, -1, 14, -1, 1, 13, -1, + -1, 1, 14, -1, -1, 15, 49, + -1, -1, 15, -1, 1, 14, -1, + -1, 1, 15, -1, -1, 16, 51, + -1, -1, 16, -1, 1, 15, -1, + -1, 1, 16, -1, -1, 17, 53, + -1, -1, 17, -1, 1, 16, -1, + -1, -1, 3, -1, 0, 2, -1, + -1, -1, 4, -1, 1, 2, -1, + -1, -1, 5, -1, 1, 4, -1, + -1, -1, 7, -1, 0, 6, -1, + -1, -1, 7, -1, 1, 5, -1, + -1, -1, 9, -1, 0, 8, -1, + -1, -1, 9, -1, 1, 7, -1, + -1, -1, 11, -1, 0, 10, -1, + -1, -1, 11, -1, 1, 9, -1, + -1, -1, 2, 1, 1, 1, -1, + -1, 0, 4, -1, 1, 3, -1, + -1, 1, 5, -1, 0, 6, -1, + -1, 1, 7, -1, 0, 8, -1, + -1, 1, 9, -1, 0, 10, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1 + }; +} +#endif + +void actual_network_init() +{ + using namespace Species; + using namespace network; + + // binding energies per nucleon in MeV + amrex::Array1D ebind_per_nucleon; + + ebind_per_nucleon(H1) = 0.0_rt; + ebind_per_nucleon(He4) = 7.073915_rt; + ebind_per_nucleon(C12) = 7.680144_rt; + ebind_per_nucleon(N13) = 7.238863_rt; + ebind_per_nucleon(O16) = 7.976206_rt; + ebind_per_nucleon(Ne20) = 8.03224_rt; + ebind_per_nucleon(Na23) = 8.111493000000001_rt; + ebind_per_nucleon(Mg24) = 8.260709_rt; + ebind_per_nucleon(Al27) = 8.331553_rt; + ebind_per_nucleon(Si28) = 8.447744_rt; + ebind_per_nucleon(P31) = 8.481167_rt; + ebind_per_nucleon(S32) = 8.493129000000001_rt; + ebind_per_nucleon(Ar36) = 8.519909_rt; + ebind_per_nucleon(Ca40) = 8.551303_rt; + ebind_per_nucleon(Ti44) = 8.533520000000001_rt; + ebind_per_nucleon(Cr48) = 8.572269_rt; + ebind_per_nucleon(Fe52) = 8.609574_rt; + ebind_per_nucleon(Ni56) = 8.642779_rt; + + // convert to binding energies per nucleus in MeV + for (int i = 1; i <= NumSpec; ++i) { + bion(i) = ebind_per_nucleon(i) * aion[i-1]; + } + + // Set the mass -- this will be in grams + for (int i = 1; i <= NumSpec; ++i) { + mion(i) = (aion[i-1] - zion[i-1]) * C::Legacy::m_n + zion[i-1] * (C::Legacy::m_p + C::Legacy::m_e) - bion(i) * C::Legacy::MeV2gr; + } + +} diff --git a/networks/subch_base/actual_rhs.H b/networks/subch_base/actual_rhs.H new file mode 100644 index 0000000000..32ff1f91f6 --- /dev/null +++ b/networks/subch_base/actual_rhs.H @@ -0,0 +1,1436 @@ +#ifndef actual_rhs_H +#define actual_rhs_H + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace amrex; +using namespace ArrayUtil; + +using namespace Species; +using namespace Rates; + +using namespace rate_tables; + + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void ener_gener_rate(T const& dydt, Real& enuc) +{ + + // Computes the instantaneous energy generation rate (from the nuclei) + + // This is basically e = m c**2 + + enuc = 0.0_rt; + + for (int n = 1; n <= NumSpec; ++n) { + enuc += dydt(n) * network::mion(n); + } + + enuc *= C::Legacy::enuc_conv2; +} + + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void evaluate_rates(const burn_t& state, T& rate_eval) { + + + // create molar fractions + + Array1D Y; + for (int n = 1; n <= NumSpec; ++n) { + Y(n) = state.xn[n-1] * aion_inv[n-1]; + } + + [[maybe_unused]] Real rhoy = state.rho * state.y_e; + + // Calculate Reaclib rates + + plasma_state_t pstate{}; + fill_plasma_state(pstate, state.T, state.rho, Y); + + tf_t tfactors = evaluate_tfactors(state.T); + + fill_reaclib_rates(tfactors, rate_eval); + + if (disable_p_C12_to_N13) { + rate_eval.screened_rates(k_p_C12_to_N13) = 0.0; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_C12_to_N13) = 0.0; + } + rate_eval.screened_rates(k_N13_to_p_C12_derived) = 0.0; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_N13_to_p_C12_derived) = 0.0; + } + } + + if (disable_He4_N13_to_p_O16) { + rate_eval.screened_rates(k_He4_N13_to_p_O16) = 0.0; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_N13_to_p_O16) = 0.0; + } + rate_eval.screened_rates(k_p_O16_to_He4_N13_derived) = 0.0; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_O16_to_He4_N13_derived) = 0.0; + } + } + + + + // Evaluate screening factors + + Real ratraw, dratraw_dT; + Real scor, dscor_dt; + [[maybe_unused]] Real scor2, dscor2_dt; + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 6.0_rt, 12.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_p_C12_to_N13); + rate_eval.screened_rates(k_p_C12_to_N13) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_C12_to_N13); + rate_eval.dscreened_rates_dT(k_p_C12_to_N13) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 6.0_rt, 12.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_C12_to_O16); + rate_eval.screened_rates(k_He4_C12_to_O16) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_C12_to_O16); + rate_eval.dscreened_rates_dT(k_He4_C12_to_O16) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 8.0_rt, 16.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_O16_to_Ne20); + rate_eval.screened_rates(k_He4_O16_to_Ne20) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_O16_to_Ne20); + rate_eval.dscreened_rates_dT(k_He4_O16_to_Ne20) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 10.0_rt, 20.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_Ne20_to_Mg24); + rate_eval.screened_rates(k_He4_Ne20_to_Mg24) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Ne20_to_Mg24); + rate_eval.dscreened_rates_dT(k_He4_Ne20_to_Mg24) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_Ne20_to_p_Na23_derived); + rate_eval.screened_rates(k_He4_Ne20_to_p_Na23_derived) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Ne20_to_p_Na23_derived); + rate_eval.dscreened_rates_dT(k_He4_Ne20_to_p_Na23_derived) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 11.0_rt, 23.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_p_Na23_to_Mg24); + rate_eval.screened_rates(k_p_Na23_to_Mg24) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Na23_to_Mg24); + rate_eval.dscreened_rates_dT(k_p_Na23_to_Mg24) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Na23_to_He4_Ne20); + rate_eval.screened_rates(k_p_Na23_to_He4_Ne20) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Na23_to_He4_Ne20); + rate_eval.dscreened_rates_dT(k_p_Na23_to_He4_Ne20) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 12.0_rt, 24.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_Mg24_to_Si28); + rate_eval.screened_rates(k_He4_Mg24_to_Si28) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Mg24_to_Si28); + rate_eval.dscreened_rates_dT(k_He4_Mg24_to_Si28) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_Mg24_to_p_Al27_derived); + rate_eval.screened_rates(k_He4_Mg24_to_p_Al27_derived) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Mg24_to_p_Al27_derived); + rate_eval.dscreened_rates_dT(k_He4_Mg24_to_p_Al27_derived) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 13.0_rt, 27.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_p_Al27_to_Si28); + rate_eval.screened_rates(k_p_Al27_to_Si28) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Al27_to_Si28); + rate_eval.dscreened_rates_dT(k_p_Al27_to_Si28) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Al27_to_He4_Mg24); + rate_eval.screened_rates(k_p_Al27_to_He4_Mg24) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Al27_to_He4_Mg24); + rate_eval.dscreened_rates_dT(k_p_Al27_to_He4_Mg24) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 14.0_rt, 28.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_Si28_to_S32); + rate_eval.screened_rates(k_He4_Si28_to_S32) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Si28_to_S32); + rate_eval.dscreened_rates_dT(k_He4_Si28_to_S32) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_Si28_to_p_P31_derived); + rate_eval.screened_rates(k_He4_Si28_to_p_P31_derived) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Si28_to_p_P31_derived); + rate_eval.dscreened_rates_dT(k_He4_Si28_to_p_P31_derived) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 15.0_rt, 31.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_p_P31_to_S32); + rate_eval.screened_rates(k_p_P31_to_S32) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_P31_to_S32); + rate_eval.dscreened_rates_dT(k_p_P31_to_S32) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_P31_to_He4_Si28); + rate_eval.screened_rates(k_p_P31_to_He4_Si28) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_P31_to_He4_Si28); + rate_eval.dscreened_rates_dT(k_p_P31_to_He4_Si28) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(6.0_rt, 12.0_rt, 6.0_rt, 12.0_rt); + + + static_assert(scn_fac.z1 == 6.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_C12_C12_to_p_Na23); + rate_eval.screened_rates(k_C12_C12_to_p_Na23) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_C12_C12_to_p_Na23); + rate_eval.dscreened_rates_dT(k_C12_C12_to_p_Na23) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_C12_C12_to_He4_Ne20); + rate_eval.screened_rates(k_C12_C12_to_He4_Ne20) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_C12_C12_to_He4_Ne20); + rate_eval.dscreened_rates_dT(k_C12_C12_to_He4_Ne20) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_C12_C12_to_Mg24_modified); + rate_eval.screened_rates(k_C12_C12_to_Mg24_modified) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_C12_C12_to_Mg24_modified); + rate_eval.dscreened_rates_dT(k_C12_C12_to_Mg24_modified) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 7.0_rt, 13.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_N13_to_p_O16); + rate_eval.screened_rates(k_He4_N13_to_p_O16) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_N13_to_p_O16); + rate_eval.dscreened_rates_dT(k_He4_N13_to_p_O16) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(6.0_rt, 12.0_rt, 8.0_rt, 16.0_rt); + + + static_assert(scn_fac.z1 == 6.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_C12_O16_to_p_Al27); + rate_eval.screened_rates(k_C12_O16_to_p_Al27) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_C12_O16_to_p_Al27); + rate_eval.dscreened_rates_dT(k_C12_O16_to_p_Al27) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_C12_O16_to_He4_Mg24); + rate_eval.screened_rates(k_C12_O16_to_He4_Mg24) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_C12_O16_to_He4_Mg24); + rate_eval.dscreened_rates_dT(k_C12_O16_to_He4_Mg24) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_C12_O16_to_Si28_modified); + rate_eval.screened_rates(k_C12_O16_to_Si28_modified) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_C12_O16_to_Si28_modified); + rate_eval.dscreened_rates_dT(k_C12_O16_to_Si28_modified) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(8.0_rt, 16.0_rt, 8.0_rt, 16.0_rt); + + + static_assert(scn_fac.z1 == 8.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_O16_O16_to_p_P31); + rate_eval.screened_rates(k_O16_O16_to_p_P31) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_O16_O16_to_p_P31); + rate_eval.dscreened_rates_dT(k_O16_O16_to_p_P31) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_O16_O16_to_He4_Si28); + rate_eval.screened_rates(k_O16_O16_to_He4_Si28) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_O16_O16_to_He4_Si28); + rate_eval.dscreened_rates_dT(k_O16_O16_to_He4_Si28) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_O16_O16_to_S32_modified); + rate_eval.screened_rates(k_O16_O16_to_S32_modified) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_O16_O16_to_S32_modified); + rate_eval.dscreened_rates_dT(k_O16_O16_to_S32_modified) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 2.0_rt, 4.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + + { + constexpr auto scn_fac2 = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 4.0_rt, 8.0_rt); + + + static_assert(scn_fac2.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac2, scor2, dscor2_dt); + + } + + + ratraw = rate_eval.screened_rates(k_He4_He4_He4_to_C12); + rate_eval.screened_rates(k_He4_He4_He4_to_C12) *= scor * scor2; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_He4_He4_to_C12); + rate_eval.dscreened_rates_dT(k_He4_He4_He4_to_C12) = ratraw * (scor * dscor2_dt + dscor_dt * scor2) + dratraw_dT * scor * scor2; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 8.0_rt, 16.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_p_O16_to_He4_N13_derived); + rate_eval.screened_rates(k_p_O16_to_He4_N13_derived) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_O16_to_He4_N13_derived); + rate_eval.dscreened_rates_dT(k_p_O16_to_He4_N13_derived) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 16.0_rt, 32.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_S32_to_Ar36_removed); + rate_eval.screened_rates(k_He4_S32_to_Ar36_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_S32_to_Ar36_removed); + rate_eval.dscreened_rates_dT(k_He4_S32_to_Ar36_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_S32_to_p_Cl35_derived_removed); + rate_eval.screened_rates(k_He4_S32_to_p_Cl35_derived_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_S32_to_p_Cl35_derived_removed); + rate_eval.dscreened_rates_dT(k_He4_S32_to_p_Cl35_derived_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 17.0_rt, 35.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_p_Cl35_to_Ar36_removed); + rate_eval.screened_rates(k_p_Cl35_to_Ar36_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Cl35_to_Ar36_removed); + rate_eval.dscreened_rates_dT(k_p_Cl35_to_Ar36_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Cl35_to_He4_S32_removed); + rate_eval.screened_rates(k_p_Cl35_to_He4_S32_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Cl35_to_He4_S32_removed); + rate_eval.dscreened_rates_dT(k_p_Cl35_to_He4_S32_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 18.0_rt, 36.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_Ar36_to_Ca40_removed); + rate_eval.screened_rates(k_He4_Ar36_to_Ca40_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Ar36_to_Ca40_removed); + rate_eval.dscreened_rates_dT(k_He4_Ar36_to_Ca40_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_Ar36_to_p_K39_derived_removed); + rate_eval.screened_rates(k_He4_Ar36_to_p_K39_derived_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Ar36_to_p_K39_derived_removed); + rate_eval.dscreened_rates_dT(k_He4_Ar36_to_p_K39_derived_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 19.0_rt, 39.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_p_K39_to_Ca40_removed); + rate_eval.screened_rates(k_p_K39_to_Ca40_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_K39_to_Ca40_removed); + rate_eval.dscreened_rates_dT(k_p_K39_to_Ca40_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_K39_to_He4_Ar36_removed); + rate_eval.screened_rates(k_p_K39_to_He4_Ar36_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_K39_to_He4_Ar36_removed); + rate_eval.dscreened_rates_dT(k_p_K39_to_He4_Ar36_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 20.0_rt, 40.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_Ca40_to_Ti44_removed); + rate_eval.screened_rates(k_He4_Ca40_to_Ti44_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Ca40_to_Ti44_removed); + rate_eval.dscreened_rates_dT(k_He4_Ca40_to_Ti44_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_Ca40_to_p_Sc43_derived_removed); + rate_eval.screened_rates(k_He4_Ca40_to_p_Sc43_derived_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Ca40_to_p_Sc43_derived_removed); + rate_eval.dscreened_rates_dT(k_He4_Ca40_to_p_Sc43_derived_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 21.0_rt, 43.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_p_Sc43_to_Ti44_removed); + rate_eval.screened_rates(k_p_Sc43_to_Ti44_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Sc43_to_Ti44_removed); + rate_eval.dscreened_rates_dT(k_p_Sc43_to_Ti44_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Sc43_to_He4_Ca40_removed); + rate_eval.screened_rates(k_p_Sc43_to_He4_Ca40_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Sc43_to_He4_Ca40_removed); + rate_eval.dscreened_rates_dT(k_p_Sc43_to_He4_Ca40_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 22.0_rt, 44.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_Ti44_to_Cr48_removed); + rate_eval.screened_rates(k_He4_Ti44_to_Cr48_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Ti44_to_Cr48_removed); + rate_eval.dscreened_rates_dT(k_He4_Ti44_to_Cr48_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_Ti44_to_p_V47_removed); + rate_eval.screened_rates(k_He4_Ti44_to_p_V47_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Ti44_to_p_V47_removed); + rate_eval.dscreened_rates_dT(k_He4_Ti44_to_p_V47_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 23.0_rt, 47.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_p_V47_to_Cr48_removed); + rate_eval.screened_rates(k_p_V47_to_Cr48_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_V47_to_Cr48_removed); + rate_eval.dscreened_rates_dT(k_p_V47_to_Cr48_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_V47_to_He4_Ti44_derived_removed); + rate_eval.screened_rates(k_p_V47_to_He4_Ti44_derived_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_V47_to_He4_Ti44_derived_removed); + rate_eval.dscreened_rates_dT(k_p_V47_to_He4_Ti44_derived_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 24.0_rt, 48.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_Cr48_to_Fe52_removed); + rate_eval.screened_rates(k_He4_Cr48_to_Fe52_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Cr48_to_Fe52_removed); + rate_eval.dscreened_rates_dT(k_He4_Cr48_to_Fe52_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_Cr48_to_p_Mn51_removed); + rate_eval.screened_rates(k_He4_Cr48_to_p_Mn51_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Cr48_to_p_Mn51_removed); + rate_eval.dscreened_rates_dT(k_He4_Cr48_to_p_Mn51_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 25.0_rt, 51.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_p_Mn51_to_Fe52_removed); + rate_eval.screened_rates(k_p_Mn51_to_Fe52_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Mn51_to_Fe52_removed); + rate_eval.dscreened_rates_dT(k_p_Mn51_to_Fe52_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Mn51_to_He4_Cr48_derived_removed); + rate_eval.screened_rates(k_p_Mn51_to_He4_Cr48_derived_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Mn51_to_He4_Cr48_derived_removed); + rate_eval.dscreened_rates_dT(k_p_Mn51_to_He4_Cr48_derived_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(2.0_rt, 4.0_rt, 26.0_rt, 52.0_rt); + + + static_assert(scn_fac.z1 == 2.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_He4_Fe52_to_Ni56_removed); + rate_eval.screened_rates(k_He4_Fe52_to_Ni56_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Fe52_to_Ni56_removed); + rate_eval.dscreened_rates_dT(k_He4_Fe52_to_Ni56_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_He4_Fe52_to_p_Co55_removed); + rate_eval.screened_rates(k_He4_Fe52_to_p_Co55_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_He4_Fe52_to_p_Co55_removed); + rate_eval.dscreened_rates_dT(k_He4_Fe52_to_p_Co55_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + { + constexpr auto scn_fac = scrn::calculate_screen_factor(1.0_rt, 1.0_rt, 27.0_rt, 55.0_rt); + + + static_assert(scn_fac.z1 == 1.0_rt); + + + actual_screen(pstate, scn_fac, scor, dscor_dt); + } + + + ratraw = rate_eval.screened_rates(k_p_Co55_to_Ni56_removed); + rate_eval.screened_rates(k_p_Co55_to_Ni56_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Co55_to_Ni56_removed); + rate_eval.dscreened_rates_dT(k_p_Co55_to_Ni56_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + ratraw = rate_eval.screened_rates(k_p_Co55_to_He4_Fe52_derived_removed); + rate_eval.screened_rates(k_p_Co55_to_He4_Fe52_derived_removed) *= scor; + if constexpr (std::is_same::value) { + dratraw_dT = rate_eval.dscreened_rates_dT(k_p_Co55_to_He4_Fe52_derived_removed); + rate_eval.dscreened_rates_dT(k_p_Co55_to_He4_Fe52_derived_removed) = ratraw * dscor_dt + dratraw_dT * scor; + } + + + // Fill approximate rates + + fill_approx_rates(tfactors, rate_eval); + + // Calculate tabular rates + + [[maybe_unused]] Real rate, drate_dt, edot_nu, edot_gamma; + + rate_eval.enuc_weak = 0.0; + + +} + +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rhs_nuc(const burn_t& state, + Array1D& ydot_nuc, + const Array1D& Y, + const Array1D& screened_rates) { + + using namespace Rates; + + ydot_nuc(H1) = + (-screened_rates(k_p_C12_to_N13)*Y(C12)*Y(H1)*state.rho + screened_rates(k_N13_to_p_C12_derived)*Y(N13)) + + (-screened_rates(k_p_Na23_to_Mg24)*Y(Na23)*Y(H1)*state.rho + screened_rates(k_Mg24_to_p_Na23_derived)*Y(Mg24)) + + (-screened_rates(k_p_Al27_to_Si28)*Y(Al27)*Y(H1)*state.rho + screened_rates(k_Si28_to_p_Al27_derived)*Y(Si28)) + + (-screened_rates(k_p_P31_to_S32)*Y(P31)*Y(H1)*state.rho + screened_rates(k_S32_to_p_P31_derived)*Y(S32)) + + 0.5*screened_rates(k_C12_C12_to_p_Na23)*std::pow(Y(C12), 2)*state.rho + + (screened_rates(k_He4_N13_to_p_O16)*Y(He4)*Y(N13)*state.rho + -screened_rates(k_p_O16_to_He4_N13_derived)*Y(O16)*Y(H1)*state.rho) + + screened_rates(k_C12_O16_to_p_Al27)*Y(C12)*Y(O16)*state.rho + + 0.5*screened_rates(k_O16_O16_to_p_P31)*std::pow(Y(O16), 2)*state.rho + + (-screened_rates(k_p_Na23_to_He4_Ne20)*Y(Na23)*Y(H1)*state.rho + screened_rates(k_He4_Ne20_to_p_Na23_derived)*Y(He4)*Y(Ne20)*state.rho) + + (-screened_rates(k_p_Al27_to_He4_Mg24)*Y(Al27)*Y(H1)*state.rho + screened_rates(k_He4_Mg24_to_p_Al27_derived)*Y(He4)*Y(Mg24)*state.rho) + + (-screened_rates(k_p_P31_to_He4_Si28)*Y(P31)*Y(H1)*state.rho + screened_rates(k_He4_Si28_to_p_P31_derived)*Y(He4)*Y(Si28)*state.rho); + + ydot_nuc(He4) = + (-screened_rates(k_He4_C12_to_O16)*Y(C12)*Y(He4)*state.rho + screened_rates(k_O16_to_He4_C12_derived)*Y(O16)) + + (-screened_rates(k_He4_O16_to_Ne20)*Y(He4)*Y(O16)*state.rho + screened_rates(k_Ne20_to_He4_O16_derived)*Y(Ne20)) + + (-screened_rates(k_He4_Ne20_to_Mg24)*Y(He4)*Y(Ne20)*state.rho + screened_rates(k_Mg24_to_He4_Ne20_derived)*Y(Mg24)) + + (-screened_rates(k_He4_Mg24_to_Si28)*Y(He4)*Y(Mg24)*state.rho + screened_rates(k_Si28_to_He4_Mg24_derived)*Y(Si28)) + + (-screened_rates(k_He4_Si28_to_S32)*Y(He4)*Y(Si28)*state.rho + screened_rates(k_S32_to_He4_Si28_derived)*Y(S32)) + + 0.5*screened_rates(k_C12_C12_to_He4_Ne20)*std::pow(Y(C12), 2)*state.rho + + (-screened_rates(k_He4_N13_to_p_O16)*Y(He4)*Y(N13)*state.rho + screened_rates(k_p_O16_to_He4_N13_derived)*Y(O16)*Y(H1)*state.rho) + + screened_rates(k_C12_O16_to_He4_Mg24)*Y(C12)*Y(O16)*state.rho + + 0.5*screened_rates(k_O16_O16_to_He4_Si28)*std::pow(Y(O16), 2)*state.rho + + (screened_rates(k_p_Na23_to_He4_Ne20)*Y(Na23)*Y(H1)*state.rho + -screened_rates(k_He4_Ne20_to_p_Na23_derived)*Y(He4)*Y(Ne20)*state.rho) + + (screened_rates(k_p_Al27_to_He4_Mg24)*Y(Al27)*Y(H1)*state.rho + -screened_rates(k_He4_Mg24_to_p_Al27_derived)*Y(He4)*Y(Mg24)*state.rho) + + (screened_rates(k_p_P31_to_He4_Si28)*Y(P31)*Y(H1)*state.rho + -screened_rates(k_He4_Si28_to_p_P31_derived)*Y(He4)*Y(Si28)*state.rho) + + (-0.5*screened_rates(k_He4_He4_He4_to_C12)*std::pow(Y(He4), 3)*std::pow(state.rho, 2) + 3.0*screened_rates(k_C12_to_He4_He4_He4_derived)*Y(C12)) + + (-screened_rates(k_S32_He4_to_Ar36_approx)*Y(He4)*Y(S32)*state.rho + screened_rates(k_Ar36_to_S32_He4_approx)*Y(Ar36)) + + (-screened_rates(k_Ar36_He4_to_Ca40_approx)*Y(Ar36)*Y(He4)*state.rho + screened_rates(k_Ca40_to_Ar36_He4_approx)*Y(Ca40)) + + (-screened_rates(k_Ca40_He4_to_Ti44_approx)*Y(Ca40)*Y(He4)*state.rho + screened_rates(k_Ti44_to_Ca40_He4_approx)*Y(Ti44)) + + (-screened_rates(k_Ti44_He4_to_Cr48_approx)*Y(He4)*Y(Ti44)*state.rho + screened_rates(k_Cr48_to_Ti44_He4_approx)*Y(Cr48)) + + (-screened_rates(k_Cr48_He4_to_Fe52_approx)*Y(Cr48)*Y(He4)*state.rho + screened_rates(k_Fe52_to_Cr48_He4_approx)*Y(Fe52)) + + (-screened_rates(k_Fe52_He4_to_Ni56_approx)*Y(Fe52)*Y(He4)*state.rho + screened_rates(k_Ni56_to_Fe52_He4_approx)*Y(Ni56)); + + ydot_nuc(C12) = + (-screened_rates(k_p_C12_to_N13)*Y(C12)*Y(H1)*state.rho + screened_rates(k_N13_to_p_C12_derived)*Y(N13)) + + (-screened_rates(k_He4_C12_to_O16)*Y(C12)*Y(He4)*state.rho + screened_rates(k_O16_to_He4_C12_derived)*Y(O16)) + + -screened_rates(k_C12_C12_to_p_Na23)*std::pow(Y(C12), 2)*state.rho + + -screened_rates(k_C12_C12_to_He4_Ne20)*std::pow(Y(C12), 2)*state.rho + + -screened_rates(k_C12_O16_to_p_Al27)*Y(C12)*Y(O16)*state.rho + + -screened_rates(k_C12_O16_to_He4_Mg24)*Y(C12)*Y(O16)*state.rho + + (0.16666666666666667*screened_rates(k_He4_He4_He4_to_C12)*std::pow(Y(He4), 3)*std::pow(state.rho, 2) + -screened_rates(k_C12_to_He4_He4_He4_derived)*Y(C12)) + + -screened_rates(k_C12_C12_to_Mg24_modified)*std::pow(Y(C12), 2)*state.rho + + -screened_rates(k_C12_O16_to_Si28_modified)*Y(C12)*Y(O16)*state.rho; + + ydot_nuc(N13) = + (screened_rates(k_p_C12_to_N13)*Y(C12)*Y(H1)*state.rho + -screened_rates(k_N13_to_p_C12_derived)*Y(N13)) + + (-screened_rates(k_He4_N13_to_p_O16)*Y(He4)*Y(N13)*state.rho + screened_rates(k_p_O16_to_He4_N13_derived)*Y(O16)*Y(H1)*state.rho); + + ydot_nuc(O16) = + (screened_rates(k_He4_C12_to_O16)*Y(C12)*Y(He4)*state.rho + -screened_rates(k_O16_to_He4_C12_derived)*Y(O16)) + + (-screened_rates(k_He4_O16_to_Ne20)*Y(He4)*Y(O16)*state.rho + screened_rates(k_Ne20_to_He4_O16_derived)*Y(Ne20)) + + (screened_rates(k_He4_N13_to_p_O16)*Y(He4)*Y(N13)*state.rho + -screened_rates(k_p_O16_to_He4_N13_derived)*Y(O16)*Y(H1)*state.rho) + + -screened_rates(k_C12_O16_to_p_Al27)*Y(C12)*Y(O16)*state.rho + + -screened_rates(k_C12_O16_to_He4_Mg24)*Y(C12)*Y(O16)*state.rho + + -screened_rates(k_O16_O16_to_p_P31)*std::pow(Y(O16), 2)*state.rho + + -screened_rates(k_O16_O16_to_He4_Si28)*std::pow(Y(O16), 2)*state.rho + + -screened_rates(k_O16_O16_to_S32_modified)*std::pow(Y(O16), 2)*state.rho + + -screened_rates(k_C12_O16_to_Si28_modified)*Y(C12)*Y(O16)*state.rho; + + ydot_nuc(Ne20) = + (screened_rates(k_He4_O16_to_Ne20)*Y(He4)*Y(O16)*state.rho + -screened_rates(k_Ne20_to_He4_O16_derived)*Y(Ne20)) + + (-screened_rates(k_He4_Ne20_to_Mg24)*Y(He4)*Y(Ne20)*state.rho + screened_rates(k_Mg24_to_He4_Ne20_derived)*Y(Mg24)) + + 0.5*screened_rates(k_C12_C12_to_He4_Ne20)*std::pow(Y(C12), 2)*state.rho + + (screened_rates(k_p_Na23_to_He4_Ne20)*Y(Na23)*Y(H1)*state.rho + -screened_rates(k_He4_Ne20_to_p_Na23_derived)*Y(He4)*Y(Ne20)*state.rho); + + ydot_nuc(Na23) = + (-screened_rates(k_p_Na23_to_Mg24)*Y(Na23)*Y(H1)*state.rho + screened_rates(k_Mg24_to_p_Na23_derived)*Y(Mg24)) + + 0.5*screened_rates(k_C12_C12_to_p_Na23)*std::pow(Y(C12), 2)*state.rho + + (-screened_rates(k_p_Na23_to_He4_Ne20)*Y(Na23)*Y(H1)*state.rho + screened_rates(k_He4_Ne20_to_p_Na23_derived)*Y(He4)*Y(Ne20)*state.rho); + + ydot_nuc(Mg24) = + (screened_rates(k_He4_Ne20_to_Mg24)*Y(He4)*Y(Ne20)*state.rho + -screened_rates(k_Mg24_to_He4_Ne20_derived)*Y(Mg24)) + + (screened_rates(k_p_Na23_to_Mg24)*Y(Na23)*Y(H1)*state.rho + -screened_rates(k_Mg24_to_p_Na23_derived)*Y(Mg24)) + + (-screened_rates(k_He4_Mg24_to_Si28)*Y(He4)*Y(Mg24)*state.rho + screened_rates(k_Si28_to_He4_Mg24_derived)*Y(Si28)) + + screened_rates(k_C12_O16_to_He4_Mg24)*Y(C12)*Y(O16)*state.rho + + (screened_rates(k_p_Al27_to_He4_Mg24)*Y(Al27)*Y(H1)*state.rho + -screened_rates(k_He4_Mg24_to_p_Al27_derived)*Y(He4)*Y(Mg24)*state.rho) + + 0.5*screened_rates(k_C12_C12_to_Mg24_modified)*std::pow(Y(C12), 2)*state.rho; + + ydot_nuc(Al27) = + (-screened_rates(k_p_Al27_to_Si28)*Y(Al27)*Y(H1)*state.rho + screened_rates(k_Si28_to_p_Al27_derived)*Y(Si28)) + + screened_rates(k_C12_O16_to_p_Al27)*Y(C12)*Y(O16)*state.rho + + (-screened_rates(k_p_Al27_to_He4_Mg24)*Y(Al27)*Y(H1)*state.rho + screened_rates(k_He4_Mg24_to_p_Al27_derived)*Y(He4)*Y(Mg24)*state.rho); + + ydot_nuc(Si28) = + (screened_rates(k_He4_Mg24_to_Si28)*Y(He4)*Y(Mg24)*state.rho + -screened_rates(k_Si28_to_He4_Mg24_derived)*Y(Si28)) + + (screened_rates(k_p_Al27_to_Si28)*Y(Al27)*Y(H1)*state.rho + -screened_rates(k_Si28_to_p_Al27_derived)*Y(Si28)) + + (-screened_rates(k_He4_Si28_to_S32)*Y(He4)*Y(Si28)*state.rho + screened_rates(k_S32_to_He4_Si28_derived)*Y(S32)) + + 0.5*screened_rates(k_O16_O16_to_He4_Si28)*std::pow(Y(O16), 2)*state.rho + + (screened_rates(k_p_P31_to_He4_Si28)*Y(P31)*Y(H1)*state.rho + -screened_rates(k_He4_Si28_to_p_P31_derived)*Y(He4)*Y(Si28)*state.rho) + + screened_rates(k_C12_O16_to_Si28_modified)*Y(C12)*Y(O16)*state.rho; + + ydot_nuc(P31) = + (-screened_rates(k_p_P31_to_S32)*Y(P31)*Y(H1)*state.rho + screened_rates(k_S32_to_p_P31_derived)*Y(S32)) + + 0.5*screened_rates(k_O16_O16_to_p_P31)*std::pow(Y(O16), 2)*state.rho + + (-screened_rates(k_p_P31_to_He4_Si28)*Y(P31)*Y(H1)*state.rho + screened_rates(k_He4_Si28_to_p_P31_derived)*Y(He4)*Y(Si28)*state.rho); + + ydot_nuc(S32) = + (screened_rates(k_He4_Si28_to_S32)*Y(He4)*Y(Si28)*state.rho + -screened_rates(k_S32_to_He4_Si28_derived)*Y(S32)) + + (screened_rates(k_p_P31_to_S32)*Y(P31)*Y(H1)*state.rho + -screened_rates(k_S32_to_p_P31_derived)*Y(S32)) + + 0.5*screened_rates(k_O16_O16_to_S32_modified)*std::pow(Y(O16), 2)*state.rho + + (-screened_rates(k_S32_He4_to_Ar36_approx)*Y(He4)*Y(S32)*state.rho + screened_rates(k_Ar36_to_S32_He4_approx)*Y(Ar36)); + + ydot_nuc(Ar36) = + (screened_rates(k_S32_He4_to_Ar36_approx)*Y(He4)*Y(S32)*state.rho + -screened_rates(k_Ar36_to_S32_He4_approx)*Y(Ar36)) + + (-screened_rates(k_Ar36_He4_to_Ca40_approx)*Y(Ar36)*Y(He4)*state.rho + screened_rates(k_Ca40_to_Ar36_He4_approx)*Y(Ca40)); + + ydot_nuc(Ca40) = + (screened_rates(k_Ar36_He4_to_Ca40_approx)*Y(Ar36)*Y(He4)*state.rho + -screened_rates(k_Ca40_to_Ar36_He4_approx)*Y(Ca40)) + + (-screened_rates(k_Ca40_He4_to_Ti44_approx)*Y(Ca40)*Y(He4)*state.rho + screened_rates(k_Ti44_to_Ca40_He4_approx)*Y(Ti44)); + + ydot_nuc(Ti44) = + (screened_rates(k_Ca40_He4_to_Ti44_approx)*Y(Ca40)*Y(He4)*state.rho + -screened_rates(k_Ti44_to_Ca40_He4_approx)*Y(Ti44)) + + (-screened_rates(k_Ti44_He4_to_Cr48_approx)*Y(He4)*Y(Ti44)*state.rho + screened_rates(k_Cr48_to_Ti44_He4_approx)*Y(Cr48)); + + ydot_nuc(Cr48) = + (screened_rates(k_Ti44_He4_to_Cr48_approx)*Y(He4)*Y(Ti44)*state.rho + -screened_rates(k_Cr48_to_Ti44_He4_approx)*Y(Cr48)) + + (-screened_rates(k_Cr48_He4_to_Fe52_approx)*Y(Cr48)*Y(He4)*state.rho + screened_rates(k_Fe52_to_Cr48_He4_approx)*Y(Fe52)); + + ydot_nuc(Fe52) = + (screened_rates(k_Cr48_He4_to_Fe52_approx)*Y(Cr48)*Y(He4)*state.rho + -screened_rates(k_Fe52_to_Cr48_He4_approx)*Y(Fe52)) + + (-screened_rates(k_Fe52_He4_to_Ni56_approx)*Y(Fe52)*Y(He4)*state.rho + screened_rates(k_Ni56_to_Fe52_He4_approx)*Y(Ni56)); + + ydot_nuc(Ni56) = + (screened_rates(k_Fe52_He4_to_Ni56_approx)*Y(Fe52)*Y(He4)*state.rho + -screened_rates(k_Ni56_to_Fe52_He4_approx)*Y(Ni56)); + +} + + +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void actual_rhs (burn_t& state, Array1D& ydot) +{ + for (int i = 1; i <= neqs; ++i) { + ydot(i) = 0.0_rt; + } + + + // Set molar abundances + Array1D Y; + for (int i = 1; i <= NumSpec; ++i) { + Y(i) = state.xn[i-1] * aion_inv[i-1]; + } + + // build the rates + + rate_t rate_eval; + + constexpr int do_T_derivatives = 0; + + evaluate_rates(state, rate_eval); + + rhs_nuc(state, ydot, Y, rate_eval.screened_rates); + + // ion binding energy contributions + + Real enuc; + ener_gener_rate(ydot, enuc); + + // include any weak rate neutrino losses + enuc += rate_eval.enuc_weak; + + // Get the thermal neutrino losses + + Real sneut, dsneutdt, dsneutdd, dsnuda, dsnudz; + constexpr int do_derivatives{0}; + sneut5(state.T, state.rho, state.abar, state.zbar, sneut, dsneutdt, dsneutdd, dsnuda, dsnudz); + + // Append the energy equation (this is erg/g/s) + + ydot(net_ienuc) = enuc - sneut; + +} + + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void jac_nuc(const burn_t& state, + MatrixType& jac, + const Array1D& Y, + const Array1D& screened_rates) +{ + + Real scratch; + + scratch = -screened_rates(k_p_Al27_to_He4_Mg24)*Y(Al27)*state.rho - screened_rates(k_p_Al27_to_Si28)*Y(Al27)*state.rho - screened_rates(k_p_C12_to_N13)*Y(C12)*state.rho - screened_rates(k_p_Na23_to_He4_Ne20)*Y(Na23)*state.rho - screened_rates(k_p_Na23_to_Mg24)*Y(Na23)*state.rho - screened_rates(k_p_O16_to_He4_N13_derived)*Y(O16)*state.rho - screened_rates(k_p_P31_to_He4_Si28)*Y(P31)*state.rho - screened_rates(k_p_P31_to_S32)*Y(P31)*state.rho; + jac.set(H1, H1, scratch); + + scratch = screened_rates(k_He4_Mg24_to_p_Al27_derived)*Y(Mg24)*state.rho + screened_rates(k_He4_N13_to_p_O16)*Y(N13)*state.rho + screened_rates(k_He4_Ne20_to_p_Na23_derived)*Y(Ne20)*state.rho + screened_rates(k_He4_Si28_to_p_P31_derived)*Y(Si28)*state.rho; + jac.set(H1, He4, scratch); + + scratch = 1.0*screened_rates(k_C12_C12_to_p_Na23)*Y(C12)*state.rho + screened_rates(k_C12_O16_to_p_Al27)*Y(O16)*state.rho - screened_rates(k_p_C12_to_N13)*Y(H1)*state.rho; + jac.set(H1, C12, scratch); + + scratch = screened_rates(k_He4_N13_to_p_O16)*Y(He4)*state.rho + screened_rates(k_N13_to_p_C12_derived); + jac.set(H1, N13, scratch); + + scratch = screened_rates(k_C12_O16_to_p_Al27)*Y(C12)*state.rho + 1.0*screened_rates(k_O16_O16_to_p_P31)*Y(O16)*state.rho - screened_rates(k_p_O16_to_He4_N13_derived)*Y(H1)*state.rho; + jac.set(H1, O16, scratch); + + scratch = screened_rates(k_He4_Ne20_to_p_Na23_derived)*Y(He4)*state.rho; + jac.set(H1, Ne20, scratch); + + scratch = -screened_rates(k_p_Na23_to_He4_Ne20)*Y(H1)*state.rho - screened_rates(k_p_Na23_to_Mg24)*Y(H1)*state.rho; + jac.set(H1, Na23, scratch); + + scratch = screened_rates(k_He4_Mg24_to_p_Al27_derived)*Y(He4)*state.rho + screened_rates(k_Mg24_to_p_Na23_derived); + jac.set(H1, Mg24, scratch); + + scratch = -screened_rates(k_p_Al27_to_He4_Mg24)*Y(H1)*state.rho - screened_rates(k_p_Al27_to_Si28)*Y(H1)*state.rho; + jac.set(H1, Al27, scratch); + + scratch = screened_rates(k_He4_Si28_to_p_P31_derived)*Y(He4)*state.rho + screened_rates(k_Si28_to_p_Al27_derived); + jac.set(H1, Si28, scratch); + + scratch = -screened_rates(k_p_P31_to_He4_Si28)*Y(H1)*state.rho - screened_rates(k_p_P31_to_S32)*Y(H1)*state.rho; + jac.set(H1, P31, scratch); + + scratch = screened_rates(k_S32_to_p_P31_derived); + jac.set(H1, S32, scratch); + + scratch = screened_rates(k_p_Al27_to_He4_Mg24)*Y(Al27)*state.rho + screened_rates(k_p_Na23_to_He4_Ne20)*Y(Na23)*state.rho + screened_rates(k_p_O16_to_He4_N13_derived)*Y(O16)*state.rho + screened_rates(k_p_P31_to_He4_Si28)*Y(P31)*state.rho; + jac.set(He4, H1, scratch); + + scratch = -screened_rates(k_Ar36_He4_to_Ca40_approx)*Y(Ar36)*state.rho - screened_rates(k_Ca40_He4_to_Ti44_approx)*Y(Ca40)*state.rho - screened_rates(k_Cr48_He4_to_Fe52_approx)*Y(Cr48)*state.rho - screened_rates(k_Fe52_He4_to_Ni56_approx)*Y(Fe52)*state.rho - screened_rates(k_He4_C12_to_O16)*Y(C12)*state.rho - 1.5*screened_rates(k_He4_He4_He4_to_C12)*std::pow(Y(He4), 2)*std::pow(state.rho, 2) - screened_rates(k_He4_Mg24_to_Si28)*Y(Mg24)*state.rho - screened_rates(k_He4_Mg24_to_p_Al27_derived)*Y(Mg24)*state.rho - screened_rates(k_He4_N13_to_p_O16)*Y(N13)*state.rho - screened_rates(k_He4_Ne20_to_Mg24)*Y(Ne20)*state.rho - screened_rates(k_He4_Ne20_to_p_Na23_derived)*Y(Ne20)*state.rho - screened_rates(k_He4_O16_to_Ne20)*Y(O16)*state.rho - screened_rates(k_He4_Si28_to_S32)*Y(Si28)*state.rho - screened_rates(k_He4_Si28_to_p_P31_derived)*Y(Si28)*state.rho - screened_rates(k_S32_He4_to_Ar36_approx)*Y(S32)*state.rho - screened_rates(k_Ti44_He4_to_Cr48_approx)*Y(Ti44)*state.rho; + jac.set(He4, He4, scratch); + + scratch = 1.0*screened_rates(k_C12_C12_to_He4_Ne20)*Y(C12)*state.rho + screened_rates(k_C12_O16_to_He4_Mg24)*Y(O16)*state.rho + 3.0*screened_rates(k_C12_to_He4_He4_He4_derived) - screened_rates(k_He4_C12_to_O16)*Y(He4)*state.rho; + jac.set(He4, C12, scratch); + + scratch = -screened_rates(k_He4_N13_to_p_O16)*Y(He4)*state.rho; + jac.set(He4, N13, scratch); + + scratch = screened_rates(k_C12_O16_to_He4_Mg24)*Y(C12)*state.rho - screened_rates(k_He4_O16_to_Ne20)*Y(He4)*state.rho + 1.0*screened_rates(k_O16_O16_to_He4_Si28)*Y(O16)*state.rho + screened_rates(k_O16_to_He4_C12_derived) + screened_rates(k_p_O16_to_He4_N13_derived)*Y(H1)*state.rho; + jac.set(He4, O16, scratch); + + scratch = -screened_rates(k_He4_Ne20_to_Mg24)*Y(He4)*state.rho - screened_rates(k_He4_Ne20_to_p_Na23_derived)*Y(He4)*state.rho + screened_rates(k_Ne20_to_He4_O16_derived); + jac.set(He4, Ne20, scratch); + + scratch = screened_rates(k_p_Na23_to_He4_Ne20)*Y(H1)*state.rho; + jac.set(He4, Na23, scratch); + + scratch = -screened_rates(k_He4_Mg24_to_Si28)*Y(He4)*state.rho - screened_rates(k_He4_Mg24_to_p_Al27_derived)*Y(He4)*state.rho + screened_rates(k_Mg24_to_He4_Ne20_derived); + jac.set(He4, Mg24, scratch); + + scratch = screened_rates(k_p_Al27_to_He4_Mg24)*Y(H1)*state.rho; + jac.set(He4, Al27, scratch); + + scratch = -screened_rates(k_He4_Si28_to_S32)*Y(He4)*state.rho - screened_rates(k_He4_Si28_to_p_P31_derived)*Y(He4)*state.rho + screened_rates(k_Si28_to_He4_Mg24_derived); + jac.set(He4, Si28, scratch); + + scratch = screened_rates(k_p_P31_to_He4_Si28)*Y(H1)*state.rho; + jac.set(He4, P31, scratch); + + scratch = -screened_rates(k_S32_He4_to_Ar36_approx)*Y(He4)*state.rho + screened_rates(k_S32_to_He4_Si28_derived); + jac.set(He4, S32, scratch); + + scratch = -screened_rates(k_Ar36_He4_to_Ca40_approx)*Y(He4)*state.rho + screened_rates(k_Ar36_to_S32_He4_approx); + jac.set(He4, Ar36, scratch); + + scratch = -screened_rates(k_Ca40_He4_to_Ti44_approx)*Y(He4)*state.rho + screened_rates(k_Ca40_to_Ar36_He4_approx); + jac.set(He4, Ca40, scratch); + + scratch = -screened_rates(k_Ti44_He4_to_Cr48_approx)*Y(He4)*state.rho + screened_rates(k_Ti44_to_Ca40_He4_approx); + jac.set(He4, Ti44, scratch); + + scratch = -screened_rates(k_Cr48_He4_to_Fe52_approx)*Y(He4)*state.rho + screened_rates(k_Cr48_to_Ti44_He4_approx); + jac.set(He4, Cr48, scratch); + + scratch = -screened_rates(k_Fe52_He4_to_Ni56_approx)*Y(He4)*state.rho + screened_rates(k_Fe52_to_Cr48_He4_approx); + jac.set(He4, Fe52, scratch); + + scratch = screened_rates(k_Ni56_to_Fe52_He4_approx); + jac.set(He4, Ni56, scratch); + + scratch = -screened_rates(k_p_C12_to_N13)*Y(C12)*state.rho; + jac.set(C12, H1, scratch); + + scratch = -screened_rates(k_He4_C12_to_O16)*Y(C12)*state.rho + 0.5*screened_rates(k_He4_He4_He4_to_C12)*std::pow(Y(He4), 2)*std::pow(state.rho, 2); + jac.set(C12, He4, scratch); + + scratch = -2.0*screened_rates(k_C12_C12_to_He4_Ne20)*Y(C12)*state.rho - 2.0*screened_rates(k_C12_C12_to_Mg24_modified)*Y(C12)*state.rho - 2.0*screened_rates(k_C12_C12_to_p_Na23)*Y(C12)*state.rho - screened_rates(k_C12_O16_to_He4_Mg24)*Y(O16)*state.rho - screened_rates(k_C12_O16_to_Si28_modified)*Y(O16)*state.rho - screened_rates(k_C12_O16_to_p_Al27)*Y(O16)*state.rho - screened_rates(k_C12_to_He4_He4_He4_derived) - screened_rates(k_He4_C12_to_O16)*Y(He4)*state.rho - screened_rates(k_p_C12_to_N13)*Y(H1)*state.rho; + jac.set(C12, C12, scratch); + + scratch = screened_rates(k_N13_to_p_C12_derived); + jac.set(C12, N13, scratch); + + scratch = -screened_rates(k_C12_O16_to_He4_Mg24)*Y(C12)*state.rho - screened_rates(k_C12_O16_to_Si28_modified)*Y(C12)*state.rho - screened_rates(k_C12_O16_to_p_Al27)*Y(C12)*state.rho + screened_rates(k_O16_to_He4_C12_derived); + jac.set(C12, O16, scratch); + + scratch = screened_rates(k_p_C12_to_N13)*Y(C12)*state.rho + screened_rates(k_p_O16_to_He4_N13_derived)*Y(O16)*state.rho; + jac.set(N13, H1, scratch); + + scratch = -screened_rates(k_He4_N13_to_p_O16)*Y(N13)*state.rho; + jac.set(N13, He4, scratch); + + scratch = screened_rates(k_p_C12_to_N13)*Y(H1)*state.rho; + jac.set(N13, C12, scratch); + + scratch = -screened_rates(k_He4_N13_to_p_O16)*Y(He4)*state.rho - screened_rates(k_N13_to_p_C12_derived); + jac.set(N13, N13, scratch); + + scratch = screened_rates(k_p_O16_to_He4_N13_derived)*Y(H1)*state.rho; + jac.set(N13, O16, scratch); + + scratch = -screened_rates(k_p_O16_to_He4_N13_derived)*Y(O16)*state.rho; + jac.set(O16, H1, scratch); + + scratch = screened_rates(k_He4_C12_to_O16)*Y(C12)*state.rho + screened_rates(k_He4_N13_to_p_O16)*Y(N13)*state.rho - screened_rates(k_He4_O16_to_Ne20)*Y(O16)*state.rho; + jac.set(O16, He4, scratch); + + scratch = -screened_rates(k_C12_O16_to_He4_Mg24)*Y(O16)*state.rho - screened_rates(k_C12_O16_to_Si28_modified)*Y(O16)*state.rho - screened_rates(k_C12_O16_to_p_Al27)*Y(O16)*state.rho + screened_rates(k_He4_C12_to_O16)*Y(He4)*state.rho; + jac.set(O16, C12, scratch); + + scratch = screened_rates(k_He4_N13_to_p_O16)*Y(He4)*state.rho; + jac.set(O16, N13, scratch); + + scratch = -screened_rates(k_C12_O16_to_He4_Mg24)*Y(C12)*state.rho - screened_rates(k_C12_O16_to_Si28_modified)*Y(C12)*state.rho - screened_rates(k_C12_O16_to_p_Al27)*Y(C12)*state.rho - screened_rates(k_He4_O16_to_Ne20)*Y(He4)*state.rho - 2.0*screened_rates(k_O16_O16_to_He4_Si28)*Y(O16)*state.rho - 2.0*screened_rates(k_O16_O16_to_S32_modified)*Y(O16)*state.rho - 2.0*screened_rates(k_O16_O16_to_p_P31)*Y(O16)*state.rho - screened_rates(k_O16_to_He4_C12_derived) - screened_rates(k_p_O16_to_He4_N13_derived)*Y(H1)*state.rho; + jac.set(O16, O16, scratch); + + scratch = screened_rates(k_Ne20_to_He4_O16_derived); + jac.set(O16, Ne20, scratch); + + scratch = screened_rates(k_p_Na23_to_He4_Ne20)*Y(Na23)*state.rho; + jac.set(Ne20, H1, scratch); + + scratch = -screened_rates(k_He4_Ne20_to_Mg24)*Y(Ne20)*state.rho - screened_rates(k_He4_Ne20_to_p_Na23_derived)*Y(Ne20)*state.rho + screened_rates(k_He4_O16_to_Ne20)*Y(O16)*state.rho; + jac.set(Ne20, He4, scratch); + + scratch = 1.0*screened_rates(k_C12_C12_to_He4_Ne20)*Y(C12)*state.rho; + jac.set(Ne20, C12, scratch); + + scratch = screened_rates(k_He4_O16_to_Ne20)*Y(He4)*state.rho; + jac.set(Ne20, O16, scratch); + + scratch = -screened_rates(k_He4_Ne20_to_Mg24)*Y(He4)*state.rho - screened_rates(k_He4_Ne20_to_p_Na23_derived)*Y(He4)*state.rho - screened_rates(k_Ne20_to_He4_O16_derived); + jac.set(Ne20, Ne20, scratch); + + scratch = screened_rates(k_p_Na23_to_He4_Ne20)*Y(H1)*state.rho; + jac.set(Ne20, Na23, scratch); + + scratch = screened_rates(k_Mg24_to_He4_Ne20_derived); + jac.set(Ne20, Mg24, scratch); + + scratch = -screened_rates(k_p_Na23_to_He4_Ne20)*Y(Na23)*state.rho - screened_rates(k_p_Na23_to_Mg24)*Y(Na23)*state.rho; + jac.set(Na23, H1, scratch); + + scratch = screened_rates(k_He4_Ne20_to_p_Na23_derived)*Y(Ne20)*state.rho; + jac.set(Na23, He4, scratch); + + scratch = 1.0*screened_rates(k_C12_C12_to_p_Na23)*Y(C12)*state.rho; + jac.set(Na23, C12, scratch); + + scratch = screened_rates(k_He4_Ne20_to_p_Na23_derived)*Y(He4)*state.rho; + jac.set(Na23, Ne20, scratch); + + scratch = -screened_rates(k_p_Na23_to_He4_Ne20)*Y(H1)*state.rho - screened_rates(k_p_Na23_to_Mg24)*Y(H1)*state.rho; + jac.set(Na23, Na23, scratch); + + scratch = screened_rates(k_Mg24_to_p_Na23_derived); + jac.set(Na23, Mg24, scratch); + + scratch = screened_rates(k_p_Al27_to_He4_Mg24)*Y(Al27)*state.rho + screened_rates(k_p_Na23_to_Mg24)*Y(Na23)*state.rho; + jac.set(Mg24, H1, scratch); + + scratch = -screened_rates(k_He4_Mg24_to_Si28)*Y(Mg24)*state.rho - screened_rates(k_He4_Mg24_to_p_Al27_derived)*Y(Mg24)*state.rho + screened_rates(k_He4_Ne20_to_Mg24)*Y(Ne20)*state.rho; + jac.set(Mg24, He4, scratch); + + scratch = 1.0*screened_rates(k_C12_C12_to_Mg24_modified)*Y(C12)*state.rho + screened_rates(k_C12_O16_to_He4_Mg24)*Y(O16)*state.rho; + jac.set(Mg24, C12, scratch); + + scratch = screened_rates(k_C12_O16_to_He4_Mg24)*Y(C12)*state.rho; + jac.set(Mg24, O16, scratch); + + scratch = screened_rates(k_He4_Ne20_to_Mg24)*Y(He4)*state.rho; + jac.set(Mg24, Ne20, scratch); + + scratch = screened_rates(k_p_Na23_to_Mg24)*Y(H1)*state.rho; + jac.set(Mg24, Na23, scratch); + + scratch = -screened_rates(k_He4_Mg24_to_Si28)*Y(He4)*state.rho - screened_rates(k_He4_Mg24_to_p_Al27_derived)*Y(He4)*state.rho - screened_rates(k_Mg24_to_He4_Ne20_derived) - screened_rates(k_Mg24_to_p_Na23_derived); + jac.set(Mg24, Mg24, scratch); + + scratch = screened_rates(k_p_Al27_to_He4_Mg24)*Y(H1)*state.rho; + jac.set(Mg24, Al27, scratch); + + scratch = screened_rates(k_Si28_to_He4_Mg24_derived); + jac.set(Mg24, Si28, scratch); + + scratch = -screened_rates(k_p_Al27_to_He4_Mg24)*Y(Al27)*state.rho - screened_rates(k_p_Al27_to_Si28)*Y(Al27)*state.rho; + jac.set(Al27, H1, scratch); + + scratch = screened_rates(k_He4_Mg24_to_p_Al27_derived)*Y(Mg24)*state.rho; + jac.set(Al27, He4, scratch); + + scratch = screened_rates(k_C12_O16_to_p_Al27)*Y(O16)*state.rho; + jac.set(Al27, C12, scratch); + + scratch = screened_rates(k_C12_O16_to_p_Al27)*Y(C12)*state.rho; + jac.set(Al27, O16, scratch); + + scratch = screened_rates(k_He4_Mg24_to_p_Al27_derived)*Y(He4)*state.rho; + jac.set(Al27, Mg24, scratch); + + scratch = -screened_rates(k_p_Al27_to_He4_Mg24)*Y(H1)*state.rho - screened_rates(k_p_Al27_to_Si28)*Y(H1)*state.rho; + jac.set(Al27, Al27, scratch); + + scratch = screened_rates(k_Si28_to_p_Al27_derived); + jac.set(Al27, Si28, scratch); + + scratch = screened_rates(k_p_Al27_to_Si28)*Y(Al27)*state.rho + screened_rates(k_p_P31_to_He4_Si28)*Y(P31)*state.rho; + jac.set(Si28, H1, scratch); + + scratch = screened_rates(k_He4_Mg24_to_Si28)*Y(Mg24)*state.rho - screened_rates(k_He4_Si28_to_S32)*Y(Si28)*state.rho - screened_rates(k_He4_Si28_to_p_P31_derived)*Y(Si28)*state.rho; + jac.set(Si28, He4, scratch); + + scratch = screened_rates(k_C12_O16_to_Si28_modified)*Y(O16)*state.rho; + jac.set(Si28, C12, scratch); + + scratch = screened_rates(k_C12_O16_to_Si28_modified)*Y(C12)*state.rho + 1.0*screened_rates(k_O16_O16_to_He4_Si28)*Y(O16)*state.rho; + jac.set(Si28, O16, scratch); + + scratch = screened_rates(k_He4_Mg24_to_Si28)*Y(He4)*state.rho; + jac.set(Si28, Mg24, scratch); + + scratch = screened_rates(k_p_Al27_to_Si28)*Y(H1)*state.rho; + jac.set(Si28, Al27, scratch); + + scratch = -screened_rates(k_He4_Si28_to_S32)*Y(He4)*state.rho - screened_rates(k_He4_Si28_to_p_P31_derived)*Y(He4)*state.rho - screened_rates(k_Si28_to_He4_Mg24_derived) - screened_rates(k_Si28_to_p_Al27_derived); + jac.set(Si28, Si28, scratch); + + scratch = screened_rates(k_p_P31_to_He4_Si28)*Y(H1)*state.rho; + jac.set(Si28, P31, scratch); + + scratch = screened_rates(k_S32_to_He4_Si28_derived); + jac.set(Si28, S32, scratch); + + scratch = -screened_rates(k_p_P31_to_He4_Si28)*Y(P31)*state.rho - screened_rates(k_p_P31_to_S32)*Y(P31)*state.rho; + jac.set(P31, H1, scratch); + + scratch = screened_rates(k_He4_Si28_to_p_P31_derived)*Y(Si28)*state.rho; + jac.set(P31, He4, scratch); + + scratch = 1.0*screened_rates(k_O16_O16_to_p_P31)*Y(O16)*state.rho; + jac.set(P31, O16, scratch); + + scratch = screened_rates(k_He4_Si28_to_p_P31_derived)*Y(He4)*state.rho; + jac.set(P31, Si28, scratch); + + scratch = -screened_rates(k_p_P31_to_He4_Si28)*Y(H1)*state.rho - screened_rates(k_p_P31_to_S32)*Y(H1)*state.rho; + jac.set(P31, P31, scratch); + + scratch = screened_rates(k_S32_to_p_P31_derived); + jac.set(P31, S32, scratch); + + scratch = screened_rates(k_p_P31_to_S32)*Y(P31)*state.rho; + jac.set(S32, H1, scratch); + + scratch = screened_rates(k_He4_Si28_to_S32)*Y(Si28)*state.rho - screened_rates(k_S32_He4_to_Ar36_approx)*Y(S32)*state.rho; + jac.set(S32, He4, scratch); + + scratch = 1.0*screened_rates(k_O16_O16_to_S32_modified)*Y(O16)*state.rho; + jac.set(S32, O16, scratch); + + scratch = screened_rates(k_He4_Si28_to_S32)*Y(He4)*state.rho; + jac.set(S32, Si28, scratch); + + scratch = screened_rates(k_p_P31_to_S32)*Y(H1)*state.rho; + jac.set(S32, P31, scratch); + + scratch = -screened_rates(k_S32_He4_to_Ar36_approx)*Y(He4)*state.rho - screened_rates(k_S32_to_He4_Si28_derived) - screened_rates(k_S32_to_p_P31_derived); + jac.set(S32, S32, scratch); + + scratch = screened_rates(k_Ar36_to_S32_He4_approx); + jac.set(S32, Ar36, scratch); + + scratch = -screened_rates(k_Ar36_He4_to_Ca40_approx)*Y(Ar36)*state.rho + screened_rates(k_S32_He4_to_Ar36_approx)*Y(S32)*state.rho; + jac.set(Ar36, He4, scratch); + + scratch = screened_rates(k_S32_He4_to_Ar36_approx)*Y(He4)*state.rho; + jac.set(Ar36, S32, scratch); + + scratch = -screened_rates(k_Ar36_He4_to_Ca40_approx)*Y(He4)*state.rho - screened_rates(k_Ar36_to_S32_He4_approx); + jac.set(Ar36, Ar36, scratch); + + scratch = screened_rates(k_Ca40_to_Ar36_He4_approx); + jac.set(Ar36, Ca40, scratch); + + scratch = screened_rates(k_Ar36_He4_to_Ca40_approx)*Y(Ar36)*state.rho - screened_rates(k_Ca40_He4_to_Ti44_approx)*Y(Ca40)*state.rho; + jac.set(Ca40, He4, scratch); + + scratch = screened_rates(k_Ar36_He4_to_Ca40_approx)*Y(He4)*state.rho; + jac.set(Ca40, Ar36, scratch); + + scratch = -screened_rates(k_Ca40_He4_to_Ti44_approx)*Y(He4)*state.rho - screened_rates(k_Ca40_to_Ar36_He4_approx); + jac.set(Ca40, Ca40, scratch); + + scratch = screened_rates(k_Ti44_to_Ca40_He4_approx); + jac.set(Ca40, Ti44, scratch); + + scratch = screened_rates(k_Ca40_He4_to_Ti44_approx)*Y(Ca40)*state.rho - screened_rates(k_Ti44_He4_to_Cr48_approx)*Y(Ti44)*state.rho; + jac.set(Ti44, He4, scratch); + + scratch = screened_rates(k_Ca40_He4_to_Ti44_approx)*Y(He4)*state.rho; + jac.set(Ti44, Ca40, scratch); + + scratch = -screened_rates(k_Ti44_He4_to_Cr48_approx)*Y(He4)*state.rho - screened_rates(k_Ti44_to_Ca40_He4_approx); + jac.set(Ti44, Ti44, scratch); + + scratch = screened_rates(k_Cr48_to_Ti44_He4_approx); + jac.set(Ti44, Cr48, scratch); + + scratch = -screened_rates(k_Cr48_He4_to_Fe52_approx)*Y(Cr48)*state.rho + screened_rates(k_Ti44_He4_to_Cr48_approx)*Y(Ti44)*state.rho; + jac.set(Cr48, He4, scratch); + + scratch = screened_rates(k_Ti44_He4_to_Cr48_approx)*Y(He4)*state.rho; + jac.set(Cr48, Ti44, scratch); + + scratch = -screened_rates(k_Cr48_He4_to_Fe52_approx)*Y(He4)*state.rho - screened_rates(k_Cr48_to_Ti44_He4_approx); + jac.set(Cr48, Cr48, scratch); + + scratch = screened_rates(k_Fe52_to_Cr48_He4_approx); + jac.set(Cr48, Fe52, scratch); + + scratch = screened_rates(k_Cr48_He4_to_Fe52_approx)*Y(Cr48)*state.rho - screened_rates(k_Fe52_He4_to_Ni56_approx)*Y(Fe52)*state.rho; + jac.set(Fe52, He4, scratch); + + scratch = screened_rates(k_Cr48_He4_to_Fe52_approx)*Y(He4)*state.rho; + jac.set(Fe52, Cr48, scratch); + + scratch = -screened_rates(k_Fe52_He4_to_Ni56_approx)*Y(He4)*state.rho - screened_rates(k_Fe52_to_Cr48_He4_approx); + jac.set(Fe52, Fe52, scratch); + + scratch = screened_rates(k_Ni56_to_Fe52_He4_approx); + jac.set(Fe52, Ni56, scratch); + + scratch = screened_rates(k_Fe52_He4_to_Ni56_approx)*Y(Fe52)*state.rho; + jac.set(Ni56, He4, scratch); + + scratch = screened_rates(k_Fe52_He4_to_Ni56_approx)*Y(He4)*state.rho; + jac.set(Ni56, Fe52, scratch); + + scratch = -screened_rates(k_Ni56_to_Fe52_He4_approx); + jac.set(Ni56, Ni56, scratch); + + +} + + + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void actual_jac(const burn_t& state, MatrixType& jac) +{ + + // Set molar abundances + Array1D Y; + for (int i = 1; i <= NumSpec; ++i) { + Y(i) = state.xn[i-1] * aion_inv[i-1]; + } + + + jac.zero(); + + rate_derivs_t rate_eval; + + constexpr int do_T_derivatives = 1; + + evaluate_rates(state, rate_eval); + + // Species Jacobian elements with respect to other species + + jac_nuc(state, jac, Y, rate_eval.screened_rates); + + // Energy generation rate Jacobian elements with respect to species + + for (int j = 1; j <= NumSpec; ++j) { + auto jac_slice_2 = [&](int i) -> Real { return jac.get(i, j); }; + ener_gener_rate(jac_slice_2, jac(net_ienuc,j)); + } + + // Account for the thermal neutrino losses + + Real sneut, dsneutdt, dsneutdd, dsnuda, dsnudz; + constexpr int do_derivatives{1}; + sneut5(state.T, state.rho, state.abar, state.zbar, sneut, dsneutdt, dsneutdd, dsnuda, dsnudz); + + for (int j = 1; j <= NumSpec; ++j) { + Real b1 = (-state.abar * state.abar * dsnuda + (zion[j-1] - state.zbar) * state.abar * dsnudz); + jac.add(net_ienuc, j, -b1); + } + + + // Evaluate the Jacobian elements with respect to energy by + // calling the RHS using d(rate) / dT and then transform them + // to our energy integration variable. + + Array1D yderivs; + + rhs_nuc(state, yderivs, Y, rate_eval.dscreened_rates_dT); + + for (int k = 1; k <= NumSpec; k++) { + jac.set(k, net_ienuc, temperature_to_energy_jacobian(state, yderivs(k))); + } + + + // finally, d(de/dt)/de + + Real jac_e_T; + ener_gener_rate(yderivs, jac_e_T); + jac_e_T -= dsneutdt; + jac.set(net_ienuc, net_ienuc, temperature_to_energy_jacobian(state, jac_e_T)); + +} + + +AMREX_INLINE +void actual_rhs_init () { + + init_tabular(); + +} + + +#endif diff --git a/networks/subch_base/inputs.burn_cell.VODE b/networks/subch_base/inputs.burn_cell.VODE new file mode 100644 index 0000000000..97d030b678 --- /dev/null +++ b/networks/subch_base/inputs.burn_cell.VODE @@ -0,0 +1,44 @@ +unit_test.run_prefix = "react_pynucastro_" + +unit_test.small_temp = 1e5 +unit_test.small_dens = 1e5 + +integrator.burner_verbose = 0 + +# Set which jacobian to use +# 1 = analytic jacobian +# 2 = numerical jacobian +integrator.jacobian = 1 + +integrator.renormalize_abundances = 0 + +integrator.rtol_spec = 1.0e-6 +integrator.rtol_enuc = 1.0e-6 +integrator.atol_spec = 1.0e-6 +integrator.atol_enuc = 1.0e-6 + + +unit_test.tmax = 1.0 +unit_test.nsteps = 1000 + +unit_test.density = 1.0e7 +unit_test.temperature = 1.0e8 + +unit_test.X1 = 1.0 +unit_test.X2 = 0.0 +unit_test.X3 = 0.0 +unit_test.X4 = 0.0 +unit_test.X5 = 0.0 +unit_test.X6 = 0.0 +unit_test.X7 = 0.0 +unit_test.X8 = 0.0 +unit_test.X9 = 0.0 +unit_test.X10 = 0.0 +unit_test.X11 = 0.0 +unit_test.X12 = 0.0 +unit_test.X13 = 0.0 +unit_test.X14 = 0.0 +unit_test.X15 = 0.0 +unit_test.X16 = 0.0 +unit_test.X17 = 0.0 +unit_test.X18 = 0.0 diff --git a/networks/subch_base/partition_functions.H b/networks/subch_base/partition_functions.H new file mode 100644 index 0000000000..109f71d59a --- /dev/null +++ b/networks/subch_base/partition_functions.H @@ -0,0 +1,650 @@ +#ifndef PARTITION_FUNCTIONS_H +#define PARTITION_FUNCTIONS_H + +#include +#include + +#include +#include +#include + +using namespace amrex; +using namespace Species; + +namespace part_fun { + + constexpr int npts_1 = 72; + + // this is T9 + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real temp_array_1[npts_1] = { + 0.01, 0.15, 0.2, 0.3, 0.4, + 0.5, 0.6, 0.7, 0.8, 0.9, + 1.0, 1.5, 2.0, 2.5, 3.0, + 3.5, 4.0, 4.5, 5.0, 6.0, + 7.0, 8.0, 9.0, 10.0, 12.0, + 14.0, 16.0, 18.0, 20.0, 22.0, + 24.0, 26.0, 28.0, 30.0, 35.0, + 40.0, 45.0, 50.0, 55.0, 60.0, + 65.0, 70.0, 75.0, 80.0, 85.0, + 90.0, 95.0, 100.0, 105.0, 110.0, + 115.0, 120.0, 125.0, 130.0, 135.0, + 140.0, 145.0, 150.0, 155.0, 160.0, + 165.0, 170.0, 175.0, 180.0, 190.0, + 200.0, 210.0, 220.0, 230.0, 240.0, + 250.0, 275.0, + }; + + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real O16_pf_array[npts_1] = { + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.012837224705172217, + 0.03742649794062367, 0.07188200730612536, 0.1205739312058499, 0.1846914308175988, 0.26245108973042947, + 0.3463529744506387, 0.437750562820388, 0.534026106056135, 0.6344772701607315, 0.8981764834976765, + 1.1760912590556813, 1.4668676203541096, 1.7641761323903307, 2.0644579892269186, 2.367355921026019, + 2.667452952889954, 2.9656719712201065, 3.2624510897304293, 3.555094448578319, 3.845098040014257, + 4.133538908370218, 4.419955748489758, 4.704150516839799, 4.986771734266245, 5.267171728403014, + 5.547774705387822, 5.8267225201689925, 6.103803720955957, 6.380211241711606, 6.6551384348113825, + 6.929929560084588, 7.204119982655925, 7.477121254719663, 7.748962861256161, 8.021189299069938, + 8.292256071356476, 8.562292864456476, 8.832508912706237, 9.100370545117563, 9.640481436970422, + 10.178976947293169, 10.714329759745233, 11.250420002308894, 11.785329835010767, 12.320146286111054, + 12.856124444242301, 14.195899652409233, + }; + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real Ne20_pf_array[npts_1] = { + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 6.948656121358244e-06, 0.00016586881316040883, 0.0011034421778731533, 0.003892457497077877, + 0.00954097493969645, 0.01859524021829981, 0.03107544483336982, 0.04661767038571622, 0.0846241727916796, + 0.12822183093465686, 0.174311933665943, 0.22124805254602342, 0.2683385291343481, 0.36172783601759284, + 0.456366033129043, 0.5514499979728752, 0.6483600109809317, 0.7466341989375788, 0.8481891169913987, + 0.9532763366673044, 1.0644579892269186, 1.1789769472931695, 1.3031960574204888, 1.6434526764861874, + 2.0170333392987803, 2.4099331233312946, 2.8068580295188172, 3.2013971243204513, 3.5899496013257077, + 3.9731278535996988, 4.352182518111363, 4.725911632295048, 5.096910013008056, 5.465382851448418, + 5.830588668685144, 6.193124598354461, 6.556302500767288, 6.916980047320382, 7.276461804173244, + 7.6344772701607315, 7.991669007379948, 8.34830486304816, 8.703291378118662, 9.056904851336473, + 9.411619705963231, 9.763427993562937, 10.117271295655764, 10.46686762035411, 10.818225893613956, + 11.170261715394957, 11.519827993775719, 11.869231719730976, 12.217483944213907, 12.916453948549925, + 13.613841821876068, 14.3096301674259, 15.004321373782643, 15.702430536445526, 16.399673721481037, + 17.096910013008056, 18.838849090737256, + }; + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real Na23_pf_array[npts_1] = { + 0.0, 0.0, 0.0, 0.0, 1.7371744532199383e-06, + 2.3885539658322847e-05, 0.00013113713282427166, 0.0004423207528904243, 0.0010999766245234136, 0.002232173197636284, + 0.003929471989446119, 0.021128907257497758, 0.0479649055541949, 0.07726249885377771, 0.10525805048344757, + 0.13079227003361296, 0.15390201926318714, 0.17503899265296466, 0.19472325248715508, 0.23147162936712465, + 0.26668504599022796, 0.3016913566252569, 0.33713446730536967, 0.37335950050705796, 0.4487063199050799, + 0.5314789170422551, 0.6211762817750351, 0.7218106152125465, 0.8344207036815325, 0.9590413923210935, + 1.0934216851622351, 1.2405492482825997, 1.3926969532596658, 1.5514499979728753, 1.9628426812012425, + 2.383815365980431, 2.803457115648414, 3.220108088040055, 3.6344772701607315, 4.045322978786658, + 4.453318340047038, 4.857935264719429, 5.26245108973043, 5.664641975556125, 6.064457989226918, + 6.466867620354109, 6.867467487859051, 7.267171728403014, 7.666517980554881, 8.064457989226918, + 8.463892988985908, 8.861534410859038, 9.260071387985075, 9.656098202012831, 10.05307844348342, + 10.450249108319362, 10.846337112129806, 11.243038048686294, 11.638489256954637, 12.03342375548695, + 12.429752280002408, 12.826074802700827, 13.222716471147583, 13.6170003411209, 14.40823996531185, + 15.20139712432045, 15.993876914941211, 16.787460474518415, 17.582063362911708, 18.378397900948137, + 19.17609125905568, 21.173186268412273, + }; + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real Mg24_pf_array[npts_1] = { + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, + 4.342942647204277e-07, 5.471765757979972e-05, 0.0007714899373308071, 0.0037633124724497633, 0.010764115210255056, + 0.022625058328435317, 0.039160607597355665, 0.05951911533271758, 0.08262238957783377, 0.13324118689139802, + 0.185518640557017, 0.2370005304649223, 0.2870228837145503, 0.3357157930198095, 0.43136376415898736, + 0.5263392773898441, 0.6253124509616739, 0.7307822756663892, 0.8463371121298052, 0.9749719942980689, + 1.1172712956557642, 1.2741578492636798, 1.4424797690644486, 1.6232492903979006, 2.103803720955957, + 2.598790506763115, 3.089905111439398, 3.577491799837225, 4.05307844348342, 4.52244423350632, + 4.984527313343793, 5.440909082065217, 5.894869656745253, 6.344392273685111, 6.791690649020118, + 7.235528446907549, 7.6785183790401135, 8.12057393120585, 8.558708570533165, 8.99563519459755, + 9.431363764158988, 9.866287339084195, 10.301029995663981, 10.732393759822969, 11.164352855784436, + 11.594392550375426, 12.02530586526477, 12.453318340047037, 12.881384656770573, 13.3096301674259, + 13.736396502276643, 14.161368002234974, 14.588831725594208, 15.012837224705173, 15.86569605991607, + 16.715167357848458, 17.56466606425209, 18.413299764081252, 19.26245108973043, 20.113943352306837, + 20.96284268120124, 23.089905111439396, + }; + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real Al27_pf_array[npts_1] = { + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 8.685880952436747e-07, 3.4743419578801875e-06, + 1.0422942490878872e-05, 0.00032429686817590634, 0.0018833542475028369, 0.005477808032249925, 0.011239204769804155, + 0.01890428637893266, 0.028126564553716336, 0.03862016194970278, 0.05018673657450416, 0.07608019569340022, + 0.10530099179798431, 0.13774106877747655, 0.1734986149135784, 0.21278880583973628, 0.30319605742048883, + 0.4099331233312945, 0.5352941200427705, 0.6794278966121189, 0.8394780473741984, 1.0128372247051722, + 1.1958996524092338, 1.3873898263387294, 1.5843312243675307, 1.783903579272735, 2.287801729930226, + 2.7944880466591697, 3.296665190261531, 3.7944880466591697, 4.2878017299302265, 4.779596491257824, + 5.269512944217916, 5.7558748556724915, 6.2405492482825995, 6.725094521081469, 7.209515014542631, + 7.691081492122969, 8.173186268412275, 8.653212513775344, 9.133538908370218, 9.611723308007342, + 10.089905111439398, 10.568201724066995, 11.045322978786658, 11.521138083704036, 11.997386384397313, + 12.472756449317213, 12.947923619831727, 13.423245873936807, 13.89707700320942, 14.371067862271737, + 14.845098040014257, 15.320146286111054, 15.79309160017658, 16.267171728403014, 17.214843848047696, + 18.161368002234976, 19.110589710299248, 20.060697840353612, 21.012837224705173, 21.96284268120124, + 22.915927211697117, 25.305351369446623, + }; + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real Si28_pf_array[npts_1] = { + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 2.1714669808675565e-06, 7.12184552784347e-05, 0.0005624812393818785, 0.002223099674110693, + 0.0059171580771474625, 0.012282407118825528, 0.02157709561709228, 0.03370716078346824, 0.06502557053071237, + 0.1027522772573885, 0.14387160800291654, 0.1866035043986153, 0.2302807913268337, 0.3222192947339193, + 0.42324587393680785, 0.541579243946581, 0.6839471307515121, 0.8518696007297664, 1.041392685158225, + 1.250420002308894, 1.4727564493172123, 1.7024305364455252, 1.9375178920173466, 2.531478917042255, + 3.12057393120585, 3.7024305364455254, 4.271841606536499, 4.834420703681532, 5.389166084364533, + 5.937517892017347, 6.481442628502305, 7.021189299069938, 7.557507201905658, 8.089905111439398, + 8.622214022966295, 9.14921911265538, 9.675778341674086, 10.198657086954423, 10.721810615212547, + 11.2405492482826, 11.75966784468963, 12.276461804173245, 12.791690649020119, 13.305351369446624, + 13.818225893613956, 14.330413773349191, 14.840733234611807, 15.350248018334163, 15.85913829729453, + 16.367355921026018, 16.8750612633917, 17.38201704257487, 17.88874096068289, 18.90036712865647, + 19.911157608739977, 20.921166050637737, 21.9304395947667, 22.93951925261862, 23.948901760970212, + 24.958563883221967, 27.48572142648158, + }; + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real P31_pf_array[npts_1] = { + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, + 4.342942647204277e-07, 4.820401221806151e-05, 0.0005624812393818785, 0.002468018295084159, 0.006670091319158333, + 0.013688955408210905, 0.023674199668938998, 0.03655105068012579, 0.05215275629691826, 0.09085986215557586, + 0.13887811232360858, 0.19608052467040618, 0.26289299085539924, 0.33982852740425823, 0.5237464668115644, + 0.7419390777291989, 0.9827233876685453, 1.235528446907549, 1.4899584794248346, 1.7442929831226763, + 1.9960736544852753, 2.24551266781415, 2.4913616938342726, 2.733999286538387, 3.330413773349191, + 3.9132839017604186, 4.48572142648158, 5.049218022670182, 5.608526033577194, 6.164352855784437, + 6.714329759745233, 7.264817823009537, 7.812913356642856, 8.359835482339887, 8.90687353472207, + 9.453318340047037, 9.997823080745725, 10.54282542695918, 11.086359830674748, 11.629409599102718, + 12.170261715394957, 12.712649701627212, 13.255272505103306, 13.79448804665917, 14.334453751150932, + 14.874481817699467, 15.414973347970818, 15.953276336667304, 16.492760389026838, 17.029383777685208, + 17.570542939881896, 18.10720996964787, 18.64738297011462, 19.187520720836464, 20.264817823009537, + 21.342422680822207, 22.42160392686983, 23.503790683057183, 24.5854607295085, 25.66931688056611, + 26.75511226639507, 29.477121254719663, + }; + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real S32_pf_array[npts_1] = { + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 5.211502513843472e-06, 6.948155872801059e-05, 0.0003893875360542875, + 0.001336870159627728, 0.003378232401258555, 0.006963377556787149, 0.012456734172197398, 0.03011415790845077, + 0.057484285853877215, 0.0950053699501746, 0.14295136988131382, 0.20165707691270435, 0.3521825181113625, + 0.5502283530550941, 0.787460474518415, 1.0569048513364727, 1.3404441148401183, 1.631443769013172, + 1.92272545799326, 2.2121876044039577, 2.4955443375464483, 2.7737864449811935, 3.44870631990508, + 4.096910013008056, 4.726727209026572, 5.3404441148401185, 5.944975908412048, 6.541579243946581, + 7.133538908370218, 7.720985744153739, 8.305351369446624, 8.888740960682892, 9.469822015978163, + 10.049218022670182, 10.628388930050312, 11.20682587603185, 11.78175537465247, 12.356025857193123, + 12.9304395947667, 13.502427119984432, 14.075546961392531, 14.645422269349092, 15.214843848047698, + 15.783903579272735, 16.352182518111363, 16.920123326290724, 17.487138375477187, 18.053078443483418, + 18.621176281775035, 19.187520720836464, 19.753583058892907, 20.318063334962762, 21.450249108319362, + 22.580924975675618, 23.71264970162721, 24.84385542262316, 25.976808337338067, 27.110589710299248, + 28.24551266781415, 31.08635983067475, + }; + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real Cl35_pf_array[npts_1] = { + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 1.8239985202970884e-05, 0.00020710907627919203, 0.0009431313908907785, 0.002698987769012708, + 0.005906875936599731, 0.010907713111778477, 0.017957319425972694, 0.027253766962590423, 0.0532486689285615, + 0.09021853774459236, 0.13964204799692437, 0.20296975189964023, 0.28111453407611076, 0.48000694295715063, + 0.7234556720351858, 0.9934362304976116, 1.2741578492636798, 1.5587085705331658, 1.841984804590114, + 2.123851640967086, 2.401400540781544, 2.678518379040114, 2.951823035315912, 3.6263403673750423, + 4.2878017299302265, 4.942008053022313, 5.588831725594207, 6.230448921378274, 6.870988813760575, + 7.509202522331103, 8.146128035678238, 8.781036938621131, 9.414973347970818, 10.049218022670182, + 10.681241237375588, 11.313867220369154, 11.943988875073773, 12.574031267727719, 13.204119982655925, + 13.831229693867064, 14.457881896733992, 15.086359830674748, 15.710963118995275, 16.33645973384853, + 16.96189547366785, 17.586587304671756, 18.212187604403958, 18.835056101720117, 19.45939248775923, + 20.08278537031645, 20.705863712283918, 21.33041377334919, 21.95375969173323, 23.20139712432045, + 24.450249108319362, 25.699837725867244, 26.950364854376122, 28.20139712432045, 29.456366033129044, + 30.71264970162721, 33.862131379313034, + }; + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real Ar36_pf_array[npts_1] = { + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 4.342942647204277e-07, 2.3451268844214655e-05, 0.00023141729162330258, 0.0010622869460975197, + 0.0031540913067783544, 0.007135153007315866, 0.013474284663478431, 0.02245187936733961, 0.048771089883939175, + 0.08643600351808534, 0.13560900039779808, 0.1965840257248699, 0.2696980636423851, 0.45331834004703764, + 0.6848453616444125, 0.9585638832219674, 1.2624510897304295, 1.5809249756756194, 1.9057958803678685, + 2.230448921378274, 2.550228353055094, 2.8662873390841948, 3.1760912590556813, 3.929418925714293, + 4.657055852857104, 5.365487984890899, 6.060697840353612, 6.746634198937579, 7.426511261364575, + 8.100370545117563, 8.773054693364262, 9.442479769064448, 10.11058971029925, 10.77451696572855, + 11.437750562820387, 12.100370545117563, 12.758911892397974, 13.41664050733828, 14.071882007306126, + 14.727541257028557, 15.38201704257487, 16.03342375548695, 16.684845361644413, 17.33445375115093, + 17.983626287124533, 18.63144376901317, 19.27875360095283, 19.92582757462474, 20.57170883180869, + 21.217483944213907, 21.863322860120455, 22.50785587169583, 23.152288344383056, 24.440909082065218, + 25.72916478969277, 27.01703333929878, 28.305351369446623, 29.595496221825574, 30.885926339801433, + 32.17897694729317, 35.41329976408125, + }; + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real K39_pf_array[npts_1] = { + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 3.908632748276029e-06, 3.4307908925770636e-05, + 0.00016282990201490303, 0.0005394928156396339, 0.0014074368520356395, 0.0031075244141559894, 0.010846721573671135, + 0.028297088943748088, 0.06095682921468604, 0.11414775667614005, 0.1912997955319451, 0.4132997640812518, + 0.7015679850559274, 1.0170333392987803, 1.3384564936046048, 1.6599162000698502, 1.9772662124272926, + 2.292256071356476, 2.6020599913279625, 2.910090545594068, 3.214843848047698, 3.9684829485539352, + 4.710963118995275, 5.444044795918076, 6.173186268412274, 6.897627091290442, 7.619093330626742, + 8.338456493604605, 9.056904851336473, 9.771587480881255, 10.48572142648158, 11.198657086954423, + 11.907948521612273, 12.6170003411209, 13.324282455297693, 14.02938377768521, 14.733999286538387, + 15.437750562820389, 16.139879086401237, 16.839478047374197, 17.539076098792776, 18.238046103128795, + 18.936513742478894, 19.633468455579585, 20.33041377334919, 21.02530586526477, 21.723455672035186, + 22.418301291319747, 23.113943352306837, 23.809559714635267, 24.505149978319906, 25.89542254603941, + 27.285557309007775, 28.678518379040113, 30.071882007306126, 31.465382851448418, 32.860936620700095, + 34.25767857486918, 37.761927838420526, + }; + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real Ca40_pf_array[npts_1] = { + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 3.4743419578801875e-06, + 2.6056887215373325e-05, 0.00012419046343446514, 0.0004254001802063995, 0.0011532564515138494, 0.005324252203746658, + 0.016451245325404363, 0.03938040551055626, 0.07909980819723089, 0.13972800117379408, 0.33041377334919086, + 0.6063813651106049, 0.9385197251764918, 1.2988530764097066, 1.6693168805661123, 2.037426497940624, + 2.403120521175818, 2.761927838420529, 3.113943352306837, 3.459392487759231, 4.301029995663981, + 5.117271295655764, 5.9148718175400505, 6.701567985055927, 7.478566495593843, 8.250420002308894, + 9.01703333929878, 9.781036938621131, 10.540329474790873, 11.296665190261532, 12.049218022670182, + 12.801403710017356, 13.549003262025789, 14.294466226161592, 15.037426497940624, 15.779596491257825, + 16.518513939877888, 17.255272505103306, 17.99211148778695, 18.72591163229505, 19.45939248775923, + 20.19033169817029, 20.920645001406786, 21.650307523131936, 22.378397900948137, 23.10720996964787, + 23.832508912706235, 24.558708570533167, 25.285557309007775, 26.008600171761916, 27.45939248775923, + 28.907948521612273, 30.356025857193124, 31.804820678721164, 33.25285303097989, 34.704150516839796, + 36.15533603746506, 39.78816837114117, + }; + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real Sc43_pf_array[npts_1] = { + 0.0, 1.7371744532199383e-06, 3.2136602621167924e-05, 0.0006088881229004689, 0.0026394223512168323, + 0.006348788305828209, 0.011375876688411647, 0.017242084547645732, 0.02355944464942603, 0.03006796257543875, + 0.03661053325876141, 0.06810122175372875, 0.09804672309111766, 0.12848424511267922, 0.16058766813472455, + 0.1946644458530261, 0.23055748142930874, 0.26792627543589265, 0.3064134462100847, 0.3856843680943845, + 0.4672642331672854, 0.5514418243762168, 0.6393550853495756, 0.732465412501299, 0.9380190974762103, + 1.1760912590556813, 1.4456042032735976, 1.7371926427047373, 2.0453229787866576, 2.359835482339888, + 2.678518379040114, 3.0, 3.322219294733919, 3.6424645202421213, 4.439332693830263, + 5.230448921378274, 6.017033339298781, 6.8020892578817325, 7.585460729508501, 8.36735592102602, + 9.14921911265538, 9.929418925714293, 10.710117365111817, 11.489958479424836, 12.267171728403014, + 13.045322978786658, 13.822168079368018, 14.597695185925513, 15.371067862271737, 16.146128035678238, + 16.916453948549925, 17.687528961214635, 18.45788189673399, 19.227886704613674, 19.99694924849538, + 20.76492298464989, 21.532754378992497, 22.30102999566398, 23.068185861746162, 23.835690571492425, + 24.602059991327963, 25.369215857410143, 26.136720567156406, 26.903632516084237, 28.439332693830263, + 29.97497199429807, 31.511883360978874, 33.05307844348342, 34.59217675739587, 36.13672056715641, + 37.68214507637383, 41.55870857053316, + }; + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real Ti44_pf_array[npts_1] = { + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 4.342942647204277e-07, 1.7371744532199383e-06, + 7.382943437485089e-06, 0.0004987179011085028, 0.004043078170724821, 0.01413521502778782, 0.032426549056877405, + 0.05856115101668825, 0.09131586357749837, 0.1294359425571275, 0.17190802974603506, 0.2667731684215763, + 0.37035022176288673, 0.47788465213962983, 0.5860935485551829, 0.693748838923791, 0.9116901587538612, + 1.1522883443830565, 1.4409090820652177, 1.7788744720027396, 2.1522883443830563, 2.5415792439465807, + 2.9334872878487053, 3.322219294733919, 3.7041505168397992, 4.079181246047625, 4.996073654485276, + 5.885361220031512, 6.757396028793024, 7.619093330626742, 8.472756449317213, 9.32221929473392, + 10.167317334748176, 11.008600171761918, 11.85003325768977, 12.687528961214634, 13.52244423350632, + 14.354108439147401, 15.1846914308176, 16.012837224705173, 16.836956737059552, 17.65991620006985, + 18.481442628502304, 19.298853076409706, 20.117271295655765, 20.9329808219232, 21.746634198937578, + 22.559906625036113, 23.371067862271737, 24.181843587944773, 24.991226075692495, 25.799340549453582, + 26.60745502321467, 27.414973347970818, 28.220108088040057, 29.02530586526477, 30.63748972951251, + 32.247973266361804, 33.8561244442423, 35.46538285144842, 37.07554696139253, 38.68484536164441, + 40.29666519026153, 44.33041377334919, + }; + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real V47_pf_array[npts_1] = { + 2.518834949526704e-05, 0.0007584840322833457, 0.004226764680268442, 0.024475815916759104, 0.05998274311239668, + 0.10280266491559079, 0.14672973694476377, 0.1885209834473098, 0.22688178294786615, 0.2615226538586488, + 0.29260868165003595, 0.4071409645052156, 0.48021742410342627, 0.5329079468954852, 0.5750746363992424, + 0.6115960803783954, 0.6450760714077263, 0.6770396273057074, 0.708482088001612, 0.7725618227871047, + 0.8417322779915452, 0.9194240819892174, 1.0083997539725875, 1.110602503281611, 1.3560258571931227, + 1.651278013998144, 1.9813655090785445, 2.330413773349191, 2.6884198220027105, 3.0492180226701815, + 3.41161970596323, 3.7708520116421442, 4.127104798364807, 4.484299839346786, 5.365487984890899, + 6.238046103128795, 7.103803720955957, 7.967547976218862, 8.830588668685145, 9.69460519893357, + 10.557507201905658, 11.421603926869832, 12.285557309007773, 13.146128035678238, 14.008600171761918, + 14.869231719730976, 15.728353782021228, 16.586587304671756, 17.442479769064448, 18.298853076409706, + 19.152288344383056, 20.00432137378264, 20.85793526471943, 21.70926996097583, 22.559906625036113, + 23.409933123331296, 24.260071387985075, 25.10720996964787, 25.956648579205204, 26.804820678721164, + 27.652246341003323, 28.50105926221775, 29.34830486304816, 30.195899652409235, 31.891537457672566, + 33.588831725594204, 35.28555730900777, 36.985875357308394, 38.68752896121463, 40.39093510710338, + 42.096910013008056, 46.372912002970104, + }; + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real Cr48_pf_array[npts_1] = { + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 8.685880952436747e-07, 8.251516766996927e-06, 3.951899976600419e-05, 0.00013330794422173613, + 0.00035120219371925, 0.006401856055765157, 0.02685304570895992, 0.06215311825135839, 0.10696594975266842, + 0.15598699109465686, 0.205815844445829, 0.25471214514215257, 0.30198352738731143, 0.39152612205819926, + 0.47640596203905256, 0.5602400543128645, 0.6474755901642433, 0.7433846322638775, 0.983175072037813, + 1.3096301674258988, 1.7067177823367587, 2.1398790864012365, 2.577491799837225, 3.012837224705172, + 3.437750562820388, 3.8549130223078554, 4.264817823009537, 4.666517980554881, 5.648360010980932, + 6.606381365110605, 7.550228353055094, 8.484299839346786, 9.414973347970818, 10.340444114840118, + 11.264817823009537, 12.1846914308176, 13.103803720955957, 14.021189299069938, 14.935003151453655, + 15.846337112129806, 16.75511226639507, 17.66181268553726, 18.565847818673518, 19.468347330412158, + 20.369215857410143, 21.267171728403014, 22.161368002234976, 23.056904851336473, 23.94939000664491, + 24.840733234611807, 25.73078227566639, 26.619093330626743, 27.50785587169583, 28.394451680826215, + 29.281033367247726, 30.164352855784436, 31.049218022670182, 31.934498451243567, 33.70156798505593, + 35.46834733041216, 37.23299611039215, 38.99913054128737, 40.764922984649886, 42.5327543789925, + 44.30102999566398, 48.727541257028555, + }; + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real Mn51_pf_array[npts_1] = { + 0.0, 0.0, 4.342942647204277e-07, 6.0362737871404116e-05, 0.0005954436481690331, + 0.002352703452491265, 0.0058636025937444025, 0.011219737158250306, 0.018191443590229183, 0.026405776501228783, + 0.035473365577059296, 0.08393991903492294, 0.12694077261184436, 0.16267998396542166, 0.19356340377635362, + 0.22185561141496238, 0.2491212785730439, 0.27638918590325057, 0.30436276263857276, 0.36442247019537943, + 0.4326074417788097, 0.5117005179251304, 0.6041057952026397, 0.7115562776994953, 0.9717395908877782, + 1.287801729930226, 1.640481436970422, 2.0170333392987803, 2.403120521175818, 2.7944880466591697, + 3.1903316981702914, 3.5854607295085006, 3.9827233876685453, 4.380211241711606, 5.372912002970106, + 6.363611979892144, 7.354108439147401, 8.342422680822207, 9.328379603438737, 10.311753861055754, + 11.292256071356476, 12.269512944217917, 13.24551266781415, 14.214843848047698, 15.1846914308176, + 16.14921911265538, 17.110589710299248, 18.071882007306126, 19.029383777685208, 19.985426474083003, + 20.93851972517649, 21.88986172125819, 22.839478047374197, 23.787460474518415, 24.73399928653839, + 25.67942789661212, 26.6232492903979, 27.56702636615906, 28.5092025223311, 29.45178643552429, + 30.392696953259666, 31.33445375115093, 32.27415784926368, 33.2148438480477, 35.093421685162234, + 36.97451169273733, 38.8555191556678, 40.737192642704734, 42.620136054973756, 44.505149978319906, + 46.392696953259666, 51.12057393120585, + }; + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real Fe52_pf_array[npts_1] = { + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 1.7371744532199383e-06, 9.554373504133797e-06, 3.778197643341552e-05, + 0.00011333607006293108, 0.0030242952161453874, 0.015422212189991184, 0.040215337130588114, 0.07478865660777631, + 0.11488541698288196, 0.15714990338033966, 0.19960737134331175, 0.24132628928072955, 0.3217032118192907, + 0.3993396534463543, 0.4778337814344742, 0.5623989859221217, 0.6594581913549248, 0.9153998352122699, + 1.2695129442179163, 1.6910814921229684, 2.143014800254095, 2.6009728956867484, 3.0569048513364727, + 3.503790683057181, 3.946452265013073, 4.383815365980431, 4.818225893613955, 5.888740960682893, + 6.944482672150168, 7.989894563718773, 9.02938377768521, 10.060697840353612, 11.086359830674748, + 12.11058971029925, 13.127104798364808, 14.139879086401237, 15.14921911265538, 16.152288344383056, + 17.152288344383056, 18.14921911265538, 19.143014800254097, 20.133538908370216, 21.12057393120585, + 22.103803720955955, 23.08635983067475, 24.06445798922692, 25.041392685158225, 26.01703333929878, + 26.989449817666692, 27.960946195733833, 28.930949031167522, 29.899273187317604, 30.8668778143375, + 31.833784374656478, 32.79934054945358, 33.76417613239033, 34.72835378202123, 36.655138434811384, + 38.58092497567562, 40.505149978319906, 42.42975228000241, 44.3541084391474, 46.28103336724773, + 48.20682587603185, 53.02938377768521, + }; + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real Co55_pf_array[npts_1] = { + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 8.685880952436747e-07, 1.4331481434642371e-05, 9.336327741651445e-05, + 0.00038114325769492564, 0.001151090732337307, 0.0028275866787247843, 0.0059861278100218065, 0.019727612600003865, + 0.049238961363648255, 0.10167663281566902, 0.18228879723157643, 0.29243817096179087, 0.5865873046717549, + 0.9449759084120479, 1.3324384599156054, 1.7363965022766423, 2.1492191126553797, 2.56702636615906, + 2.991226075692495, 3.419955748489758, 3.851869600729766, 4.2878017299302265, 5.382017042574868, + 6.482873583608754, 7.5820633629117085, 8.677606952720494, 9.767155866082181, 10.85003325768977, + 11.927370363039023, 12.998695158311655, 14.064457989226918, 15.127104798364808, 16.181843587944773, + 17.232996110392154, 18.281033367247726, 19.32428245529769, 20.3654879848909, 21.401400540781545, + 22.436162647040756, 23.468347330412158, 24.4983105537896, 25.525044807036846, 26.550228353055093, + 27.57403126772772, 28.59659709562646, 29.6170003411209, 30.636487896353366, 31.65609820201283, + 32.673941998634085, 33.69108149212297, 34.70757017609794, 35.72427586960079, 37.75587485567249, + 39.786751422145564, 41.818225893613956, 43.850033257689766, 45.88309335857569, 47.91750550955255, + 49.954242509439325, 55.05690485133647, + }; + + // this is log10(partition function) + + MICROPHYSICS_UNUSED HIP_CONSTEXPR static AMREX_GPU_MANAGED amrex::Real Ni56_pf_array[npts_1] = { + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 4.342942647204277e-07, 7.817230319428646e-06, 6.42708273977769e-05, + 0.0002904458650804842, 0.0009123622824012837, 0.0022498876258026487, 0.0046944487518873, 0.014735532704563181, + 0.03529042138996706, 0.07190703372466718, 0.13162956968664008, 0.22190042758492473, 0.5092025223311029, + 0.9132839017604184, 1.374748346010104, 1.8555191556678001, 2.3404441148401185, 2.8221680793680175, + 3.3031960574204886, 3.783903579272735, 4.26245108973043, 4.7419390777291985, 5.9344984512435675, + 7.117271295655764, 8.292256071356476, 9.456366033129044, 10.608526033577194, 11.750508394851346, + 12.88309335857569, 14.008600171761918, 15.123851640967086, 16.232996110392154, 17.33645973384853, + 18.432969290874407, 19.525044807036846, 20.612783856719737, 21.695481676490196, 22.773786444981194, + 23.8481891169914, 24.919078092376076, 25.987219229908003, 27.053078443483418, 28.113943352306837, + 29.17609125905568, 30.232996110392154, 31.287801729930226, 32.3424226808222, 33.39619934709574, + 34.44715803134222, 35.49692964807321, 36.54530711646582, 37.594392550375424, 39.68752896121463, + 41.77959649125783, 43.86981820797933, 45.959518376973, 48.04921802267018, 50.13987908640124, + 52.230448921378276, 57.462397997898954, + }; + + + + // interpolation routine + + template + AMREX_GPU_HOST_DEVICE AMREX_INLINE + void interpolate_pf(const Real t9, const Real (&temp_array)[npts], const Real (&pf_array)[npts], + Real& pf, Real& dpf_dT) { + + if (t9 >= temp_array[0] && t9 < temp_array[npts-1]) { + + // find the largest temperature element <= t9 using a binary search + + int left = 0; + int right = npts; + + while (left < right) { + int mid = (left + right) / 2; + if (temp_array[mid] > t9) { + right = mid; + } else { + left = mid + 1; + } + } + + const int idx = right - 1; + + // now we have temp_array[idx] <= t9 < temp_array[idx+1] + + // construct the slope -- this is (log10(pf_{i+1}) - log10(pf_i)) / (T_{i+1} - T_i) + + Real slope = (pf_array[idx+1] - pf_array[idx]) / (temp_array[idx+1] - temp_array[idx]); + + // find the PF + + Real log10_pf = pf_array[idx] + slope * (t9 - temp_array[idx]); + pf = std::pow(10.0_rt, log10_pf); + + // find the derivative (with respect to T, not T9) + + Real dpf_dT9 = pf * M_LN10 * slope; + dpf_dT = dpf_dT9 / 1.e9_rt; + + } else { + + // T < the smallest T or >= the largest T in the partition function table + pf = 1.0; + dpf_dT = 0.0; + + } + + } + +} + +// main interface + +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void get_partition_function(const int inuc, [[maybe_unused]] const tf_t& tfactors, + Real& pf, Real& dpf_dT) { + + // inuc is the 1-based index for the species + + switch (inuc) { + + case O16: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::O16_pf_array, pf, dpf_dT); + break; + + case Ne20: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::Ne20_pf_array, pf, dpf_dT); + break; + + case Na23: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::Na23_pf_array, pf, dpf_dT); + break; + + case Mg24: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::Mg24_pf_array, pf, dpf_dT); + break; + + case Al27: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::Al27_pf_array, pf, dpf_dT); + break; + + case Si28: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::Si28_pf_array, pf, dpf_dT); + break; + + case P31: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::P31_pf_array, pf, dpf_dT); + break; + + case S32: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::S32_pf_array, pf, dpf_dT); + break; + + case Cl35: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::Cl35_pf_array, pf, dpf_dT); + break; + + case Ar36: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::Ar36_pf_array, pf, dpf_dT); + break; + + case K39: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::K39_pf_array, pf, dpf_dT); + break; + + case Ca40: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::Ca40_pf_array, pf, dpf_dT); + break; + + case Sc43: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::Sc43_pf_array, pf, dpf_dT); + break; + + case Ti44: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::Ti44_pf_array, pf, dpf_dT); + break; + + case V47: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::V47_pf_array, pf, dpf_dT); + break; + + case Cr48: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::Cr48_pf_array, pf, dpf_dT); + break; + + case Mn51: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::Mn51_pf_array, pf, dpf_dT); + break; + + case Fe52: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::Fe52_pf_array, pf, dpf_dT); + break; + + case Co55: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::Co55_pf_array, pf, dpf_dT); + break; + + case Ni56: + part_fun::interpolate_pf(tfactors.T9, part_fun::temp_array_1, part_fun::Ni56_pf_array, pf, dpf_dT); + break; + + + default: + + pf = 1.0_rt; + dpf_dT = 0.0_rt; + + } + +} + +// spins + +AMREX_GPU_HOST_DEVICE AMREX_INLINE +constexpr Real get_spin_state(const int inuc) { + + Real spin = -1.0; + + switch (inuc) { + + case He4: + case C12: + case O16: + case Ne20: + case Mg24: + case Si28: + case S32: + case Ar36: + case Ca40: + case Ti44: + case Cr48: + case Fe52: + case Ni56: + spin = 1; + break; + + case H1: + case N13: + case P31: + spin = 2; + break; + + case Na23: + case Cl35: + case K39: + case V47: + spin = 4; + break; + + case Al27: + case Mn51: + spin = 6; + break; + + case Sc43: + case Co55: + spin = 8; + break; + + + } + + return spin; + +} + + +#endif diff --git a/networks/subch_base/pynucastro.net b/networks/subch_base/pynucastro.net new file mode 100644 index 0000000000..83e465c183 --- /dev/null +++ b/networks/subch_base/pynucastro.net @@ -0,0 +1,24 @@ +hydrogen-1 H1 1.0 1.0 +helium-4 He4 4.0 2.0 +carbon-12 C12 12.0 6.0 +nitrogen-13 N13 13.0 7.0 +oxygen-16 O16 16.0 8.0 +neon-20 Ne20 20.0 10.0 +sodium-23 Na23 23.0 11.0 +magnesium-24 Mg24 24.0 12.0 +aluminum-27 Al27 27.0 13.0 +silicon-28 Si28 28.0 14.0 +phosphorus-31 P31 31.0 15.0 +sulfur-32 S32 32.0 16.0 +argon-36 Ar36 36.0 18.0 +calcium-40 Ca40 40.0 20.0 +titanium-44 Ti44 44.0 22.0 +chromium-48 Cr48 48.0 24.0 +iron-52 Fe52 52.0 26.0 +nickel-56 Ni56 56.0 28.0 +__extra_chlorine-35 Cl35 35.0 17.0 +__extra_potassium-39 K39 39.0 19.0 +__extra_scandium-43 Sc43 43.0 21.0 +__extra_vanadium-47 V47 47.0 23.0 +__extra_manganese-51 Mn51 51.0 25.0 +__extra_cobalt-55 Co55 55.0 27.0 diff --git a/networks/subch_base/reaclib_rates.H b/networks/subch_base/reaclib_rates.H new file mode 100644 index 0000000000..6dc547b4c2 --- /dev/null +++ b/networks/subch_base/reaclib_rates.H @@ -0,0 +1,5083 @@ +#ifndef REACLIB_RATES_H +#define REACLIB_RATES_H + +#include +#include + +#include +#include +#include + +using namespace Rates; +using namespace Species; + +struct rate_t { + Array1D screened_rates; + Real enuc_weak; +}; + +struct rate_derivs_t { + Array1D screened_rates; + Array1D dscreened_rates_dT; + Real enuc_weak; +}; + + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_C12_to_N13(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // C12 + p --> N13 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ls09n + ln_set_rate = 17.1482 + -13.692 * tfactors.T913i + -0.230881 * tfactors.T913 + + 4.44362 * tfactors.T9 + -3.15898 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -13.692 * tfactors.T943i + (1.0/3.0) * -0.230881 * tfactors.T923i + + 4.44362 + (5.0/3.0) * -3.15898 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // ls09r + ln_set_rate = 17.5428 + -3.77849 * tfactors.T9i + -5.10735 * tfactors.T913i + -2.24111 * tfactors.T913 + + 0.148883 * tfactors.T9 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 3.77849 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -5.10735 * tfactors.T943i + (1.0/3.0) * -2.24111 * tfactors.T923i + + 0.148883 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_C12_to_O16(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // C12 + He4 --> O16 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // nac2 + ln_set_rate = 254.634 + -1.84097 * tfactors.T9i + 103.411 * tfactors.T913i + -420.567 * tfactors.T913 + + 64.0874 * tfactors.T9 + -12.4624 * tfactors.T953 + 137.303 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.84097 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 103.411 * tfactors.T943i + (1.0/3.0) * -420.567 * tfactors.T923i + + 64.0874 + (5.0/3.0) * -12.4624 * tfactors.T923 + 137.303 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nac2 + ln_set_rate = 69.6526 + -1.39254 * tfactors.T9i + 58.9128 * tfactors.T913i + -148.273 * tfactors.T913 + + 9.08324 * tfactors.T9 + -0.541041 * tfactors.T953 + 70.3554 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.39254 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 58.9128 * tfactors.T943i + (1.0/3.0) * -148.273 * tfactors.T923i + + 9.08324 + (5.0/3.0) * -0.541041 * tfactors.T923 + 70.3554 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_O16_to_Ne20(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // O16 + He4 --> Ne20 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // co10r + ln_set_rate = 9.50848 + -12.7643 * tfactors.T9i + -3.65925 * tfactors.T913 + + 0.714224 * tfactors.T9 + -0.00107508 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 12.7643 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * -3.65925 * tfactors.T923i + + 0.714224 + (5.0/3.0) * -0.00107508 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // co10r + ln_set_rate = 3.88571 + -10.3585 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 10.3585 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // co10n + ln_set_rate = 23.903 + -39.7262 * tfactors.T913i + -0.210799 * tfactors.T913 + + 0.442879 * tfactors.T9 + -0.0797753 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -39.7262 * tfactors.T943i + (1.0/3.0) * -0.210799 * tfactors.T923i + + 0.442879 + (5.0/3.0) * -0.0797753 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Ne20_to_Mg24(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Ne20 + He4 --> Mg24 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // il10r + ln_set_rate = -38.7055 + -2.50605 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 2.50605 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 24.5058 + -46.2525 * tfactors.T913i + 5.58901 * tfactors.T913 + + 7.61843 * tfactors.T9 + -3.683 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -46.2525 * tfactors.T943i + (1.0/3.0) * 5.58901 * tfactors.T923i + + 7.61843 + (5.0/3.0) * -3.683 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -8.79827 + -12.7809 * tfactors.T9i + 16.9229 * tfactors.T913 + + -2.57325 * tfactors.T9 + 0.208997 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 12.7809 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 16.9229 * tfactors.T923i + + -2.57325 + (5.0/3.0) * 0.208997 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 1.98307 + -9.22026 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 9.22026 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Na23_to_Mg24(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Na23 + p --> Mg24 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // il10n + ln_set_rate = 18.9075 + -20.6428 * tfactors.T913i + 1.52954 * tfactors.T913 + + 2.7487 * tfactors.T9 + -1.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -20.6428 * tfactors.T943i + (1.0/3.0) * 1.52954 * tfactors.T923i + + 2.7487 + (5.0/3.0) * -1.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 9.0594 + -3.28029 * tfactors.T9i + -0.360588 * tfactors.T913 + + 1.4187 * tfactors.T9 + -0.184061 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 3.28029 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * -0.360588 * tfactors.T923i + + 1.4187 + (5.0/3.0) * -0.184061 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -5.02585 + -1.61219 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.61219 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Mg24_to_Si28(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Mg24 + He4 --> Si28 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // st08r + ln_set_rate = -50.5494 + -12.8332 * tfactors.T9i + 21.3721 * tfactors.T913i + 37.7649 * tfactors.T913 + + -4.10635 * tfactors.T9 + 0.249618 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 12.8332 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 21.3721 * tfactors.T943i + (1.0/3.0) * 37.7649 * tfactors.T923i + + -4.10635 + (5.0/3.0) * 0.249618 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // st08r + ln_set_rate = 8.03977 + -15.629 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 15.629 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Al27_to_Si28(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Al27 + p --> Si28 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // il10r + ln_set_rate = -13.6664 + -1.90396 * tfactors.T9i + 23.8634 * tfactors.T913 + + -3.70135 * tfactors.T9 + 0.28964 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.90396 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 23.8634 * tfactors.T923i + + -3.70135 + (5.0/3.0) * 0.28964 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 86.0234 + -0.387313 * tfactors.T9i + -26.8327 * tfactors.T913i + -116.137 * tfactors.T913 + + 0.00950567 * tfactors.T9 + 0.00999755 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.387313 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -26.8327 * tfactors.T943i + (1.0/3.0) * -116.137 * tfactors.T923i + + 0.00950567 + (5.0/3.0) * 0.00999755 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 21.1065 + -23.2205 * tfactors.T913i + + -2.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -23.2205 * tfactors.T943i + + (5.0/3.0) * -2.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Si28_to_S32(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Si28 + He4 --> S32 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 47.9212 + -59.4896 * tfactors.T913i + 4.47205 * tfactors.T913 + + -4.78989 * tfactors.T9 + 0.557201 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -59.4896 * tfactors.T943i + (1.0/3.0) * 4.47205 * tfactors.T923i + + -4.78989 + (5.0/3.0) * 0.557201 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_P31_to_S32(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // P31 + p --> S32 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // il10r + ln_set_rate = 0.821556 + -3.77704 * tfactors.T9i + 8.09341 * tfactors.T913 + + -0.615971 * tfactors.T9 + 0.031159 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 3.77704 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 8.09341 * tfactors.T923i + + -0.615971 + (5.0/3.0) * 0.031159 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -2.66839 + -2.25958 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 2.25958 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 19.2596 + -25.3278 * tfactors.T913i + 6.4931 * tfactors.T913 + + -9.27513 * tfactors.T9 + -0.610439 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -25.3278 * tfactors.T943i + (1.0/3.0) * 6.4931 * tfactors.T923i + + -9.27513 + (5.0/3.0) * -0.610439 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_C12_C12_to_p_Na23(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // C12 + C12 --> p + Na23 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // cf88r + ln_set_rate = 60.9649 + -84.165 * tfactors.T913i + -1.4191 * tfactors.T913 + + -0.114619 * tfactors.T9 + -0.070307 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -84.165 * tfactors.T943i + (1.0/3.0) * -1.4191 * tfactors.T923i + + -0.114619 + (5.0/3.0) * -0.070307 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_C12_C12_to_He4_Ne20(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // C12 + C12 --> He4 + Ne20 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // cf88r + ln_set_rate = 61.2863 + -84.165 * tfactors.T913i + -1.56627 * tfactors.T913 + + -0.0736084 * tfactors.T9 + -0.072797 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -84.165 * tfactors.T943i + (1.0/3.0) * -1.56627 * tfactors.T923i + + -0.0736084 + (5.0/3.0) * -0.072797 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_N13_to_p_O16(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // N13 + He4 --> p + O16 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // cf88n + ln_set_rate = 40.4644 + -35.829 * tfactors.T913i + -0.530275 * tfactors.T913 + + -0.982462 * tfactors.T9 + 0.0808059 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -35.829 * tfactors.T943i + (1.0/3.0) * -0.530275 * tfactors.T923i + + -0.982462 + (5.0/3.0) * 0.0808059 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_C12_O16_to_p_Al27(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // O16 + C12 --> p + Al27 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // cf88r + ln_set_rate = 68.5253 + 0.205134 * tfactors.T9i + -119.242 * tfactors.T913i + 13.3667 * tfactors.T913 + + 0.295425 * tfactors.T9 + -0.267288 * tfactors.T953 + -9.91729 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = -0.205134 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -119.242 * tfactors.T943i + (1.0/3.0) * 13.3667 * tfactors.T923i + + 0.295425 + (5.0/3.0) * -0.267288 * tfactors.T923 + -9.91729 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_C12_O16_to_He4_Mg24(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // O16 + C12 --> He4 + Mg24 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // cf88r + ln_set_rate = 48.5341 + 0.37204 * tfactors.T9i + -133.413 * tfactors.T913i + 50.1572 * tfactors.T913 + + -3.15987 * tfactors.T9 + 0.0178251 * tfactors.T953 + -23.7027 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = -0.37204 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -133.413 * tfactors.T943i + (1.0/3.0) * 50.1572 * tfactors.T923i + + -3.15987 + (5.0/3.0) * 0.0178251 * tfactors.T923 + -23.7027 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_O16_O16_to_p_P31(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // O16 + O16 --> p + P31 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // cf88r + ln_set_rate = 85.2628 + 0.223453 * tfactors.T9i + -145.844 * tfactors.T913i + 8.72612 * tfactors.T913 + + -0.554035 * tfactors.T9 + -0.137562 * tfactors.T953 + -6.88807 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = -0.223453 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -145.844 * tfactors.T943i + (1.0/3.0) * 8.72612 * tfactors.T923i + + -0.554035 + (5.0/3.0) * -0.137562 * tfactors.T923 + -6.88807 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_O16_O16_to_He4_Si28(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // O16 + O16 --> He4 + Si28 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // cf88r + ln_set_rate = 97.2435 + -0.268514 * tfactors.T9i + -119.324 * tfactors.T913i + -32.2497 * tfactors.T913 + + 1.46214 * tfactors.T9 + -0.200893 * tfactors.T953 + 13.2148 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.268514 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -119.324 * tfactors.T943i + (1.0/3.0) * -32.2497 * tfactors.T923i + + 1.46214 + (5.0/3.0) * -0.200893 * tfactors.T923 + 13.2148 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Na23_to_He4_Ne20(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Na23 + p --> He4 + Ne20 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // il10r + ln_set_rate = -6.58736 + -2.31577 * tfactors.T9i + 19.7297 * tfactors.T913 + + -2.20987 * tfactors.T9 + 0.153374 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 2.31577 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 19.7297 * tfactors.T923i + + -2.20987 + (5.0/3.0) * 0.153374 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = 0.0178295 + -1.86103 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.86103 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 18.9756 + -20.0024 * tfactors.T913i + 11.5988 * tfactors.T913 + + -1.37398 * tfactors.T9 + -1.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -20.0024 * tfactors.T943i + (1.0/3.0) * 11.5988 * tfactors.T923i + + -1.37398 + (5.0/3.0) * -1.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Al27_to_He4_Mg24(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Al27 + p --> He4 + Mg24 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // il10r + ln_set_rate = -7.02789 + -4.2425 * tfactors.T9i + 18.0416 * tfactors.T913 + + -1.54137 * tfactors.T9 + 0.0847506 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 4.2425 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 18.0416 * tfactors.T923i + + -1.54137 + (5.0/3.0) * 0.0847506 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -26.8683 + -0.963012 * tfactors.T9i + 5.18642 * tfactors.T913i + -34.7936 * tfactors.T913 + + 168.225 * tfactors.T9 + -115.825 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.963012 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 5.18642 * tfactors.T943i + (1.0/3.0) * -34.7936 * tfactors.T923i + + 168.225 + (5.0/3.0) * -115.825 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 29.4576 + -26.4162 * tfactors.T913i + + -2.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -26.4162 * tfactors.T943i + + (5.0/3.0) * -2.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_P31_to_He4_Si28(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // P31 + p --> He4 + Si28 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // il10r + ln_set_rate = -10.893 + -3.42575 * tfactors.T9i + 21.521 * tfactors.T913 + + -1.90355 * tfactors.T9 + 0.092724 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 3.42575 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 21.521 * tfactors.T923i + + -1.90355 + (5.0/3.0) * 0.092724 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -12.919 + -1.87716 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.87716 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 60.8829 + -31.932 * tfactors.T913i + -77.0334 * tfactors.T913 + + -43.6847 * tfactors.T9 + -4.28955 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -31.932 * tfactors.T943i + (1.0/3.0) * -77.0334 * tfactors.T923i + + -43.6847 + (5.0/3.0) * -4.28955 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_He4_He4_to_C12(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // He4 + He4 + He4 --> C12 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // fy05r + ln_set_rate = -24.3505 + -4.12656 * tfactors.T9i + -13.49 * tfactors.T913i + 21.4259 * tfactors.T913 + + -1.34769 * tfactors.T9 + 0.0879816 * tfactors.T953 + -13.1653 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 4.12656 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -13.49 * tfactors.T943i + (1.0/3.0) * 21.4259 * tfactors.T923i + + -1.34769 + (5.0/3.0) * 0.0879816 * tfactors.T923 + -13.1653 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // fy05r + ln_set_rate = -11.7884 + -1.02446 * tfactors.T9i + -23.57 * tfactors.T913i + 20.4886 * tfactors.T913 + + -12.9882 * tfactors.T9 + -20.0 * tfactors.T953 + -2.16667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.02446 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -23.57 * tfactors.T943i + (1.0/3.0) * 20.4886 * tfactors.T923i + + -12.9882 + (5.0/3.0) * -20.0 * tfactors.T923 + -2.16667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // fy05n + ln_set_rate = -0.971052 + -37.06 * tfactors.T913i + 29.3493 * tfactors.T913 + + -115.507 * tfactors.T9 + -10.0 * tfactors.T953 + -1.33333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -37.06 * tfactors.T943i + (1.0/3.0) * 29.3493 * tfactors.T923i + + -115.507 + (5.0/3.0) * -10.0 * tfactors.T923 + -1.33333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_C12_C12_to_Mg24_modified(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // C12 + C12 --> Mg24 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // cf88r + ln_set_rate = -12.8056 + -30.1498 * tfactors.T9i + 11.4826 * tfactors.T913 + + 1.82849 * tfactors.T9 + -0.34844 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 30.1498 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 11.4826 * tfactors.T923i + + 1.82849 + (5.0/3.0) * -0.34844 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_O16_O16_to_S32_modified(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // O16 + O16 --> S32 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // cf88r + ln_set_rate = 77.5491 + -0.373641 * tfactors.T9i + -120.83 * tfactors.T913i + -7.72334 * tfactors.T913 + + -2.27939 * tfactors.T9 + 0.167655 * tfactors.T953 + 7.62001 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.373641 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -120.83 * tfactors.T943i + (1.0/3.0) * -7.72334 * tfactors.T923i + + -2.27939 + (5.0/3.0) * 0.167655 * tfactors.T923 + 7.62001 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_C12_O16_to_Si28_modified(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // O16 + C12 --> Si28 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // cf88r + ln_set_rate = -132.213 + -1.46479 * tfactors.T9i + -293.089 * tfactors.T913i + 414.404 * tfactors.T913 + + -28.0562 * tfactors.T9 + 1.61807 * tfactors.T953 + -178.28 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.46479 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -293.089 * tfactors.T943i + (1.0/3.0) * 414.404 * tfactors.T923i + + -28.0562 + (5.0/3.0) * 1.61807 * tfactors.T923 + -178.28 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_S32_to_Ar36_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // S32 + He4 --> Ar36 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 48.901 + -65.3709 * tfactors.T913i + 5.68294 * tfactors.T913 + + -5.00388 * tfactors.T9 + 0.571407 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -65.3709 * tfactors.T943i + (1.0/3.0) * 5.68294 * tfactors.T923i + + -5.00388 + (5.0/3.0) * 0.571407 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Cl35_to_Ar36_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Cl35 + p --> Ar36 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // il10r + ln_set_rate = -9.03294 + -2.00996 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 2.00996 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -42.5249 + -0.564651 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.564651 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 35.6868 + -27.8971 * tfactors.T913i + -16.2304 * tfactors.T913 + + 35.255 * tfactors.T9 + -25.8411 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -27.8971 * tfactors.T943i + (1.0/3.0) * -16.2304 * tfactors.T923i + + 35.255 + (5.0/3.0) * -25.8411 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -7.84699 + -3.65092 * tfactors.T9i + 18.0179 * tfactors.T913 + + -2.86304 * tfactors.T9 + 0.250854 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 3.65092 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 18.0179 * tfactors.T923i + + -2.86304 + (5.0/3.0) * 0.250854 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Cl35_to_He4_S32_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Cl35 + p --> He4 + S32 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // il10r + ln_set_rate = 2.29121 + -6.00976 * tfactors.T9i + 5.33756 * tfactors.T913 + + 1.64418 * tfactors.T9 + -0.246167 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 6.00976 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 5.33756 * tfactors.T923i + + 1.64418 + (5.0/3.0) * -0.246167 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -1.01202 + -3.93495 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 3.93495 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10r + ln_set_rate = -57.5294 + -0.532931 * tfactors.T9i + 25.5338 * tfactors.T913 + + 6.45824 * tfactors.T9 + -0.950294 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.532931 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 25.5338 * tfactors.T923i + + 6.45824 + (5.0/3.0) * -0.950294 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10n + ln_set_rate = 32.12 + -30.9147 * tfactors.T913i + -1.2345 * tfactors.T913 + + 22.5118 * tfactors.T9 + -33.0589 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -30.9147 * tfactors.T943i + (1.0/3.0) * -1.2345 * tfactors.T923i + + 22.5118 + (5.0/3.0) * -33.0589 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Ar36_to_Ca40_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Ar36 + He4 --> Ca40 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 52.3486 + -71.0046 * tfactors.T913i + 4.0656 * tfactors.T913 + + -5.26509 * tfactors.T9 + 0.683546 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -71.0046 * tfactors.T943i + (1.0/3.0) * 4.0656 * tfactors.T923i + + -5.26509 + (5.0/3.0) * 0.683546 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_K39_to_Ca40_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // K39 + p --> Ca40 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // lo18r + ln_set_rate = 2761.38 + -5.22234 * tfactors.T9i + 802.18 * tfactors.T913i + -4010.27 * tfactors.T913 + + 1136.19 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 5.22234 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 802.18 * tfactors.T943i + (1.0/3.0) * -4010.27 * tfactors.T923i + + 1136.19 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // lo18r + ln_set_rate = 588.099 + -12.5647 * tfactors.T9i + 641.844 * tfactors.T913i + -1248.49 * tfactors.T913 + + 564.926 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 12.5647 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 641.844 * tfactors.T943i + (1.0/3.0) * -1248.49 * tfactors.T923i + + 564.926 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // lo18r + ln_set_rate = 102.252 + -1.66508 * tfactors.T9i + 41.1723 * tfactors.T913i + -149.299 * tfactors.T913 + + 10.5229 * tfactors.T9 + -0.68208 * tfactors.T953 + 59.2367 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 1.66508 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 41.1723 * tfactors.T943i + (1.0/3.0) * -149.299 * tfactors.T923i + + 10.5229 + (5.0/3.0) * -0.68208 * tfactors.T923 + 59.2367 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_K39_to_He4_Ar36_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // K39 + p --> He4 + Ar36 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 20.5166 + -30.0732 * tfactors.T913i + 7.03263 * tfactors.T913 + + -1.10085 * tfactors.T9 + 0.133768 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -30.0732 * tfactors.T943i + (1.0/3.0) * 7.03263 * tfactors.T923i + + -1.10085 + (5.0/3.0) * 0.133768 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Ca40_to_Ti44_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Ca40 + He4 --> Ti44 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // chw0 + ln_set_rate = 53.75 + -76.4273 * tfactors.T913i + 3.87451 * tfactors.T913 + + -3.61477 * tfactors.T9 + 0.367451 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -76.4273 * tfactors.T943i + (1.0/3.0) * 3.87451 * tfactors.T923i + + -3.61477 + (5.0/3.0) * 0.367451 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Sc43_to_Ti44_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Sc43 + p --> Ti44 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 36.8432 + -32.1734 * tfactors.T913i + -1.77078 * tfactors.T913 + + -2.21706 * tfactors.T9 + 0.298499 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -32.1734 * tfactors.T943i + (1.0/3.0) * -1.77078 * tfactors.T923i + + -2.21706 + (5.0/3.0) * 0.298499 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Sc43_to_He4_Ca40_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Sc43 + p --> He4 + Ca40 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 34.8559 + -32.1734 * tfactors.T913i + 0.0296879 * tfactors.T913 + + -0.95232 * tfactors.T9 + 0.129022 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -32.1734 * tfactors.T943i + (1.0/3.0) * 0.0296879 * tfactors.T923i + + -0.95232 + (5.0/3.0) * 0.129022 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Ti44_to_Cr48_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Ti44 + He4 --> Cr48 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 64.7958 + -81.667 * tfactors.T913i + -10.6333 * tfactors.T913 + + -0.672613 * tfactors.T9 + 0.161209 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -81.667 * tfactors.T943i + (1.0/3.0) * -10.6333 * tfactors.T923i + + -0.672613 + (5.0/3.0) * 0.161209 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Ti44_to_p_V47_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Ti44 + He4 --> p + V47 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // chw0r + ln_set_rate = -76.5154 + -10.7931 * tfactors.T9i + 70.2835 * tfactors.T913 + + -7.99061 * tfactors.T9 + 0.486213 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 10.7931 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 70.2835 * tfactors.T923i + + -7.99061 + (5.0/3.0) * 0.486213 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_V47_to_Cr48_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // V47 + p --> Cr48 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // nfisn + ln_set_rate = 42.6798 + -6.0593 * tfactors.T9i + -34.0548 * tfactors.T913i + -3.41973 * tfactors.T913 + + 1.16501 * tfactors.T9 + -0.105543 * tfactors.T953 + -7.70886 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 6.0593 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -34.0548 * tfactors.T943i + (1.0/3.0) * -3.41973 * tfactors.T923i + + 1.16501 + (5.0/3.0) * -0.105543 * tfactors.T923 + -7.70886 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nfisn + ln_set_rate = 511.463 + -5.29491 * tfactors.T9i + 317.171 * tfactors.T913i + -911.679 * tfactors.T913 + + 94.4245 * tfactors.T9 + -10.1973 * tfactors.T953 + 330.727 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 5.29491 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 317.171 * tfactors.T943i + (1.0/3.0) * -911.679 * tfactors.T923i + + 94.4245 + (5.0/3.0) * -10.1973 * tfactors.T923 + 330.727 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nfisn + ln_set_rate = 23.8315 + 0.246665 * tfactors.T9i + -45.9868 * tfactors.T913i + 13.6822 * tfactors.T913 + + -0.376902 * tfactors.T9 + -0.0194875 * tfactors.T953 + -8.42325 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = -0.246665 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -45.9868 * tfactors.T943i + (1.0/3.0) * 13.6822 * tfactors.T923i + + -0.376902 + (5.0/3.0) * -0.0194875 * tfactors.T923 + -8.42325 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nfisn + ln_set_rate = 40.5626 + -0.514414 * tfactors.T9i + -110.655 * tfactors.T913i + 83.0232 * tfactors.T913 + + -19.7762 * tfactors.T9 + 3.03961 * tfactors.T953 + -49.4742 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 0.514414 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -110.655 * tfactors.T943i + (1.0/3.0) * 83.0232 * tfactors.T923i + + -19.7762 + (5.0/3.0) * 3.03961 * tfactors.T923 + -49.4742 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Cr48_to_Fe52_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Cr48 + He4 --> Fe52 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 65.1754 + -86.7459 * tfactors.T913i + -9.79373 * tfactors.T913 + + -0.772169 * tfactors.T9 + 0.155883 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -86.7459 * tfactors.T943i + (1.0/3.0) * -9.79373 * tfactors.T923i + + -0.772169 + (5.0/3.0) * 0.155883 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Cr48_to_p_Mn51_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Cr48 + He4 --> p + Mn51 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 59.2276 + -86.7459 * tfactors.T913i + 1.05653 * tfactors.T913 + + -1.15757 * tfactors.T9 + 0.0877546 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -86.7459 * tfactors.T943i + (1.0/3.0) * 1.05653 * tfactors.T923i + + -1.15757 + (5.0/3.0) * 0.0877546 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Mn51_to_Fe52_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Mn51 + p --> Fe52 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 36.2596 + -36.1825 * tfactors.T913i + 0.873042 * tfactors.T913 + + -2.89731 * tfactors.T9 + 0.364394 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -36.1825 * tfactors.T943i + (1.0/3.0) * 0.873042 * tfactors.T923i + + -2.89731 + (5.0/3.0) * 0.364394 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Fe52_to_Ni56_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Fe52 + He4 --> Ni56 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 66.6417 + -91.6819 * tfactors.T913i + -9.51885 * tfactors.T913 + + -0.533014 * tfactors.T9 + 0.0892607 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -91.6819 * tfactors.T943i + (1.0/3.0) * -9.51885 * tfactors.T923i + + -0.533014 + (5.0/3.0) * 0.0892607 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Fe52_to_p_Co55_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Fe52 + He4 --> p + Co55 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 62.2207 + -91.6819 * tfactors.T913i + -0.329235 * tfactors.T913 + + -0.780924 * tfactors.T9 + 0.0425179 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -91.6819 * tfactors.T943i + (1.0/3.0) * -0.329235 * tfactors.T923i + + -0.780924 + (5.0/3.0) * 0.0425179 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Co55_to_Ni56_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Co55 + p --> Ni56 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 37.3736 + -38.1053 * tfactors.T913i + -0.210947 * tfactors.T913 + + -2.68377 * tfactors.T9 + 0.355814 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = + -(1.0/3.0) * -38.1053 * tfactors.T943i + (1.0/3.0) * -0.210947 * tfactors.T923i + + -2.68377 + (5.0/3.0) * 0.355814 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_N13_to_p_C12_derived(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // N13 --> p + C12 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ls09c + ln_set_rate = 40.04074558314484 + -22.547578710551672 * tfactors.T9i + -13.692 * tfactors.T913i + -0.230881 * tfactors.T913 + + 4.44362 * tfactors.T9 + -3.15898 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 22.547578710551672 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -13.692 * tfactors.T943i + (1.0/3.0) * -0.230881 * tfactors.T923i + + 4.44362 + (5.0/3.0) * -3.15898 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // ls09c + ln_set_rate = 40.43534558314484 + -26.326068710551674 * tfactors.T9i + -5.10735 * tfactors.T913i + -2.24111 * tfactors.T913 + + 0.148883 * tfactors.T9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 26.326068710551674 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -5.10735 * tfactors.T943i + (1.0/3.0) * -2.24111 * tfactors.T923i + + 0.148883; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real C12_pf, dC12_pf_dT; + // setting C12 partition function to 1.0 by default, independent of T + C12_pf = 1.0_rt; + dC12_pf_dT = 0.0_rt; + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real N13_pf, dN13_pf_dT; + // setting N13 partition function to 1.0 by default, independent of T + N13_pf = 1.0_rt; + dN13_pf_dT = 0.0_rt; + + Real z_r = p_pf * C12_pf; + Real z_p = N13_pf; + + Real dz_r_dT = C12_pf * dp_pf_dT + p_pf * dC12_pf_dT; + Real dz_p_dT = dN13_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_O16_to_He4_C12_derived(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // O16 --> He4 + C12 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // nac2 + ln_set_rate = 279.2945280776573 + -84.95160042649215 * tfactors.T9i + 103.411 * tfactors.T913i + -420.567 * tfactors.T913 + + 64.0874 * tfactors.T9 + -12.4624 * tfactors.T953 + 138.803 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 84.95160042649215 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 103.411 * tfactors.T943i + (1.0/3.0) * -420.567 * tfactors.T923i + + 64.0874 + (5.0/3.0) * -12.4624 * tfactors.T923 + 138.803 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nac2 + ln_set_rate = 94.31312807765731 + -84.50317042649215 * tfactors.T9i + 58.9128 * tfactors.T913i + -148.273 * tfactors.T913 + + 9.08324 * tfactors.T9 + -0.541041 * tfactors.T953 + 71.8554 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 84.50317042649215 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 58.9128 * tfactors.T943i + (1.0/3.0) * -148.273 * tfactors.T923i + + 9.08324 + (5.0/3.0) * -0.541041 * tfactors.T923 + 71.8554 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real C12_pf, dC12_pf_dT; + // setting C12 partition function to 1.0 by default, independent of T + C12_pf = 1.0_rt; + dC12_pf_dT = 0.0_rt; + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real O16_pf, dO16_pf_dT; + // interpolating O16 partition function + get_partition_function(O16, tfactors, O16_pf, dO16_pf_dT); + + Real z_r = He4_pf * C12_pf; + Real z_p = O16_pf; + + Real dz_r_dT = C12_pf * dHe4_pf_dT + He4_pf * dC12_pf_dT; + Real dz_p_dT = dO16_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ne20_to_He4_O16_derived(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Ne20 --> He4 + O16 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // co10c + ln_set_rate = 34.26581585936365 + -67.65193003813836 * tfactors.T9i + -3.65925 * tfactors.T913 + + 0.714224 * tfactors.T9 + -0.00107508 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 67.65193003813836 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * -3.65925 * tfactors.T923i + + 0.714224 + (5.0/3.0) * -0.00107508 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // co10c + ln_set_rate = 28.64304585936365 + -65.24613003813835 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 65.24613003813835 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // co10c + ln_set_rate = 48.66033585936365 + -54.887630038138354 * tfactors.T9i + -39.7262 * tfactors.T913i + -0.210799 * tfactors.T913 + + 0.442879 * tfactors.T9 + -0.0797753 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 54.887630038138354 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -39.7262 * tfactors.T943i + (1.0/3.0) * -0.210799 * tfactors.T923i + + 0.442879 + (5.0/3.0) * -0.0797753 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real O16_pf, dO16_pf_dT; + // interpolating O16 partition function + get_partition_function(O16, tfactors, O16_pf, dO16_pf_dT); + + Real Ne20_pf, dNe20_pf_dT; + // interpolating Ne20 partition function + get_partition_function(Ne20, tfactors, Ne20_pf, dNe20_pf_dT); + + Real z_r = He4_pf * O16_pf; + Real z_p = Ne20_pf; + + Real dz_r_dT = O16_pf * dHe4_pf_dT + He4_pf * dO16_pf_dT; + Real dz_p_dT = dNe20_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Mg24_to_p_Na23_derived(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Mg24 --> p + Na23 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // il10c + ln_set_rate = 43.93571176470678 + -135.6881490421346 * tfactors.T9i + -20.6428 * tfactors.T913i + 1.52954 * tfactors.T913 + + 2.7487 * tfactors.T9 + -1.0 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 135.6881490421346 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -20.6428 * tfactors.T943i + (1.0/3.0) * 1.52954 * tfactors.T923i + + 2.7487 + (5.0/3.0) * -1.0 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = 34.08761176470678 + -138.9684390421346 * tfactors.T9i + -0.360588 * tfactors.T913 + + 1.4187 * tfactors.T9 + -0.184061 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 138.9684390421346 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * -0.360588 * tfactors.T923i + + 1.4187 + (5.0/3.0) * -0.184061 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = 20.002361764706784 + -137.3003390421346 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 137.3003390421346 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real Na23_pf, dNa23_pf_dT; + // interpolating Na23 partition function + get_partition_function(Na23, tfactors, Na23_pf, dNa23_pf_dT); + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real Mg24_pf, dMg24_pf_dT; + // interpolating Mg24 partition function + get_partition_function(Mg24, tfactors, Mg24_pf, dMg24_pf_dT); + + Real z_r = p_pf * Na23_pf; + Real z_p = Mg24_pf; + + Real dz_r_dT = Na23_pf * dp_pf_dT + p_pf * dNa23_pf_dT; + Real dz_p_dT = dMg24_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Mg24_to_He4_Ne20_derived(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Mg24 --> He4 + Ne20 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // il10c + ln_set_rate = -13.886931148855957 + -110.62012330714883 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 110.62012330714883 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = 49.324368851144044 + -108.11407330714883 * tfactors.T9i + -46.2525 * tfactors.T913i + 5.58901 * tfactors.T913 + + 7.61843 * tfactors.T9 + -3.683 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 108.11407330714883 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -46.2525 * tfactors.T943i + (1.0/3.0) * 5.58901 * tfactors.T923i + + 7.61843 + (5.0/3.0) * -3.683 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = 16.02029885114404 + -120.89497330714883 * tfactors.T9i + 16.9229 * tfactors.T913 + + -2.57325 * tfactors.T9 + 0.208997 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 120.89497330714883 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 16.9229 * tfactors.T923i + + -2.57325 + (5.0/3.0) * 0.208997 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = 26.801638851144045 + -117.33433330714882 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 117.33433330714882 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real Mg24_pf, dMg24_pf_dT; + // interpolating Mg24 partition function + get_partition_function(Mg24, tfactors, Mg24_pf, dMg24_pf_dT); + + Real Ne20_pf, dNe20_pf_dT; + // interpolating Ne20 partition function + get_partition_function(Ne20, tfactors, Ne20_pf, dNe20_pf_dT); + + Real z_r = He4_pf * Ne20_pf; + Real z_p = Mg24_pf; + + Real dz_r_dT = Ne20_pf * dHe4_pf_dT + He4_pf * dNe20_pf_dT; + Real dz_p_dT = dMg24_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Si28_to_p_Al27_derived(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Si28 --> p + Al27 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // il10c + ln_set_rate = 11.776564828186824 + -136.3434628922348 * tfactors.T9i + 23.8634 * tfactors.T913 + + -3.70135 * tfactors.T9 + 0.28964 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 136.3434628922348 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 23.8634 * tfactors.T923i + + -3.70135 + (5.0/3.0) * 0.28964 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = 111.46636482818681 + -134.8268158922348 * tfactors.T9i + -26.8327 * tfactors.T913i + -116.137 * tfactors.T913 + + 0.00950567 * tfactors.T9 + 0.00999755 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 134.8268158922348 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -26.8327 * tfactors.T943i + (1.0/3.0) * -116.137 * tfactors.T923i + + 0.00950567 + (5.0/3.0) * 0.00999755 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = 46.54946482818683 + -134.4395028922348 * tfactors.T9i + -23.2205 * tfactors.T913i + + -2.0 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 134.4395028922348 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -23.2205 * tfactors.T943i + + (5.0/3.0) * -2.0 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real Al27_pf, dAl27_pf_dT; + // interpolating Al27 partition function + get_partition_function(Al27, tfactors, Al27_pf, dAl27_pf_dT); + + Real Si28_pf, dSi28_pf_dT; + // interpolating Si28 partition function + get_partition_function(Si28, tfactors, Si28_pf, dSi28_pf_dT); + + Real z_r = p_pf * Al27_pf; + Real z_p = Si28_pf; + + Real dz_r_dT = Al27_pf * dp_pf_dT + p_pf * dAl27_pf_dT; + Real dz_p_dT = dSi28_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Si28_to_He4_Mg24_derived(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Si28 --> He4 + Mg24 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // st08r + ln_set_rate = -25.688574833405916 + -128.69270892750794 * tfactors.T9i + 21.3721 * tfactors.T913i + 37.7649 * tfactors.T913 + + -4.10635 * tfactors.T9 + 0.249618 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 128.69270892750794 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 21.3721 * tfactors.T943i + (1.0/3.0) * 37.7649 * tfactors.T923i + + -4.10635 + (5.0/3.0) * 0.249618 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // st08r + ln_set_rate = 32.90059516659409 + -131.48850892750792 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 131.48850892750792 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real Mg24_pf, dMg24_pf_dT; + // interpolating Mg24 partition function + get_partition_function(Mg24, tfactors, Mg24_pf, dMg24_pf_dT); + + Real Si28_pf, dSi28_pf_dT; + // interpolating Si28 partition function + get_partition_function(Si28, tfactors, Si28_pf, dSi28_pf_dT); + + Real z_r = He4_pf * Mg24_pf; + Real z_p = Si28_pf; + + Real dz_r_dT = Mg24_pf * dHe4_pf_dT + He4_pf * dMg24_pf_dT; + Real dz_p_dT = dSi28_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_S32_to_p_P31_derived(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // S32 --> p + P31 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // il10c + ln_set_rate = 25.172836958303158 + -106.63693563716609 * tfactors.T9i + 8.09341 * tfactors.T913 + + -0.615971 * tfactors.T9 + 0.031159 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 106.63693563716609 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 8.09341 * tfactors.T923i + + -0.615971 + (5.0/3.0) * 0.031159 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = 21.682890958303158 + -105.11947563716609 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 105.11947563716609 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = 43.610880958303156 + -102.85989563716609 * tfactors.T9i + -25.3278 * tfactors.T913i + 6.4931 * tfactors.T913 + + -9.27513 * tfactors.T9 + -0.610439 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 102.85989563716609 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -25.3278 * tfactors.T943i + (1.0/3.0) * 6.4931 * tfactors.T923i + + -9.27513 + (5.0/3.0) * -0.610439 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real S32_pf, dS32_pf_dT; + // interpolating S32 partition function + get_partition_function(S32, tfactors, S32_pf, dS32_pf_dT); + + Real P31_pf, dP31_pf_dT; + // interpolating P31 partition function + get_partition_function(P31, tfactors, P31_pf, dP31_pf_dT); + + Real z_r = p_pf * P31_pf; + Real z_p = S32_pf; + + Real dz_r_dT = P31_pf * dp_pf_dT + p_pf * dP31_pf_dT; + Real dz_p_dT = dS32_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_S32_to_He4_Si28_derived(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // S32 --> He4 + Si28 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 72.81295409739818 + -80.62610309662641 * tfactors.T9i + -59.4896 * tfactors.T913i + 4.47205 * tfactors.T913 + + -4.78989 * tfactors.T9 + 0.557201 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 80.62610309662641 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -59.4896 * tfactors.T943i + (1.0/3.0) * 4.47205 * tfactors.T923i + + -4.78989 + (5.0/3.0) * 0.557201 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real S32_pf, dS32_pf_dT; + // interpolating S32 partition function + get_partition_function(S32, tfactors, S32_pf, dS32_pf_dT); + + Real Si28_pf, dSi28_pf_dT; + // interpolating Si28 partition function + get_partition_function(Si28, tfactors, Si28_pf, dSi28_pf_dT); + + Real z_r = He4_pf * Si28_pf; + Real z_p = S32_pf; + + Real dz_r_dT = Si28_pf * dHe4_pf_dT + He4_pf * dSi28_pf_dT; + Real dz_p_dT = dS32_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_C12_to_He4_He4_He4_derived(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // C12 --> He4 + He4 + He4 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // fy05c + ln_set_rate = 22.39392447043974 + -88.54942933569913 * tfactors.T9i + -13.49 * tfactors.T913i + 21.4259 * tfactors.T913 + + -1.34769 * tfactors.T9 + 0.0879816 * tfactors.T953 + -10.1653 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 88.54942933569913 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -13.49 * tfactors.T943i + (1.0/3.0) * 21.4259 * tfactors.T923i + + -1.34769 + (5.0/3.0) * 0.0879816 * tfactors.T923 + -10.1653 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // fy05c + ln_set_rate = 34.95602447043974 + -85.44732933569914 * tfactors.T9i + -23.57 * tfactors.T913i + 20.4886 * tfactors.T913 + + -12.9882 * tfactors.T9 + -20.0 * tfactors.T953 + 0.8333300000000001 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 85.44732933569914 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -23.57 * tfactors.T943i + (1.0/3.0) * 20.4886 * tfactors.T923i + + -12.9882 + (5.0/3.0) * -20.0 * tfactors.T923 + 0.8333300000000001 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // fy05c + ln_set_rate = 45.77337247043974 + -84.42286933569913 * tfactors.T9i + -37.06 * tfactors.T913i + 29.3493 * tfactors.T913 + + -115.507 * tfactors.T9 + -10.0 * tfactors.T953 + 1.66667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 84.42286933569913 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -37.06 * tfactors.T943i + (1.0/3.0) * 29.3493 * tfactors.T923i + + -115.507 + (5.0/3.0) * -10.0 * tfactors.T923 + 1.66667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real C12_pf, dC12_pf_dT; + // setting C12 partition function to 1.0 by default, independent of T + C12_pf = 1.0_rt; + dC12_pf_dT = 0.0_rt; + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real z_r = He4_pf * He4_pf * He4_pf; + Real z_p = C12_pf; + + Real dz_r_dT = dHe4_pf_dT + dHe4_pf_dT + dHe4_pf_dT; + Real dz_p_dT = dC12_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_O16_to_He4_N13_derived(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // O16 + p --> He4 + N13 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // cf88n + ln_set_rate = 42.232382494512464 + -60.55237555926846 * tfactors.T9i + -35.829 * tfactors.T913i + -0.530275 * tfactors.T913 + + -0.982462 * tfactors.T9 + 0.0808059 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 60.55237555926846 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -35.829 * tfactors.T943i + (1.0/3.0) * -0.530275 * tfactors.T923i + + -0.982462 + (5.0/3.0) * 0.0808059 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real O16_pf, dO16_pf_dT; + // interpolating O16 partition function + get_partition_function(O16, tfactors, O16_pf, dO16_pf_dT); + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real N13_pf, dN13_pf_dT; + // setting N13 partition function to 1.0 by default, independent of T + N13_pf = 1.0_rt; + dN13_pf_dT = 0.0_rt; + + Real z_r = He4_pf * N13_pf; + Real z_p = p_pf * O16_pf; + + Real dz_r_dT = N13_pf * dHe4_pf_dT + He4_pf * dN13_pf_dT; + Real dz_p_dT = O16_pf * dp_pf_dT + p_pf * dO16_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Ne20_to_p_Na23_derived(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Ne20 + He4 --> p + Na23 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // il10c + ln_set_rate = -6.377717086437262 + -29.88961364462334 * tfactors.T9i + 19.7297 * tfactors.T913 + + -2.20987 * tfactors.T9 + 0.153374 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 29.88961364462334 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 19.7297 * tfactors.T923i + + -2.20987 + (5.0/3.0) * 0.153374 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = 0.227472413562738 + -29.434873644623337 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 29.434873644623337 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = 19.18524291356274 + -27.573843644623338 * tfactors.T9i + -20.0024 * tfactors.T913i + 11.5988 * tfactors.T913 + + -1.37398 * tfactors.T9 + -1.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 27.573843644623338 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -20.0024 * tfactors.T943i + (1.0/3.0) * 11.5988 * tfactors.T923i + + -1.37398 + (5.0/3.0) * -1.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real Na23_pf, dNa23_pf_dT; + // interpolating Na23 partition function + get_partition_function(Na23, tfactors, Na23_pf, dNa23_pf_dT); + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real Ne20_pf, dNe20_pf_dT; + // interpolating Ne20 partition function + get_partition_function(Ne20, tfactors, Ne20_pf, dNe20_pf_dT); + + Real z_r = p_pf * Na23_pf; + Real z_p = He4_pf * Ne20_pf; + + Real dz_r_dT = Na23_pf * dp_pf_dT + p_pf * dNa23_pf_dT; + Real dz_p_dT = Ne20_pf * dHe4_pf_dT + He4_pf * dNe20_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Mg24_to_p_Al27_derived(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Mg24 + He4 --> p + Al27 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // il10c + ln_set_rate = -6.445750338407262 + -22.82086933218981 * tfactors.T9i + 18.0416 * tfactors.T913 + + -1.54137 * tfactors.T9 + 0.0847506 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 22.82086933218981 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 18.0416 * tfactors.T923i + + -1.54137 + (5.0/3.0) * 0.0847506 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = -26.286160338407264 + -19.54138133218981 * tfactors.T9i + 5.18642 * tfactors.T913i + -34.7936 * tfactors.T913 + + 168.225 * tfactors.T9 + -115.825 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 19.54138133218981 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 5.18642 * tfactors.T943i + (1.0/3.0) * -34.7936 * tfactors.T923i + + 168.225 + (5.0/3.0) * -115.825 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = 30.039739661592737 + -18.578369332189812 * tfactors.T9i + -26.4162 * tfactors.T913i + + -2.0 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 18.578369332189812 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -26.4162 * tfactors.T943i + + (5.0/3.0) * -2.0 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real Al27_pf, dAl27_pf_dT; + // interpolating Al27 partition function + get_partition_function(Al27, tfactors, Al27_pf, dAl27_pf_dT); + + Real Mg24_pf, dMg24_pf_dT; + // interpolating Mg24 partition function + get_partition_function(Mg24, tfactors, Mg24_pf, dMg24_pf_dT); + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real z_r = p_pf * Al27_pf; + Real z_p = He4_pf * Mg24_pf; + + Real dz_r_dT = Al27_pf * dp_pf_dT + p_pf * dAl27_pf_dT; + Real dz_p_dT = Mg24_pf * dHe4_pf_dT + He4_pf * dMg24_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Si28_to_p_P31_derived(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Si28 + He4 --> p + P31 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // il10c + ln_set_rate = -11.433473139095032 + -25.65965858572089 * tfactors.T9i + 21.521 * tfactors.T913 + + -1.90355 * tfactors.T9 + 0.092724 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 25.65965858572089 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 21.521 * tfactors.T923i + + -1.90355 + (5.0/3.0) * 0.092724 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = -13.459473139095032 + -24.11106858572089 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 24.11106858572089 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = 60.342426860904965 + -22.23390858572089 * tfactors.T9i + -31.932 * tfactors.T913i + -77.0334 * tfactors.T913 + + -43.6847 * tfactors.T9 + -4.28955 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 22.23390858572089 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -31.932 * tfactors.T943i + (1.0/3.0) * -77.0334 * tfactors.T923i + + -43.6847 + (5.0/3.0) * -4.28955 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real P31_pf, dP31_pf_dT; + // interpolating P31 partition function + get_partition_function(P31, tfactors, P31_pf, dP31_pf_dT); + + Real Si28_pf, dSi28_pf_dT; + // interpolating Si28 partition function + get_partition_function(Si28, tfactors, Si28_pf, dSi28_pf_dT); + + Real z_r = p_pf * P31_pf; + Real z_p = He4_pf * Si28_pf; + + Real dz_r_dT = P31_pf * dp_pf_dT + p_pf * dP31_pf_dT; + Real dz_p_dT = Si28_pf * dHe4_pf_dT + He4_pf * dSi28_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_S32_to_p_Cl35_derived_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // S32 + He4 --> p + Cl35 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // il10c + ln_set_rate = 2.425628238034531 + -27.66622776398283 * tfactors.T9i + 5.33756 * tfactors.T913 + + 1.64418 * tfactors.T9 + -0.246167 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 27.66622776398283 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 5.33756 * tfactors.T923i + + 1.64418 + (5.0/3.0) * -0.246167 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = -0.877601761965469 + -25.59141776398283 * tfactors.T9i + + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 25.59141776398283 * tfactors.T9i * tfactors.T9i + + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = -57.39498176196547 + -22.18939876398283 * tfactors.T9i + 25.5338 * tfactors.T913 + + 6.45824 * tfactors.T9 + -0.950294 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 22.18939876398283 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 25.5338 * tfactors.T923i + + 6.45824 + (5.0/3.0) * -0.950294 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = 32.25441823803453 + -21.65646776398283 * tfactors.T9i + -30.9147 * tfactors.T913i + -1.2345 * tfactors.T913 + + 22.5118 * tfactors.T9 + -33.0589 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 21.65646776398283 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -30.9147 * tfactors.T943i + (1.0/3.0) * -1.2345 * tfactors.T923i + + 22.5118 + (5.0/3.0) * -33.0589 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real Cl35_pf, dCl35_pf_dT; + // interpolating Cl35 partition function + get_partition_function(Cl35, tfactors, Cl35_pf, dCl35_pf_dT); + + Real S32_pf, dS32_pf_dT; + // interpolating S32 partition function + get_partition_function(S32, tfactors, S32_pf, dS32_pf_dT); + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real z_r = p_pf * Cl35_pf; + Real z_p = He4_pf * S32_pf; + + Real dz_r_dT = Cl35_pf * dp_pf_dT + p_pf * dCl35_pf_dT; + Real dz_p_dT = S32_pf * dHe4_pf_dT + He4_pf * dS32_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ar36_to_He4_S32_derived_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Ar36 --> He4 + S32 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 73.81637663285039 + -77.06281976216322 * tfactors.T9i + -65.3709 * tfactors.T913i + 5.68294 * tfactors.T913 + + -5.00388 * tfactors.T9 + 0.571407 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 77.06281976216322 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -65.3709 * tfactors.T943i + (1.0/3.0) * 5.68294 * tfactors.T923i + + -5.00388 + (5.0/3.0) * 0.571407 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real S32_pf, dS32_pf_dT; + // interpolating S32 partition function + get_partition_function(S32, tfactors, S32_pf, dS32_pf_dT); + + Real Ar36_pf, dAr36_pf_dT; + // interpolating Ar36 partition function + get_partition_function(Ar36, tfactors, Ar36_pf, dAr36_pf_dT); + + Real z_r = He4_pf * S32_pf; + Real z_p = Ar36_pf; + + Real dz_r_dT = S32_pf * dHe4_pf_dT + He4_pf * dS32_pf_dT; + Real dz_p_dT = dAr36_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ar36_to_p_Cl35_derived_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Ar36 --> p + Cl35 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // il10c + ln_set_rate = 16.01685487088493 + -100.72924752614605 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 100.72924752614605 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = -17.47510512911507 + -99.28393852614604 * tfactors.T9i; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 99.28393852614604 * tfactors.T9i * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = 60.73659487088493 + -98.71928752614605 * tfactors.T9i + -27.8971 * tfactors.T913i + -16.2304 * tfactors.T913 + + 35.255 * tfactors.T9 + -25.8411 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 98.71928752614605 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -27.8971 * tfactors.T943i + (1.0/3.0) * -16.2304 * tfactors.T923i + + 35.255 + (5.0/3.0) * -25.8411 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // il10c + ln_set_rate = 17.202804870884933 + -102.37020752614605 * tfactors.T9i + 18.0179 * tfactors.T913 + + -2.86304 * tfactors.T9 + 0.250854 * tfactors.T953; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 102.37020752614605 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 18.0179 * tfactors.T923i + + -2.86304 + (5.0/3.0) * 0.250854 * tfactors.T923; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real Cl35_pf, dCl35_pf_dT; + // interpolating Cl35 partition function + get_partition_function(Cl35, tfactors, Cl35_pf, dCl35_pf_dT); + + Real Ar36_pf, dAr36_pf_dT; + // interpolating Ar36 partition function + get_partition_function(Ar36, tfactors, Ar36_pf, dAr36_pf_dT); + + Real z_r = p_pf * Cl35_pf; + Real z_p = Ar36_pf; + + Real dz_r_dT = Cl35_pf * dp_pf_dT + p_pf * dCl35_pf_dT; + Real dz_p_dT = dAr36_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Ar36_to_p_K39_derived_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Ar36 + He4 --> p + K39 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 20.636664061510302 + -14.953349961318928 * tfactors.T9i + -30.0732 * tfactors.T913i + 7.03263 * tfactors.T913 + + -1.10085 * tfactors.T9 + 0.133768 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 14.953349961318928 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -30.0732 * tfactors.T943i + (1.0/3.0) * 7.03263 * tfactors.T923i + + -1.10085 + (5.0/3.0) * 0.133768 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real K39_pf, dK39_pf_dT; + // interpolating K39 partition function + get_partition_function(K39, tfactors, K39_pf, dK39_pf_dT); + + Real Ar36_pf, dAr36_pf_dT; + // interpolating Ar36 partition function + get_partition_function(Ar36, tfactors, Ar36_pf, dAr36_pf_dT); + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real z_r = p_pf * K39_pf; + Real z_p = He4_pf * Ar36_pf; + + Real dz_r_dT = K39_pf * dp_pf_dT + p_pf * dK39_pf_dT; + Real dz_p_dT = Ar36_pf * dHe4_pf_dT + He4_pf * dAr36_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ca40_to_He4_Ar36_derived_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Ca40 --> He4 + Ar36 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 77.28261041284823 + -81.69174599574632 * tfactors.T9i + -71.0046 * tfactors.T913i + 4.0656 * tfactors.T913 + + -5.26509 * tfactors.T9 + 0.683546 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 81.69174599574632 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -71.0046 * tfactors.T943i + (1.0/3.0) * 4.0656 * tfactors.T923i + + -5.26509 + (5.0/3.0) * 0.683546 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real Ca40_pf, dCa40_pf_dT; + // interpolating Ca40 partition function + get_partition_function(Ca40, tfactors, Ca40_pf, dCa40_pf_dT); + + Real Ar36_pf, dAr36_pf_dT; + // interpolating Ar36 partition function + get_partition_function(Ar36, tfactors, Ar36_pf, dAr36_pf_dT); + + Real z_r = He4_pf * Ar36_pf; + Real z_p = Ca40_pf; + + Real dz_r_dT = Ar36_pf * dHe4_pf_dT + He4_pf * dAr36_pf_dT; + Real dz_p_dT = dCa40_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ca40_to_p_K39_derived_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Ca40 --> p + K39 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // lo18r + ln_set_rate = 2786.4340744743586 + -101.86662364079672 * tfactors.T9i + 802.18 * tfactors.T913i + -4010.27 * tfactors.T913 + + 1137.69 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 101.86662364079672 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 802.18 * tfactors.T943i + (1.0/3.0) * -4010.27 * tfactors.T923i + + 1137.69 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // lo18r + ln_set_rate = 613.1530744743586 + -109.20898364079672 * tfactors.T9i + 641.844 * tfactors.T913i + -1248.49 * tfactors.T913 + + 566.426 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 109.20898364079672 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 641.844 * tfactors.T943i + (1.0/3.0) * -1248.49 * tfactors.T923i + + 566.426 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // lo18r + ln_set_rate = 127.30607447435852 + -98.30936364079672 * tfactors.T9i + 41.1723 * tfactors.T913i + -149.299 * tfactors.T913 + + 10.5229 * tfactors.T9 + -0.68208 * tfactors.T953 + 60.7367 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 98.30936364079672 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 41.1723 * tfactors.T943i + (1.0/3.0) * -149.299 * tfactors.T923i + + 10.5229 + (5.0/3.0) * -0.68208 * tfactors.T923 + 60.7367 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real Ca40_pf, dCa40_pf_dT; + // interpolating Ca40 partition function + get_partition_function(Ca40, tfactors, Ca40_pf, dCa40_pf_dT); + + Real K39_pf, dK39_pf_dT; + // interpolating K39 partition function + get_partition_function(K39, tfactors, K39_pf, dK39_pf_dT); + + Real z_r = p_pf * K39_pf; + Real z_p = Ca40_pf; + + Real dz_r_dT = K39_pf * dp_pf_dT + p_pf * dK39_pf_dT; + Real dz_p_dT = dCa40_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_He4_Ca40_to_p_Sc43_derived_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Ca40 + He4 --> p + Sc43 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 35.65752817292938 + -40.87575463203665 * tfactors.T9i + -32.1734 * tfactors.T913i + 0.0296879 * tfactors.T913 + + -0.95232 * tfactors.T9 + 0.129022 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 40.87575463203665 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -32.1734 * tfactors.T943i + (1.0/3.0) * 0.0296879 * tfactors.T923i + + -0.95232 + (5.0/3.0) * 0.129022 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real Ca40_pf, dCa40_pf_dT; + // interpolating Ca40 partition function + get_partition_function(Ca40, tfactors, Ca40_pf, dCa40_pf_dT); + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real Sc43_pf, dSc43_pf_dT; + // interpolating Sc43 partition function + get_partition_function(Sc43, tfactors, Sc43_pf, dSc43_pf_dT); + + Real z_r = p_pf * Sc43_pf; + Real z_p = He4_pf * Ca40_pf; + + Real dz_r_dT = Sc43_pf * dp_pf_dT + p_pf * dSc43_pf_dT; + Real dz_p_dT = Ca40_pf * dHe4_pf_dT + He4_pf * dCa40_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ti44_to_He4_Ca40_derived_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Ti44 --> He4 + Ca40 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // chw0 + ln_set_rate = 78.69908591662849 + -59.4975248620018 * tfactors.T9i + -76.4273 * tfactors.T913i + 3.87451 * tfactors.T913 + + -3.61477 * tfactors.T9 + 0.367451 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 59.4975248620018 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -76.4273 * tfactors.T943i + (1.0/3.0) * 3.87451 * tfactors.T923i + + -3.61477 + (5.0/3.0) * 0.367451 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real Ca40_pf, dCa40_pf_dT; + // interpolating Ca40 partition function + get_partition_function(Ca40, tfactors, Ca40_pf, dCa40_pf_dT); + + Real Ti44_pf, dTi44_pf_dT; + // interpolating Ti44 partition function + get_partition_function(Ti44, tfactors, Ti44_pf, dTi44_pf_dT); + + Real z_r = He4_pf * Ca40_pf; + Real z_p = Ti44_pf; + + Real dz_r_dT = Ca40_pf * dHe4_pf_dT + He4_pf * dCa40_pf_dT; + Real dz_p_dT = dTi44_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ti44_to_p_Sc43_derived_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Ti44 --> p + Sc43 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 62.59391408955788 + -100.37327949403844 * tfactors.T9i + -32.1734 * tfactors.T913i + -1.77078 * tfactors.T913 + + -2.21706 * tfactors.T9 + 0.298499 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 100.37327949403844 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -32.1734 * tfactors.T943i + (1.0/3.0) * -1.77078 * tfactors.T923i + + -2.21706 + (5.0/3.0) * 0.298499 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real Ti44_pf, dTi44_pf_dT; + // interpolating Ti44 partition function + get_partition_function(Ti44, tfactors, Ti44_pf, dTi44_pf_dT); + + Real Sc43_pf, dSc43_pf_dT; + // interpolating Sc43 partition function + get_partition_function(Sc43, tfactors, Sc43_pf, dSc43_pf_dT); + + Real z_r = p_pf * Sc43_pf; + Real z_p = Ti44_pf; + + Real dz_r_dT = Sc43_pf * dp_pf_dT + p_pf * dSc43_pf_dT; + Real dz_p_dT = dTi44_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Cr48_to_He4_Ti44_derived_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Cr48 --> He4 + Ti44 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 89.75733412085052 + -89.3041938384302 * tfactors.T9i + -81.667 * tfactors.T913i + -10.6333 * tfactors.T913 + + -0.672613 * tfactors.T9 + 0.161209 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 89.3041938384302 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -81.667 * tfactors.T943i + (1.0/3.0) * -10.6333 * tfactors.T923i + + -0.672613 + (5.0/3.0) * 0.161209 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real Cr48_pf, dCr48_pf_dT; + // interpolating Cr48 partition function + get_partition_function(Cr48, tfactors, Cr48_pf, dCr48_pf_dT); + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real Ti44_pf, dTi44_pf_dT; + // interpolating Ti44 partition function + get_partition_function(Ti44, tfactors, Ti44_pf, dTi44_pf_dT); + + Real z_r = He4_pf * Ti44_pf; + Real z_p = Cr48_pf; + + Real dz_r_dT = Ti44_pf * dHe4_pf_dT + He4_pf * dTi44_pf_dT; + Real dz_p_dT = dCr48_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Cr48_to_p_V47_derived_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Cr48 --> p + V47 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // nfisn + ln_set_rate = 67.74027107253823 + -100.12633621113824 * tfactors.T9i + -34.0548 * tfactors.T913i + -3.41973 * tfactors.T913 + + 1.16501 * tfactors.T9 + -0.105543 * tfactors.T953 + -6.20886 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 100.12633621113824 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -34.0548 * tfactors.T943i + (1.0/3.0) * -3.41973 * tfactors.T923i + + 1.16501 + (5.0/3.0) * -0.105543 * tfactors.T923 + -6.20886 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nfisn + ln_set_rate = 536.5234710725382 + -99.36194621113825 * tfactors.T9i + 317.171 * tfactors.T913i + -911.679 * tfactors.T913 + + 94.4245 * tfactors.T9 + -10.1973 * tfactors.T953 + 332.227 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 99.36194621113825 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * 317.171 * tfactors.T943i + (1.0/3.0) * -911.679 * tfactors.T923i + + 94.4245 + (5.0/3.0) * -10.1973 * tfactors.T923 + 332.227 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nfisn + ln_set_rate = 48.891971072538226 + -93.82037121113825 * tfactors.T9i + -45.9868 * tfactors.T913i + 13.6822 * tfactors.T913 + + -0.376902 * tfactors.T9 + -0.0194875 * tfactors.T953 + -6.9232499999999995 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 93.82037121113825 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -45.9868 * tfactors.T943i + (1.0/3.0) * 13.6822 * tfactors.T923i + + -0.376902 + (5.0/3.0) * -0.0194875 * tfactors.T923 + -6.9232499999999995 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + // nfisn + ln_set_rate = 65.62307107253824 + -94.58145021113825 * tfactors.T9i + -110.655 * tfactors.T913i + 83.0232 * tfactors.T913 + + -19.7762 * tfactors.T9 + 3.03961 * tfactors.T953 + -47.9742 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 94.58145021113825 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -110.655 * tfactors.T943i + (1.0/3.0) * 83.0232 * tfactors.T923i + + -19.7762 + (5.0/3.0) * 3.03961 * tfactors.T923 + -47.9742 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real Cr48_pf, dCr48_pf_dT; + // interpolating Cr48 partition function + get_partition_function(Cr48, tfactors, Cr48_pf, dCr48_pf_dT); + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real V47_pf, dV47_pf_dT; + // interpolating V47 partition function + get_partition_function(V47, tfactors, V47_pf, dV47_pf_dT); + + Real z_r = p_pf * V47_pf; + Real z_p = Cr48_pf; + + Real dz_r_dT = V47_pf * dp_pf_dT + p_pf * dV47_pf_dT; + Real dz_p_dT = dCr48_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_V47_to_He4_Ti44_derived_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // V47 + p --> He4 + Ti44 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // chw0r + ln_set_rate = -76.61433695168769 + -6.029445311023438 * tfactors.T9i + 70.2835 * tfactors.T913 + + -7.99061 * tfactors.T9 + 0.486213 * tfactors.T953 + -1.5 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 6.029445311023438 * tfactors.T9i * tfactors.T9i + (1.0/3.0) * 70.2835 * tfactors.T923i + + -7.99061 + (5.0/3.0) * 0.486213 * tfactors.T923 + -1.5 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real V47_pf, dV47_pf_dT; + // interpolating V47 partition function + get_partition_function(V47, tfactors, V47_pf, dV47_pf_dT); + + Real Ti44_pf, dTi44_pf_dT; + // interpolating Ti44 partition function + get_partition_function(Ti44, tfactors, Ti44_pf, dTi44_pf_dT); + + Real z_r = He4_pf * Ti44_pf; + Real z_p = p_pf * V47_pf; + + Real dz_r_dT = Ti44_pf * dHe4_pf_dT + He4_pf * dTi44_pf_dT; + Real dz_p_dT = V47_pf * dp_pf_dT + p_pf * dV47_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Fe52_to_He4_Cr48_derived_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Fe52 --> He4 + Cr48 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 90.14738712482466 + -92.10912191363732 * tfactors.T9i + -86.7459 * tfactors.T913i + -9.79373 * tfactors.T913 + + -0.772169 * tfactors.T9 + 0.155883 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 92.10912191363732 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -86.7459 * tfactors.T943i + (1.0/3.0) * -9.79373 * tfactors.T923i + + -0.772169 + (5.0/3.0) * 0.155883 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real Cr48_pf, dCr48_pf_dT; + // interpolating Cr48 partition function + get_partition_function(Cr48, tfactors, Cr48_pf, dCr48_pf_dT); + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real Fe52_pf, dFe52_pf_dT; + // interpolating Fe52 partition function + get_partition_function(Fe52, tfactors, Fe52_pf, dFe52_pf_dT); + + Real z_r = He4_pf * Cr48_pf; + Real z_p = Fe52_pf; + + Real dz_r_dT = Cr48_pf * dHe4_pf_dT + He4_pf * dCr48_pf_dT; + Real dz_p_dT = dFe52_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Fe52_to_p_Mn51_derived_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Fe52 --> p + Mn51 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 61.72798916565748 + -85.6326403498911 * tfactors.T9i + -36.1825 * tfactors.T913i + 0.873042 * tfactors.T913 + + -2.89731 * tfactors.T9 + 0.364394 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 85.6326403498911 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -36.1825 * tfactors.T943i + (1.0/3.0) * 0.873042 * tfactors.T923i + + -2.89731 + (5.0/3.0) * 0.364394 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real Mn51_pf, dMn51_pf_dT; + // interpolating Mn51 partition function + get_partition_function(Mn51, tfactors, Mn51_pf, dMn51_pf_dT); + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real Fe52_pf, dFe52_pf_dT; + // interpolating Fe52 partition function + get_partition_function(Fe52, tfactors, Fe52_pf, dFe52_pf_dT); + + Real z_r = p_pf * Mn51_pf; + Real z_p = Fe52_pf; + + Real dz_r_dT = Mn51_pf * dp_pf_dT + p_pf * dMn51_pf_dT; + Real dz_p_dT = dFe52_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Mn51_to_He4_Cr48_derived_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Mn51 + p --> He4 + Cr48 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 58.73119795916719 + -6.476551190854941 * tfactors.T9i + -86.7459 * tfactors.T913i + 1.05653 * tfactors.T913 + + -1.15757 * tfactors.T9 + 0.0877546 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 6.476551190854941 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -86.7459 * tfactors.T943i + (1.0/3.0) * 1.05653 * tfactors.T923i + + -1.15757 + (5.0/3.0) * 0.0877546 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real Cr48_pf, dCr48_pf_dT; + // interpolating Cr48 partition function + get_partition_function(Cr48, tfactors, Cr48_pf, dCr48_pf_dT); + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real Mn51_pf, dMn51_pf_dT; + // interpolating Mn51 partition function + get_partition_function(Mn51, tfactors, Mn51_pf, dMn51_pf_dT); + + Real z_r = He4_pf * Cr48_pf; + Real z_p = p_pf * Mn51_pf; + + Real dz_r_dT = Cr48_pf * dHe4_pf_dT + He4_pf * dCr48_pf_dT; + Real dz_p_dT = Mn51_pf * dp_pf_dT + p_pf * dMn51_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ni56_to_He4_Fe52_derived_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Ni56 --> He4 + Fe52 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 91.62258922810439 + -92.801099329237 * tfactors.T9i + -91.6819 * tfactors.T913i + -9.51885 * tfactors.T913 + + -0.533014 * tfactors.T9 + 0.0892607 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 92.801099329237 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -91.6819 * tfactors.T943i + (1.0/3.0) * -9.51885 * tfactors.T923i + + -0.533014 + (5.0/3.0) * 0.0892607 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real Ni56_pf, dNi56_pf_dT; + // interpolating Ni56 partition function + get_partition_function(Ni56, tfactors, Ni56_pf, dNi56_pf_dT); + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real Fe52_pf, dFe52_pf_dT; + // interpolating Fe52 partition function + get_partition_function(Fe52, tfactors, Fe52_pf, dFe52_pf_dT); + + Real z_r = He4_pf * Fe52_pf; + Real z_p = Ni56_pf; + + Real dz_r_dT = Fe52_pf * dHe4_pf_dT + He4_pf * dFe52_pf_dT; + Real dz_p_dT = dNi56_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ni56_to_p_Co55_derived_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Ni56 --> p + Co55 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 63.131770608640906 + -83.14741674893808 * tfactors.T9i + -38.1053 * tfactors.T913i + -0.210947 * tfactors.T913 + + -2.68377 * tfactors.T9 + 0.355814 * tfactors.T953 + 0.833333 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 83.14741674893808 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -38.1053 * tfactors.T943i + (1.0/3.0) * -0.210947 * tfactors.T923i + + -2.68377 + (5.0/3.0) * 0.355814 * tfactors.T923 + 0.833333 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real Ni56_pf, dNi56_pf_dT; + // interpolating Ni56 partition function + get_partition_function(Ni56, tfactors, Ni56_pf, dNi56_pf_dT); + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real Co55_pf, dCo55_pf_dT; + // interpolating Co55 partition function + get_partition_function(Co55, tfactors, Co55_pf, dCo55_pf_dT); + + Real z_r = p_pf * Co55_pf; + Real z_p = Ni56_pf; + + Real dz_r_dT = Co55_pf * dp_pf_dT + p_pf * dCo55_pf_dT; + Real dz_p_dT = dNi56_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_p_Co55_to_He4_Fe52_derived_removed(const tf_t& tfactors, Real& rate, Real& drate_dT) { + + // Co55 + p --> He4 + Fe52 + + rate = 0.0; + drate_dT = 0.0; + + Real ln_set_rate{0.0}; + Real dln_set_rate_dT9{0.0}; + Real set_rate{0.0}; + + // ths8r + ln_set_rate = 61.443418619463486 + -9.65364776674457 * tfactors.T9i + -91.6819 * tfactors.T913i + -0.329235 * tfactors.T913 + + -0.780924 * tfactors.T9 + 0.0425179 * tfactors.T953 + -0.666667 * tfactors.lnT9; + + if constexpr (do_T_derivatives) { + dln_set_rate_dT9 = 9.65364776674457 * tfactors.T9i * tfactors.T9i + -(1.0/3.0) * -91.6819 * tfactors.T943i + (1.0/3.0) * -0.329235 * tfactors.T923i + + -0.780924 + (5.0/3.0) * 0.0425179 * tfactors.T923 + -0.666667 * tfactors.T9i; + } + + // avoid underflows by zeroing rates in [0.0, 1.e-100] + ln_set_rate = std::max(ln_set_rate, -230.0); + set_rate = std::exp(ln_set_rate); + rate += set_rate; + if constexpr (do_T_derivatives) { + drate_dT += set_rate * dln_set_rate_dT9 / 1.0e9; + } + + + Real p_pf, dp_pf_dT; + // setting p partition function to 1.0 by default, independent of T + p_pf = 1.0_rt; + dp_pf_dT = 0.0_rt; + + Real He4_pf, dHe4_pf_dT; + // setting He4 partition function to 1.0 by default, independent of T + He4_pf = 1.0_rt; + dHe4_pf_dT = 0.0_rt; + + Real Co55_pf, dCo55_pf_dT; + // interpolating Co55 partition function + get_partition_function(Co55, tfactors, Co55_pf, dCo55_pf_dT); + + Real Fe52_pf, dFe52_pf_dT; + // interpolating Fe52 partition function + get_partition_function(Fe52, tfactors, Fe52_pf, dFe52_pf_dT); + + Real z_r = He4_pf * Fe52_pf; + Real z_p = p_pf * Co55_pf; + + Real dz_r_dT = Fe52_pf * dHe4_pf_dT + He4_pf * dFe52_pf_dT; + Real dz_p_dT = Co55_pf * dp_pf_dT + p_pf * dCo55_pf_dT; + + Real dzterm_dT = (z_p * dz_r_dT - z_r * dz_p_dT) / (z_p * z_p); + + drate_dT = dzterm_dT * rate + drate_dT * (z_r / z_p); + rate *= z_r/z_p; + +} + + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_S32_He4_to_Ar36_approx(const T& rate_eval, Real& rate, Real& drate_dT) { + + Real r_ag = rate_eval.screened_rates(k_He4_S32_to_Ar36_removed); + Real r_ap = rate_eval.screened_rates(k_He4_S32_to_p_Cl35_derived_removed); + Real r_pg = rate_eval.screened_rates(k_p_Cl35_to_Ar36_removed); + Real r_pa = rate_eval.screened_rates(k_p_Cl35_to_He4_S32_removed); + Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ag + r_ap * r_pg * dd; + if constexpr (std::is_same::value) { + Real drdT_ag = rate_eval.dscreened_rates_dT(k_He4_S32_to_Ar36_removed); + Real drdT_ap = rate_eval.dscreened_rates_dT(k_He4_S32_to_p_Cl35_derived_removed); + Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_Cl35_to_Ar36_removed); + Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_Cl35_to_He4_S32_removed); + drate_dT = drdT_ag + drdT_ap * r_pg * dd + r_ap * drdT_pg * dd - r_ap * r_pg * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ar36_to_S32_He4_approx(const T& rate_eval, Real& rate, Real& drate_dT) { + + Real r_ga = rate_eval.screened_rates(k_Ar36_to_He4_S32_derived_removed); + Real r_pa = rate_eval.screened_rates(k_p_Cl35_to_He4_S32_removed); + Real r_gp = rate_eval.screened_rates(k_Ar36_to_p_Cl35_derived_removed); + Real r_pg = rate_eval.screened_rates(k_p_Cl35_to_Ar36_removed); + Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ga + r_gp * r_pa * dd; + if constexpr (std::is_same::value) { + Real drdT_ga = rate_eval.dscreened_rates_dT(k_Ar36_to_He4_S32_derived_removed); + Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_Cl35_to_He4_S32_removed); + Real drdT_gp = rate_eval.dscreened_rates_dT(k_Ar36_to_p_Cl35_derived_removed); + Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_Cl35_to_Ar36_removed); + drate_dT = drdT_ga + drdT_gp * r_pa * dd + r_gp * drdT_pa * dd - r_gp * r_pa * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ar36_He4_to_Ca40_approx(const T& rate_eval, Real& rate, Real& drate_dT) { + + Real r_ag = rate_eval.screened_rates(k_He4_Ar36_to_Ca40_removed); + Real r_ap = rate_eval.screened_rates(k_He4_Ar36_to_p_K39_derived_removed); + Real r_pg = rate_eval.screened_rates(k_p_K39_to_Ca40_removed); + Real r_pa = rate_eval.screened_rates(k_p_K39_to_He4_Ar36_removed); + Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ag + r_ap * r_pg * dd; + if constexpr (std::is_same::value) { + Real drdT_ag = rate_eval.dscreened_rates_dT(k_He4_Ar36_to_Ca40_removed); + Real drdT_ap = rate_eval.dscreened_rates_dT(k_He4_Ar36_to_p_K39_derived_removed); + Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_K39_to_Ca40_removed); + Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_K39_to_He4_Ar36_removed); + drate_dT = drdT_ag + drdT_ap * r_pg * dd + r_ap * drdT_pg * dd - r_ap * r_pg * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ca40_to_Ar36_He4_approx(const T& rate_eval, Real& rate, Real& drate_dT) { + + Real r_ga = rate_eval.screened_rates(k_Ca40_to_He4_Ar36_derived_removed); + Real r_pa = rate_eval.screened_rates(k_p_K39_to_He4_Ar36_removed); + Real r_gp = rate_eval.screened_rates(k_Ca40_to_p_K39_derived_removed); + Real r_pg = rate_eval.screened_rates(k_p_K39_to_Ca40_removed); + Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ga + r_gp * r_pa * dd; + if constexpr (std::is_same::value) { + Real drdT_ga = rate_eval.dscreened_rates_dT(k_Ca40_to_He4_Ar36_derived_removed); + Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_K39_to_He4_Ar36_removed); + Real drdT_gp = rate_eval.dscreened_rates_dT(k_Ca40_to_p_K39_derived_removed); + Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_K39_to_Ca40_removed); + drate_dT = drdT_ga + drdT_gp * r_pa * dd + r_gp * drdT_pa * dd - r_gp * r_pa * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ca40_He4_to_Ti44_approx(const T& rate_eval, Real& rate, Real& drate_dT) { + + Real r_ag = rate_eval.screened_rates(k_He4_Ca40_to_Ti44_removed); + Real r_ap = rate_eval.screened_rates(k_He4_Ca40_to_p_Sc43_derived_removed); + Real r_pg = rate_eval.screened_rates(k_p_Sc43_to_Ti44_removed); + Real r_pa = rate_eval.screened_rates(k_p_Sc43_to_He4_Ca40_removed); + Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ag + r_ap * r_pg * dd; + if constexpr (std::is_same::value) { + Real drdT_ag = rate_eval.dscreened_rates_dT(k_He4_Ca40_to_Ti44_removed); + Real drdT_ap = rate_eval.dscreened_rates_dT(k_He4_Ca40_to_p_Sc43_derived_removed); + Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_Sc43_to_Ti44_removed); + Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_Sc43_to_He4_Ca40_removed); + drate_dT = drdT_ag + drdT_ap * r_pg * dd + r_ap * drdT_pg * dd - r_ap * r_pg * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ti44_to_Ca40_He4_approx(const T& rate_eval, Real& rate, Real& drate_dT) { + + Real r_ga = rate_eval.screened_rates(k_Ti44_to_He4_Ca40_derived_removed); + Real r_pa = rate_eval.screened_rates(k_p_Sc43_to_He4_Ca40_removed); + Real r_gp = rate_eval.screened_rates(k_Ti44_to_p_Sc43_derived_removed); + Real r_pg = rate_eval.screened_rates(k_p_Sc43_to_Ti44_removed); + Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ga + r_gp * r_pa * dd; + if constexpr (std::is_same::value) { + Real drdT_ga = rate_eval.dscreened_rates_dT(k_Ti44_to_He4_Ca40_derived_removed); + Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_Sc43_to_He4_Ca40_removed); + Real drdT_gp = rate_eval.dscreened_rates_dT(k_Ti44_to_p_Sc43_derived_removed); + Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_Sc43_to_Ti44_removed); + drate_dT = drdT_ga + drdT_gp * r_pa * dd + r_gp * drdT_pa * dd - r_gp * r_pa * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ti44_He4_to_Cr48_approx(const T& rate_eval, Real& rate, Real& drate_dT) { + + Real r_ag = rate_eval.screened_rates(k_He4_Ti44_to_Cr48_removed); + Real r_ap = rate_eval.screened_rates(k_He4_Ti44_to_p_V47_removed); + Real r_pg = rate_eval.screened_rates(k_p_V47_to_Cr48_removed); + Real r_pa = rate_eval.screened_rates(k_p_V47_to_He4_Ti44_derived_removed); + Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ag + r_ap * r_pg * dd; + if constexpr (std::is_same::value) { + Real drdT_ag = rate_eval.dscreened_rates_dT(k_He4_Ti44_to_Cr48_removed); + Real drdT_ap = rate_eval.dscreened_rates_dT(k_He4_Ti44_to_p_V47_removed); + Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_V47_to_Cr48_removed); + Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_V47_to_He4_Ti44_derived_removed); + drate_dT = drdT_ag + drdT_ap * r_pg * dd + r_ap * drdT_pg * dd - r_ap * r_pg * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Cr48_to_Ti44_He4_approx(const T& rate_eval, Real& rate, Real& drate_dT) { + + Real r_ga = rate_eval.screened_rates(k_Cr48_to_He4_Ti44_derived_removed); + Real r_pa = rate_eval.screened_rates(k_p_V47_to_He4_Ti44_derived_removed); + Real r_gp = rate_eval.screened_rates(k_Cr48_to_p_V47_derived_removed); + Real r_pg = rate_eval.screened_rates(k_p_V47_to_Cr48_removed); + Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ga + r_gp * r_pa * dd; + if constexpr (std::is_same::value) { + Real drdT_ga = rate_eval.dscreened_rates_dT(k_Cr48_to_He4_Ti44_derived_removed); + Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_V47_to_He4_Ti44_derived_removed); + Real drdT_gp = rate_eval.dscreened_rates_dT(k_Cr48_to_p_V47_derived_removed); + Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_V47_to_Cr48_removed); + drate_dT = drdT_ga + drdT_gp * r_pa * dd + r_gp * drdT_pa * dd - r_gp * r_pa * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Cr48_He4_to_Fe52_approx(const T& rate_eval, Real& rate, Real& drate_dT) { + + Real r_ag = rate_eval.screened_rates(k_He4_Cr48_to_Fe52_removed); + Real r_ap = rate_eval.screened_rates(k_He4_Cr48_to_p_Mn51_removed); + Real r_pg = rate_eval.screened_rates(k_p_Mn51_to_Fe52_removed); + Real r_pa = rate_eval.screened_rates(k_p_Mn51_to_He4_Cr48_derived_removed); + Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ag + r_ap * r_pg * dd; + if constexpr (std::is_same::value) { + Real drdT_ag = rate_eval.dscreened_rates_dT(k_He4_Cr48_to_Fe52_removed); + Real drdT_ap = rate_eval.dscreened_rates_dT(k_He4_Cr48_to_p_Mn51_removed); + Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_Mn51_to_Fe52_removed); + Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_Mn51_to_He4_Cr48_derived_removed); + drate_dT = drdT_ag + drdT_ap * r_pg * dd + r_ap * drdT_pg * dd - r_ap * r_pg * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Fe52_to_Cr48_He4_approx(const T& rate_eval, Real& rate, Real& drate_dT) { + + Real r_ga = rate_eval.screened_rates(k_Fe52_to_He4_Cr48_derived_removed); + Real r_pa = rate_eval.screened_rates(k_p_Mn51_to_He4_Cr48_derived_removed); + Real r_gp = rate_eval.screened_rates(k_Fe52_to_p_Mn51_derived_removed); + Real r_pg = rate_eval.screened_rates(k_p_Mn51_to_Fe52_removed); + Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ga + r_gp * r_pa * dd; + if constexpr (std::is_same::value) { + Real drdT_ga = rate_eval.dscreened_rates_dT(k_Fe52_to_He4_Cr48_derived_removed); + Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_Mn51_to_He4_Cr48_derived_removed); + Real drdT_gp = rate_eval.dscreened_rates_dT(k_Fe52_to_p_Mn51_derived_removed); + Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_Mn51_to_Fe52_removed); + drate_dT = drdT_ga + drdT_gp * r_pa * dd + r_gp * drdT_pa * dd - r_gp * r_pa * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Fe52_He4_to_Ni56_approx(const T& rate_eval, Real& rate, Real& drate_dT) { + + Real r_ag = rate_eval.screened_rates(k_He4_Fe52_to_Ni56_removed); + Real r_ap = rate_eval.screened_rates(k_He4_Fe52_to_p_Co55_removed); + Real r_pg = rate_eval.screened_rates(k_p_Co55_to_Ni56_removed); + Real r_pa = rate_eval.screened_rates(k_p_Co55_to_He4_Fe52_derived_removed); + Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ag + r_ap * r_pg * dd; + if constexpr (std::is_same::value) { + Real drdT_ag = rate_eval.dscreened_rates_dT(k_He4_Fe52_to_Ni56_removed); + Real drdT_ap = rate_eval.dscreened_rates_dT(k_He4_Fe52_to_p_Co55_removed); + Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_Co55_to_Ni56_removed); + Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_Co55_to_He4_Fe52_derived_removed); + drate_dT = drdT_ag + drdT_ap * r_pg * dd + r_ap * drdT_pg * dd - r_ap * r_pg * dd * dd * (drdT_pg + drdT_pa); + } +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void rate_Ni56_to_Fe52_He4_approx(const T& rate_eval, Real& rate, Real& drate_dT) { + + Real r_ga = rate_eval.screened_rates(k_Ni56_to_He4_Fe52_derived_removed); + Real r_pa = rate_eval.screened_rates(k_p_Co55_to_He4_Fe52_derived_removed); + Real r_gp = rate_eval.screened_rates(k_Ni56_to_p_Co55_derived_removed); + Real r_pg = rate_eval.screened_rates(k_p_Co55_to_Ni56_removed); + Real dd = 1.0_rt / (r_pg + r_pa); + rate = r_ga + r_gp * r_pa * dd; + if constexpr (std::is_same::value) { + Real drdT_ga = rate_eval.dscreened_rates_dT(k_Ni56_to_He4_Fe52_derived_removed); + Real drdT_pa = rate_eval.dscreened_rates_dT(k_p_Co55_to_He4_Fe52_derived_removed); + Real drdT_gp = rate_eval.dscreened_rates_dT(k_Ni56_to_p_Co55_derived_removed); + Real drdT_pg = rate_eval.dscreened_rates_dT(k_p_Co55_to_Ni56_removed); + drate_dT = drdT_ga + drdT_gp * r_pa * dd + r_gp * drdT_pa * dd - r_gp * r_pa * dd * dd * (drdT_pg + drdT_pa); + } +} + + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void +fill_reaclib_rates(const tf_t& tfactors, T& rate_eval) +{ + + Real rate; + Real drate_dT; + + rate_p_C12_to_N13(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_C12_to_N13) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_C12_to_N13) = drate_dT; + + } + rate_He4_C12_to_O16(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_C12_to_O16) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_C12_to_O16) = drate_dT; + + } + rate_He4_O16_to_Ne20(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_O16_to_Ne20) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_O16_to_Ne20) = drate_dT; + + } + rate_He4_Ne20_to_Mg24(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Ne20_to_Mg24) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_Ne20_to_Mg24) = drate_dT; + + } + rate_p_Na23_to_Mg24(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Na23_to_Mg24) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_Na23_to_Mg24) = drate_dT; + + } + rate_He4_Mg24_to_Si28(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Mg24_to_Si28) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_Mg24_to_Si28) = drate_dT; + + } + rate_p_Al27_to_Si28(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Al27_to_Si28) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_Al27_to_Si28) = drate_dT; + + } + rate_He4_Si28_to_S32(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Si28_to_S32) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_Si28_to_S32) = drate_dT; + + } + rate_p_P31_to_S32(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_P31_to_S32) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_P31_to_S32) = drate_dT; + + } + rate_C12_C12_to_p_Na23(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_C12_C12_to_p_Na23) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_C12_C12_to_p_Na23) = drate_dT; + + } + rate_C12_C12_to_He4_Ne20(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_C12_C12_to_He4_Ne20) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_C12_C12_to_He4_Ne20) = drate_dT; + + } + rate_He4_N13_to_p_O16(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_N13_to_p_O16) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_N13_to_p_O16) = drate_dT; + + } + rate_C12_O16_to_p_Al27(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_C12_O16_to_p_Al27) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_C12_O16_to_p_Al27) = drate_dT; + + } + rate_C12_O16_to_He4_Mg24(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_C12_O16_to_He4_Mg24) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_C12_O16_to_He4_Mg24) = drate_dT; + + } + rate_O16_O16_to_p_P31(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_O16_O16_to_p_P31) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_O16_O16_to_p_P31) = drate_dT; + + } + rate_O16_O16_to_He4_Si28(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_O16_O16_to_He4_Si28) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_O16_O16_to_He4_Si28) = drate_dT; + + } + rate_p_Na23_to_He4_Ne20(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Na23_to_He4_Ne20) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_Na23_to_He4_Ne20) = drate_dT; + + } + rate_p_Al27_to_He4_Mg24(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Al27_to_He4_Mg24) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_Al27_to_He4_Mg24) = drate_dT; + + } + rate_p_P31_to_He4_Si28(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_P31_to_He4_Si28) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_P31_to_He4_Si28) = drate_dT; + + } + rate_He4_He4_He4_to_C12(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_He4_He4_to_C12) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_He4_He4_to_C12) = drate_dT; + + } + rate_C12_C12_to_Mg24_modified(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_C12_C12_to_Mg24_modified) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_C12_C12_to_Mg24_modified) = drate_dT; + + } + rate_O16_O16_to_S32_modified(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_O16_O16_to_S32_modified) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_O16_O16_to_S32_modified) = drate_dT; + + } + rate_C12_O16_to_Si28_modified(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_C12_O16_to_Si28_modified) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_C12_O16_to_Si28_modified) = drate_dT; + + } + rate_He4_S32_to_Ar36_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_S32_to_Ar36_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_S32_to_Ar36_removed) = drate_dT; + + } + rate_p_Cl35_to_Ar36_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Cl35_to_Ar36_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_Cl35_to_Ar36_removed) = drate_dT; + + } + rate_p_Cl35_to_He4_S32_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Cl35_to_He4_S32_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_Cl35_to_He4_S32_removed) = drate_dT; + + } + rate_He4_Ar36_to_Ca40_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Ar36_to_Ca40_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_Ar36_to_Ca40_removed) = drate_dT; + + } + rate_p_K39_to_Ca40_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_K39_to_Ca40_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_K39_to_Ca40_removed) = drate_dT; + + } + rate_p_K39_to_He4_Ar36_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_K39_to_He4_Ar36_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_K39_to_He4_Ar36_removed) = drate_dT; + + } + rate_He4_Ca40_to_Ti44_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Ca40_to_Ti44_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_Ca40_to_Ti44_removed) = drate_dT; + + } + rate_p_Sc43_to_Ti44_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Sc43_to_Ti44_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_Sc43_to_Ti44_removed) = drate_dT; + + } + rate_p_Sc43_to_He4_Ca40_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Sc43_to_He4_Ca40_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_Sc43_to_He4_Ca40_removed) = drate_dT; + + } + rate_He4_Ti44_to_Cr48_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Ti44_to_Cr48_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_Ti44_to_Cr48_removed) = drate_dT; + + } + rate_He4_Ti44_to_p_V47_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Ti44_to_p_V47_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_Ti44_to_p_V47_removed) = drate_dT; + + } + rate_p_V47_to_Cr48_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_V47_to_Cr48_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_V47_to_Cr48_removed) = drate_dT; + + } + rate_He4_Cr48_to_Fe52_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Cr48_to_Fe52_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_Cr48_to_Fe52_removed) = drate_dT; + + } + rate_He4_Cr48_to_p_Mn51_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Cr48_to_p_Mn51_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_Cr48_to_p_Mn51_removed) = drate_dT; + + } + rate_p_Mn51_to_Fe52_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Mn51_to_Fe52_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_Mn51_to_Fe52_removed) = drate_dT; + + } + rate_He4_Fe52_to_Ni56_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Fe52_to_Ni56_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_Fe52_to_Ni56_removed) = drate_dT; + + } + rate_He4_Fe52_to_p_Co55_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Fe52_to_p_Co55_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_Fe52_to_p_Co55_removed) = drate_dT; + + } + rate_p_Co55_to_Ni56_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Co55_to_Ni56_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_Co55_to_Ni56_removed) = drate_dT; + + } + rate_N13_to_p_C12_derived(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_N13_to_p_C12_derived) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_N13_to_p_C12_derived) = drate_dT; + + } + rate_O16_to_He4_C12_derived(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_O16_to_He4_C12_derived) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_O16_to_He4_C12_derived) = drate_dT; + + } + rate_Ne20_to_He4_O16_derived(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ne20_to_He4_O16_derived) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Ne20_to_He4_O16_derived) = drate_dT; + + } + rate_Mg24_to_p_Na23_derived(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Mg24_to_p_Na23_derived) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Mg24_to_p_Na23_derived) = drate_dT; + + } + rate_Mg24_to_He4_Ne20_derived(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Mg24_to_He4_Ne20_derived) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Mg24_to_He4_Ne20_derived) = drate_dT; + + } + rate_Si28_to_p_Al27_derived(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Si28_to_p_Al27_derived) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Si28_to_p_Al27_derived) = drate_dT; + + } + rate_Si28_to_He4_Mg24_derived(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Si28_to_He4_Mg24_derived) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Si28_to_He4_Mg24_derived) = drate_dT; + + } + rate_S32_to_p_P31_derived(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_S32_to_p_P31_derived) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_S32_to_p_P31_derived) = drate_dT; + + } + rate_S32_to_He4_Si28_derived(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_S32_to_He4_Si28_derived) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_S32_to_He4_Si28_derived) = drate_dT; + + } + rate_C12_to_He4_He4_He4_derived(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_C12_to_He4_He4_He4_derived) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_C12_to_He4_He4_He4_derived) = drate_dT; + + } + rate_p_O16_to_He4_N13_derived(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_O16_to_He4_N13_derived) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_O16_to_He4_N13_derived) = drate_dT; + + } + rate_He4_Ne20_to_p_Na23_derived(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Ne20_to_p_Na23_derived) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_Ne20_to_p_Na23_derived) = drate_dT; + + } + rate_He4_Mg24_to_p_Al27_derived(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Mg24_to_p_Al27_derived) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_Mg24_to_p_Al27_derived) = drate_dT; + + } + rate_He4_Si28_to_p_P31_derived(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Si28_to_p_P31_derived) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_Si28_to_p_P31_derived) = drate_dT; + + } + rate_He4_S32_to_p_Cl35_derived_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_S32_to_p_Cl35_derived_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_S32_to_p_Cl35_derived_removed) = drate_dT; + + } + rate_Ar36_to_He4_S32_derived_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ar36_to_He4_S32_derived_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Ar36_to_He4_S32_derived_removed) = drate_dT; + + } + rate_Ar36_to_p_Cl35_derived_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ar36_to_p_Cl35_derived_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Ar36_to_p_Cl35_derived_removed) = drate_dT; + + } + rate_He4_Ar36_to_p_K39_derived_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Ar36_to_p_K39_derived_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_Ar36_to_p_K39_derived_removed) = drate_dT; + + } + rate_Ca40_to_He4_Ar36_derived_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ca40_to_He4_Ar36_derived_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Ca40_to_He4_Ar36_derived_removed) = drate_dT; + + } + rate_Ca40_to_p_K39_derived_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ca40_to_p_K39_derived_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Ca40_to_p_K39_derived_removed) = drate_dT; + + } + rate_He4_Ca40_to_p_Sc43_derived_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_He4_Ca40_to_p_Sc43_derived_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_He4_Ca40_to_p_Sc43_derived_removed) = drate_dT; + + } + rate_Ti44_to_He4_Ca40_derived_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ti44_to_He4_Ca40_derived_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Ti44_to_He4_Ca40_derived_removed) = drate_dT; + + } + rate_Ti44_to_p_Sc43_derived_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ti44_to_p_Sc43_derived_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Ti44_to_p_Sc43_derived_removed) = drate_dT; + + } + rate_Cr48_to_He4_Ti44_derived_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Cr48_to_He4_Ti44_derived_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Cr48_to_He4_Ti44_derived_removed) = drate_dT; + + } + rate_Cr48_to_p_V47_derived_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Cr48_to_p_V47_derived_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Cr48_to_p_V47_derived_removed) = drate_dT; + + } + rate_p_V47_to_He4_Ti44_derived_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_V47_to_He4_Ti44_derived_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_V47_to_He4_Ti44_derived_removed) = drate_dT; + + } + rate_Fe52_to_He4_Cr48_derived_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Fe52_to_He4_Cr48_derived_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Fe52_to_He4_Cr48_derived_removed) = drate_dT; + + } + rate_Fe52_to_p_Mn51_derived_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Fe52_to_p_Mn51_derived_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Fe52_to_p_Mn51_derived_removed) = drate_dT; + + } + rate_p_Mn51_to_He4_Cr48_derived_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Mn51_to_He4_Cr48_derived_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_Mn51_to_He4_Cr48_derived_removed) = drate_dT; + + } + rate_Ni56_to_He4_Fe52_derived_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ni56_to_He4_Fe52_derived_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Ni56_to_He4_Fe52_derived_removed) = drate_dT; + + } + rate_Ni56_to_p_Co55_derived_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_Ni56_to_p_Co55_derived_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Ni56_to_p_Co55_derived_removed) = drate_dT; + + } + rate_p_Co55_to_He4_Fe52_derived_removed(tfactors, rate, drate_dT); + rate_eval.screened_rates(k_p_Co55_to_He4_Fe52_derived_removed) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_p_Co55_to_He4_Fe52_derived_removed) = drate_dT; + + } + +} + +template +AMREX_GPU_HOST_DEVICE AMREX_INLINE +void +fill_approx_rates([[maybe_unused]] const tf_t& tfactors, [[maybe_unused]] T& rate_eval) +{ + + [[maybe_unused]] Real rate{}; + [[maybe_unused]] Real drate_dT{}; + + rate_S32_He4_to_Ar36_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_S32_He4_to_Ar36_approx) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_S32_He4_to_Ar36_approx) = drate_dT; + + } + rate_Ar36_to_S32_He4_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Ar36_to_S32_He4_approx) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Ar36_to_S32_He4_approx) = drate_dT; + + } + rate_Ar36_He4_to_Ca40_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Ar36_He4_to_Ca40_approx) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Ar36_He4_to_Ca40_approx) = drate_dT; + + } + rate_Ca40_to_Ar36_He4_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Ca40_to_Ar36_He4_approx) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Ca40_to_Ar36_He4_approx) = drate_dT; + + } + rate_Ca40_He4_to_Ti44_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Ca40_He4_to_Ti44_approx) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Ca40_He4_to_Ti44_approx) = drate_dT; + + } + rate_Ti44_to_Ca40_He4_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Ti44_to_Ca40_He4_approx) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Ti44_to_Ca40_He4_approx) = drate_dT; + + } + rate_Ti44_He4_to_Cr48_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Ti44_He4_to_Cr48_approx) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Ti44_He4_to_Cr48_approx) = drate_dT; + + } + rate_Cr48_to_Ti44_He4_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Cr48_to_Ti44_He4_approx) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Cr48_to_Ti44_He4_approx) = drate_dT; + + } + rate_Cr48_He4_to_Fe52_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Cr48_He4_to_Fe52_approx) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Cr48_He4_to_Fe52_approx) = drate_dT; + + } + rate_Fe52_to_Cr48_He4_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Fe52_to_Cr48_He4_approx) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Fe52_to_Cr48_He4_approx) = drate_dT; + + } + rate_Fe52_He4_to_Ni56_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Fe52_He4_to_Ni56_approx) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Fe52_He4_to_Ni56_approx) = drate_dT; + + } + rate_Ni56_to_Fe52_He4_approx(rate_eval, rate, drate_dT); + rate_eval.screened_rates(k_Ni56_to_Fe52_He4_approx) = rate; + if constexpr (std::is_same::value) { + rate_eval.dscreened_rates_dT(k_Ni56_to_Fe52_He4_approx) = drate_dT; + + } + +} + +#endif diff --git a/networks/subch_base/subch_base.png b/networks/subch_base/subch_base.png new file mode 100644 index 0000000000000000000000000000000000000000..28694836cb4983ee1306999c8b05a071ae22e6dc GIT binary patch literal 108703 zcmdRWbyQVv*X;qM1f;t|KpLf6Qc0x*q>+&B?nYW#T2krm?hXZ{yBmZ?46mb0+ zZuQ>>u-Vv~vX6>M?0}1)+P=|rfIu(}V1M8WMGHPd;2@BJSM`=>z@+N>Iel+;Hy&;ieT8IXOID#qg+2mW zp>L?aW3q^Yk575ly0$*j5jocK*!e-#=~BaX+Um>UVUMMAieO_+f

B6zc!}@dNw4 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%0DeQ8yYspJLMsw&W$S}J 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%0AWef4$j`Pqw?xNXH8f43u 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 literal 0 HcmV?d00001 diff --git a/networks/subch_base/subch_base.py b/networks/subch_base/subch_base.py new file mode 100644 index 0000000000..b191b33217 --- /dev/null +++ b/networks/subch_base/subch_base.py @@ -0,0 +1,121 @@ +# subch_base network for He/C burning with key rates +# to bypass the C12(a,g)O16 rate. +# This is a further simplification of subch_simple by +# removing N14, F18, Ne21, and Na22. + +import pynucastro as pyna +from pynucastro.networks import AmrexAstroCxxNetwork + +DO_DERIVED_RATES = True + + +def get_library(): + + reaclib_lib = pyna.ReacLibLibrary() + + all_reactants = ["p", + "he4", "c12", "o16", "ne20", "mg24", "si28", "s32", + "ar36", "ca40", "ti44", "cr48", "fe52", "ni56", + "al27", "p31", "cl35", "k39", "sc43", "v47", "mn51", "co55", + "n13", "na23"] + + subch = reaclib_lib.linking_nuclei(all_reactants) + + # in this list, we have the reactants, the actual reactants, + # and modified products that we will use instead + other_rates = [("c12(c12,n)mg23", "mg24"), + ("o16(o16,n)s31", "s32"), + ("o16(c12,n)si27", "si28")] + + for r, mp in other_rates: + _r = reaclib_lib.get_rate_by_name(r) + _r.modify_products(mp) + subch += pyna.Library(rates=[_r]) + + # finally, the aprox nets don't include the reverse rates for + # C12+C12, C12+O16, and O16+O16, so remove those + + for r in subch.get_rates(): + if sorted(r.products) in [[pyna.Nucleus("c12"), pyna.Nucleus("c12")], + [pyna.Nucleus("c12"), pyna.Nucleus("o16")], + [pyna.Nucleus("o16"), pyna.Nucleus("o16")]]: + subch.remove_rate(r) + + # C12+Ne20 and reverse + # (a,g) links between Na23 and Al27 + # (a,g) links between Al27 and P31 + + rates_to_remove = ["p31(p,c12)ne20", + "si28(a,c12)ne20", + "ne20(c12,p)p31", + "ne20(c12,a)si28", + "na23(a,g)al27", + "al27(g,a)na23", + "al27(a,g)p31", + "p31(g,a)al27"] + + for r in rates_to_remove: + print("removing: ", r) + _r = subch.get_rate_by_name(r) + subch.remove_rate(_r) + + if DO_DERIVED_RATES: + rates_to_derive = [] + for r in subch.get_rates(): + if r.reverse: + # this rate was computed using detailed balance, regardless + # of whether Q < 0 or not. We want to remove it and then + # recompute it + rates_to_derive.append(r) + + # now for each of those derived rates, look to see if the pair exists + + for r in rates_to_derive: + fr = subch.get_rate_by_nuclei(r.products, r.reactants) + if fr: + print(f"modifying {r} from {fr}") + subch.remove_rate(r) + d = pyna.DerivedRate(rate=fr, compute_Q=False, use_pf=True) + subch.add_rate(d) + + return subch + + +def doit(): + + subch = get_library() + + # these are the rates that we are going to allow to be optionally + # zeroed + r1 = subch.get_rate_by_name("c12(p,g)n13") + r2 = subch.get_rate_by_name("n13(he4,p)o16") + + net = AmrexAstroCxxNetwork(libraries=[subch], symmetric_screening=False, disable_rate_params=[r1, r2]) + net.make_ap_pg_approx(intermediate_nuclei=["cl35", "k39", "sc43", "v47", "mn51", "co55"]) + net.remove_nuclei(["cl35", "k39", "sc43", "v47", "mn51", "co55"]) + + # finally, the aprox nets don't include the reverse rates for + # C12+C12, C12+O16, and O16+O16, so remove those + + print(f"number of nuclei: {len(net.unique_nuclei)}") + print(f"number of rates: {len(net.rates)}") + + comp = pyna.Composition(net.get_nuclei()) + comp.set_all(0.1) + comp.set_nuc("he4", 0.95) + comp.normalize() + + rho = 1.e6 + T = 1.e9 + + net.plot(rho, T, comp, outfile="subch_base.png", + rotated=True, hide_xalpha=True, curved_edges=True, + size=(1500, 450), + node_size=500, node_font_size=11, node_color="#337dff", node_shape="s", + Z_range=(1, 29)) + + net.write_network() + + +if __name__ == "__main__": + doit() diff --git a/networks/subch_base/table_rates.H b/networks/subch_base/table_rates.H new file mode 100644 index 0000000000..47a0ef399e --- /dev/null +++ b/networks/subch_base/table_rates.H @@ -0,0 +1,399 @@ +#ifndef TABLE_RATES_H +#define TABLE_RATES_H + +#include +#include +#include +#include + +#include + +using namespace amrex; + +void init_tabular(); + +// Table is expected to be in terms of dens*ye and temp (logarithmic, cgs units) +// Table energy units are expected in terms of ergs + +// all tables are expected to have columns: +// Log(rhoY) Log(T) mu dQ Vs Log(e-cap-rate) Log(nu-energy-loss) Log(gamma-energy) +// Log(g/cm^3) Log(K) erg erg erg Log(1/s) Log(erg/s) Log(erg/s) +// + +const int num_tables = 0; + +enum TableVars +{ + jtab_mu = 1, + jtab_dq = 2, + jtab_vs = 3, + jtab_rate = 4, + jtab_nuloss = 5, + jtab_gamma = 6, + num_vars = jtab_gamma +}; + + +struct table_t +{ + int ntemp; + int nrhoy; + int nvars; + int nheader; +}; + +// we add a 7th index, k_index_dlogr_dlogt used for computing the derivative +// of Log(rate) with respect of Log(temperature) by using the table +// values. It isn't an index into the table but into the 'entries' +// array. Is important to mention that although we compute dlogr/dlogT is +// the computed quantity in 'entries', we pursue ultimately +// dr/dt as the final desired quantity to be computed for this index. + +const int k_index_dlogr_dlogt = 7; +const int add_vars = 1; // 1 Additional Var in entries + + +namespace rate_tables +{ +} + +template +void init_tab_info(const table_t& tf, const std::string& file, R& log_rhoy_table, T& log_temp_table, D& data) +{ + // This function initializes the selected tabular-rate tables. From the tables we are interested + // on the rate, neutrino-energy-loss and the gamma-energy entries. + + std::ifstream table; + table.open(file); + + if (!table.is_open()) { + // the table was not present or we could not open it; abort + amrex::Error("table could not be opened"); + } + + std::string line; + + // read and skip over the header + + for (int i = 0; i < tf.nheader; ++i) { + std::getline(table, line); + } + + // now the data -- there are 2 extra columns, for log_temp and log_rhoy + + for (int j = 1; j <= tf.nrhoy; ++j) { + for (int i = 1; i <= tf.ntemp; ++i) { + std::getline(table, line); + if (line.empty()) { + amrex::Error("Error reading table data"); + } + + std::istringstream sdata(line); + + sdata >> log_rhoy_table(j) >> log_temp_table(i); + + for (int n = 1; n <= tf.nvars; ++n) { + sdata >> data(i, j, n); + } + } + } + table.close(); +} + + +template +AMREX_INLINE AMREX_GPU_HOST_DEVICE +int vector_index_lu(const int vlen, const V& vector, const Real fvar) +{ + + // Returns the greatest index of vector for which vector(index) < fvar. + // Return 1 if fvar < vector(1) + // Return size(vector)-1 if fvar > vector(size(vector)) + // The interval [index, index+1] brackets fvar for fvar within the range of vector. + + int index; + + if (fvar < vector(1)) { + index = 1; + } else if (fvar > vector(vlen)) { + index = vlen - 1; + } else { + int nup = vlen; + int ndn = 1; + for (int i = 1; i <= vlen; ++i) { + int j = ndn + (nup - ndn)/2; + if (fvar < vector(j)) { + nup = j; + } else { + ndn = j; + } + if ((nup - ndn) == 1) { + break; + } + } + index = ndn; + } + return index; +} + + +AMREX_INLINE AMREX_GPU_HOST_DEVICE +Real +evaluate_linear_1d(const Real fhi, const Real flo, const Real xhi, const Real xlo, const Real x) +{ + // This function is a 1-D linear interpolator, that keeps x constant to xlo or xhi, based + // on the side, if x is outside [xlo, xhi] respectively. + + Real xx = Clamp(x, xlo, xhi); + Real f = flo + (fhi - flo) * (xx - xlo) / (xhi - xlo); + + return f; +} + +AMREX_INLINE AMREX_GPU_HOST_DEVICE +Real +evaluate_linear_2d(const Real fip1jp1, const Real fip1j, const Real fijp1, const Real fij, + const Real xhi, const Real xlo, const Real yhi, const Real ylo, + const Real x, const Real y) +{ + // This is the 2-D linear interpolator, as an extension of evaluate_linear_1d. + + Real f; + Real dx = xhi - xlo; + Real dy = yhi - ylo; + + Real E = fij; + Real C = (fijp1 - fij) / dy; + Real B = (fip1j - fij) / dx; + Real A = (fip1jp1 - B * dx - C * dy - E) / (dx * dy); + + Real xx = Clamp(x, xlo, xhi); + Real yy = Clamp(y, ylo, yhi); + + f = A * (xx - xlo) * (yy - ylo) + + B * (xx - xlo) + + C * (yy - ylo) + + E; + + return f; +} + + +template +AMREX_INLINE AMREX_GPU_HOST_DEVICE +Real +evaluate_vars(const table_t& table_meta, const R& log_rhoy_table, const T& log_temp_table, const D& data, + const Real log_rhoy, const Real log_temp, const int component) +{ + // This function evaluates the 2-D interpolator, for several pairs of rho_ye and temperature. + + int jtemp_lo = vector_index_lu(table_meta.ntemp, log_temp_table, log_temp); + int jtemp_hi = jtemp_lo + 1; + + int irhoy_lo = vector_index_lu(table_meta.nrhoy, log_rhoy_table, log_rhoy); + int irhoy_hi = irhoy_lo + 1; + + Real rhoy_lo = log_rhoy_table(irhoy_lo); + Real rhoy_hi = log_rhoy_table(irhoy_hi); + + Real t_lo = log_temp_table(jtemp_lo); + Real t_hi = log_temp_table(jtemp_hi); + + Real fij = data(jtemp_lo, irhoy_lo, component); + Real fip1j = data(jtemp_lo, irhoy_hi, component); + Real fijp1 = data(jtemp_hi, irhoy_lo, component); + Real fip1jp1 = data(jtemp_hi, irhoy_hi, component); + + Real r = evaluate_linear_2d(fip1jp1, fip1j, fijp1, fij, + rhoy_hi, rhoy_lo, t_hi, t_lo, log_rhoy, log_temp); + + return r; +} + + +template +AMREX_INLINE AMREX_GPU_HOST_DEVICE +Real +evaluate_dr_dtemp(const table_t& table_meta, const R& log_rhoy_table, const T& log_temp_table, const D& data, + const Real log_rhoy, const Real log_temp) +{ + // The main objective of this function is compute dlogr_dlogt. + + int irhoy_lo = vector_index_lu(table_meta.nrhoy, log_rhoy_table, log_rhoy); + int irhoy_hi = irhoy_lo + 1; + + int jtemp_lo = vector_index_lu(table_meta.ntemp, log_temp_table, log_temp); + int jtemp_hi = jtemp_lo + 1; + + Real dlogr_dlogt; + + //Now we compute the forward finite difference on the boundary + + if ((jtemp_lo - 1 < 1) || (jtemp_hi + 1 > table_meta.ntemp)) { + + // In this case we are in the boundaries of the table. + // At the boundary, we compute the forward-j finite difference + // to compute dlogr_dlogt_i and dlogr_dlogt_ip1, using the + // following stencil: + // + // + // fijp1-----------fip1jp1 + // | | + // | | + // | | + // | | + // | | + // | | + // | | + // fij-------------fip1j + // + // with the following result: + // + // dlogr_dlogt_i --------dlogr_dlogt_ip1 + // + // Finally, we perform a 1d-linear interpolation between dlogr_dlogt_ip1 + // and dlogr_dlogt_i to compute dlogr_dlogt + + Real log_rhoy_lo = log_rhoy_table(irhoy_lo); + Real log_rhoy_hi = log_rhoy_table(irhoy_hi); + + Real log_temp_lo = log_temp_table(jtemp_lo); + Real log_temp_hi = log_temp_table(jtemp_hi); + + Real fij = data(jtemp_lo, irhoy_lo, jtab_rate); + Real fip1j = data(jtemp_lo, irhoy_hi, jtab_rate); + Real fijp1 = data(jtemp_hi, irhoy_lo, jtab_rate); + Real fip1jp1 = data(jtemp_hi, irhoy_hi, jtab_rate); + + Real dlogr_dlogt_i = (fijp1 - fij) / (log_temp_hi - log_temp_lo); + Real dlogr_dlogt_ip1 = (fip1jp1 - fip1j) / (log_temp_hi - log_temp_lo); + + if ((log_temp < log_temp_lo) || (log_temp > log_temp_hi)) { + dlogr_dlogt = 0.0_rt; + } else { + dlogr_dlogt = evaluate_linear_1d(dlogr_dlogt_ip1, dlogr_dlogt_i, log_rhoy_hi, log_rhoy_lo, log_rhoy); + } + + } else { + + // In this case, we use a bigger stencil to reconstruct the + // temperature derivatives in the j and j+1 temperature positions, + // using the cetral-j finite differences: + // + // fijp2 ------------fip1jp2 + // | | + // | | + // | | + // | | + // | | + // | | + // | | + // fijp1------------fip1jp1 + // | | + // | | + // | | + // | | + // | | + // | | + // | | + // fij------------- fip1j + // | | + // | | + // | | + // | | + // | | + // | | + // | | + // fijm1------------fip1jm1 + // + // with the following result: + // + // + // dr_dt_ijp1 --------dr_dt_ip1jp1 + // | | + // | | + // | | + // | | + // | | + // | | + // | | + // dr_dt_ij-----------dr_dt_ip1j + // + // Finally, we perform a 2d-linear interpolation to + // compute dlogr_dlogt. + + Real log_temp_jm1 = log_temp_table(jtemp_lo-1); + Real log_temp_j = log_temp_table(jtemp_lo); + Real log_temp_jp1 = log_temp_table(jtemp_hi); + Real log_temp_jp2 = log_temp_table(jtemp_hi+1); + + Real log_rhoy_lo = log_rhoy_table(irhoy_lo); + Real log_rhoy_hi = log_rhoy_table(irhoy_hi); + + Real fijm1 = data(jtemp_lo-1, irhoy_lo, jtab_rate); + Real fij = data(jtemp_lo, irhoy_lo, jtab_rate); + Real fijp1 = data(jtemp_hi, irhoy_lo, jtab_rate); + Real fijp2 = data(jtemp_hi+1, irhoy_lo, jtab_rate); + + Real fip1jm1 = data(jtemp_lo-1, irhoy_hi, jtab_rate); + Real fip1j = data(jtemp_lo, irhoy_hi, jtab_rate); + Real fip1jp1 = data(jtemp_hi, irhoy_hi, jtab_rate); + Real fip1jp2 = data(jtemp_hi+1, irhoy_hi, jtab_rate); + + Real dlogr_dlogt_ij = (fijp1 - fijm1)/(log_temp_jp1 - log_temp_jm1); + Real dlogr_dlogt_ijp1 = (fijp2 - fij)/(log_temp_jp2 - log_temp_j); + Real dlogr_dlogt_ip1j = (fip1jp1 - fip1jm1)/(log_temp_jp1 - log_temp_jm1); + Real dlogr_dlogt_ip1jp1 = (fip1jp2 - fip1j)/(log_temp_jp2 - log_temp_j); + + dlogr_dlogt = evaluate_linear_2d(dlogr_dlogt_ip1jp1, dlogr_dlogt_ip1j, dlogr_dlogt_ijp1, dlogr_dlogt_ij, + log_rhoy_hi, log_rhoy_lo, log_temp_jp1, log_temp_j, + log_rhoy, log_temp); + + } + return dlogr_dlogt; +} + + +template +AMREX_INLINE AMREX_GPU_HOST_DEVICE +void +get_entries(const table_t& table_meta, const R& log_rhoy_table, const T& log_temp_table, const D& data, + const Real log_rhoy, const Real log_temp, Array1D& entries) +{ + for (int ivar = 1; ivar <= num_vars; ivar++) { + entries(ivar) = evaluate_vars(table_meta, log_rhoy_table, log_temp_table, data, + log_rhoy, log_temp, ivar); + } + + entries(k_index_dlogr_dlogt) = evaluate_dr_dtemp(table_meta, log_rhoy_table, log_temp_table, data, + log_rhoy, log_temp); +} + +template +AMREX_INLINE AMREX_GPU_HOST_DEVICE +void +tabular_evaluate(const table_t& table_meta, + const R& log_rhoy_table, const T& log_temp_table, const D& data, + const Real rhoy, const Real temp, + Real& rate, Real& drate_dt, Real& edot_nu, Real& edot_gamma) +{ + Array1D entries; + + // Get the table entries at this rhoy, temp + + Real log_rhoy = std::log10(rhoy); + Real log_temp = std::log10(temp); + + get_entries(table_meta, log_rhoy_table, log_temp_table, data, + log_rhoy, log_temp, entries); + + // Fill outputs: rate, d(rate)/d(temperature), and + // (negative) neutrino loss contribution to energy generation + + rate = std::pow(10.0_rt, entries(jtab_rate)); + drate_dt = rate * entries(k_index_dlogr_dlogt) / temp; + edot_nu = -std::pow(10.0_rt, entries(jtab_nuloss)); + edot_gamma = std::pow(10.0_rt, entries(jtab_gamma)); +} + +#endif diff --git a/networks/subch_base/table_rates_data.cpp b/networks/subch_base/table_rates_data.cpp new file mode 100644 index 0000000000..63b38aff19 --- /dev/null +++ b/networks/subch_base/table_rates_data.cpp @@ -0,0 +1,23 @@ +#include +#include +#include +#include + +using namespace amrex; + +namespace rate_tables +{ + + +} + + +void init_tabular() +{ + + amrex::Print() << "reading in network electron-capture / beta-decay tables..." << std::endl; + + using namespace rate_tables; + + +} diff --git a/networks/subch_base/tfactors.H b/networks/subch_base/tfactors.H new file mode 100644 index 0000000000..43a6316db7 --- /dev/null +++ b/networks/subch_base/tfactors.H @@ -0,0 +1,34 @@ +#ifndef TFACTORS_H +#define TFACTORS_H + +struct tf_t { + Real T9; + Real T9i; + Real T943i; + Real T923i; + Real T913i; + Real T913; + Real T923; + Real T953; + Real lnT9; +}; + +AMREX_GPU_HOST_DEVICE AMREX_INLINE +tf_t evaluate_tfactors(const Real T) +{ + + tf_t tf; + tf.T9 = T / 1.e9_rt; + tf.T9i = 1.0_rt / tf.T9; + tf.T913 = std::cbrt(tf.T9); + tf.T913i = 1.0_rt / tf.T913; + tf.T923i = tf.T913i * tf.T913i; + tf.T943i = tf.T9i * tf.T913i; + tf.T923 = tf.T913 * tf.T913; + tf.T953 = tf.T9 * tf.T923; + tf.lnT9 = std::log(tf.T9); + + return tf; +} + +#endif \ No newline at end of file diff --git a/networks/subch_full/README.md b/networks/subch_full/README.md index c01f02165e..5383194588 100644 --- a/networks/subch_full/README.md +++ b/networks/subch_full/README.md @@ -15,8 +15,10 @@ Shen & Bildsten discuss the sequences: * n14(a, g)f18(a, p)ne21 is the one they consider important, since it produces protons that are then available for c12(p, g)n13(a, p)o16. - This leaves ne21 as an endpoint, which we need to connect by - including na22. + Note that, this leaves ne21 as an endpoint, which we need to connect by + including na22. However, adding na22 only makes it as another endpoint, + failing to resolve the issue, resulting in a network with a second + endpoint other than ni56. For the c12+c12, c12+o16, and o16+o16 rates, we also need to include c12(c12,n)mg23(n, g)mg24, o16(o16, n)s31(n, g)s32,