From e77907e0ddb267dfd77d5f0d029f2803afd8186e Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Fri, 27 Aug 2021 15:24:50 -0400 Subject: [PATCH 1/2] add a slightly more extensive nova network this includes all of the nuclei that Ami and Jordi use --- networks/nova2/Make.package | 13 + networks/nova2/NAUX_NETWORK | 1 + networks/nova2/NETWORK_PROPERTIES | 1 + networks/nova2/_parameters | 4 + networks/nova2/actual_network.F90 | 359 ++++++++ networks/nova2/actual_rhs.F90 | 1050 ++++++++++++++++++++++ networks/nova2/inputs.burn_cell.VODE | 86 ++ networks/nova2/nova.png | Bin 0 -> 56785 bytes networks/nova2/nova2.py | 24 + networks/nova2/physical_constants.f90 | 21 + networks/nova2/pynucastro.net | 17 + networks/nova2/reaclib_rate_metadata.dat | 510 +++++++++++ networks/nova2/reaclib_rates.F90 | 199 ++++ networks/nova2/table_rates.F90 | 289 ++++++ 14 files changed, 2574 insertions(+) create mode 100644 networks/nova2/Make.package create mode 100644 networks/nova2/NAUX_NETWORK create mode 100644 networks/nova2/NETWORK_PROPERTIES create mode 100644 networks/nova2/_parameters create mode 100644 networks/nova2/actual_network.F90 create mode 100644 networks/nova2/actual_rhs.F90 create mode 100644 networks/nova2/inputs.burn_cell.VODE create mode 100644 networks/nova2/nova.png create mode 100644 networks/nova2/nova2.py create mode 100644 networks/nova2/physical_constants.f90 create mode 100644 networks/nova2/pynucastro.net create mode 100644 networks/nova2/reaclib_rate_metadata.dat create mode 100644 networks/nova2/reaclib_rates.F90 create mode 100644 networks/nova2/table_rates.F90 diff --git a/networks/nova2/Make.package b/networks/nova2/Make.package new file mode 100644 index 0000000000..953f40b146 --- /dev/null +++ b/networks/nova2/Make.package @@ -0,0 +1,13 @@ +F90EXE_sources += actual_network.F90 +F90EXE_sources += reaclib_rates.F90 +F90EXE_sources += table_rates.F90 +f90EXE_sources += physical_constants.f90 +F90EXE_sources += network_properties.F90 +CEXE_headers += network_properties.H + +ifeq ($(USE_REACT),TRUE) +F90EXE_sources += actual_rhs.F90 + +USE_SCREENING = TRUE +USE_NEUTRINOS = TRUE +endif diff --git a/networks/nova2/NAUX_NETWORK b/networks/nova2/NAUX_NETWORK new file mode 100644 index 0000000000..0d2e084603 --- /dev/null +++ b/networks/nova2/NAUX_NETWORK @@ -0,0 +1 @@ +NAUX := 0 diff --git a/networks/nova2/NETWORK_PROPERTIES b/networks/nova2/NETWORK_PROPERTIES new file mode 100644 index 0000000000..049f8b8ffc --- /dev/null +++ b/networks/nova2/NETWORK_PROPERTIES @@ -0,0 +1 @@ +NSCREEN := 24 diff --git a/networks/nova2/_parameters b/networks/nova2/_parameters new file mode 100644 index 0000000000..1f5e8ea863 --- /dev/null +++ b/networks/nova2/_parameters @@ -0,0 +1,4 @@ +@namespace: network + +# Turn off thermal neutrino losses +disable_thermal_neutrinos logical .false. diff --git a/networks/nova2/actual_network.F90 b/networks/nova2/actual_network.F90 new file mode 100644 index 0000000000..08a7ff5860 --- /dev/null +++ b/networks/nova2/actual_network.F90 @@ -0,0 +1,359 @@ +module actual_network + + use network_properties + use physical_constants, only: ERG_PER_MeV + use amrex_fort_module, only: rt => amrex_real + + implicit none + + public + + character (len=32), parameter :: network_name = "pynucastro" + + real(rt), parameter :: avo = 6.0221417930e23_rt + real(rt), parameter :: c_light = 2.99792458e10_rt + real(rt), parameter :: enuc_conv2 = -avo*c_light*c_light + + real(rt), parameter :: ev2erg = 1.60217648740e-12_rt + real(rt), parameter :: mev2erg = ev2erg * 1.0e6_rt + real(rt), parameter :: mev2gr = mev2erg / c_light**2 + + real(rt), parameter :: mass_neutron = 1.67492721184e-24_rt + real(rt), parameter :: mass_proton = 1.67262163783e-24_rt + real(rt), parameter :: mass_electron = 9.10938215450e-28_rt + + integer, parameter :: nrates = 31 + + + ! For each rate, we need: rate, drate/dT, screening, dscreening/dT + integer, parameter :: num_rate_groups = 4 + + ! Number of reaclib rates + integer, parameter :: nrat_reaclib = 31 + integer, parameter :: number_reaclib_sets = 64 + + ! Number of tabular rates + integer, parameter :: nrat_tabular = 0 + + ! Binding Energies Per Nucleon (MeV) + real(rt) :: ebind_per_nucleon(nspec) + + ! bion: Binding Energies (ergs) + + ! Nuclides + integer, parameter :: jp = 1 + integer, parameter :: jd = 2 + integer, parameter :: jhe3 = 3 + integer, parameter :: jhe4 = 4 + integer, parameter :: jbe7 = 5 + integer, parameter :: jb8 = 6 + integer, parameter :: jc12 = 7 + integer, parameter :: jc13 = 8 + integer, parameter :: jn13 = 9 + integer, parameter :: jn14 = 10 + integer, parameter :: jn15 = 11 + integer, parameter :: jo14 = 12 + integer, parameter :: jo15 = 13 + integer, parameter :: jo16 = 14 + integer, parameter :: jo17 = 15 + integer, parameter :: jf17 = 16 + integer, parameter :: jf18 = 17 + + ! Reactions + integer, parameter :: k_n13__c13__weak__wc12 = 1 + integer, parameter :: k_o14__n14__weak__wc12 = 2 + integer, parameter :: k_o15__n15__weak__wc12 = 3 + integer, parameter :: k_f17__o17__weak__wc12 = 4 + integer, parameter :: k_b8__he4_he4__weak__wc12 = 5 + integer, parameter :: k_p_p__d__weak__bet_pos_ = 6 + integer, parameter :: k_p_p__d__weak__electron_capture = 7 + integer, parameter :: k_p_d__he3 = 8 + integer, parameter :: k_d_d__he4 = 9 + integer, parameter :: k_p_he3__he4__weak__bet_pos_ = 10 + integer, parameter :: k_he4_he3__be7 = 11 + integer, parameter :: k_p_be7__b8 = 12 + integer, parameter :: k_p_c12__n13 = 13 + integer, parameter :: k_he4_c12__o16 = 14 + integer, parameter :: k_p_c13__n14 = 15 + integer, parameter :: k_p_n13__o14 = 16 + integer, parameter :: k_p_n14__o15 = 17 + integer, parameter :: k_he4_n14__f18 = 18 + integer, parameter :: k_p_n15__o16 = 19 + integer, parameter :: k_p_o16__f17 = 20 + integer, parameter :: k_p_o17__f18 = 21 + integer, parameter :: k_d_he3__p_he4 = 22 + integer, parameter :: k_he4_n13__p_o16 = 23 + integer, parameter :: k_p_n15__he4_c12 = 24 + integer, parameter :: k_he4_o14__p_f17 = 25 + integer, parameter :: k_p_o17__he4_n14 = 26 + integer, parameter :: k_p_f18__he4_o15 = 27 + integer, parameter :: k_he3_he3__p_p_he4 = 28 + integer, parameter :: k_d_be7__p_he4_he4 = 29 + integer, parameter :: k_he3_be7__p_p_he4_he4 = 30 + integer, parameter :: k_he4_he4_he4__c12 = 31 + + real(rt), allocatable, save :: bion(:), mion(:) + +#ifdef REACT_SPARSE_JACOBIAN + ! Shape of Jacobian in Compressed Sparse Row format + integer, parameter :: NETWORK_SPARSE_JAC_NNZ = 145 + integer, allocatable :: csr_jac_col_index(:), csr_jac_row_count(:) +#endif + +contains + + subroutine actual_network_init() + + implicit none + + integer :: i + + call network_properties_init() + + ! Allocate ion info arrays + allocate(bion(nspec)) + allocate(mion(nspec)) + + ebind_per_nucleon(jp) = 0.00000000000000e+00_rt + ebind_per_nucleon(jd) = 1.11228300000000e+00_rt + ebind_per_nucleon(jhe3) = 2.57268000000000e+00_rt + ebind_per_nucleon(jhe4) = 7.07391500000000e+00_rt + ebind_per_nucleon(jbe7) = 5.37154800000000e+00_rt + ebind_per_nucleon(jb8) = 4.71715500000000e+00_rt + ebind_per_nucleon(jc12) = 7.68014400000000e+00_rt + ebind_per_nucleon(jc13) = 7.46984900000000e+00_rt + ebind_per_nucleon(jn13) = 7.23886300000000e+00_rt + ebind_per_nucleon(jn14) = 7.47561400000000e+00_rt + ebind_per_nucleon(jn15) = 7.69946000000000e+00_rt + ebind_per_nucleon(jo14) = 7.05227800000000e+00_rt + ebind_per_nucleon(jo15) = 7.46369200000000e+00_rt + ebind_per_nucleon(jo16) = 7.97620600000000e+00_rt + ebind_per_nucleon(jo17) = 7.75072800000000e+00_rt + ebind_per_nucleon(jf17) = 7.54232800000000e+00_rt + ebind_per_nucleon(jf18) = 7.63163800000000e+00_rt + + do i = 1, nspec + bion(i) = ebind_per_nucleon(i) * aion(i) * ERG_PER_MeV + end do + + ! Set the mass + mion(:) = nion(:) * mass_neutron + zion(:) * (mass_proton + mass_electron) & + - bion(:)/(c_light**2) + + +#ifdef REACT_SPARSE_JACOBIAN + ! Set CSR format metadata for Jacobian + allocate(csr_jac_col_index(NETWORK_SPARSE_JAC_NNZ)) + allocate(csr_jac_row_count(nspec_evolve + 3)) ! neq + 1 + + csr_jac_col_index = [ & + 1, & + 2, & + 3, & + 4, & + 5, & + 7, & + 8, & + 9, & + 10, & + 11, & + 12, & + 14, & + 15, & + 17, & + 18, & + 1, & + 2, & + 3, & + 5, & + 18, & + 1, & + 2, & + 3, & + 4, & + 5, & + 18, & + 1, & + 2, & + 3, & + 4, & + 5, & + 6, & + 7, & + 9, & + 10, & + 11, & + 12, & + 15, & + 17, & + 18, & + 1, & + 2, & + 3, & + 4, & + 5, & + 18, & + 1, & + 5, & + 6, & + 18, & + 1, & + 4, & + 7, & + 11, & + 18, & + 1, & + 8, & + 9, & + 18, & + 1, & + 4, & + 7, & + 9, & + 18, & + 1, & + 4, & + 8, & + 10, & + 12, & + 15, & + 18, & + 1, & + 11, & + 13, & + 18, & + 1, & + 4, & + 9, & + 12, & + 18, & + 1, & + 10, & + 13, & + 17, & + 18, & + 1, & + 4, & + 7, & + 9, & + 11, & + 14, & + 18, & + 1, & + 15, & + 16, & + 18, & + 1, & + 4, & + 12, & + 14, & + 16, & + 18, & + 1, & + 4, & + 10, & + 15, & + 17, & + 18, & + 1, & + 2, & + 3, & + 4, & + 5, & + 6, & + 7, & + 8, & + 9, & + 10, & + 11, & + 12, & + 13, & + 14, & + 15, & + 16, & + 17, & + 18, & + 1, & + 2, & + 3, & + 4, & + 5, & + 6, & + 7, & + 8, & + 9, & + 10, & + 11, & + 12, & + 13, & + 14, & + 15, & + 16, & + 17, & + 18, & + 19 ] + + csr_jac_row_count = [ & + 1, & + 16, & + 21, & + 27, & + 41, & + 47, & + 51, & + 56, & + 60, & + 65, & + 72, & + 76, & + 81, & + 86, & + 93, & + 97, & + 103, & + 109, & + 127, & + 146 ] +#endif + + end subroutine actual_network_init + + + subroutine actual_network_finalize() + ! Deallocate storage arrays + + if (allocated(bion)) then + deallocate(bion) + endif + + if (allocated(mion)) then + deallocate(mion) + endif + +#ifdef REACT_SPARSE_JACOBIAN + if (allocated(csr_jac_col_index)) then + deallocate(csr_jac_col_index) + endif + + if (allocated(csr_jac_row_count)) then + deallocate(csr_jac_row_count) + endif +#endif + + end subroutine actual_network_finalize + + + subroutine ener_gener_rate(dydt, enuc) + ! Computes the instantaneous energy generation rate + + implicit none + + real(rt) :: dydt(nspec), enuc + + ! This is basically e = m c**2 + + enuc = sum(dydt(:) * mion(:)) * enuc_conv2 + + end subroutine ener_gener_rate + +end module actual_network diff --git a/networks/nova2/actual_rhs.F90 b/networks/nova2/actual_rhs.F90 new file mode 100644 index 0000000000..82b7e84858 --- /dev/null +++ b/networks/nova2/actual_rhs.F90 @@ -0,0 +1,1050 @@ +module actual_rhs_module + + use amrex_fort_module, only: rt => amrex_real + use amrex_constants_module + use physical_constants, only: N_AVO + use network + use table_rates + use reaclib_rates + use burn_type_module + + implicit none + + ! Indices into rate groups in the rate_eval_t type + integer, parameter :: i_rate = 1 + integer, parameter :: i_drate_dt = 2 + integer, parameter :: i_scor = 3 + integer, parameter :: i_dscor_dt = 4 + + type :: rate_eval_t + real(rt) :: unscreened_rates(num_rate_groups, nrates) + real(rt) :: screened_rates(nrates) + real(rt) :: add_energy_rate(nrat_tabular) + end type rate_eval_t + +contains + + subroutine actual_rhs_init() + + call init_reaclib() + call init_tabular() + call net_screening_init() + + end subroutine actual_rhs_init + + + subroutine update_unevolved_species(state) + ! STUB FOR INTEGRATOR + type(burn_t) :: state + + return + end subroutine update_unevolved_species + + + subroutine zero_rate_eval(rate_eval) + + implicit none + + type(rate_eval_t), intent(inout) :: rate_eval + + rate_eval % unscreened_rates(i_rate, :) = ZERO + rate_eval % unscreened_rates(i_drate_dt, :) = ZERO + rate_eval % unscreened_rates(i_scor, :) = ONE + rate_eval % unscreened_rates(i_dscor_dt, :) = ZERO + rate_eval % screened_rates = ZERO + rate_eval % add_energy_rate = ZERO + + end subroutine zero_rate_eval + + + subroutine evaluate_rates(state, rate_eval) + + use reaclib_rates, only: screen_reaclib, reaclib_evaluate + use screening_module, only: screen5, plasma_state, fill_plasma_state + + implicit none + + type(burn_t) :: state + type(rate_eval_t), intent(out) :: rate_eval + type(plasma_state) :: pstate + real(rt) :: Y(nspec) + integer :: i, j + real(rt) :: rhoy + real(rt) :: rate, drate_dt, edot_nu + real(rt) :: scor, dscor_dt, dscor_dd + real(rt) :: scor2, dscor2_dt, dscor2_dd + + Y(:) = state % xn(:) * aion_inv(:) + rhoy = state % rho * state % y_e + + ! Zero out the rates + call zero_rate_eval(rate_eval) + + ! Calculate Reaclib rates + call fill_plasma_state(pstate, state % T, state % rho, Y) + do i = 1, nrat_reaclib + call reaclib_evaluate(pstate, state % T, i, rate, drate_dt) + rate_eval % unscreened_rates(i_rate, i) = rate + rate_eval % unscreened_rates(i_drate_dt, i) = drate_dt + end do + + ! Evaluate screening factors + if (screen_reaclib) then + + call screen5(pstate, 1, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,6) = scor + rate_eval % unscreened_rates(i_dscor_dt,6) = dscor_dt + rate_eval % unscreened_rates(i_scor,7) = scor + rate_eval % unscreened_rates(i_dscor_dt,7) = dscor_dt + + + call screen5(pstate, 2, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,8) = scor + rate_eval % unscreened_rates(i_dscor_dt,8) = dscor_dt + + + call screen5(pstate, 3, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,9) = scor + rate_eval % unscreened_rates(i_dscor_dt,9) = dscor_dt + + + call screen5(pstate, 4, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,10) = scor + rate_eval % unscreened_rates(i_dscor_dt,10) = dscor_dt + + + call screen5(pstate, 5, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,11) = scor + rate_eval % unscreened_rates(i_dscor_dt,11) = dscor_dt + + + call screen5(pstate, 6, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,12) = scor + rate_eval % unscreened_rates(i_dscor_dt,12) = dscor_dt + + + call screen5(pstate, 7, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,13) = scor + rate_eval % unscreened_rates(i_dscor_dt,13) = dscor_dt + + + call screen5(pstate, 8, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,14) = scor + rate_eval % unscreened_rates(i_dscor_dt,14) = dscor_dt + + + call screen5(pstate, 9, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,15) = scor + rate_eval % unscreened_rates(i_dscor_dt,15) = dscor_dt + + + call screen5(pstate, 10, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,16) = scor + rate_eval % unscreened_rates(i_dscor_dt,16) = dscor_dt + + + call screen5(pstate, 11, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,17) = scor + rate_eval % unscreened_rates(i_dscor_dt,17) = dscor_dt + + + call screen5(pstate, 12, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,18) = scor + rate_eval % unscreened_rates(i_dscor_dt,18) = dscor_dt + + + call screen5(pstate, 13, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,19) = scor + rate_eval % unscreened_rates(i_dscor_dt,19) = dscor_dt + rate_eval % unscreened_rates(i_scor,24) = scor + rate_eval % unscreened_rates(i_dscor_dt,24) = dscor_dt + + + call screen5(pstate, 14, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,20) = scor + rate_eval % unscreened_rates(i_dscor_dt,20) = dscor_dt + + + call screen5(pstate, 15, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,21) = scor + rate_eval % unscreened_rates(i_dscor_dt,21) = dscor_dt + rate_eval % unscreened_rates(i_scor,26) = scor + rate_eval % unscreened_rates(i_dscor_dt,26) = dscor_dt + + + call screen5(pstate, 16, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,22) = scor + rate_eval % unscreened_rates(i_dscor_dt,22) = dscor_dt + + + call screen5(pstate, 17, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,23) = scor + rate_eval % unscreened_rates(i_dscor_dt,23) = dscor_dt + + + call screen5(pstate, 18, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,25) = scor + rate_eval % unscreened_rates(i_dscor_dt,25) = dscor_dt + + + call screen5(pstate, 19, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,27) = scor + rate_eval % unscreened_rates(i_dscor_dt,27) = dscor_dt + + + call screen5(pstate, 20, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,28) = scor + rate_eval % unscreened_rates(i_dscor_dt,28) = dscor_dt + + + call screen5(pstate, 21, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,29) = scor + rate_eval % unscreened_rates(i_dscor_dt,29) = dscor_dt + + + call screen5(pstate, 22, scor, dscor_dt, dscor_dd) + rate_eval % unscreened_rates(i_scor,30) = scor + rate_eval % unscreened_rates(i_dscor_dt,30) = dscor_dt + + + call screen5(pstate, 23, scor, dscor_dt, dscor_dd) + + call screen5(pstate, 24, scor2, dscor2_dt, dscor2_dd) + rate_eval % unscreened_rates(i_scor,31) = scor * scor2 + rate_eval % unscreened_rates(i_dscor_dt,31) = scor * dscor2_dt + dscor_dt * scor2 + + end if + + + ! Compute screened rates + rate_eval % screened_rates = rate_eval % unscreened_rates(i_rate, :) * & + rate_eval % unscreened_rates(i_scor, :) + + end subroutine evaluate_rates + + + subroutine actual_rhs(state, ydot) + + use extern_probin_module, only: do_constant_volume_burn, disable_thermal_neutrinos + use burn_type_module, only: net_itemp, net_ienuc, neqs + use sneut_module, only: sneut5 + use temperature_integration_module, only: temperature_rhs + + implicit none + + type(burn_t), intent(in) :: state + real(rt), intent(inout) :: ydot(neqs) + + type(rate_eval_t) :: rate_eval + real(rt) :: Y(nspec), ydot_nuc(nspec) + integer :: i, j + real(rt) :: rhoy, ye, enuc + real(rt) :: sneut, dsneutdt, dsneutdd, snuda, snudz + + ! Set molar abundances + Y(:) = state % xn(:) * aion_inv(:) + + call evaluate_rates(state, rate_eval) + + call rhs_nuc(state, ydot_nuc, Y, rate_eval % screened_rates) + ydot(1:nspec) = ydot_nuc + + ! ion binding energy contributions + call ener_gener_rate(ydot_nuc, enuc) + + ! include reaction neutrino losses (non-thermal) + + ! Get the thermal neutrino losses + if (.not. disable_thermal_neutrinos) then + call sneut5(state % T, state % rho, state % abar, state % zbar, sneut, dsneutdt, dsneutdd, snuda, snudz) + else + sneut = ZERO + end if + + ! Append the energy equation (this is erg/g/s) + ydot(net_ienuc) = enuc - sneut + + ! Append the temperature equation + call temperature_rhs(state, ydot) + + end subroutine actual_rhs + + + subroutine rhs_nuc(state, ydot_nuc, Y, screened_rates) + + implicit none + + type (burn_t), intent(in) :: state + real(rt), intent(out) :: ydot_nuc(nspec) + real(rt), intent(in) :: Y(nspec) + real(rt), intent(in) :: screened_rates(nrates) + + + + ydot_nuc(jp) = ( & + screened_rates(k_d_be7__p_he4_he4)*Y(jbe7)*Y(jd)*state % rho + & + screened_rates(k_d_he3__p_he4)*Y(jd)*Y(jhe3)*state % rho + 2.0e0_rt* & + screened_rates(k_he3_be7__p_p_he4_he4)*Y(jbe7)*Y(jhe3)*state % rho + & + screened_rates(k_he3_he3__p_p_he4)*Y(jhe3)**2*state % rho + & + screened_rates(k_he4_n13__p_o16)*Y(jhe4)*Y(jn13)*state % rho + & + screened_rates(k_he4_o14__p_f17)*Y(jhe4)*Y(jo14)*state % rho - & + screened_rates(k_p_be7__b8)*Y(jbe7)*Y(jp)*state % rho - & + screened_rates(k_p_c12__n13)*Y(jc12)*Y(jp)*state % rho - & + screened_rates(k_p_c13__n14)*Y(jc13)*Y(jp)*state % rho - & + screened_rates(k_p_d__he3)*Y(jd)*Y(jp)*state % rho - & + screened_rates(k_p_f18__he4_o15)*Y(jf18)*Y(jp)*state % rho - & + screened_rates(k_p_he3__he4__weak__bet_pos_)*Y(jhe3)*Y(jp)*state % rho - & + screened_rates(k_p_n13__o14)*Y(jn13)*Y(jp)*state % rho - & + screened_rates(k_p_n14__o15)*Y(jn14)*Y(jp)*state % rho - & + screened_rates(k_p_n15__he4_c12)*Y(jn15)*Y(jp)*state % rho - & + screened_rates(k_p_n15__o16)*Y(jn15)*Y(jp)*state % rho - & + screened_rates(k_p_o16__f17)*Y(jo16)*Y(jp)*state % rho - & + screened_rates(k_p_o17__f18)*Y(jo17)*Y(jp)*state % rho - & + screened_rates(k_p_o17__he4_n14)*Y(jo17)*Y(jp)*state % rho - & + screened_rates(k_p_p__d__weak__bet_pos_)*Y(jp)**2*state % rho - & + screened_rates(k_p_p__d__weak__electron_capture)*Y(jp)**2*state % rho**2* & + state % y_e & + ) + + ydot_nuc(jd) = ( & + -screened_rates(k_d_be7__p_he4_he4)*Y(jbe7)*Y(jd)*state % rho - & + screened_rates(k_d_d__he4)*Y(jd)**2*state % rho - screened_rates(k_d_he3__p_he4)* & + Y(jd)*Y(jhe3)*state % rho - screened_rates(k_p_d__he3)*Y(jd)*Y(jp)* & + state % rho + 0.5e0_rt*screened_rates(k_p_p__d__weak__bet_pos_)*Y(jp)**2* & + state % rho + 0.5e0_rt*screened_rates(k_p_p__d__weak__electron_capture)*Y(jp) & + **2*state % rho**2*state % y_e & + ) + + ydot_nuc(jhe3) = ( & + -screened_rates(k_d_he3__p_he4)*Y(jd)*Y(jhe3)*state % rho - & + screened_rates(k_he3_be7__p_p_he4_he4)*Y(jbe7)*Y(jhe3)*state % rho - & + screened_rates(k_he3_he3__p_p_he4)*Y(jhe3)**2*state % rho - & + screened_rates(k_he4_he3__be7)*Y(jhe3)*Y(jhe4)*state % rho + & + screened_rates(k_p_d__he3)*Y(jd)*Y(jp)*state % rho - & + screened_rates(k_p_he3__he4__weak__bet_pos_)*Y(jhe3)*Y(jp)*state % rho & + ) + + ydot_nuc(jhe4) = ( & + 2.0e0_rt*screened_rates(k_b8__he4_he4__weak__wc12)*Y(jb8) + 2.0e0_rt* & + screened_rates(k_d_be7__p_he4_he4)*Y(jbe7)*Y(jd)*state % rho + 0.5e0_rt* & + screened_rates(k_d_d__he4)*Y(jd)**2*state % rho + screened_rates(k_d_he3__p_he4)* & + Y(jd)*Y(jhe3)*state % rho + 2.0e0_rt*screened_rates(k_he3_be7__p_p_he4_he4)* & + Y(jbe7)*Y(jhe3)*state % rho + 0.5e0_rt*screened_rates(k_he3_he3__p_p_he4)* & + Y(jhe3)**2*state % rho - screened_rates(k_he4_c12__o16)*Y(jc12)*Y(jhe4) & + *state % rho - screened_rates(k_he4_he3__be7)*Y(jhe3)*Y(jhe4)*state % rho - & + 0.5e0_rt*screened_rates(k_he4_he4_he4__c12)*Y(jhe4)**3*state % rho**2 - & + screened_rates(k_he4_n13__p_o16)*Y(jhe4)*Y(jn13)*state % rho - & + screened_rates(k_he4_n14__f18)*Y(jhe4)*Y(jn14)*state % rho - & + screened_rates(k_he4_o14__p_f17)*Y(jhe4)*Y(jo14)*state % rho + & + screened_rates(k_p_f18__he4_o15)*Y(jf18)*Y(jp)*state % rho + & + screened_rates(k_p_he3__he4__weak__bet_pos_)*Y(jhe3)*Y(jp)*state % rho + & + screened_rates(k_p_n15__he4_c12)*Y(jn15)*Y(jp)*state % rho + & + screened_rates(k_p_o17__he4_n14)*Y(jo17)*Y(jp)*state % rho & + ) + + ydot_nuc(jbe7) = ( & + -screened_rates(k_d_be7__p_he4_he4)*Y(jbe7)*Y(jd)*state % rho - & + screened_rates(k_he3_be7__p_p_he4_he4)*Y(jbe7)*Y(jhe3)*state % rho + & + screened_rates(k_he4_he3__be7)*Y(jhe3)*Y(jhe4)*state % rho - & + screened_rates(k_p_be7__b8)*Y(jbe7)*Y(jp)*state % rho & + ) + + ydot_nuc(jb8) = ( & + -screened_rates(k_b8__he4_he4__weak__wc12)*Y(jb8) + screened_rates(k_p_be7__b8)* & + Y(jbe7)*Y(jp)*state % rho & + ) + + ydot_nuc(jc12) = ( & + -screened_rates(k_he4_c12__o16)*Y(jc12)*Y(jhe4)*state % rho + & + 0.16666666666666667e0_rt*screened_rates(k_he4_he4_he4__c12)*Y(jhe4)**3* & + state % rho**2 - screened_rates(k_p_c12__n13)*Y(jc12)*Y(jp)*state % rho + & + screened_rates(k_p_n15__he4_c12)*Y(jn15)*Y(jp)*state % rho & + ) + + ydot_nuc(jc13) = ( & + screened_rates(k_n13__c13__weak__wc12)*Y(jn13) - screened_rates(k_p_c13__n14)*Y(jc13)* & + Y(jp)*state % rho & + ) + + ydot_nuc(jn13) = ( & + -screened_rates(k_he4_n13__p_o16)*Y(jhe4)*Y(jn13)*state % rho - & + screened_rates(k_n13__c13__weak__wc12)*Y(jn13) + screened_rates(k_p_c12__n13)* & + Y(jc12)*Y(jp)*state % rho - screened_rates(k_p_n13__o14)*Y(jn13)* & + Y(jp)*state % rho & + ) + + ydot_nuc(jn14) = ( & + -screened_rates(k_he4_n14__f18)*Y(jhe4)*Y(jn14)*state % rho + & + screened_rates(k_o14__n14__weak__wc12)*Y(jo14) + screened_rates(k_p_c13__n14)* & + Y(jc13)*Y(jp)*state % rho - screened_rates(k_p_n14__o15)*Y(jn14)* & + Y(jp)*state % rho + screened_rates(k_p_o17__he4_n14)*Y(jo17)*Y(jp)* & + state % rho & + ) + + ydot_nuc(jn15) = ( & + screened_rates(k_o15__n15__weak__wc12)*Y(jo15) - screened_rates(k_p_n15__he4_c12)* & + Y(jn15)*Y(jp)*state % rho - screened_rates(k_p_n15__o16)*Y(jn15)* & + Y(jp)*state % rho & + ) + + ydot_nuc(jo14) = ( & + -screened_rates(k_he4_o14__p_f17)*Y(jhe4)*Y(jo14)*state % rho - & + screened_rates(k_o14__n14__weak__wc12)*Y(jo14) + screened_rates(k_p_n13__o14)* & + Y(jn13)*Y(jp)*state % rho & + ) + + ydot_nuc(jo15) = ( & + -screened_rates(k_o15__n15__weak__wc12)*Y(jo15) + screened_rates(k_p_f18__he4_o15)* & + Y(jf18)*Y(jp)*state % rho + screened_rates(k_p_n14__o15)*Y(jn14)* & + Y(jp)*state % rho & + ) + + ydot_nuc(jo16) = ( & + screened_rates(k_he4_c12__o16)*Y(jc12)*Y(jhe4)*state % rho + & + screened_rates(k_he4_n13__p_o16)*Y(jhe4)*Y(jn13)*state % rho + & + screened_rates(k_p_n15__o16)*Y(jn15)*Y(jp)*state % rho - & + screened_rates(k_p_o16__f17)*Y(jo16)*Y(jp)*state % rho & + ) + + ydot_nuc(jo17) = ( & + screened_rates(k_f17__o17__weak__wc12)*Y(jf17) - screened_rates(k_p_o17__f18)*Y(jo17)* & + Y(jp)*state % rho - screened_rates(k_p_o17__he4_n14)*Y(jo17)*Y(jp)* & + state % rho & + ) + + ydot_nuc(jf17) = ( & + -screened_rates(k_f17__o17__weak__wc12)*Y(jf17) + screened_rates(k_he4_o14__p_f17)* & + Y(jhe4)*Y(jo14)*state % rho + screened_rates(k_p_o16__f17)*Y(jo16)* & + Y(jp)*state % rho & + ) + + ydot_nuc(jf18) = ( & + screened_rates(k_he4_n14__f18)*Y(jhe4)*Y(jn14)*state % rho - & + screened_rates(k_p_f18__he4_o15)*Y(jf18)*Y(jp)*state % rho + & + screened_rates(k_p_o17__f18)*Y(jo17)*Y(jp)*state % rho & + ) + + + end subroutine rhs_nuc + + + subroutine actual_jac(state, jac) + + use burn_type_module, only: net_itemp, net_ienuc, neqs, njrows, njcols + use extern_probin_module, only: disable_thermal_neutrinos + use sneut_module, only: sneut5 + use temperature_integration_module, only: temperature_jac + use jacobian_sparsity_module, only: get_jac_entry, set_jac_entry, set_jac_zero + + implicit none + + type(burn_t), intent(in) :: state + real(rt), intent(inout) :: jac(njrows, njcols) + + type(rate_eval_t) :: rate_eval + real(rt) :: screened_rates_dt(nrates) + real(rt) :: Y(nspec), yderivs(nspec) + real(rt) :: ye, rhoy, b1, scratch + real(rt) :: sneut, dsneutdt, dsneutdd, snuda, snudz + integer :: j, k + + ! Set molar abundances + Y(:) = state % xn(:) * aion_inv(:) + + call evaluate_rates(state, rate_eval) + + ! Zero out the Jacobian + call set_jac_zero(jac) + + ! Species Jacobian elements with respect to other species + call jac_nuc(state, jac, Y, rate_eval % screened_rates) + + ! Evaluate the species Jacobian elements with respect to temperature by + ! calling the RHS using the temperature derivative of the screened rate + screened_rates_dt = rate_eval % unscreened_rates(i_rate, :) * & + rate_eval % unscreened_rates(i_dscor_dt, :) + & + rate_eval % unscreened_rates(i_drate_dt, :) * & + rate_eval % unscreened_rates(i_scor, :) + + call rhs_nuc(state, yderivs, Y, screened_rates_dt) + + do k = 1, nspec + call set_jac_entry(jac, k, net_itemp, yderivs(k)) + enddo + + ! Energy generation rate Jacobian elements with respect to species + do j = 1, nspec + do k = 1, nspec + call get_jac_entry(jac, k, j, yderivs(k)) + enddo + call ener_gener_rate(yderivs, scratch) + call set_jac_entry(jac, net_ienuc, j, scratch) + enddo + + ! Account for the thermal neutrino losses + if (.not. disable_thermal_neutrinos) then + call sneut5(state % T, state % rho, state % abar, state % zbar, sneut, dsneutdt, dsneutdd, snuda, snudz) + + do j = 1, nspec + b1 = (-state % abar * state % abar * snuda + (zion(j) - state % zbar) * state % abar * snudz) + call get_jac_entry(jac, net_ienuc, j, scratch) + scratch = scratch - b1 + call set_jac_entry(jac, net_ienuc, j, scratch) + enddo + endif + + ! Energy generation rate Jacobian element with respect to temperature + do k = 1, nspec + call get_jac_entry(jac, k, net_itemp, yderivs(k)) + enddo + call ener_gener_rate(yderivs, scratch) + if (.not. disable_thermal_neutrinos) then + scratch = scratch - dsneutdt + endif + call set_jac_entry(jac, net_ienuc, net_itemp, scratch) + + ! Temperature Jacobian elements + call temperature_jac(state, jac) + + end subroutine actual_jac + + + subroutine jac_nuc(state, jac, Y, screened_rates) + + use jacobian_sparsity_module, only: set_jac_entry + + implicit none + + type(burn_t), intent(in) :: state + real(rt), intent(inout) :: jac(njrows, njcols) + + real(rt), intent(in) :: Y(nspec) + real(rt), intent(in) :: screened_rates(nrates) + real(rt) :: scratch + + + + scratch = (& + -screened_rates(k_p_be7__b8)*Y(jbe7)*state % rho - screened_rates(k_p_c12__n13)*Y(jc12)* & + state % rho - screened_rates(k_p_c13__n14)*Y(jc13)*state % rho - & + screened_rates(k_p_d__he3)*Y(jd)*state % rho - screened_rates(k_p_f18__he4_o15)* & + Y(jf18)*state % rho - screened_rates(k_p_he3__he4__weak__bet_pos_)* & + Y(jhe3)*state % rho - screened_rates(k_p_n13__o14)*Y(jn13)*state % rho - & + screened_rates(k_p_n14__o15)*Y(jn14)*state % rho - screened_rates(k_p_n15__he4_c12)* & + Y(jn15)*state % rho - screened_rates(k_p_n15__o16)*Y(jn15)*state % rho - & + screened_rates(k_p_o16__f17)*Y(jo16)*state % rho - screened_rates(k_p_o17__f18)* & + Y(jo17)*state % rho - screened_rates(k_p_o17__he4_n14)*Y(jo17)*state % rho - & + 2.0e0_rt*screened_rates(k_p_p__d__weak__bet_pos_)*Y(jp)*state % rho - 2.0e0_rt* & + screened_rates(k_p_p__d__weak__electron_capture)*Y(jp)*state % rho**2* & + state % y_e & + ) + call set_jac_entry(jac, jp, jp, scratch) + + scratch = (& + screened_rates(k_d_be7__p_he4_he4)*Y(jbe7)*state % rho + screened_rates(k_d_he3__p_he4)* & + Y(jhe3)*state % rho - screened_rates(k_p_d__he3)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jp, jd, scratch) + + scratch = (& + screened_rates(k_d_he3__p_he4)*Y(jd)*state % rho + 2.0e0_rt* & + screened_rates(k_he3_be7__p_p_he4_he4)*Y(jbe7)*state % rho + 2.0e0_rt* & + screened_rates(k_he3_he3__p_p_he4)*Y(jhe3)*state % rho - & + screened_rates(k_p_he3__he4__weak__bet_pos_)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jp, jhe3, scratch) + + scratch = (& + screened_rates(k_he4_n13__p_o16)*Y(jn13)*state % rho + screened_rates(k_he4_o14__p_f17)* & + Y(jo14)*state % rho & + ) + call set_jac_entry(jac, jp, jhe4, scratch) + + scratch = (& + screened_rates(k_d_be7__p_he4_he4)*Y(jd)*state % rho + 2.0e0_rt* & + screened_rates(k_he3_be7__p_p_he4_he4)*Y(jhe3)*state % rho - & + screened_rates(k_p_be7__b8)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jp, jbe7, scratch) + + scratch = (& + -screened_rates(k_p_c12__n13)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jp, jc12, scratch) + + scratch = (& + -screened_rates(k_p_c13__n14)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jp, jc13, scratch) + + scratch = (& + screened_rates(k_he4_n13__p_o16)*Y(jhe4)*state % rho - screened_rates(k_p_n13__o14)*Y(jp) & + *state % rho & + ) + call set_jac_entry(jac, jp, jn13, scratch) + + scratch = (& + -screened_rates(k_p_n14__o15)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jp, jn14, scratch) + + scratch = (& + -screened_rates(k_p_n15__he4_c12)*Y(jp)*state % rho - screened_rates(k_p_n15__o16)*Y(jp)* & + state % rho & + ) + call set_jac_entry(jac, jp, jn15, scratch) + + scratch = (& + screened_rates(k_he4_o14__p_f17)*Y(jhe4)*state % rho & + ) + call set_jac_entry(jac, jp, jo14, scratch) + + scratch = (& + -screened_rates(k_p_o16__f17)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jp, jo16, scratch) + + scratch = (& + -screened_rates(k_p_o17__f18)*Y(jp)*state % rho - screened_rates(k_p_o17__he4_n14)*Y(jp)* & + state % rho & + ) + call set_jac_entry(jac, jp, jo17, scratch) + + scratch = (& + -screened_rates(k_p_f18__he4_o15)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jp, jf18, scratch) + + scratch = (& + -screened_rates(k_p_d__he3)*Y(jd)*state % rho + 1.0e0_rt* & + screened_rates(k_p_p__d__weak__bet_pos_)*Y(jp)*state % rho + 1.0e0_rt* & + screened_rates(k_p_p__d__weak__electron_capture)*Y(jp)*state % rho**2* & + state % y_e & + ) + call set_jac_entry(jac, jd, jp, scratch) + + scratch = (& + -screened_rates(k_d_be7__p_he4_he4)*Y(jbe7)*state % rho - 2.0e0_rt*screened_rates(k_d_d__he4)* & + Y(jd)*state % rho - screened_rates(k_d_he3__p_he4)*Y(jhe3)*state % rho - & + screened_rates(k_p_d__he3)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jd, jd, scratch) + + scratch = (& + -screened_rates(k_d_he3__p_he4)*Y(jd)*state % rho & + ) + call set_jac_entry(jac, jd, jhe3, scratch) + + scratch = (& + -screened_rates(k_d_be7__p_he4_he4)*Y(jd)*state % rho & + ) + call set_jac_entry(jac, jd, jbe7, scratch) + + scratch = (& + screened_rates(k_p_d__he3)*Y(jd)*state % rho - screened_rates(k_p_he3__he4__weak__bet_pos_) & + *Y(jhe3)*state % rho & + ) + call set_jac_entry(jac, jhe3, jp, scratch) + + scratch = (& + -screened_rates(k_d_he3__p_he4)*Y(jhe3)*state % rho + screened_rates(k_p_d__he3)*Y(jp)* & + state % rho & + ) + call set_jac_entry(jac, jhe3, jd, scratch) + + scratch = (& + -screened_rates(k_d_he3__p_he4)*Y(jd)*state % rho - screened_rates(k_he3_be7__p_p_he4_he4)* & + Y(jbe7)*state % rho - 2.0e0_rt*screened_rates(k_he3_he3__p_p_he4)*Y(jhe3)* & + state % rho - screened_rates(k_he4_he3__be7)*Y(jhe4)*state % rho - & + screened_rates(k_p_he3__he4__weak__bet_pos_)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jhe3, jhe3, scratch) + + scratch = (& + -screened_rates(k_he4_he3__be7)*Y(jhe3)*state % rho & + ) + call set_jac_entry(jac, jhe3, jhe4, scratch) + + scratch = (& + -screened_rates(k_he3_be7__p_p_he4_he4)*Y(jhe3)*state % rho & + ) + call set_jac_entry(jac, jhe3, jbe7, scratch) + + scratch = (& + screened_rates(k_p_f18__he4_o15)*Y(jf18)*state % rho + & + screened_rates(k_p_he3__he4__weak__bet_pos_)*Y(jhe3)*state % rho + & + screened_rates(k_p_n15__he4_c12)*Y(jn15)*state % rho + & + screened_rates(k_p_o17__he4_n14)*Y(jo17)*state % rho & + ) + call set_jac_entry(jac, jhe4, jp, scratch) + + scratch = (& + 2.0e0_rt*screened_rates(k_d_be7__p_he4_he4)*Y(jbe7)*state % rho + 1.0e0_rt* & + screened_rates(k_d_d__he4)*Y(jd)*state % rho + screened_rates(k_d_he3__p_he4)* & + Y(jhe3)*state % rho & + ) + call set_jac_entry(jac, jhe4, jd, scratch) + + scratch = (& + screened_rates(k_d_he3__p_he4)*Y(jd)*state % rho + 2.0e0_rt* & + screened_rates(k_he3_be7__p_p_he4_he4)*Y(jbe7)*state % rho + 1.0e0_rt* & + screened_rates(k_he3_he3__p_p_he4)*Y(jhe3)*state % rho - & + screened_rates(k_he4_he3__be7)*Y(jhe4)*state % rho + & + screened_rates(k_p_he3__he4__weak__bet_pos_)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jhe4, jhe3, scratch) + + scratch = (& + -screened_rates(k_he4_c12__o16)*Y(jc12)*state % rho - screened_rates(k_he4_he3__be7)* & + Y(jhe3)*state % rho - 1.5e0_rt*screened_rates(k_he4_he4_he4__c12)*Y(jhe4)**2 & + *state % rho**2 - screened_rates(k_he4_n13__p_o16)*Y(jn13)*state % rho - & + screened_rates(k_he4_n14__f18)*Y(jn14)*state % rho - & + screened_rates(k_he4_o14__p_f17)*Y(jo14)*state % rho & + ) + call set_jac_entry(jac, jhe4, jhe4, scratch) + + scratch = (& + 2.0e0_rt*screened_rates(k_d_be7__p_he4_he4)*Y(jd)*state % rho + 2.0e0_rt* & + screened_rates(k_he3_be7__p_p_he4_he4)*Y(jhe3)*state % rho & + ) + call set_jac_entry(jac, jhe4, jbe7, scratch) + + scratch = (& + 2.0e0_rt*screened_rates(k_b8__he4_he4__weak__wc12) & + ) + call set_jac_entry(jac, jhe4, jb8, scratch) + + scratch = (& + -screened_rates(k_he4_c12__o16)*Y(jhe4)*state % rho & + ) + call set_jac_entry(jac, jhe4, jc12, scratch) + + scratch = (& + -screened_rates(k_he4_n13__p_o16)*Y(jhe4)*state % rho & + ) + call set_jac_entry(jac, jhe4, jn13, scratch) + + scratch = (& + -screened_rates(k_he4_n14__f18)*Y(jhe4)*state % rho & + ) + call set_jac_entry(jac, jhe4, jn14, scratch) + + scratch = (& + screened_rates(k_p_n15__he4_c12)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jhe4, jn15, scratch) + + scratch = (& + -screened_rates(k_he4_o14__p_f17)*Y(jhe4)*state % rho & + ) + call set_jac_entry(jac, jhe4, jo14, scratch) + + scratch = (& + screened_rates(k_p_o17__he4_n14)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jhe4, jo17, scratch) + + scratch = (& + screened_rates(k_p_f18__he4_o15)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jhe4, jf18, scratch) + + scratch = (& + -screened_rates(k_p_be7__b8)*Y(jbe7)*state % rho & + ) + call set_jac_entry(jac, jbe7, jp, scratch) + + scratch = (& + -screened_rates(k_d_be7__p_he4_he4)*Y(jbe7)*state % rho & + ) + call set_jac_entry(jac, jbe7, jd, scratch) + + scratch = (& + -screened_rates(k_he3_be7__p_p_he4_he4)*Y(jbe7)*state % rho + & + screened_rates(k_he4_he3__be7)*Y(jhe4)*state % rho & + ) + call set_jac_entry(jac, jbe7, jhe3, scratch) + + scratch = (& + screened_rates(k_he4_he3__be7)*Y(jhe3)*state % rho & + ) + call set_jac_entry(jac, jbe7, jhe4, scratch) + + scratch = (& + -screened_rates(k_d_be7__p_he4_he4)*Y(jd)*state % rho - & + screened_rates(k_he3_be7__p_p_he4_he4)*Y(jhe3)*state % rho - & + screened_rates(k_p_be7__b8)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jbe7, jbe7, scratch) + + scratch = (& + screened_rates(k_p_be7__b8)*Y(jbe7)*state % rho & + ) + call set_jac_entry(jac, jb8, jp, scratch) + + scratch = (& + screened_rates(k_p_be7__b8)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jb8, jbe7, scratch) + + scratch = (& + -screened_rates(k_b8__he4_he4__weak__wc12) & + ) + call set_jac_entry(jac, jb8, jb8, scratch) + + scratch = (& + -screened_rates(k_p_c12__n13)*Y(jc12)*state % rho + screened_rates(k_p_n15__he4_c12)* & + Y(jn15)*state % rho & + ) + call set_jac_entry(jac, jc12, jp, scratch) + + scratch = (& + -screened_rates(k_he4_c12__o16)*Y(jc12)*state % rho + 0.5e0_rt* & + screened_rates(k_he4_he4_he4__c12)*Y(jhe4)**2*state % rho**2 & + ) + call set_jac_entry(jac, jc12, jhe4, scratch) + + scratch = (& + -screened_rates(k_he4_c12__o16)*Y(jhe4)*state % rho - screened_rates(k_p_c12__n13)*Y(jp)* & + state % rho & + ) + call set_jac_entry(jac, jc12, jc12, scratch) + + scratch = (& + screened_rates(k_p_n15__he4_c12)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jc12, jn15, scratch) + + scratch = (& + -screened_rates(k_p_c13__n14)*Y(jc13)*state % rho & + ) + call set_jac_entry(jac, jc13, jp, scratch) + + scratch = (& + -screened_rates(k_p_c13__n14)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jc13, jc13, scratch) + + scratch = (& + screened_rates(k_n13__c13__weak__wc12) & + ) + call set_jac_entry(jac, jc13, jn13, scratch) + + scratch = (& + screened_rates(k_p_c12__n13)*Y(jc12)*state % rho - screened_rates(k_p_n13__o14)*Y(jn13)* & + state % rho & + ) + call set_jac_entry(jac, jn13, jp, scratch) + + scratch = (& + -screened_rates(k_he4_n13__p_o16)*Y(jn13)*state % rho & + ) + call set_jac_entry(jac, jn13, jhe4, scratch) + + scratch = (& + screened_rates(k_p_c12__n13)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jn13, jc12, scratch) + + scratch = (& + -screened_rates(k_he4_n13__p_o16)*Y(jhe4)*state % rho - & + screened_rates(k_n13__c13__weak__wc12) - screened_rates(k_p_n13__o14)*Y(jp)* & + state % rho & + ) + call set_jac_entry(jac, jn13, jn13, scratch) + + scratch = (& + screened_rates(k_p_c13__n14)*Y(jc13)*state % rho - screened_rates(k_p_n14__o15)*Y(jn14)* & + state % rho + screened_rates(k_p_o17__he4_n14)*Y(jo17)*state % rho & + ) + call set_jac_entry(jac, jn14, jp, scratch) + + scratch = (& + -screened_rates(k_he4_n14__f18)*Y(jn14)*state % rho & + ) + call set_jac_entry(jac, jn14, jhe4, scratch) + + scratch = (& + screened_rates(k_p_c13__n14)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jn14, jc13, scratch) + + scratch = (& + -screened_rates(k_he4_n14__f18)*Y(jhe4)*state % rho - screened_rates(k_p_n14__o15)*Y(jp)* & + state % rho & + ) + call set_jac_entry(jac, jn14, jn14, scratch) + + scratch = (& + screened_rates(k_o14__n14__weak__wc12) & + ) + call set_jac_entry(jac, jn14, jo14, scratch) + + scratch = (& + screened_rates(k_p_o17__he4_n14)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jn14, jo17, scratch) + + scratch = (& + -screened_rates(k_p_n15__he4_c12)*Y(jn15)*state % rho - screened_rates(k_p_n15__o16)* & + Y(jn15)*state % rho & + ) + call set_jac_entry(jac, jn15, jp, scratch) + + scratch = (& + -screened_rates(k_p_n15__he4_c12)*Y(jp)*state % rho - screened_rates(k_p_n15__o16)*Y(jp)* & + state % rho & + ) + call set_jac_entry(jac, jn15, jn15, scratch) + + scratch = (& + screened_rates(k_o15__n15__weak__wc12) & + ) + call set_jac_entry(jac, jn15, jo15, scratch) + + scratch = (& + screened_rates(k_p_n13__o14)*Y(jn13)*state % rho & + ) + call set_jac_entry(jac, jo14, jp, scratch) + + scratch = (& + -screened_rates(k_he4_o14__p_f17)*Y(jo14)*state % rho & + ) + call set_jac_entry(jac, jo14, jhe4, scratch) + + scratch = (& + screened_rates(k_p_n13__o14)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jo14, jn13, scratch) + + scratch = (& + -screened_rates(k_he4_o14__p_f17)*Y(jhe4)*state % rho - & + screened_rates(k_o14__n14__weak__wc12) & + ) + call set_jac_entry(jac, jo14, jo14, scratch) + + scratch = (& + screened_rates(k_p_f18__he4_o15)*Y(jf18)*state % rho + screened_rates(k_p_n14__o15)* & + Y(jn14)*state % rho & + ) + call set_jac_entry(jac, jo15, jp, scratch) + + scratch = (& + screened_rates(k_p_n14__o15)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jo15, jn14, scratch) + + scratch = (& + -screened_rates(k_o15__n15__weak__wc12) & + ) + call set_jac_entry(jac, jo15, jo15, scratch) + + scratch = (& + screened_rates(k_p_f18__he4_o15)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jo15, jf18, scratch) + + scratch = (& + screened_rates(k_p_n15__o16)*Y(jn15)*state % rho - screened_rates(k_p_o16__f17)*Y(jo16)* & + state % rho & + ) + call set_jac_entry(jac, jo16, jp, scratch) + + scratch = (& + screened_rates(k_he4_c12__o16)*Y(jc12)*state % rho + screened_rates(k_he4_n13__p_o16)* & + Y(jn13)*state % rho & + ) + call set_jac_entry(jac, jo16, jhe4, scratch) + + scratch = (& + screened_rates(k_he4_c12__o16)*Y(jhe4)*state % rho & + ) + call set_jac_entry(jac, jo16, jc12, scratch) + + scratch = (& + screened_rates(k_he4_n13__p_o16)*Y(jhe4)*state % rho & + ) + call set_jac_entry(jac, jo16, jn13, scratch) + + scratch = (& + screened_rates(k_p_n15__o16)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jo16, jn15, scratch) + + scratch = (& + -screened_rates(k_p_o16__f17)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jo16, jo16, scratch) + + scratch = (& + -screened_rates(k_p_o17__f18)*Y(jo17)*state % rho - screened_rates(k_p_o17__he4_n14)* & + Y(jo17)*state % rho & + ) + call set_jac_entry(jac, jo17, jp, scratch) + + scratch = (& + -screened_rates(k_p_o17__f18)*Y(jp)*state % rho - screened_rates(k_p_o17__he4_n14)*Y(jp)* & + state % rho & + ) + call set_jac_entry(jac, jo17, jo17, scratch) + + scratch = (& + screened_rates(k_f17__o17__weak__wc12) & + ) + call set_jac_entry(jac, jo17, jf17, scratch) + + scratch = (& + screened_rates(k_p_o16__f17)*Y(jo16)*state % rho & + ) + call set_jac_entry(jac, jf17, jp, scratch) + + scratch = (& + screened_rates(k_he4_o14__p_f17)*Y(jo14)*state % rho & + ) + call set_jac_entry(jac, jf17, jhe4, scratch) + + scratch = (& + screened_rates(k_he4_o14__p_f17)*Y(jhe4)*state % rho & + ) + call set_jac_entry(jac, jf17, jo14, scratch) + + scratch = (& + screened_rates(k_p_o16__f17)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jf17, jo16, scratch) + + scratch = (& + -screened_rates(k_f17__o17__weak__wc12) & + ) + call set_jac_entry(jac, jf17, jf17, scratch) + + scratch = (& + -screened_rates(k_p_f18__he4_o15)*Y(jf18)*state % rho + screened_rates(k_p_o17__f18)* & + Y(jo17)*state % rho & + ) + call set_jac_entry(jac, jf18, jp, scratch) + + scratch = (& + screened_rates(k_he4_n14__f18)*Y(jn14)*state % rho & + ) + call set_jac_entry(jac, jf18, jhe4, scratch) + + scratch = (& + screened_rates(k_he4_n14__f18)*Y(jhe4)*state % rho & + ) + call set_jac_entry(jac, jf18, jn14, scratch) + + scratch = (& + screened_rates(k_p_o17__f18)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jf18, jo17, scratch) + + scratch = (& + -screened_rates(k_p_f18__he4_o15)*Y(jp)*state % rho & + ) + call set_jac_entry(jac, jf18, jf18, scratch) + + + end subroutine jac_nuc + +end module actual_rhs_module diff --git a/networks/nova2/inputs.burn_cell.VODE b/networks/nova2/inputs.burn_cell.VODE new file mode 100644 index 0000000000..eb3c2e63cd --- /dev/null +++ b/networks/nova2/inputs.burn_cell.VODE @@ -0,0 +1,86 @@ +&PROBIN + + run_prefix = "react_pynucastro_" + + small_temp = 1d5 + small_dens = 1d5 + + burner_verbose = .false. + + ! Set which jacobian to use + ! 1 = analytic jacobian + ! 2 = numerical jacobian + jacobian = 1 + + renormalize_abundances = .true. + + rtol_spec = 1.0d-9 + rtol_enuc = 1.0d-6 + rtol_temp = 1.0d-6 + atol_spec = 1.0d-9 + atol_enuc = 1.0d-6 + atol_temp = 1.0d-6 + +/ + +&cellparams + + tmax = 1.0d0 + numsteps = 1000 + + density = 1.0d7 + temperature = 1.0d8 + + +! p initial mass fraction + massfractions(1) = 0.0d0 + +! d initial mass fraction + massfractions(2) = 0.0d0 + +! he3 initial mass fraction + massfractions(3) = 0.0d0 + +! he4 initial mass fraction + massfractions(4) = 0.0d0 + +! be7 initial mass fraction + massfractions(5) = 0.0d0 + +! b8 initial mass fraction + massfractions(6) = 0.0d0 + +! c12 initial mass fraction + massfractions(7) = 0.0d0 + +! c13 initial mass fraction + massfractions(8) = 0.0d0 + +! n13 initial mass fraction + massfractions(9) = 0.0d0 + +! n14 initial mass fraction + massfractions(10) = 0.0d0 + +! n15 initial mass fraction + massfractions(11) = 0.0d0 + +! o14 initial mass fraction + massfractions(12) = 0.0d0 + +! o15 initial mass fraction + massfractions(13) = 0.0d0 + +! o16 initial mass fraction + massfractions(14) = 0.0d0 + +! o17 initial mass fraction + massfractions(15) = 0.0d0 + +! f17 initial mass fraction + massfractions(16) = 0.0d0 + +! f18 initial mass fraction + massfractions(17) = 0.0d0 + +/ diff --git a/networks/nova2/nova.png b/networks/nova2/nova.png new file mode 100644 index 0000000000000000000000000000000000000000..6d25fc2754c4a40a057a97aff1be3c86c2161a20 GIT binary patch literal 56785 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 k|Oa2Dw2t8S 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 literal 0 HcmV?d00001 diff --git a/networks/nova2/nova2.py b/networks/nova2/nova2.py new file mode 100644 index 0000000000..c7b5ef7811 --- /dev/null +++ b/networks/nova2/nova2.py @@ -0,0 +1,24 @@ +import pynucastro as pyna +from pynucastro.networks import StarKillerNetwork + +library_file = "20180319default2" +mylibrary = pyna.rates.Library(library_file) + +all_nuclei = ["p", "h2", "he3", "he4", "be7", "b8", + "c12", "c13", "n13", "n14", "n15", + "o14", "o15", "o16", "o17", "f17", "f18"] + +nova_library = mylibrary.linking_nuclei(all_nuclei, with_reverse=False) + +print(nova_library) + +net = StarKillerNetwork(libraries=[nova_library]) +net.write_network() + +rc = pyna.RateCollection(libraries=[nova_library]) + +comp = pyna.Composition(rc.get_nuclei()) +comp.set_solar_like() + +rc.plot(outfile="nova.png", rho=1.e4, T=9.e7, comp=comp) + diff --git a/networks/nova2/physical_constants.f90 b/networks/nova2/physical_constants.f90 new file mode 100644 index 0000000000..be9a850df5 --- /dev/null +++ b/networks/nova2/physical_constants.f90 @@ -0,0 +1,21 @@ +module physical_constants + + use amrex_fort_module, only: rt => amrex_real + + implicit none + + real(rt), parameter :: pi = 3.141592653589793238462643383279502884197e0_rt + real(rt), parameter :: cm_per_fm = 1.0e-13_rt + + ! From 2014 CODATA recommended values + real(rt), parameter :: clight = 299792458e2_rt ! cm/s + + real(rt), parameter :: N_avo = 6.022140857e23_rt ! 1/mol + + real(rt), parameter :: gram_per_amu = 1660539.040e-30_rt + + real(rt), parameter :: erg_per_eV = 1.6021766208e-12_rt + real(rt), parameter :: erg_per_MeV = erg_per_eV * 1.0e6_rt + real(rt), parameter :: gram_per_MeV = erg_per_MeV / clight**2 + +end module physical_constants diff --git a/networks/nova2/pynucastro.net b/networks/nova2/pynucastro.net new file mode 100644 index 0000000000..e3d765eae4 --- /dev/null +++ b/networks/nova2/pynucastro.net @@ -0,0 +1,17 @@ +hydrogen-1 h1 1.0 1.0 +hydrogen-2 h2 2.0 1.0 +helium-3 he3 3.0 2.0 +helium-4 he4 4.0 2.0 +beryllium-7 be7 7.0 4.0 +boron-8 b8 8.0 5.0 +carbon-12 c12 12.0 6.0 +carbon-13 c13 13.0 6.0 +nitrogen-13 n13 13.0 7.0 +nitrogen-14 n14 14.0 7.0 +nitrogen-15 n15 15.0 7.0 +oxygen-14 o14 14.0 8.0 +oxygen-15 o15 15.0 8.0 +oxygen-16 o16 16.0 8.0 +oxygen-17 o17 17.0 8.0 +fluorine-17 f17 17.0 9.0 +fluorine-18 f18 18.0 9.0 diff --git a/networks/nova2/reaclib_rate_metadata.dat b/networks/nova2/reaclib_rate_metadata.dat new file mode 100644 index 0000000000..1a003fff48 --- /dev/null +++ b/networks/nova2/reaclib_rate_metadata.dat @@ -0,0 +1,510 @@ +-6.76010000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-4.62354000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-5.17053000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-4.53318000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-1.05148000000000d-01 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-3.47863000000000d+01 +0.00000000000000d+00 +-3.51193000000000d+00 +3.10086000000000d+00 +-1.98314000000000d-01 +1.26251000000000d-02 +-1.02517000000000d+00 +-4.36499000000000d+01 +-2.46064000000000d-03 +-2.75070000000000d+00 +-4.24877000000000d-01 +1.59870000000000d-02 +-6.90875000000000d-04 +-2.07625000000000d-01 +8.93525000000000d+00 +0.00000000000000d+00 +-3.72080000000000d+00 +1.98654000000000d-01 +0.00000000000000d+00 +0.00000000000000d+00 +3.33333000000000d-01 +7.52898000000000d+00 +0.00000000000000d+00 +-3.72080000000000d+00 +8.71782000000000d-01 +0.00000000000000d+00 +0.00000000000000d+00 +-6.66667000000000d-01 +3.78177000000000d+00 +0.00000000000000d+00 +-4.26166000000000d+00 +-1.19233000000000d-01 +7.78829000000000d-01 +-9.25203000000000d-02 +-6.66667000000000d-01 +-2.77611000000000d+01 +-4.30107000000000d-12 +-6.14100000000000d+00 +-1.93473000000000d-09 +2.04145000000000d-10 +-1.80372000000000d-11 +-6.66667000000000d-01 +1.77075000000000d+01 +0.00000000000000d+00 +-1.28271000000000d+01 +-3.81260000000000d+00 +9.42285000000000d-02 +-3.01018000000000d-03 +1.33333000000000d+00 +1.56099000000000d+01 +0.00000000000000d+00 +-1.28271000000000d+01 +-3.08225000000000d-02 +-6.54685000000000d-01 +8.96331000000000d-02 +-6.66667000000000d-01 +7.73399000000000d+00 +-7.34500000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-1.50000000000000d+00 +1.25315000000000d+01 +0.00000000000000d+00 +-1.02640000000000d+01 +-2.03472000000000d-01 +1.21083000000000d-01 +-7.00063000000000d-03 +-6.66667000000000d-01 +1.75428000000000d+01 +-3.77849000000000d+00 +-5.10735000000000d+00 +-2.24111000000000d+00 +1.48883000000000d-01 +0.00000000000000d+00 +-1.50000000000000d+00 +1.71482000000000d+01 +0.00000000000000d+00 +-1.36920000000000d+01 +-2.30881000000000d-01 +4.44362000000000d+00 +-3.15898000000000d+00 +-6.66667000000000d-01 +6.96526000000000d+01 +-1.39254000000000d+00 +5.89128000000000d+01 +-1.48273000000000d+02 +9.08324000000000d+00 +-5.41041000000000d-01 +7.03554000000000d+01 +2.54634000000000d+02 +-1.84097000000000d+00 +1.03411000000000d+02 +-4.20567000000000d+02 +6.40874000000000d+01 +-1.24624000000000d+01 +1.37303000000000d+02 +1.85155000000000d+01 +0.00000000000000d+00 +-1.37200000000000d+01 +-4.50018000000000d-01 +3.70823000000000d+00 +-1.70545000000000d+00 +-6.66667000000000d-01 +1.39637000000000d+01 +-5.78147000000000d+00 +0.00000000000000d+00 +-1.96703000000000d-01 +1.42126000000000d-01 +-2.38912000000000d-02 +-1.50000000000000d+00 +1.51825000000000d+01 +-1.35543000000000d+01 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-1.50000000000000d+00 +1.81356000000000d+01 +0.00000000000000d+00 +-1.51676000000000d+01 +9.55166000000000d-02 +3.06590000000000d+00 +-5.07339000000000d-01 +-6.66667000000000d-01 +1.09971000000000d+01 +-6.12602000000000d+00 +1.57122000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-1.50000000000000d+00 +6.73578000000000d+00 +-4.89100000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +6.82000000000000d-02 +7.65444000000000d+00 +-2.99800000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-1.50000000000000d+00 +2.01169000000000d+01 +0.00000000000000d+00 +-1.51930000000000d+01 +-4.63975000000000d+00 +9.73458000000000d+00 +-9.55051000000000d+00 +3.33333000000000d-01 +1.70100000000000d+01 +0.00000000000000d+00 +-1.51930000000000d+01 +-1.61954000000000d-01 +-7.52123000000000d+00 +-9.87565000000000d-01 +-6.66667000000000d-01 +1.38995000000000d+01 +-1.09656000000000d+01 +-5.62270000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-1.50000000000000d+00 +1.96838000000000d-01 +-5.16034000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-1.50000000000000d+00 +2.15339000000000d+01 +0.00000000000000d+00 +-3.62504000000000d+01 +0.00000000000000d+00 +0.00000000000000d+00 +-5.00000000000000d+00 +-6.66667000000000d-01 +1.45444000000000d+01 +-1.02295000000000d+01 +0.00000000000000d+00 +0.00000000000000d+00 +4.59037000000000d-02 +0.00000000000000d+00 +-1.50000000000000d+00 +6.59056000000000d+00 +-2.92315000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-1.50000000000000d+00 +2.00176000000000d+01 +0.00000000000000d+00 +-1.52400000000000d+01 +3.34926000000000d-01 +4.59088000000000d+00 +-4.78468000000000d+00 +-6.66667000000000d-01 +1.90904000000000d+01 +0.00000000000000d+00 +-1.66960000000000d+01 +-1.16252000000000d+00 +2.67703000000000d-01 +-3.38411000000000d-02 +-6.66667000000000d-01 +1.58929000000000d+01 +0.00000000000000d+00 +-1.64035000000000d+01 +4.31885000000000d+00 +-7.09921000000000d-01 +-2.00000000000000d+00 +-6.66667000000000d-01 +9.39048000000000d+00 +-6.22828000000000d+00 +0.00000000000000d+00 +2.31435000000000d+00 +-3.02835000000000d-01 +2.01330000000000d-02 +-1.50000000000000d+00 +-1.30770000000000d+01 +-7.46296000000000d-01 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-1.50000000000000d+00 +4.12969000000000d+01 +0.00000000000000d+00 +-7.18200000000000d+00 +-1.71349000000000d+01 +1.36908000000000d+00 +-8.14423000000000d-02 +3.35395000000000d+00 +2.46839000000000d+01 +0.00000000000000d+00 +-7.18200000000000d+00 +4.73288000000000d-01 +1.46847000000000d+00 +-2.79603000000000d+01 +-6.66667000000000d-01 +4.04644000000000d+01 +0.00000000000000d+00 +-3.58290000000000d+01 +-5.30275000000000d-01 +-9.82462000000000d-01 +8.08059000000000d-02 +-6.66667000000000d-01 +2.08972000000000d+01 +-7.40600000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-1.50000000000000d+00 +-4.87347000000000d+00 +-2.02117000000000d+00 +0.00000000000000d+00 +3.08497000000000d+01 +-8.50433000000000d+00 +-1.54426000000000d+00 +-1.50000000000000d+00 +2.74764000000000d+01 +0.00000000000000d+00 +-1.52530000000000d+01 +1.59318000000000d+00 +2.44790000000000d+00 +-2.19708000000000d+00 +-6.66667000000000d-01 +-6.57522000000000d+00 +-1.16380000000000d+00 +0.00000000000000d+00 +2.27105000000000d+01 +-2.90707000000000d+00 +2.05754000000000d-01 +-1.50000000000000d+00 +4.08358000000000d+01 +0.00000000000000d+00 +-3.93880000000000d+01 +-1.74673000000000d+01 +3.53029000000000d+01 +-2.48162000000000d+01 +-6.66667000000000d-01 +1.63087000000000d+01 +-2.25100000000000d+01 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-1.50000000000000d+00 +1.11184000000000d+01 +-1.36000000000000d+01 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-1.50000000000000d+00 +-1.06091000000000d+02 +-4.53036000000000d-01 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-1.50000000000000d+00 +1.21289000000000d+01 +-1.20223000000000d+01 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-1.50000000000000d+00 +1.86518000000000d+01 +-2.60000000000000d+01 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-1.50000000000000d+00 +1.01740000000000d+01 +-4.95865000000000d+00 +0.00000000000000d+00 +5.10182000000000d+00 +3.79373000000000d-01 +-6.72515000000000d-02 +-1.50000000000000d+00 +5.53360000000000d+00 +-2.11477000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-1.50000000000000d+00 +-7.20763000000000d+00 +-7.53395000000000d-01 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-1.50000000000000d+00 +1.95790000000000d+01 +0.00000000000000d+00 +-1.69078000000000d+01 +0.00000000000000d+00 +0.00000000000000d+00 +-2.00000000000000d+00 +-6.66667000000000d-01 +-3.17388000000000d+01 +-3.76432000000000d-01 +0.00000000000000d+00 +6.17380000000000d+01 +-1.08290000000000d+02 +-3.42365000000000d+01 +-1.50000000000000d+00 +6.20058000000000d+01 +0.00000000000000d+00 +-2.14023000000000d+01 +-8.08891000000000d+01 +1.34600000000000d+02 +-1.26504000000000d+02 +-6.66667000000000d-01 +1.75704000000000d+00 +-3.01675000000000d+00 +0.00000000000000d+00 +1.33223000000000d+01 +-1.36696000000000d+00 +7.57363000000000d-02 +-1.50000000000000d+00 +2.47788000000000d+01 +0.00000000000000d+00 +-1.22770000000000d+01 +-1.03699000000000d-01 +-6.49967000000000d-02 +1.68191000000000d-02 +-6.66667000000000d-01 +2.76987000000000d+01 +0.00000000000000d+00 +-1.24280000000000d+01 +0.00000000000000d+00 +0.00000000000000d+00 +0.00000000000000d+00 +-6.66667000000000d-01 +3.17435000000000d+01 +-5.45213000000000d-12 +-2.17930000000000d+01 +-1.98126000000000d-09 +1.84204000000000d-10 +-1.46403000000000d-11 +-6.66667000000000d-01 +-2.43505000000000d+01 +-4.12656000000000d+00 +-1.34900000000000d+01 +2.14259000000000d+01 +-1.34769000000000d+00 +8.79816000000000d-02 +-1.31653000000000d+01 +-1.17884000000000d+01 +-1.02446000000000d+00 +-2.35700000000000d+01 +2.04886000000000d+01 +-1.29882000000000d+01 +-2.00000000000000d+01 +-2.16667000000000d+00 +-9.71052000000000d-01 +0.00000000000000d+00 +-3.70600000000000d+01 +2.93493000000000d+01 +-1.15507000000000d+02 +-1.00000000000000d+01 +-1.33333000000000d+00 +1 +2 +3 +4 +5 +6 +7 +8 +10 +11 +12 +14 +16 +18 +20 +23 +25 +29 +32 +35 +36 +39 +41 +42 +46 +52 +56 +59 +60 +61 +62 +0 +0 +0 +0 +0 +0 +0 +1 +0 +0 +1 +1 +1 +1 +2 +1 +3 +2 +2 +0 +2 +1 +0 +3 +5 +3 +2 +0 +0 +0 +2 diff --git a/networks/nova2/reaclib_rates.F90 b/networks/nova2/reaclib_rates.F90 new file mode 100644 index 0000000000..bc07f60370 --- /dev/null +++ b/networks/nova2/reaclib_rates.F90 @@ -0,0 +1,199 @@ +module reaclib_rates + + use amrex_fort_module, only: rt => amrex_real + use screening_module, only: add_screening_factor, & + screening_init, screening_finalize, & + plasma_state, fill_plasma_state + use network + + implicit none + + logical, parameter :: screen_reaclib = .true. + + ! Temperature coefficient arrays (numbers correspond to reaction numbers in net_info) + real(rt), allocatable :: ctemp_rate(:,:) + + ! Index into ctemp_rate, dimension 2, where each rate's coefficients start + integer, allocatable :: rate_start_idx(:) + + ! Reaction multiplicities-1 (how many rates contribute - 1) + integer, allocatable :: rate_extra_mult(:) + +contains + + subroutine init_reaclib() + + implicit none + + integer :: unit, ireaclib, icoeff + + allocate( ctemp_rate(7, number_reaclib_sets) ) + allocate( rate_start_idx(nrat_reaclib) ) + allocate( rate_extra_mult(nrat_reaclib) ) + + open(newunit=unit, file='reaclib_rate_metadata.dat') + + do ireaclib = 1, number_reaclib_sets + do icoeff = 1, 7 + read(unit, *) ctemp_rate(icoeff, ireaclib) + enddo + enddo + + do ireaclib = 1, nrat_reaclib + read(unit, *) rate_start_idx(ireaclib) + enddo + + do ireaclib = 1, nrat_reaclib + read(unit, *) rate_extra_mult(ireaclib) + enddo + + close(unit) + + end subroutine init_reaclib + + subroutine term_reaclib() + deallocate( ctemp_rate ) + deallocate( rate_start_idx ) + deallocate( rate_extra_mult ) + end subroutine term_reaclib + + + subroutine net_screening_init() + ! Adds screening factors and calls screening_init + + call add_screening_factor(zion(jp), aion(jp), & + zion(jp), aion(jp)) + + call add_screening_factor(zion(jp), aion(jp), & + zion(jd), aion(jd)) + + call add_screening_factor(zion(jd), aion(jd), & + zion(jd), aion(jd)) + + call add_screening_factor(zion(jp), aion(jp), & + zion(jhe3), aion(jhe3)) + + call add_screening_factor(zion(jhe4), aion(jhe4), & + zion(jhe3), aion(jhe3)) + + call add_screening_factor(zion(jp), aion(jp), & + zion(jbe7), aion(jbe7)) + + call add_screening_factor(zion(jp), aion(jp), & + zion(jc12), aion(jc12)) + + call add_screening_factor(zion(jhe4), aion(jhe4), & + zion(jc12), aion(jc12)) + + call add_screening_factor(zion(jp), aion(jp), & + zion(jc13), aion(jc13)) + + call add_screening_factor(zion(jp), aion(jp), & + zion(jn13), aion(jn13)) + + call add_screening_factor(zion(jp), aion(jp), & + zion(jn14), aion(jn14)) + + call add_screening_factor(zion(jhe4), aion(jhe4), & + zion(jn14), aion(jn14)) + + call add_screening_factor(zion(jp), aion(jp), & + zion(jn15), aion(jn15)) + + call add_screening_factor(zion(jp), aion(jp), & + zion(jo16), aion(jo16)) + + call add_screening_factor(zion(jp), aion(jp), & + zion(jo17), aion(jo17)) + + call add_screening_factor(zion(jd), aion(jd), & + zion(jhe3), aion(jhe3)) + + call add_screening_factor(zion(jhe4), aion(jhe4), & + zion(jn13), aion(jn13)) + + call add_screening_factor(zion(jhe4), aion(jhe4), & + zion(jo14), aion(jo14)) + + call add_screening_factor(zion(jp), aion(jp), & + zion(jf18), aion(jf18)) + + call add_screening_factor(zion(jhe3), aion(jhe3), & + zion(jhe3), aion(jhe3)) + + call add_screening_factor(zion(jd), aion(jd), & + zion(jbe7), aion(jbe7)) + + call add_screening_factor(zion(jhe3), aion(jhe3), & + zion(jbe7), aion(jbe7)) + + call add_screening_factor(zion(jhe4), aion(jhe4), & + zion(jhe4), aion(jhe4)) + + call add_screening_factor(zion(jhe4), aion(jhe4), & + 4.0_rt, 8.0_rt) + + + call screening_init() + end subroutine net_screening_init + + + subroutine net_screening_finalize() + ! Call screening_finalize + + call screening_finalize() + + end subroutine net_screening_finalize + + + subroutine reaclib_evaluate(pstate, temp, iwhich, rate, drate_dt) + + implicit none + + type(plasma_state), intent(in) :: pstate + real(rt), intent(in) :: temp + integer, intent(in) :: iwhich + + real(rt), intent(out) :: rate ! Reaction rate + real(rt), intent(out) :: drate_dt ! Reaction rate temperature derivative + + real(rt) :: ri, T9, T9_exp, lnirate, irate, dirate_dt, dlnirate_dt + integer :: i, j, m, istart + + ri = 0.0e0_rt + rate = 0.0e0_rt + drate_dt = 0.0e0_rt + irate = 0.0e0_rt + dirate_dt = 0.0e0_rt + T9 = temp/1.0e9_rt + T9_exp = 0.0e0_rt + + ! Get the number of additional Reaclib sets for this rate + ! Total number of Reaclib sets for this rate is m + 1 + m = rate_extra_mult(iwhich) + + istart = rate_start_idx(iwhich) + + do i = 0, m + lnirate = ctemp_rate(1, istart+i) + ctemp_rate(7, istart+i) * LOG(T9) + dlnirate_dt = ctemp_rate(7, istart+i)/T9 + do j = 2, 6 + T9_exp = (2.0e0_rt*dble(j-1)-5.0e0_rt)/3.0e0_rt + lnirate = lnirate + ctemp_rate(j, istart+i) * T9**T9_exp + dlnirate_dt = dlnirate_dt + & + T9_exp * ctemp_rate(j, istart+i) * T9**(T9_exp-1.0e0_rt) + end do + ! If the rate will be in the approx. interval [0.0, 1.0E-100], replace by 0.0 + ! This avoids issues with passing very large negative values to EXP + ! and getting results between 0.0 and 1.0E-308, the limit for IEEE 754. + ! And avoids SIGFPE in CVODE due to tiny rates. + lnirate = max(lnirate, -230.0e0_rt) + irate = EXP(lnirate) + rate = rate + irate + dirate_dt = irate * dlnirate_dt/1.0e9_rt + drate_dt = drate_dt + dirate_dt + end do + + end subroutine reaclib_evaluate + +end module reaclib_rates diff --git a/networks/nova2/table_rates.F90 b/networks/nova2/table_rates.F90 new file mode 100644 index 0000000000..a64ad55e44 --- /dev/null +++ b/networks/nova2/table_rates.F90 @@ -0,0 +1,289 @@ +module table_rates + ! Table is expected to be in terms of dens*ye and temp (non-logarithmic, cgs units) + ! Table energy units are expected in terms of ergs + + use amrex_fort_module, only: rt => amrex_real + + implicit none + + public tabular_evaluate + + public jtab_mu, jtab_dq, jtab_vs, jtab_rate, jtab_nuloss, jtab_gamma + + private num_tables + private k_drate_dt, add_vars + + integer, parameter :: num_tables = 0 + integer, parameter :: jtab_mu = 1 + integer, parameter :: jtab_dq = 2 + integer, parameter :: jtab_vs = 3 + integer, parameter :: jtab_rate = 4 + integer, parameter :: jtab_nuloss = 5 + integer, parameter :: jtab_gamma = 6 + + ! k_drate_dt is used only for calculating the derivative + ! of rate with temperature from the table, it isn't an index + ! into the table but into the 'entries' array in, eg. get_entries. + integer, parameter :: k_drate_dt = 7 + integer, parameter :: add_vars = 1 ! 1 Additional Var in entries + + + +contains + + subroutine init_tabular() + integer :: n + + + end subroutine init_tabular + + + subroutine term_table_meta() + + + end subroutine term_table_meta + + + subroutine init_tab_info(rate_table, rhoy_table, temp_table, & + num_rhoy, num_temp, num_vars, & + rate_table_file, num_header) + integer :: num_rhoy, num_temp, num_vars, num_header + real(rt) :: rate_table(num_temp, num_rhoy, num_vars), rhoy_table(num_rhoy), temp_table(num_temp) + character(len=50) :: rate_table_file + + real(rt), allocatable :: rate_table_scratch(:,:,:) + integer :: i, j, k + + allocate(rate_table_scratch(num_temp, num_rhoy, num_vars+2)) + + open(unit=11, file=rate_table_file) + do i = 1, num_header + read(11,*) + end do + do j = 1, num_rhoy + do i = 1, num_temp + read(11,*) ( rate_table_scratch(i, j, k), k=1, num_vars+2 ) + end do + if (j/=num_rhoy) then + read(11,*) + end if + end do + close(11) + + rate_table(:,:,:) = rate_table_scratch(:,:,3:num_vars+2) + + do i = 1, num_rhoy + rhoy_table(i) = rate_table_scratch(1, i, 1) + end do + do i = 1, num_temp + temp_table(i) = rate_table_scratch(i, 1, 2) + end do + + deallocate(rate_table_scratch) + + end subroutine init_tab_info + + + subroutine vector_index_lu(vector, fvar, index) + + ! 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. + real(rt), intent(in) :: vector(:) + real(rt), intent(in) :: fvar + integer, intent(out) :: index + integer :: n, i, j, nup, ndn + + n = size(vector) + if ( fvar .lt. vector(1) ) then + index = 1 + else if ( fvar .gt. vector(n) ) then + index = n - 1 + else + nup = n + ndn = 1 + do i = 1, n + j = ndn + (nup - ndn)/2 + if ( fvar .lt. vector(j) ) then + nup = j + else + ndn = j + end if + if ( ((nup - ndn) .eq. 1) ) then + index = ndn + return + end if + end do + end if + end subroutine vector_index_lu + + + subroutine bl_clamp(xlo, xhi, flo, fhi, x, f) + + ! Perform bilinear interpolation within the interval [xlo, xhi] + ! where the function values at the endpoints are defined by: + ! flo = f(xlo) + ! fhi = f(xhi) + ! Returns f(x), the values flo and fhi interpolated at x + ! f(x) = flo if x <= xlo + ! f(x) = fhi if x >= xhi + real(rt), intent(in) :: xlo, xhi, flo, fhi, x + real(rt), intent(out) :: f + + if ( x .le. xlo ) then + f = flo + else if ( x .ge. xhi ) then + f = fhi + else + f = ( flo * ( xhi - x ) + fhi * ( x - xlo ) ) / ( xhi - xlo ) + end if + end subroutine bl_clamp + + + subroutine bl_extrap(xlo, xhi, flo, fhi, x, f) + + ! Perform bilinear interpolation within the interval [xlo, xhi] + ! where the function values at the endpoints are defined by: + ! flo = f(xlo) + ! fhi = f(xhi) + ! Returns f(x), the values flo and fhi interpolated at x + ! If x <= xlo or x >= xhi, f(x) is extrapolated at x + real(rt), intent(in) :: xlo, xhi, flo, fhi, x + real(rt), intent(out) :: f + + f = ( flo * ( xhi - x ) + fhi * ( x - xlo ) ) / ( xhi - xlo ) + end subroutine bl_extrap + + + subroutine get_entries(rate_table, rhoy_table, temp_table, & + num_rhoy, num_temp, num_vars, & + rhoy, temp, entries) + + integer :: num_rhoy, num_temp, num_vars + real(rt) :: rate_table(num_temp, num_rhoy, num_vars), rhoy_table(num_rhoy), temp_table(num_temp) + real(rt), intent(in) :: rhoy, temp + real(rt), dimension(num_vars+1), intent(out) :: entries + + ! The last element of entries is the derivative of rate with temperature + ! drate_dt, evaluated by central differencing at the box corners + ! and then performing a bilinear interpolation on those central differences. + + real(rt) :: f_im1, f_i, f_ip1, f_ip2 + real(rt) :: t_im1, t_i, t_ip1, t_ip2 + real(rt) :: drdt_i, drdt_ip1 + real(rt) :: temp_lo, temp_hi, rhoy_lo, rhoy_hi + integer :: irhoy_lo, irhoy_hi, itemp_lo, itemp_hi + integer :: ivar + + ! Get box-corner points for interpolation + ! This deals with out-of-range inputs via linear extrapolation + call vector_index_lu(rhoy_table, rhoy, irhoy_lo) + call vector_index_lu(temp_table, temp, itemp_lo) + + irhoy_hi = irhoy_lo + 1 + itemp_hi = itemp_lo + 1 + + ! Bilinear interpolation within the box + ! The desired point is denoted by ABCD, within the box. + ! The value of ivar at ABCD is denoted by fvar. + ! T ^ B . . C + ! | + ! | AB ABCD CD + ! | . . + ! | A D + ! |___________________> rho*Ye + temp_lo = temp_table( itemp_lo ) + temp_hi = temp_table( itemp_hi ) + rhoy_lo = rhoy_table( irhoy_lo ) + rhoy_hi = rhoy_table( irhoy_hi ) + + ! Interpolate for each table entry + do ivar = 1, num_vars + call bl_extrap(temp_lo, temp_hi, & + rate_table( itemp_lo, irhoy_lo, ivar ), & + rate_table( itemp_hi, irhoy_lo, ivar ), & + temp, f_i) + call bl_extrap(temp_lo, temp_hi, & + rate_table( itemp_lo, irhoy_hi, ivar ), & + rate_table( itemp_hi, irhoy_hi, ivar ), & + temp, f_ip1) + call bl_extrap(rhoy_lo, rhoy_hi, f_i, f_ip1, rhoy, entries(ivar)) + end do + + ! Calculate the derivative of rate with temperature, d(rate)/d(t) + ! (Clamp interpolations in rhoy to avoid unphysical temperature derivatives) + if (( itemp_lo .eq. 1 ) .or. ( itemp_lo .eq. num_temp-1 )) then + ! We're at the first or last table cell (in temperature) + ! First do bilinear interpolation in rhoy for the table at tlo and thi + call bl_clamp(rhoy_lo, rhoy_hi, & + rate_table( itemp_lo, irhoy_lo, jtab_rate ), & + rate_table( itemp_lo, irhoy_hi, jtab_rate ), & + rhoy, f_i) + call bl_clamp(rhoy_lo, rhoy_hi, & + rate_table( itemp_hi, irhoy_lo, jtab_rate ), & + rate_table( itemp_hi, irhoy_hi, jtab_rate ), & + rhoy, f_ip1) + ! Approximate d(rate)/d(t) via forward differencing + entries(k_drate_dt) = (f_ip1 - f_i) / (temp_hi - temp_lo) + else + ! Approximate d(rate)/d(t) via bilinear interpolation on central differences + t_im1 = temp_table( itemp_lo-1 ) + t_i = temp_table( itemp_lo ) + t_ip1 = temp_table( itemp_hi ) + t_ip2 = temp_table( itemp_lo+2 ) + call bl_clamp(rhoy_lo, rhoy_hi, & + rate_table( itemp_lo-1, irhoy_lo, jtab_rate ), & + rate_table( itemp_lo-1, irhoy_hi, jtab_rate ), & + rhoy, f_im1) + call bl_clamp(rhoy_lo, rhoy_hi, & + rate_table( itemp_lo, irhoy_lo, jtab_rate ), & + rate_table( itemp_lo, irhoy_hi, jtab_rate ), & + rhoy, f_i) + call bl_clamp(rhoy_lo, rhoy_hi, & + rate_table( itemp_hi, irhoy_lo, jtab_rate ), & + rate_table( itemp_hi, irhoy_hi, jtab_rate ), & + rhoy, f_ip1) + call bl_clamp(rhoy_lo, rhoy_hi, & + rate_table( itemp_lo+2, irhoy_lo, jtab_rate ), & + rate_table( itemp_lo+2, irhoy_hi, jtab_rate ), & + rhoy, f_ip2) + ! Get central difference derivatives at the box corners + drdt_i = (f_ip1 - f_im1) / (t_ip1 - t_im1) + drdt_ip1 = (f_ip2 - f_i) / (t_ip2 - t_i) + ! Interpolate in temperature + ! (Since we're inside the table in temp, use bl_extrap, it's faster) + call bl_extrap(t_i, t_ip1, drdt_i, drdt_ip1, temp, entries(k_drate_dt)) + end if + end subroutine get_entries + + + subroutine tabular_evaluate(rate_table, rhoy_table, temp_table, & + num_rhoy, num_temp, num_vars, & + rhoy, temp, & + rate, drate_dt, edot_nu) + + implicit none + + integer :: num_rhoy, num_temp, num_vars, num_header + real(rt) :: rate_table(num_temp, num_rhoy, num_vars), rhoy_table(num_rhoy), temp_table(num_temp) + + real(rt), intent(in) :: rhoy, temp + real(rt), intent(out) :: rate, drate_dt, edot_nu + + real(rt) :: entries(num_vars+add_vars) + + ! Get the table entries at this rhoy, temp + call get_entries(rate_table, rhoy_table, temp_table, & + num_rhoy, num_temp, num_vars, & + rhoy, temp, entries) + + ! Fill outputs: rate, d(rate)/d(temperature), and + ! (negative) neutrino loss contribution to energy generation + rate = entries(jtab_rate) + drate_dt = entries(k_drate_dt) + edot_nu = -entries(jtab_nuloss) + + end subroutine tabular_evaluate + +end module table_rates From 380ac07b5d7180feb8e749471177db4f8763e20e Mon Sep 17 00:00:00 2001 From: Michael Zingale Date: Wed, 13 Nov 2024 08:33:47 -0500 Subject: [PATCH 2/2] some clang-tidy 19 fixes --- .clang-tidy | 3 +++ integration/VODE/vode_dvhin.H | 10 +++------- networks/aprox13/actual_network.H | 2 +- networks/aprox21/actual_network.H | 2 +- networks/iso7/actual_network.H | 2 +- networks/rprox/actual_network.H | 2 +- 6 files changed, 10 insertions(+), 11 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 1e228494af..2bd4310f7a 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -19,6 +19,7 @@ Checks: > -misc-include-cleaner, -misc-non-private-member-variables-in-classes, -misc-use-anonymous-namespace, + -misc-use-internal-linkage, modernize-*, -modernize-avoid-c-arrays, -modernize-use-trailing-return-type, @@ -29,12 +30,14 @@ Checks: > -readability-avoid-const-params-in-decls, -readability-braces-around-statements, -readability-else-after-return, + -readability-enum-initial-value, -readability-function-cognitive-complexity, -readability-function-size, -readability-identifier-length, -readability-implicit-bool-conversion, -readability-isolate-declaration, -readability-magic-numbers, + -readability-math-missing-parentheses, -readability-named-parameter, -readability-simplify-boolean-expr, mpi-*, diff --git a/integration/VODE/vode_dvhin.H b/integration/VODE/vode_dvhin.H index 055ddc1394..20c6747224 100644 --- a/integration/VODE/vode_dvhin.H +++ b/integration/VODE/vode_dvhin.H @@ -122,17 +122,13 @@ void dvhin (BurnT& state, DvodeT& vstate, amrex::Real& H0, int& NITER, int& IER) } - // Iteration done. Apply bounds, bias factor, and sign. Then exit. + // Iteration done. Apply bounds and bias factor. Then exit. H0 = hnew * 0.5_rt; - if (H0 < HLB) { - H0 = HLB; - } - if (H0 > HUB) { - H0 = HUB; - } + H0 = std::clamp(H0, HLB, HUB); } + // apply sign H0 = std::copysign(H0, vstate.tout - vstate.t); NITER = iter; IER = 0; diff --git a/networks/aprox13/actual_network.H b/networks/aprox13/actual_network.H index 937585dd88..f678123274 100644 --- a/networks/aprox13/actual_network.H +++ b/networks/aprox13/actual_network.H @@ -134,7 +134,7 @@ namespace NSE_INDEX #endif namespace Rates { - enum NetworkRates { + enum NetworkRates: std::uint8_t { He4_He4_He4_to_C12 = 1, C12_He4_to_O16, C12_C12_to_Ne20_He4, diff --git a/networks/aprox21/actual_network.H b/networks/aprox21/actual_network.H index dcade97f08..9fca91944a 100644 --- a/networks/aprox21/actual_network.H +++ b/networks/aprox21/actual_network.H @@ -152,7 +152,7 @@ namespace NSE_INDEX #endif namespace Rates { - enum NetworkRates { + enum NetworkRates : std::uint8_t { H1_H1_to_He3 = 1, H1_H1_H1_to_He3, P_to_N, diff --git a/networks/iso7/actual_network.H b/networks/iso7/actual_network.H index ea60bd0351..a2748ab99b 100644 --- a/networks/iso7/actual_network.H +++ b/networks/iso7/actual_network.H @@ -114,7 +114,7 @@ namespace NSE_INDEX #endif namespace Rates { - enum NetworkRates { + enum NetworkRates : std::uinit8_t { C12_He4_to_O16 = 1, He4_He4_He4_to_C12, C12_C12_to_Ne20_He4, diff --git a/networks/rprox/actual_network.H b/networks/rprox/actual_network.H index c16d12dc61..4afd4fc8bb 100644 --- a/networks/rprox/actual_network.H +++ b/networks/rprox/actual_network.H @@ -112,7 +112,7 @@ namespace network namespace Rates { - enum NetworkRates + enum NetworkRates : std::uint8_t { He4_He4_He4_to_C12 = 1, C12_H1_to_N13,