From 3ce5b12b850a109da0bd35888b1b02e257448b4c Mon Sep 17 00:00:00 2001 From: ChristopherBignamini Date: Tue, 21 Oct 2025 15:28:48 +0200 Subject: [PATCH 01/31] Transcription of rate_timestep_g --- src/clib/CMakeLists.txt | 1 + src/clib/Make.config.objects | 1 + src/clib/fortran_func_decls.h | 26 --- src/clib/fortran_func_wrappers.hpp | 62 +++--- src/clib/rate_timestep_g.cpp | 321 +++++++++++++++++++++++++++++ src/clib/rate_timestep_g.hpp | 37 ++++ src/clib/solve_rate_cool_g-cpp.cpp | 9 +- src/clib/solve_rate_cool_g.F | 318 ---------------------------- src/clib/time_deriv_0d.hpp | 15 +- 9 files changed, 405 insertions(+), 385 deletions(-) create mode 100644 src/clib/rate_timestep_g.cpp create mode 100644 src/clib/rate_timestep_g.hpp diff --git a/src/clib/CMakeLists.txt b/src/clib/CMakeLists.txt index 5bcb8c112..62c484f06 100644 --- a/src/clib/CMakeLists.txt +++ b/src/clib/CMakeLists.txt @@ -117,6 +117,7 @@ add_library(Grackle_Grackle initialize_metal_chemistry_rates.cpp initialize_metal_chemistry_rates.hpp internal_types.cpp internal_types.hpp opaque_storage.hpp + rate_timestep_g.cpp rate_timestep_g.hpp rate_utils.cpp scale_fields.cpp scale_fields.hpp solve_rate_cool_g-cpp.cpp solve_rate_cool_g-cpp.h diff --git a/src/clib/Make.config.objects b/src/clib/Make.config.objects index 954bf66c6..786a3c6e1 100644 --- a/src/clib/Make.config.objects +++ b/src/clib/Make.config.objects @@ -34,6 +34,7 @@ OBJS_CONFIG_LIB = \ initialize_rates.lo \ initialize_UVbackground_data.lo \ interpolators_g.lo \ + rate_timestep_g.lo \ scale_fields.lo \ set_default_chemistry_parameters.lo \ solve_chemistry.lo \ diff --git a/src/clib/fortran_func_decls.h b/src/clib/fortran_func_decls.h index 06796d76b..22c32552b 100644 --- a/src/clib/fortran_func_decls.h +++ b/src/clib/fortran_func_decls.h @@ -343,32 +343,6 @@ void FORTRAN_NAME(lookup_cool_rates1d_g)( int* iH2shieldcustom, gr_float* f_shield_custom_data_ptr ); -void FORTRAN_NAME(rate_timestep_g)( - double* dedot, double* HIdot, int* ispecies, gr_mask_type* anydust, - gr_float* de_data_ptr, gr_float* HI_data_ptr, gr_float* HII_data_ptr, - gr_float* HeI_data_ptr, gr_float* HeII_data_ptr, gr_float* HeIII_data_ptr, - gr_float* d_data_ptr, gr_float* HM_data_ptr, gr_float* H2I_data_ptr, - gr_float* H2II_data_ptr, int* in, int* jn, int* kn, int* is, int* ie, int* j, - int* k, double* k1, double* k2, double* k3, double* k4, double* k5, - double* k6, double* k7, double* k8, double* k9, double* k10, double* k11, - double* k12, double* k13, double* k14, double* k15, double* k16, double* k17, - double* k18, double* k19, double* k22, double* k24, double* k25, double* k26, - double* k27, double* k28, double* k29, double* k30, double* k50, double* k51, - double* k52, double* k53, double* k54, double* k55, double* k56, double* k57, - double* k58, double* h2dust, double* ncrn, double* ncrd1, double* ncrd2, - double* rhoH, double* k24shield, double* k25shield, double* k26shield, - double* k28shield, double* k29shield, double* k30shield, double* k31shield, - int* iradtrans, int* irt_honly, gr_float* kphHI_data_ptr, - gr_float* kphHeI_data_ptr, gr_float* kphHeII_data_ptr, gr_mask_type* itmask, - double* edot, double* chunit, double* dom, gr_float* metal_data_ptr, - gr_float* HDI_data_ptr, int* imchem, gr_float* CI_data_ptr, - gr_float* OI_data_ptr, gr_float* OH_data_ptr, gr_float* CO_data_ptr, - gr_float* H2O_data_ptr, int* idissHDI, gr_float* kdissHDI_data_ptr, - int* iionZ, gr_float* kphCI_data_ptr, gr_float* kphOI_data_ptr, int* idissZ, - gr_float* kdissCO_data_ptr, gr_float* kdissOH_data_ptr, - gr_float* kdissH2O_data_ptr -); - void FORTRAN_NAME(step_rate_g)( gr_float* de_data_ptr, gr_float* HI_data_ptr, gr_float* HII_data_ptr, gr_float* HeI_data_ptr, gr_float* HeII_data_ptr, gr_float* HeIII_data_ptr, diff --git a/src/clib/fortran_func_wrappers.hpp b/src/clib/fortran_func_wrappers.hpp index 1c806824c..0816721e2 100644 --- a/src/clib/fortran_func_wrappers.hpp +++ b/src/clib/fortran_func_wrappers.hpp @@ -518,37 +518,37 @@ inline void make_consistent_g( ); } -/// This routine calculates the electron and HI rates of change in order to -/// determine the maximum permitted timestep -inline void rate_timestep_g( - double* dedot, double* HIdot, gr_mask_type anydust, IndexRange idx_range, - double* h2dust, double* rhoH, gr_mask_type* itmask, double* edot, - double chunit, double dom, chemistry_data* my_chemistry, - grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, - grackle::impl::CollisionalRxnRateCollection kcr_buf, - grackle::impl::PhotoRxnRateCollection kshield_buf, - grackle::impl::ChemHeatingRates chemheatrates_buf -) { - FORTRAN_NAME(rate_timestep_g)( - dedot, HIdot, &my_chemistry->primordial_chemistry, &anydust, - my_fields->e_density, my_fields->HI_density, my_fields->HII_density, my_fields->HeI_density, my_fields->HeII_density, my_fields->HeIII_density, my_fields->density, - my_fields->HM_density, my_fields->H2I_density, my_fields->H2II_density, - &my_fields->grid_dimension[0], &my_fields->grid_dimension[1], &my_fields->grid_dimension[2], &idx_range.i_start, &idx_range.i_end, &idx_range.jp1, &idx_range.kp1, - kcr_buf.data[CollisionalRxnLUT::k1], kcr_buf.data[CollisionalRxnLUT::k2], kcr_buf.data[CollisionalRxnLUT::k3], kcr_buf.data[CollisionalRxnLUT::k4], kcr_buf.data[CollisionalRxnLUT::k5], kcr_buf.data[CollisionalRxnLUT::k6], kcr_buf.data[CollisionalRxnLUT::k7], kcr_buf.data[CollisionalRxnLUT::k8], kcr_buf.data[CollisionalRxnLUT::k9], kcr_buf.data[CollisionalRxnLUT::k10], kcr_buf.data[CollisionalRxnLUT::k11], - kcr_buf.data[CollisionalRxnLUT::k12], kcr_buf.data[CollisionalRxnLUT::k13], kcr_buf.data[CollisionalRxnLUT::k14], kcr_buf.data[CollisionalRxnLUT::k15], kcr_buf.data[CollisionalRxnLUT::k16], kcr_buf.data[CollisionalRxnLUT::k17], kcr_buf.data[CollisionalRxnLUT::k18], kcr_buf.data[CollisionalRxnLUT::k19], kcr_buf.data[CollisionalRxnLUT::k22], - &my_uvb_rates.k24, &my_uvb_rates.k25, &my_uvb_rates.k26, &my_uvb_rates.k27, &my_uvb_rates.k28, &my_uvb_rates.k29, &my_uvb_rates.k30, - kcr_buf.data[CollisionalRxnLUT::k50], kcr_buf.data[CollisionalRxnLUT::k51], kcr_buf.data[CollisionalRxnLUT::k52], kcr_buf.data[CollisionalRxnLUT::k53], kcr_buf.data[CollisionalRxnLUT::k54], kcr_buf.data[CollisionalRxnLUT::k55], kcr_buf.data[CollisionalRxnLUT::k56], kcr_buf.data[CollisionalRxnLUT::k57], kcr_buf.data[CollisionalRxnLUT::k58], - h2dust, chemheatrates_buf.n_cr_n, chemheatrates_buf.n_cr_d1, chemheatrates_buf.n_cr_d2, rhoH, - kshield_buf.k24, kshield_buf.k25, kshield_buf.k26, - kshield_buf.k28, kshield_buf.k29, kshield_buf.k30, kshield_buf.k31, - &my_chemistry->use_radiative_transfer, &my_chemistry->radiative_transfer_hydrogen_only, - my_fields->RT_HI_ionization_rate, my_fields->RT_HeI_ionization_rate, my_fields->RT_HeII_ionization_rate, - itmask, edot, &chunit, &dom, my_fields->metal_density, - my_fields->HDI_density, &my_chemistry->metal_chemistry, my_fields->CI_density, my_fields->OI_density, my_fields->OH_density, my_fields->CO_density, my_fields->H2O_density, - &my_chemistry->radiative_transfer_HDI_dissociation, my_fields->RT_HDI_dissociation_rate, &my_chemistry->radiative_transfer_metal_ionization, my_fields->RT_CI_ionization_rate, my_fields->RT_OI_ionization_rate, - &my_chemistry->radiative_transfer_metal_dissociation, my_fields->RT_CO_dissociation_rate, my_fields->RT_OH_dissociation_rate, my_fields->RT_H2O_dissociation_rate - ); -} +// /// This routine calculates the electron and HI rates of change in order to +// /// determine the maximum permitted timestep +// inline void rate_timestep_g( +// double* dedot, double* HIdot, gr_mask_type anydust, IndexRange idx_range, +// double* h2dust, double* rhoH, gr_mask_type* itmask, double* edot, +// double chunit, double dom, chemistry_data* my_chemistry, +// grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, +// grackle::impl::CollisionalRxnRateCollection kcr_buf, +// grackle::impl::PhotoRxnRateCollection kshield_buf, +// grackle::impl::ChemHeatingRates chemheatrates_buf +// ) { +// FORTRAN_NAME(rate_timestep_g)( +// dedot, HIdot, &my_chemistry->primordial_chemistry, &anydust, +// my_fields->e_density, my_fields->HI_density, my_fields->HII_density, my_fields->HeI_density, my_fields->HeII_density, my_fields->HeIII_density, my_fields->density, +// my_fields->HM_density, my_fields->H2I_density, my_fields->H2II_density, +// &my_fields->grid_dimension[0], &my_fields->grid_dimension[1], &my_fields->grid_dimension[2], &idx_range.i_start, &idx_range.i_end, &idx_range.jp1, &idx_range.kp1, +// kcr_buf.data[CollisionalRxnLUT::k1], kcr_buf.data[CollisionalRxnLUT::k2], kcr_buf.data[CollisionalRxnLUT::k3], kcr_buf.data[CollisionalRxnLUT::k4], kcr_buf.data[CollisionalRxnLUT::k5], kcr_buf.data[CollisionalRxnLUT::k6], kcr_buf.data[CollisionalRxnLUT::k7], kcr_buf.data[CollisionalRxnLUT::k8], kcr_buf.data[CollisionalRxnLUT::k9], kcr_buf.data[CollisionalRxnLUT::k10], kcr_buf.data[CollisionalRxnLUT::k11], +// kcr_buf.data[CollisionalRxnLUT::k12], kcr_buf.data[CollisionalRxnLUT::k13], kcr_buf.data[CollisionalRxnLUT::k14], kcr_buf.data[CollisionalRxnLUT::k15], kcr_buf.data[CollisionalRxnLUT::k16], kcr_buf.data[CollisionalRxnLUT::k17], kcr_buf.data[CollisionalRxnLUT::k18], kcr_buf.data[CollisionalRxnLUT::k19], kcr_buf.data[CollisionalRxnLUT::k22], +// &my_uvb_rates.k24, &my_uvb_rates.k25, &my_uvb_rates.k26, &my_uvb_rates.k27, &my_uvb_rates.k28, &my_uvb_rates.k29, &my_uvb_rates.k30, +// kcr_buf.data[CollisionalRxnLUT::k50], kcr_buf.data[CollisionalRxnLUT::k51], kcr_buf.data[CollisionalRxnLUT::k52], kcr_buf.data[CollisionalRxnLUT::k53], kcr_buf.data[CollisionalRxnLUT::k54], kcr_buf.data[CollisionalRxnLUT::k55], kcr_buf.data[CollisionalRxnLUT::k56], kcr_buf.data[CollisionalRxnLUT::k57], kcr_buf.data[CollisionalRxnLUT::k58], +// h2dust, chemheatrates_buf.n_cr_n, chemheatrates_buf.n_cr_d1, chemheatrates_buf.n_cr_d2, rhoH, +// kshield_buf.k24, kshield_buf.k25, kshield_buf.k26, +// kshield_buf.k28, kshield_buf.k29, kshield_buf.k30, kshield_buf.k31, +// &my_chemistry->use_radiative_transfer, &my_chemistry->radiative_transfer_hydrogen_only, +// my_fields->RT_HI_ionization_rate, my_fields->RT_HeI_ionization_rate, my_fields->RT_HeII_ionization_rate, +// itmask, edot, &chunit, &dom, my_fields->metal_density, +// my_fields->HDI_density, &my_chemistry->metal_chemistry, my_fields->CI_density, my_fields->OI_density, my_fields->OH_density, my_fields->CO_density, my_fields->H2O_density, +// &my_chemistry->radiative_transfer_HDI_dissociation, my_fields->RT_HDI_dissociation_rate, &my_chemistry->radiative_transfer_metal_ionization, my_fields->RT_CI_ionization_rate, my_fields->RT_OI_ionization_rate, +// &my_chemistry->radiative_transfer_metal_dissociation, my_fields->RT_CO_dissociation_rate, my_fields->RT_OH_dissociation_rate, my_fields->RT_H2O_dissociation_rate +// ); +// } /// Uses one linearly implicit Gauss-Seidel sweep of a backward-Euler time /// integrator to advance the rate equations by one (sub-)cycle (dtit). diff --git a/src/clib/rate_timestep_g.cpp b/src/clib/rate_timestep_g.cpp new file mode 100644 index 000000000..7d75bd8c1 --- /dev/null +++ b/src/clib/rate_timestep_g.cpp @@ -0,0 +1,321 @@ +//===----------------------------------------------------------------------===// +// +// See the LICENSE file for license and copyright information +// SPDX-License-Identifier: NCSA AND BSD-3-Clause +// +//===----------------------------------------------------------------------===// +/// +/// @file +/// Implements the rate_timestep_g function +/// +//===----------------------------------------------------------------------===// + +// This file was initially generated automatically during conversion of the +// rate_timestep_g function from FORTRAN to C++ + +#include +#include + +#include "grackle.h" +#include "fortran_func_decls.h" +#include "index_helper.h" +#include "LUT.hpp" +#include "utils-cpp.hpp" + +#include "rate_timestep_g.hpp" + +namespace grackle::impl { + +void rate_timestep_g( + double* dedot, double* HIdot, gr_mask_type anydust, double* h2dust, + double* rhoH, gr_mask_type* itmask, double* edot, double chunit, double dom, + chemistry_data* my_chemistry, grackle_field_data* my_fields, + photo_rate_storage my_uvb_rates, IndexRange idx_range, + grackle::impl::CollisionalRxnRateCollection kcr_buf, + grackle::impl::PhotoRxnRateCollection kshield_buf, + grackle::impl::ChemHeatingRates chemheatrates_buf +) +{ + + + // Density fields + + grackle::impl::View de(my_fields->e_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View HI(my_fields->HI_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View HII(my_fields->HII_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View HeI(my_fields->HeI_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View HeII(my_fields->HeII_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View HeIII(my_fields->HeIII_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View d(my_fields->density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View HM(my_fields->HM_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View H2I(my_fields->H2I_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View H2II(my_fields->H2II_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View metal(my_fields->metal_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + + // Radiative Transfer Fields + grackle::impl::View kphHI(my_fields->RT_HI_ionization_rate, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View kphHeI(my_fields->RT_HeI_ionization_rate, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View kphHeII(my_fields->RT_HeII_ionization_rate, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + + grackle::impl::View HDI(my_fields->HDI_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + + grackle::impl::View CI(my_fields->CI_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View OI(my_fields->OI_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View OH(my_fields->OH_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View H2O(my_fields->H2O_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + + grackle::impl::View kdissHDI(my_fields->RT_HDI_dissociation_rate, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View kphCI(my_fields->RT_CI_ionization_rate, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View kphOI(my_fields->RT_OI_ionization_rate, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View kdissOH(my_fields->RT_OH_dissociation_rate, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View kdissH2O(my_fields->RT_H2O_dissociation_rate, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + + // locals + + int i; + double H2dmag, atten, tau; + std::vector h2heatfac(my_fields->grid_dimension[0]); + std::vector H2delta(my_fields->grid_dimension[0]); + + // Debug + int i_max; + gr_float d_max; + + if (my_chemistry->primordial_chemistry == 1) { + + for (i = idx_range.i_start; i<=idx_range.i_end; i++) { + if (itmask[i] != MASK_FALSE) { + // Compute the electron density rate-of-change + + dedot[i] = + + kcr_buf.data[CollisionalRxnLUT::k1][i]*HI(i,idx_range.jp1-1,idx_range.kp1-1)*de(i,idx_range.jp1-1,idx_range.kp1-1) + + kcr_buf.data[CollisionalRxnLUT::k3][i]*HeI(i,idx_range.jp1-1,idx_range.kp1-1)*de(i,idx_range.jp1-1,idx_range.kp1-1)/4. + + kcr_buf.data[CollisionalRxnLUT::k5][i]*HeII(i,idx_range.jp1-1,idx_range.kp1-1)*de(i,idx_range.jp1-1,idx_range.kp1-1)/4. + - kcr_buf.data[CollisionalRxnLUT::k2][i]*HII(i,idx_range.jp1-1,idx_range.kp1-1)*de(i,idx_range.jp1-1,idx_range.kp1-1) + - kcr_buf.data[CollisionalRxnLUT::k4][i]*HeII(i,idx_range.jp1-1,idx_range.kp1-1)*de(i,idx_range.jp1-1,idx_range.kp1-1)/4. + - kcr_buf.data[CollisionalRxnLUT::k6][i]*HeIII(i,idx_range.jp1-1,idx_range.kp1-1)*de(i,idx_range.jp1-1,idx_range.kp1-1)/4. + + kcr_buf.data[CollisionalRxnLUT::k57][i]*HI(i,idx_range.jp1-1,idx_range.kp1-1)*HI(i,idx_range.jp1-1,idx_range.kp1-1) + + kcr_buf.data[CollisionalRxnLUT::k58][i]*HI(i,idx_range.jp1-1,idx_range.kp1-1)*HeI(i,idx_range.jp1-1,idx_range.kp1-1)/4. + + ( kshield_buf.k24[i]*HI(i,idx_range.jp1-1,idx_range.kp1-1) + + kshield_buf.k25[i]*HeII(i,idx_range.jp1-1,idx_range.kp1-1)/4. + + kshield_buf.k26[i]*HeI(i,idx_range.jp1-1,idx_range.kp1-1)/4.); + + // Compute the HI density rate-of-change + + HIdot[i] = + - kcr_buf.data[CollisionalRxnLUT::k1][i]*HI(i,idx_range.jp1-1,idx_range.kp1-1)*de(i,idx_range.jp1-1,idx_range.kp1-1) + + kcr_buf.data[CollisionalRxnLUT::k2][i]*HII(i,idx_range.jp1-1,idx_range.kp1-1)*de(i,idx_range.jp1-1,idx_range.kp1-1) + - kcr_buf.data[CollisionalRxnLUT::k57][i]*HI(i,idx_range.jp1-1,idx_range.kp1-1)*HI(i,idx_range.jp1-1,idx_range.kp1-1) + - kcr_buf.data[CollisionalRxnLUT::k58][i]*HI(i,idx_range.jp1-1,idx_range.kp1-1)*HeI(i,idx_range.jp1-1,idx_range.kp1-1)/4. + - kshield_buf.k24[i]*HI(i,idx_range.jp1-1,idx_range.kp1-1); + + } + } + } else { + + // Include molecular hydrogen rates for HIdot + + for (i = idx_range.i_start; i<=idx_range.i_end; i++) { + if (itmask[i] != MASK_FALSE) { + HIdot[i] = + - kcr_buf.data[CollisionalRxnLUT::k1][i] *de(i,idx_range.jp1-1,idx_range.kp1-1) *HI(i,idx_range.jp1-1,idx_range.kp1-1) + - kcr_buf.data[CollisionalRxnLUT::k7][i] *de(i,idx_range.jp1-1,idx_range.kp1-1) *HI(i,idx_range.jp1-1,idx_range.kp1-1) + - kcr_buf.data[CollisionalRxnLUT::k8][i] *HM(i,idx_range.jp1-1,idx_range.kp1-1) *HI(i,idx_range.jp1-1,idx_range.kp1-1) + - kcr_buf.data[CollisionalRxnLUT::k9][i] *HII(i,idx_range.jp1-1,idx_range.kp1-1) *HI(i,idx_range.jp1-1,idx_range.kp1-1) + - kcr_buf.data[CollisionalRxnLUT::k10][i]*H2II(i,idx_range.jp1-1,idx_range.kp1-1) *HI(i,idx_range.jp1-1,idx_range.kp1-1)/2. + - 2.*kcr_buf.data[CollisionalRxnLUT::k22][i]*std::pow(HI(i,idx_range.jp1-1,idx_range.kp1-1),2) *HI(i,idx_range.jp1-1,idx_range.kp1-1) + + kcr_buf.data[CollisionalRxnLUT::k2][i] *HII(i,idx_range.jp1-1,idx_range.kp1-1) *de(i,idx_range.jp1-1,idx_range.kp1-1) + + 2.*kcr_buf.data[CollisionalRxnLUT::k13][i]*HI(i,idx_range.jp1-1,idx_range.kp1-1) *H2I(i,idx_range.jp1-1,idx_range.kp1-1)/2. + + kcr_buf.data[CollisionalRxnLUT::k11][i]*HII(i,idx_range.jp1-1,idx_range.kp1-1) *H2I(i,idx_range.jp1-1,idx_range.kp1-1)/2. + + 2.*kcr_buf.data[CollisionalRxnLUT::k12][i]*de(i,idx_range.jp1-1,idx_range.kp1-1) *H2I(i,idx_range.jp1-1,idx_range.kp1-1)/2. + + kcr_buf.data[CollisionalRxnLUT::k14][i]*HM(i,idx_range.jp1-1,idx_range.kp1-1) *de(i,idx_range.jp1-1,idx_range.kp1-1) + + kcr_buf.data[CollisionalRxnLUT::k15][i]*HM(i,idx_range.jp1-1,idx_range.kp1-1) *HI(i,idx_range.jp1-1,idx_range.kp1-1) + + 2.*kcr_buf.data[CollisionalRxnLUT::k16][i]*HM(i,idx_range.jp1-1,idx_range.kp1-1) *HII(i,idx_range.jp1-1,idx_range.kp1-1) + + 2.*kcr_buf.data[CollisionalRxnLUT::k18][i]*H2II(i,idx_range.jp1-1,idx_range.kp1-1) *de(i,idx_range.jp1-1,idx_range.kp1-1)/2. + + kcr_buf.data[CollisionalRxnLUT::k19][i]*H2II(i,idx_range.jp1-1,idx_range.kp1-1) *HM(i,idx_range.jp1-1,idx_range.kp1-1)/2. + - kcr_buf.data[CollisionalRxnLUT::k57][i]*HI(i,idx_range.jp1-1,idx_range.kp1-1) *HI(i,idx_range.jp1-1,idx_range.kp1-1) + - kcr_buf.data[CollisionalRxnLUT::k58][i]*HI(i,idx_range.jp1-1,idx_range.kp1-1) *HeI(i,idx_range.jp1-1,idx_range.kp1-1)/4. + - kshield_buf.k24[i]*HI(i,idx_range.jp1-1,idx_range.kp1-1) + + 2.0*kshield_buf.k31[i] * H2I(i,idx_range.jp1-1,idx_range.kp1-1)/2.0; + + // Add H2 formation on dust grains + + if (anydust != MASK_FALSE) { + if (metal(i,idx_range.jp1-1,idx_range.kp1-1) > 1.e-9 * d(i,idx_range.jp1-1,idx_range.kp1-1)) { + HIdot[i] = HIdot[i] + - 2. * h2dust[i] * rhoH[i] * HI(i,idx_range.jp1-1,idx_range.kp1-1); + } + } + + // Compute the electron density rate-of-change + + dedot[i] = + + kcr_buf.data[CollisionalRxnLUT::k1][i] * HI(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1) + + kcr_buf.data[CollisionalRxnLUT::k3][i] * HeI(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1)/4. + + kcr_buf.data[CollisionalRxnLUT::k5][i] * HeII(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1)/4. + + kcr_buf.data[CollisionalRxnLUT::k8][i] * HM(i,idx_range.jp1-1,idx_range.kp1-1) * HI(i,idx_range.jp1-1,idx_range.kp1-1) + + kcr_buf.data[CollisionalRxnLUT::k15][i]* HM(i,idx_range.jp1-1,idx_range.kp1-1) * HI(i,idx_range.jp1-1,idx_range.kp1-1) + + kcr_buf.data[CollisionalRxnLUT::k17][i]* HM(i,idx_range.jp1-1,idx_range.kp1-1) * HII(i,idx_range.jp1-1,idx_range.kp1-1) + + kcr_buf.data[CollisionalRxnLUT::k14][i]* HM(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1) + - kcr_buf.data[CollisionalRxnLUT::k2][i] * HII(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1) + - kcr_buf.data[CollisionalRxnLUT::k4][i] * HeII(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1)/4. + - kcr_buf.data[CollisionalRxnLUT::k6][i] * HeIII(i,idx_range.jp1-1,idx_range.kp1-1)* de(i,idx_range.jp1-1,idx_range.kp1-1)/4. + - kcr_buf.data[CollisionalRxnLUT::k7][i] * HI(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1) + - kcr_buf.data[CollisionalRxnLUT::k18][i]* H2II(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1)/2. + + kcr_buf.data[CollisionalRxnLUT::k57][i]* HI(i,idx_range.jp1-1,idx_range.kp1-1) * HI(i,idx_range.jp1-1,idx_range.kp1-1) + + kcr_buf.data[CollisionalRxnLUT::k58][i]* HI(i,idx_range.jp1-1,idx_range.kp1-1) * HeI(i,idx_range.jp1-1,idx_range.kp1-1)/4. + + (kshield_buf.k24[i]*HI(i,idx_range.jp1-1,idx_range.kp1-1) + + kshield_buf.k25[i]*HeII(i,idx_range.jp1-1,idx_range.kp1-1)/4. + + kshield_buf.k26[i]*HeI(i,idx_range.jp1-1,idx_range.kp1-1)/4.); + + // HII, HeII, HeIII recombination heating + + edot[i] = edot[i] - chunit * ( + 13.6*( kcr_buf.data[CollisionalRxnLUT::k1][i] * HI(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1) + - kcr_buf.data[CollisionalRxnLUT::k2][i] * HII(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1) ) + + 24.6*( kcr_buf.data[CollisionalRxnLUT::k3][i] * HeI(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1)/4. + - kcr_buf.data[CollisionalRxnLUT::k4][i] * HeII(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1)/4. ) + + 79.0*( kcr_buf.data[CollisionalRxnLUT::k5][i] * HeII(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1)/4. + - kcr_buf.data[CollisionalRxnLUT::k6][i] * HeIII(i,idx_range.jp1-1,idx_range.kp1-1)* de(i,idx_range.jp1-1,idx_range.kp1-1)/4. ) + ); + + // H2 formation heating + + // Equation 23 from Omukai (2000) + h2heatfac[i] = std::pow((1. + (chemheatrates_buf.n_cr_n[i] / (dom * + (HI(i,idx_range.jp1-1,idx_range.kp1-1) * chemheatrates_buf.n_cr_d1[i] + + H2I(i,idx_range.jp1-1,idx_range.kp1-1) * 0.5 * chemheatrates_buf.n_cr_d2[i])))),(-1.)); + + // We only want to apply this if the formation dominates, but we + // need to apply it outside the delta calculation. + + H2delta[i] = + HI(i,idx_range.jp1-1,idx_range.kp1-1) * + ( (3.53 * kcr_buf.data[CollisionalRxnLUT::k8] [i] * HM(i,idx_range.jp1-1,idx_range.kp1-1) + + 4.48 * kcr_buf.data[CollisionalRxnLUT::k22][i] * std::pow(HI(i,idx_range.jp1-1,idx_range.kp1-1),2.)) + * h2heatfac[i] + - 4.48 * kcr_buf.data[CollisionalRxnLUT::k13][i] * H2I(i,idx_range.jp1-1,idx_range.kp1-1)/2.); + // ! corrected by GC 202002 + + // ! if(H2delta(i).gt.0._DKIND) then + // ! H2delta(i) = H2delta(i) * h2heatfac(i) + // ! endif + + + if (anydust != MASK_FALSE) { + if (metal(i,idx_range.jp1-1,idx_range.kp1-1) > 1.e-9 * d(i,idx_range.jp1-1,idx_range.kp1-1)) { + H2delta[i] = H2delta[i] + + h2dust[i] * HI(i,idx_range.jp1-1,idx_range.kp1-1) * rhoH[i] * + (0.2 + 4.2 * h2heatfac[i]); + } + } + + // H2dmag = abs(H2delta)/( + // & HI(i,j,k)*( k22(i) * HI(i,j,k)**2._DKIND + // & + k13(i) * H2I(i,j,k)/2._DKIND)) + // tau = (H2dmag/1e-5_DKIND)**-1.0_DKIND + // tau = max(tau, 1.e-5_DKIND) + // atten = min((1.-exp(-tau))/tau,1._DKIND) + atten = 1.; + edot[i] = edot[i] + chunit * H2delta[i] * atten; + // & + H2I(i,j,k)*( k21(i) * HI(i,j,k)**2.0_DKIND + // & - k23(i) * H2I(i,j,k)) + // H * (k22 * H^2 - k13 * H_2) + H_2 * (k21 * H^2 - k23 * H_2) */ + } + } + + // !!!! output cooling rate for debug + // d_max = 0._DKIND + // do i = is+1, ie+1 + // if (itmask(i)) then + // if (d(i,j,k) .gt. d_max) then + // i_max = i + // d_max = d(i,j,k) + // endif + // endif + // enddo + + // if (d_max * dom .gt. 1.e9_DKIND) then + //- open(11,file='nH.dat',status='unknown',form='formatted' + //- & , access='append' + //- & ) + //- do i = is+1, ie+1 + //- if (itmask(i)) then + //- write(11,'(6E13.5)') + //- & d(i,j,k)*dom + //- & , chunit * H2delta(i) * atten / d(i,j,k) + //- & , 3.53_DKIND * k8 (i) * HM(i,j,k) * HI(i,j,k) + //- & * h2heatfac(i) * chunit / d(i,j,k) + //- & , 4.48_DKIND * k22(i) * HI(i,j,k)**2._DKIND * HI(i,j,k) + //- & * h2heatfac(i) * chunit / d(i,j,k) + //- & ,-4.48_DKIND * k13(i) * H2I(i,j,k)/2._DKIND * HI(i,j,k) + //- & *chunit / d(i,j,k) + //- & ,(0.2_DKIND + 4.2_DKIND * h2heatfac(i)) * h2dust(i) + //- & * HI(i,j,k) * rhoH(i) * chunit / d(i,j,k) + //- endif + //- enddo + //- close(11) + // endif + + // if (d_max * dom .gt. 1.e11_DKIND) then + // stop + // endif + + + } + + // Add photo-ionization rates if needed + + if (my_chemistry->use_radiative_transfer == 1) { + if (my_chemistry->radiative_transfer_hydrogen_only == 0) { + for (i = idx_range.i_start; i<=idx_range.i_end; i++) { + if (itmask[i] != MASK_FALSE) { + HIdot[i] = HIdot[i] - kphHI(i,idx_range.jp1-1,idx_range.kp1-1)*HI(i,idx_range.jp1-1,idx_range.kp1-1); + dedot[i] = dedot[i] + kphHI(i,idx_range.jp1-1,idx_range.kp1-1)*HI(i,idx_range.jp1-1,idx_range.kp1-1) + + kphHeI(i,idx_range.jp1-1,idx_range.kp1-1) * HeI(i,idx_range.jp1-1,idx_range.kp1-1) / 4. + + kphHeII(i,idx_range.jp1-1,idx_range.kp1-1) * HeII(i,idx_range.jp1-1,idx_range.kp1-1) / 4.; + } + } + } else { + for (i = idx_range.i_start; i<=idx_range.i_end; i++) { + if (itmask[i] != MASK_FALSE) { + HIdot[i] = HIdot[i] - kphHI(i,idx_range.jp1-1,idx_range.kp1-1)*HI(i,idx_range.jp1-1,idx_range.kp1-1); + dedot[i] = dedot[i] + kphHI(i,idx_range.jp1-1,idx_range.kp1-1)*HI(i,idx_range.jp1-1,idx_range.kp1-1); + } + } + } + if ((my_chemistry->primordial_chemistry > 2) && (my_chemistry->radiative_transfer_HDI_dissociation > 0)) { + for (i = idx_range.i_start; i<=idx_range.i_end; i++) { + if (itmask[i] != MASK_FALSE) { + HIdot[i] = HIdot[i] + + kdissHDI(i,idx_range.jp1-1,idx_range.kp1-1) * HDI(i,idx_range.jp1-1,idx_range.kp1-1)/3.0; + } + } + } + if ((my_chemistry->metal_chemistry > 0) && (my_chemistry->radiative_transfer_metal_ionization > 0)) { + for (i = idx_range.i_start; i<=idx_range.i_end; i++) { + if (itmask[i] != MASK_FALSE) { + dedot[i] = dedot[i] + + kphCI(i,idx_range.jp1-1,idx_range.kp1-1) * CI(i,idx_range.jp1-1,idx_range.kp1-1)/12.0 + + kphOI(i,idx_range.jp1-1,idx_range.kp1-1) * OI(i,idx_range.jp1-1,idx_range.kp1-1)/16.0; + } + } + } + if ((my_chemistry->metal_chemistry > 0) && (my_chemistry->radiative_transfer_metal_dissociation > 0)) { + for (i = idx_range.i_start; i<=idx_range.i_end; i++) { + if (itmask[i] != MASK_FALSE) { + HIdot[i] = HIdot[i] + + kdissOH (i,idx_range.jp1-1,idx_range.kp1-1) * OH(i,idx_range.jp1-1,idx_range.kp1-1) /17.0 + + kdissH2O(i,idx_range.jp1-1,idx_range.kp1-1) * H2O(i,idx_range.jp1-1,idx_range.kp1-1)/18.0; + } + } + } + } + + + + + return; +} + +} // namespace grackle::impl diff --git a/src/clib/rate_timestep_g.hpp b/src/clib/rate_timestep_g.hpp new file mode 100644 index 000000000..9dbb02460 --- /dev/null +++ b/src/clib/rate_timestep_g.hpp @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// See the LICENSE file for license and copyright information +// SPDX-License-Identifier: NCSA AND BSD-3-Clause +// +//===----------------------------------------------------------------------===// +/// +/// @file +/// Declares signature of the rate_timestep_g function +/// +//===----------------------------------------------------------------------===// + +// This file was initially generated automatically during conversion of the +// rate_timestep_g function from FORTRAN to C++ + +#ifndef RATE_TIMESTEP_H +#define RATE_TIMESTEP_H + +#include "grackle.h" // gr_float +#include "fortran_func_decls.h" // gr_mask_int +#include "internal_types.hpp" + +namespace grackle::impl { + +void rate_timestep_g( + double* dedot, double* HIdot, gr_mask_type anydust, double* h2dust, + double* rhoH, gr_mask_type* itmask, double* edot, double chunit, double dom, + chemistry_data* my_chemistry, grackle_field_data* my_fields, + photo_rate_storage my_uvb_rates, IndexRange idx_range, + grackle::impl::CollisionalRxnRateCollection kcr_buf, + grackle::impl::PhotoRxnRateCollection kshield_buf, + grackle::impl::ChemHeatingRates chemheatrates_buf +); + +} // namespace grackle::impl + +#endif /* RATE_TIMESTEP_H */ diff --git a/src/clib/solve_rate_cool_g-cpp.cpp b/src/clib/solve_rate_cool_g-cpp.cpp index 2c5d03bf7..a0f156486 100644 --- a/src/clib/solve_rate_cool_g-cpp.cpp +++ b/src/clib/solve_rate_cool_g-cpp.cpp @@ -30,6 +30,7 @@ #include "visitor/memory.hpp" #include "ceiling_species.hpp" +#include "rate_timestep_g.hpp" #include "scale_fields_g-cpp.h" #include "solve_rate_cool_g-cpp.h" @@ -824,10 +825,10 @@ int solve_rate_cool_g( // Compute dedot and HIdot, the rates of change of de and HI // (should add itmask to this call) - f_wrap::rate_timestep_g( - spsolvbuf.dedot, spsolvbuf.HIdot, anydust, idx_range, - spsolvbuf.h2dust, rhoH.data(), itmask.data(), edot.data(), - chunit, dom, my_chemistry, my_fields, *my_uvb_rates, + grackle::impl::rate_timestep_g( + spsolvbuf.dedot, spsolvbuf.HIdot, anydust, spsolvbuf.h2dust, + rhoH.data(), itmask.data(), edot.data(), + chunit, dom, my_chemistry, my_fields, *my_uvb_rates, idx_range, spsolvbuf.kcr_buf, spsolvbuf.kshield_buf, spsolvbuf.chemheatrates_buf ); diff --git a/src/clib/solve_rate_cool_g.F b/src/clib/solve_rate_cool_g.F index cfbc200be..14fd26924 100644 --- a/src/clib/solve_rate_cool_g.F +++ b/src/clib/solve_rate_cool_g.F @@ -1634,324 +1634,6 @@ subroutine lookup_cool_rates1d_g(temstart, temend, nratec, j, k, !#endif #endif /* USE_DENSITY_DEPENDENT_H2_DISSOCIATION_RATE */ - return - end - -! ------------------------------------------------------------------- -! This routine calculates the electron and HI rates of change in -! order to determine the maximum permitted timestep - - subroutine rate_timestep_g( - & dedot, HIdot, ispecies, anydust, - & de, HI, HII, HeI, HeII, HeIII, d, - & HM, H2I, H2II, - & in, jn, kn, is, ie, j, k, - & k1, k2, k3, k4, k5, k6, k7, k8, k9, k10, k11, - & k12, k13, k14, k15, k16, k17, k18, k19, k22, - & k24, k25, k26, k27, k28, k29, k30, - & k50, k51, k52, k53, k54, k55, k56, k57, k58, - & h2dust, ncrn, ncrd1, ncrd2, rhoH, - & k24shield, k25shield, k26shield, - & k28shield, k29shield, k30shield, k31shield, - & iradtrans, irt_honly, - & kphHI, kphHeI, kphHeII, - & itmask, edot, chunit, dom, metal - & , HDI, imchem, CI, OI, OH, CO, H2O - & , idissHDI, kdissHDI, iionZ, kphCI, kphOI - & , idissZ, kdissCO, kdissOH, kdissH2O - & ) - -! ------------------------------------------------------------------- - - implicit NONE -#include "grackle_fortran_types.def" - -! arguments - - integer ispecies, is, ie, j, k, in, jn, kn, - & iradtrans, irt_honly - real*8 dedot(in), HIdot(in), dom - real*8 edot(in) - MASK_TYPE itmask(in), anydust - -! Density fields - - R_PREC de(in,jn,kn), HI(in,jn,kn), HII(in,jn,kn), - & HeI(in,jn,kn), HeII(in,jn,kn), HeIII(in,jn,kn), - & d(in,jn,kn), - & HM(in,jn,kn), H2I(in,jn,kn), H2II(in,jn,kn) - R_PREC metal(in,jn,kn) - -! Radiative Transfer Fields - R_PREC kphHI(in,jn,kn), kphHeI(in,jn,kn), kphHeII(in,jn,kn) - - R_PREC HDI(in,jn,kn) - integer imchem - R_PREC CI(in,jn,kn), OI(in,jn,kn), - & CO(in,jn,kn), OH(in,jn,kn), H2O(in,jn,kn) - integer idissHDI, iionZ, idissZ - R_PREC kdissHDI(in,jn,kn), kphCI(in,jn,kn), kphOI(in,jn,kn), - & kdissCO(in,jn,kn), kdissOH(in,jn,kn), kdissH2O(in,jn,kn) - - real*8 chunit - -! Rate values - - real*8 k1 (in), k2 (in), k3 (in), k4 (in), k5 (in), - & k6 (in), k7 (in), k8 (in), k9 (in), k10(in), - & k11(in), k12(in), k13(in), k14(in), k15(in), - & k16(in), k17(in), k18(in), k19(in), k22(in), - & k50(in), k51(in), k52(in), k53(in), k54(in), - & k55(in), k56(in), k57(in), k58(in), h2dust(in), - & ncrn(in), ncrd1(in), ncrd2(in), rhoH(in), - & k24shield(in), k25shield(in), k26shield(in), - & k28shield(in), k29shield(in), k30shield(in), - & k31shield(in), - & k24, k25, k26, k27, k28, k29, k30 - -! locals - - integer i - real*8 h2heatfac(in), H2delta(in), H2dmag, atten, tau - -! Debug - integer i_max - R_PREC d_max - - if (ispecies .eq. 1) then - - do i = is+1, ie+1 - if (itmask(i) .ne. MASK_FALSE) then -! Compute the electron density rate-of-change - - dedot(i) = - & + k1(i)*HI(i,j,k)*de(i,j,k) - & + k3(i)*HeI(i,j,k)*de(i,j,k)/4._DKIND - & + k5(i)*HeII(i,j,k)*de(i,j,k)/4._DKIND - & - k2(i)*HII(i,j,k)*de(i,j,k) - & - k4(i)*HeII(i,j,k)*de(i,j,k)/4._DKIND - & - k6(i)*HeIII(i,j,k)*de(i,j,k)/4._DKIND - & + k57(i)*HI(i,j,k)*HI(i,j,k) - & + k58(i)*HI(i,j,k)*HeI(i,j,k)/4._DKIND - & + ( k24shield(i)*HI(i,j,k) - & + k25shield(i)*HeII(i,j,k)/4._DKIND - & + k26shield(i)*HeI(i,j,k)/4._DKIND) - -! Compute the HI density rate-of-change - - HIdot(i) = - & - k1(i)*HI(i,j,k)*de(i,j,k) - & + k2(i)*HII(i,j,k)*de(i,j,k) - & - k57(i)*HI(i,j,k)*HI(i,j,k) - & - k58(i)*HI(i,j,k)*HeI(i,j,k)/4._DKIND - & - k24shield(i)*HI(i,j,k) - - endif ! itmask - enddo - else - -! Include molecular hydrogen rates for HIdot - - do i = is+1, ie+1 - if (itmask(i) .ne. MASK_FALSE) then - HIdot(i) = - & - k1(i) *de(i,j,k) *HI(i,j,k) - & - k7(i) *de(i,j,k) *HI(i,j,k) - & - k8(i) *HM(i,j,k) *HI(i,j,k) - & - k9(i) *HII(i,j,k) *HI(i,j,k) - & - k10(i)*H2II(i,j,k) *HI(i,j,k)/2._DKIND - & - 2._DKIND*k22(i)*HI(i,j,k)**2 *HI(i,j,k) - & + k2(i) *HII(i,j,k) *de(i,j,k) - & + 2._DKIND*k13(i)*HI(i,j,k) *H2I(i,j,k)/2._DKIND - & + k11(i)*HII(i,j,k) *H2I(i,j,k)/2._DKIND - & + 2._DKIND*k12(i)*de(i,j,k) *H2I(i,j,k)/2._DKIND - & + k14(i)*HM(i,j,k) *de(i,j,k) - & + k15(i)*HM(i,j,k) *HI(i,j,k) - & + 2._DKIND*k16(i)*HM(i,j,k) *HII(i,j,k) - & + 2._DKIND*k18(i)*H2II(i,j,k) *de(i,j,k)/2._DKIND - & + k19(i)*H2II(i,j,k) *HM(i,j,k)/2._DKIND - & - k57(i)*HI(i,j,k) *HI(i,j,k) - & - k58(i)*HI(i,j,k) *HeI(i,j,k)/4._DKIND - & - k24shield(i)*HI(i,j,k) - & + 2.0_DKIND*k31shield(i) * H2I(i,j,k)/2.0_DKIND - -! Add H2 formation on dust grains - - if (anydust .ne. MASK_FALSE) then - if (metal(i,j,k) .gt. 1.e-9_DKIND * d(i,j,k)) then - HIdot(i) = HIdot(i) - & - 2._DKIND * h2dust(i) * rhoH(i) * HI(i,j,k) - endif ! correct GC20200701 - endif - -! Compute the electron density rate-of-change - - dedot(i) = - & + k1(i) * HI(i,j,k) * de(i,j,k) - & + k3(i) * HeI(i,j,k) * de(i,j,k)/4._DKIND - & + k5(i) * HeII(i,j,k) * de(i,j,k)/4._DKIND - & + k8(i) * HM(i,j,k) * HI(i,j,k) - & + k15(i)* HM(i,j,k) * HI(i,j,k) - & + k17(i)* HM(i,j,k) * HII(i,j,k) - & + k14(i)* HM(i,j,k) * de(i,j,k) - & - k2(i) * HII(i,j,k) * de(i,j,k) - & - k4(i) * HeII(i,j,k) * de(i,j,k)/4._DKIND - & - k6(i) * HeIII(i,j,k)* de(i,j,k)/4._DKIND - & - k7(i) * HI(i,j,k) * de(i,j,k) - & - k18(i)* H2II(i,j,k) * de(i,j,k)/2._DKIND - & + k57(i)* HI(i,j,k) * HI(i,j,k) - & + k58(i)* HI(i,j,k) * HeI(i,j,k)/4._DKIND - & + (k24shield(i)*HI(i,j,k) - & + k25shield(i)*HeII(i,j,k)/4._DKIND - & + k26shield(i)*HeI(i,j,k)/4._DKIND) - -! HII, HeII, HeIII recombination heating - - edot(i) = edot(i) - chunit * ( - & 13.6_DKIND*( k1(i) * HI(i,j,k) * de(i,j,k) - & - k2(i) * HII(i,j,k) * de(i,j,k) ) - & + 24.6_DKIND*( k3(i) * HeI(i,j,k) * de(i,j,k)/4._DKIND - & - k4(i) * HeII(i,j,k) * de(i,j,k)/4._DKIND ) - & + 79.0_DKIND*( k5(i) * HeII(i,j,k) * de(i,j,k)/4._DKIND - & - k6(i) * HeIII(i,j,k)* de(i,j,k)/4._DKIND ) - & ) - -! H2 formation heating - -! Equation 23 from Omukai (2000) - h2heatfac(i) = (1._DKIND + (ncrn(i) / (dom * - & (HI(i,j,k) * ncrd1(i) + - & H2I(i,j,k) * 0.5_DKIND * ncrd2(i)))))**(-1._DKIND) - - ! We only want to apply this if the formation dominates, but we - ! need to apply it outside the delta calculation. - - H2delta(i) = - & HI(i,j,k) * - & ( (3.53_DKIND * k8 (i) * HM(i,j,k) - & + 4.48_DKIND * k22(i) * HI(i,j,k)**2._DKIND) - & * h2heatfac(i) - & - 4.48_DKIND * k13(i) * H2I(i,j,k)/2._DKIND) - !! corrected by GC 202002 - -!! if(H2delta(i).gt.0._DKIND) then -!! H2delta(i) = H2delta(i) * h2heatfac(i) -!! endif - - - if (anydust .ne. MASK_FALSE) then - if (metal(i,j,k) .gt. 1.e-9_DKIND * d(i,j,k)) then - H2delta(i) = H2delta(i) + - & h2dust(i) * HI(i,j,k) * rhoH(i) * - & (0.2_DKIND + 4.2_DKIND * h2heatfac(i)) - endif - endif - -! H2dmag = abs(H2delta)/( -! & HI(i,j,k)*( k22(i) * HI(i,j,k)**2._DKIND -! & + k13(i) * H2I(i,j,k)/2._DKIND)) -! tau = (H2dmag/1e-5_DKIND)**-1.0_DKIND -! tau = max(tau, 1.e-5_DKIND) -! atten = min((1.-exp(-tau))/tau,1._DKIND) - atten = 1._DKIND - edot(i) = edot(i) + chunit * H2delta(i) * atten -! & + H2I(i,j,k)*( k21(i) * HI(i,j,k)**2.0_DKIND -! & - k23(i) * H2I(i,j,k)) -!H * (k22 * H^2 - k13 * H_2) + H_2 * (k21 * H^2 - k23 * H_2) */ - endif ! itmask - enddo - -!!!!! output cooling rate for debug -! d_max = 0._DKIND -! do i = is+1, ie+1 -! if (itmask(i)) then -! if (d(i,j,k) .gt. d_max) then -! i_max = i -! d_max = d(i,j,k) -! endif -! endif -! enddo - -! if (d_max * dom .gt. 1.e9_DKIND) then -C open(11,file='nH.dat',status='unknown',form='formatted' -C & , access='append' -C & ) -C do i = is+1, ie+1 -C if (itmask(i)) then -C write(11,'(6E13.5)') -C & d(i,j,k)*dom -C & , chunit * H2delta(i) * atten / d(i,j,k) -C & , 3.53_DKIND * k8 (i) * HM(i,j,k) * HI(i,j,k) -C & * h2heatfac(i) * chunit / d(i,j,k) -C & , 4.48_DKIND * k22(i) * HI(i,j,k)**2._DKIND * HI(i,j,k) -C & * h2heatfac(i) * chunit / d(i,j,k) -C & ,-4.48_DKIND * k13(i) * H2I(i,j,k)/2._DKIND * HI(i,j,k) -C & *chunit / d(i,j,k) -C & ,(0.2_DKIND + 4.2_DKIND * h2heatfac(i)) * h2dust(i) -C & * HI(i,j,k) * rhoH(i) * chunit / d(i,j,k) -C endif -C enddo -C close(11) -! endif - -! if (d_max * dom .gt. 1.e11_DKIND) then -! stop -! endif - - - endif - -! Add photo-ionization rates if needed - - if (iradtrans .eq. 1) then - if (irt_honly .eq. 0) then - do i = is+1, ie+1 - if (itmask(i) .ne. MASK_FALSE) then - HIdot(i) = HIdot(i) - kphHI(i,j,k)*HI(i,j,k) - dedot(i) = dedot(i) + kphHI(i,j,k)*HI(i,j,k) - & + kphHeI(i,j,k) * HeI(i,j,k) / 4._DKIND - & + kphHeII(i,j,k) * HeII(i,j,k) / 4._DKIND - endif - enddo - else - do i = is+1, ie+1 - if (itmask(i) .ne. MASK_FALSE) then - HIdot(i) = HIdot(i) - kphHI(i,j,k)*HI(i,j,k) - dedot(i) = dedot(i) + kphHI(i,j,k)*HI(i,j,k) - endif - enddo - endif - if ((ispecies .gt. 2).and.(idissHDI .gt. 0)) then - do i = is+1, ie+1 - if (itmask(i) .ne. MASK_FALSE) then - HIdot(i) = HIdot(i) - & + kdissHDI(i,j,k) * HDI(i,j,k)/3.0_DKIND - endif - enddo - endif - if ((imchem .gt. 0).and.(iionZ .gt. 0)) then - do i = is+1, ie+1 - if (itmask(i) .ne. MASK_FALSE) then - dedot(i) = dedot(i) - & + kphCI(i,j,k) * CI(i,j,k)/12.0_DKIND - & + kphOI(i,j,k) * OI(i,j,k)/16.0_DKIND - endif - enddo - endif - if ((imchem .gt. 0).and.(idissZ .gt. 0)) then - do i = is+1, ie+1 - if (itmask(i) .ne. MASK_FALSE) then - HIdot(i) = HIdot(i) - & + kdissOH (i,j,k) * OH(i,j,k) /17.0_DKIND - & + kdissH2O(i,j,k) * H2O(i,j,k)/18.0_DKIND - endif - enddo - endif - endif - - - - return end diff --git a/src/clib/time_deriv_0d.hpp b/src/clib/time_deriv_0d.hpp index d22cc8b85..12a55e54a 100644 --- a/src/clib/time_deriv_0d.hpp +++ b/src/clib/time_deriv_0d.hpp @@ -13,6 +13,7 @@ #include "grackle_macros.h" // GRACKLE_FREE #include "index_helper.h" #include "internal_types.hpp" +#include "rate_timestep_g.hpp" #include "utils-field.hpp" // we choose to adopt a longer, more descriptive namespace here so that the @@ -509,16 +510,18 @@ void derivatives( // edot if (pack.local_edot_handling == 1) { - f_wrap::rate_timestep_g( + grackle::impl::rate_timestep_g( pack.other_scratch_buf.dedot, pack.other_scratch_buf.HIdot, - pack.fwd_args.anydust, pack.idx_range_1_element, - pack.other_scratch_buf.h2dust, pack.other_scratch_buf.rhoH, - pack.other_scratch_buf.itmask, pack.other_scratch_buf.edot, - pack.fwd_args.chunit, pack.fwd_args.dom, my_chemistry, &pack.fields, - my_uvb_rates, pack.main_scratch_buf.kcr_buf, + pack.fwd_args.anydust, pack.other_scratch_buf.h2dust, + pack.other_scratch_buf.rhoH, pack.other_scratch_buf.itmask, + pack.other_scratch_buf.edot, pack.fwd_args.chunit, + pack.fwd_args.dom, my_chemistry, &pack.fields, + my_uvb_rates, pack.idx_range_1_element, + pack.main_scratch_buf.kcr_buf, pack.main_scratch_buf.kshield_buf, pack.main_scratch_buf.chemheatrates_buf ); + } // Heating/cooling rate (per unit volume -> gas mass) From 8b0ec0d008376ec05d30bb524c651eae9ff9f72b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 21 Oct 2025 13:42:12 +0000 Subject: [PATCH 02/31] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/clib/rate_timestep_g.cpp | 486 +++++++++++++++++++++++------------ src/clib/rate_timestep_g.hpp | 20 +- 2 files changed, 336 insertions(+), 170 deletions(-) diff --git a/src/clib/rate_timestep_g.cpp b/src/clib/rate_timestep_g.cpp index 7d75bd8c1..526d07ff5 100644 --- a/src/clib/rate_timestep_g.cpp +++ b/src/clib/rate_timestep_g.cpp @@ -26,49 +26,94 @@ namespace grackle::impl { -void rate_timestep_g( - double* dedot, double* HIdot, gr_mask_type anydust, double* h2dust, - double* rhoH, gr_mask_type* itmask, double* edot, double chunit, double dom, - chemistry_data* my_chemistry, grackle_field_data* my_fields, - photo_rate_storage my_uvb_rates, IndexRange idx_range, - grackle::impl::CollisionalRxnRateCollection kcr_buf, - grackle::impl::PhotoRxnRateCollection kshield_buf, - grackle::impl::ChemHeatingRates chemheatrates_buf -) -{ - - +void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, + double* h2dust, double* rhoH, gr_mask_type* itmask, + double* edot, double chunit, double dom, + chemistry_data* my_chemistry, + grackle_field_data* my_fields, + photo_rate_storage my_uvb_rates, IndexRange idx_range, + grackle::impl::CollisionalRxnRateCollection kcr_buf, + grackle::impl::PhotoRxnRateCollection kshield_buf, + grackle::impl::ChemHeatingRates chemheatrates_buf) { // Density fields - grackle::impl::View de(my_fields->e_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View HI(my_fields->HI_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View HII(my_fields->HII_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View HeI(my_fields->HeI_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View HeII(my_fields->HeII_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View HeIII(my_fields->HeIII_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View d(my_fields->density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View HM(my_fields->HM_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View H2I(my_fields->H2I_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View H2II(my_fields->H2II_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View metal(my_fields->metal_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View de( + my_fields->e_density, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View HI( + my_fields->HI_density, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View HII( + my_fields->HII_density, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View HeI( + my_fields->HeI_density, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View HeII( + my_fields->HeII_density, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View HeIII( + my_fields->HeIII_density, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View d( + my_fields->density, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View HM( + my_fields->HM_density, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View H2I( + my_fields->H2I_density, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View H2II( + my_fields->H2II_density, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View metal( + my_fields->metal_density, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); // Radiative Transfer Fields - grackle::impl::View kphHI(my_fields->RT_HI_ionization_rate, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View kphHeI(my_fields->RT_HeI_ionization_rate, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View kphHeII(my_fields->RT_HeII_ionization_rate, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - - grackle::impl::View HDI(my_fields->HDI_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - - grackle::impl::View CI(my_fields->CI_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View OI(my_fields->OI_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View OH(my_fields->OH_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View H2O(my_fields->H2O_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - - grackle::impl::View kdissHDI(my_fields->RT_HDI_dissociation_rate, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View kphCI(my_fields->RT_CI_ionization_rate, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View kphOI(my_fields->RT_OI_ionization_rate, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View kdissOH(my_fields->RT_OH_dissociation_rate, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View kdissH2O(my_fields->RT_H2O_dissociation_rate, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View kphHI( + my_fields->RT_HI_ionization_rate, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View kphHeI( + my_fields->RT_HeI_ionization_rate, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View kphHeII( + my_fields->RT_HeII_ionization_rate, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + + grackle::impl::View HDI( + my_fields->HDI_density, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + + grackle::impl::View CI( + my_fields->CI_density, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View OI( + my_fields->OI_density, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View OH( + my_fields->OH_density, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View H2O( + my_fields->H2O_density, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + + grackle::impl::View kdissHDI( + my_fields->RT_HDI_dissociation_rate, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View kphCI( + my_fields->RT_CI_ionization_rate, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View kphOI( + my_fields->RT_OI_ionization_rate, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View kdissOH( + my_fields->RT_OH_dissociation_rate, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); + grackle::impl::View kdissH2O( + my_fields->RT_H2O_dissociation_rate, my_fields->grid_dimension[0], + my_fields->grid_dimension[1], my_fields->grid_dimension[2]); // locals @@ -81,132 +126,243 @@ void rate_timestep_g( int i_max; gr_float d_max; - if (my_chemistry->primordial_chemistry == 1) { - - for (i = idx_range.i_start; i<=idx_range.i_end; i++) { - if (itmask[i] != MASK_FALSE) { + if (my_chemistry->primordial_chemistry == 1) { + for (i = idx_range.i_start; i <= idx_range.i_end; i++) { + if (itmask[i] != MASK_FALSE) { // Compute the electron density rate-of-change dedot[i] = - + kcr_buf.data[CollisionalRxnLUT::k1][i]*HI(i,idx_range.jp1-1,idx_range.kp1-1)*de(i,idx_range.jp1-1,idx_range.kp1-1) - + kcr_buf.data[CollisionalRxnLUT::k3][i]*HeI(i,idx_range.jp1-1,idx_range.kp1-1)*de(i,idx_range.jp1-1,idx_range.kp1-1)/4. - + kcr_buf.data[CollisionalRxnLUT::k5][i]*HeII(i,idx_range.jp1-1,idx_range.kp1-1)*de(i,idx_range.jp1-1,idx_range.kp1-1)/4. - - kcr_buf.data[CollisionalRxnLUT::k2][i]*HII(i,idx_range.jp1-1,idx_range.kp1-1)*de(i,idx_range.jp1-1,idx_range.kp1-1) - - kcr_buf.data[CollisionalRxnLUT::k4][i]*HeII(i,idx_range.jp1-1,idx_range.kp1-1)*de(i,idx_range.jp1-1,idx_range.kp1-1)/4. - - kcr_buf.data[CollisionalRxnLUT::k6][i]*HeIII(i,idx_range.jp1-1,idx_range.kp1-1)*de(i,idx_range.jp1-1,idx_range.kp1-1)/4. - + kcr_buf.data[CollisionalRxnLUT::k57][i]*HI(i,idx_range.jp1-1,idx_range.kp1-1)*HI(i,idx_range.jp1-1,idx_range.kp1-1) - + kcr_buf.data[CollisionalRxnLUT::k58][i]*HI(i,idx_range.jp1-1,idx_range.kp1-1)*HeI(i,idx_range.jp1-1,idx_range.kp1-1)/4. - + ( kshield_buf.k24[i]*HI(i,idx_range.jp1-1,idx_range.kp1-1) - + kshield_buf.k25[i]*HeII(i,idx_range.jp1-1,idx_range.kp1-1)/4. - + kshield_buf.k26[i]*HeI(i,idx_range.jp1-1,idx_range.kp1-1)/4.); + +kcr_buf.data[CollisionalRxnLUT::k1][i] * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + kcr_buf.data[CollisionalRxnLUT::k3][i] * + HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. + + kcr_buf.data[CollisionalRxnLUT::k5][i] * + HeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. - + kcr_buf.data[CollisionalRxnLUT::k2][i] * + HII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + kcr_buf.data[CollisionalRxnLUT::k4][i] * + HeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. - + kcr_buf.data[CollisionalRxnLUT::k6][i] * + HeIII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. + + kcr_buf.data[CollisionalRxnLUT::k57][i] * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + kcr_buf.data[CollisionalRxnLUT::k58][i] * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. + + (kshield_buf.k24[i] * HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + kshield_buf.k25[i] * + HeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. + + kshield_buf.k26[i] * HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / + 4.); // Compute the HI density rate-of-change HIdot[i] = - - kcr_buf.data[CollisionalRxnLUT::k1][i]*HI(i,idx_range.jp1-1,idx_range.kp1-1)*de(i,idx_range.jp1-1,idx_range.kp1-1) - + kcr_buf.data[CollisionalRxnLUT::k2][i]*HII(i,idx_range.jp1-1,idx_range.kp1-1)*de(i,idx_range.jp1-1,idx_range.kp1-1) - - kcr_buf.data[CollisionalRxnLUT::k57][i]*HI(i,idx_range.jp1-1,idx_range.kp1-1)*HI(i,idx_range.jp1-1,idx_range.kp1-1) - - kcr_buf.data[CollisionalRxnLUT::k58][i]*HI(i,idx_range.jp1-1,idx_range.kp1-1)*HeI(i,idx_range.jp1-1,idx_range.kp1-1)/4. - - kshield_buf.k24[i]*HI(i,idx_range.jp1-1,idx_range.kp1-1); - + -kcr_buf.data[CollisionalRxnLUT::k1][i] * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + kcr_buf.data[CollisionalRxnLUT::k2][i] * + HII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + kcr_buf.data[CollisionalRxnLUT::k57][i] * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + kcr_buf.data[CollisionalRxnLUT::k58][i] * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. - + kshield_buf.k24[i] * HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1); } } } else { - // Include molecular hydrogen rates for HIdot - for (i = idx_range.i_start; i<=idx_range.i_end; i++) { - if (itmask[i] != MASK_FALSE) { + for (i = idx_range.i_start; i <= idx_range.i_end; i++) { + if (itmask[i] != MASK_FALSE) { HIdot[i] = - - kcr_buf.data[CollisionalRxnLUT::k1][i] *de(i,idx_range.jp1-1,idx_range.kp1-1) *HI(i,idx_range.jp1-1,idx_range.kp1-1) - - kcr_buf.data[CollisionalRxnLUT::k7][i] *de(i,idx_range.jp1-1,idx_range.kp1-1) *HI(i,idx_range.jp1-1,idx_range.kp1-1) - - kcr_buf.data[CollisionalRxnLUT::k8][i] *HM(i,idx_range.jp1-1,idx_range.kp1-1) *HI(i,idx_range.jp1-1,idx_range.kp1-1) - - kcr_buf.data[CollisionalRxnLUT::k9][i] *HII(i,idx_range.jp1-1,idx_range.kp1-1) *HI(i,idx_range.jp1-1,idx_range.kp1-1) - - kcr_buf.data[CollisionalRxnLUT::k10][i]*H2II(i,idx_range.jp1-1,idx_range.kp1-1) *HI(i,idx_range.jp1-1,idx_range.kp1-1)/2. - - 2.*kcr_buf.data[CollisionalRxnLUT::k22][i]*std::pow(HI(i,idx_range.jp1-1,idx_range.kp1-1),2) *HI(i,idx_range.jp1-1,idx_range.kp1-1) - + kcr_buf.data[CollisionalRxnLUT::k2][i] *HII(i,idx_range.jp1-1,idx_range.kp1-1) *de(i,idx_range.jp1-1,idx_range.kp1-1) - + 2.*kcr_buf.data[CollisionalRxnLUT::k13][i]*HI(i,idx_range.jp1-1,idx_range.kp1-1) *H2I(i,idx_range.jp1-1,idx_range.kp1-1)/2. - + kcr_buf.data[CollisionalRxnLUT::k11][i]*HII(i,idx_range.jp1-1,idx_range.kp1-1) *H2I(i,idx_range.jp1-1,idx_range.kp1-1)/2. - + 2.*kcr_buf.data[CollisionalRxnLUT::k12][i]*de(i,idx_range.jp1-1,idx_range.kp1-1) *H2I(i,idx_range.jp1-1,idx_range.kp1-1)/2. - + kcr_buf.data[CollisionalRxnLUT::k14][i]*HM(i,idx_range.jp1-1,idx_range.kp1-1) *de(i,idx_range.jp1-1,idx_range.kp1-1) - + kcr_buf.data[CollisionalRxnLUT::k15][i]*HM(i,idx_range.jp1-1,idx_range.kp1-1) *HI(i,idx_range.jp1-1,idx_range.kp1-1) - + 2.*kcr_buf.data[CollisionalRxnLUT::k16][i]*HM(i,idx_range.jp1-1,idx_range.kp1-1) *HII(i,idx_range.jp1-1,idx_range.kp1-1) - + 2.*kcr_buf.data[CollisionalRxnLUT::k18][i]*H2II(i,idx_range.jp1-1,idx_range.kp1-1) *de(i,idx_range.jp1-1,idx_range.kp1-1)/2. - + kcr_buf.data[CollisionalRxnLUT::k19][i]*H2II(i,idx_range.jp1-1,idx_range.kp1-1) *HM(i,idx_range.jp1-1,idx_range.kp1-1)/2. - - kcr_buf.data[CollisionalRxnLUT::k57][i]*HI(i,idx_range.jp1-1,idx_range.kp1-1) *HI(i,idx_range.jp1-1,idx_range.kp1-1) - - kcr_buf.data[CollisionalRxnLUT::k58][i]*HI(i,idx_range.jp1-1,idx_range.kp1-1) *HeI(i,idx_range.jp1-1,idx_range.kp1-1)/4. - - kshield_buf.k24[i]*HI(i,idx_range.jp1-1,idx_range.kp1-1) - + 2.0*kshield_buf.k31[i] * H2I(i,idx_range.jp1-1,idx_range.kp1-1)/2.0; + -kcr_buf.data[CollisionalRxnLUT::k1][i] * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + kcr_buf.data[CollisionalRxnLUT::k7][i] * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + kcr_buf.data[CollisionalRxnLUT::k8][i] * + HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + kcr_buf.data[CollisionalRxnLUT::k9][i] * + HII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + kcr_buf.data[CollisionalRxnLUT::k10][i] * + H2II(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 2. - + 2. * kcr_buf.data[CollisionalRxnLUT::k22][i] * + std::pow(HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1), 2) * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + kcr_buf.data[CollisionalRxnLUT::k2][i] * + HII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + 2. * kcr_buf.data[CollisionalRxnLUT::k13][i] * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + H2I(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 2. + + kcr_buf.data[CollisionalRxnLUT::k11][i] * + HII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + H2I(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 2. + + 2. * kcr_buf.data[CollisionalRxnLUT::k12][i] * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + H2I(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 2. + + kcr_buf.data[CollisionalRxnLUT::k14][i] * + HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + kcr_buf.data[CollisionalRxnLUT::k15][i] * + HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + 2. * kcr_buf.data[CollisionalRxnLUT::k16][i] * + HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + 2. * kcr_buf.data[CollisionalRxnLUT::k18][i] * + H2II(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 2. + + kcr_buf.data[CollisionalRxnLUT::k19][i] * + H2II(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 2. - + kcr_buf.data[CollisionalRxnLUT::k57][i] * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + kcr_buf.data[CollisionalRxnLUT::k58][i] * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. - + kshield_buf.k24[i] * HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + 2.0 * kshield_buf.k31[i] * + H2I(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 2.0; // Add H2 formation on dust grains - if (anydust != MASK_FALSE) { - if (metal(i,idx_range.jp1-1,idx_range.kp1-1) > 1.e-9 * d(i,idx_range.jp1-1,idx_range.kp1-1)) { - HIdot[i] = HIdot[i] - - 2. * h2dust[i] * rhoH[i] * HI(i,idx_range.jp1-1,idx_range.kp1-1); + if (anydust != MASK_FALSE) { + if (metal(i, idx_range.jp1 - 1, idx_range.kp1 - 1) > + 1.e-9 * d(i, idx_range.jp1 - 1, idx_range.kp1 - 1)) { + HIdot[i] = + HIdot[i] - 2. * h2dust[i] * rhoH[i] * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1); } } // Compute the electron density rate-of-change dedot[i] = - + kcr_buf.data[CollisionalRxnLUT::k1][i] * HI(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1) - + kcr_buf.data[CollisionalRxnLUT::k3][i] * HeI(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1)/4. - + kcr_buf.data[CollisionalRxnLUT::k5][i] * HeII(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1)/4. - + kcr_buf.data[CollisionalRxnLUT::k8][i] * HM(i,idx_range.jp1-1,idx_range.kp1-1) * HI(i,idx_range.jp1-1,idx_range.kp1-1) - + kcr_buf.data[CollisionalRxnLUT::k15][i]* HM(i,idx_range.jp1-1,idx_range.kp1-1) * HI(i,idx_range.jp1-1,idx_range.kp1-1) - + kcr_buf.data[CollisionalRxnLUT::k17][i]* HM(i,idx_range.jp1-1,idx_range.kp1-1) * HII(i,idx_range.jp1-1,idx_range.kp1-1) - + kcr_buf.data[CollisionalRxnLUT::k14][i]* HM(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1) - - kcr_buf.data[CollisionalRxnLUT::k2][i] * HII(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1) - - kcr_buf.data[CollisionalRxnLUT::k4][i] * HeII(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1)/4. - - kcr_buf.data[CollisionalRxnLUT::k6][i] * HeIII(i,idx_range.jp1-1,idx_range.kp1-1)* de(i,idx_range.jp1-1,idx_range.kp1-1)/4. - - kcr_buf.data[CollisionalRxnLUT::k7][i] * HI(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1) - - kcr_buf.data[CollisionalRxnLUT::k18][i]* H2II(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1)/2. - + kcr_buf.data[CollisionalRxnLUT::k57][i]* HI(i,idx_range.jp1-1,idx_range.kp1-1) * HI(i,idx_range.jp1-1,idx_range.kp1-1) - + kcr_buf.data[CollisionalRxnLUT::k58][i]* HI(i,idx_range.jp1-1,idx_range.kp1-1) * HeI(i,idx_range.jp1-1,idx_range.kp1-1)/4. - + (kshield_buf.k24[i]*HI(i,idx_range.jp1-1,idx_range.kp1-1) - + kshield_buf.k25[i]*HeII(i,idx_range.jp1-1,idx_range.kp1-1)/4. - + kshield_buf.k26[i]*HeI(i,idx_range.jp1-1,idx_range.kp1-1)/4.); + +kcr_buf.data[CollisionalRxnLUT::k1][i] * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + kcr_buf.data[CollisionalRxnLUT::k3][i] * + HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. + + kcr_buf.data[CollisionalRxnLUT::k5][i] * + HeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. + + kcr_buf.data[CollisionalRxnLUT::k8][i] * + HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + kcr_buf.data[CollisionalRxnLUT::k15][i] * + HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + kcr_buf.data[CollisionalRxnLUT::k17][i] * + HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + kcr_buf.data[CollisionalRxnLUT::k14][i] * + HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + kcr_buf.data[CollisionalRxnLUT::k2][i] * + HII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + kcr_buf.data[CollisionalRxnLUT::k4][i] * + HeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. - + kcr_buf.data[CollisionalRxnLUT::k6][i] * + HeIII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. - + kcr_buf.data[CollisionalRxnLUT::k7][i] * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + kcr_buf.data[CollisionalRxnLUT::k18][i] * + H2II(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 2. + + kcr_buf.data[CollisionalRxnLUT::k57][i] * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + kcr_buf.data[CollisionalRxnLUT::k58][i] * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. + + (kshield_buf.k24[i] * HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + kshield_buf.k25[i] * + HeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. + + kshield_buf.k26[i] * HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / + 4.); // HII, HeII, HeIII recombination heating - edot[i] = edot[i] - chunit * ( - 13.6*( kcr_buf.data[CollisionalRxnLUT::k1][i] * HI(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1) - - kcr_buf.data[CollisionalRxnLUT::k2][i] * HII(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1) ) - + 24.6*( kcr_buf.data[CollisionalRxnLUT::k3][i] * HeI(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1)/4. - - kcr_buf.data[CollisionalRxnLUT::k4][i] * HeII(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1)/4. ) - + 79.0*( kcr_buf.data[CollisionalRxnLUT::k5][i] * HeII(i,idx_range.jp1-1,idx_range.kp1-1) * de(i,idx_range.jp1-1,idx_range.kp1-1)/4. - - kcr_buf.data[CollisionalRxnLUT::k6][i] * HeIII(i,idx_range.jp1-1,idx_range.kp1-1)* de(i,idx_range.jp1-1,idx_range.kp1-1)/4. ) - ); + edot[i] = + edot[i] - + chunit * + (13.6 * (kcr_buf.data[CollisionalRxnLUT::k1][i] * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + kcr_buf.data[CollisionalRxnLUT::k2][i] * + HII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1)) + + 24.6 * (kcr_buf.data[CollisionalRxnLUT::k3][i] * + HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. - + kcr_buf.data[CollisionalRxnLUT::k4][i] * + HeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4.) + + 79.0 * (kcr_buf.data[CollisionalRxnLUT::k5][i] * + HeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. - + kcr_buf.data[CollisionalRxnLUT::k6][i] * + HeIII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4.)); // H2 formation heating // Equation 23 from Omukai (2000) - h2heatfac[i] = std::pow((1. + (chemheatrates_buf.n_cr_n[i] / (dom * - (HI(i,idx_range.jp1-1,idx_range.kp1-1) * chemheatrates_buf.n_cr_d1[i] + - H2I(i,idx_range.jp1-1,idx_range.kp1-1) * 0.5 * chemheatrates_buf.n_cr_d2[i])))),(-1.)); + h2heatfac[i] = std::pow( + (1. + (chemheatrates_buf.n_cr_n[i] / + (dom * (HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + chemheatrates_buf.n_cr_d1[i] + + H2I(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * 0.5 * + chemheatrates_buf.n_cr_d2[i])))), + (-1.)); // We only want to apply this if the formation dominates, but we // need to apply it outside the delta calculation. H2delta[i] = - HI(i,idx_range.jp1-1,idx_range.kp1-1) * - ( (3.53 * kcr_buf.data[CollisionalRxnLUT::k8] [i] * HM(i,idx_range.jp1-1,idx_range.kp1-1) - + 4.48 * kcr_buf.data[CollisionalRxnLUT::k22][i] * std::pow(HI(i,idx_range.jp1-1,idx_range.kp1-1),2.)) - * h2heatfac[i] - - 4.48 * kcr_buf.data[CollisionalRxnLUT::k13][i] * H2I(i,idx_range.jp1-1,idx_range.kp1-1)/2.); + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + ((3.53 * kcr_buf.data[CollisionalRxnLUT::k8][i] * + HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + 4.48 * kcr_buf.data[CollisionalRxnLUT::k22][i] * + std::pow(HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1), 2.)) * + h2heatfac[i] - + 4.48 * kcr_buf.data[CollisionalRxnLUT::k13][i] * + H2I(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 2.); // ! corrected by GC 202002 // ! if(H2delta(i).gt.0._DKIND) then // ! H2delta(i) = H2delta(i) * h2heatfac(i) // ! endif - - if (anydust != MASK_FALSE) { - if (metal(i,idx_range.jp1-1,idx_range.kp1-1) > 1.e-9 * d(i,idx_range.jp1-1,idx_range.kp1-1)) { - H2delta[i] = H2delta[i] + - h2dust[i] * HI(i,idx_range.jp1-1,idx_range.kp1-1) * rhoH[i] * - (0.2 + 4.2 * h2heatfac[i]); + if (anydust != MASK_FALSE) { + if (metal(i, idx_range.jp1 - 1, idx_range.kp1 - 1) > + 1.e-9 * d(i, idx_range.jp1 - 1, idx_range.kp1 - 1)) { + H2delta[i] = + H2delta[i] + h2dust[i] * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + rhoH[i] * (0.2 + 4.2 * h2heatfac[i]); } } @@ -260,62 +416,72 @@ void rate_timestep_g( // if (d_max * dom .gt. 1.e11_DKIND) then // stop // endif - - } // Add photo-ionization rates if needed - if (my_chemistry->use_radiative_transfer == 1) { - if (my_chemistry->radiative_transfer_hydrogen_only == 0) { - for (i = idx_range.i_start; i<=idx_range.i_end; i++) { - if (itmask[i] != MASK_FALSE) { - HIdot[i] = HIdot[i] - kphHI(i,idx_range.jp1-1,idx_range.kp1-1)*HI(i,idx_range.jp1-1,idx_range.kp1-1); - dedot[i] = dedot[i] + kphHI(i,idx_range.jp1-1,idx_range.kp1-1)*HI(i,idx_range.jp1-1,idx_range.kp1-1) - + kphHeI(i,idx_range.jp1-1,idx_range.kp1-1) * HeI(i,idx_range.jp1-1,idx_range.kp1-1) / 4. - + kphHeII(i,idx_range.jp1-1,idx_range.kp1-1) * HeII(i,idx_range.jp1-1,idx_range.kp1-1) / 4.; + if (my_chemistry->use_radiative_transfer == 1) { + if (my_chemistry->radiative_transfer_hydrogen_only == 0) { + for (i = idx_range.i_start; i <= idx_range.i_end; i++) { + if (itmask[i] != MASK_FALSE) { + HIdot[i] = HIdot[i] - kphHI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1); + dedot[i] = dedot[i] + + kphHI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + kphHeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. + + kphHeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4.; } } } else { - for (i = idx_range.i_start; i<=idx_range.i_end; i++) { - if (itmask[i] != MASK_FALSE) { - HIdot[i] = HIdot[i] - kphHI(i,idx_range.jp1-1,idx_range.kp1-1)*HI(i,idx_range.jp1-1,idx_range.kp1-1); - dedot[i] = dedot[i] + kphHI(i,idx_range.jp1-1,idx_range.kp1-1)*HI(i,idx_range.jp1-1,idx_range.kp1-1); + for (i = idx_range.i_start; i <= idx_range.i_end; i++) { + if (itmask[i] != MASK_FALSE) { + HIdot[i] = HIdot[i] - kphHI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1); + dedot[i] = dedot[i] + kphHI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1); } } } - if ((my_chemistry->primordial_chemistry > 2) && (my_chemistry->radiative_transfer_HDI_dissociation > 0)) { - for (i = idx_range.i_start; i<=idx_range.i_end; i++) { - if (itmask[i] != MASK_FALSE) { - HIdot[i] = HIdot[i] - + kdissHDI(i,idx_range.jp1-1,idx_range.kp1-1) * HDI(i,idx_range.jp1-1,idx_range.kp1-1)/3.0; + if ((my_chemistry->primordial_chemistry > 2) && + (my_chemistry->radiative_transfer_HDI_dissociation > 0)) { + for (i = idx_range.i_start; i <= idx_range.i_end; i++) { + if (itmask[i] != MASK_FALSE) { + HIdot[i] = + HIdot[i] + kdissHDI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HDI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 3.0; } } } - if ((my_chemistry->metal_chemistry > 0) && (my_chemistry->radiative_transfer_metal_ionization > 0)) { - for (i = idx_range.i_start; i<=idx_range.i_end; i++) { - if (itmask[i] != MASK_FALSE) { - dedot[i] = dedot[i] - + kphCI(i,idx_range.jp1-1,idx_range.kp1-1) * CI(i,idx_range.jp1-1,idx_range.kp1-1)/12.0 - + kphOI(i,idx_range.jp1-1,idx_range.kp1-1) * OI(i,idx_range.jp1-1,idx_range.kp1-1)/16.0; + if ((my_chemistry->metal_chemistry > 0) && + (my_chemistry->radiative_transfer_metal_ionization > 0)) { + for (i = idx_range.i_start; i <= idx_range.i_end; i++) { + if (itmask[i] != MASK_FALSE) { + dedot[i] = dedot[i] + + kphCI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + CI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 12.0 + + kphOI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + OI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 16.0; } } } - if ((my_chemistry->metal_chemistry > 0) && (my_chemistry->radiative_transfer_metal_dissociation > 0)) { - for (i = idx_range.i_start; i<=idx_range.i_end; i++) { - if (itmask[i] != MASK_FALSE) { - HIdot[i] = HIdot[i] - + kdissOH (i,idx_range.jp1-1,idx_range.kp1-1) * OH(i,idx_range.jp1-1,idx_range.kp1-1) /17.0 - + kdissH2O(i,idx_range.jp1-1,idx_range.kp1-1) * H2O(i,idx_range.jp1-1,idx_range.kp1-1)/18.0; + if ((my_chemistry->metal_chemistry > 0) && + (my_chemistry->radiative_transfer_metal_dissociation > 0)) { + for (i = idx_range.i_start; i <= idx_range.i_end; i++) { + if (itmask[i] != MASK_FALSE) { + HIdot[i] = HIdot[i] + + kdissOH(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + OH(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 17.0 + + kdissH2O(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + H2O(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 18.0; } } } } - - - return; } -} // namespace grackle::impl +} // namespace grackle::impl diff --git a/src/clib/rate_timestep_g.hpp b/src/clib/rate_timestep_g.hpp index 9dbb02460..26609c8a9 100644 --- a/src/clib/rate_timestep_g.hpp +++ b/src/clib/rate_timestep_g.hpp @@ -22,16 +22,16 @@ namespace grackle::impl { -void rate_timestep_g( - double* dedot, double* HIdot, gr_mask_type anydust, double* h2dust, - double* rhoH, gr_mask_type* itmask, double* edot, double chunit, double dom, - chemistry_data* my_chemistry, grackle_field_data* my_fields, - photo_rate_storage my_uvb_rates, IndexRange idx_range, - grackle::impl::CollisionalRxnRateCollection kcr_buf, - grackle::impl::PhotoRxnRateCollection kshield_buf, - grackle::impl::ChemHeatingRates chemheatrates_buf -); +void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, + double* h2dust, double* rhoH, gr_mask_type* itmask, + double* edot, double chunit, double dom, + chemistry_data* my_chemistry, + grackle_field_data* my_fields, + photo_rate_storage my_uvb_rates, IndexRange idx_range, + grackle::impl::CollisionalRxnRateCollection kcr_buf, + grackle::impl::PhotoRxnRateCollection kshield_buf, + grackle::impl::ChemHeatingRates chemheatrates_buf); -} // namespace grackle::impl +} // namespace grackle::impl #endif /* RATE_TIMESTEP_H */ From 2cb6e491ba7e24ee1b6e8ca9fa82077a4ad96955 Mon Sep 17 00:00:00 2001 From: ChristopherBignamini Date: Tue, 21 Oct 2025 15:48:03 +0200 Subject: [PATCH 03/31] Unused variables removed --- src/clib/rate_timestep_g.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/clib/rate_timestep_g.cpp b/src/clib/rate_timestep_g.cpp index 7d75bd8c1..45bac2744 100644 --- a/src/clib/rate_timestep_g.cpp +++ b/src/clib/rate_timestep_g.cpp @@ -73,14 +73,10 @@ void rate_timestep_g( // locals int i; - double H2dmag, atten, tau; + double atten; std::vector h2heatfac(my_fields->grid_dimension[0]); std::vector H2delta(my_fields->grid_dimension[0]); - // Debug - int i_max; - gr_float d_max; - if (my_chemistry->primordial_chemistry == 1) { for (i = idx_range.i_start; i<=idx_range.i_end; i++) { From 4f1309fd0b016baf10dd276ba0b340f27c0aa16a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 21 Oct 2025 13:50:34 +0000 Subject: [PATCH 04/31] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/clib/rate_timestep_g.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/clib/rate_timestep_g.cpp b/src/clib/rate_timestep_g.cpp index 3b489b0cf..db3eb9bea 100644 --- a/src/clib/rate_timestep_g.cpp +++ b/src/clib/rate_timestep_g.cpp @@ -122,7 +122,6 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, std::vector h2heatfac(my_fields->grid_dimension[0]); std::vector H2delta(my_fields->grid_dimension[0]); - if (my_chemistry->primordial_chemistry == 1) { for (i = idx_range.i_start; i <= idx_range.i_end; i++) { if (itmask[i] != MASK_FALSE) { From a78124e38a525d89a1f0cde45192af294aad33d8 Mon Sep 17 00:00:00 2001 From: ChristopherBignamini Date: Thu, 23 Oct 2025 10:26:08 +0200 Subject: [PATCH 05/31] Commented wrapper of rate_timestep_g removed --- src/clib/fortran_func_wrappers.hpp | 32 ------------------------------ 1 file changed, 32 deletions(-) diff --git a/src/clib/fortran_func_wrappers.hpp b/src/clib/fortran_func_wrappers.hpp index 0816721e2..f35e158bf 100644 --- a/src/clib/fortran_func_wrappers.hpp +++ b/src/clib/fortran_func_wrappers.hpp @@ -518,38 +518,6 @@ inline void make_consistent_g( ); } -// /// This routine calculates the electron and HI rates of change in order to -// /// determine the maximum permitted timestep -// inline void rate_timestep_g( -// double* dedot, double* HIdot, gr_mask_type anydust, IndexRange idx_range, -// double* h2dust, double* rhoH, gr_mask_type* itmask, double* edot, -// double chunit, double dom, chemistry_data* my_chemistry, -// grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, -// grackle::impl::CollisionalRxnRateCollection kcr_buf, -// grackle::impl::PhotoRxnRateCollection kshield_buf, -// grackle::impl::ChemHeatingRates chemheatrates_buf -// ) { -// FORTRAN_NAME(rate_timestep_g)( -// dedot, HIdot, &my_chemistry->primordial_chemistry, &anydust, -// my_fields->e_density, my_fields->HI_density, my_fields->HII_density, my_fields->HeI_density, my_fields->HeII_density, my_fields->HeIII_density, my_fields->density, -// my_fields->HM_density, my_fields->H2I_density, my_fields->H2II_density, -// &my_fields->grid_dimension[0], &my_fields->grid_dimension[1], &my_fields->grid_dimension[2], &idx_range.i_start, &idx_range.i_end, &idx_range.jp1, &idx_range.kp1, -// kcr_buf.data[CollisionalRxnLUT::k1], kcr_buf.data[CollisionalRxnLUT::k2], kcr_buf.data[CollisionalRxnLUT::k3], kcr_buf.data[CollisionalRxnLUT::k4], kcr_buf.data[CollisionalRxnLUT::k5], kcr_buf.data[CollisionalRxnLUT::k6], kcr_buf.data[CollisionalRxnLUT::k7], kcr_buf.data[CollisionalRxnLUT::k8], kcr_buf.data[CollisionalRxnLUT::k9], kcr_buf.data[CollisionalRxnLUT::k10], kcr_buf.data[CollisionalRxnLUT::k11], -// kcr_buf.data[CollisionalRxnLUT::k12], kcr_buf.data[CollisionalRxnLUT::k13], kcr_buf.data[CollisionalRxnLUT::k14], kcr_buf.data[CollisionalRxnLUT::k15], kcr_buf.data[CollisionalRxnLUT::k16], kcr_buf.data[CollisionalRxnLUT::k17], kcr_buf.data[CollisionalRxnLUT::k18], kcr_buf.data[CollisionalRxnLUT::k19], kcr_buf.data[CollisionalRxnLUT::k22], -// &my_uvb_rates.k24, &my_uvb_rates.k25, &my_uvb_rates.k26, &my_uvb_rates.k27, &my_uvb_rates.k28, &my_uvb_rates.k29, &my_uvb_rates.k30, -// kcr_buf.data[CollisionalRxnLUT::k50], kcr_buf.data[CollisionalRxnLUT::k51], kcr_buf.data[CollisionalRxnLUT::k52], kcr_buf.data[CollisionalRxnLUT::k53], kcr_buf.data[CollisionalRxnLUT::k54], kcr_buf.data[CollisionalRxnLUT::k55], kcr_buf.data[CollisionalRxnLUT::k56], kcr_buf.data[CollisionalRxnLUT::k57], kcr_buf.data[CollisionalRxnLUT::k58], -// h2dust, chemheatrates_buf.n_cr_n, chemheatrates_buf.n_cr_d1, chemheatrates_buf.n_cr_d2, rhoH, -// kshield_buf.k24, kshield_buf.k25, kshield_buf.k26, -// kshield_buf.k28, kshield_buf.k29, kshield_buf.k30, kshield_buf.k31, -// &my_chemistry->use_radiative_transfer, &my_chemistry->radiative_transfer_hydrogen_only, -// my_fields->RT_HI_ionization_rate, my_fields->RT_HeI_ionization_rate, my_fields->RT_HeII_ionization_rate, -// itmask, edot, &chunit, &dom, my_fields->metal_density, -// my_fields->HDI_density, &my_chemistry->metal_chemistry, my_fields->CI_density, my_fields->OI_density, my_fields->OH_density, my_fields->CO_density, my_fields->H2O_density, -// &my_chemistry->radiative_transfer_HDI_dissociation, my_fields->RT_HDI_dissociation_rate, &my_chemistry->radiative_transfer_metal_ionization, my_fields->RT_CI_ionization_rate, my_fields->RT_OI_ionization_rate, -// &my_chemistry->radiative_transfer_metal_dissociation, my_fields->RT_CO_dissociation_rate, my_fields->RT_OH_dissociation_rate, my_fields->RT_H2O_dissociation_rate -// ); -// } - /// Uses one linearly implicit Gauss-Seidel sweep of a backward-Euler time /// integrator to advance the rate equations by one (sub-)cycle (dtit). inline void step_rate_g( From ee8fe15ff16aa921d4110781f8432bc38a81e924 Mon Sep 17 00:00:00 2001 From: ChristopherBignamini Date: Thu, 23 Oct 2025 10:31:11 +0200 Subject: [PATCH 06/31] j/k indexing updated --- src/clib/rate_timestep_g.cpp | 282 +++++++++++++++++------------------ 1 file changed, 141 insertions(+), 141 deletions(-) diff --git a/src/clib/rate_timestep_g.cpp b/src/clib/rate_timestep_g.cpp index db3eb9bea..f1334256c 100644 --- a/src/clib/rate_timestep_g.cpp +++ b/src/clib/rate_timestep_g.cpp @@ -129,51 +129,51 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, dedot[i] = +kcr_buf.data[CollisionalRxnLUT::k1][i] * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + HI(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) + kcr_buf.data[CollisionalRxnLUT::k3][i] * - HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. + + HeI(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. + kcr_buf.data[CollisionalRxnLUT::k5][i] * - HeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. - + HeII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. - kcr_buf.data[CollisionalRxnLUT::k2][i] * - HII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + HII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) - kcr_buf.data[CollisionalRxnLUT::k4][i] * - HeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. - + HeII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. - kcr_buf.data[CollisionalRxnLUT::k6][i] * - HeIII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. + + HeIII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. + kcr_buf.data[CollisionalRxnLUT::k57][i] * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + HI(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) + kcr_buf.data[CollisionalRxnLUT::k58][i] * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. + - (kshield_buf.k24[i] * HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + HI(i, idx_range.j, idx_range.k) * + HeI(i, idx_range.j, idx_range.k) / 4. + + (kshield_buf.k24[i] * HI(i, idx_range.j, idx_range.k) + kshield_buf.k25[i] * - HeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. + - kshield_buf.k26[i] * HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / + HeII(i, idx_range.j, idx_range.k) / 4. + + kshield_buf.k26[i] * HeI(i, idx_range.j, idx_range.k) / 4.); // Compute the HI density rate-of-change HIdot[i] = -kcr_buf.data[CollisionalRxnLUT::k1][i] * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + HI(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) + kcr_buf.data[CollisionalRxnLUT::k2][i] * - HII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + HII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) - kcr_buf.data[CollisionalRxnLUT::k57][i] * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + HI(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) - kcr_buf.data[CollisionalRxnLUT::k58][i] * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. - - kshield_buf.k24[i] * HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1); + HI(i, idx_range.j, idx_range.k) * + HeI(i, idx_range.j, idx_range.k) / 4. - + kshield_buf.k24[i] * HI(i, idx_range.j, idx_range.k); } } } else { @@ -183,68 +183,68 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, if (itmask[i] != MASK_FALSE) { HIdot[i] = -kcr_buf.data[CollisionalRxnLUT::k1][i] * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + de(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) - kcr_buf.data[CollisionalRxnLUT::k7][i] * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + de(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) - kcr_buf.data[CollisionalRxnLUT::k8][i] * - HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + HM(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) - kcr_buf.data[CollisionalRxnLUT::k9][i] * - HII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + HII(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) - kcr_buf.data[CollisionalRxnLUT::k10][i] * - H2II(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 2. - + H2II(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) / 2. - 2. * kcr_buf.data[CollisionalRxnLUT::k22][i] * - std::pow(HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1), 2) * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + std::pow(HI(i, idx_range.j, idx_range.k), 2) * + HI(i, idx_range.j, idx_range.k) + kcr_buf.data[CollisionalRxnLUT::k2][i] * - HII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + HII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) + 2. * kcr_buf.data[CollisionalRxnLUT::k13][i] * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - H2I(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 2. + + HI(i, idx_range.j, idx_range.k) * + H2I(i, idx_range.j, idx_range.k) / 2. + kcr_buf.data[CollisionalRxnLUT::k11][i] * - HII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - H2I(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 2. + + HII(i, idx_range.j, idx_range.k) * + H2I(i, idx_range.j, idx_range.k) / 2. + 2. * kcr_buf.data[CollisionalRxnLUT::k12][i] * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - H2I(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 2. + + de(i, idx_range.j, idx_range.k) * + H2I(i, idx_range.j, idx_range.k) / 2. + kcr_buf.data[CollisionalRxnLUT::k14][i] * - HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + HM(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) + kcr_buf.data[CollisionalRxnLUT::k15][i] * - HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + HM(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) + 2. * kcr_buf.data[CollisionalRxnLUT::k16][i] * - HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + HM(i, idx_range.j, idx_range.k) * + HII(i, idx_range.j, idx_range.k) + 2. * kcr_buf.data[CollisionalRxnLUT::k18][i] * - H2II(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 2. + + H2II(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 2. + kcr_buf.data[CollisionalRxnLUT::k19][i] * - H2II(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 2. - + H2II(i, idx_range.j, idx_range.k) * + HM(i, idx_range.j, idx_range.k) / 2. - kcr_buf.data[CollisionalRxnLUT::k57][i] * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + HI(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) - kcr_buf.data[CollisionalRxnLUT::k58][i] * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. - - kshield_buf.k24[i] * HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + HI(i, idx_range.j, idx_range.k) * + HeI(i, idx_range.j, idx_range.k) / 4. - + kshield_buf.k24[i] * HI(i, idx_range.j, idx_range.k) + 2.0 * kshield_buf.k31[i] * - H2I(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 2.0; + H2I(i, idx_range.j, idx_range.k) / 2.0; // Add H2 formation on dust grains if (anydust != MASK_FALSE) { - if (metal(i, idx_range.jp1 - 1, idx_range.kp1 - 1) > - 1.e-9 * d(i, idx_range.jp1 - 1, idx_range.kp1 - 1)) { + if (metal(i, idx_range.j, idx_range.k) > + 1.e-9 * d(i, idx_range.j, idx_range.k)) { HIdot[i] = HIdot[i] - 2. * h2dust[i] * rhoH[i] * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1); + HI(i, idx_range.j, idx_range.k); } } @@ -252,51 +252,51 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, dedot[i] = +kcr_buf.data[CollisionalRxnLUT::k1][i] * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + HI(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) + kcr_buf.data[CollisionalRxnLUT::k3][i] * - HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. + + HeI(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. + kcr_buf.data[CollisionalRxnLUT::k5][i] * - HeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. + + HeII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. + kcr_buf.data[CollisionalRxnLUT::k8][i] * - HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + HM(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) + kcr_buf.data[CollisionalRxnLUT::k15][i] * - HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + HM(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) + kcr_buf.data[CollisionalRxnLUT::k17][i] * - HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + HM(i, idx_range.j, idx_range.k) * + HII(i, idx_range.j, idx_range.k) + kcr_buf.data[CollisionalRxnLUT::k14][i] * - HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + HM(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) - kcr_buf.data[CollisionalRxnLUT::k2][i] * - HII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + HII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) - kcr_buf.data[CollisionalRxnLUT::k4][i] * - HeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. - + HeII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. - kcr_buf.data[CollisionalRxnLUT::k6][i] * - HeIII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. - + HeIII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. - kcr_buf.data[CollisionalRxnLUT::k7][i] * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + HI(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) - kcr_buf.data[CollisionalRxnLUT::k18][i] * - H2II(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 2. + + H2II(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 2. + kcr_buf.data[CollisionalRxnLUT::k57][i] * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + HI(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) + kcr_buf.data[CollisionalRxnLUT::k58][i] * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. + - (kshield_buf.k24[i] * HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + HI(i, idx_range.j, idx_range.k) * + HeI(i, idx_range.j, idx_range.k) / 4. + + (kshield_buf.k24[i] * HI(i, idx_range.j, idx_range.k) + kshield_buf.k25[i] * - HeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. + - kshield_buf.k26[i] * HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / + HeII(i, idx_range.j, idx_range.k) / 4. + + kshield_buf.k26[i] * HeI(i, idx_range.j, idx_range.k) / 4.); // HII, HeII, HeIII recombination heating @@ -305,32 +305,32 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, edot[i] - chunit * (13.6 * (kcr_buf.data[CollisionalRxnLUT::k1][i] * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) - + HI(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) - kcr_buf.data[CollisionalRxnLUT::k2][i] * - HII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1)) + + HII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k)) + 24.6 * (kcr_buf.data[CollisionalRxnLUT::k3][i] * - HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. - + HeI(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. - kcr_buf.data[CollisionalRxnLUT::k4][i] * - HeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4.) + + HeII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4.) + 79.0 * (kcr_buf.data[CollisionalRxnLUT::k5][i] * - HeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. - + HeII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. - kcr_buf.data[CollisionalRxnLUT::k6][i] * - HeIII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - de(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4.)); + HeIII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4.)); // H2 formation heating // Equation 23 from Omukai (2000) h2heatfac[i] = std::pow( (1. + (chemheatrates_buf.n_cr_n[i] / - (dom * (HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + (dom * (HI(i, idx_range.j, idx_range.k) * chemheatrates_buf.n_cr_d1[i] + - H2I(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * 0.5 * + H2I(i, idx_range.j, idx_range.k) * 0.5 * chemheatrates_buf.n_cr_d2[i])))), (-1.)); @@ -338,14 +338,14 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, // need to apply it outside the delta calculation. H2delta[i] = - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HI(i, idx_range.j, idx_range.k) * ((3.53 * kcr_buf.data[CollisionalRxnLUT::k8][i] * - HM(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + + HM(i, idx_range.j, idx_range.k) + 4.48 * kcr_buf.data[CollisionalRxnLUT::k22][i] * - std::pow(HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1), 2.)) * + std::pow(HI(i, idx_range.j, idx_range.k), 2.)) * h2heatfac[i] - 4.48 * kcr_buf.data[CollisionalRxnLUT::k13][i] * - H2I(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 2.); + H2I(i, idx_range.j, idx_range.k) / 2.); // ! corrected by GC 202002 // ! if(H2delta(i).gt.0._DKIND) then @@ -353,11 +353,11 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, // ! endif if (anydust != MASK_FALSE) { - if (metal(i, idx_range.jp1 - 1, idx_range.kp1 - 1) > - 1.e-9 * d(i, idx_range.jp1 - 1, idx_range.kp1 - 1)) { + if (metal(i, idx_range.j, idx_range.k) > + 1.e-9 * d(i, idx_range.j, idx_range.k)) { H2delta[i] = H2delta[i] + h2dust[i] * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * + HI(i, idx_range.j, idx_range.k) * rhoH[i] * (0.2 + 4.2 * h2heatfac[i]); } } @@ -420,24 +420,24 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, if (my_chemistry->radiative_transfer_hydrogen_only == 0) { for (i = idx_range.i_start; i <= idx_range.i_end; i++) { if (itmask[i] != MASK_FALSE) { - HIdot[i] = HIdot[i] - kphHI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1); + HIdot[i] = HIdot[i] - kphHI(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k); dedot[i] = dedot[i] + - kphHI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) + - kphHeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HeI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4. + - kphHeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HeII(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 4.; + kphHI(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) + + kphHeI(i, idx_range.j, idx_range.k) * + HeI(i, idx_range.j, idx_range.k) / 4. + + kphHeII(i, idx_range.j, idx_range.k) * + HeII(i, idx_range.j, idx_range.k) / 4.; } } } else { for (i = idx_range.i_start; i <= idx_range.i_end; i++) { if (itmask[i] != MASK_FALSE) { - HIdot[i] = HIdot[i] - kphHI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1); - dedot[i] = dedot[i] + kphHI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HI(i, idx_range.jp1 - 1, idx_range.kp1 - 1); + HIdot[i] = HIdot[i] - kphHI(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k); + dedot[i] = dedot[i] + kphHI(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k); } } } @@ -446,8 +446,8 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, for (i = idx_range.i_start; i <= idx_range.i_end; i++) { if (itmask[i] != MASK_FALSE) { HIdot[i] = - HIdot[i] + kdissHDI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - HDI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 3.0; + HIdot[i] + kdissHDI(i, idx_range.j, idx_range.k) * + HDI(i, idx_range.j, idx_range.k) / 3.0; } } } @@ -456,10 +456,10 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, for (i = idx_range.i_start; i <= idx_range.i_end; i++) { if (itmask[i] != MASK_FALSE) { dedot[i] = dedot[i] + - kphCI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - CI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 12.0 + - kphOI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - OI(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 16.0; + kphCI(i, idx_range.j, idx_range.k) * + CI(i, idx_range.j, idx_range.k) / 12.0 + + kphOI(i, idx_range.j, idx_range.k) * + OI(i, idx_range.j, idx_range.k) / 16.0; } } } @@ -468,10 +468,10 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, for (i = idx_range.i_start; i <= idx_range.i_end; i++) { if (itmask[i] != MASK_FALSE) { HIdot[i] = HIdot[i] + - kdissOH(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - OH(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 17.0 + - kdissH2O(i, idx_range.jp1 - 1, idx_range.kp1 - 1) * - H2O(i, idx_range.jp1 - 1, idx_range.kp1 - 1) / 18.0; + kdissOH(i, idx_range.j, idx_range.k) * + OH(i, idx_range.j, idx_range.k) / 17.0 + + kdissH2O(i, idx_range.j, idx_range.k) * + H2O(i, idx_range.j, idx_range.k) / 18.0; } } } From 36660c766625b9be547eeade828f740bb063fd07 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 23 Oct 2025 08:32:57 +0000 Subject: [PATCH 07/31] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/clib/rate_timestep_g.cpp | 130 ++++++++++++++++------------------- 1 file changed, 59 insertions(+), 71 deletions(-) diff --git a/src/clib/rate_timestep_g.cpp b/src/clib/rate_timestep_g.cpp index f1334256c..010c1cd1c 100644 --- a/src/clib/rate_timestep_g.cpp +++ b/src/clib/rate_timestep_g.cpp @@ -153,27 +153,24 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, HI(i, idx_range.j, idx_range.k) * HeI(i, idx_range.j, idx_range.k) / 4. + (kshield_buf.k24[i] * HI(i, idx_range.j, idx_range.k) + - kshield_buf.k25[i] * - HeII(i, idx_range.j, idx_range.k) / 4. + - kshield_buf.k26[i] * HeI(i, idx_range.j, idx_range.k) / - 4.); + kshield_buf.k25[i] * HeII(i, idx_range.j, idx_range.k) / 4. + + kshield_buf.k26[i] * HeI(i, idx_range.j, idx_range.k) / 4.); // Compute the HI density rate-of-change - HIdot[i] = - -kcr_buf.data[CollisionalRxnLUT::k1][i] * - HI(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) + - kcr_buf.data[CollisionalRxnLUT::k2][i] * - HII(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) - - kcr_buf.data[CollisionalRxnLUT::k57][i] * - HI(i, idx_range.j, idx_range.k) * - HI(i, idx_range.j, idx_range.k) - - kcr_buf.data[CollisionalRxnLUT::k58][i] * - HI(i, idx_range.j, idx_range.k) * - HeI(i, idx_range.j, idx_range.k) / 4. - - kshield_buf.k24[i] * HI(i, idx_range.j, idx_range.k); + HIdot[i] = -kcr_buf.data[CollisionalRxnLUT::k1][i] * + HI(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) + + kcr_buf.data[CollisionalRxnLUT::k2][i] * + HII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) - + kcr_buf.data[CollisionalRxnLUT::k57][i] * + HI(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) - + kcr_buf.data[CollisionalRxnLUT::k58][i] * + HI(i, idx_range.j, idx_range.k) * + HeI(i, idx_range.j, idx_range.k) / 4. - + kshield_buf.k24[i] * HI(i, idx_range.j, idx_range.k); } } } else { @@ -234,17 +231,15 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, HI(i, idx_range.j, idx_range.k) * HeI(i, idx_range.j, idx_range.k) / 4. - kshield_buf.k24[i] * HI(i, idx_range.j, idx_range.k) + - 2.0 * kshield_buf.k31[i] * - H2I(i, idx_range.j, idx_range.k) / 2.0; + 2.0 * kshield_buf.k31[i] * H2I(i, idx_range.j, idx_range.k) / 2.0; // Add H2 formation on dust grains if (anydust != MASK_FALSE) { if (metal(i, idx_range.j, idx_range.k) > 1.e-9 * d(i, idx_range.j, idx_range.k)) { - HIdot[i] = - HIdot[i] - 2. * h2dust[i] * rhoH[i] * - HI(i, idx_range.j, idx_range.k); + HIdot[i] = HIdot[i] - 2. * h2dust[i] * rhoH[i] * + HI(i, idx_range.j, idx_range.k); } } @@ -294,58 +289,53 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, HI(i, idx_range.j, idx_range.k) * HeI(i, idx_range.j, idx_range.k) / 4. + (kshield_buf.k24[i] * HI(i, idx_range.j, idx_range.k) + - kshield_buf.k25[i] * - HeII(i, idx_range.j, idx_range.k) / 4. + - kshield_buf.k26[i] * HeI(i, idx_range.j, idx_range.k) / - 4.); + kshield_buf.k25[i] * HeII(i, idx_range.j, idx_range.k) / 4. + + kshield_buf.k26[i] * HeI(i, idx_range.j, idx_range.k) / 4.); // HII, HeII, HeIII recombination heating - edot[i] = - edot[i] - - chunit * - (13.6 * (kcr_buf.data[CollisionalRxnLUT::k1][i] * - HI(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) - - kcr_buf.data[CollisionalRxnLUT::k2][i] * - HII(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k)) + - 24.6 * (kcr_buf.data[CollisionalRxnLUT::k3][i] * - HeI(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) / 4. - - kcr_buf.data[CollisionalRxnLUT::k4][i] * - HeII(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) / 4.) + - 79.0 * (kcr_buf.data[CollisionalRxnLUT::k5][i] * - HeII(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) / 4. - - kcr_buf.data[CollisionalRxnLUT::k6][i] * - HeIII(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) / 4.)); + edot[i] = edot[i] - + chunit * (13.6 * (kcr_buf.data[CollisionalRxnLUT::k1][i] * + HI(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) - + kcr_buf.data[CollisionalRxnLUT::k2][i] * + HII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k)) + + 24.6 * (kcr_buf.data[CollisionalRxnLUT::k3][i] * + HeI(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. - + kcr_buf.data[CollisionalRxnLUT::k4][i] * + HeII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4.) + + 79.0 * (kcr_buf.data[CollisionalRxnLUT::k5][i] * + HeII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. - + kcr_buf.data[CollisionalRxnLUT::k6][i] * + HeIII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4.)); // H2 formation heating // Equation 23 from Omukai (2000) - h2heatfac[i] = std::pow( - (1. + (chemheatrates_buf.n_cr_n[i] / - (dom * (HI(i, idx_range.j, idx_range.k) * - chemheatrates_buf.n_cr_d1[i] + - H2I(i, idx_range.j, idx_range.k) * 0.5 * - chemheatrates_buf.n_cr_d2[i])))), - (-1.)); + h2heatfac[i] = + std::pow((1. + (chemheatrates_buf.n_cr_n[i] / + (dom * (HI(i, idx_range.j, idx_range.k) * + chemheatrates_buf.n_cr_d1[i] + + H2I(i, idx_range.j, idx_range.k) * 0.5 * + chemheatrates_buf.n_cr_d2[i])))), + (-1.)); // We only want to apply this if the formation dominates, but we // need to apply it outside the delta calculation. - H2delta[i] = - HI(i, idx_range.j, idx_range.k) * - ((3.53 * kcr_buf.data[CollisionalRxnLUT::k8][i] * - HM(i, idx_range.j, idx_range.k) + - 4.48 * kcr_buf.data[CollisionalRxnLUT::k22][i] * - std::pow(HI(i, idx_range.j, idx_range.k), 2.)) * - h2heatfac[i] - - 4.48 * kcr_buf.data[CollisionalRxnLUT::k13][i] * - H2I(i, idx_range.j, idx_range.k) / 2.); + H2delta[i] = HI(i, idx_range.j, idx_range.k) * + ((3.53 * kcr_buf.data[CollisionalRxnLUT::k8][i] * + HM(i, idx_range.j, idx_range.k) + + 4.48 * kcr_buf.data[CollisionalRxnLUT::k22][i] * + std::pow(HI(i, idx_range.j, idx_range.k), 2.)) * + h2heatfac[i] - + 4.48 * kcr_buf.data[CollisionalRxnLUT::k13][i] * + H2I(i, idx_range.j, idx_range.k) / 2.); // ! corrected by GC 202002 // ! if(H2delta(i).gt.0._DKIND) then @@ -355,10 +345,9 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, if (anydust != MASK_FALSE) { if (metal(i, idx_range.j, idx_range.k) > 1.e-9 * d(i, idx_range.j, idx_range.k)) { - H2delta[i] = - H2delta[i] + h2dust[i] * - HI(i, idx_range.j, idx_range.k) * - rhoH[i] * (0.2 + 4.2 * h2heatfac[i]); + H2delta[i] = H2delta[i] + h2dust[i] * + HI(i, idx_range.j, idx_range.k) * + rhoH[i] * (0.2 + 4.2 * h2heatfac[i]); } } @@ -445,9 +434,8 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, (my_chemistry->radiative_transfer_HDI_dissociation > 0)) { for (i = idx_range.i_start; i <= idx_range.i_end; i++) { if (itmask[i] != MASK_FALSE) { - HIdot[i] = - HIdot[i] + kdissHDI(i, idx_range.j, idx_range.k) * - HDI(i, idx_range.j, idx_range.k) / 3.0; + HIdot[i] = HIdot[i] + kdissHDI(i, idx_range.j, idx_range.k) * + HDI(i, idx_range.j, idx_range.k) / 3.0; } } } From 90d0b836428c7ebd7dc1632468b8844209d411bf Mon Sep 17 00:00:00 2001 From: Christopher Bignamini Date: Fri, 31 Oct 2025 16:29:50 +0100 Subject: [PATCH 08/31] Change include guards to use .hpp extension --- src/clib/rate_timestep_g.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/clib/rate_timestep_g.hpp b/src/clib/rate_timestep_g.hpp index 26609c8a9..05c130728 100644 --- a/src/clib/rate_timestep_g.hpp +++ b/src/clib/rate_timestep_g.hpp @@ -13,8 +13,8 @@ // This file was initially generated automatically during conversion of the // rate_timestep_g function from FORTRAN to C++ -#ifndef RATE_TIMESTEP_H -#define RATE_TIMESTEP_H +#ifndef RATE_TIMESTEP_HPP +#define RATE_TIMESTEP_HPP #include "grackle.h" // gr_float #include "fortran_func_decls.h" // gr_mask_int From e3c912c41f171e7a0a7cdbeed66c0ae17d565e07 Mon Sep 17 00:00:00 2001 From: ChristopherBignamini Date: Wed, 17 Dec 2025 17:28:01 +0100 Subject: [PATCH 09/31] Code cleanup --- src/clib/rate_timestep_g.cpp | 37 ------------------------------------ 1 file changed, 37 deletions(-) diff --git a/src/clib/rate_timestep_g.cpp b/src/clib/rate_timestep_g.cpp index 010c1cd1c..9941d5889 100644 --- a/src/clib/rate_timestep_g.cpp +++ b/src/clib/rate_timestep_g.cpp @@ -364,43 +364,6 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, // H * (k22 * H^2 - k13 * H_2) + H_2 * (k21 * H^2 - k23 * H_2) */ } } - - // !!!! output cooling rate for debug - // d_max = 0._DKIND - // do i = is+1, ie+1 - // if (itmask(i)) then - // if (d(i,j,k) .gt. d_max) then - // i_max = i - // d_max = d(i,j,k) - // endif - // endif - // enddo - - // if (d_max * dom .gt. 1.e9_DKIND) then - //- open(11,file='nH.dat',status='unknown',form='formatted' - //- & , access='append' - //- & ) - //- do i = is+1, ie+1 - //- if (itmask(i)) then - //- write(11,'(6E13.5)') - //- & d(i,j,k)*dom - //- & , chunit * H2delta(i) * atten / d(i,j,k) - //- & , 3.53_DKIND * k8 (i) * HM(i,j,k) * HI(i,j,k) - //- & * h2heatfac(i) * chunit / d(i,j,k) - //- & , 4.48_DKIND * k22(i) * HI(i,j,k)**2._DKIND * HI(i,j,k) - //- & * h2heatfac(i) * chunit / d(i,j,k) - //- & ,-4.48_DKIND * k13(i) * H2I(i,j,k)/2._DKIND * HI(i,j,k) - //- & *chunit / d(i,j,k) - //- & ,(0.2_DKIND + 4.2_DKIND * h2heatfac(i)) * h2dust(i) - //- & * HI(i,j,k) * rhoH(i) * chunit / d(i,j,k) - //- endif - //- enddo - //- close(11) - // endif - - // if (d_max * dom .gt. 1.e11_DKIND) then - // stop - // endif } // Add photo-ionization rates if needed From 0c5769dafcebde48bc98c4da77383022f8654361 Mon Sep 17 00:00:00 2001 From: ChristopherBignamini Date: Wed, 17 Dec 2025 17:43:48 +0100 Subject: [PATCH 10/31] const condition added to signature --- src/clib/rate_timestep_g.cpp | 2 +- src/clib/rate_timestep_g.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/clib/rate_timestep_g.cpp b/src/clib/rate_timestep_g.cpp index 9941d5889..5a26ab470 100644 --- a/src/clib/rate_timestep_g.cpp +++ b/src/clib/rate_timestep_g.cpp @@ -27,7 +27,7 @@ namespace grackle::impl { void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, - double* h2dust, double* rhoH, gr_mask_type* itmask, + const double* h2dust, const double* rhoH, const gr_mask_type* itmask, double* edot, double chunit, double dom, chemistry_data* my_chemistry, grackle_field_data* my_fields, diff --git a/src/clib/rate_timestep_g.hpp b/src/clib/rate_timestep_g.hpp index 05c130728..0c624cf88 100644 --- a/src/clib/rate_timestep_g.hpp +++ b/src/clib/rate_timestep_g.hpp @@ -23,7 +23,7 @@ namespace grackle::impl { void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, - double* h2dust, double* rhoH, gr_mask_type* itmask, + const double* h2dust, const double* rhoH, const gr_mask_type* itmask, double* edot, double chunit, double dom, chemistry_data* my_chemistry, grackle_field_data* my_fields, From 08494c1e87d283c2dd3c94602232e0f571f74a16 Mon Sep 17 00:00:00 2001 From: ChristopherBignamini Date: Wed, 17 Dec 2025 17:44:16 +0100 Subject: [PATCH 11/31] Unused namespace specification removed --- src/clib/solve_rate_cool_g-cpp.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/clib/solve_rate_cool_g-cpp.cpp b/src/clib/solve_rate_cool_g-cpp.cpp index 055bb12bb..50c985c20 100644 --- a/src/clib/solve_rate_cool_g-cpp.cpp +++ b/src/clib/solve_rate_cool_g-cpp.cpp @@ -643,8 +643,6 @@ int solve_rate_cool_g( grackle_field_data* my_fields, photo_rate_storage* my_uvb_rates ) { - // shorten `grackle::impl::fortran_wrapper` to `f_wrap` within this function - namespace f_wrap = ::grackle::impl::fortran_wrapper; #ifdef GRACKLE_FLOAT_4 const gr_float tolerance = (gr_float)(1.0e-05); From e5b8e3cedce527ca3f66235e620db60b5a6e6ad7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 17 Dec 2025 16:50:11 +0000 Subject: [PATCH 12/31] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/clib/rate_timestep_g.cpp | 6 +++--- src/clib/rate_timestep_g.hpp | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/clib/rate_timestep_g.cpp b/src/clib/rate_timestep_g.cpp index 5a26ab470..286cabd57 100644 --- a/src/clib/rate_timestep_g.cpp +++ b/src/clib/rate_timestep_g.cpp @@ -27,9 +27,9 @@ namespace grackle::impl { void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, - const double* h2dust, const double* rhoH, const gr_mask_type* itmask, - double* edot, double chunit, double dom, - chemistry_data* my_chemistry, + const double* h2dust, const double* rhoH, + const gr_mask_type* itmask, double* edot, double chunit, + double dom, chemistry_data* my_chemistry, grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, IndexRange idx_range, grackle::impl::CollisionalRxnRateCollection kcr_buf, diff --git a/src/clib/rate_timestep_g.hpp b/src/clib/rate_timestep_g.hpp index 0c624cf88..c557ad40e 100644 --- a/src/clib/rate_timestep_g.hpp +++ b/src/clib/rate_timestep_g.hpp @@ -23,9 +23,9 @@ namespace grackle::impl { void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, - const double* h2dust, const double* rhoH, const gr_mask_type* itmask, - double* edot, double chunit, double dom, - chemistry_data* my_chemistry, + const double* h2dust, const double* rhoH, + const gr_mask_type* itmask, double* edot, double chunit, + double dom, chemistry_data* my_chemistry, grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, IndexRange idx_range, grackle::impl::CollisionalRxnRateCollection kcr_buf, From 511087ef74ffa1ca61d6e675b57505f816da9fbb Mon Sep 17 00:00:00 2001 From: ChristopherBignamini Date: Fri, 19 Dec 2025 11:43:22 +0100 Subject: [PATCH 13/31] Unused input parameter (uvb rates) removed and documentation added --- src/clib/rate_timestep_g.cpp | 3 +-- src/clib/rate_timestep_g.hpp | 33 ++++++++++++++++++++++++++++-- src/clib/solve_rate_cool_g-cpp.cpp | 2 +- src/clib/time_deriv_0d.hpp | 10 ++++----- 4 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/clib/rate_timestep_g.cpp b/src/clib/rate_timestep_g.cpp index 5a26ab470..e6eebada4 100644 --- a/src/clib/rate_timestep_g.cpp +++ b/src/clib/rate_timestep_g.cpp @@ -30,8 +30,7 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, const double* h2dust, const double* rhoH, const gr_mask_type* itmask, double* edot, double chunit, double dom, chemistry_data* my_chemistry, - grackle_field_data* my_fields, - photo_rate_storage my_uvb_rates, IndexRange idx_range, + grackle_field_data* my_fields, IndexRange idx_range, grackle::impl::CollisionalRxnRateCollection kcr_buf, grackle::impl::PhotoRxnRateCollection kshield_buf, grackle::impl::ChemHeatingRates chemheatrates_buf) { diff --git a/src/clib/rate_timestep_g.hpp b/src/clib/rate_timestep_g.hpp index 0c624cf88..b406fac65 100644 --- a/src/clib/rate_timestep_g.hpp +++ b/src/clib/rate_timestep_g.hpp @@ -22,12 +22,41 @@ namespace grackle::impl { +/// Primarily computes the rate of change in the electron and HI mass densities +/// (so that they can be used to limit the max timestep) +/// +/// @todo +/// At the time of writing, this also updates edot with contributions from +/// HII, HeII, HeIII recombination heating and from H2 formation heating +/// (in the future, we should relocate this logic) +/// @param[in] dedot Time derivatives of free electron mass density +/// @param[in] HIdot Time derivatives of HI mass density +/// @param[in] anydust Indicates whether we are modelling dust +/// @param[in] h2dust Rate of H2 formation on dust grains +/// @param[in] rhoH Indicates the mass density of all Hydrogen +/// @param[in] itmask Specifies the `idx_range`'s iteration-mask for this +/// calculation +/// @param[in,out] edot Specifies the time derivative of internal energy +/// density for each location in `idx_range` +/// @param[in] chunit Conversion factor +/// @param[in] dom Unit conversion to proper number density in code units +/// @param[in] my_chemistry Holds a number of configuration parameters +/// @param[in] my_fields Specifies the field data +/// @param[in] idx_range Specifies the current index-range +/// @param[in] kcr_buf Holds various pre-computed chemical reaction rates for +/// each location in `idx_range`. +/// @param[in] kshield_buf Holds various pre-computed radiative reaction rates +/// @param[in] chemheatrates_buf Holds various pre-computed chemistry-heating rates +/// at each index-range location +/// @par History +/// written by: +/// modified1: November, 2025 by Christopher Bignamini & Matthew Abruzzo; C++ +/// port void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, const double* h2dust, const double* rhoH, const gr_mask_type* itmask, double* edot, double chunit, double dom, chemistry_data* my_chemistry, - grackle_field_data* my_fields, - photo_rate_storage my_uvb_rates, IndexRange idx_range, + grackle_field_data* my_fields, IndexRange idx_range, grackle::impl::CollisionalRxnRateCollection kcr_buf, grackle::impl::PhotoRxnRateCollection kshield_buf, grackle::impl::ChemHeatingRates chemheatrates_buf); diff --git a/src/clib/solve_rate_cool_g-cpp.cpp b/src/clib/solve_rate_cool_g-cpp.cpp index 50c985c20..32a5cff06 100644 --- a/src/clib/solve_rate_cool_g-cpp.cpp +++ b/src/clib/solve_rate_cool_g-cpp.cpp @@ -839,7 +839,7 @@ int solve_rate_cool_g( grackle::impl::rate_timestep_g( spsolvbuf.dedot, spsolvbuf.HIdot, anydust, spsolvbuf.h2dust, rhoH.data(), itmask.data(), edot.data(), - chunit, dom, my_chemistry, my_fields, *my_uvb_rates, idx_range, + chunit, dom, my_chemistry, my_fields, idx_range, spsolvbuf.kcr_buf, spsolvbuf.kshield_buf, spsolvbuf.chemheatrates_buf ); diff --git a/src/clib/time_deriv_0d.hpp b/src/clib/time_deriv_0d.hpp index 561910311..5cc31592b 100644 --- a/src/clib/time_deriv_0d.hpp +++ b/src/clib/time_deriv_0d.hpp @@ -518,11 +518,11 @@ void derivatives( grackle::impl::rate_timestep_g( pack.other_scratch_buf.dedot, pack.other_scratch_buf.HIdot, - pack.fwd_args.anydust, pack.other_scratch_buf.h2dust, - pack.other_scratch_buf.rhoH, pack.other_scratch_buf.itmask, - pack.other_scratch_buf.edot, pack.fwd_args.chunit, - pack.fwd_args.dom, my_chemistry, &pack.fields, - my_uvb_rates, pack.idx_range_1_element, + pack.fwd_args.anydust, pack.other_scratch_buf.h2dust, + pack.other_scratch_buf.rhoH, pack.other_scratch_buf.itmask, + pack.other_scratch_buf.edot, pack.fwd_args.chunit, + pack.fwd_args.dom, my_chemistry, &pack.fields, + pack.idx_range_1_element, pack.main_scratch_buf.kcr_buf, pack.main_scratch_buf.kshield_buf, pack.main_scratch_buf.chemheatrates_buf From b5272805e349d57b810b9ed9b8d6faf931116958 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 19 Dec 2025 10:54:07 +0000 Subject: [PATCH 14/31] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/clib/rate_timestep_g.cpp | 6 +++--- src/clib/rate_timestep_g.hpp | 9 +++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/clib/rate_timestep_g.cpp b/src/clib/rate_timestep_g.cpp index e6eebada4..cc2b5433d 100644 --- a/src/clib/rate_timestep_g.cpp +++ b/src/clib/rate_timestep_g.cpp @@ -27,9 +27,9 @@ namespace grackle::impl { void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, - const double* h2dust, const double* rhoH, const gr_mask_type* itmask, - double* edot, double chunit, double dom, - chemistry_data* my_chemistry, + const double* h2dust, const double* rhoH, + const gr_mask_type* itmask, double* edot, double chunit, + double dom, chemistry_data* my_chemistry, grackle_field_data* my_fields, IndexRange idx_range, grackle::impl::CollisionalRxnRateCollection kcr_buf, grackle::impl::PhotoRxnRateCollection kshield_buf, diff --git a/src/clib/rate_timestep_g.hpp b/src/clib/rate_timestep_g.hpp index b406fac65..57eef521a 100644 --- a/src/clib/rate_timestep_g.hpp +++ b/src/clib/rate_timestep_g.hpp @@ -46,16 +46,17 @@ namespace grackle::impl { /// @param[in] kcr_buf Holds various pre-computed chemical reaction rates for /// each location in `idx_range`. /// @param[in] kshield_buf Holds various pre-computed radiative reaction rates -/// @param[in] chemheatrates_buf Holds various pre-computed chemistry-heating rates +/// @param[in] chemheatrates_buf Holds various pre-computed chemistry-heating +/// rates /// at each index-range location /// @par History /// written by: /// modified1: November, 2025 by Christopher Bignamini & Matthew Abruzzo; C++ /// port void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, - const double* h2dust, const double* rhoH, const gr_mask_type* itmask, - double* edot, double chunit, double dom, - chemistry_data* my_chemistry, + const double* h2dust, const double* rhoH, + const gr_mask_type* itmask, double* edot, double chunit, + double dom, chemistry_data* my_chemistry, grackle_field_data* my_fields, IndexRange idx_range, grackle::impl::CollisionalRxnRateCollection kcr_buf, grackle::impl::PhotoRxnRateCollection kshield_buf, From e4df3f914b2dc47af7ab79e7c6530d3d0a2f9e1c Mon Sep 17 00:00:00 2001 From: Matthew Abruzzo Date: Fri, 19 Dec 2025 08:22:14 -0500 Subject: [PATCH 15/31] address compiler warning in chemistry_solver_funcs.hppp --- src/clib/chemistry_solver_funcs.hpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/clib/chemistry_solver_funcs.hpp b/src/clib/chemistry_solver_funcs.hpp index f36db0a7f..ad3f8a760 100644 --- a/src/clib/chemistry_solver_funcs.hpp +++ b/src/clib/chemistry_solver_funcs.hpp @@ -1,6 +1,11 @@ -// See LICENSE file for license and copyright information - -/// @file chemistry_solver_funcs.hpp +//===----------------------------------------------------------------------===// +// +// See the LICENSE file for license and copyright information +// SPDX-License-Identifier: NCSA AND BSD-3-Clause +// +//===----------------------------------------------------------------------===// +/// +/// @file /// @brief Defines chemistry reaction related functions invoked by the /// grackle solver in order to integrate the species densities over time. /// @@ -14,6 +19,8 @@ /// be decoupled from the derivative calculation for primoridial species /// - it may also make sense to further divide logic by the kinds of species /// that are affected (e.g. primordial vs grains) +/// +//===----------------------------------------------------------------------===// #ifndef CHEMISTRY_SOLVER_FUNCS_HPP #define CHEMISTRY_SOLVER_FUNCS_HPP @@ -579,7 +586,9 @@ inline void species_density_updates_gauss_seidel( if ( (my_chemistry->metal_chemistry == 1) && (itmask_metal[i] != MASK_FALSE) ) { - scoef = scoef; + // we comment out the following line that assigns scoef to itself since + // it has no practical impact and produces a compiler warning + // scoef = scoef; acoef = acoef + kcol_buf.data[CollisionalRxnLUT::kz44][i] * CII(i,j,k) / 12. + kcol_buf.data[CollisionalRxnLUT::kz45][i] * OII(i,j,k) / 16. @@ -1932,7 +1941,9 @@ inline void species_density_derivatives_0d( if ((my_chemistry->metal_chemistry == 1) && (itmask_metal[0] != MASK_FALSE)) { - scoef = scoef; + // we comment out the following line that assigns scoef to itself since + // it has no practical impact and produces a compiler warning + // scoef = scoef; acoef = acoef + kcr_buf.data[CollisionalRxnLUT::kz44][0] * CII / 12. + kcr_buf.data[CollisionalRxnLUT::kz45][0] * OII / 16. From e2ea0d925f6ec099cb9348fbb9675eeb5cc1f263 Mon Sep 17 00:00:00 2001 From: Matthew Abruzzo Date: Fri, 19 Dec 2025 08:23:58 -0500 Subject: [PATCH 16/31] address warning about uninitialized variables in solve_rate_cool_g-cpp.cpp --- src/clib/solve_rate_cool_g-cpp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/clib/solve_rate_cool_g-cpp.cpp b/src/clib/solve_rate_cool_g-cpp.cpp index f96243f58..bde08114e 100644 --- a/src/clib/solve_rate_cool_g-cpp.cpp +++ b/src/clib/solve_rate_cool_g-cpp.cpp @@ -791,7 +791,7 @@ int solve_rate_cool_g( // declare 2 variables (primarily used for subcycling, but also used in // error reporting) int iter; - double ttmin; + double ttmin = huge8; // ------------------ Loop over subcycles ---------------- From 120c84aeece89c32a0794574d2c8d159bb61c55a Mon Sep 17 00:00:00 2001 From: Matthew Abruzzo Date: Sun, 4 Jan 2026 20:05:49 -0500 Subject: [PATCH 17/31] introduce GRIMPL_NS --- src/clib/CMakeLists.txt | 1 + src/clib/support/config.hpp | 71 +++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 src/clib/support/config.hpp diff --git a/src/clib/CMakeLists.txt b/src/clib/CMakeLists.txt index 693d6ea37..309fb6353 100644 --- a/src/clib/CMakeLists.txt +++ b/src/clib/CMakeLists.txt @@ -130,6 +130,7 @@ add_library(Grackle_Grackle utils-cpp.cpp utils-cpp.hpp utils-field.hpp fortran_func_wrappers.hpp + support/config.hpp visitor/common.hpp visitor/copy.hpp visitor/memory.hpp diff --git a/src/clib/support/config.hpp b/src/clib/support/config.hpp new file mode 100644 index 000000000..4baee894c --- /dev/null +++ b/src/clib/support/config.hpp @@ -0,0 +1,71 @@ +//===----------------------------------------------------------------------===// +// +// See the LICENSE file for license and copyright information +// SPDX-License-Identifier: NCSA AND BSD-3-Clause +// +//===----------------------------------------------------------------------===// +/// +/// @file +/// This is a lightweight header file that defines a few macros that are used +/// throughout the codebase +/// +//===----------------------------------------------------------------------===// +#ifndef SUPPORT_CONFIG_HPP +#define SUPPORT_CONFIG_HPP + +/// Expands to Grackle's global internal namespace enclosing the implementation +/// +/// This is used when referring to the qualified name of a PREVIOUSLY DECLARED +/// entity (a function, class/struct, etc.) that is a member of this namespace. +/// +/// For example, suppose that a function int foo(const char* s) was +/// as part of this namespace. From global scope, we could use this macro to +/// call the function with GRIMPL_NS::foo(s) . +/// +/// @important +/// This macro should NOT be used to open namespace blocks. You should use +/// GRIMPL_NAMESPACE_DECL for that purpose. +/// +/// @par Motivation +/// The existence of this macro has 3 motivations: +/// 1. Once we use it everywhere, the name will be easier to change. The current +/// choice, grackle::impl was picked because it was relatively +/// short (there are probably slightly more descriptive alternatives). +/// 2. Relatedly, it might be convenient to encode the current version number +/// in the namespace. This comes up in the context of header-only libraries. +/// (It would also open the door to linking and testing 2 Grackle versions +/// in the same program). +/// 3. It also goes hand-in-hand with the GRIMPL_NAMESPACE_DECL macro. See its +/// docstring for the benefits that it brings. +#define GRIMPL_NS grackle::impl + +/// Used for opening the namespace block of Grackle's global internal namespace +/// that is used to enclose Grackle's implementation +/// +/// To declare a function int foo(const char* s) in this namespace, +/// you might write something like: +/// @code{.cpp} +/// #include "support/config.hpp" +/// +/// namespace GRIMPL_NAMESPACE_DECL { +/// int foo(const char* s) +/// } // namespace GRIMPL_NAMESPACE_DECL +/// @endcode +/// +/// @par Motivation +/// This is primarily inspired by a similar macro, \c LIBC_NAMESPACE_DECL from +/// LLVM-libc (LLVM's implementation of the C standard library), which is +/// described at https://libc.llvm.org/dev/code_style.html#libc-namespace-decl +/// +/// @par +/// Once we adopt this everywhere, we would change this macro's definition to +/// [[gnu::visibility("hidden")]] GRIMPL_NS when compiling Grackle +/// as a shared library, which would declare all enclosed symbols as having +/// hidden visibility. A brief primer on symbol visibility is provided by +/// https://cs.dartmouth.edu/~sergey/cs258/ABI/UlrichDrepper-How-To-Write-Shared-Libraries.pdf +/// This would effectively reduce the size of the Grackle shared library, +/// improve startup time of programs linked against a Grackle shared library +/// and enforce that private functions shouldn't be used outside of Grackle +#define GRIMPL_NAMESPACE_DECL GRIMPL_NS + +#endif // SUPPORT_CONFIG_HPP From 7ab41e92ef822c5dcd69717592d890026e1a9848 Mon Sep 17 00:00:00 2001 From: Matthew Abruzzo Date: Sun, 4 Jan 2026 20:23:08 -0500 Subject: [PATCH 18/31] illustrate a usage of GRIMPL_NS --- src/clib/ceiling_species.hpp | 116 ++++++++++++++++++----------------- 1 file changed, 60 insertions(+), 56 deletions(-) diff --git a/src/clib/ceiling_species.hpp b/src/clib/ceiling_species.hpp index 726be2b94..8cc78a79b 100644 --- a/src/clib/ceiling_species.hpp +++ b/src/clib/ceiling_species.hpp @@ -16,173 +16,177 @@ // This file was initially generated automatically during conversion of the // ceiling_species_g function from FORTRAN to C++ +#include "grackle.h" // my_chemistry, my_fields +#include "support/config.hpp" +#include // std::fmax + #ifndef CEILING_SPECIES_HPP #define CEILING_SPECIES_HPP -namespace grackle::impl { +namespace GRIMPL_NAMESPACE_DECL { inline void ceiling_species(int imetal, chemistry_data* my_chemistry, grackle_field_data* my_fields) { - grackle::impl::View d( + GRIMPL_NS::View d( my_fields->density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View de( + GRIMPL_NS::View de( my_fields->e_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View HI( + GRIMPL_NS::View HI( my_fields->HI_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View HII( + GRIMPL_NS::View HII( my_fields->HII_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View HeI( + GRIMPL_NS::View HeI( my_fields->HeI_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View HeII( + GRIMPL_NS::View HeII( my_fields->HeII_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View HeIII( + GRIMPL_NS::View HeIII( my_fields->HeIII_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View HM( + GRIMPL_NS::View HM( my_fields->HM_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View H2I( + GRIMPL_NS::View H2I( my_fields->H2I_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View H2II( + GRIMPL_NS::View H2II( my_fields->H2II_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View DI( + GRIMPL_NS::View DI( my_fields->DI_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View DII( + GRIMPL_NS::View DII( my_fields->DII_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View HDI( + GRIMPL_NS::View HDI( my_fields->HDI_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View metal( + GRIMPL_NS::View metal( my_fields->metal_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View dust( + GRIMPL_NS::View dust( my_fields->dust_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View DM( + GRIMPL_NS::View DM( my_fields->DM_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View HDII( + GRIMPL_NS::View HDII( my_fields->HDII_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View HeHII( + GRIMPL_NS::View HeHII( my_fields->HeHII_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View CI( + GRIMPL_NS::View CI( my_fields->CI_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View CII( + GRIMPL_NS::View CII( my_fields->CII_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View CO( + GRIMPL_NS::View CO( my_fields->CO_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View CO2( + GRIMPL_NS::View CO2( my_fields->CO2_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View OI( + GRIMPL_NS::View OI( my_fields->OI_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View OH( + GRIMPL_NS::View OH( my_fields->OH_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View H2O( + GRIMPL_NS::View H2O( my_fields->H2O_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View O2( + GRIMPL_NS::View O2( my_fields->O2_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View SiI( + GRIMPL_NS::View SiI( my_fields->SiI_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View SiOI( + GRIMPL_NS::View SiOI( my_fields->SiOI_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View SiO2I( + GRIMPL_NS::View SiO2I( my_fields->SiO2I_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View CH( + GRIMPL_NS::View CH( my_fields->CH_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View CH2( + GRIMPL_NS::View CH2( my_fields->CH2_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View COII( + GRIMPL_NS::View COII( my_fields->COII_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View OII( + GRIMPL_NS::View OII( my_fields->OII_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View OHII( + GRIMPL_NS::View OHII( my_fields->OHII_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View H2OII( + GRIMPL_NS::View H2OII( my_fields->H2OII_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View H3OII( + GRIMPL_NS::View H3OII( my_fields->H3OII_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View O2II( + GRIMPL_NS::View O2II( my_fields->O2II_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View Mg( + GRIMPL_NS::View Mg( my_fields->Mg_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View Al( + GRIMPL_NS::View Al( my_fields->Al_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View S( + GRIMPL_NS::View S( my_fields->S_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View Fe( + GRIMPL_NS::View Fe( my_fields->Fe_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View SiM( + GRIMPL_NS::View SiM( my_fields->SiM_dust_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View FeM( + GRIMPL_NS::View FeM( my_fields->FeM_dust_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View Mg2SiO4( + GRIMPL_NS::View Mg2SiO4( my_fields->Mg2SiO4_dust_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View MgSiO3( + GRIMPL_NS::View MgSiO3( my_fields->MgSiO3_dust_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View Fe3O4( + GRIMPL_NS::View Fe3O4( my_fields->Fe3O4_dust_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View AC( + GRIMPL_NS::View AC( my_fields->AC_dust_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View SiO2D( + GRIMPL_NS::View SiO2D( my_fields->SiO2_dust_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View MgO( + GRIMPL_NS::View MgO( my_fields->MgO_dust_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View FeS( + GRIMPL_NS::View FeS( my_fields->FeS_dust_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View Al2O3( + GRIMPL_NS::View Al2O3( my_fields->Al2O3_dust_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View reforg( + GRIMPL_NS::View reforg( my_fields->ref_org_dust_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View volorg( + GRIMPL_NS::View volorg( my_fields->vol_org_dust_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); - grackle::impl::View H2Oice( + GRIMPL_NS::View H2Oice( my_fields->H2O_ice_dust_density, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); @@ -337,6 +341,6 @@ inline void ceiling_species(int imetal, chemistry_data* my_chemistry, return; } -} // namespace grackle::impl +} // namespace GRIMPL_NAMESPACE_DECL #endif /* CEILING_SPECIES_CPP_H */ From 4ce92c8e9110977cb2c90d0a17637a92e8677342 Mon Sep 17 00:00:00 2001 From: Matthew Abruzzo Date: Wed, 14 Jan 2026 20:02:24 -0500 Subject: [PATCH 19/31] create FullRxnRateBuf --- src/clib/CMakeLists.txt | 1 + src/clib/full_rxn_rate_buf.hpp | 184 +++++++++++++++++++++++++++++ src/clib/solve_rate_cool_g-cpp.cpp | 8 ++ src/clib/time_deriv_0d.hpp | 4 + 4 files changed, 197 insertions(+) create mode 100644 src/clib/full_rxn_rate_buf.hpp diff --git a/src/clib/CMakeLists.txt b/src/clib/CMakeLists.txt index 32b3cf600..5d98e20ea 100644 --- a/src/clib/CMakeLists.txt +++ b/src/clib/CMakeLists.txt @@ -111,6 +111,7 @@ add_library(Grackle_Grackle dust_props.hpp dust/grain_species_info.cpp dust/grain_species_info.hpp dust/lookup_dust_rates1d.hpp + full_rxn_rate_buf.hpp init_misc_species_cool_rates.cpp init_misc_species_cool_rates.hpp initialize_chemistry_data.cpp initialize_dust_yields.cpp initialize_dust_yields.hpp diff --git a/src/clib/full_rxn_rate_buf.hpp b/src/clib/full_rxn_rate_buf.hpp new file mode 100644 index 000000000..d8d39c811 --- /dev/null +++ b/src/clib/full_rxn_rate_buf.hpp @@ -0,0 +1,184 @@ +//===----------------------------------------------------------------------===// +// +// See the LICENSE file for license and copyright information +// SPDX-License-Identifier: NCSA AND BSD-3-Clause +// +//===----------------------------------------------------------------------===// +/// +/// @file +/// Define the FullRxnRateBuf type +/// +//===----------------------------------------------------------------------===// +#ifndef GRACKLE_FULL_RXN_RATE_BUF_HPP +#define GRACKLE_FULL_RXN_RATE_BUF_HPP + +#include "LUT.hpp" +#include "internal_types.hpp" +#include "support/config.hpp" +#include "visitor/common.hpp" + +namespace GRIMPL_NAMESPACE_DECL { + +/// encloses some constants used for defining @ref FullFxnRateBuf +/// +/// For some context, @ref FullRxnRateBuf holds various 1D rate buffers for +/// various kinds of rates. As explained in the @ref FullRxnRateBuf docstring, +/// we aggregate all of these buffers into single array, where contiguous +/// sections are dedicated to different kinds of rates. This namespace defines +/// the max known number of each kind of rate (and other derived quantities). +/// +/// The known reaction rate kinds are currently: +/// - COLLISIONAL (collisional reaction rates) +/// - GRAIN_GROWTH (tracks grain species growth rates) +/// - MISC (namely just tracks the h2dust buffer) +namespace rxn_rate_buf_detail { + +/// holds constants specifying the maximum number of rates of a given kind +/// that may be stored the shared buffer +struct MaxSize { + enum { + COLLISIONAL = CollisionalRxnLUT::NUM_ENTRIES, + GRAIN_GROWTH = OnlyGrainSpLUT::NUM_ENTRIES, + MISC = 1 + }; +}; + +/// holds constants specifying the offset from the start of the buffer to the +/// section holding a given kind of rate +struct SectionOffset { + enum { + COLLISIONAL = 0, + GRAIN_GROWTH = COLLISIONAL + MaxSize::COLLISIONAL, + MISC = GRAIN_GROWTH + MaxSize::GRAIN_GROWTH + }; +}; + +/// the max number of rates that FullRxnRateBuf::data may hold +inline constexpr int MAX_LEN = SectionOffset::MISC + MaxSize::MISC; + +} // namespace rxn_rate_buf_detail + +/// Collection of buffers that store all computed reaction rates +/// +/// For some context, Grackle evolves species densities by computing batches of +/// values (i.e. for 1 or more spatial location) for a variety of reaction +/// rates, and subsequently use the rates to determine time derivatives. +/// Instances of this type hold a buffer to hold the batch of values for every +/// kind of rate. +/// +/// To access a buffer, use the associated functions +/// (@ref FullRxnRateBuf_kcol_bufs, @ref FullRxnRateBuf_grain_growth_bufs, or +/// @ref FullRxnRateBuf_h2dust) or directly access the struct's @ref radiative +/// member. +/// +/// @todo +/// Ideally, we would embed all the members of @ref radiative directly as +/// elements of the @ref data member (and delete the @ref PhotoRxnRateCollection +/// type) +/// +/// @par Implementation Strategy +/// Our current strategy involves aggregating as many of the rate buffers in +/// the @ref data member as possible. Different contiguous slices of @ref data +/// are dedicated to storing rates of a given kind. +/// +/// @par Allocation Strategy +/// Currently, we reserve memory for the maximum number of rates known to +/// Grackle. This has been the historical convention adopted by Grackle. +/// Obviously this should be addressed in the future. +/// +/// To move away from this over-allocation strategy, we'll need to move away +/// from using compile-time constants to index/size @ref data. Instead, we +/// would probably use the data structure proposed in #493 +/// +/// @par Longer Term Plan +/// The longer term goal is to adopt a dynamic strategy like the one outlined +/// in the docstring of @ref chemistry::species_density_updates_gauss_seidel. +/// This will be a lot easier if the various rate buffers are aggregated behind +/// accessible by indexing into a single array +struct FullRxnRateBuf { + /// holds everything but the radiative rates + double* data[rxn_rate_buf_detail::MAX_LEN]; + + /// holds the radiative rates + PhotoRxnRateCollection radiative; +}; + +/// used to help implement the visitor design pattern +/// +/// (avoid using this unless you really have to) +template +void visit_member_pair(FullRxnRateBuf& obj0, FullRxnRateBuf& obj1, BinaryFn f) { + visitor::begin_visit("FullRxnRateBuf", f); + for (int i = 0; i < rxn_rate_buf_detail::MAX_LEN; i++) { + f(VIS_MEMBER_NAME("data[...]"), obj0.data[i], obj1.data[i], + visitor::idx_range_len_multiple(1)); + } + + visitor::previsit_struct_member(VIS_MEMBER_NAME("radiative"), f); + visit_member_pair(obj0.radiative, obj1.radiative, f); + + visitor::end_visit(f); +} + +/// implements the visitor design pattern +/// +/// @param ptr[in,out] Members of the specified object will be visited +/// @param fn[in] Calls function that will be applied to each function +template +inline void visit_member(FullRxnRateBuf* ptr, UnaryVisitor fn) { + GRIMPL_IMPL_VISIT_MEMBER(visit_member_pair, FullRxnRateBuf, ptr, fn) +} + +/// allocates the contents of a new FullRxnRateBuffer +/// +/// @param nelem The number of elements in each buffer +inline FullRxnRateBuf new_FullRxnRateBuf(int nelem) { + FullRxnRateBuf out; + double* ptr = new double[nelem * rxn_rate_buf_detail::MAX_LEN]; + for (int i = 0; i < rxn_rate_buf_detail::MAX_LEN; i++) { + out.data[i] = ptr + (i * nelem); + } + out.radiative = new_PhotoRxnRateCollection(nelem); + return out; +} + +/// performs cleanup of the contents of FullRxnRateBuf +/// +/// This effectively invokes a destructor +inline void drop_FullRxnRateBuffer(FullRxnRateBuf* ptr) { + // since we only allocate a single pointer for the data member, we only need + // to call delete on the very first entry of data + delete[] ptr->data[0]; + drop_PhotoRxnRateCollection(&ptr->radiative); +} + +// helper functions to retrieve the relevant sections of the buffers + +/// fetch array of buffers reserved for holding collisional reaction rates +/// +/// The returned array is expected to be indexed with @ref CollisionalRxnLUT. +/// The buffer at index `CollisionalRxnLUT::`, is reserved for a rate +/// called ``. +inline double* const* FullRxnRateBuf_kcol_bufs(const FullRxnRateBuf* ptr) { + return ptr->data + rxn_rate_buf_detail::SectionOffset::COLLISIONAL; +} + +/// fetch array of buffers reserved for holding grain growth rates +/// +/// The returned array is expected to be indexed with @ref OnlyGrainSpLUT. The +/// buffer at index `OnlyGrainSpLUT::`, is reserved for the growth rate +/// of the grain species called ``. +inline double* const* FullRxnRateBuf_grain_growth_bufs( + const FullRxnRateBuf* ptr) { + return ptr->data + rxn_rate_buf_detail::SectionOffset::GRAIN_GROWTH; +} + +/// fetch the buffer reserved for holding h2dust (the rate of molecular +/// Hydrogen formation on dust grains). +inline double* FullRxnRateBuf_h2dust(const FullRxnRateBuf* ptr) { + return ptr->data[rxn_rate_buf_detail::SectionOffset::MISC]; +} + +} // namespace GRIMPL_NAMESPACE_DECL + +#endif // GRACKLE_FULL_RXN_RATE_BUF_HPP diff --git a/src/clib/solve_rate_cool_g-cpp.cpp b/src/clib/solve_rate_cool_g-cpp.cpp index 2a70201c8..2a595d8ea 100644 --- a/src/clib/solve_rate_cool_g-cpp.cpp +++ b/src/clib/solve_rate_cool_g-cpp.cpp @@ -20,6 +20,7 @@ #include #include "grackle.h" #include "fortran_func_wrappers.hpp" +#include "full_rxn_rate_buf.hpp" #include "index_helper.h" #include "internal_types.hpp" #include "internal_units.h" @@ -557,6 +558,10 @@ struct SpeciesRateSolverScratchBuf { // the computed radiative reaction rates grackle::impl::PhotoRxnRateCollection kshield_buf; + /// buffers in the following data structure are used to temporarily hold + /// all reaction rates + FullRxnRateBuf rxn_rate_buf; + // buffers in the following data structure are used to temporarily hold // the interpolated chemistry-heating rates at each index-range location grackle::impl::ChemHeatingRates chemheatrates_buf; @@ -595,6 +600,9 @@ void visit_member_pair(SpeciesRateSolverScratchBuf& obj0, vis::previsit_struct_member(VIS_MEMBER_NAME("kshield_buf"), f); visit_member_pair(obj0.kshield_buf, obj1.kshield_buf, f); + vis::previsit_struct_member(VIS_MEMBER_NAME("rxn_rate_buf"), f); + visit_member_pair(obj0.rxn_rate_buf, obj1.rxn_rate_buf, f); + vis::previsit_struct_member(VIS_MEMBER_NAME("chemheatrates_buf"), f); visit_member_pair(obj0.chemheatrates_buf, obj1.chemheatrates_buf, f); diff --git a/src/clib/time_deriv_0d.hpp b/src/clib/time_deriv_0d.hpp index 5cc31592b..5dcd80a05 100644 --- a/src/clib/time_deriv_0d.hpp +++ b/src/clib/time_deriv_0d.hpp @@ -10,6 +10,7 @@ #include "chemistry_solver_funcs.hpp" #include "dust_props.hpp" #include "fortran_func_wrappers.hpp" +#include "full_rxn_rate_buf.hpp" #include "grackle.h" #include "grackle_macros.h" // GRACKLE_FREE #include "index_helper.h" @@ -63,6 +64,7 @@ struct MainScratchBuf { CollisionalRxnRateCollection kcr_buf; PhotoRxnRateCollection kshield_buf; GrainSpeciesCollection grain_growth_rates; + FullRxnRateBuf rxn_rate_buf; }; @@ -83,6 +85,7 @@ MainScratchBuf new_MainScratchBuf(int grain_opacity_table_size) { out.kcr_buf = new_CollisionalRxnRateCollection(nelem); out.kshield_buf = new_PhotoRxnRateCollection(nelem); out.grain_growth_rates = new_GrainSpeciesCollection(nelem); + out.rxn_rate_buf = new_FullRxnRateBuf(nelem); return out; } @@ -97,6 +100,7 @@ void drop_MainScratchBuf(MainScratchBuf* ptr) { drop_CollisionalRxnRateCollection(&ptr->kcr_buf); drop_PhotoRxnRateCollection(&ptr->kshield_buf); drop_GrainSpeciesCollection(&ptr->grain_growth_rates); + drop_FullRxnRateBuffer(&ptr->rxn_rate_buf); } /// this is a collections of values intended to act as 1-element arrays and From 8213d99aa49fa1c53e7ec4c7d5c40e995553b5d7 Mon Sep 17 00:00:00 2001 From: Matthew Abruzzo Date: Wed, 14 Jan 2026 20:48:30 -0500 Subject: [PATCH 20/31] pass rxn_rate_buf to the step_rate_<...> functions --- src/clib/chemistry_solver_funcs.hpp | 11 +++++++++-- src/clib/solve_rate_cool_g-cpp.cpp | 2 +- src/clib/step_rate_gauss_seidel.hpp | 5 +++-- src/clib/time_deriv_0d.hpp | 3 ++- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/clib/chemistry_solver_funcs.hpp b/src/clib/chemistry_solver_funcs.hpp index ad3f8a760..4df18f810 100644 --- a/src/clib/chemistry_solver_funcs.hpp +++ b/src/clib/chemistry_solver_funcs.hpp @@ -27,6 +27,7 @@ #include "grackle.h" #include "fortran_func_decls.h" // gr_mask_type +#include "full_rxn_rate_buf.hpp" #include "index_helper.h" #include "internal_types.hpp" #include "LUT.hpp" @@ -58,6 +59,8 @@ namespace grackle::impl::chemistry { /// need to pass the whole thing since we also pass kshield_buf) /// @param[in] grain_growth_rates, kcr_buf, kshield_buf specifies the /// precomputed rxn rates (depends on local physical conditions) +/// @param[in] rxn_rate_buf specifies the precomputed rxn rates (depends on +/// local physical conditions) /// /// Refactoring Goals /// ----------------- @@ -113,7 +116,8 @@ inline void species_density_updates_gauss_seidel( grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, grackle::impl::GrainSpeciesCollection grain_growth_rates, grackle::impl::CollisionalRxnRateCollection kcol_buf, - grackle::impl::PhotoRxnRateCollection kshield_buf + grackle::impl::PhotoRxnRateCollection kshield_buf, + const FullRxnRateBuf rxn_rate_buf ) { @@ -1464,6 +1468,8 @@ inline void species_density_updates_gauss_seidel( /// UV background /// @param[in] grain_growth_rates, kcr_buf, kshield_buf specifies the /// precomputed rxn rates (depends on local physical conditions) +/// @param[in] rxn_rate_buf specifies the precomputed rxn rates (depends on +/// local physical conditions) /// /// @note /// Some of occurences of the const keyword is somewhat symbolic (to indicate @@ -1493,7 +1499,8 @@ inline void species_density_derivatives_0d( const photo_rate_storage my_uvb_rates, const grackle::impl::GrainSpeciesCollection grain_growth_rates, const grackle::impl::CollisionalRxnRateCollection kcr_buf, - const grackle::impl::PhotoRxnRateCollection kshield_buf + const grackle::impl::PhotoRxnRateCollection kshield_buf, + const FullRxnRateBuf rxn_rate_buf ) { // define some local variables carried over from the fortran version: diff --git a/src/clib/solve_rate_cool_g-cpp.cpp b/src/clib/solve_rate_cool_g-cpp.cpp index 2a595d8ea..593107925 100644 --- a/src/clib/solve_rate_cool_g-cpp.cpp +++ b/src/clib/solve_rate_cool_g-cpp.cpp @@ -912,7 +912,7 @@ int solve_rate_cool_g( spsolvbuf.dedot_prev, spsolvbuf.HIdot_prev, spsolvbuf.itmask_gs, itmask_metal.data(), my_chemistry, my_fields, *my_uvb_rates, spsolvbuf.grain_growth_rates, spsolvbuf.species_tmpdens, - spsolvbuf.kcr_buf, spsolvbuf.kshield_buf + spsolvbuf.kcr_buf, spsolvbuf.kshield_buf, spsolvbuf.rxn_rate_buf ); // Solve rate equations with one linearly implicit Gauss-Seidel diff --git a/src/clib/step_rate_gauss_seidel.hpp b/src/clib/step_rate_gauss_seidel.hpp index 3fe3928a6..71b1e88fa 100644 --- a/src/clib/step_rate_gauss_seidel.hpp +++ b/src/clib/step_rate_gauss_seidel.hpp @@ -239,7 +239,8 @@ inline void step_rate_gauss_seidel( grackle::impl::GrainSpeciesCollection grain_growth_rates, grackle::impl::SpeciesCollection species_tmpdens, grackle::impl::CollisionalRxnRateCollection kcol_buf, - grackle::impl::PhotoRxnRateCollection kshield_buf + grackle::impl::PhotoRxnRateCollection kshield_buf, + const FullRxnRateBuf rxn_rate_buf ) { // perform the Gauss-Seidel sweep to compute the species densities at the @@ -247,7 +248,7 @@ inline void step_rate_gauss_seidel( grackle::impl::chemistry::species_density_updates_gauss_seidel( species_tmpdens, idx_range, dtit, anydust, h2dust, rhoH, itmask, itmask_metal, my_chemistry, my_fields, my_uvb_rates, grain_growth_rates, - kcol_buf, kshield_buf); + kcol_buf, kshield_buf, rxn_rate_buf); // update the entries from my_fields with the values in species_tmpdens update_fields_from_tmpdens_gauss_seidel( diff --git a/src/clib/time_deriv_0d.hpp b/src/clib/time_deriv_0d.hpp index 5dcd80a05..d0944ed64 100644 --- a/src/clib/time_deriv_0d.hpp +++ b/src/clib/time_deriv_0d.hpp @@ -551,7 +551,8 @@ void derivatives( rhosp_dot, pack.fwd_args.anydust, pack.other_scratch_buf.h2dust, pack.other_scratch_buf.rhoH, &pack.local_itmask_metal, my_chemistry, &pack.fields, my_uvb_rates, pack.main_scratch_buf.grain_growth_rates, - pack.main_scratch_buf.kcr_buf, pack.main_scratch_buf.kshield_buf + pack.main_scratch_buf.kcr_buf, pack.main_scratch_buf.kshield_buf, + pack.main_scratch_buf.rxn_rate_buf ); } From 3a808ae9c7a60620607dd8bd88b3b3e5751419cf Mon Sep 17 00:00:00 2001 From: Matthew Abruzzo Date: Wed, 14 Jan 2026 20:54:44 -0500 Subject: [PATCH 21/31] pass rxn_rate_buf to rate_timestep_g --- src/clib/rate_timestep_g.cpp | 3 ++- src/clib/rate_timestep_g.hpp | 9 ++++++--- src/clib/solve_rate_cool_g-cpp.cpp | 2 +- src/clib/time_deriv_0d.hpp | 3 ++- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/clib/rate_timestep_g.cpp b/src/clib/rate_timestep_g.cpp index cc2b5433d..6d09382dd 100644 --- a/src/clib/rate_timestep_g.cpp +++ b/src/clib/rate_timestep_g.cpp @@ -33,7 +33,8 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, grackle_field_data* my_fields, IndexRange idx_range, grackle::impl::CollisionalRxnRateCollection kcr_buf, grackle::impl::PhotoRxnRateCollection kshield_buf, - grackle::impl::ChemHeatingRates chemheatrates_buf) { + grackle::impl::ChemHeatingRates chemheatrates_buf, + FullRxnRateBuf rxn_rate_buf) { // Density fields grackle::impl::View de( diff --git a/src/clib/rate_timestep_g.hpp b/src/clib/rate_timestep_g.hpp index 57eef521a..064d121bb 100644 --- a/src/clib/rate_timestep_g.hpp +++ b/src/clib/rate_timestep_g.hpp @@ -18,6 +18,7 @@ #include "grackle.h" // gr_float #include "fortran_func_decls.h" // gr_mask_int +#include "full_rxn_rate_buf.hpp" #include "internal_types.hpp" namespace grackle::impl { @@ -47,8 +48,9 @@ namespace grackle::impl { /// each location in `idx_range`. /// @param[in] kshield_buf Holds various pre-computed radiative reaction rates /// @param[in] chemheatrates_buf Holds various pre-computed chemistry-heating -/// rates -/// at each index-range location +/// rates at each index-range location +/// @param[in] rxn_rate_buf Holds pre-computed reaction rates for each location +/// in `idx_range`. /// @par History /// written by: /// modified1: November, 2025 by Christopher Bignamini & Matthew Abruzzo; C++ @@ -60,7 +62,8 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, grackle_field_data* my_fields, IndexRange idx_range, grackle::impl::CollisionalRxnRateCollection kcr_buf, grackle::impl::PhotoRxnRateCollection kshield_buf, - grackle::impl::ChemHeatingRates chemheatrates_buf); + grackle::impl::ChemHeatingRates chemheatrates_buf, + FullRxnRateBuf rxn_rate_buf); } // namespace grackle::impl diff --git a/src/clib/solve_rate_cool_g-cpp.cpp b/src/clib/solve_rate_cool_g-cpp.cpp index 593107925..d47c98581 100644 --- a/src/clib/solve_rate_cool_g-cpp.cpp +++ b/src/clib/solve_rate_cool_g-cpp.cpp @@ -849,7 +849,7 @@ int solve_rate_cool_g( rhoH.data(), itmask.data(), edot.data(), chunit, dom, my_chemistry, my_fields, idx_range, spsolvbuf.kcr_buf, spsolvbuf.kshield_buf, - spsolvbuf.chemheatrates_buf + spsolvbuf.chemheatrates_buf, spsolvbuf.rxn_rate_buf ); // Setup masks to identify which chemistry schemes to use. We split diff --git a/src/clib/time_deriv_0d.hpp b/src/clib/time_deriv_0d.hpp index d0944ed64..e30469990 100644 --- a/src/clib/time_deriv_0d.hpp +++ b/src/clib/time_deriv_0d.hpp @@ -529,7 +529,8 @@ void derivatives( pack.idx_range_1_element, pack.main_scratch_buf.kcr_buf, pack.main_scratch_buf.kshield_buf, - pack.main_scratch_buf.chemheatrates_buf + pack.main_scratch_buf.chemheatrates_buf, + pack.main_scratch_buf.rxn_rate_buf ); } From 98331544326fdd99f507a4449bddde1b994588af Mon Sep 17 00:00:00 2001 From: Matthew Abruzzo Date: Wed, 14 Jan 2026 21:11:02 -0500 Subject: [PATCH 22/31] pass rxn_rate_buf into lookup_cool_rates1d --- src/clib/lookup_cool_rates1d.hpp | 4 ++++ src/clib/solve_rate_cool_g-cpp.cpp | 3 ++- src/clib/time_deriv_0d.hpp | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/clib/lookup_cool_rates1d.hpp b/src/clib/lookup_cool_rates1d.hpp index 1b5914150..add643954 100644 --- a/src/clib/lookup_cool_rates1d.hpp +++ b/src/clib/lookup_cool_rates1d.hpp @@ -21,6 +21,7 @@ #include "dust/lookup_dust_rates1d.hpp" #include "fortran_func_decls.h" #include "fortran_func_wrappers.hpp" +#include "full_rxn_rate_buf.hpp" #include "internal_types.hpp" #include "opaque_storage.hpp" #include "utils-cpp.hpp" @@ -761,6 +762,8 @@ inline void apply_misc_shield_factors( /// each location in @p idx_range /// @param[out] kshield_buf Buffers filled with shielding-adjusted photo /// reaction rates for @p idx_range +/// @param[out] rxn_rate_buf Buffers filled with computed reaction rates for +/// @p idx_range /// @param[out] chemheatrates_buf Buffers that are filled with interpolated /// values that are used to compute heating from certain chemical reactions. /// @param[inout] internal_dust_prop_scratch_buf Scratch space used to hold @@ -782,6 +785,7 @@ inline void lookup_cool_rates1d( grackle::impl::LogTLinInterpScratchBuf logTlininterp_buf, grackle::impl::CollisionalRxnRateCollection kcol_buf, grackle::impl::PhotoRxnRateCollection kshield_buf, + FullRxnRateBuf rxn_rate_buf, grackle::impl::ChemHeatingRates chemheatrates_buf, grackle::impl::InternalDustPropBuf internal_dust_prop_scratch_buf) { // Construct views of fields referenced in several parts of this function. diff --git a/src/clib/solve_rate_cool_g-cpp.cpp b/src/clib/solve_rate_cool_g-cpp.cpp index d47c98581..887e1f3dd 100644 --- a/src/clib/solve_rate_cool_g-cpp.cpp +++ b/src/clib/solve_rate_cool_g-cpp.cpp @@ -838,7 +838,8 @@ int solve_rate_cool_g( my_rates, my_fields, *my_uvb_rates, internalu, spsolvbuf.grain_growth_rates, grain_temperatures, logTlininterp_buf, spsolvbuf.kcr_buf, spsolvbuf.kshield_buf, - spsolvbuf.chemheatrates_buf, internal_dust_prop_scratch_buf + spsolvbuf.rxn_rate_buf, spsolvbuf.chemheatrates_buf, + internal_dust_prop_scratch_buf ); // Compute dedot and HIdot, the rates of change of de and HI diff --git a/src/clib/time_deriv_0d.hpp b/src/clib/time_deriv_0d.hpp index e30469990..69b47a201 100644 --- a/src/clib/time_deriv_0d.hpp +++ b/src/clib/time_deriv_0d.hpp @@ -508,6 +508,7 @@ void derivatives( pack.main_scratch_buf.grain_temperatures, pack.main_scratch_buf.logTlininterp_buf, pack.main_scratch_buf.kcr_buf, pack.main_scratch_buf.kshield_buf, + pack.main_scratch_buf.rxn_rate_buf, pack.main_scratch_buf.chemheatrates_buf, pack.main_scratch_buf.internal_dust_prop_scratch_buf ); From 61b5e3d7399b108e3c6c26dc6084a4a74b32c2b0 Mon Sep 17 00:00:00 2001 From: Matthew Abruzzo Date: Wed, 14 Jan 2026 21:15:11 -0500 Subject: [PATCH 23/31] pass FullRxnRateBuf into `set_subcycle_dt_from_chemistry_scheme_` --- src/clib/solve_rate_cool_g-cpp.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/clib/solve_rate_cool_g-cpp.cpp b/src/clib/solve_rate_cool_g-cpp.cpp index 887e1f3dd..9abadad32 100644 --- a/src/clib/solve_rate_cool_g-cpp.cpp +++ b/src/clib/solve_rate_cool_g-cpp.cpp @@ -317,6 +317,8 @@ static double calc_Heq_div_dHeqdt_( /// @param[in] my_fields specifies the field data /// @param[in] kcr_buf holds various pre-computed chemical reaction rates for /// each location in `idx_range`. +/// @param[in] rxn_rate_buf holds various pre-computed reaction rates for +/// each location in `idx_range`. /// /// @todo /// Consider breaking this into 2 functions that separately determines dtit for @@ -333,7 +335,8 @@ static void set_subcycle_dt_from_chemistry_scheme_( double dlogtem, const grackle::impl::LogTLinInterpScratchBuf logTlininterp_buf, grackle_field_data* my_fields, - grackle::impl::CollisionalRxnRateCollection kcr_buf + grackle::impl::CollisionalRxnRateCollection kcr_buf, + grackle::impl::FullRxnRateBuf rxn_rate_buf ) { const int j = idx_range.j; const int k = idx_range.k; @@ -877,7 +880,7 @@ int solve_rate_cool_g( spsolvbuf.dedot_prev, spsolvbuf.HIdot_prev, spsolvbuf.ddom, tgas.data(), p2d.data(), edot.data(), my_chemistry, my_rates, dlogtem, logTlininterp_buf, my_fields, - spsolvbuf.kcr_buf + spsolvbuf.kcr_buf, spsolvbuf.rxn_rate_buf ); } From 4fa6add513ecdb6c5af17df282b205f40568f224 Mon Sep 17 00:00:00 2001 From: Matthew Abruzzo Date: Wed, 14 Jan 2026 21:49:31 -0500 Subject: [PATCH 24/31] shift to using rxn_rate_bufs for tracking collisional reaction rates --- src/clib/chemistry_solver_funcs.hpp | 1295 ++++++++++++++------------- src/clib/lookup_cool_rates1d.hpp | 36 +- src/clib/rate_timestep_g.cpp | 106 +-- src/clib/rate_timestep_g.hpp | 3 - src/clib/solve_rate_cool_g-cpp.cpp | 31 +- src/clib/step_rate_gauss_seidel.hpp | 3 +- src/clib/time_deriv_0d.hpp | 8 +- 7 files changed, 732 insertions(+), 750 deletions(-) diff --git a/src/clib/chemistry_solver_funcs.hpp b/src/clib/chemistry_solver_funcs.hpp index 4df18f810..755c6ecff 100644 --- a/src/clib/chemistry_solver_funcs.hpp +++ b/src/clib/chemistry_solver_funcs.hpp @@ -57,7 +57,7 @@ namespace grackle::impl::chemistry { /// @param[in] my_uvb_rates specifies precomputed rxn rates dependent on the /// UV background, without accounting for self-shield (we probably don't /// need to pass the whole thing since we also pass kshield_buf) -/// @param[in] grain_growth_rates, kcr_buf, kshield_buf specifies the +/// @param[in] grain_growth_rates, kshield_buf specifies the /// precomputed rxn rates (depends on local physical conditions) /// @param[in] rxn_rate_buf specifies the precomputed rxn rates (depends on /// local physical conditions) @@ -115,7 +115,6 @@ inline void species_density_updates_gauss_seidel( const gr_mask_type* itmask_metal, chemistry_data* my_chemistry, grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, grackle::impl::GrainSpeciesCollection grain_growth_rates, - grackle::impl::CollisionalRxnRateCollection kcol_buf, grackle::impl::PhotoRxnRateCollection kshield_buf, const FullRxnRateBuf rxn_rate_buf ) @@ -187,6 +186,7 @@ inline void species_density_updates_gauss_seidel( grackle::impl::View kdissH2O(my_fields->RT_H2O_dissociation_rate, my_fields->grid_dimension[0], my_fields->grid_dimension[1], my_fields->grid_dimension[2]); // locals + const double* const* kcol_buf = FullRxnRateBuf_kcol_bufs(&rxn_rate_buf); int i; double scoef, acoef; @@ -202,10 +202,10 @@ inline void species_density_updates_gauss_seidel( // 1) HI - scoef = kcol_buf.data[CollisionalRxnLUT::k2][i]*HII(i,j,k)*de(i,j,k); - acoef = kcol_buf.data[CollisionalRxnLUT::k1][i]*de(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k57][i]*HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k58][i]*HeI(i,j,k)/4. + scoef = kcol_buf[CollisionalRxnLUT::k2][i]*HII(i,j,k)*de(i,j,k); + acoef = kcol_buf[CollisionalRxnLUT::k1][i]*de(i,j,k) + + kcol_buf[CollisionalRxnLUT::k57][i]*HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::k58][i]*HeI(i,j,k)/4. + kshield_buf.k24[i]; if (my_chemistry->use_radiative_transfer == 1) { acoef = acoef + kphHI(i,j,k); } out_spdens.data[SpLUT::HI][i] = (scoef*dtit[i] + HI(i,j,k))/ @@ -230,13 +230,13 @@ inline void species_density_updates_gauss_seidel( } // 2) HII - scoef = kcol_buf.data[CollisionalRxnLUT::k1][i]*out_spdens.data[SpLUT::HI][i]*de(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k57][i]*out_spdens.data[SpLUT::HI][i]*out_spdens.data[SpLUT::HI][i] - + kcol_buf.data[CollisionalRxnLUT::k58][i]*out_spdens.data[SpLUT::HI][i]*HeI(i,j,k)/4. + scoef = kcol_buf[CollisionalRxnLUT::k1][i]*out_spdens.data[SpLUT::HI][i]*de(i,j,k) + + kcol_buf[CollisionalRxnLUT::k57][i]*out_spdens.data[SpLUT::HI][i]*out_spdens.data[SpLUT::HI][i] + + kcol_buf[CollisionalRxnLUT::k58][i]*out_spdens.data[SpLUT::HI][i]*HeI(i,j,k)/4. + kshield_buf.k24[i]*out_spdens.data[SpLUT::HI][i]; if (my_chemistry->use_radiative_transfer == 1) { scoef = scoef + kphHI(i,j,k)*out_spdens.data[SpLUT::HI][i]; } - acoef = kcol_buf.data[CollisionalRxnLUT::k2][i]*de (i,j,k); + acoef = kcol_buf[CollisionalRxnLUT::k2][i]*de (i,j,k); out_spdens.data[SpLUT::HII][i] = (scoef*dtit[i] + HII(i,j,k))/ (1. +acoef*dtit[i]); // @@ -253,7 +253,7 @@ inline void species_density_updates_gauss_seidel( dtit [ i ], HII ( i, j, k ), acoef, - kcol_buf.data[CollisionalRxnLUT::k2] [ i ], + kcol_buf[CollisionalRxnLUT::k2] [ i ], de ( i, j, k ), kphHI ( i, j, k ), out_spdens.data[SpLUT::HI] [ i ], @@ -264,8 +264,8 @@ inline void species_density_updates_gauss_seidel( // 3) Electron density scoef = 0. - + kcol_buf.data[CollisionalRxnLUT::k57][i]*out_spdens.data[SpLUT::HI][i]*out_spdens.data[SpLUT::HI][i] - + kcol_buf.data[CollisionalRxnLUT::k58][i]*out_spdens.data[SpLUT::HI][i]*HeI(i,j,k)/4. + + kcol_buf[CollisionalRxnLUT::k57][i]*out_spdens.data[SpLUT::HI][i]*out_spdens.data[SpLUT::HI][i] + + kcol_buf[CollisionalRxnLUT::k58][i]*out_spdens.data[SpLUT::HI][i]*HeI(i,j,k)/4. + kshield_buf.k24[i]*HI(i,j,k) + kshield_buf.k25[i]*HeII(i,j,k)/4. + kshield_buf.k26[i]*HeI(i,j,k)/4.; @@ -279,11 +279,11 @@ inline void species_density_updates_gauss_seidel( - acoef = -(kcol_buf.data[CollisionalRxnLUT::k1][i]*HI(i,j,k) - kcol_buf.data[CollisionalRxnLUT::k2][i]*HII(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k3][i]*HeI(i,j,k)/4. - - kcol_buf.data[CollisionalRxnLUT::k6][i]*HeIII(i,j,k)/4. - + kcol_buf.data[CollisionalRxnLUT::k5][i]*HeII(i,j,k)/4. - - kcol_buf.data[CollisionalRxnLUT::k4][i]*HeII(i,j,k)/4.); + acoef = -(kcol_buf[CollisionalRxnLUT::k1][i]*HI(i,j,k) - kcol_buf[CollisionalRxnLUT::k2][i]*HII(i,j,k) + + kcol_buf[CollisionalRxnLUT::k3][i]*HeI(i,j,k)/4. - + kcol_buf[CollisionalRxnLUT::k6][i]*HeIII(i,j,k)/4. + + kcol_buf[CollisionalRxnLUT::k5][i]*HeII(i,j,k)/4. - + kcol_buf[CollisionalRxnLUT::k4][i]*HeII(i,j,k)/4.); out_spdens.data[SpLUT::e][i] = (scoef*dtit[i] + de(i,j,k)) / (1. + acoef*dtit[i]); @@ -299,53 +299,53 @@ inline void species_density_updates_gauss_seidel( // 4) HeI - scoef = kcol_buf.data[CollisionalRxnLUT::k4][i]*HeII(i,j,k)*de(i,j,k); - acoef = kcol_buf.data[CollisionalRxnLUT::k3][i]*de(i,j,k) + scoef = kcol_buf[CollisionalRxnLUT::k4][i]*HeII(i,j,k)*de(i,j,k); + acoef = kcol_buf[CollisionalRxnLUT::k3][i]*de(i,j,k) + kshield_buf.k26[i]; if ( (my_chemistry->use_radiative_transfer == 1) && (my_chemistry->radiative_transfer_hydrogen_only == 0)) { acoef = acoef + kphHeI(i,j,k); } if (my_chemistry->primordial_chemistry > 3) { scoef = scoef + 4. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::k152][i] * HeHII(i,j,k) * HI(i,j,k) / 5. - + kcol_buf.data[CollisionalRxnLUT::k153][i] * HeHII(i,j,k) * de(i,j,k) / 5. + + kcol_buf[CollisionalRxnLUT::k152][i] * HeHII(i,j,k) * HI(i,j,k) / 5. + + kcol_buf[CollisionalRxnLUT::k153][i] * HeHII(i,j,k) * de(i,j,k) / 5. ); acoef = acoef - + kcol_buf.data[CollisionalRxnLUT::k148][i] * HII(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k149][i] * HII(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k150][i] * H2II(i,j,k) / 2.; + + kcol_buf[CollisionalRxnLUT::k148][i] * HII(i,j,k) + + kcol_buf[CollisionalRxnLUT::k149][i] * HII(i,j,k) + + kcol_buf[CollisionalRxnLUT::k150][i] * H2II(i,j,k) / 2.; } out_spdens.data[SpLUT::HeI][i] = ( scoef*dtit[i] + HeI(i,j,k) ) / ( 1. + acoef*dtit[i] ); // 5) HeII - scoef = kcol_buf.data[CollisionalRxnLUT::k3][i]*out_spdens.data[SpLUT::HeI][i]*de(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k6][i]*HeIII(i,j,k)*de(i,j,k) + scoef = kcol_buf[CollisionalRxnLUT::k3][i]*out_spdens.data[SpLUT::HeI][i]*de(i,j,k) + + kcol_buf[CollisionalRxnLUT::k6][i]*HeIII(i,j,k)*de(i,j,k) + kshield_buf.k26[i]*out_spdens.data[SpLUT::HeI][i]; if ( (my_chemistry->use_radiative_transfer == 1) && (my_chemistry->radiative_transfer_hydrogen_only == 0)) { scoef = scoef + kphHeI(i,j,k)*out_spdens.data[SpLUT::HeI][i]; } - acoef = kcol_buf.data[CollisionalRxnLUT::k4][i]*de(i,j,k) + kcol_buf.data[CollisionalRxnLUT::k5][i]*de(i,j,k) + acoef = kcol_buf[CollisionalRxnLUT::k4][i]*de(i,j,k) + kcol_buf[CollisionalRxnLUT::k5][i]*de(i,j,k) + kshield_buf.k25[i]; if ( (my_chemistry->use_radiative_transfer == 1) && (my_chemistry->radiative_transfer_hydrogen_only == 0)) { acoef = acoef + kphHeII(i,j,k); } if (my_chemistry->primordial_chemistry > 3) { acoef = acoef - + kcol_buf.data[CollisionalRxnLUT::k151][i] * HI(i,j,k); + + kcol_buf[CollisionalRxnLUT::k151][i] * HI(i,j,k); } out_spdens.data[SpLUT::HeII][i] = ( scoef*dtit[i] + HeII(i,j,k) ) / ( 1. + acoef*dtit[i] ); // 6) HeIII - scoef = kcol_buf.data[CollisionalRxnLUT::k5][i]*out_spdens.data[SpLUT::HeII][i]*de(i,j,k) + scoef = kcol_buf[CollisionalRxnLUT::k5][i]*out_spdens.data[SpLUT::HeII][i]*de(i,j,k) + kshield_buf.k25[i]*out_spdens.data[SpLUT::HeII][i]; if ((my_chemistry->use_radiative_transfer == 1) && (my_chemistry->radiative_transfer_hydrogen_only == 0)) { scoef = scoef + kphHeII(i,j,k) * out_spdens.data[SpLUT::HeII][i]; } - acoef = kcol_buf.data[CollisionalRxnLUT::k6][i]*de(i,j,k); + acoef = kcol_buf[CollisionalRxnLUT::k6][i]*de(i,j,k); out_spdens.data[SpLUT::HeIII][i] = ( scoef*dtit[i] + HeIII(i,j,k) ) / ( 1. + acoef*dtit[i] ); @@ -362,25 +362,25 @@ inline void species_density_updates_gauss_seidel( if (itmask[i] != MASK_FALSE) { // 1) HI - scoef = kcol_buf.data[CollisionalRxnLUT::k2][i] * HII(i,j,k) * de(i,j,k) - + 2.*kcol_buf.data[CollisionalRxnLUT::k13][i]* HI(i,j,k) * H2I(i,j,k)/2. - + kcol_buf.data[CollisionalRxnLUT::k11][i]* HII(i,j,k) * H2I(i,j,k)/2. - + 2.*kcol_buf.data[CollisionalRxnLUT::k12][i]* de(i,j,k) * H2I(i,j,k)/2. - + kcol_buf.data[CollisionalRxnLUT::k14][i]* HM(i,j,k) * de(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k15][i]* HM(i,j,k) * HI(i,j,k) - + 2.*kcol_buf.data[CollisionalRxnLUT::k16][i]* HM(i,j,k) * HII(i,j,k) - + 2.*kcol_buf.data[CollisionalRxnLUT::k18][i]* H2II(i,j,k)* de(i,j,k)/2. - + kcol_buf.data[CollisionalRxnLUT::k19][i]* H2II(i,j,k)* HM(i,j,k)/2. + scoef = kcol_buf[CollisionalRxnLUT::k2][i] * HII(i,j,k) * de(i,j,k) + + 2.*kcol_buf[CollisionalRxnLUT::k13][i]* HI(i,j,k) * H2I(i,j,k)/2. + + kcol_buf[CollisionalRxnLUT::k11][i]* HII(i,j,k) * H2I(i,j,k)/2. + + 2.*kcol_buf[CollisionalRxnLUT::k12][i]* de(i,j,k) * H2I(i,j,k)/2. + + kcol_buf[CollisionalRxnLUT::k14][i]* HM(i,j,k) * de(i,j,k) + + kcol_buf[CollisionalRxnLUT::k15][i]* HM(i,j,k) * HI(i,j,k) + + 2.*kcol_buf[CollisionalRxnLUT::k16][i]* HM(i,j,k) * HII(i,j,k) + + 2.*kcol_buf[CollisionalRxnLUT::k18][i]* H2II(i,j,k)* de(i,j,k)/2. + + kcol_buf[CollisionalRxnLUT::k19][i]* H2II(i,j,k)* HM(i,j,k)/2. + 2.*kshield_buf.k31[i] * H2I(i,j,k)/2.; - acoef = kcol_buf.data[CollisionalRxnLUT::k1][i] * de(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k7][i] * de(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k8][i] * HM(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k9][i] * HII(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k10][i]* H2II(i,j,k)/2. - + 2.*kcol_buf.data[CollisionalRxnLUT::k22][i]* std::pow(HI(i,j,k),2) - + kcol_buf.data[CollisionalRxnLUT::k57][i]* HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k58][i]* HeI(i,j,k)/4. + acoef = kcol_buf[CollisionalRxnLUT::k1][i] * de(i,j,k) + + kcol_buf[CollisionalRxnLUT::k7][i] * de(i,j,k) + + kcol_buf[CollisionalRxnLUT::k8][i] * HM(i,j,k) + + kcol_buf[CollisionalRxnLUT::k9][i] * HII(i,j,k) + + kcol_buf[CollisionalRxnLUT::k10][i]* H2II(i,j,k)/2. + + 2.*kcol_buf[CollisionalRxnLUT::k22][i]* std::pow(HI(i,j,k),2) + + kcol_buf[CollisionalRxnLUT::k57][i]* HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::k58][i]* HeI(i,j,k)/4. + kshield_buf.k24[i]; if (my_chemistry->use_radiative_transfer == 1) { acoef = acoef + kphHI(i,j,k); } @@ -407,63 +407,63 @@ inline void species_density_updates_gauss_seidel( #ifdef CONTRIBUTION_OF_MINOR_SPECIES if (my_chemistry->primordial_chemistry > 2) { scoef = scoef - + kcol_buf.data[CollisionalRxnLUT::k50][i] * HII(i,j,k) * DI(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::k54][i] * H2I(i,j,k) * DI(i,j,k) / 4.; + + kcol_buf[CollisionalRxnLUT::k50][i] * HII(i,j,k) * DI(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k54][i] * H2I(i,j,k) * DI(i,j,k) / 4.; acoef = acoef - + kcol_buf.data[CollisionalRxnLUT::k51][i] * DII(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::k55][i] * HDI(i,j,k) / 3.; + + kcol_buf[CollisionalRxnLUT::k51][i] * DII(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k55][i] * HDI(i,j,k) / 3.; } #endif if (my_chemistry->primordial_chemistry > 3) { scoef = scoef - + kcol_buf.data[CollisionalRxnLUT::k131][i] * HDII(i,j,k) * de(i,j,k) / 3. - + kcol_buf.data[CollisionalRxnLUT::k134][i] * HII(i,j,k) * DM(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::k135][i] * HM(i,j,k) * DI(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::k150][i] * HeI(i,j,k) * H2II(i,j,k) / 8. - + kcol_buf.data[CollisionalRxnLUT::k153][i] * HeHII(i,j,k) * de(i,j,k) / 5.; + + kcol_buf[CollisionalRxnLUT::k131][i] * HDII(i,j,k) * de(i,j,k) / 3. + + kcol_buf[CollisionalRxnLUT::k134][i] * HII(i,j,k) * DM(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k135][i] * HM(i,j,k) * DI(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k150][i] * HeI(i,j,k) * H2II(i,j,k) / 8. + + kcol_buf[CollisionalRxnLUT::k153][i] * HeHII(i,j,k) * de(i,j,k) / 5.; acoef = acoef - + kcol_buf.data[CollisionalRxnLUT::k125][i] * HDII(i,j,k) / 3. - + kcol_buf.data[CollisionalRxnLUT::k130][i] * DII(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::k136][i] * DM(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::k137][i] * DM(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::k151][i] * HeII(i,j,k) / 4. - + kcol_buf.data[CollisionalRxnLUT::k152][i] * HeHII(i,j,k) / 5.; + + kcol_buf[CollisionalRxnLUT::k125][i] * HDII(i,j,k) / 3. + + kcol_buf[CollisionalRxnLUT::k130][i] * DII(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k136][i] * DM(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k137][i] * DM(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k151][i] * HeII(i,j,k) / 4. + + kcol_buf[CollisionalRxnLUT::k152][i] * HeHII(i,j,k) / 5.; } if ( (my_chemistry->metal_chemistry == 1) && (itmask_metal[i] != MASK_FALSE) ) { scoef = scoef - + kcol_buf.data[CollisionalRxnLUT::kz20][i] * CI(i,j,k) * H2I(i,j,k) / 24. - + kcol_buf.data[CollisionalRxnLUT::kz21][i] * OI(i,j,k) * H2I(i,j,k) / 32. - + kcol_buf.data[CollisionalRxnLUT::kz22][i] * HII(i,j,k) * OI(i,j,k) / 16. - + kcol_buf.data[CollisionalRxnLUT::kz23][i] * H2I(i,j,k) * CH(i,j,k) / 26. - + kcol_buf.data[CollisionalRxnLUT::kz24][i] * H2I(i,j,k) * OH(i,j,k) / 34. - + kcol_buf.data[CollisionalRxnLUT::kz26][i] * OH(i,j,k) * CO(i,j,k) / 476. - + kcol_buf.data[CollisionalRxnLUT::kz28][i] * CI(i,j,k) * OH(i,j,k) / 204. - + kcol_buf.data[CollisionalRxnLUT::kz32][i] * OI(i,j,k) * CH(i,j,k) / 208. - + kcol_buf.data[CollisionalRxnLUT::kz33][i] * OI(i,j,k) * OH(i,j,k) / 272. - + kcol_buf.data[CollisionalRxnLUT::kz34][i] * HII(i,j,k) * OH(i,j,k) / 17. - + kcol_buf.data[CollisionalRxnLUT::kz35][i] * HII(i,j,k) * H2O(i,j,k) / 18. - + kcol_buf.data[CollisionalRxnLUT::kz36][i] * HII(i,j,k) * O2(i,j,k) / 32. - + kcol_buf.data[CollisionalRxnLUT::kz37][i] * CII(i,j,k) * OH(i,j,k) / 204. - + kcol_buf.data[CollisionalRxnLUT::kz40][i] * OII(i,j,k) * H2I(i,j,k) / 32. - + kcol_buf.data[CollisionalRxnLUT::kz41][i] * OHII(i,j,k) * H2I(i,j,k) / 34. - + kcol_buf.data[CollisionalRxnLUT::kz42][i] * H2OII(i,j,k) * H2I(i,j,k) / 36. - + kcol_buf.data[CollisionalRxnLUT::kz46][i] * H2OII(i,j,k) * de(i,j,k) / 18. - + kcol_buf.data[CollisionalRxnLUT::kz48][i] * H3OII(i,j,k) * de(i,j,k) / 19. - + kcol_buf.data[CollisionalRxnLUT::kz49][i] * H3OII(i,j,k) * de(i,j,k) / 9.5 - + kcol_buf.data[CollisionalRxnLUT::kz52][i] * SiI(i,j,k) * OH(i,j,k) / 476. - + kcol_buf.data[CollisionalRxnLUT::kz54][i] * SiOI(i,j,k) * OH(i,j,k) / 748.; + + kcol_buf[CollisionalRxnLUT::kz20][i] * CI(i,j,k) * H2I(i,j,k) / 24. + + kcol_buf[CollisionalRxnLUT::kz21][i] * OI(i,j,k) * H2I(i,j,k) / 32. + + kcol_buf[CollisionalRxnLUT::kz22][i] * HII(i,j,k) * OI(i,j,k) / 16. + + kcol_buf[CollisionalRxnLUT::kz23][i] * H2I(i,j,k) * CH(i,j,k) / 26. + + kcol_buf[CollisionalRxnLUT::kz24][i] * H2I(i,j,k) * OH(i,j,k) / 34. + + kcol_buf[CollisionalRxnLUT::kz26][i] * OH(i,j,k) * CO(i,j,k) / 476. + + kcol_buf[CollisionalRxnLUT::kz28][i] * CI(i,j,k) * OH(i,j,k) / 204. + + kcol_buf[CollisionalRxnLUT::kz32][i] * OI(i,j,k) * CH(i,j,k) / 208. + + kcol_buf[CollisionalRxnLUT::kz33][i] * OI(i,j,k) * OH(i,j,k) / 272. + + kcol_buf[CollisionalRxnLUT::kz34][i] * HII(i,j,k) * OH(i,j,k) / 17. + + kcol_buf[CollisionalRxnLUT::kz35][i] * HII(i,j,k) * H2O(i,j,k) / 18. + + kcol_buf[CollisionalRxnLUT::kz36][i] * HII(i,j,k) * O2(i,j,k) / 32. + + kcol_buf[CollisionalRxnLUT::kz37][i] * CII(i,j,k) * OH(i,j,k) / 204. + + kcol_buf[CollisionalRxnLUT::kz40][i] * OII(i,j,k) * H2I(i,j,k) / 32. + + kcol_buf[CollisionalRxnLUT::kz41][i] * OHII(i,j,k) * H2I(i,j,k) / 34. + + kcol_buf[CollisionalRxnLUT::kz42][i] * H2OII(i,j,k) * H2I(i,j,k) / 36. + + kcol_buf[CollisionalRxnLUT::kz46][i] * H2OII(i,j,k) * de(i,j,k) / 18. + + kcol_buf[CollisionalRxnLUT::kz48][i] * H3OII(i,j,k) * de(i,j,k) / 19. + + kcol_buf[CollisionalRxnLUT::kz49][i] * H3OII(i,j,k) * de(i,j,k) / 9.5 + + kcol_buf[CollisionalRxnLUT::kz52][i] * SiI(i,j,k) * OH(i,j,k) / 476. + + kcol_buf[CollisionalRxnLUT::kz54][i] * SiOI(i,j,k) * OH(i,j,k) / 748.; acoef = acoef - + kcol_buf.data[CollisionalRxnLUT::kz15][i] * CH(i,j,k) / 13. - + kcol_buf.data[CollisionalRxnLUT::kz16][i] * CH2(i,j,k) / 14. - + kcol_buf.data[CollisionalRxnLUT::kz17][i] * OH(i,j,k) / 17. - + kcol_buf.data[CollisionalRxnLUT::kz18][i] * H2O(i,j,k) / 18. - + kcol_buf.data[CollisionalRxnLUT::kz19][i] * O2(i,j,k) / 32. - + kcol_buf.data[CollisionalRxnLUT::kz27][i] * CI(i,j,k) / 12. - + kcol_buf.data[CollisionalRxnLUT::kz30][i] * OI(i,j,k) / 16. - + kcol_buf.data[CollisionalRxnLUT::kz39][i] * OII(i,j,k) / 16. - + kcol_buf.data[CollisionalRxnLUT::kz43][i] * COII(i,j,k) / 28.; + + kcol_buf[CollisionalRxnLUT::kz15][i] * CH(i,j,k) / 13. + + kcol_buf[CollisionalRxnLUT::kz16][i] * CH2(i,j,k) / 14. + + kcol_buf[CollisionalRxnLUT::kz17][i] * OH(i,j,k) / 17. + + kcol_buf[CollisionalRxnLUT::kz18][i] * H2O(i,j,k) / 18. + + kcol_buf[CollisionalRxnLUT::kz19][i] * O2(i,j,k) / 32. + + kcol_buf[CollisionalRxnLUT::kz27][i] * CI(i,j,k) / 12. + + kcol_buf[CollisionalRxnLUT::kz30][i] * OI(i,j,k) / 16. + + kcol_buf[CollisionalRxnLUT::kz39][i] * OII(i,j,k) / 16. + + kcol_buf[CollisionalRxnLUT::kz43][i] * COII(i,j,k) / 28.; } out_spdens.data[SpLUT::HI][i] = ( scoef*dtit[i] + HI(i,j,k) ) / ( 1.f + acoef*dtit[i] ); @@ -485,61 +485,61 @@ inline void species_density_updates_gauss_seidel( // 2) HII - scoef = kcol_buf.data[CollisionalRxnLUT::k1][i] * HI(i,j,k) * de(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k10][i] * H2II(i,j,k)*HI(i,j,k)/2. - + kcol_buf.data[CollisionalRxnLUT::k57][i] * HI(i,j,k) * HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k58][i] * HI(i,j,k) * HeI(i,j,k)/4. + scoef = kcol_buf[CollisionalRxnLUT::k1][i] * HI(i,j,k) * de(i,j,k) + + kcol_buf[CollisionalRxnLUT::k10][i] * H2II(i,j,k)*HI(i,j,k)/2. + + kcol_buf[CollisionalRxnLUT::k57][i] * HI(i,j,k) * HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::k58][i] * HI(i,j,k) * HeI(i,j,k)/4. + kshield_buf.k24[i]*HI(i,j,k); if (my_chemistry->use_radiative_transfer == 1) { scoef = scoef + kphHI(i,j,k) * HI(i,j,k); } - acoef = kcol_buf.data[CollisionalRxnLUT::k2][i] * de(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k9][i] * HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k11][i] * H2I(i,j,k)/2. - + kcol_buf.data[CollisionalRxnLUT::k16][i] * HM(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k17][i] * HM(i,j,k); + acoef = kcol_buf[CollisionalRxnLUT::k2][i] * de(i,j,k) + + kcol_buf[CollisionalRxnLUT::k9][i] * HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::k11][i] * H2I(i,j,k)/2. + + kcol_buf[CollisionalRxnLUT::k16][i] * HM(i,j,k) + + kcol_buf[CollisionalRxnLUT::k17][i] * HM(i,j,k); #ifdef CONTRIBUTION_OF_MINOR_SPECIES if (my_chemistry->primordial_chemistry > 2) { scoef = scoef - + kcol_buf.data[CollisionalRxnLUT::k51][i] * HI (i,j,k) * DII(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::k52][i] * H2I(i,j,k) * DII(i,j,k) / 4.; + + kcol_buf[CollisionalRxnLUT::k51][i] * HI (i,j,k) * DII(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k52][i] * H2I(i,j,k) * DII(i,j,k) / 4.; acoef = acoef - + kcol_buf.data[CollisionalRxnLUT::k50][i] * DI (i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::k53][i] * HDI(i,j,k) / 3.; + + kcol_buf[CollisionalRxnLUT::k50][i] * DI (i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k53][i] * HDI(i,j,k) / 3.; } #endif if (my_chemistry->primordial_chemistry > 3) { scoef = scoef - + kcol_buf.data[CollisionalRxnLUT::k125][i] * HDII(i,j,k) * HI(i,j,k) / 3.; + + kcol_buf[CollisionalRxnLUT::k125][i] * HDII(i,j,k) * HI(i,j,k) / 3.; acoef = acoef - + kcol_buf.data[CollisionalRxnLUT::k129][i] * DI(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::k134][i] * DM(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::k148][i] * HeI(i,j,k) / 4. - + kcol_buf.data[CollisionalRxnLUT::k149][i] * HeI(i,j,k) / 4.; + + kcol_buf[CollisionalRxnLUT::k129][i] * DI(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k134][i] * DM(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k148][i] * HeI(i,j,k) / 4. + + kcol_buf[CollisionalRxnLUT::k149][i] * HeI(i,j,k) / 4.; } if ( (my_chemistry->metal_chemistry == 1) && (itmask_metal[i] != MASK_FALSE) ) { scoef = scoef - + kcol_buf.data[CollisionalRxnLUT::kz39][i] * OII(i,j,k) * HI(i,j,k) / 16. - + kcol_buf.data[CollisionalRxnLUT::kz43][i] * COII(i,j,k) * HI(i,j,k) / 28.; + + kcol_buf[CollisionalRxnLUT::kz39][i] * OII(i,j,k) * HI(i,j,k) / 16. + + kcol_buf[CollisionalRxnLUT::kz43][i] * COII(i,j,k) * HI(i,j,k) / 28.; acoef = acoef - + kcol_buf.data[CollisionalRxnLUT::kz22][i] * OI(i,j,k) / 16. - + kcol_buf.data[CollisionalRxnLUT::kz34][i] * OH(i,j,k) / 17. - + kcol_buf.data[CollisionalRxnLUT::kz35][i] * H2O(i,j,k) / 18. - + kcol_buf.data[CollisionalRxnLUT::kz36][i] * O2(i,j,k) / 32.; + + kcol_buf[CollisionalRxnLUT::kz22][i] * OI(i,j,k) / 16. + + kcol_buf[CollisionalRxnLUT::kz34][i] * OH(i,j,k) / 17. + + kcol_buf[CollisionalRxnLUT::kz35][i] * H2O(i,j,k) / 18. + + kcol_buf[CollisionalRxnLUT::kz36][i] * O2(i,j,k) / 32.; } out_spdens.data[SpLUT::HII][i] = ( scoef*dtit[i] + HII(i,j,k) ) / ( 1. + acoef*dtit[i] ); // 3) electrons: - scoef = kcol_buf.data[CollisionalRxnLUT::k8][i] * HM(i,j,k) * HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k15][i]* HM(i,j,k) * HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k17][i]* HM(i,j,k) * HII(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k57][i]* HI(i,j,k) * HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k58][i]* HI(i,j,k) * HeI(i,j,k)/4. + scoef = kcol_buf[CollisionalRxnLUT::k8][i] * HM(i,j,k) * HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::k15][i]* HM(i,j,k) * HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::k17][i]* HM(i,j,k) * HII(i,j,k) + + kcol_buf[CollisionalRxnLUT::k57][i]* HI(i,j,k) * HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::k58][i]* HI(i,j,k) * HeI(i,j,k)/4. // + kshield_buf.k24[i]*out_spdens.data[SpLUT::HI][i] + kshield_buf.k25[i]*out_spdens.data[SpLUT::HeII][i]/4. @@ -562,30 +562,30 @@ inline void species_density_updates_gauss_seidel( } } - acoef = - (kcol_buf.data[CollisionalRxnLUT::k1][i] *HI(i,j,k) - kcol_buf.data[CollisionalRxnLUT::k2][i]*HII(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k3][i] *HeI(i,j,k)/4. - - kcol_buf.data[CollisionalRxnLUT::k6][i]*HeIII(i,j,k)/4. - + kcol_buf.data[CollisionalRxnLUT::k5][i] *HeII(i,j,k)/4. - - kcol_buf.data[CollisionalRxnLUT::k4][i]*HeII(i,j,k)/4. - + kcol_buf.data[CollisionalRxnLUT::k14][i]*HM(i,j,k) - - kcol_buf.data[CollisionalRxnLUT::k7][i] *HI(i,j,k) - - kcol_buf.data[CollisionalRxnLUT::k18][i]*H2II(i,j,k)/2.); + acoef = - (kcol_buf[CollisionalRxnLUT::k1][i] *HI(i,j,k) - kcol_buf[CollisionalRxnLUT::k2][i]*HII(i,j,k) + + kcol_buf[CollisionalRxnLUT::k3][i] *HeI(i,j,k)/4. - + kcol_buf[CollisionalRxnLUT::k6][i]*HeIII(i,j,k)/4. + + kcol_buf[CollisionalRxnLUT::k5][i] *HeII(i,j,k)/4. - + kcol_buf[CollisionalRxnLUT::k4][i]*HeII(i,j,k)/4. + + kcol_buf[CollisionalRxnLUT::k14][i]*HM(i,j,k) + - kcol_buf[CollisionalRxnLUT::k7][i] *HI(i,j,k) + - kcol_buf[CollisionalRxnLUT::k18][i]*H2II(i,j,k)/2.); #ifdef CONTRIBUTION_OF_MINOR_SPECIES if (my_chemistry->primordial_chemistry > 2) { scoef = scoef - + kcol_buf.data[CollisionalRxnLUT::k56][i] * DI (i,j,k) * HM(i,j,k) / 2.; + + kcol_buf[CollisionalRxnLUT::k56][i] * DI (i,j,k) * HM(i,j,k) / 2.; acoef = acoef - - kcol_buf.data[CollisionalRxnLUT::k1] [i] * DI (i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::k2] [i] * DII(i,j,k) / 2.; + - kcol_buf[CollisionalRxnLUT::k1] [i] * DI (i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k2] [i] * DII(i,j,k) / 2.; } #endif if (my_chemistry->primordial_chemistry > 3) { scoef = scoef - + kcol_buf.data[CollisionalRxnLUT::k137][i] * DM(i,j,k) * HI(i,j,k) / 2.; + + kcol_buf[CollisionalRxnLUT::k137][i] * DM(i,j,k) * HI(i,j,k) / 2.; acoef = acoef - + kcol_buf.data[CollisionalRxnLUT::k131][i] * HDII(i,j,k) / 3. - + kcol_buf.data[CollisionalRxnLUT::k132][i] * DI(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::k153][i] * HeHII(i,j,k) / 5.; + + kcol_buf[CollisionalRxnLUT::k131][i] * HDII(i,j,k) / 3. + + kcol_buf[CollisionalRxnLUT::k132][i] * DI(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k153][i] * HeHII(i,j,k) / 5.; } if ( (my_chemistry->metal_chemistry == 1) && @@ -594,25 +594,25 @@ inline void species_density_updates_gauss_seidel( // it has no practical impact and produces a compiler warning // scoef = scoef; acoef = acoef - + kcol_buf.data[CollisionalRxnLUT::kz44][i] * CII(i,j,k) / 12. - + kcol_buf.data[CollisionalRxnLUT::kz45][i] * OII(i,j,k) / 16. - + kcol_buf.data[CollisionalRxnLUT::kz46][i] * H2OII(i,j,k) / 18. - + kcol_buf.data[CollisionalRxnLUT::kz47][i] * H2OII(i,j,k) / 18. - + kcol_buf.data[CollisionalRxnLUT::kz48][i] * H3OII(i,j,k) / 19. - + kcol_buf.data[CollisionalRxnLUT::kz49][i] * H3OII(i,j,k) / 19. - + kcol_buf.data[CollisionalRxnLUT::kz50][i] * O2II(i,j,k) / 32.; + + kcol_buf[CollisionalRxnLUT::kz44][i] * CII(i,j,k) / 12. + + kcol_buf[CollisionalRxnLUT::kz45][i] * OII(i,j,k) / 16. + + kcol_buf[CollisionalRxnLUT::kz46][i] * H2OII(i,j,k) / 18. + + kcol_buf[CollisionalRxnLUT::kz47][i] * H2OII(i,j,k) / 18. + + kcol_buf[CollisionalRxnLUT::kz48][i] * H3OII(i,j,k) / 19. + + kcol_buf[CollisionalRxnLUT::kz49][i] * H3OII(i,j,k) / 19. + + kcol_buf[CollisionalRxnLUT::kz50][i] * O2II(i,j,k) / 32.; } out_spdens.data[SpLUT::e][i] = ( scoef*dtit[i] + de(i,j,k) ) / ( 1. + acoef*dtit[i] ); // 7) H2 - scoef = 2.*(kcol_buf.data[CollisionalRxnLUT::k8][i] * HM(i,j,k) * HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k10][i] * H2II(i,j,k) * HI(i,j,k)/2. - + kcol_buf.data[CollisionalRxnLUT::k19][i] * H2II(i,j,k) * HM(i,j,k)/2. - + kcol_buf.data[CollisionalRxnLUT::k22][i] * HI(i,j,k) * std::pow((HI(i,j,k)),2.)); - acoef = ( kcol_buf.data[CollisionalRxnLUT::k13][i]*HI(i,j,k) + kcol_buf.data[CollisionalRxnLUT::k11][i]*HII(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k12][i]*de(i,j,k) ) + scoef = 2.*(kcol_buf[CollisionalRxnLUT::k8][i] * HM(i,j,k) * HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::k10][i] * H2II(i,j,k) * HI(i,j,k)/2. + + kcol_buf[CollisionalRxnLUT::k19][i] * H2II(i,j,k) * HM(i,j,k)/2. + + kcol_buf[CollisionalRxnLUT::k22][i] * HI(i,j,k) * std::pow((HI(i,j,k)),2.)); + acoef = ( kcol_buf[CollisionalRxnLUT::k13][i]*HI(i,j,k) + kcol_buf[CollisionalRxnLUT::k11][i]*HII(i,j,k) + + kcol_buf[CollisionalRxnLUT::k12][i]*de(i,j,k) ) + kshield_buf.k29[i] + kshield_buf.k31[i]; if (anydust != MASK_FALSE) { @@ -624,32 +624,32 @@ inline void species_density_updates_gauss_seidel( #ifdef CONTRIBUTION_OF_MINOR_SPECIES if (my_chemistry->primordial_chemistry > 2) { scoef = scoef + 2. * ( - kcol_buf.data[CollisionalRxnLUT::k53][i] * HDI(i,j,k) * HII(i,j,k) / 3. - + kcol_buf.data[CollisionalRxnLUT::k55][i] * HDI(i,j,k) * HI (i,j,k) / 3. + kcol_buf[CollisionalRxnLUT::k53][i] * HDI(i,j,k) * HII(i,j,k) / 3. + + kcol_buf[CollisionalRxnLUT::k55][i] * HDI(i,j,k) * HI (i,j,k) / 3. ); acoef = acoef - + kcol_buf.data[CollisionalRxnLUT::k52][i] * DII(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::k54][i] * DI (i,j,k) / 2.; + + kcol_buf[CollisionalRxnLUT::k52][i] * DII(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k54][i] * DI (i,j,k) / 2.; } #endif if ( (my_chemistry->metal_chemistry == 1) && (itmask_metal[i] != MASK_FALSE) ) { scoef = scoef + 2. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::kz15][i] * HI(i,j,k) * CH(i,j,k) / 13. - + kcol_buf.data[CollisionalRxnLUT::kz16][i] * HI(i,j,k) * CH2(i,j,k) / 14. - + kcol_buf.data[CollisionalRxnLUT::kz17][i] * HI(i,j,k) * OH(i,j,k) / 17. - + kcol_buf.data[CollisionalRxnLUT::kz18][i] * HI(i,j,k) * H2O(i,j,k) / 18. - + kcol_buf.data[CollisionalRxnLUT::kz47][i] * H2OII(i,j,k) * de(i,j,k) / 18. + + kcol_buf[CollisionalRxnLUT::kz15][i] * HI(i,j,k) * CH(i,j,k) / 13. + + kcol_buf[CollisionalRxnLUT::kz16][i] * HI(i,j,k) * CH2(i,j,k) / 14. + + kcol_buf[CollisionalRxnLUT::kz17][i] * HI(i,j,k) * OH(i,j,k) / 17. + + kcol_buf[CollisionalRxnLUT::kz18][i] * HI(i,j,k) * H2O(i,j,k) / 18. + + kcol_buf[CollisionalRxnLUT::kz47][i] * H2OII(i,j,k) * de(i,j,k) / 18. ); acoef = acoef - + kcol_buf.data[CollisionalRxnLUT::kz20][i] * CI(i,j,k) / 12. - + kcol_buf.data[CollisionalRxnLUT::kz21][i] * OI(i,j,k) / 16. - + kcol_buf.data[CollisionalRxnLUT::kz23][i] * CH(i,j,k) / 13. - + kcol_buf.data[CollisionalRxnLUT::kz24][i] * OH(i,j,k) / 17. - + kcol_buf.data[CollisionalRxnLUT::kz40][i] * OII(i,j,k) / 16. - + kcol_buf.data[CollisionalRxnLUT::kz41][i] * OHII(i,j,k) / 17. - + kcol_buf.data[CollisionalRxnLUT::kz42][i] * H2OII(i,j,k) / 18. - + kcol_buf.data[CollisionalRxnLUT::kz51][i] * CI(i,j,k) / 12.; + + kcol_buf[CollisionalRxnLUT::kz20][i] * CI(i,j,k) / 12. + + kcol_buf[CollisionalRxnLUT::kz21][i] * OI(i,j,k) / 16. + + kcol_buf[CollisionalRxnLUT::kz23][i] * CH(i,j,k) / 13. + + kcol_buf[CollisionalRxnLUT::kz24][i] * OH(i,j,k) / 17. + + kcol_buf[CollisionalRxnLUT::kz40][i] * OII(i,j,k) / 16. + + kcol_buf[CollisionalRxnLUT::kz41][i] * OHII(i,j,k) / 17. + + kcol_buf[CollisionalRxnLUT::kz42][i] * H2OII(i,j,k) / 18. + + kcol_buf[CollisionalRxnLUT::kz51][i] * CI(i,j,k) / 12.; if ((my_chemistry->grain_growth == 1) || (my_chemistry->dust_sublimation == 1)) { if (my_chemistry->dust_species > 0) { scoef = scoef + 2. * @@ -675,22 +675,22 @@ inline void species_density_updates_gauss_seidel( // 8) H- - scoef = kcol_buf.data[CollisionalRxnLUT::k7][i] * HI(i,j,k) * de(i,j,k); - acoef = (kcol_buf.data[CollisionalRxnLUT::k8][i] + kcol_buf.data[CollisionalRxnLUT::k15][i]) * HI(i,j,k) + - (kcol_buf.data[CollisionalRxnLUT::k16][i] + kcol_buf.data[CollisionalRxnLUT::k17][i]) * HII(i,j,k) + - kcol_buf.data[CollisionalRxnLUT::k14][i] * de(i,j,k) + kcol_buf.data[CollisionalRxnLUT::k19][i] * H2II(i,j,k)/2.0f + + scoef = kcol_buf[CollisionalRxnLUT::k7][i] * HI(i,j,k) * de(i,j,k); + acoef = (kcol_buf[CollisionalRxnLUT::k8][i] + kcol_buf[CollisionalRxnLUT::k15][i]) * HI(i,j,k) + + (kcol_buf[CollisionalRxnLUT::k16][i] + kcol_buf[CollisionalRxnLUT::k17][i]) * HII(i,j,k) + + kcol_buf[CollisionalRxnLUT::k14][i] * de(i,j,k) + kcol_buf[CollisionalRxnLUT::k19][i] * H2II(i,j,k)/2.0f + my_uvb_rates.k27; #ifdef CONTRIBUTION_OF_MINOR_SPECIES if (my_chemistry->primordial_chemistry > 2) { acoef = acoef - + kcol_buf.data[CollisionalRxnLUT::k56][i] * DI (i,j,k) / 2.; + + kcol_buf[CollisionalRxnLUT::k56][i] * DI (i,j,k) / 2.; } #endif if (my_chemistry->primordial_chemistry > 3) { scoef = scoef - + kcol_buf.data[CollisionalRxnLUT::k136][i] * DM(i,j,k) * HI(i,j,k) / 2.; + + kcol_buf[CollisionalRxnLUT::k136][i] * DM(i,j,k) * HI(i,j,k) / 2.; acoef = acoef - + kcol_buf.data[CollisionalRxnLUT::k135][i] * DI(i,j,k) / 2.; + + kcol_buf[CollisionalRxnLUT::k135][i] * DI(i,j,k) / 2.; } out_spdens.data[SpLUT::HM][i] = (scoef*dtit[i] + HM(i,j,k)) / (1.0f + acoef*dtit[i]); @@ -698,26 +698,26 @@ inline void species_density_updates_gauss_seidel( // 9) H2+ - out_spdens.data[SpLUT::H2II][i] = 2.*( kcol_buf.data[CollisionalRxnLUT::k9] [i]*out_spdens.data[SpLUT::HI][i]*out_spdens.data[SpLUT::HII][i] - + kcol_buf.data[CollisionalRxnLUT::k11][i]*out_spdens.data[SpLUT::H2I][i]/2.*out_spdens.data[SpLUT::HII][i] - + kcol_buf.data[CollisionalRxnLUT::k17][i]*out_spdens.data[SpLUT::HM][i]*out_spdens.data[SpLUT::HII][i] + out_spdens.data[SpLUT::H2II][i] = 2.*( kcol_buf[CollisionalRxnLUT::k9] [i]*out_spdens.data[SpLUT::HI][i]*out_spdens.data[SpLUT::HII][i] + + kcol_buf[CollisionalRxnLUT::k11][i]*out_spdens.data[SpLUT::H2I][i]/2.*out_spdens.data[SpLUT::HII][i] + + kcol_buf[CollisionalRxnLUT::k17][i]*out_spdens.data[SpLUT::HM][i]*out_spdens.data[SpLUT::HII][i] + kshield_buf.k29[i]*out_spdens.data[SpLUT::H2I][i] ) - / ( kcol_buf.data[CollisionalRxnLUT::k10][i]*out_spdens.data[SpLUT::HI][i] + kcol_buf.data[CollisionalRxnLUT::k18][i]*out_spdens.data[SpLUT::e][i] - + kcol_buf.data[CollisionalRxnLUT::k19][i]*out_spdens.data[SpLUT::HM][i] + / ( kcol_buf[CollisionalRxnLUT::k10][i]*out_spdens.data[SpLUT::HI][i] + kcol_buf[CollisionalRxnLUT::k18][i]*out_spdens.data[SpLUT::e][i] + + kcol_buf[CollisionalRxnLUT::k19][i]*out_spdens.data[SpLUT::HM][i] + (kshield_buf.k28[i]+kshield_buf.k30[i]) ); if (my_chemistry->primordial_chemistry > 3) { - out_spdens.data[SpLUT::H2II][i] = 2. * ( kcol_buf.data[CollisionalRxnLUT::k9] [i]*out_spdens.data[SpLUT::HI][i]*out_spdens.data[SpLUT::HII][i] - + kcol_buf.data[CollisionalRxnLUT::k11][i]*out_spdens.data[SpLUT::H2I][i]/2.*out_spdens.data[SpLUT::HII][i] - + kcol_buf.data[CollisionalRxnLUT::k17][i]*out_spdens.data[SpLUT::HM][i]*out_spdens.data[SpLUT::HII][i] + out_spdens.data[SpLUT::H2II][i] = 2. * ( kcol_buf[CollisionalRxnLUT::k9] [i]*out_spdens.data[SpLUT::HI][i]*out_spdens.data[SpLUT::HII][i] + + kcol_buf[CollisionalRxnLUT::k11][i]*out_spdens.data[SpLUT::H2I][i]/2.*out_spdens.data[SpLUT::HII][i] + + kcol_buf[CollisionalRxnLUT::k17][i]*out_spdens.data[SpLUT::HM][i]*out_spdens.data[SpLUT::HII][i] + kshield_buf.k29[i]*out_spdens.data[SpLUT::H2I][i] - + kcol_buf.data[CollisionalRxnLUT::k152][i]*HeHII(i,j,k)*out_spdens.data[SpLUT::HI][i]/5. + + kcol_buf[CollisionalRxnLUT::k152][i]*HeHII(i,j,k)*out_spdens.data[SpLUT::HI][i]/5. ) - / ( kcol_buf.data[CollisionalRxnLUT::k10][i]*out_spdens.data[SpLUT::HI][i] + kcol_buf.data[CollisionalRxnLUT::k18][i]*out_spdens.data[SpLUT::e][i] - + kcol_buf.data[CollisionalRxnLUT::k19][i]*out_spdens.data[SpLUT::HM][i] + / ( kcol_buf[CollisionalRxnLUT::k10][i]*out_spdens.data[SpLUT::HI][i] + kcol_buf[CollisionalRxnLUT::k18][i]*out_spdens.data[SpLUT::e][i] + + kcol_buf[CollisionalRxnLUT::k19][i]*out_spdens.data[SpLUT::HM][i] + (kshield_buf.k28[i]+kshield_buf.k30[i]) - + kcol_buf.data[CollisionalRxnLUT::k150][i]*out_spdens.data[SpLUT::HeI][i]/4. + + kcol_buf[CollisionalRxnLUT::k150][i]*out_spdens.data[SpLUT::HeI][i]/4. ); } } @@ -731,28 +731,28 @@ inline void species_density_updates_gauss_seidel( if (itmask[i] != MASK_FALSE) { // 1) DI - scoef = ( kcol_buf.data[CollisionalRxnLUT::k2][i] * DII(i,j,k) * de(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k51][i]* DII(i,j,k) * HI(i,j,k) - + 2.*kcol_buf.data[CollisionalRxnLUT::k55][i]* HDI(i,j,k) * + scoef = ( kcol_buf[CollisionalRxnLUT::k2][i] * DII(i,j,k) * de(i,j,k) + + kcol_buf[CollisionalRxnLUT::k51][i]* DII(i,j,k) * HI(i,j,k) + + 2.*kcol_buf[CollisionalRxnLUT::k55][i]* HDI(i,j,k) * HI(i,j,k)/3. ); - acoef = kcol_buf.data[CollisionalRxnLUT::k1][i] * de(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k50][i] * HII(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k54][i] * H2I(i,j,k)/2. - + kcol_buf.data[CollisionalRxnLUT::k56][i] * HM(i,j,k) + acoef = kcol_buf[CollisionalRxnLUT::k1][i] * de(i,j,k) + + kcol_buf[CollisionalRxnLUT::k50][i] * HII(i,j,k) + + kcol_buf[CollisionalRxnLUT::k54][i] * H2I(i,j,k)/2. + + kcol_buf[CollisionalRxnLUT::k56][i] * HM(i,j,k) + kshield_buf.k24[i]; if (my_chemistry->use_radiative_transfer == 1) { acoef = acoef + kphHI(i,j,k); } if (my_chemistry->primordial_chemistry > 3) { scoef = scoef + 2. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::k131][i] * HDII(i,j,k) * de(i,j,k) / 3. - + kcol_buf.data[CollisionalRxnLUT::k133][i] * DII(i,j,k) * DM(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::k134][i] * HII(i,j,k) * DM(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::k136][i] * DM(i,j,k) * HI(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k131][i] * HDII(i,j,k) * de(i,j,k) / 3. + + kcol_buf[CollisionalRxnLUT::k133][i] * DII(i,j,k) * DM(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k134][i] * HII(i,j,k) * DM(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k136][i] * DM(i,j,k) * HI(i,j,k) / 2. ); acoef = acoef - + kcol_buf.data[CollisionalRxnLUT::k129][i] * HII(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k132][i] * de(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k135][i] * HM(i,j,k); + + kcol_buf[CollisionalRxnLUT::k129][i] * HII(i,j,k) + + kcol_buf[CollisionalRxnLUT::k132][i] * de(i,j,k) + + kcol_buf[CollisionalRxnLUT::k135][i] * HM(i,j,k); } if (my_chemistry->use_radiative_transfer == 1) { if (my_chemistry->radiative_transfer_HDI_dissociation > 0) { @@ -764,35 +764,35 @@ inline void species_density_updates_gauss_seidel( ( 1. + acoef*dtit[i] ); // 2) DII - scoef = ( kcol_buf.data[CollisionalRxnLUT::k1][i] * DI(i,j,k) * de(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k50][i] * HII(i,j,k)* DI(i,j,k) - + 2.*kcol_buf.data[CollisionalRxnLUT::k53][i] * HII(i,j,k)* HDI(i,j,k)/3. + scoef = ( kcol_buf[CollisionalRxnLUT::k1][i] * DI(i,j,k) * de(i,j,k) + + kcol_buf[CollisionalRxnLUT::k50][i] * HII(i,j,k)* DI(i,j,k) + + 2.*kcol_buf[CollisionalRxnLUT::k53][i] * HII(i,j,k)* HDI(i,j,k)/3. ) + kshield_buf.k24[i]*DI(i,j,k); acoef = 0.; // ! initialize GC202002 if (my_chemistry->use_radiative_transfer == 1) { scoef = scoef + kphHI(i,j,k)*DI(i,j,k); } - acoef = kcol_buf.data[CollisionalRxnLUT::k2][i] * de(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k51][i] * HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k52][i] * H2I(i,j,k)/2.; + acoef = kcol_buf[CollisionalRxnLUT::k2][i] * de(i,j,k) + + kcol_buf[CollisionalRxnLUT::k51][i] * HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::k52][i] * H2I(i,j,k)/2.; if (my_chemistry->primordial_chemistry > 3) { acoef = acoef - + kcol_buf.data[CollisionalRxnLUT::k130][i] * HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k133][i] * DM(i,j,k) / 2.; + + kcol_buf[CollisionalRxnLUT::k130][i] * HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::k133][i] * DM(i,j,k) / 2.; } out_spdens.data[SpLUT::DII][i] = ( scoef*dtit[i] + DII(i,j,k) ) / ( 1. + acoef*dtit[i] ); // 3) HDI - scoef = 3.*(kcol_buf.data[CollisionalRxnLUT::k52][i] * DII(i,j,k)* + scoef = 3.*(kcol_buf[CollisionalRxnLUT::k52][i] * DII(i,j,k)* H2I(i,j,k)/2./2. - + kcol_buf.data[CollisionalRxnLUT::k54][i] * DI(i,j,k) * H2I(i,j,k)/2./2. + + kcol_buf[CollisionalRxnLUT::k54][i] * DI(i,j,k) * H2I(i,j,k)/2./2. // ! & + 2._DKIND*k56(i) * DI(i,j,k) * HM(i,j,k)/2._DKIND //- ! corrected by GC202005 - + kcol_buf.data[CollisionalRxnLUT::k56][i] * DI(i,j,k) * HM(i,j,k)/2. + + kcol_buf[CollisionalRxnLUT::k56][i] * DI(i,j,k) * HM(i,j,k)/2. ); - acoef = kcol_buf.data[CollisionalRxnLUT::k53][i] * HII(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k55][i] * HI(i,j,k); + acoef = kcol_buf[CollisionalRxnLUT::k53][i] * HII(i,j,k) + + kcol_buf[CollisionalRxnLUT::k55][i] * HI(i,j,k); if (my_chemistry->use_radiative_transfer == 1) { if (my_chemistry->radiative_transfer_HDI_dissociation > 0) { acoef = acoef @@ -801,8 +801,8 @@ inline void species_density_updates_gauss_seidel( } if (my_chemistry->primordial_chemistry > 3) { scoef = scoef + 3. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::k125][i] * HDII(i,j,k) * HI(i,j,k) / 3. - + kcol_buf.data[CollisionalRxnLUT::k137][i] * DM(i,j,k) * HI(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k125][i] * HDII(i,j,k) * HI(i,j,k) / 3. + + kcol_buf[CollisionalRxnLUT::k137][i] * DM(i,j,k) * HI(i,j,k) / 2. ); } out_spdens.data[SpLUT::HDI][i] = ( scoef*dtit[i] + HDI(i,j,k) ) @@ -819,39 +819,39 @@ inline void species_density_updates_gauss_seidel( // 1) DM scoef = - kcol_buf.data[CollisionalRxnLUT::k132][i] * DI(i,j,k) * de(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k135][i] * HM(i,j,k) * DI(i,j,k); + kcol_buf[CollisionalRxnLUT::k132][i] * DI(i,j,k) * de(i,j,k) + + kcol_buf[CollisionalRxnLUT::k135][i] * HM(i,j,k) * DI(i,j,k); acoef = - kcol_buf.data[CollisionalRxnLUT::k133][i] * DII(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::k134][i] * HII(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k136][i] * HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k137][i] * HI(i,j,k); + kcol_buf[CollisionalRxnLUT::k133][i] * DII(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k134][i] * HII(i,j,k) + + kcol_buf[CollisionalRxnLUT::k136][i] * HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::k137][i] * HI(i,j,k); out_spdens.data[SpLUT::DM][i] = ( scoef*dtit[i] + DM(i,j,k) ) / ( 1. + acoef*dtit[i] ); // 2) HDII scoef = 3. * ( - kcol_buf.data[CollisionalRxnLUT::k129][i] * DI(i,j,k) * HII(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::k130][i] * DII(i,j,k) * HI(i,j,k) / 2. + kcol_buf[CollisionalRxnLUT::k129][i] * DI(i,j,k) * HII(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::k130][i] * DII(i,j,k) * HI(i,j,k) / 2. ); acoef = - kcol_buf.data[CollisionalRxnLUT::k125][i] * HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k131][i] * de(i,j,k); + kcol_buf[CollisionalRxnLUT::k125][i] * HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::k131][i] * de(i,j,k); out_spdens.data[SpLUT::HDII][i] = ( scoef*dtit[i] + HDII(i,j,k) ) / ( 1. + acoef*dtit[i] ); // 3) HeHII scoef = 5. * ( - kcol_buf.data[CollisionalRxnLUT::k148][i] * HeI(i,j,k) * HII(i,j,k) / 4. - + kcol_buf.data[CollisionalRxnLUT::k149][i] * HeI(i,j,k) * HII(i,j,k) / 4. - + kcol_buf.data[CollisionalRxnLUT::k150][i] * HeI(i,j,k) * H2II(i,j,k) / 8. - + kcol_buf.data[CollisionalRxnLUT::k151][i] * HeII(i,j,k) * HI(i,j,k) / 4. + kcol_buf[CollisionalRxnLUT::k148][i] * HeI(i,j,k) * HII(i,j,k) / 4. + + kcol_buf[CollisionalRxnLUT::k149][i] * HeI(i,j,k) * HII(i,j,k) / 4. + + kcol_buf[CollisionalRxnLUT::k150][i] * HeI(i,j,k) * H2II(i,j,k) / 8. + + kcol_buf[CollisionalRxnLUT::k151][i] * HeII(i,j,k) * HI(i,j,k) / 4. ); acoef = - kcol_buf.data[CollisionalRxnLUT::k152][i] * HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::k153][i] * de(i,j,k); + kcol_buf[CollisionalRxnLUT::k152][i] * HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::k153][i] * de(i,j,k); out_spdens.data[SpLUT::HeHII][i] = ( scoef*dtit[i] + HeHII(i,j,k) ) / ( 1. + acoef*dtit[i] ); @@ -867,15 +867,15 @@ inline void species_density_updates_gauss_seidel( // ***** CI ********** scoef = 0. + 12. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::kz15][i] * HI(i,j,k) * CH(i,j,k) / 13. - + kcol_buf.data[CollisionalRxnLUT::kz44][i] * CII(i,j,k) * de(i,j,k) / 12. + + kcol_buf[CollisionalRxnLUT::kz15][i] * HI(i,j,k) * CH(i,j,k) / 13. + + kcol_buf[CollisionalRxnLUT::kz44][i] * CII(i,j,k) * de(i,j,k) / 12. ); acoef = 0. - + kcol_buf.data[CollisionalRxnLUT::kz20][i] * H2I(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::kz27][i] * HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::kz28][i] * OH(i,j,k) / 17. - + kcol_buf.data[CollisionalRxnLUT::kz29][i] * O2(i,j,k) / 32. - + kcol_buf.data[CollisionalRxnLUT::kz51][i] * H2I(i,j,k) / 2.; + + kcol_buf[CollisionalRxnLUT::kz20][i] * H2I(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::kz27][i] * HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::kz28][i] * OH(i,j,k) / 17. + + kcol_buf[CollisionalRxnLUT::kz29][i] * O2(i,j,k) / 32. + + kcol_buf[CollisionalRxnLUT::kz51][i] * H2I(i,j,k) / 2.; if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 0) { acoef = acoef @@ -901,9 +901,9 @@ inline void species_density_updates_gauss_seidel( scoef = 0. + 12. * ( 0. ); acoef = 0. - + kcol_buf.data[CollisionalRxnLUT::kz37][i] * OH(i,j,k) / 17. - + kcol_buf.data[CollisionalRxnLUT::kz38][i] * O2(i,j,k) / 32. - + kcol_buf.data[CollisionalRxnLUT::kz44][i] * de(i,j,k); + + kcol_buf[CollisionalRxnLUT::kz37][i] * OH(i,j,k) / 17. + + kcol_buf[CollisionalRxnLUT::kz38][i] * O2(i,j,k) / 32. + + kcol_buf[CollisionalRxnLUT::kz44][i] * de(i,j,k); if (my_chemistry->use_radiative_transfer == 1) { if (my_chemistry->radiative_transfer_metal_ionization > 0) { scoef = scoef @@ -917,14 +917,14 @@ inline void species_density_updates_gauss_seidel( // ***** CO ********** scoef = 0. + 28. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::kz28][i] * CI(i,j,k) * OH(i,j,k) / 204. - + kcol_buf.data[CollisionalRxnLUT::kz29][i] * CI(i,j,k) * O2(i,j,k) / 384. - + kcol_buf.data[CollisionalRxnLUT::kz32][i] * OI(i,j,k) * CH(i,j,k) / 208. - + kcol_buf.data[CollisionalRxnLUT::kz38][i] * CII(i,j,k) * O2(i,j,k) / 384. - + kcol_buf.data[CollisionalRxnLUT::kz43][i] * COII(i,j,k) * HI(i,j,k) / 28. + + kcol_buf[CollisionalRxnLUT::kz28][i] * CI(i,j,k) * OH(i,j,k) / 204. + + kcol_buf[CollisionalRxnLUT::kz29][i] * CI(i,j,k) * O2(i,j,k) / 384. + + kcol_buf[CollisionalRxnLUT::kz32][i] * OI(i,j,k) * CH(i,j,k) / 208. + + kcol_buf[CollisionalRxnLUT::kz38][i] * CII(i,j,k) * O2(i,j,k) / 384. + + kcol_buf[CollisionalRxnLUT::kz43][i] * COII(i,j,k) * HI(i,j,k) / 28. ); acoef = 0. - + kcol_buf.data[CollisionalRxnLUT::kz26][i] * OH(i,j,k) / 17.; + + kcol_buf[CollisionalRxnLUT::kz26][i] * OH(i,j,k) / 17.; if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 2) { acoef = acoef @@ -945,7 +945,7 @@ inline void species_density_updates_gauss_seidel( // ***** CO2 ********** scoef = 0. + 44. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::kz26][i] * OH(i,j,k) * CO(i,j,k) / 476. + + kcol_buf[CollisionalRxnLUT::kz26][i] * OH(i,j,k) * CO(i,j,k) / 476. ); acoef = 0.; @@ -955,23 +955,23 @@ inline void species_density_updates_gauss_seidel( // ***** OI ********** scoef = 0. + 16. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::kz17][i] * HI(i,j,k) * OH(i,j,k) / 17. - + kcol_buf.data[CollisionalRxnLUT::kz19][i] * HI(i,j,k) * O2(i,j,k) / 32. - + kcol_buf.data[CollisionalRxnLUT::kz25][i] * OH(i,j,k) * OH(i,j,k) / 289. - + kcol_buf.data[CollisionalRxnLUT::kz29][i] * CI(i,j,k) * O2(i,j,k) / 384. - + kcol_buf.data[CollisionalRxnLUT::kz39][i] * OII(i,j,k) * HI(i,j,k) / 16. - + kcol_buf.data[CollisionalRxnLUT::kz45][i] * OII(i,j,k) * de(i,j,k) / 16. - + kcol_buf.data[CollisionalRxnLUT::kz47][i] * H2OII(i,j,k) * de(i,j,k) / 18. - + kcol_buf.data[CollisionalRxnLUT::kz50][i] * O2II(i,j,k) * de(i,j,k) / 16. - + kcol_buf.data[CollisionalRxnLUT::kz53][i] * SiI(i,j,k) * O2(i,j,k) / 896. + + kcol_buf[CollisionalRxnLUT::kz17][i] * HI(i,j,k) * OH(i,j,k) / 17. + + kcol_buf[CollisionalRxnLUT::kz19][i] * HI(i,j,k) * O2(i,j,k) / 32. + + kcol_buf[CollisionalRxnLUT::kz25][i] * OH(i,j,k) * OH(i,j,k) / 289. + + kcol_buf[CollisionalRxnLUT::kz29][i] * CI(i,j,k) * O2(i,j,k) / 384. + + kcol_buf[CollisionalRxnLUT::kz39][i] * OII(i,j,k) * HI(i,j,k) / 16. + + kcol_buf[CollisionalRxnLUT::kz45][i] * OII(i,j,k) * de(i,j,k) / 16. + + kcol_buf[CollisionalRxnLUT::kz47][i] * H2OII(i,j,k) * de(i,j,k) / 18. + + kcol_buf[CollisionalRxnLUT::kz50][i] * O2II(i,j,k) * de(i,j,k) / 16. + + kcol_buf[CollisionalRxnLUT::kz53][i] * SiI(i,j,k) * O2(i,j,k) / 896. ); acoef = 0. - + kcol_buf.data[CollisionalRxnLUT::kz21][i] * H2I(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::kz22][i] * HII(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::kz30][i] * HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::kz31][i] * OI(i,j,k) / 8. - + kcol_buf.data[CollisionalRxnLUT::kz32][i] * CH(i,j,k) / 13. - + kcol_buf.data[CollisionalRxnLUT::kz33][i] * OH(i,j,k) / 17.; + + kcol_buf[CollisionalRxnLUT::kz21][i] * H2I(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::kz22][i] * HII(i,j,k) + + kcol_buf[CollisionalRxnLUT::kz30][i] * HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::kz31][i] * OI(i,j,k) / 8. + + kcol_buf[CollisionalRxnLUT::kz32][i] * CH(i,j,k) / 13. + + kcol_buf[CollisionalRxnLUT::kz33][i] * OH(i,j,k) / 17.; if (my_chemistry->use_radiative_transfer == 1) { if (my_chemistry->radiative_transfer_metal_ionization > 0) { acoef = acoef @@ -990,24 +990,24 @@ inline void species_density_updates_gauss_seidel( // ***** OH ********** scoef = 0. + 17. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::kz18][i] * HI(i,j,k) * H2O(i,j,k) / 18. - + kcol_buf.data[CollisionalRxnLUT::kz19][i] * HI(i,j,k) * O2(i,j,k) / 32. - + kcol_buf.data[CollisionalRxnLUT::kz21][i] * OI(i,j,k) * H2I(i,j,k) / 32. - + kcol_buf.data[CollisionalRxnLUT::kz30][i] * OI(i,j,k) * HI(i,j,k) / 16. - + kcol_buf.data[CollisionalRxnLUT::kz46][i] * H2OII(i,j,k) * de(i,j,k) / 18. - + kcol_buf.data[CollisionalRxnLUT::kz49][i] * H3OII(i,j,k) * de(i,j,k) / 19. + + kcol_buf[CollisionalRxnLUT::kz18][i] * HI(i,j,k) * H2O(i,j,k) / 18. + + kcol_buf[CollisionalRxnLUT::kz19][i] * HI(i,j,k) * O2(i,j,k) / 32. + + kcol_buf[CollisionalRxnLUT::kz21][i] * OI(i,j,k) * H2I(i,j,k) / 32. + + kcol_buf[CollisionalRxnLUT::kz30][i] * OI(i,j,k) * HI(i,j,k) / 16. + + kcol_buf[CollisionalRxnLUT::kz46][i] * H2OII(i,j,k) * de(i,j,k) / 18. + + kcol_buf[CollisionalRxnLUT::kz49][i] * H3OII(i,j,k) * de(i,j,k) / 19. ); acoef = 0. - + kcol_buf.data[CollisionalRxnLUT::kz17][i] * HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::kz24][i] * H2I(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::kz25][i] * OH(i,j,k) / 8.5 - + kcol_buf.data[CollisionalRxnLUT::kz26][i] * CO(i,j,k) / 28. - + kcol_buf.data[CollisionalRxnLUT::kz28][i] * CI(i,j,k) / 12. - + kcol_buf.data[CollisionalRxnLUT::kz33][i] * OI(i,j,k) / 16. - + kcol_buf.data[CollisionalRxnLUT::kz34][i] * HII(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::kz37][i] * CII(i,j,k) / 12. - + kcol_buf.data[CollisionalRxnLUT::kz52][i] * SiI(i,j,k) / 28. - + kcol_buf.data[CollisionalRxnLUT::kz54][i] * SiOI(i,j,k) / 44.; + + kcol_buf[CollisionalRxnLUT::kz17][i] * HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::kz24][i] * H2I(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::kz25][i] * OH(i,j,k) / 8.5 + + kcol_buf[CollisionalRxnLUT::kz26][i] * CO(i,j,k) / 28. + + kcol_buf[CollisionalRxnLUT::kz28][i] * CI(i,j,k) / 12. + + kcol_buf[CollisionalRxnLUT::kz33][i] * OI(i,j,k) / 16. + + kcol_buf[CollisionalRxnLUT::kz34][i] * HII(i,j,k) + + kcol_buf[CollisionalRxnLUT::kz37][i] * CII(i,j,k) / 12. + + kcol_buf[CollisionalRxnLUT::kz52][i] * SiI(i,j,k) / 28. + + kcol_buf[CollisionalRxnLUT::kz54][i] * SiOI(i,j,k) / 44.; if (my_chemistry->use_radiative_transfer == 1) { if (my_chemistry->radiative_transfer_metal_dissociation > 0) { acoef = acoef @@ -1023,13 +1023,13 @@ inline void species_density_updates_gauss_seidel( // ***** H2O ********** scoef = 0. + 18. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::kz24][i] * H2I(i,j,k) * OH(i,j,k) / 34. - + kcol_buf.data[CollisionalRxnLUT::kz25][i] * OH(i,j,k) * OH(i,j,k) / 289. - + kcol_buf.data[CollisionalRxnLUT::kz48][i] * H3OII(i,j,k) * de(i,j,k) / 19. + + kcol_buf[CollisionalRxnLUT::kz24][i] * H2I(i,j,k) * OH(i,j,k) / 34. + + kcol_buf[CollisionalRxnLUT::kz25][i] * OH(i,j,k) * OH(i,j,k) / 289. + + kcol_buf[CollisionalRxnLUT::kz48][i] * H3OII(i,j,k) * de(i,j,k) / 19. ); acoef = 0. - + kcol_buf.data[CollisionalRxnLUT::kz18][i] * HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::kz35][i] * HII(i,j,k); + + kcol_buf[CollisionalRxnLUT::kz18][i] * HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::kz35][i] * HII(i,j,k); if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 0) { acoef = acoef @@ -1060,15 +1060,15 @@ inline void species_density_updates_gauss_seidel( // ***** O2 ********** scoef = 0. + 32. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::kz31][i] * OI(i,j,k) * OI(i,j,k) / 256. - + kcol_buf.data[CollisionalRxnLUT::kz33][i] * OI(i,j,k) * OH(i,j,k) / 272. + + kcol_buf[CollisionalRxnLUT::kz31][i] * OI(i,j,k) * OI(i,j,k) / 256. + + kcol_buf[CollisionalRxnLUT::kz33][i] * OI(i,j,k) * OH(i,j,k) / 272. ); acoef = 0. - + kcol_buf.data[CollisionalRxnLUT::kz19][i] * HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::kz29][i] * CI(i,j,k) / 12. - + kcol_buf.data[CollisionalRxnLUT::kz36][i] * HII(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::kz38][i] * CII(i,j,k) / 12. - + kcol_buf.data[CollisionalRxnLUT::kz53][i] * SiI(i,j,k) / 28.; + + kcol_buf[CollisionalRxnLUT::kz19][i] * HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::kz29][i] * CI(i,j,k) / 12. + + kcol_buf[CollisionalRxnLUT::kz36][i] * HII(i,j,k) + + kcol_buf[CollisionalRxnLUT::kz38][i] * CII(i,j,k) / 12. + + kcol_buf[CollisionalRxnLUT::kz53][i] * SiI(i,j,k) / 28.; out_spdens.data[SpLUT::O2][i] = ( scoef*dtit[i] + O2(i,j,k) ) / ( 1. + acoef*dtit[i] ); @@ -1078,8 +1078,8 @@ inline void species_density_updates_gauss_seidel( scoef = 0. + 28. * ( 0. ); acoef = 0. - + kcol_buf.data[CollisionalRxnLUT::kz52][i] * OH(i,j,k) / 17. - + kcol_buf.data[CollisionalRxnLUT::kz53][i] * O2(i,j,k) / 32.; + + kcol_buf[CollisionalRxnLUT::kz52][i] * OH(i,j,k) / 17. + + kcol_buf[CollisionalRxnLUT::kz53][i] * O2(i,j,k) / 32.; if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 1) { acoef = acoef @@ -1093,11 +1093,11 @@ inline void species_density_updates_gauss_seidel( // ***** SiOI ********** scoef = 0. + 44. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::kz52][i] * SiI(i,j,k) * OH(i,j,k) / 476. - + kcol_buf.data[CollisionalRxnLUT::kz53][i] * SiI(i,j,k) * O2(i,j,k) / 896. + + kcol_buf[CollisionalRxnLUT::kz52][i] * SiI(i,j,k) * OH(i,j,k) / 476. + + kcol_buf[CollisionalRxnLUT::kz53][i] * SiI(i,j,k) * O2(i,j,k) / 896. ); acoef = 0. - + kcol_buf.data[CollisionalRxnLUT::kz54][i] * OH(i,j,k) / 17.; + + kcol_buf[CollisionalRxnLUT::kz54][i] * OH(i,j,k) / 17.; if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 0) { acoef = acoef @@ -1115,7 +1115,7 @@ inline void species_density_updates_gauss_seidel( // ***** SiO2I ********** scoef = 0. + 60. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::kz54][i] * SiOI(i,j,k) * OH(i,j,k) / 748. + + kcol_buf[CollisionalRxnLUT::kz54][i] * SiOI(i,j,k) * OH(i,j,k) / 748. ); acoef = 0.; if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { @@ -1131,14 +1131,14 @@ inline void species_density_updates_gauss_seidel( // MINOR BUT IMPORTANT SPECIES FOR MOLECULAR FORMATION //- ***** CH ********** scoef = 0. + 13. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::kz16][i] * HI(i,j,k) * CH2(i,j,k) / 14. - + kcol_buf.data[CollisionalRxnLUT::kz20][i] * CI(i,j,k) * H2I(i,j,k) / 24. - + kcol_buf.data[CollisionalRxnLUT::kz27][i] * CI(i,j,k) * HI(i,j,k) / 12. + + kcol_buf[CollisionalRxnLUT::kz16][i] * HI(i,j,k) * CH2(i,j,k) / 14. + + kcol_buf[CollisionalRxnLUT::kz20][i] * CI(i,j,k) * H2I(i,j,k) / 24. + + kcol_buf[CollisionalRxnLUT::kz27][i] * CI(i,j,k) * HI(i,j,k) / 12. ); acoef = 0. - + kcol_buf.data[CollisionalRxnLUT::kz15][i] * HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::kz23][i] * H2I(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::kz32][i] * OI(i,j,k) / 16.; + + kcol_buf[CollisionalRxnLUT::kz15][i] * HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::kz23][i] * H2I(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::kz32][i] * OI(i,j,k) / 16.; out_spdens.data[SpLUT::CH][i] = ( scoef*dtit[i] + CH(i,j,k) ) / ( 1. + acoef*dtit[i] ); @@ -1146,11 +1146,11 @@ inline void species_density_updates_gauss_seidel( // ***** CH2 ********** scoef = 0. + 14. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::kz23][i] * H2I(i,j,k) * CH(i,j,k) / 26. - + kcol_buf.data[CollisionalRxnLUT::kz51][i] * H2I(i,j,k) * CI(i,j,k) / 24. + + kcol_buf[CollisionalRxnLUT::kz23][i] * H2I(i,j,k) * CH(i,j,k) / 26. + + kcol_buf[CollisionalRxnLUT::kz51][i] * H2I(i,j,k) * CI(i,j,k) / 24. ); acoef = 0. - + kcol_buf.data[CollisionalRxnLUT::kz16][i] * HI(i,j,k); + + kcol_buf[CollisionalRxnLUT::kz16][i] * HI(i,j,k); if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 2) { acoef = acoef @@ -1164,10 +1164,10 @@ inline void species_density_updates_gauss_seidel( // ***** COII ********** scoef = 0. + 28. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::kz37][i] * CII(i,j,k) * OH(i,j,k) / 204. + + kcol_buf[CollisionalRxnLUT::kz37][i] * CII(i,j,k) * OH(i,j,k) / 204. ); acoef = 0. - + kcol_buf.data[CollisionalRxnLUT::kz43][i] * HI(i,j,k); + + kcol_buf[CollisionalRxnLUT::kz43][i] * HI(i,j,k); out_spdens.data[SpLUT::COII][i] = ( scoef*dtit[i] + COII(i,j,k) ) / ( 1. + acoef*dtit[i] ); @@ -1175,13 +1175,13 @@ inline void species_density_updates_gauss_seidel( // ***** OII ********** scoef = 0. + 16. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::kz22][i] * HII(i,j,k) * OI(i,j,k) / 16. - + kcol_buf.data[CollisionalRxnLUT::kz38][i] * CII(i,j,k) * O2(i,j,k) / 384. + + kcol_buf[CollisionalRxnLUT::kz22][i] * HII(i,j,k) * OI(i,j,k) / 16. + + kcol_buf[CollisionalRxnLUT::kz38][i] * CII(i,j,k) * O2(i,j,k) / 384. ); acoef = 0. - + kcol_buf.data[CollisionalRxnLUT::kz39][i] * HI(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::kz40][i] * H2I(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::kz45][i] * de(i,j,k); + + kcol_buf[CollisionalRxnLUT::kz39][i] * HI(i,j,k) + + kcol_buf[CollisionalRxnLUT::kz40][i] * H2I(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::kz45][i] * de(i,j,k); if (my_chemistry->use_radiative_transfer == 1) { if (my_chemistry->radiative_transfer_metal_ionization > 0) { scoef = scoef @@ -1195,11 +1195,11 @@ inline void species_density_updates_gauss_seidel( // ***** OHII ********** scoef = 0. + 17. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::kz34][i] * HII(i,j,k) * OH(i,j,k) / 17. - + kcol_buf.data[CollisionalRxnLUT::kz40][i] * OII(i,j,k) * H2I(i,j,k) / 32. + + kcol_buf[CollisionalRxnLUT::kz34][i] * HII(i,j,k) * OH(i,j,k) / 17. + + kcol_buf[CollisionalRxnLUT::kz40][i] * OII(i,j,k) * H2I(i,j,k) / 32. ); acoef = 0. - + kcol_buf.data[CollisionalRxnLUT::kz41][i] * H2I(i,j,k) / 2.; + + kcol_buf[CollisionalRxnLUT::kz41][i] * H2I(i,j,k) / 2.; out_spdens.data[SpLUT::OHII][i] = ( scoef*dtit[i] + OHII(i,j,k) ) / ( 1. + acoef*dtit[i] ); @@ -1207,13 +1207,13 @@ inline void species_density_updates_gauss_seidel( // ***** H2OII ********** scoef = 0. + 18. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::kz35][i] * HII(i,j,k) * H2O(i,j,k) / 18. - + kcol_buf.data[CollisionalRxnLUT::kz41][i] * OHII(i,j,k) * H2I(i,j,k) / 34. + + kcol_buf[CollisionalRxnLUT::kz35][i] * HII(i,j,k) * H2O(i,j,k) / 18. + + kcol_buf[CollisionalRxnLUT::kz41][i] * OHII(i,j,k) * H2I(i,j,k) / 34. ); acoef = 0. - + kcol_buf.data[CollisionalRxnLUT::kz42][i] * H2I(i,j,k) / 2. - + kcol_buf.data[CollisionalRxnLUT::kz46][i] * de(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::kz47][i] * de(i,j,k); + + kcol_buf[CollisionalRxnLUT::kz42][i] * H2I(i,j,k) / 2. + + kcol_buf[CollisionalRxnLUT::kz46][i] * de(i,j,k) + + kcol_buf[CollisionalRxnLUT::kz47][i] * de(i,j,k); out_spdens.data[SpLUT::H2OII][i] = ( scoef*dtit[i] + H2OII(i,j,k) ) / ( 1. + acoef*dtit[i] ); @@ -1221,11 +1221,11 @@ inline void species_density_updates_gauss_seidel( // ***** H3OII ********** scoef = 0. + 19. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::kz42][i] * H2OII(i,j,k) * H2I(i,j,k) / 36. + + kcol_buf[CollisionalRxnLUT::kz42][i] * H2OII(i,j,k) * H2I(i,j,k) / 36. ); acoef = 0. - + kcol_buf.data[CollisionalRxnLUT::kz48][i] * de(i,j,k) - + kcol_buf.data[CollisionalRxnLUT::kz49][i] * de(i,j,k); + + kcol_buf[CollisionalRxnLUT::kz48][i] * de(i,j,k) + + kcol_buf[CollisionalRxnLUT::kz49][i] * de(i,j,k); out_spdens.data[SpLUT::H3OII][i] = ( scoef*dtit[i] + H3OII(i,j,k) ) / ( 1. + acoef*dtit[i] ); @@ -1233,10 +1233,10 @@ inline void species_density_updates_gauss_seidel( // ***** O2II ********** scoef = 0. + 32. * ( 0. - + kcol_buf.data[CollisionalRxnLUT::kz36][i] * HII(i,j,k) * O2(i,j,k) / 32. + + kcol_buf[CollisionalRxnLUT::kz36][i] * HII(i,j,k) * O2(i,j,k) / 32. ); acoef = 0. - + kcol_buf.data[CollisionalRxnLUT::kz50][i] * de(i,j,k); + + kcol_buf[CollisionalRxnLUT::kz50][i] * de(i,j,k); out_spdens.data[SpLUT::O2II][i] = ( scoef*dtit[i] + O2II(i,j,k) ) / ( 1. + acoef*dtit[i] ); @@ -1466,7 +1466,7 @@ inline void species_density_updates_gauss_seidel( /// @param[in] my_fields Specifies field data /// @param[in] my_uvb_rates specifies precomputed rxn rates dependent on the /// UV background -/// @param[in] grain_growth_rates, kcr_buf, kshield_buf specifies the +/// @param[in] grain_growth_rates, kshield_buf specifies the /// precomputed rxn rates (depends on local physical conditions) /// @param[in] rxn_rate_buf specifies the precomputed rxn rates (depends on /// local physical conditions) @@ -1498,7 +1498,6 @@ inline void species_density_derivatives_0d( const chemistry_data* my_chemistry, const grackle_field_data* my_fields, const photo_rate_storage my_uvb_rates, const grackle::impl::GrainSpeciesCollection grain_growth_rates, - const grackle::impl::CollisionalRxnRateCollection kcr_buf, const grackle::impl::PhotoRxnRateCollection kshield_buf, const FullRxnRateBuf rxn_rate_buf ) { @@ -1567,6 +1566,8 @@ inline void species_density_derivatives_0d( gr_float& volorg = my_fields->vol_org_dust_density[0]; gr_float& H2Oice = my_fields->H2O_ice_dust_density[0]; + const double* const* kcol_buf = FullRxnRateBuf_kcol_bufs(&rxn_rate_buf); + double scoef, acoef; // A) the 6-species integrator @@ -1577,10 +1578,10 @@ inline void species_density_derivatives_0d( // 1) HI - scoef = kcr_buf.data[CollisionalRxnLUT::k2][0] *HII *de; - acoef = kcr_buf.data[CollisionalRxnLUT::k1][0] *de - + kcr_buf.data[CollisionalRxnLUT::k57][0] *HI - + kcr_buf.data[CollisionalRxnLUT::k58][0] *HeI /4. + scoef = kcol_buf[CollisionalRxnLUT::k2][0] *HII *de; + acoef = kcol_buf[CollisionalRxnLUT::k1][0] *de + + kcol_buf[CollisionalRxnLUT::k57][0] *HI + + kcol_buf[CollisionalRxnLUT::k58][0] *HeI /4. + kshield_buf.k24[0]; if (my_chemistry->use_radiative_transfer == 1) { acoef = acoef + *(my_fields->RT_HI_ionization_rate); } deriv.data[SpLUT::HI][0] = deriv.data[SpLUT::HI][0] + (scoef - acoef * HI); @@ -1599,13 +1600,13 @@ inline void species_density_derivatives_0d( // 2) HII - scoef = kcr_buf.data[CollisionalRxnLUT::k1][0] *HI *de - + kcr_buf.data[CollisionalRxnLUT::k57][0] *HI *HI - + kcr_buf.data[CollisionalRxnLUT::k58][0] *HI *HeI /4. + scoef = kcol_buf[CollisionalRxnLUT::k1][0] *HI *de + + kcol_buf[CollisionalRxnLUT::k57][0] *HI *HI + + kcol_buf[CollisionalRxnLUT::k58][0] *HI *HeI /4. + kshield_buf.k24[0] *HI; if (my_chemistry->use_radiative_transfer == 1) { scoef = scoef + *(my_fields->RT_HI_ionization_rate) *HI; } - acoef = kcr_buf.data[CollisionalRxnLUT::k2][0] *de; + acoef = kcol_buf[CollisionalRxnLUT::k2][0] *de; deriv.data[SpLUT::HII][0] = deriv.data[SpLUT::HII][0] + (scoef - acoef * HII); @@ -1626,8 +1627,8 @@ inline void species_density_derivatives_0d( // 3) Electron density scoef = 0. - + kcr_buf.data[CollisionalRxnLUT::k57][0] *HI *HI - + kcr_buf.data[CollisionalRxnLUT::k58][0] *HI *HeI /4. + + kcol_buf[CollisionalRxnLUT::k57][0] *HI *HI + + kcol_buf[CollisionalRxnLUT::k58][0] *HI *HeI /4. + kshield_buf.k24[0] *HI + kshield_buf.k25[0] *HeII /4. + kshield_buf.k26[0] *HeI /4.; @@ -1641,11 +1642,11 @@ inline void species_density_derivatives_0d( - acoef = -(kcr_buf.data[CollisionalRxnLUT::k1][0] *HI - kcr_buf.data[CollisionalRxnLUT::k2][0] *HII - + kcr_buf.data[CollisionalRxnLUT::k3][0] *HeI /4. - - kcr_buf.data[CollisionalRxnLUT::k6][0] *HeIII /4. - + kcr_buf.data[CollisionalRxnLUT::k5][0] *HeII /4. - - kcr_buf.data[CollisionalRxnLUT::k4][0] *HeII /4.); + acoef = -(kcol_buf[CollisionalRxnLUT::k1][0] *HI - kcol_buf[CollisionalRxnLUT::k2][0] *HII + + kcol_buf[CollisionalRxnLUT::k3][0] *HeI /4. - + kcol_buf[CollisionalRxnLUT::k6][0] *HeIII /4. + + kcol_buf[CollisionalRxnLUT::k5][0] *HeII /4. - + kcol_buf[CollisionalRxnLUT::k4][0] *HeII /4.); deriv.data[SpLUT::e][0] = deriv.data[SpLUT::e][0] + (scoef - acoef * de); @@ -1661,53 +1662,53 @@ inline void species_density_derivatives_0d( // 4) HeI - scoef = kcr_buf.data[CollisionalRxnLUT::k4][0] *HeII *de; - acoef = kcr_buf.data[CollisionalRxnLUT::k3][0] *de + scoef = kcol_buf[CollisionalRxnLUT::k4][0] *HeII *de; + acoef = kcol_buf[CollisionalRxnLUT::k3][0] *de + kshield_buf.k26[0]; if ( (my_chemistry->use_radiative_transfer == 1) && (my_chemistry->radiative_transfer_hydrogen_only == 0)) { acoef = acoef + *(my_fields->RT_HeI_ionization_rate); } if (my_chemistry->primordial_chemistry > 3) { scoef = scoef + 4. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::k152][0] * HeHII * HI / 5. - + kcr_buf.data[CollisionalRxnLUT::k153][0] * HeHII * de / 5. + + kcol_buf[CollisionalRxnLUT::k152][0] * HeHII * HI / 5. + + kcol_buf[CollisionalRxnLUT::k153][0] * HeHII * de / 5. ); acoef = acoef - + kcr_buf.data[CollisionalRxnLUT::k148][0] * HII - + kcr_buf.data[CollisionalRxnLUT::k149][0] * HII - + kcr_buf.data[CollisionalRxnLUT::k150][0] * H2II / 2.; + + kcol_buf[CollisionalRxnLUT::k148][0] * HII + + kcol_buf[CollisionalRxnLUT::k149][0] * HII + + kcol_buf[CollisionalRxnLUT::k150][0] * H2II / 2.; } deriv.data[SpLUT::HeI][0] = deriv.data[SpLUT::HeI][0] + (scoef - acoef * HeI); // 5) HeII - scoef = kcr_buf.data[CollisionalRxnLUT::k3][0] *HeI *de - + kcr_buf.data[CollisionalRxnLUT::k6][0] *HeIII *de + scoef = kcol_buf[CollisionalRxnLUT::k3][0] *HeI *de + + kcol_buf[CollisionalRxnLUT::k6][0] *HeIII *de + kshield_buf.k26[0] *HeI; if ( (my_chemistry->use_radiative_transfer == 1) && (my_chemistry->radiative_transfer_hydrogen_only == 0)) { scoef = scoef + *(my_fields->RT_HeI_ionization_rate) *HeI; } - acoef = kcr_buf.data[CollisionalRxnLUT::k4][0] *de + kcr_buf.data[CollisionalRxnLUT::k5][0] *de + acoef = kcol_buf[CollisionalRxnLUT::k4][0] *de + kcol_buf[CollisionalRxnLUT::k5][0] *de + kshield_buf.k25[0]; if ( (my_chemistry->use_radiative_transfer == 1) && (my_chemistry->radiative_transfer_hydrogen_only == 0)) { acoef = acoef + *(my_fields->RT_HeII_ionization_rate); } if (my_chemistry->primordial_chemistry > 3) { acoef = acoef - + kcr_buf.data[CollisionalRxnLUT::k151][0] * HI; + + kcol_buf[CollisionalRxnLUT::k151][0] * HI; } deriv.data[SpLUT::HeII][0] = deriv.data[SpLUT::HeII][0] + (scoef - acoef * HeII); // 6) HeIII - scoef = kcr_buf.data[CollisionalRxnLUT::k5][0] *HeII *de + scoef = kcol_buf[CollisionalRxnLUT::k5][0] *HeII *de + kshield_buf.k25[0] *HeII; if ((my_chemistry->use_radiative_transfer == 1) && (my_chemistry->radiative_transfer_hydrogen_only == 0)) { scoef = scoef + *(my_fields->RT_HeII_ionization_rate) * HeII; } - acoef = kcr_buf.data[CollisionalRxnLUT::k6][0] *de; + acoef = kcol_buf[CollisionalRxnLUT::k6][0] *de; deriv.data[SpLUT::HeIII][0] = deriv.data[SpLUT::HeIII][0] + (scoef - acoef * HeIII); @@ -1724,25 +1725,25 @@ inline void species_density_derivatives_0d( // 1) HI - scoef = kcr_buf.data[CollisionalRxnLUT::k2][0] * HII * de - + 2.*kcr_buf.data[CollisionalRxnLUT::k13][0] * HI * H2I /2. - + kcr_buf.data[CollisionalRxnLUT::k11][0] * HII * H2I /2. - + 2.*kcr_buf.data[CollisionalRxnLUT::k12][0] * de * H2I /2. - + kcr_buf.data[CollisionalRxnLUT::k14][0] * HM * de - + kcr_buf.data[CollisionalRxnLUT::k15][0] * HM * HI - + 2.*kcr_buf.data[CollisionalRxnLUT::k16][0] * HM * HII - + 2.*kcr_buf.data[CollisionalRxnLUT::k18][0] * H2II * de /2. - + kcr_buf.data[CollisionalRxnLUT::k19][0] * H2II * HM /2. + scoef = kcol_buf[CollisionalRxnLUT::k2][0] * HII * de + + 2.*kcol_buf[CollisionalRxnLUT::k13][0] * HI * H2I /2. + + kcol_buf[CollisionalRxnLUT::k11][0] * HII * H2I /2. + + 2.*kcol_buf[CollisionalRxnLUT::k12][0] * de * H2I /2. + + kcol_buf[CollisionalRxnLUT::k14][0] * HM * de + + kcol_buf[CollisionalRxnLUT::k15][0] * HM * HI + + 2.*kcol_buf[CollisionalRxnLUT::k16][0] * HM * HII + + 2.*kcol_buf[CollisionalRxnLUT::k18][0] * H2II * de /2. + + kcol_buf[CollisionalRxnLUT::k19][0] * H2II * HM /2. + 2.*kshield_buf.k31[0] * H2I /2.; - acoef = kcr_buf.data[CollisionalRxnLUT::k1][0] * de - + kcr_buf.data[CollisionalRxnLUT::k7][0] * de - + kcr_buf.data[CollisionalRxnLUT::k8][0] * HM - + kcr_buf.data[CollisionalRxnLUT::k9][0] * HII - + kcr_buf.data[CollisionalRxnLUT::k10][0] * H2II /2. - + 2.*kcr_buf.data[CollisionalRxnLUT::k22][0] * std::pow(HI ,2) - + kcr_buf.data[CollisionalRxnLUT::k57][0] * HI - + kcr_buf.data[CollisionalRxnLUT::k58][0] * HeI /4. + acoef = kcol_buf[CollisionalRxnLUT::k1][0] * de + + kcol_buf[CollisionalRxnLUT::k7][0] * de + + kcol_buf[CollisionalRxnLUT::k8][0] * HM + + kcol_buf[CollisionalRxnLUT::k9][0] * HII + + kcol_buf[CollisionalRxnLUT::k10][0] * H2II /2. + + 2.*kcol_buf[CollisionalRxnLUT::k22][0] * std::pow(HI ,2) + + kcol_buf[CollisionalRxnLUT::k57][0] * HI + + kcol_buf[CollisionalRxnLUT::k58][0] * HeI /4. + kshield_buf.k24[0]; if (my_chemistry->use_radiative_transfer == 1) { acoef = acoef + *(my_fields->RT_HI_ionization_rate); } @@ -1769,63 +1770,63 @@ inline void species_density_derivatives_0d( // contribution of minor species if (my_chemistry->primordial_chemistry > 2) { scoef = scoef - + kcr_buf.data[CollisionalRxnLUT::k50][0] * HII * DI / 2. - + kcr_buf.data[CollisionalRxnLUT::k54][0] * H2I * DI / 4.; + + kcol_buf[CollisionalRxnLUT::k50][0] * HII * DI / 2. + + kcol_buf[CollisionalRxnLUT::k54][0] * H2I * DI / 4.; acoef = acoef - + kcr_buf.data[CollisionalRxnLUT::k51][0] * DII / 2. - + kcr_buf.data[CollisionalRxnLUT::k55][0] * HDI / 3.; + + kcol_buf[CollisionalRxnLUT::k51][0] * DII / 2. + + kcol_buf[CollisionalRxnLUT::k55][0] * HDI / 3.; } if (my_chemistry->primordial_chemistry > 3) { scoef = scoef - + kcr_buf.data[CollisionalRxnLUT::k131][0] * HDII * de / 3. - + kcr_buf.data[CollisionalRxnLUT::k134][0] * HII * DM / 2. - + kcr_buf.data[CollisionalRxnLUT::k135][0] * HM * DI / 2. - + kcr_buf.data[CollisionalRxnLUT::k150][0] * HeI * H2II / 8. - + kcr_buf.data[CollisionalRxnLUT::k153][0] * HeHII * de / 5.; + + kcol_buf[CollisionalRxnLUT::k131][0] * HDII * de / 3. + + kcol_buf[CollisionalRxnLUT::k134][0] * HII * DM / 2. + + kcol_buf[CollisionalRxnLUT::k135][0] * HM * DI / 2. + + kcol_buf[CollisionalRxnLUT::k150][0] * HeI * H2II / 8. + + kcol_buf[CollisionalRxnLUT::k153][0] * HeHII * de / 5.; acoef = acoef - + kcr_buf.data[CollisionalRxnLUT::k125][0] * HDII / 3. - + kcr_buf.data[CollisionalRxnLUT::k130][0] * DII / 2. - + kcr_buf.data[CollisionalRxnLUT::k136][0] * DM / 2. - + kcr_buf.data[CollisionalRxnLUT::k137][0] * DM / 2. - + kcr_buf.data[CollisionalRxnLUT::k151][0] * HeII / 4. - + kcr_buf.data[CollisionalRxnLUT::k152][0] * HeHII / 5.; + + kcol_buf[CollisionalRxnLUT::k125][0] * HDII / 3. + + kcol_buf[CollisionalRxnLUT::k130][0] * DII / 2. + + kcol_buf[CollisionalRxnLUT::k136][0] * DM / 2. + + kcol_buf[CollisionalRxnLUT::k137][0] * DM / 2. + + kcol_buf[CollisionalRxnLUT::k151][0] * HeII / 4. + + kcol_buf[CollisionalRxnLUT::k152][0] * HeHII / 5.; } if ((my_chemistry->metal_chemistry == 1) && (itmask_metal[0] != MASK_FALSE)) { scoef = scoef - + kcr_buf.data[CollisionalRxnLUT::kz20][0] * CI * H2I / 24. - + kcr_buf.data[CollisionalRxnLUT::kz21][0] * OI * H2I / 32. - + kcr_buf.data[CollisionalRxnLUT::kz22][0] * HII * OI / 16. - + kcr_buf.data[CollisionalRxnLUT::kz23][0] * H2I * CH / 26. - + kcr_buf.data[CollisionalRxnLUT::kz24][0] * H2I * OH / 34. - + kcr_buf.data[CollisionalRxnLUT::kz26][0] * OH * CO / 476. - + kcr_buf.data[CollisionalRxnLUT::kz28][0] * CI * OH / 204. - + kcr_buf.data[CollisionalRxnLUT::kz32][0] * OI * CH / 208. - + kcr_buf.data[CollisionalRxnLUT::kz33][0] * OI * OH / 272. - + kcr_buf.data[CollisionalRxnLUT::kz34][0] * HII * OH / 17. - + kcr_buf.data[CollisionalRxnLUT::kz35][0] * HII * H2O / 18. - + kcr_buf.data[CollisionalRxnLUT::kz36][0] * HII * O2 / 32. - + kcr_buf.data[CollisionalRxnLUT::kz37][0] * CII * OH / 204. - + kcr_buf.data[CollisionalRxnLUT::kz40][0] * OII * H2I / 32. - + kcr_buf.data[CollisionalRxnLUT::kz41][0] * OHII * H2I / 34. - + kcr_buf.data[CollisionalRxnLUT::kz42][0] * H2OII * H2I / 36. - + kcr_buf.data[CollisionalRxnLUT::kz46][0] * H2OII * de / 18. - + kcr_buf.data[CollisionalRxnLUT::kz48][0] * H3OII * de / 19. - + kcr_buf.data[CollisionalRxnLUT::kz49][0] * H3OII * de / 9.5 - + kcr_buf.data[CollisionalRxnLUT::kz52][0] * SiI * OH / 476. - + kcr_buf.data[CollisionalRxnLUT::kz54][0] * SiOI * OH / 748.; + + kcol_buf[CollisionalRxnLUT::kz20][0] * CI * H2I / 24. + + kcol_buf[CollisionalRxnLUT::kz21][0] * OI * H2I / 32. + + kcol_buf[CollisionalRxnLUT::kz22][0] * HII * OI / 16. + + kcol_buf[CollisionalRxnLUT::kz23][0] * H2I * CH / 26. + + kcol_buf[CollisionalRxnLUT::kz24][0] * H2I * OH / 34. + + kcol_buf[CollisionalRxnLUT::kz26][0] * OH * CO / 476. + + kcol_buf[CollisionalRxnLUT::kz28][0] * CI * OH / 204. + + kcol_buf[CollisionalRxnLUT::kz32][0] * OI * CH / 208. + + kcol_buf[CollisionalRxnLUT::kz33][0] * OI * OH / 272. + + kcol_buf[CollisionalRxnLUT::kz34][0] * HII * OH / 17. + + kcol_buf[CollisionalRxnLUT::kz35][0] * HII * H2O / 18. + + kcol_buf[CollisionalRxnLUT::kz36][0] * HII * O2 / 32. + + kcol_buf[CollisionalRxnLUT::kz37][0] * CII * OH / 204. + + kcol_buf[CollisionalRxnLUT::kz40][0] * OII * H2I / 32. + + kcol_buf[CollisionalRxnLUT::kz41][0] * OHII * H2I / 34. + + kcol_buf[CollisionalRxnLUT::kz42][0] * H2OII * H2I / 36. + + kcol_buf[CollisionalRxnLUT::kz46][0] * H2OII * de / 18. + + kcol_buf[CollisionalRxnLUT::kz48][0] * H3OII * de / 19. + + kcol_buf[CollisionalRxnLUT::kz49][0] * H3OII * de / 9.5 + + kcol_buf[CollisionalRxnLUT::kz52][0] * SiI * OH / 476. + + kcol_buf[CollisionalRxnLUT::kz54][0] * SiOI * OH / 748.; acoef = acoef - + kcr_buf.data[CollisionalRxnLUT::kz15][0] * CH / 13. - + kcr_buf.data[CollisionalRxnLUT::kz16][0] * CH2 / 14. - + kcr_buf.data[CollisionalRxnLUT::kz17][0] * OH / 17. - + kcr_buf.data[CollisionalRxnLUT::kz18][0] * H2O / 18. - + kcr_buf.data[CollisionalRxnLUT::kz19][0] * O2 / 32. - + kcr_buf.data[CollisionalRxnLUT::kz27][0] * CI / 12. - + kcr_buf.data[CollisionalRxnLUT::kz30][0] * OI / 16. - + kcr_buf.data[CollisionalRxnLUT::kz39][0] * OII / 16. - + kcr_buf.data[CollisionalRxnLUT::kz43][0] * COII / 28.; + + kcol_buf[CollisionalRxnLUT::kz15][0] * CH / 13. + + kcol_buf[CollisionalRxnLUT::kz16][0] * CH2 / 14. + + kcol_buf[CollisionalRxnLUT::kz17][0] * OH / 17. + + kcol_buf[CollisionalRxnLUT::kz18][0] * H2O / 18. + + kcol_buf[CollisionalRxnLUT::kz19][0] * O2 / 32. + + kcol_buf[CollisionalRxnLUT::kz27][0] * CI / 12. + + kcol_buf[CollisionalRxnLUT::kz30][0] * OI / 16. + + kcol_buf[CollisionalRxnLUT::kz39][0] * OII / 16. + + kcol_buf[CollisionalRxnLUT::kz43][0] * COII / 28.; } deriv.data[SpLUT::HI][0] = deriv.data[SpLUT::HI][0] + (scoef - acoef * HI); @@ -1843,61 +1844,61 @@ inline void species_density_derivatives_0d( // 2) HII - scoef = kcr_buf.data[CollisionalRxnLUT::k1][0] * HI * de - + kcr_buf.data[CollisionalRxnLUT::k10][0] * H2II *HI /2. - + kcr_buf.data[CollisionalRxnLUT::k57][0] * HI * HI - + kcr_buf.data[CollisionalRxnLUT::k58][0] * HI * HeI /4. + scoef = kcol_buf[CollisionalRxnLUT::k1][0] * HI * de + + kcol_buf[CollisionalRxnLUT::k10][0] * H2II *HI /2. + + kcol_buf[CollisionalRxnLUT::k57][0] * HI * HI + + kcol_buf[CollisionalRxnLUT::k58][0] * HI * HeI /4. + kshield_buf.k24[0] *HI; if (my_chemistry->use_radiative_transfer == 1) { scoef = scoef + *(my_fields->RT_HI_ionization_rate) * HI; } - acoef = kcr_buf.data[CollisionalRxnLUT::k2][0] * de - + kcr_buf.data[CollisionalRxnLUT::k9][0] * HI - + kcr_buf.data[CollisionalRxnLUT::k11][0] * H2I /2. - + kcr_buf.data[CollisionalRxnLUT::k16][0] * HM - + kcr_buf.data[CollisionalRxnLUT::k17][0] * HM; + acoef = kcol_buf[CollisionalRxnLUT::k2][0] * de + + kcol_buf[CollisionalRxnLUT::k9][0] * HI + + kcol_buf[CollisionalRxnLUT::k11][0] * H2I /2. + + kcol_buf[CollisionalRxnLUT::k16][0] * HM + + kcol_buf[CollisionalRxnLUT::k17][0] * HM; // contribution of minor species if (my_chemistry->primordial_chemistry > 2) { scoef = scoef - + kcr_buf.data[CollisionalRxnLUT::k51][0] * HI * DII / 2. - + kcr_buf.data[CollisionalRxnLUT::k52][0] * H2I * DII / 4.; + + kcol_buf[CollisionalRxnLUT::k51][0] * HI * DII / 2. + + kcol_buf[CollisionalRxnLUT::k52][0] * H2I * DII / 4.; acoef = acoef - + kcr_buf.data[CollisionalRxnLUT::k50][0] * DI / 2. - + kcr_buf.data[CollisionalRxnLUT::k53][0] * HDI / 3.; + + kcol_buf[CollisionalRxnLUT::k50][0] * DI / 2. + + kcol_buf[CollisionalRxnLUT::k53][0] * HDI / 3.; } if (my_chemistry->primordial_chemistry > 3) { scoef = scoef - + kcr_buf.data[CollisionalRxnLUT::k125][0] * HDII * HI / 3.; + + kcol_buf[CollisionalRxnLUT::k125][0] * HDII * HI / 3.; acoef = acoef - + kcr_buf.data[CollisionalRxnLUT::k129][0] * DI / 2. - + kcr_buf.data[CollisionalRxnLUT::k134][0] * DM / 2. - + kcr_buf.data[CollisionalRxnLUT::k148][0] * HeI / 4. - + kcr_buf.data[CollisionalRxnLUT::k149][0] * HeI / 4.; + + kcol_buf[CollisionalRxnLUT::k129][0] * DI / 2. + + kcol_buf[CollisionalRxnLUT::k134][0] * DM / 2. + + kcol_buf[CollisionalRxnLUT::k148][0] * HeI / 4. + + kcol_buf[CollisionalRxnLUT::k149][0] * HeI / 4.; } if ((my_chemistry->metal_chemistry == 1) && (itmask_metal[0] != MASK_FALSE)) { scoef = scoef - + kcr_buf.data[CollisionalRxnLUT::kz39][0] * OII * HI / 16. - + kcr_buf.data[CollisionalRxnLUT::kz43][0] * COII * HI / 28.; + + kcol_buf[CollisionalRxnLUT::kz39][0] * OII * HI / 16. + + kcol_buf[CollisionalRxnLUT::kz43][0] * COII * HI / 28.; acoef = acoef - + kcr_buf.data[CollisionalRxnLUT::kz22][0] * OI / 16. - + kcr_buf.data[CollisionalRxnLUT::kz34][0] * OH / 17. - + kcr_buf.data[CollisionalRxnLUT::kz35][0] * H2O / 18. - + kcr_buf.data[CollisionalRxnLUT::kz36][0] * O2 / 32.; + + kcol_buf[CollisionalRxnLUT::kz22][0] * OI / 16. + + kcol_buf[CollisionalRxnLUT::kz34][0] * OH / 17. + + kcol_buf[CollisionalRxnLUT::kz35][0] * H2O / 18. + + kcol_buf[CollisionalRxnLUT::kz36][0] * O2 / 32.; } deriv.data[SpLUT::HII][0] = deriv.data[SpLUT::HII][0] + (scoef - acoef * HII); // 3) electrons: - scoef = kcr_buf.data[CollisionalRxnLUT::k8][0] * HM * HI - + kcr_buf.data[CollisionalRxnLUT::k15][0] * HM * HI - + kcr_buf.data[CollisionalRxnLUT::k17][0] * HM * HII - + kcr_buf.data[CollisionalRxnLUT::k57][0] * HI * HI - + kcr_buf.data[CollisionalRxnLUT::k58][0] * HI * HeI /4. + scoef = kcol_buf[CollisionalRxnLUT::k8][0] * HM * HI + + kcol_buf[CollisionalRxnLUT::k15][0] * HM * HI + + kcol_buf[CollisionalRxnLUT::k17][0] * HM * HII + + kcol_buf[CollisionalRxnLUT::k57][0] * HI * HI + + kcol_buf[CollisionalRxnLUT::k58][0] * HI * HeI /4. // + kshield_buf.k24[0] *HI + kshield_buf.k25[0] *HeII /4. @@ -1920,30 +1921,30 @@ inline void species_density_derivatives_0d( } } - acoef = - (kcr_buf.data[CollisionalRxnLUT::k1][0] *HI - kcr_buf.data[CollisionalRxnLUT::k2][0] *HII - + kcr_buf.data[CollisionalRxnLUT::k3][0] *HeI /4. - - kcr_buf.data[CollisionalRxnLUT::k6][0] *HeIII /4. - + kcr_buf.data[CollisionalRxnLUT::k5][0] *HeII /4. - - kcr_buf.data[CollisionalRxnLUT::k4][0] *HeII /4. - + kcr_buf.data[CollisionalRxnLUT::k14][0] *HM - - kcr_buf.data[CollisionalRxnLUT::k7][0] *HI - - kcr_buf.data[CollisionalRxnLUT::k18][0] *H2II /2.); + acoef = - (kcol_buf[CollisionalRxnLUT::k1][0] *HI - kcol_buf[CollisionalRxnLUT::k2][0] *HII + + kcol_buf[CollisionalRxnLUT::k3][0] *HeI /4. - + kcol_buf[CollisionalRxnLUT::k6][0] *HeIII /4. + + kcol_buf[CollisionalRxnLUT::k5][0] *HeII /4. - + kcol_buf[CollisionalRxnLUT::k4][0] *HeII /4. + + kcol_buf[CollisionalRxnLUT::k14][0] *HM + - kcol_buf[CollisionalRxnLUT::k7][0] *HI + - kcol_buf[CollisionalRxnLUT::k18][0] *H2II /2.); // contribution of minor species if (my_chemistry->primordial_chemistry > 2) { scoef = scoef - + kcr_buf.data[CollisionalRxnLUT::k56][0] * DI * HM / 2.; + + kcol_buf[CollisionalRxnLUT::k56][0] * DI * HM / 2.; acoef = acoef - - kcr_buf.data[CollisionalRxnLUT::k1][0] * DI / 2. - + kcr_buf.data[CollisionalRxnLUT::k2][0] * DII / 2.; + - kcol_buf[CollisionalRxnLUT::k1][0] * DI / 2. + + kcol_buf[CollisionalRxnLUT::k2][0] * DII / 2.; } if (my_chemistry->primordial_chemistry > 3) { scoef = scoef - + kcr_buf.data[CollisionalRxnLUT::k137][0] * DM * HI / 2.; + + kcol_buf[CollisionalRxnLUT::k137][0] * DM * HI / 2.; acoef = acoef - + kcr_buf.data[CollisionalRxnLUT::k131][0] * HDII / 3. - + kcr_buf.data[CollisionalRxnLUT::k132][0] * DI / 2. - + kcr_buf.data[CollisionalRxnLUT::k153][0] * HeHII / 5.; + + kcol_buf[CollisionalRxnLUT::k131][0] * HDII / 3. + + kcol_buf[CollisionalRxnLUT::k132][0] * DI / 2. + + kcol_buf[CollisionalRxnLUT::k153][0] * HeHII / 5.; } if ((my_chemistry->metal_chemistry == 1) && @@ -1952,25 +1953,25 @@ inline void species_density_derivatives_0d( // it has no practical impact and produces a compiler warning // scoef = scoef; acoef = acoef - + kcr_buf.data[CollisionalRxnLUT::kz44][0] * CII / 12. - + kcr_buf.data[CollisionalRxnLUT::kz45][0] * OII / 16. - + kcr_buf.data[CollisionalRxnLUT::kz46][0] * H2OII / 18. - + kcr_buf.data[CollisionalRxnLUT::kz47][0] * H2OII / 18. - + kcr_buf.data[CollisionalRxnLUT::kz48][0] * H3OII / 19. - + kcr_buf.data[CollisionalRxnLUT::kz49][0] * H3OII / 19. - + kcr_buf.data[CollisionalRxnLUT::kz50][0] * O2II / 32.; + + kcol_buf[CollisionalRxnLUT::kz44][0] * CII / 12. + + kcol_buf[CollisionalRxnLUT::kz45][0] * OII / 16. + + kcol_buf[CollisionalRxnLUT::kz46][0] * H2OII / 18. + + kcol_buf[CollisionalRxnLUT::kz47][0] * H2OII / 18. + + kcol_buf[CollisionalRxnLUT::kz48][0] * H3OII / 19. + + kcol_buf[CollisionalRxnLUT::kz49][0] * H3OII / 19. + + kcol_buf[CollisionalRxnLUT::kz50][0] * O2II / 32.; } deriv.data[SpLUT::e][0] = deriv.data[SpLUT::e][0] + (scoef - acoef * de); // 7) H2 - scoef = 2.*(kcr_buf.data[CollisionalRxnLUT::k8][0] * HM * HI - + kcr_buf.data[CollisionalRxnLUT::k10][0] * H2II * HI /2. - + kcr_buf.data[CollisionalRxnLUT::k19][0] * H2II * HM /2. - + kcr_buf.data[CollisionalRxnLUT::k22][0] * HI * std::pow((HI ),2.)); - acoef = ( kcr_buf.data[CollisionalRxnLUT::k13][0] *HI + kcr_buf.data[CollisionalRxnLUT::k11][0] *HII - + kcr_buf.data[CollisionalRxnLUT::k12][0] *de ) + scoef = 2.*(kcol_buf[CollisionalRxnLUT::k8][0] * HM * HI + + kcol_buf[CollisionalRxnLUT::k10][0] * H2II * HI /2. + + kcol_buf[CollisionalRxnLUT::k19][0] * H2II * HM /2. + + kcol_buf[CollisionalRxnLUT::k22][0] * HI * std::pow((HI ),2.)); + acoef = ( kcol_buf[CollisionalRxnLUT::k13][0] *HI + kcol_buf[CollisionalRxnLUT::k11][0] *HII + + kcol_buf[CollisionalRxnLUT::k12][0] *de ) + kshield_buf.k29[0] + kshield_buf.k31[0]; if (anydust != MASK_FALSE) { @@ -1982,32 +1983,32 @@ inline void species_density_derivatives_0d( // contribution of minor species if (my_chemistry->primordial_chemistry > 2) { scoef = scoef + 2. * ( - kcr_buf.data[CollisionalRxnLUT::k53][0] * HDI * HII / 3. - + kcr_buf.data[CollisionalRxnLUT::k55][0] * HDI * HI / 3. + kcol_buf[CollisionalRxnLUT::k53][0] * HDI * HII / 3. + + kcol_buf[CollisionalRxnLUT::k55][0] * HDI * HI / 3. ); acoef = acoef - + kcr_buf.data[CollisionalRxnLUT::k52][0] * DII / 2. - + kcr_buf.data[CollisionalRxnLUT::k54][0] * DI / 2.; + + kcol_buf[CollisionalRxnLUT::k52][0] * DII / 2. + + kcol_buf[CollisionalRxnLUT::k54][0] * DI / 2.; } if ((my_chemistry->metal_chemistry == 1) && (itmask_metal[0] != MASK_FALSE)) { scoef = scoef + 2. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::kz15][0] * HI * CH / 13. - + kcr_buf.data[CollisionalRxnLUT::kz16][0] * HI * CH2 / 14. - + kcr_buf.data[CollisionalRxnLUT::kz17][0] * HI * OH / 17. - + kcr_buf.data[CollisionalRxnLUT::kz18][0] * HI * H2O / 18. - + kcr_buf.data[CollisionalRxnLUT::kz47][0] * H2OII * de / 18. + + kcol_buf[CollisionalRxnLUT::kz15][0] * HI * CH / 13. + + kcol_buf[CollisionalRxnLUT::kz16][0] * HI * CH2 / 14. + + kcol_buf[CollisionalRxnLUT::kz17][0] * HI * OH / 17. + + kcol_buf[CollisionalRxnLUT::kz18][0] * HI * H2O / 18. + + kcol_buf[CollisionalRxnLUT::kz47][0] * H2OII * de / 18. ); acoef = acoef - + kcr_buf.data[CollisionalRxnLUT::kz20][0] * CI / 12. - + kcr_buf.data[CollisionalRxnLUT::kz21][0] * OI / 16. - + kcr_buf.data[CollisionalRxnLUT::kz23][0] * CH / 13. - + kcr_buf.data[CollisionalRxnLUT::kz24][0] * OH / 17. - + kcr_buf.data[CollisionalRxnLUT::kz40][0] * OII / 16. - + kcr_buf.data[CollisionalRxnLUT::kz41][0] * OHII / 17. - + kcr_buf.data[CollisionalRxnLUT::kz42][0] * H2OII / 18. - + kcr_buf.data[CollisionalRxnLUT::kz51][0] * CI / 12.; + + kcol_buf[CollisionalRxnLUT::kz20][0] * CI / 12. + + kcol_buf[CollisionalRxnLUT::kz21][0] * OI / 16. + + kcol_buf[CollisionalRxnLUT::kz23][0] * CH / 13. + + kcol_buf[CollisionalRxnLUT::kz24][0] * OH / 17. + + kcol_buf[CollisionalRxnLUT::kz40][0] * OII / 16. + + kcol_buf[CollisionalRxnLUT::kz41][0] * OHII / 17. + + kcol_buf[CollisionalRxnLUT::kz42][0] * H2OII / 18. + + kcol_buf[CollisionalRxnLUT::kz51][0] * CI / 12.; if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 0) { scoef = scoef + 2. * @@ -2033,22 +2034,22 @@ inline void species_density_derivatives_0d( // 8) H- - scoef = kcr_buf.data[CollisionalRxnLUT::k7][0] * HI * de; - acoef = (kcr_buf.data[CollisionalRxnLUT::k8][0] + kcr_buf.data[CollisionalRxnLUT::k15][0] ) * HI + - (kcr_buf.data[CollisionalRxnLUT::k16][0] + kcr_buf.data[CollisionalRxnLUT::k17][0] ) * HII + - kcr_buf.data[CollisionalRxnLUT::k14][0] * de + kcr_buf.data[CollisionalRxnLUT::k19][0] * H2II /2.0f + + scoef = kcol_buf[CollisionalRxnLUT::k7][0] * HI * de; + acoef = (kcol_buf[CollisionalRxnLUT::k8][0] + kcol_buf[CollisionalRxnLUT::k15][0] ) * HI + + (kcol_buf[CollisionalRxnLUT::k16][0] + kcol_buf[CollisionalRxnLUT::k17][0] ) * HII + + kcol_buf[CollisionalRxnLUT::k14][0] * de + kcol_buf[CollisionalRxnLUT::k19][0] * H2II /2.0f + my_uvb_rates.k27; // contribution of minor species if (my_chemistry->primordial_chemistry > 2) { acoef = acoef - + kcr_buf.data[CollisionalRxnLUT::k56][0] * DI / 2.; + + kcol_buf[CollisionalRxnLUT::k56][0] * DI / 2.; } if (my_chemistry->primordial_chemistry > 3) { scoef = scoef - + kcr_buf.data[CollisionalRxnLUT::k136][0] * DM * HI / 2.; + + kcol_buf[CollisionalRxnLUT::k136][0] * DM * HI / 2.; acoef = acoef - + kcr_buf.data[CollisionalRxnLUT::k135][0] * DI / 2.; + + kcol_buf[CollisionalRxnLUT::k135][0] * DI / 2.; } deriv.data[SpLUT::HM][0] = deriv.data[SpLUT::HM][0] + (scoef - acoef * HM); @@ -2056,20 +2057,20 @@ inline void species_density_derivatives_0d( // 9) H2+ - scoef = 2.*( kcr_buf.data[CollisionalRxnLUT::k9][0] *HI *HII - + kcr_buf.data[CollisionalRxnLUT::k11][0] *H2I /2.*HII - + kcr_buf.data[CollisionalRxnLUT::k17][0] *HM *HII + scoef = 2.*( kcol_buf[CollisionalRxnLUT::k9][0] *HI *HII + + kcol_buf[CollisionalRxnLUT::k11][0] *H2I /2.*HII + + kcol_buf[CollisionalRxnLUT::k17][0] *HM *HII + kshield_buf.k29[0] *H2I /2. ); - acoef = kcr_buf.data[CollisionalRxnLUT::k10][0] *HI + kcr_buf.data[CollisionalRxnLUT::k18][0] *de - + kcr_buf.data[CollisionalRxnLUT::k19][0] *HM + acoef = kcol_buf[CollisionalRxnLUT::k10][0] *HI + kcol_buf[CollisionalRxnLUT::k18][0] *de + + kcol_buf[CollisionalRxnLUT::k19][0] *HM + (kshield_buf.k28[0] +kshield_buf.k30[0] ); if (my_chemistry->primordial_chemistry > 3) { scoef = scoef + 2. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::k152][0] * HeHII * HI / 5. + + kcol_buf[CollisionalRxnLUT::k152][0] * HeHII * HI / 5. ); acoef = acoef - + kcr_buf.data[CollisionalRxnLUT::k150][0] * HeI / 4.; + + kcol_buf[CollisionalRxnLUT::k150][0] * HeI / 4.; } deriv.data[SpLUT::H2II][0] = deriv.data[SpLUT::H2II][0] + (scoef - acoef * H2II); @@ -2089,28 +2090,28 @@ inline void species_density_derivatives_0d( // 1) DI - scoef = ( kcr_buf.data[CollisionalRxnLUT::k2][0] * DII * de - + kcr_buf.data[CollisionalRxnLUT::k51][0] * DII * HI - + 2.*kcr_buf.data[CollisionalRxnLUT::k55][0] * HDI * + scoef = ( kcol_buf[CollisionalRxnLUT::k2][0] * DII * de + + kcol_buf[CollisionalRxnLUT::k51][0] * DII * HI + + 2.*kcol_buf[CollisionalRxnLUT::k55][0] * HDI * HI /3. ); - acoef = kcr_buf.data[CollisionalRxnLUT::k1][0] * de - + kcr_buf.data[CollisionalRxnLUT::k50][0] * HII - + kcr_buf.data[CollisionalRxnLUT::k54][0] * H2I /2. - + kcr_buf.data[CollisionalRxnLUT::k56][0] * HM + acoef = kcol_buf[CollisionalRxnLUT::k1][0] * de + + kcol_buf[CollisionalRxnLUT::k50][0] * HII + + kcol_buf[CollisionalRxnLUT::k54][0] * H2I /2. + + kcol_buf[CollisionalRxnLUT::k56][0] * HM + kshield_buf.k24[0]; if (my_chemistry->use_radiative_transfer == 1) { acoef = acoef + *(my_fields->RT_HI_ionization_rate); } if (my_chemistry->primordial_chemistry > 3) { scoef = scoef + 2. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::k131][0] * HDII * de / 3. - + kcr_buf.data[CollisionalRxnLUT::k133][0] * DII * DM / 2. - + kcr_buf.data[CollisionalRxnLUT::k134][0] * HII * DM / 2. - + kcr_buf.data[CollisionalRxnLUT::k136][0] * DM * HI / 2. + + kcol_buf[CollisionalRxnLUT::k131][0] * HDII * de / 3. + + kcol_buf[CollisionalRxnLUT::k133][0] * DII * DM / 2. + + kcol_buf[CollisionalRxnLUT::k134][0] * HII * DM / 2. + + kcol_buf[CollisionalRxnLUT::k136][0] * DM * HI / 2. ); acoef = acoef - + kcr_buf.data[CollisionalRxnLUT::k129][0] * HII - + kcr_buf.data[CollisionalRxnLUT::k132][0] * de - + kcr_buf.data[CollisionalRxnLUT::k135][0] * HM; + + kcol_buf[CollisionalRxnLUT::k129][0] * HII + + kcol_buf[CollisionalRxnLUT::k132][0] * de + + kcol_buf[CollisionalRxnLUT::k135][0] * HM; } if (my_chemistry->use_radiative_transfer == 1) { if (my_chemistry->radiative_transfer_HDI_dissociation > 0) { @@ -2122,35 +2123,35 @@ inline void species_density_derivatives_0d( // 2) DII - scoef = ( kcr_buf.data[CollisionalRxnLUT::k1][0] * DI * de - + kcr_buf.data[CollisionalRxnLUT::k50][0] * HII * DI - + 2.*kcr_buf.data[CollisionalRxnLUT::k53][0] * HII * HDI /3. + scoef = ( kcol_buf[CollisionalRxnLUT::k1][0] * DI * de + + kcol_buf[CollisionalRxnLUT::k50][0] * HII * DI + + 2.*kcol_buf[CollisionalRxnLUT::k53][0] * HII * HDI /3. ) + kshield_buf.k24[0] *DI; acoef = 0.; // ! initialize GC202002 if (my_chemistry->use_radiative_transfer == 1) { scoef = scoef + *(my_fields->RT_HI_ionization_rate) *DI; } - acoef = kcr_buf.data[CollisionalRxnLUT::k2][0] * de - + kcr_buf.data[CollisionalRxnLUT::k51][0] * HI - + kcr_buf.data[CollisionalRxnLUT::k52][0] * H2I /2.; + acoef = kcol_buf[CollisionalRxnLUT::k2][0] * de + + kcol_buf[CollisionalRxnLUT::k51][0] * HI + + kcol_buf[CollisionalRxnLUT::k52][0] * H2I /2.; if (my_chemistry->primordial_chemistry > 3) { acoef = acoef - + kcr_buf.data[CollisionalRxnLUT::k130][0] * HI - + kcr_buf.data[CollisionalRxnLUT::k133][0] * DM / 2.; + + kcol_buf[CollisionalRxnLUT::k130][0] * HI + + kcol_buf[CollisionalRxnLUT::k133][0] * DM / 2.; } deriv.data[SpLUT::DII][0] = deriv.data[SpLUT::DII][0] + (scoef - acoef * DII); // 3) HDI - scoef = 3.*(kcr_buf.data[CollisionalRxnLUT::k52][0] * DII * + scoef = 3.*(kcol_buf[CollisionalRxnLUT::k52][0] * DII * H2I /2./2. - + kcr_buf.data[CollisionalRxnLUT::k54][0] * DI * H2I /2./2. - // ! & + 2._DKIND*kcr_buf.data[CollisionalRxnLUT::k56][0] * DI * HM /2._DKIND + + kcol_buf[CollisionalRxnLUT::k54][0] * DI * H2I /2./2. + // ! & + 2._DKIND*kcol_buf[CollisionalRxnLUT::k56][0] * DI * HM /2._DKIND //- ! corrected by GC202005 - + kcr_buf.data[CollisionalRxnLUT::k56][0] * DI * HM /2. + + kcol_buf[CollisionalRxnLUT::k56][0] * DI * HM /2. ); - acoef = kcr_buf.data[CollisionalRxnLUT::k53][0] * HII - + kcr_buf.data[CollisionalRxnLUT::k55][0] * HI; + acoef = kcol_buf[CollisionalRxnLUT::k53][0] * HII + + kcol_buf[CollisionalRxnLUT::k55][0] * HI; if (my_chemistry->use_radiative_transfer == 1) { if (my_chemistry->radiative_transfer_HDI_dissociation > 0) { acoef = acoef @@ -2159,8 +2160,8 @@ inline void species_density_derivatives_0d( } if (my_chemistry->primordial_chemistry > 3) { scoef = scoef + 3. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::k125][0] * HDII * HI / 3. - + kcr_buf.data[CollisionalRxnLUT::k137][0] * DM * HI / 2. + + kcol_buf[CollisionalRxnLUT::k125][0] * HDII * HI / 3. + + kcol_buf[CollisionalRxnLUT::k137][0] * DM * HI / 2. ); } deriv.data[SpLUT::HDI][0] = deriv.data[SpLUT::HDI][0] + (scoef - acoef * HDI); @@ -2178,13 +2179,13 @@ inline void species_density_derivatives_0d( // 1) DM scoef = - kcr_buf.data[CollisionalRxnLUT::k132][0] * DI * de - + kcr_buf.data[CollisionalRxnLUT::k135][0] * HM * DI; + kcol_buf[CollisionalRxnLUT::k132][0] * DI * de + + kcol_buf[CollisionalRxnLUT::k135][0] * HM * DI; acoef = - kcr_buf.data[CollisionalRxnLUT::k133][0] * DII / 2. - + kcr_buf.data[CollisionalRxnLUT::k134][0] * HII - + kcr_buf.data[CollisionalRxnLUT::k136][0] * HI - + kcr_buf.data[CollisionalRxnLUT::k137][0] * HI; + kcol_buf[CollisionalRxnLUT::k133][0] * DII / 2. + + kcol_buf[CollisionalRxnLUT::k134][0] * HII + + kcol_buf[CollisionalRxnLUT::k136][0] * HI + + kcol_buf[CollisionalRxnLUT::k137][0] * HI; deriv.data[SpLUT::DM][0] = deriv.data[SpLUT::DM][0] + (scoef - acoef * DM); @@ -2192,12 +2193,12 @@ inline void species_density_derivatives_0d( // 2) HDII scoef = 3. * ( - kcr_buf.data[CollisionalRxnLUT::k129][0] * DI * HII / 2. - + kcr_buf.data[CollisionalRxnLUT::k130][0] * DII * HI / 2. + kcol_buf[CollisionalRxnLUT::k129][0] * DI * HII / 2. + + kcol_buf[CollisionalRxnLUT::k130][0] * DII * HI / 2. ); acoef = - kcr_buf.data[CollisionalRxnLUT::k125][0] * HI - + kcr_buf.data[CollisionalRxnLUT::k131][0] * de; + kcol_buf[CollisionalRxnLUT::k125][0] * HI + + kcol_buf[CollisionalRxnLUT::k131][0] * de; deriv.data[SpLUT::HDII][0] = deriv.data[SpLUT::HDII][0] + (scoef - acoef * HDII); @@ -2205,14 +2206,14 @@ inline void species_density_derivatives_0d( // 3) HeHII scoef = 5. * ( - kcr_buf.data[CollisionalRxnLUT::k148][0] * HeI * HII / 4. - + kcr_buf.data[CollisionalRxnLUT::k149][0] * HeI * HII / 4. - + kcr_buf.data[CollisionalRxnLUT::k150][0] * HeI * H2II / 8. - + kcr_buf.data[CollisionalRxnLUT::k151][0] * HeII * HI / 4. + kcol_buf[CollisionalRxnLUT::k148][0] * HeI * HII / 4. + + kcol_buf[CollisionalRxnLUT::k149][0] * HeI * HII / 4. + + kcol_buf[CollisionalRxnLUT::k150][0] * HeI * H2II / 8. + + kcol_buf[CollisionalRxnLUT::k151][0] * HeII * HI / 4. ); acoef = - kcr_buf.data[CollisionalRxnLUT::k152][0] * HI - + kcr_buf.data[CollisionalRxnLUT::k153][0] * de; + kcol_buf[CollisionalRxnLUT::k152][0] * HI + + kcol_buf[CollisionalRxnLUT::k153][0] * de; deriv.data[SpLUT::HeHII][0] = deriv.data[SpLUT::HeHII][0] + (scoef - acoef * HeHII); @@ -2228,15 +2229,15 @@ inline void species_density_derivatives_0d( // ***** CI ********** scoef = 0. + 12. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::kz15][0] * HI * CH / 13. - + kcr_buf.data[CollisionalRxnLUT::kz44][0] * CII * de / 12. + + kcol_buf[CollisionalRxnLUT::kz15][0] * HI * CH / 13. + + kcol_buf[CollisionalRxnLUT::kz44][0] * CII * de / 12. ); acoef = 0. - + kcr_buf.data[CollisionalRxnLUT::kz20][0] * H2I / 2. - + kcr_buf.data[CollisionalRxnLUT::kz27][0] * HI - + kcr_buf.data[CollisionalRxnLUT::kz28][0] * OH / 17. - + kcr_buf.data[CollisionalRxnLUT::kz29][0] * O2 / 32. - + kcr_buf.data[CollisionalRxnLUT::kz51][0] * H2I / 2.; + + kcol_buf[CollisionalRxnLUT::kz20][0] * H2I / 2. + + kcol_buf[CollisionalRxnLUT::kz27][0] * HI + + kcol_buf[CollisionalRxnLUT::kz28][0] * OH / 17. + + kcol_buf[CollisionalRxnLUT::kz29][0] * O2 / 32. + + kcol_buf[CollisionalRxnLUT::kz51][0] * H2I / 2.; if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 0) { acoef = acoef @@ -2262,9 +2263,9 @@ inline void species_density_derivatives_0d( scoef = 0. + 12. * ( 0. ); acoef = 0. - + kcr_buf.data[CollisionalRxnLUT::kz37][0] * OH / 17. - + kcr_buf.data[CollisionalRxnLUT::kz38][0] * O2 / 32. - + kcr_buf.data[CollisionalRxnLUT::kz44][0] * de; + + kcol_buf[CollisionalRxnLUT::kz37][0] * OH / 17. + + kcol_buf[CollisionalRxnLUT::kz38][0] * O2 / 32. + + kcol_buf[CollisionalRxnLUT::kz44][0] * de; if (my_chemistry->use_radiative_transfer == 1) { if (my_chemistry->radiative_transfer_metal_ionization > 0) { scoef = scoef @@ -2278,14 +2279,14 @@ inline void species_density_derivatives_0d( // ***** CO ********** scoef = 0. + 28. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::kz28][0] * CI * OH / 204. - + kcr_buf.data[CollisionalRxnLUT::kz29][0] * CI * O2 / 384. - + kcr_buf.data[CollisionalRxnLUT::kz32][0] * OI * CH / 208. - + kcr_buf.data[CollisionalRxnLUT::kz38][0] * CII * O2 / 384. - + kcr_buf.data[CollisionalRxnLUT::kz43][0] * COII * HI / 28. + + kcol_buf[CollisionalRxnLUT::kz28][0] * CI * OH / 204. + + kcol_buf[CollisionalRxnLUT::kz29][0] * CI * O2 / 384. + + kcol_buf[CollisionalRxnLUT::kz32][0] * OI * CH / 208. + + kcol_buf[CollisionalRxnLUT::kz38][0] * CII * O2 / 384. + + kcol_buf[CollisionalRxnLUT::kz43][0] * COII * HI / 28. ); acoef = 0. - + kcr_buf.data[CollisionalRxnLUT::kz26][0] * OH / 17.; + + kcol_buf[CollisionalRxnLUT::kz26][0] * OH / 17.; if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 2) { acoef = acoef @@ -2306,7 +2307,7 @@ inline void species_density_derivatives_0d( // ***** CO2 ********** scoef = 0. + 44. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::kz26][0] * OH * CO / 476. + + kcol_buf[CollisionalRxnLUT::kz26][0] * OH * CO / 476. ); acoef = 0.; @@ -2316,23 +2317,23 @@ inline void species_density_derivatives_0d( // ***** OI ********** scoef = 0. + 16. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::kz17][0] * HI * OH / 17. - + kcr_buf.data[CollisionalRxnLUT::kz19][0] * HI * O2 / 32. - + kcr_buf.data[CollisionalRxnLUT::kz25][0] * OH * OH / 289. - + kcr_buf.data[CollisionalRxnLUT::kz29][0] * CI * O2 / 384. - + kcr_buf.data[CollisionalRxnLUT::kz39][0] * OII * HI / 16. - + kcr_buf.data[CollisionalRxnLUT::kz45][0] * OII * de / 16. - + kcr_buf.data[CollisionalRxnLUT::kz47][0] * H2OII * de / 18. - + kcr_buf.data[CollisionalRxnLUT::kz50][0] * O2II * de / 16. - + kcr_buf.data[CollisionalRxnLUT::kz53][0] * SiI * O2 / 896. + + kcol_buf[CollisionalRxnLUT::kz17][0] * HI * OH / 17. + + kcol_buf[CollisionalRxnLUT::kz19][0] * HI * O2 / 32. + + kcol_buf[CollisionalRxnLUT::kz25][0] * OH * OH / 289. + + kcol_buf[CollisionalRxnLUT::kz29][0] * CI * O2 / 384. + + kcol_buf[CollisionalRxnLUT::kz39][0] * OII * HI / 16. + + kcol_buf[CollisionalRxnLUT::kz45][0] * OII * de / 16. + + kcol_buf[CollisionalRxnLUT::kz47][0] * H2OII * de / 18. + + kcol_buf[CollisionalRxnLUT::kz50][0] * O2II * de / 16. + + kcol_buf[CollisionalRxnLUT::kz53][0] * SiI * O2 / 896. ); acoef = 0. - + kcr_buf.data[CollisionalRxnLUT::kz21][0] * H2I / 2. - + kcr_buf.data[CollisionalRxnLUT::kz22][0] * HII - + kcr_buf.data[CollisionalRxnLUT::kz30][0] * HI - + kcr_buf.data[CollisionalRxnLUT::kz31][0] * OI / 8. - + kcr_buf.data[CollisionalRxnLUT::kz32][0] * CH / 13. - + kcr_buf.data[CollisionalRxnLUT::kz33][0] * OH / 17.; + + kcol_buf[CollisionalRxnLUT::kz21][0] * H2I / 2. + + kcol_buf[CollisionalRxnLUT::kz22][0] * HII + + kcol_buf[CollisionalRxnLUT::kz30][0] * HI + + kcol_buf[CollisionalRxnLUT::kz31][0] * OI / 8. + + kcol_buf[CollisionalRxnLUT::kz32][0] * CH / 13. + + kcol_buf[CollisionalRxnLUT::kz33][0] * OH / 17.; if (my_chemistry->use_radiative_transfer == 1) { if (my_chemistry->radiative_transfer_metal_ionization > 0) { acoef = acoef @@ -2351,24 +2352,24 @@ inline void species_density_derivatives_0d( // ***** OH ********** scoef = 0. + 17. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::kz18][0] * HI * H2O / 18. - + kcr_buf.data[CollisionalRxnLUT::kz19][0] * HI * O2 / 32. - + kcr_buf.data[CollisionalRxnLUT::kz21][0] * OI * H2I / 32. - + kcr_buf.data[CollisionalRxnLUT::kz30][0] * OI * HI / 16. - + kcr_buf.data[CollisionalRxnLUT::kz46][0] * H2OII * de / 18. - + kcr_buf.data[CollisionalRxnLUT::kz49][0] * H3OII * de / 19. + + kcol_buf[CollisionalRxnLUT::kz18][0] * HI * H2O / 18. + + kcol_buf[CollisionalRxnLUT::kz19][0] * HI * O2 / 32. + + kcol_buf[CollisionalRxnLUT::kz21][0] * OI * H2I / 32. + + kcol_buf[CollisionalRxnLUT::kz30][0] * OI * HI / 16. + + kcol_buf[CollisionalRxnLUT::kz46][0] * H2OII * de / 18. + + kcol_buf[CollisionalRxnLUT::kz49][0] * H3OII * de / 19. ); acoef = 0. - + kcr_buf.data[CollisionalRxnLUT::kz17][0] * HI - + kcr_buf.data[CollisionalRxnLUT::kz24][0] * H2I / 2. - + kcr_buf.data[CollisionalRxnLUT::kz25][0] * OH / 8.5 - + kcr_buf.data[CollisionalRxnLUT::kz26][0] * CO / 28. - + kcr_buf.data[CollisionalRxnLUT::kz28][0] * CI / 12. - + kcr_buf.data[CollisionalRxnLUT::kz33][0] * OI / 16. - + kcr_buf.data[CollisionalRxnLUT::kz34][0] * HII - + kcr_buf.data[CollisionalRxnLUT::kz37][0] * CII / 12. - + kcr_buf.data[CollisionalRxnLUT::kz52][0] * SiI / 28. - + kcr_buf.data[CollisionalRxnLUT::kz54][0] * SiOI / 44.; + + kcol_buf[CollisionalRxnLUT::kz17][0] * HI + + kcol_buf[CollisionalRxnLUT::kz24][0] * H2I / 2. + + kcol_buf[CollisionalRxnLUT::kz25][0] * OH / 8.5 + + kcol_buf[CollisionalRxnLUT::kz26][0] * CO / 28. + + kcol_buf[CollisionalRxnLUT::kz28][0] * CI / 12. + + kcol_buf[CollisionalRxnLUT::kz33][0] * OI / 16. + + kcol_buf[CollisionalRxnLUT::kz34][0] * HII + + kcol_buf[CollisionalRxnLUT::kz37][0] * CII / 12. + + kcol_buf[CollisionalRxnLUT::kz52][0] * SiI / 28. + + kcol_buf[CollisionalRxnLUT::kz54][0] * SiOI / 44.; if (my_chemistry->use_radiative_transfer == 1) { if (my_chemistry->radiative_transfer_metal_dissociation > 0) { acoef = acoef @@ -2384,13 +2385,13 @@ inline void species_density_derivatives_0d( // ***** H2O ********** scoef = 0. + 18. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::kz24][0] * H2I * OH / 34. - + kcr_buf.data[CollisionalRxnLUT::kz25][0] * OH * OH / 289. - + kcr_buf.data[CollisionalRxnLUT::kz48][0] * H3OII * de / 19. + + kcol_buf[CollisionalRxnLUT::kz24][0] * H2I * OH / 34. + + kcol_buf[CollisionalRxnLUT::kz25][0] * OH * OH / 289. + + kcol_buf[CollisionalRxnLUT::kz48][0] * H3OII * de / 19. ); acoef = 0. - + kcr_buf.data[CollisionalRxnLUT::kz18][0] * HI - + kcr_buf.data[CollisionalRxnLUT::kz35][0] * HII; + + kcol_buf[CollisionalRxnLUT::kz18][0] * HI + + kcol_buf[CollisionalRxnLUT::kz35][0] * HII; if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 0) { acoef = acoef @@ -2421,15 +2422,15 @@ inline void species_density_derivatives_0d( // ***** O2 ********** scoef = 0. + 32. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::kz31][0] * OI * OI / 256. - + kcr_buf.data[CollisionalRxnLUT::kz33][0] * OI * OH / 272. + + kcol_buf[CollisionalRxnLUT::kz31][0] * OI * OI / 256. + + kcol_buf[CollisionalRxnLUT::kz33][0] * OI * OH / 272. ); acoef = 0. - + kcr_buf.data[CollisionalRxnLUT::kz19][0] * HI - + kcr_buf.data[CollisionalRxnLUT::kz29][0] * CI / 12. - + kcr_buf.data[CollisionalRxnLUT::kz36][0] * HII - + kcr_buf.data[CollisionalRxnLUT::kz38][0] * CII / 12. - + kcr_buf.data[CollisionalRxnLUT::kz53][0] * SiI / 28.; + + kcol_buf[CollisionalRxnLUT::kz19][0] * HI + + kcol_buf[CollisionalRxnLUT::kz29][0] * CI / 12. + + kcol_buf[CollisionalRxnLUT::kz36][0] * HII + + kcol_buf[CollisionalRxnLUT::kz38][0] * CII / 12. + + kcol_buf[CollisionalRxnLUT::kz53][0] * SiI / 28.; deriv.data[SpLUT::O2][0] = deriv.data[SpLUT::O2][0] + (scoef - acoef * O2); @@ -2439,8 +2440,8 @@ inline void species_density_derivatives_0d( scoef = 0. + 28. * ( 0. ); acoef = 0. - + kcr_buf.data[CollisionalRxnLUT::kz52][0] * OH / 17. - + kcr_buf.data[CollisionalRxnLUT::kz53][0] * O2 / 32.; + + kcol_buf[CollisionalRxnLUT::kz52][0] * OH / 17. + + kcol_buf[CollisionalRxnLUT::kz53][0] * O2 / 32.; if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 1) { acoef = acoef @@ -2454,11 +2455,11 @@ inline void species_density_derivatives_0d( // ***** SiOI ********** scoef = 0. + 44. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::kz52][0] * SiI * OH / 476. - + kcr_buf.data[CollisionalRxnLUT::kz53][0] * SiI * O2 / 896. + + kcol_buf[CollisionalRxnLUT::kz52][0] * SiI * OH / 476. + + kcol_buf[CollisionalRxnLUT::kz53][0] * SiI * O2 / 896. ); acoef = 0. - + kcr_buf.data[CollisionalRxnLUT::kz54][0] * OH / 17.; + + kcol_buf[CollisionalRxnLUT::kz54][0] * OH / 17.; if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 0) { acoef = acoef @@ -2476,7 +2477,7 @@ inline void species_density_derivatives_0d( // ***** SiO2I ********** scoef = 0. + 60. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::kz54][0] * SiOI * OH / 748. + + kcol_buf[CollisionalRxnLUT::kz54][0] * SiOI * OH / 748. ); acoef = 0.; if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { @@ -2492,14 +2493,14 @@ inline void species_density_derivatives_0d( // ***** CH ********** scoef = 0. + 13. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::kz16][0] * HI * CH2 / 14. - + kcr_buf.data[CollisionalRxnLUT::kz20][0] * CI * H2I / 24. - + kcr_buf.data[CollisionalRxnLUT::kz27][0] * CI * HI / 12. + + kcol_buf[CollisionalRxnLUT::kz16][0] * HI * CH2 / 14. + + kcol_buf[CollisionalRxnLUT::kz20][0] * CI * H2I / 24. + + kcol_buf[CollisionalRxnLUT::kz27][0] * CI * HI / 12. ); acoef = 0. - + kcr_buf.data[CollisionalRxnLUT::kz15][0] * HI - + kcr_buf.data[CollisionalRxnLUT::kz23][0] * H2I / 2. - + kcr_buf.data[CollisionalRxnLUT::kz32][0] * OI / 16.; + + kcol_buf[CollisionalRxnLUT::kz15][0] * HI + + kcol_buf[CollisionalRxnLUT::kz23][0] * H2I / 2. + + kcol_buf[CollisionalRxnLUT::kz32][0] * OI / 16.; deriv.data[SpLUT::CH][0] = deriv.data[SpLUT::CH][0] + (scoef - acoef * CH); @@ -2507,11 +2508,11 @@ inline void species_density_derivatives_0d( // ***** CH2 ********** scoef = 0. + 14. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::kz23][0] * H2I * CH / 26. - + kcr_buf.data[CollisionalRxnLUT::kz51][0] * H2I * CI / 24. + + kcol_buf[CollisionalRxnLUT::kz23][0] * H2I * CH / 26. + + kcol_buf[CollisionalRxnLUT::kz51][0] * H2I * CI / 24. ); acoef = 0. - + kcr_buf.data[CollisionalRxnLUT::kz16][0] * HI; + + kcol_buf[CollisionalRxnLUT::kz16][0] * HI; if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 2) { acoef = acoef @@ -2525,10 +2526,10 @@ inline void species_density_derivatives_0d( // ***** COII ********** scoef = 0. + 28. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::kz37][0] * CII * OH / 204. + + kcol_buf[CollisionalRxnLUT::kz37][0] * CII * OH / 204. ); acoef = 0. - + kcr_buf.data[CollisionalRxnLUT::kz43][0] * HI; + + kcol_buf[CollisionalRxnLUT::kz43][0] * HI; deriv.data[SpLUT::COII][0] = deriv.data[SpLUT::COII][0] + (scoef - acoef * COII); @@ -2536,13 +2537,13 @@ inline void species_density_derivatives_0d( // ***** OII ********** scoef = 0. + 16. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::kz22][0] * HII * OI / 16. - + kcr_buf.data[CollisionalRxnLUT::kz38][0] * CII * O2 / 384. + + kcol_buf[CollisionalRxnLUT::kz22][0] * HII * OI / 16. + + kcol_buf[CollisionalRxnLUT::kz38][0] * CII * O2 / 384. ); acoef = 0. - + kcr_buf.data[CollisionalRxnLUT::kz39][0] * HI - + kcr_buf.data[CollisionalRxnLUT::kz40][0] * H2I / 2. - + kcr_buf.data[CollisionalRxnLUT::kz45][0] * de; + + kcol_buf[CollisionalRxnLUT::kz39][0] * HI + + kcol_buf[CollisionalRxnLUT::kz40][0] * H2I / 2. + + kcol_buf[CollisionalRxnLUT::kz45][0] * de; if (my_chemistry->use_radiative_transfer == 1) { if (my_chemistry->radiative_transfer_metal_ionization > 0) { scoef = scoef @@ -2556,11 +2557,11 @@ inline void species_density_derivatives_0d( // ***** OHII ********** scoef = 0. + 17. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::kz34][0] * HII * OH / 17. - + kcr_buf.data[CollisionalRxnLUT::kz40][0] * OII * H2I / 32. + + kcol_buf[CollisionalRxnLUT::kz34][0] * HII * OH / 17. + + kcol_buf[CollisionalRxnLUT::kz40][0] * OII * H2I / 32. ); acoef = 0. - + kcr_buf.data[CollisionalRxnLUT::kz41][0] * H2I / 2.; + + kcol_buf[CollisionalRxnLUT::kz41][0] * H2I / 2.; deriv.data[SpLUT::OHII][0] = deriv.data[SpLUT::OHII][0] + (scoef - acoef * OHII); @@ -2568,13 +2569,13 @@ inline void species_density_derivatives_0d( // ***** H2OII ********** scoef = 0. + 18. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::kz35][0] * HII * H2O / 18. - + kcr_buf.data[CollisionalRxnLUT::kz41][0] * OHII * H2I / 34. + + kcol_buf[CollisionalRxnLUT::kz35][0] * HII * H2O / 18. + + kcol_buf[CollisionalRxnLUT::kz41][0] * OHII * H2I / 34. ); acoef = 0. - + kcr_buf.data[CollisionalRxnLUT::kz42][0] * H2I / 2. - + kcr_buf.data[CollisionalRxnLUT::kz46][0] * de - + kcr_buf.data[CollisionalRxnLUT::kz47][0] * de; + + kcol_buf[CollisionalRxnLUT::kz42][0] * H2I / 2. + + kcol_buf[CollisionalRxnLUT::kz46][0] * de + + kcol_buf[CollisionalRxnLUT::kz47][0] * de; deriv.data[SpLUT::H2OII][0] = deriv.data[SpLUT::H2OII][0] + (scoef - acoef * H2OII); @@ -2582,11 +2583,11 @@ inline void species_density_derivatives_0d( // ***** H3OII ********** scoef = 0. + 19. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::kz42][0] * H2OII * H2I / 36. + + kcol_buf[CollisionalRxnLUT::kz42][0] * H2OII * H2I / 36. ); acoef = 0. - + kcr_buf.data[CollisionalRxnLUT::kz48][0] * de - + kcr_buf.data[CollisionalRxnLUT::kz49][0] * de; + + kcol_buf[CollisionalRxnLUT::kz48][0] * de + + kcol_buf[CollisionalRxnLUT::kz49][0] * de; deriv.data[SpLUT::H3OII][0] = deriv.data[SpLUT::H3OII][0] + (scoef - acoef * H3OII); @@ -2594,10 +2595,10 @@ inline void species_density_derivatives_0d( // ***** O2II ********** scoef = 0. + 32. * ( 0. - + kcr_buf.data[CollisionalRxnLUT::kz36][0] * HII * O2 / 32. + + kcol_buf[CollisionalRxnLUT::kz36][0] * HII * O2 / 32. ); acoef = 0. - + kcr_buf.data[CollisionalRxnLUT::kz50][0] * de; + + kcol_buf[CollisionalRxnLUT::kz50][0] * de; deriv.data[SpLUT::O2II][0] = deriv.data[SpLUT::O2II][0] + (scoef - acoef * O2II); diff --git a/src/clib/lookup_cool_rates1d.hpp b/src/clib/lookup_cool_rates1d.hpp index add643954..da0736130 100644 --- a/src/clib/lookup_cool_rates1d.hpp +++ b/src/clib/lookup_cool_rates1d.hpp @@ -128,7 +128,7 @@ inline void interpolate_h2_heating_terms_( /// interpolate the "standard" collisional reaction rates for each each index /// in the index-range that is also selected by the given itmask /// -/// @param[out] kcol_buf A struct containing the buffers that are filled by +/// @param[out] rxn_rate_buf A struct containing the buffers that are filled by /// this function /// @param[in] idx_range Specifies the current index-range /// @param[in] kcol_rate_tables The 1D tables of "standard" collisional @@ -141,7 +141,7 @@ inline void interpolate_h2_heating_terms_( /// @param[in] logTlininterp_buf Specifies the information related to the /// position in the logT interpolations (for a number of chemistry zones) inline void interpolate_kcol_rate_tables_( - grackle::impl::CollisionalRxnRateCollection kcol_buf, IndexRange idx_range, + FullRxnRateBuf rxn_rate_buf, IndexRange idx_range, grackle::impl::CollisionalRxnRateCollection kcol_rate_tables, int* kcol_lut_indices, int n_rates, const gr_mask_type* itmask, grackle::impl::LogTLinInterpScratchBuf logTlininterp_buf) { @@ -153,6 +153,7 @@ inline void interpolate_kcol_rate_tables_( // -> to maximize performance, we may want to change order of values in the // tables and possibly change transpose the data layout. But, we may want // to get GPU support working before we head down this path + double* const* kcol_buf = FullRxnRateBuf_kcol_bufs(&rxn_rate_buf); for (int i = idx_range.i_start; i < idx_range.i_stop; i++) { if (itmask[i] != MASK_FALSE) { @@ -160,10 +161,10 @@ inline void interpolate_kcol_rate_tables_( int idx = kcol_lut_indices[counter]; const double* table = kcol_rate_tables.data[idx]; - kcol_buf.data[idx][i] = table[logTlininterp_buf.indixe[i] - 1] + - (table[logTlininterp_buf.indixe[i]] - - table[logTlininterp_buf.indixe[i] - 1]) * - logTlininterp_buf.tdef[i]; + kcol_buf[idx][i] = table[logTlininterp_buf.indixe[i] - 1] + + (table[logTlininterp_buf.indixe[i]] - + table[logTlininterp_buf.indixe[i] - 1]) * + logTlininterp_buf.tdef[i]; } } } @@ -172,7 +173,7 @@ inline void interpolate_kcol_rate_tables_( /// interpolate collisional reaction rates for each each index in the /// index-range that is also selected by the given itmask /// -/// @param[out] kcol_buf A struct containing the buffers that are filled by +/// @param[out] rxn_rate_buf A struct containing the buffers that are filled by /// this function /// @param[in] idx_range Specifies the current index-range /// @param[in] tgas1d specifies the gas temperatures for the `idx_range` @@ -184,17 +185,16 @@ inline void interpolate_kcol_rate_tables_( /// @param[in] logTlininterp_buf Specifies the information related to the /// position in the logT interpolations (for a number of chemistry zones) inline void interpolate_collisional_rxn_rates_( - grackle::impl::CollisionalRxnRateCollection kcol_buf, IndexRange idx_range, - const double* tgas1d, const gr_mask_type* itmask, double dom, - chemistry_data* my_chemistry, grackle_field_data* my_fields, - chemistry_data_storage* my_rates, + FullRxnRateBuf rxn_rate_buf, IndexRange idx_range, const double* tgas1d, + const gr_mask_type* itmask, double dom, chemistry_data* my_chemistry, + grackle_field_data* my_fields, chemistry_data_storage* my_rates, grackle::impl::LogTLinInterpScratchBuf logTlininterp_buf) { // There are 2 parts to this function // ---------------------------------- // Part 1: Handle interpolations for most collisional rxn rates interpolate_kcol_rate_tables_( - kcol_buf, idx_range, *(my_rates->opaque_storage->kcol_rate_tables), + rxn_rate_buf, idx_range, *(my_rates->opaque_storage->kcol_rate_tables), my_rates->opaque_storage->used_kcol_rate_indices, my_rates->opaque_storage->n_kcol_rate_indices, itmask, logTlininterp_buf); @@ -229,11 +229,12 @@ inline void interpolate_collisional_rxn_rates_( #define USE_DENSITY_DEPENDENT_H2_DISSOCIATION_RATE #ifdef USE_DENSITY_DEPENDENT_H2_DISSOCIATION_RATE + double* const* kcol_buf = FullRxnRateBuf_kcol_bufs(&rxn_rate_buf); if (my_chemistry->three_body_rate == 0) { for (int i = idx_range.i_start; i < idx_range.i_stop; i++) { if (itmask[i] != MASK_FALSE) { double nh = std::fmin(HI(i, idx_range.j, idx_range.k) * dom, 1.0e9); - kcol_buf.data[CollisionalRxnLUT::k13][i] = tiny8; + kcol_buf[CollisionalRxnLUT::k13][i] = tiny8; if (tgas1d[i] >= 500. && tgas1d[i] < 1.0e6) { // define a local buffer and fill it with values double k13dd[14]; @@ -254,7 +255,7 @@ inline void interpolate_collisional_rxn_rates_( k13dd[10] / (1. + std::pow((nh / k13dd[12]), k13dd[13])); k13_DT = std::fmax(std::pow(10., k13_DT), tiny8); // - kcol_buf.data[CollisionalRxnLUT::k13][i] = k13_DT + k13_CID; + kcol_buf[CollisionalRxnLUT::k13][i] = k13_DT + k13_CID; } } } @@ -758,8 +759,6 @@ inline void apply_misc_shield_factors( /// @param[out] logTlininterp_buf Buffers that are filled with values for each /// location in @p idx_range with valuea that are used to linearly /// interpolate tables with respect to the natural log of @p tgas1d -/// @param[out] kcol_buf Buffers filled with the collisional reaction rates for -/// each location in @p idx_range /// @param[out] kshield_buf Buffers filled with shielding-adjusted photo /// reaction rates for @p idx_range /// @param[out] rxn_rate_buf Buffers filled with computed reaction rates for @@ -783,7 +782,6 @@ inline void lookup_cool_rates1d( grackle::impl::GrainSpeciesCollection grain_growth_rates, grackle::impl::GrainSpeciesCollection grain_temperatures, grackle::impl::LogTLinInterpScratchBuf logTlininterp_buf, - grackle::impl::CollisionalRxnRateCollection kcol_buf, grackle::impl::PhotoRxnRateCollection kshield_buf, FullRxnRateBuf rxn_rate_buf, grackle::impl::ChemHeatingRates chemheatrates_buf, @@ -826,8 +824,8 @@ inline void lookup_cool_rates1d( } // interpolate all collisional reaction rates - interpolate_collisional_rxn_rates_(kcol_buf, idx_range, tgas1d, itmask, dom, - my_chemistry, my_fields, my_rates, + interpolate_collisional_rxn_rates_(rxn_rate_buf, idx_range, tgas1d, itmask, + dom, my_chemistry, my_fields, my_rates, logTlininterp_buf); // interpolate terms used to compute H2 formation heating terms. diff --git a/src/clib/rate_timestep_g.cpp b/src/clib/rate_timestep_g.cpp index 6d09382dd..ad730230a 100644 --- a/src/clib/rate_timestep_g.cpp +++ b/src/clib/rate_timestep_g.cpp @@ -31,7 +31,6 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, const gr_mask_type* itmask, double* edot, double chunit, double dom, chemistry_data* my_chemistry, grackle_field_data* my_fields, IndexRange idx_range, - grackle::impl::CollisionalRxnRateCollection kcr_buf, grackle::impl::PhotoRxnRateCollection kshield_buf, grackle::impl::ChemHeatingRates chemheatrates_buf, FullRxnRateBuf rxn_rate_buf) { @@ -116,6 +115,7 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, my_fields->grid_dimension[1], my_fields->grid_dimension[2]); // locals + const double* const* kcol_buf = FullRxnRateBuf_kcol_bufs(&rxn_rate_buf); int i; double atten; @@ -128,28 +128,28 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, // Compute the electron density rate-of-change dedot[i] = - +kcr_buf.data[CollisionalRxnLUT::k1][i] * + +kcol_buf[CollisionalRxnLUT::k1][i] * HI(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) + - kcr_buf.data[CollisionalRxnLUT::k3][i] * + kcol_buf[CollisionalRxnLUT::k3][i] * HeI(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) / 4. + - kcr_buf.data[CollisionalRxnLUT::k5][i] * + kcol_buf[CollisionalRxnLUT::k5][i] * HeII(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) / 4. - - kcr_buf.data[CollisionalRxnLUT::k2][i] * + kcol_buf[CollisionalRxnLUT::k2][i] * HII(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) - - kcr_buf.data[CollisionalRxnLUT::k4][i] * + kcol_buf[CollisionalRxnLUT::k4][i] * HeII(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) / 4. - - kcr_buf.data[CollisionalRxnLUT::k6][i] * + kcol_buf[CollisionalRxnLUT::k6][i] * HeIII(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) / 4. + - kcr_buf.data[CollisionalRxnLUT::k57][i] * + kcol_buf[CollisionalRxnLUT::k57][i] * HI(i, idx_range.j, idx_range.k) * HI(i, idx_range.j, idx_range.k) + - kcr_buf.data[CollisionalRxnLUT::k58][i] * + kcol_buf[CollisionalRxnLUT::k58][i] * HI(i, idx_range.j, idx_range.k) * HeI(i, idx_range.j, idx_range.k) / 4. + (kshield_buf.k24[i] * HI(i, idx_range.j, idx_range.k) + @@ -158,16 +158,16 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, // Compute the HI density rate-of-change - HIdot[i] = -kcr_buf.data[CollisionalRxnLUT::k1][i] * + HIdot[i] = -kcol_buf[CollisionalRxnLUT::k1][i] * HI(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) + - kcr_buf.data[CollisionalRxnLUT::k2][i] * + kcol_buf[CollisionalRxnLUT::k2][i] * HII(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) - - kcr_buf.data[CollisionalRxnLUT::k57][i] * + kcol_buf[CollisionalRxnLUT::k57][i] * HI(i, idx_range.j, idx_range.k) * HI(i, idx_range.j, idx_range.k) - - kcr_buf.data[CollisionalRxnLUT::k58][i] * + kcol_buf[CollisionalRxnLUT::k58][i] * HI(i, idx_range.j, idx_range.k) * HeI(i, idx_range.j, idx_range.k) / 4. - kshield_buf.k24[i] * HI(i, idx_range.j, idx_range.k); @@ -179,55 +179,55 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, for (i = idx_range.i_start; i <= idx_range.i_end; i++) { if (itmask[i] != MASK_FALSE) { HIdot[i] = - -kcr_buf.data[CollisionalRxnLUT::k1][i] * + -kcol_buf[CollisionalRxnLUT::k1][i] * de(i, idx_range.j, idx_range.k) * HI(i, idx_range.j, idx_range.k) - - kcr_buf.data[CollisionalRxnLUT::k7][i] * + kcol_buf[CollisionalRxnLUT::k7][i] * de(i, idx_range.j, idx_range.k) * HI(i, idx_range.j, idx_range.k) - - kcr_buf.data[CollisionalRxnLUT::k8][i] * + kcol_buf[CollisionalRxnLUT::k8][i] * HM(i, idx_range.j, idx_range.k) * HI(i, idx_range.j, idx_range.k) - - kcr_buf.data[CollisionalRxnLUT::k9][i] * + kcol_buf[CollisionalRxnLUT::k9][i] * HII(i, idx_range.j, idx_range.k) * HI(i, idx_range.j, idx_range.k) - - kcr_buf.data[CollisionalRxnLUT::k10][i] * + kcol_buf[CollisionalRxnLUT::k10][i] * H2II(i, idx_range.j, idx_range.k) * HI(i, idx_range.j, idx_range.k) / 2. - - 2. * kcr_buf.data[CollisionalRxnLUT::k22][i] * + 2. * kcol_buf[CollisionalRxnLUT::k22][i] * std::pow(HI(i, idx_range.j, idx_range.k), 2) * HI(i, idx_range.j, idx_range.k) + - kcr_buf.data[CollisionalRxnLUT::k2][i] * + kcol_buf[CollisionalRxnLUT::k2][i] * HII(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) + - 2. * kcr_buf.data[CollisionalRxnLUT::k13][i] * + 2. * kcol_buf[CollisionalRxnLUT::k13][i] * HI(i, idx_range.j, idx_range.k) * H2I(i, idx_range.j, idx_range.k) / 2. + - kcr_buf.data[CollisionalRxnLUT::k11][i] * + kcol_buf[CollisionalRxnLUT::k11][i] * HII(i, idx_range.j, idx_range.k) * H2I(i, idx_range.j, idx_range.k) / 2. + - 2. * kcr_buf.data[CollisionalRxnLUT::k12][i] * + 2. * kcol_buf[CollisionalRxnLUT::k12][i] * de(i, idx_range.j, idx_range.k) * H2I(i, idx_range.j, idx_range.k) / 2. + - kcr_buf.data[CollisionalRxnLUT::k14][i] * + kcol_buf[CollisionalRxnLUT::k14][i] * HM(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) + - kcr_buf.data[CollisionalRxnLUT::k15][i] * + kcol_buf[CollisionalRxnLUT::k15][i] * HM(i, idx_range.j, idx_range.k) * HI(i, idx_range.j, idx_range.k) + - 2. * kcr_buf.data[CollisionalRxnLUT::k16][i] * + 2. * kcol_buf[CollisionalRxnLUT::k16][i] * HM(i, idx_range.j, idx_range.k) * HII(i, idx_range.j, idx_range.k) + - 2. * kcr_buf.data[CollisionalRxnLUT::k18][i] * + 2. * kcol_buf[CollisionalRxnLUT::k18][i] * H2II(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) / 2. + - kcr_buf.data[CollisionalRxnLUT::k19][i] * + kcol_buf[CollisionalRxnLUT::k19][i] * H2II(i, idx_range.j, idx_range.k) * HM(i, idx_range.j, idx_range.k) / 2. - - kcr_buf.data[CollisionalRxnLUT::k57][i] * + kcol_buf[CollisionalRxnLUT::k57][i] * HI(i, idx_range.j, idx_range.k) * HI(i, idx_range.j, idx_range.k) - - kcr_buf.data[CollisionalRxnLUT::k58][i] * + kcol_buf[CollisionalRxnLUT::k58][i] * HI(i, idx_range.j, idx_range.k) * HeI(i, idx_range.j, idx_range.k) / 4. - kshield_buf.k24[i] * HI(i, idx_range.j, idx_range.k) + @@ -246,46 +246,46 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, // Compute the electron density rate-of-change dedot[i] = - +kcr_buf.data[CollisionalRxnLUT::k1][i] * + +kcol_buf[CollisionalRxnLUT::k1][i] * HI(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) + - kcr_buf.data[CollisionalRxnLUT::k3][i] * + kcol_buf[CollisionalRxnLUT::k3][i] * HeI(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) / 4. + - kcr_buf.data[CollisionalRxnLUT::k5][i] * + kcol_buf[CollisionalRxnLUT::k5][i] * HeII(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) / 4. + - kcr_buf.data[CollisionalRxnLUT::k8][i] * + kcol_buf[CollisionalRxnLUT::k8][i] * HM(i, idx_range.j, idx_range.k) * HI(i, idx_range.j, idx_range.k) + - kcr_buf.data[CollisionalRxnLUT::k15][i] * + kcol_buf[CollisionalRxnLUT::k15][i] * HM(i, idx_range.j, idx_range.k) * HI(i, idx_range.j, idx_range.k) + - kcr_buf.data[CollisionalRxnLUT::k17][i] * + kcol_buf[CollisionalRxnLUT::k17][i] * HM(i, idx_range.j, idx_range.k) * HII(i, idx_range.j, idx_range.k) + - kcr_buf.data[CollisionalRxnLUT::k14][i] * + kcol_buf[CollisionalRxnLUT::k14][i] * HM(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) - - kcr_buf.data[CollisionalRxnLUT::k2][i] * + kcol_buf[CollisionalRxnLUT::k2][i] * HII(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) - - kcr_buf.data[CollisionalRxnLUT::k4][i] * + kcol_buf[CollisionalRxnLUT::k4][i] * HeII(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) / 4. - - kcr_buf.data[CollisionalRxnLUT::k6][i] * + kcol_buf[CollisionalRxnLUT::k6][i] * HeIII(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) / 4. - - kcr_buf.data[CollisionalRxnLUT::k7][i] * + kcol_buf[CollisionalRxnLUT::k7][i] * HI(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) - - kcr_buf.data[CollisionalRxnLUT::k18][i] * + kcol_buf[CollisionalRxnLUT::k18][i] * H2II(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) / 2. + - kcr_buf.data[CollisionalRxnLUT::k57][i] * + kcol_buf[CollisionalRxnLUT::k57][i] * HI(i, idx_range.j, idx_range.k) * HI(i, idx_range.j, idx_range.k) + - kcr_buf.data[CollisionalRxnLUT::k58][i] * + kcol_buf[CollisionalRxnLUT::k58][i] * HI(i, idx_range.j, idx_range.k) * HeI(i, idx_range.j, idx_range.k) / 4. + (kshield_buf.k24[i] * HI(i, idx_range.j, idx_range.k) + @@ -295,22 +295,22 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, // HII, HeII, HeIII recombination heating edot[i] = edot[i] - - chunit * (13.6 * (kcr_buf.data[CollisionalRxnLUT::k1][i] * + chunit * (13.6 * (kcol_buf[CollisionalRxnLUT::k1][i] * HI(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) - - kcr_buf.data[CollisionalRxnLUT::k2][i] * + kcol_buf[CollisionalRxnLUT::k2][i] * HII(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k)) + - 24.6 * (kcr_buf.data[CollisionalRxnLUT::k3][i] * + 24.6 * (kcol_buf[CollisionalRxnLUT::k3][i] * HeI(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) / 4. - - kcr_buf.data[CollisionalRxnLUT::k4][i] * + kcol_buf[CollisionalRxnLUT::k4][i] * HeII(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) / 4.) + - 79.0 * (kcr_buf.data[CollisionalRxnLUT::k5][i] * + 79.0 * (kcol_buf[CollisionalRxnLUT::k5][i] * HeII(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) / 4. - - kcr_buf.data[CollisionalRxnLUT::k6][i] * + kcol_buf[CollisionalRxnLUT::k6][i] * HeIII(i, idx_range.j, idx_range.k) * de(i, idx_range.j, idx_range.k) / 4.)); @@ -329,12 +329,12 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, // need to apply it outside the delta calculation. H2delta[i] = HI(i, idx_range.j, idx_range.k) * - ((3.53 * kcr_buf.data[CollisionalRxnLUT::k8][i] * + ((3.53 * kcol_buf[CollisionalRxnLUT::k8][i] * HM(i, idx_range.j, idx_range.k) + - 4.48 * kcr_buf.data[CollisionalRxnLUT::k22][i] * + 4.48 * kcol_buf[CollisionalRxnLUT::k22][i] * std::pow(HI(i, idx_range.j, idx_range.k), 2.)) * h2heatfac[i] - - 4.48 * kcr_buf.data[CollisionalRxnLUT::k13][i] * + 4.48 * kcol_buf[CollisionalRxnLUT::k13][i] * H2I(i, idx_range.j, idx_range.k) / 2.); // ! corrected by GC 202002 diff --git a/src/clib/rate_timestep_g.hpp b/src/clib/rate_timestep_g.hpp index 064d121bb..c3b5b7511 100644 --- a/src/clib/rate_timestep_g.hpp +++ b/src/clib/rate_timestep_g.hpp @@ -44,8 +44,6 @@ namespace grackle::impl { /// @param[in] my_chemistry Holds a number of configuration parameters /// @param[in] my_fields Specifies the field data /// @param[in] idx_range Specifies the current index-range -/// @param[in] kcr_buf Holds various pre-computed chemical reaction rates for -/// each location in `idx_range`. /// @param[in] kshield_buf Holds various pre-computed radiative reaction rates /// @param[in] chemheatrates_buf Holds various pre-computed chemistry-heating /// rates at each index-range location @@ -60,7 +58,6 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, const gr_mask_type* itmask, double* edot, double chunit, double dom, chemistry_data* my_chemistry, grackle_field_data* my_fields, IndexRange idx_range, - grackle::impl::CollisionalRxnRateCollection kcr_buf, grackle::impl::PhotoRxnRateCollection kshield_buf, grackle::impl::ChemHeatingRates chemheatrates_buf, FullRxnRateBuf rxn_rate_buf); diff --git a/src/clib/solve_rate_cool_g-cpp.cpp b/src/clib/solve_rate_cool_g-cpp.cpp index 9abadad32..a9b43fd5e 100644 --- a/src/clib/solve_rate_cool_g-cpp.cpp +++ b/src/clib/solve_rate_cool_g-cpp.cpp @@ -315,8 +315,6 @@ static double calc_Heq_div_dHeqdt_( /// @param[in] logTlininterp_buf Specifies the information related to the /// position in the logT interpolations (for a number of chemistry zones) /// @param[in] my_fields specifies the field data -/// @param[in] kcr_buf holds various pre-computed chemical reaction rates for -/// each location in `idx_range`. /// @param[in] rxn_rate_buf holds various pre-computed reaction rates for /// each location in `idx_range`. /// @@ -335,9 +333,10 @@ static void set_subcycle_dt_from_chemistry_scheme_( double dlogtem, const grackle::impl::LogTLinInterpScratchBuf logTlininterp_buf, grackle_field_data* my_fields, - grackle::impl::CollisionalRxnRateCollection kcr_buf, grackle::impl::FullRxnRateBuf rxn_rate_buf ) { + const double* const* kcol_buf = FullRxnRateBuf_kcol_bufs(&rxn_rate_buf); + const int j = idx_range.j; const int k = idx_range.k; @@ -381,9 +380,9 @@ static void set_subcycle_dt_from_chemistry_scheme_( // If the net rate is almost perfectly balanced then set // it to zero (since it is zero to available precision) { - double ion_rate = std::fabs(kcr_buf.data[CollisionalRxnLUT::k1][i] * + double ion_rate = std::fabs(kcol_buf[CollisionalRxnLUT::k1][i] * de(i,j,k) * HI(i,j,k)); - double recomb_rate = std::fabs(kcr_buf.data[CollisionalRxnLUT::k2][i] * + double recomb_rate = std::fabs(kcol_buf[CollisionalRxnLUT::k2][i] * HII(i,j,k) * de(i,j,k)); double ratio = (std::fmin(ion_rate, recomb_rate) / std::fmax(std::fabs(dedot[i]), std::fabs(HIdot[i]))); @@ -418,8 +417,8 @@ static void set_subcycle_dt_from_chemistry_scheme_( // Hydrogen changes by 10% or less double Heq_div_dHeqdt = calc_Heq_div_dHeqdt_( my_chemistry, my_rates, dlogtem, logTlininterp_buf, - kcr_buf.data[CollisionalRxnLUT::k13], - kcr_buf.data[CollisionalRxnLUT::k22], + kcol_buf[CollisionalRxnLUT::k13], + kcol_buf[CollisionalRxnLUT::k22], d(i,j,k), tgas, p2d, edot, i ); @@ -552,11 +551,6 @@ struct SpeciesRateSolverScratchBuf { // (currently only used by step_rate_g) grackle::impl::SpeciesCollection species_tmpdens; - // buffers in the following data structure are used to temporarily hold - // the interpolated Collisional Rxn Rates that have been - // interpolated using the standard 1D log temperature table. - grackle::impl::CollisionalRxnRateCollection kcr_buf; - // buffers in the following data structure are used to temporarily hold // the computed radiative reaction rates grackle::impl::PhotoRxnRateCollection kshield_buf; @@ -597,9 +591,6 @@ void visit_member_pair(SpeciesRateSolverScratchBuf& obj0, vis::previsit_struct_member(VIS_MEMBER_NAME("species_tmpdens"), f); visit_member_pair(obj0.species_tmpdens, obj1.species_tmpdens, f); - vis::previsit_struct_member(VIS_MEMBER_NAME("kcr_buf"), f); - visit_member_pair(obj0.kcr_buf, obj1.kcr_buf, f); - vis::previsit_struct_member(VIS_MEMBER_NAME("kshield_buf"), f); visit_member_pair(obj0.kshield_buf, obj1.kshield_buf, f); @@ -840,7 +831,7 @@ int solve_rate_cool_g( c_ljeans, itmask.data(), itmask_metal.data(), dt, my_chemistry, my_rates, my_fields, *my_uvb_rates, internalu, spsolvbuf.grain_growth_rates, grain_temperatures, - logTlininterp_buf, spsolvbuf.kcr_buf, spsolvbuf.kshield_buf, + logTlininterp_buf, spsolvbuf.kshield_buf, spsolvbuf.rxn_rate_buf, spsolvbuf.chemheatrates_buf, internal_dust_prop_scratch_buf ); @@ -852,8 +843,8 @@ int solve_rate_cool_g( spsolvbuf.dedot, spsolvbuf.HIdot, anydust, spsolvbuf.h2dust, rhoH.data(), itmask.data(), edot.data(), chunit, dom, my_chemistry, my_fields, idx_range, - spsolvbuf.kcr_buf, spsolvbuf.kshield_buf, - spsolvbuf.chemheatrates_buf, spsolvbuf.rxn_rate_buf + spsolvbuf.kshield_buf, spsolvbuf.chemheatrates_buf, + spsolvbuf.rxn_rate_buf ); // Setup masks to identify which chemistry schemes to use. We split @@ -880,7 +871,7 @@ int solve_rate_cool_g( spsolvbuf.dedot_prev, spsolvbuf.HIdot_prev, spsolvbuf.ddom, tgas.data(), p2d.data(), edot.data(), my_chemistry, my_rates, dlogtem, logTlininterp_buf, my_fields, - spsolvbuf.kcr_buf, spsolvbuf.rxn_rate_buf + spsolvbuf.rxn_rate_buf ); } @@ -916,7 +907,7 @@ int solve_rate_cool_g( spsolvbuf.dedot_prev, spsolvbuf.HIdot_prev, spsolvbuf.itmask_gs, itmask_metal.data(), my_chemistry, my_fields, *my_uvb_rates, spsolvbuf.grain_growth_rates, spsolvbuf.species_tmpdens, - spsolvbuf.kcr_buf, spsolvbuf.kshield_buf, spsolvbuf.rxn_rate_buf + spsolvbuf.kshield_buf, spsolvbuf.rxn_rate_buf ); // Solve rate equations with one linearly implicit Gauss-Seidel diff --git a/src/clib/step_rate_gauss_seidel.hpp b/src/clib/step_rate_gauss_seidel.hpp index 71b1e88fa..2006fb933 100644 --- a/src/clib/step_rate_gauss_seidel.hpp +++ b/src/clib/step_rate_gauss_seidel.hpp @@ -238,7 +238,6 @@ inline void step_rate_gauss_seidel( grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, grackle::impl::GrainSpeciesCollection grain_growth_rates, grackle::impl::SpeciesCollection species_tmpdens, - grackle::impl::CollisionalRxnRateCollection kcol_buf, grackle::impl::PhotoRxnRateCollection kshield_buf, const FullRxnRateBuf rxn_rate_buf ) { @@ -248,7 +247,7 @@ inline void step_rate_gauss_seidel( grackle::impl::chemistry::species_density_updates_gauss_seidel( species_tmpdens, idx_range, dtit, anydust, h2dust, rhoH, itmask, itmask_metal, my_chemistry, my_fields, my_uvb_rates, grain_growth_rates, - kcol_buf, kshield_buf, rxn_rate_buf); + kshield_buf, rxn_rate_buf); // update the entries from my_fields with the values in species_tmpdens update_fields_from_tmpdens_gauss_seidel( diff --git a/src/clib/time_deriv_0d.hpp b/src/clib/time_deriv_0d.hpp index 69b47a201..312c12f30 100644 --- a/src/clib/time_deriv_0d.hpp +++ b/src/clib/time_deriv_0d.hpp @@ -61,7 +61,6 @@ struct MainScratchBuf { // the remaining buffers were originally reallocated (mostly on the stack) // every time calculated the time derivatives were computed - CollisionalRxnRateCollection kcr_buf; PhotoRxnRateCollection kshield_buf; GrainSpeciesCollection grain_growth_rates; FullRxnRateBuf rxn_rate_buf; @@ -82,7 +81,6 @@ MainScratchBuf new_MainScratchBuf(int grain_opacity_table_size) { new_InternalDustPropBuf(nelem, grain_opacity_table_size); - out.kcr_buf = new_CollisionalRxnRateCollection(nelem); out.kshield_buf = new_PhotoRxnRateCollection(nelem); out.grain_growth_rates = new_GrainSpeciesCollection(nelem); out.rxn_rate_buf = new_FullRxnRateBuf(nelem); @@ -97,7 +95,6 @@ void drop_MainScratchBuf(MainScratchBuf* ptr) { drop_ChemHeatingRates(&ptr->chemheatrates_buf); drop_InternalDustPropBuf(&ptr->internal_dust_prop_scratch_buf); - drop_CollisionalRxnRateCollection(&ptr->kcr_buf); drop_PhotoRxnRateCollection(&ptr->kshield_buf); drop_GrainSpeciesCollection(&ptr->grain_growth_rates); drop_FullRxnRateBuffer(&ptr->rxn_rate_buf); @@ -507,7 +504,7 @@ void derivatives( pack.main_scratch_buf.grain_growth_rates, pack.main_scratch_buf.grain_temperatures, pack.main_scratch_buf.logTlininterp_buf, - pack.main_scratch_buf.kcr_buf, pack.main_scratch_buf.kshield_buf, + pack.main_scratch_buf.kshield_buf, pack.main_scratch_buf.rxn_rate_buf, pack.main_scratch_buf.chemheatrates_buf, pack.main_scratch_buf.internal_dust_prop_scratch_buf @@ -528,7 +525,6 @@ void derivatives( pack.other_scratch_buf.edot, pack.fwd_args.chunit, pack.fwd_args.dom, my_chemistry, &pack.fields, pack.idx_range_1_element, - pack.main_scratch_buf.kcr_buf, pack.main_scratch_buf.kshield_buf, pack.main_scratch_buf.chemheatrates_buf, pack.main_scratch_buf.rxn_rate_buf @@ -553,7 +549,7 @@ void derivatives( rhosp_dot, pack.fwd_args.anydust, pack.other_scratch_buf.h2dust, pack.other_scratch_buf.rhoH, &pack.local_itmask_metal, my_chemistry, &pack.fields, my_uvb_rates, pack.main_scratch_buf.grain_growth_rates, - pack.main_scratch_buf.kcr_buf, pack.main_scratch_buf.kshield_buf, + pack.main_scratch_buf.kshield_buf, pack.main_scratch_buf.rxn_rate_buf ); } From 6e19dd948e232b4102baab5234767a87cf8db076 Mon Sep 17 00:00:00 2001 From: Matthew Abruzzo Date: Wed, 14 Jan 2026 22:07:51 -0500 Subject: [PATCH 25/31] shift to using rxn_rate_bufs for tracking grain growth rates --- src/clib/chemistry_solver_funcs.hpp | 174 +++++++++++++------------- src/clib/dust/lookup_dust_rates1d.hpp | 15 +-- src/clib/lookup_cool_rates1d.hpp | 12 +- src/clib/solve_rate_cool_g-cpp.cpp | 10 +- src/clib/step_rate_gauss_seidel.hpp | 3 +- src/clib/time_deriv_0d.hpp | 6 +- 6 files changed, 104 insertions(+), 116 deletions(-) diff --git a/src/clib/chemistry_solver_funcs.hpp b/src/clib/chemistry_solver_funcs.hpp index 755c6ecff..15178422b 100644 --- a/src/clib/chemistry_solver_funcs.hpp +++ b/src/clib/chemistry_solver_funcs.hpp @@ -57,7 +57,7 @@ namespace grackle::impl::chemistry { /// @param[in] my_uvb_rates specifies precomputed rxn rates dependent on the /// UV background, without accounting for self-shield (we probably don't /// need to pass the whole thing since we also pass kshield_buf) -/// @param[in] grain_growth_rates, kshield_buf specifies the +/// @param[in] kshield_buf specifies the /// precomputed rxn rates (depends on local physical conditions) /// @param[in] rxn_rate_buf specifies the precomputed rxn rates (depends on /// local physical conditions) @@ -114,7 +114,6 @@ inline void species_density_updates_gauss_seidel( const double* rhoH, const gr_mask_type* itmask, const gr_mask_type* itmask_metal, chemistry_data* my_chemistry, grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, - grackle::impl::GrainSpeciesCollection grain_growth_rates, grackle::impl::PhotoRxnRateCollection kshield_buf, const FullRxnRateBuf rxn_rate_buf ) @@ -187,6 +186,8 @@ inline void species_density_updates_gauss_seidel( // locals const double* const* kcol_buf = FullRxnRateBuf_kcol_bufs(&rxn_rate_buf); + const double* const* grain_growth_rates = + FullRxnRateBuf_grain_growth_bufs(&rxn_rate_buf); int i; double scoef, acoef; @@ -653,20 +654,20 @@ inline void species_density_updates_gauss_seidel( if ((my_chemistry->grain_growth == 1) || (my_chemistry->dust_sublimation == 1)) { if (my_chemistry->dust_species > 0) { scoef = scoef + 2. * - grain_growth_rates.data[OnlyGrainSpLUT::MgSiO3_dust] [i] * 2.; + grain_growth_rates[OnlyGrainSpLUT::MgSiO3_dust] [i] * 2.; } if (my_chemistry->dust_species > 1) { scoef = scoef + 2. * ( - grain_growth_rates.data[OnlyGrainSpLUT::Mg2SiO4_dust] [i] * 3. - + grain_growth_rates.data[OnlyGrainSpLUT::Fe3O4_dust] [i] * 4. - + grain_growth_rates.data[OnlyGrainSpLUT::MgO_dust] [i] - + grain_growth_rates.data[OnlyGrainSpLUT::Al2O3_dust] [i] * 3. + grain_growth_rates[OnlyGrainSpLUT::Mg2SiO4_dust] [i] * 3. + + grain_growth_rates[OnlyGrainSpLUT::Fe3O4_dust] [i] * 4. + + grain_growth_rates[OnlyGrainSpLUT::MgO_dust] [i] + + grain_growth_rates[OnlyGrainSpLUT::Al2O3_dust] [i] * 3. ); } if (my_chemistry->dust_species > 2) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::vol_org_dust] [i] / H2I(i,j,k) * 2. * 2.; + + grain_growth_rates[OnlyGrainSpLUT::vol_org_dust] [i] / H2I(i,j,k) * 2. * 2.; } } } @@ -879,7 +880,7 @@ inline void species_density_updates_gauss_seidel( if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 0) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::AC_dust] [i] / CI(i,j,k) * 12.; + + grain_growth_rates[OnlyGrainSpLUT::AC_dust] [i] / CI(i,j,k) * 12.; } } if (my_chemistry->use_radiative_transfer == 1) { @@ -928,8 +929,8 @@ inline void species_density_updates_gauss_seidel( if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 2) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::ref_org_dust] [i] / CO(i,j,k) * 17. * 0.5 - + grain_growth_rates.data[OnlyGrainSpLUT::vol_org_dust] [i] / CO(i,j,k) * 17.; + + grain_growth_rates[OnlyGrainSpLUT::ref_org_dust] [i] / CO(i,j,k) * 17. * 0.5 + + grain_growth_rates[OnlyGrainSpLUT::vol_org_dust] [i] / CO(i,j,k) * 17.; } } if (my_chemistry->use_radiative_transfer == 1) { @@ -1033,18 +1034,18 @@ inline void species_density_updates_gauss_seidel( if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 0) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::MgSiO3_dust] [i] / H2O(i,j,k) * 18. * 2.; + + grain_growth_rates[OnlyGrainSpLUT::MgSiO3_dust] [i] / H2O(i,j,k) * 18. * 2.; } if (my_chemistry->dust_species > 1) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::Mg2SiO4_dust] [i] / H2O(i,j,k) * 18. * 3. - + grain_growth_rates.data[OnlyGrainSpLUT::Fe3O4_dust] [i] / H2O(i,j,k) * 18. * 4. - + grain_growth_rates.data[OnlyGrainSpLUT::MgO_dust] [i] / H2O(i,j,k) * 18. - + grain_growth_rates.data[OnlyGrainSpLUT::Al2O3_dust] [i] / H2O(i,j,k) * 18. * 3.; + + grain_growth_rates[OnlyGrainSpLUT::Mg2SiO4_dust] [i] / H2O(i,j,k) * 18. * 3. + + grain_growth_rates[OnlyGrainSpLUT::Fe3O4_dust] [i] / H2O(i,j,k) * 18. * 4. + + grain_growth_rates[OnlyGrainSpLUT::MgO_dust] [i] / H2O(i,j,k) * 18. + + grain_growth_rates[OnlyGrainSpLUT::Al2O3_dust] [i] / H2O(i,j,k) * 18. * 3.; } if (my_chemistry->dust_species > 2) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::H2O_ice_dust] [i] / H2O(i,j,k) * 18.; + + grain_growth_rates[OnlyGrainSpLUT::H2O_ice_dust] [i] / H2O(i,j,k) * 18.; } } if (my_chemistry->use_radiative_transfer == 1) { @@ -1083,7 +1084,7 @@ inline void species_density_updates_gauss_seidel( if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 1) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::SiM_dust] [i] / SiI(i,j,k) * 28.; + + grain_growth_rates[OnlyGrainSpLUT::SiM_dust] [i] / SiI(i,j,k) * 28.; } } @@ -1101,11 +1102,11 @@ inline void species_density_updates_gauss_seidel( if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 0) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::MgSiO3_dust] [i] / SiOI(i,j,k) * 44.; + + grain_growth_rates[OnlyGrainSpLUT::MgSiO3_dust] [i] / SiOI(i,j,k) * 44.; } if (my_chemistry->dust_species > 1) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::Mg2SiO4_dust] [i] / SiOI(i,j,k) * 44.; + + grain_growth_rates[OnlyGrainSpLUT::Mg2SiO4_dust] [i] / SiOI(i,j,k) * 44.; } } @@ -1121,7 +1122,7 @@ inline void species_density_updates_gauss_seidel( if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 1) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::SiO2_dust] [i] / SiO2I(i,j,k) * 60.; + + grain_growth_rates[OnlyGrainSpLUT::SiO2_dust] [i] / SiO2I(i,j,k) * 60.; } } @@ -1154,7 +1155,7 @@ inline void species_density_updates_gauss_seidel( if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 2) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::ref_org_dust] [i] / CH2(i,j,k) * 14. * 0.5; + + grain_growth_rates[OnlyGrainSpLUT::ref_org_dust] [i] / CH2(i,j,k) * 14. * 0.5; } } @@ -1248,11 +1249,11 @@ inline void species_density_updates_gauss_seidel( scoef = 0.; acoef = 0.; acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::MgSiO3_dust] [i] / Mg(i,j,k) * 24.; + + grain_growth_rates[OnlyGrainSpLUT::MgSiO3_dust] [i] / Mg(i,j,k) * 24.; if (my_chemistry->dust_species > 1) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::Mg2SiO4_dust] [i] / Mg(i,j,k) * 24. * 2. - + grain_growth_rates.data[OnlyGrainSpLUT::MgO_dust] [i] / Mg(i,j,k) * 24.; + + grain_growth_rates[OnlyGrainSpLUT::Mg2SiO4_dust] [i] / Mg(i,j,k) * 24. * 2. + + grain_growth_rates[OnlyGrainSpLUT::MgO_dust] [i] / Mg(i,j,k) * 24.; } out_spdens.data[SpLUT::Mg][i] = ( scoef*dtit[i] + Mg(i,j,k) ) @@ -1265,7 +1266,7 @@ inline void species_density_updates_gauss_seidel( scoef = 0.; acoef = 0.; acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::Al2O3_dust] [i] / Al(i,j,k) * 27. * 2.; + + grain_growth_rates[OnlyGrainSpLUT::Al2O3_dust] [i] / Al(i,j,k) * 27. * 2.; out_spdens.data[SpLUT::Al][i] = ( scoef*dtit[i] + Al(i,j,k) ) / ( 1. + acoef*dtit[i] ); @@ -1275,7 +1276,7 @@ inline void species_density_updates_gauss_seidel( scoef = 0.; acoef = 0.; acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::FeS_dust] [i] / S(i,j,k) * 32.; + + grain_growth_rates[OnlyGrainSpLUT::FeS_dust] [i] / S(i,j,k) * 32.; out_spdens.data[SpLUT::S][i] = ( scoef*dtit[i] + S(i,j,k) ) / ( 1. + acoef*dtit[i] ); @@ -1285,9 +1286,9 @@ inline void species_density_updates_gauss_seidel( scoef = 0.; acoef = 0.; acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::FeM_dust] [i] / Fe(i,j,k) * 56. - + grain_growth_rates.data[OnlyGrainSpLUT::Fe3O4_dust] [i] / Fe(i,j,k) * 56. * 3. - + grain_growth_rates.data[OnlyGrainSpLUT::FeS_dust] [i] / Fe(i,j,k) * 56.; + + grain_growth_rates[OnlyGrainSpLUT::FeM_dust] [i] / Fe(i,j,k) * 56. + + grain_growth_rates[OnlyGrainSpLUT::Fe3O4_dust] [i] / Fe(i,j,k) * 56. * 3. + + grain_growth_rates[OnlyGrainSpLUT::FeS_dust] [i] / Fe(i,j,k) * 56.; out_spdens.data[SpLUT::Fe][i] = ( scoef*dtit[i] + Fe(i,j,k) ) / ( 1. + acoef*dtit[i] ); @@ -1308,7 +1309,7 @@ inline void species_density_updates_gauss_seidel( // ***** MgSiO3 ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::MgSiO3_dust] [i] * 100.; + + grain_growth_rates[OnlyGrainSpLUT::MgSiO3_dust] [i] * 100.; acoef = 0.; out_spdens.data[SpLUT::MgSiO3_dust][i] = ( scoef*dtit[i] + MgSiO3(i,j,k) ) @@ -1318,7 +1319,7 @@ inline void species_density_updates_gauss_seidel( // ***** AC ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::AC_dust] [i] * 12.; + + grain_growth_rates[OnlyGrainSpLUT::AC_dust] [i] * 12.; acoef = 0.; out_spdens.data[SpLUT::AC_dust][i] = ( scoef*dtit[i] + AC(i,j,k) ) @@ -1330,7 +1331,7 @@ inline void species_density_updates_gauss_seidel( // ***** SiM ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::SiM_dust] [i] * 28.; + + grain_growth_rates[OnlyGrainSpLUT::SiM_dust] [i] * 28.; acoef = 0.; out_spdens.data[SpLUT::SiM_dust][i] = ( scoef*dtit[i] + SiM(i,j,k) ) @@ -1340,7 +1341,7 @@ inline void species_density_updates_gauss_seidel( // ***** FeM ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::FeM_dust] [i] * 56.; + + grain_growth_rates[OnlyGrainSpLUT::FeM_dust] [i] * 56.; acoef = 0.; out_spdens.data[SpLUT::FeM_dust][i] = ( scoef*dtit[i] + FeM(i,j,k) ) @@ -1350,7 +1351,7 @@ inline void species_density_updates_gauss_seidel( // ***** Mg2SiO4 ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::Mg2SiO4_dust] [i] * 140.; + + grain_growth_rates[OnlyGrainSpLUT::Mg2SiO4_dust] [i] * 140.; acoef = 0.; out_spdens.data[SpLUT::Mg2SiO4_dust][i] = ( scoef*dtit[i] + Mg2SiO4(i,j,k) ) @@ -1360,7 +1361,7 @@ inline void species_density_updates_gauss_seidel( // ***** Fe3O4 ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::Fe3O4_dust] [i] * 232.; + + grain_growth_rates[OnlyGrainSpLUT::Fe3O4_dust] [i] * 232.; acoef = 0.; out_spdens.data[SpLUT::Fe3O4_dust][i] = ( scoef*dtit[i] + Fe3O4(i,j,k) ) @@ -1370,7 +1371,7 @@ inline void species_density_updates_gauss_seidel( // ***** SiO2D ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::SiO2_dust] [i] * 60.; + + grain_growth_rates[OnlyGrainSpLUT::SiO2_dust] [i] * 60.; acoef = 0.; out_spdens.data[SpLUT::SiO2_dust][i] = ( scoef*dtit[i] + SiO2D(i,j,k) ) @@ -1380,7 +1381,7 @@ inline void species_density_updates_gauss_seidel( // ***** MgO ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::MgO_dust] [i] * 40.; + + grain_growth_rates[OnlyGrainSpLUT::MgO_dust] [i] * 40.; acoef = 0.; out_spdens.data[SpLUT::MgO_dust][i] = ( scoef*dtit[i] + MgO(i,j,k) ) @@ -1390,7 +1391,7 @@ inline void species_density_updates_gauss_seidel( // ***** FeS ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::FeS_dust] [i] * 88.; + + grain_growth_rates[OnlyGrainSpLUT::FeS_dust] [i] * 88.; acoef = 0.; out_spdens.data[SpLUT::FeS_dust][i] = ( scoef*dtit[i] + FeS(i,j,k) ) @@ -1400,7 +1401,7 @@ inline void species_density_updates_gauss_seidel( // ***** Al2O3 ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::Al2O3_dust] [i] * 102.; + + grain_growth_rates[OnlyGrainSpLUT::Al2O3_dust] [i] * 102.; acoef = 0.; out_spdens.data[SpLUT::Al2O3_dust][i] = ( scoef*dtit[i] + Al2O3(i,j,k) ) @@ -1412,7 +1413,7 @@ inline void species_density_updates_gauss_seidel( // ***** reforg ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::ref_org_dust] [i] * 22.68; + + grain_growth_rates[OnlyGrainSpLUT::ref_org_dust] [i] * 22.68; acoef = 0.; out_spdens.data[SpLUT::ref_org_dust][i] = ( scoef*dtit[i] + reforg(i,j,k) ) @@ -1422,7 +1423,7 @@ inline void species_density_updates_gauss_seidel( // ***** volorg ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::vol_org_dust] [i] * 32.; + + grain_growth_rates[OnlyGrainSpLUT::vol_org_dust] [i] * 32.; acoef = 0.; out_spdens.data[SpLUT::vol_org_dust][i] = ( scoef*dtit[i] + volorg(i,j,k) ) @@ -1432,7 +1433,7 @@ inline void species_density_updates_gauss_seidel( // ***** H2Oice ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::H2O_ice_dust] [i] * 18.; + + grain_growth_rates[OnlyGrainSpLUT::H2O_ice_dust] [i] * 18.; acoef = 0.; out_spdens.data[SpLUT::H2O_ice_dust][i] = ( scoef*dtit[i] + H2Oice(i,j,k) ) @@ -1466,7 +1467,7 @@ inline void species_density_updates_gauss_seidel( /// @param[in] my_fields Specifies field data /// @param[in] my_uvb_rates specifies precomputed rxn rates dependent on the /// UV background -/// @param[in] grain_growth_rates, kshield_buf specifies the +/// @param[in] kshield_buf specifies the /// precomputed rxn rates (depends on local physical conditions) /// @param[in] rxn_rate_buf specifies the precomputed rxn rates (depends on /// local physical conditions) @@ -1497,7 +1498,6 @@ inline void species_density_derivatives_0d( const double* h2dust, const double* rhoH, const gr_mask_type* itmask_metal, const chemistry_data* my_chemistry, const grackle_field_data* my_fields, const photo_rate_storage my_uvb_rates, - const grackle::impl::GrainSpeciesCollection grain_growth_rates, const grackle::impl::PhotoRxnRateCollection kshield_buf, const FullRxnRateBuf rxn_rate_buf ) { @@ -1567,6 +1567,8 @@ inline void species_density_derivatives_0d( gr_float& H2Oice = my_fields->H2O_ice_dust_density[0]; const double* const* kcol_buf = FullRxnRateBuf_kcol_bufs(&rxn_rate_buf); + const double* const* grain_growth_rates = + FullRxnRateBuf_grain_growth_bufs(&rxn_rate_buf); double scoef, acoef; @@ -2012,20 +2014,20 @@ inline void species_density_derivatives_0d( if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 0) { scoef = scoef + 2. * - grain_growth_rates.data[OnlyGrainSpLUT::MgSiO3_dust][0] * 2.; + grain_growth_rates[OnlyGrainSpLUT::MgSiO3_dust][0] * 2.; } if (my_chemistry->dust_species > 1) { scoef = scoef + 2. * ( - grain_growth_rates.data[OnlyGrainSpLUT::Mg2SiO4_dust][0] * 3. - + grain_growth_rates.data[OnlyGrainSpLUT::Fe3O4_dust][0] * 4. - + grain_growth_rates.data[OnlyGrainSpLUT::MgO_dust][0] - + grain_growth_rates.data[OnlyGrainSpLUT::Al2O3_dust][0] * 3. + grain_growth_rates[OnlyGrainSpLUT::Mg2SiO4_dust][0] * 3. + + grain_growth_rates[OnlyGrainSpLUT::Fe3O4_dust][0] * 4. + + grain_growth_rates[OnlyGrainSpLUT::MgO_dust][0] + + grain_growth_rates[OnlyGrainSpLUT::Al2O3_dust][0] * 3. ); } if (my_chemistry->dust_species > 2) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::vol_org_dust][0] / H2I * 2. * 2.; + + grain_growth_rates[OnlyGrainSpLUT::vol_org_dust][0] / H2I * 2. * 2.; } } } @@ -2241,7 +2243,7 @@ inline void species_density_derivatives_0d( if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 0) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::AC_dust][0] / CI * 12.; + + grain_growth_rates[OnlyGrainSpLUT::AC_dust][0] / CI * 12.; } } if (my_chemistry->use_radiative_transfer == 1) { @@ -2290,8 +2292,8 @@ inline void species_density_derivatives_0d( if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 2) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::ref_org_dust][0] / CO * 17. * 0.5 - + grain_growth_rates.data[OnlyGrainSpLUT::vol_org_dust][0] / CO * 17.; + + grain_growth_rates[OnlyGrainSpLUT::ref_org_dust][0] / CO * 17. * 0.5 + + grain_growth_rates[OnlyGrainSpLUT::vol_org_dust][0] / CO * 17.; } } if (my_chemistry->use_radiative_transfer == 1) { @@ -2395,18 +2397,18 @@ inline void species_density_derivatives_0d( if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 0) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::MgSiO3_dust][0] / H2O * 18. * 2.; + + grain_growth_rates[OnlyGrainSpLUT::MgSiO3_dust][0] / H2O * 18. * 2.; } if (my_chemistry->dust_species > 1) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::Mg2SiO4_dust][0] / H2O * 18. * 3. - + grain_growth_rates.data[OnlyGrainSpLUT::Fe3O4_dust][0] / H2O * 18. * 4. - + grain_growth_rates.data[OnlyGrainSpLUT::MgO_dust][0] / H2O * 18. - + grain_growth_rates.data[OnlyGrainSpLUT::Al2O3_dust][0] / H2O * 18. * 3.; + + grain_growth_rates[OnlyGrainSpLUT::Mg2SiO4_dust][0] / H2O * 18. * 3. + + grain_growth_rates[OnlyGrainSpLUT::Fe3O4_dust][0] / H2O * 18. * 4. + + grain_growth_rates[OnlyGrainSpLUT::MgO_dust][0] / H2O * 18. + + grain_growth_rates[OnlyGrainSpLUT::Al2O3_dust][0] / H2O * 18. * 3.; } if (my_chemistry->dust_species > 2) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::H2O_ice_dust][0] / H2O * 18.; + + grain_growth_rates[OnlyGrainSpLUT::H2O_ice_dust][0] / H2O * 18.; } } if (my_chemistry->use_radiative_transfer == 1) { @@ -2445,7 +2447,7 @@ inline void species_density_derivatives_0d( if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 1) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::SiM_dust][0] / SiI * 28.; + + grain_growth_rates[OnlyGrainSpLUT::SiM_dust][0] / SiI * 28.; } } @@ -2463,11 +2465,11 @@ inline void species_density_derivatives_0d( if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 0) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::MgSiO3_dust][0] / SiOI * 44.; + + grain_growth_rates[OnlyGrainSpLUT::MgSiO3_dust][0] / SiOI * 44.; } if (my_chemistry->dust_species > 1) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::Mg2SiO4_dust][0] / SiOI * 44.; + + grain_growth_rates[OnlyGrainSpLUT::Mg2SiO4_dust][0] / SiOI * 44.; } } @@ -2483,7 +2485,7 @@ inline void species_density_derivatives_0d( if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 1) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::SiO2_dust][0] / SiO2I * 60.; + + grain_growth_rates[OnlyGrainSpLUT::SiO2_dust][0] / SiO2I * 60.; } } @@ -2516,7 +2518,7 @@ inline void species_density_derivatives_0d( if ( ( my_chemistry->grain_growth == 1 ) || ( my_chemistry->dust_sublimation == 1) ) { if (my_chemistry->dust_species > 2) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::ref_org_dust][0] / CH2 * 14. * 0.5; + + grain_growth_rates[OnlyGrainSpLUT::ref_org_dust][0] / CH2 * 14. * 0.5; } } @@ -2610,11 +2612,11 @@ inline void species_density_derivatives_0d( scoef = 0.; acoef = 0.; acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::MgSiO3_dust][0] / Mg * 24.; + + grain_growth_rates[OnlyGrainSpLUT::MgSiO3_dust][0] / Mg * 24.; if (my_chemistry->dust_species > 1) { acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::Mg2SiO4_dust][0] / Mg * 24. * 2. - + grain_growth_rates.data[OnlyGrainSpLUT::MgO_dust][0] / Mg * 24.; + + grain_growth_rates[OnlyGrainSpLUT::Mg2SiO4_dust][0] / Mg * 24. * 2. + + grain_growth_rates[OnlyGrainSpLUT::MgO_dust][0] / Mg * 24.; } deriv.data[SpLUT::Mg][0] = deriv.data[SpLUT::Mg][0] + (scoef - acoef * Mg); @@ -2627,7 +2629,7 @@ inline void species_density_derivatives_0d( scoef = 0.; acoef = 0.; acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::Al2O3_dust][0] / Al * 27. * 2.; + + grain_growth_rates[OnlyGrainSpLUT::Al2O3_dust][0] / Al * 27. * 2.; deriv.data[SpLUT::Al][0] = deriv.data[SpLUT::Al][0] + (scoef - acoef * Al); @@ -2637,7 +2639,7 @@ inline void species_density_derivatives_0d( scoef = 0.; acoef = 0.; acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::FeS_dust][0] / S * 32.; + + grain_growth_rates[OnlyGrainSpLUT::FeS_dust][0] / S * 32.; deriv.data[SpLUT::S][0] = deriv.data[SpLUT::S][0] + (scoef - acoef * S); @@ -2647,9 +2649,9 @@ inline void species_density_derivatives_0d( scoef = 0.; acoef = 0.; acoef = acoef - + grain_growth_rates.data[OnlyGrainSpLUT::FeM_dust][0] / Fe * 56. - + grain_growth_rates.data[OnlyGrainSpLUT::Fe3O4_dust][0] / Fe * 56. * 3. - + grain_growth_rates.data[OnlyGrainSpLUT::FeS_dust][0] / Fe * 56.; + + grain_growth_rates[OnlyGrainSpLUT::FeM_dust][0] / Fe * 56. + + grain_growth_rates[OnlyGrainSpLUT::Fe3O4_dust][0] / Fe * 56. * 3. + + grain_growth_rates[OnlyGrainSpLUT::FeS_dust][0] / Fe * 56.; deriv.data[SpLUT::Fe][0] = deriv.data[SpLUT::Fe][0] + (scoef - acoef * Fe); @@ -2670,7 +2672,7 @@ inline void species_density_derivatives_0d( // ***** MgSiO3 ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::MgSiO3_dust][0] * 100.; + + grain_growth_rates[OnlyGrainSpLUT::MgSiO3_dust][0] * 100.; acoef = 0.; deriv.data[SpLUT::MgSiO3_dust][0] = deriv.data[SpLUT::MgSiO3_dust][0] + (scoef - acoef * MgSiO3); @@ -2680,7 +2682,7 @@ inline void species_density_derivatives_0d( // ***** AC ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::AC_dust][0] * 12.; + + grain_growth_rates[OnlyGrainSpLUT::AC_dust][0] * 12.; acoef = 0.; deriv.data[SpLUT::AC_dust][0] = deriv.data[SpLUT::AC_dust][0] + (scoef - acoef * AC); @@ -2692,7 +2694,7 @@ inline void species_density_derivatives_0d( // ***** SiM ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::SiM_dust][0] * 28.; + + grain_growth_rates[OnlyGrainSpLUT::SiM_dust][0] * 28.; acoef = 0.; deriv.data[SpLUT::SiM_dust][0] = deriv.data[SpLUT::SiM_dust][0] + (scoef - acoef * SiM); @@ -2702,7 +2704,7 @@ inline void species_density_derivatives_0d( // ***** FeM ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::FeM_dust][0] * 56.; + + grain_growth_rates[OnlyGrainSpLUT::FeM_dust][0] * 56.; acoef = 0.; deriv.data[SpLUT::FeM_dust][0] = deriv.data[SpLUT::FeM_dust][0] + (scoef - acoef * FeM); @@ -2712,7 +2714,7 @@ inline void species_density_derivatives_0d( // ***** Mg2SiO4 ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::Mg2SiO4_dust][0] * 140.; + + grain_growth_rates[OnlyGrainSpLUT::Mg2SiO4_dust][0] * 140.; acoef = 0.; deriv.data[SpLUT::Mg2SiO4_dust][0] = deriv.data[SpLUT::Mg2SiO4_dust][0] + (scoef - acoef * Mg2SiO4); @@ -2722,7 +2724,7 @@ inline void species_density_derivatives_0d( // ***** Fe3O4 ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::Fe3O4_dust][0] * 232.; + + grain_growth_rates[OnlyGrainSpLUT::Fe3O4_dust][0] * 232.; acoef = 0.; deriv.data[SpLUT::Fe3O4_dust][0] = deriv.data[SpLUT::Fe3O4_dust][0] + (scoef - acoef * Fe3O4); @@ -2732,7 +2734,7 @@ inline void species_density_derivatives_0d( // ***** SiO2D ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::SiO2_dust][0] * 60.; + + grain_growth_rates[OnlyGrainSpLUT::SiO2_dust][0] * 60.; acoef = 0.; deriv.data[SpLUT::SiO2_dust][0] = deriv.data[SpLUT::SiO2_dust][0] + (scoef - acoef * SiO2D); @@ -2742,7 +2744,7 @@ inline void species_density_derivatives_0d( // ***** MgO ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::MgO_dust][0] * 40.; + + grain_growth_rates[OnlyGrainSpLUT::MgO_dust][0] * 40.; acoef = 0.; deriv.data[SpLUT::MgO_dust][0] = deriv.data[SpLUT::MgO_dust][0] + (scoef - acoef * MgO); @@ -2752,7 +2754,7 @@ inline void species_density_derivatives_0d( // ***** FeS ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::FeS_dust][0] * 88.; + + grain_growth_rates[OnlyGrainSpLUT::FeS_dust][0] * 88.; acoef = 0.; deriv.data[SpLUT::FeS_dust][0] = deriv.data[SpLUT::FeS_dust][0] + (scoef - acoef * FeS); @@ -2762,7 +2764,7 @@ inline void species_density_derivatives_0d( // ***** Al2O3 ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::Al2O3_dust][0] * 102.; + + grain_growth_rates[OnlyGrainSpLUT::Al2O3_dust][0] * 102.; acoef = 0.; deriv.data[SpLUT::Al2O3_dust][0] = deriv.data[SpLUT::Al2O3_dust][0] + (scoef - acoef * Al2O3); @@ -2774,7 +2776,7 @@ inline void species_density_derivatives_0d( // ***** reforg ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::ref_org_dust][0] * 22.68; + + grain_growth_rates[OnlyGrainSpLUT::ref_org_dust][0] * 22.68; acoef = 0.; deriv.data[SpLUT::ref_org_dust][0] = deriv.data[SpLUT::ref_org_dust][0] + (scoef - acoef * reforg); @@ -2784,7 +2786,7 @@ inline void species_density_derivatives_0d( // ***** volorg ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::vol_org_dust][0] * 32.; + + grain_growth_rates[OnlyGrainSpLUT::vol_org_dust][0] * 32.; acoef = 0.; deriv.data[SpLUT::vol_org_dust][0] = deriv.data[SpLUT::vol_org_dust][0] + (scoef - acoef * volorg); @@ -2794,7 +2796,7 @@ inline void species_density_derivatives_0d( // ***** H2Oice ********** scoef = 0.; scoef = scoef - + grain_growth_rates.data[OnlyGrainSpLUT::H2O_ice_dust][0] * 18.; + + grain_growth_rates[OnlyGrainSpLUT::H2O_ice_dust][0] * 18.; acoef = 0.; deriv.data[SpLUT::H2O_ice_dust][0] = deriv.data[SpLUT::H2O_ice_dust][0] + (scoef - acoef * H2Oice); diff --git a/src/clib/dust/lookup_dust_rates1d.hpp b/src/clib/dust/lookup_dust_rates1d.hpp index 38ee835e6..1e5c436e5 100644 --- a/src/clib/dust/lookup_dust_rates1d.hpp +++ b/src/clib/dust/lookup_dust_rates1d.hpp @@ -59,15 +59,14 @@ namespace grackle::impl { /// @param[in] my_rates Holds assorted rate data and other internal /// configuration info. /// @param[in] my_fields Specifies the field data. -/// @param[out] grain_growth_rates output buffers that are used to hold the -/// net grain growth rates at each @p idx_range (only used in certain -/// configurations) /// @param[in] grain_temperatures individual grain species temperatures. This /// is only used in certain configurations (i.e. when we aren't using the /// tdust argument) /// @param[in] logTlininterp_buf Specifies precomputed arrays of values (for /// each location in the index range) that are used to linearly interpolate /// tables with respect to logT (the natural log of the gas temperature). +/// @param[out] rxn_rate_buf output buffers to be filled with computed reaction +/// rates for @p idx_range /// @param[inout] internal_dust_prop_scratch_buf Scratch space used to hold /// temporary grain species properties (only used in certain configurations) /// @@ -108,9 +107,9 @@ inline void lookup_dust_rates1d( const double* dust2gas, double* h2dust, double dom, const gr_mask_type* itmask_metal, double dt, chemistry_data* my_chemistry, chemistry_data_storage* my_rates, grackle_field_data* my_fields, - grackle::impl::GrainSpeciesCollection grain_growth_rates, grackle::impl::GrainSpeciesCollection grain_temperatures, grackle::impl::LogTLinInterpScratchBuf logTlininterp_buf, + FullRxnRateBuf rxn_rate_buf, grackle::impl::InternalDustPropBuf internal_dust_prop_scratch_buf) { // shorten `grackle::impl::fortran_wrapper` to `f_wrap` within this function namespace f_wrap = ::grackle::impl::fortran_wrapper; @@ -299,6 +298,8 @@ inline void lookup_dust_rates1d( // Compute net grain growth rates // ------------------------------ + double* const* grain_growth_rates = + FullRxnRateBuf_grain_growth_bufs(&rxn_rate_buf); long long nratec_single_elem_arr[1] = { (long long)(my_chemistry->NumberOfTemperatureBins)}; @@ -366,7 +367,7 @@ inline void lookup_dust_rates1d( interp_props.parameters[1], dlogtem, nratec_single_elem_arr[0], my_rates->grain_growth_rate); - grain_growth_rates.data[OnlyGrainSpLUT::MgSiO3_dust][i] = + grain_growth_rates[OnlyGrainSpLUT::MgSiO3_dust][i] = kd * grain_sigma_per_gas_mass[i] * d(i, idx_range.j, idx_range.k) * limiting_factor; } @@ -402,13 +403,13 @@ inline void lookup_dust_rates1d( for (int i = idx_range.i_start; i < idx_range.i_stop; i++) { if (itmask_metal[i] != MASK_FALSE) { // zero-out the grain growth rate - grain_growth_rates.data[gsp_idx][i] = 0.0; + grain_growth_rates[gsp_idx][i] = 0.0; // set the growth rate to a negative value that will destroy the // grain over the interval `dt` if the dust temperature exceeds // the grain species's sublimation temperature if (temdust_arr[i] > temdust_sublimation) { - grain_growth_rates.data[gsp_idx][i] = + grain_growth_rates[gsp_idx][i] = (tiny8 - rho_gsp(i, idx_range.j, idx_range.k)) / dt; } } diff --git a/src/clib/lookup_cool_rates1d.hpp b/src/clib/lookup_cool_rates1d.hpp index da0736130..c7efe8bf9 100644 --- a/src/clib/lookup_cool_rates1d.hpp +++ b/src/clib/lookup_cool_rates1d.hpp @@ -750,9 +750,6 @@ inline void apply_misc_shield_factors( /// @param[in] my_uvb_rates Holds precomputed photorates that depend on the UV /// background. These rates do not include the effects of self-shielding. /// @param[in] internalu Specifies Grackle's internal unit-system -/// @param[out] grain_growth_rates output buffers that are used to hold the -/// net grain growth rates at each @p idx_range (only used in certain -/// configurations) /// @param[in] grain_temperatures individual grain species temperatures. This /// is only used in certain configurations (i.e. when we aren't using the /// tdust argument) @@ -761,8 +758,8 @@ inline void apply_misc_shield_factors( /// interpolate tables with respect to the natural log of @p tgas1d /// @param[out] kshield_buf Buffers filled with shielding-adjusted photo /// reaction rates for @p idx_range -/// @param[out] rxn_rate_buf Buffers filled with computed reaction rates for -/// @p idx_range +/// @param[out] rxn_rate_buf output buffers to be filled with computed reaction +/// rates for @p idx_range /// @param[out] chemheatrates_buf Buffers that are filled with interpolated /// values that are used to compute heating from certain chemical reactions. /// @param[inout] internal_dust_prop_scratch_buf Scratch space used to hold @@ -779,7 +776,6 @@ inline void lookup_cool_rates1d( chemistry_data* my_chemistry, chemistry_data_storage* my_rates, grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, InternalGrUnits internalu, - grackle::impl::GrainSpeciesCollection grain_growth_rates, grackle::impl::GrainSpeciesCollection grain_temperatures, grackle::impl::LogTLinInterpScratchBuf logTlininterp_buf, grackle::impl::PhotoRxnRateCollection kshield_buf, @@ -840,8 +836,8 @@ inline void lookup_cool_rates1d( if (anydust != MASK_FALSE) { lookup_dust_rates1d(idx_range, dlogtem, tdust, dust2gas, h2dust, dom, itmask_metal, dt, my_chemistry, my_rates, my_fields, - grain_growth_rates, grain_temperatures, - logTlininterp_buf, internal_dust_prop_scratch_buf); + grain_temperatures, logTlininterp_buf, rxn_rate_buf, + internal_dust_prop_scratch_buf); } // Deal with the photo reaction rates diff --git a/src/clib/solve_rate_cool_g-cpp.cpp b/src/clib/solve_rate_cool_g-cpp.cpp index a9b43fd5e..7c6587993 100644 --- a/src/clib/solve_rate_cool_g-cpp.cpp +++ b/src/clib/solve_rate_cool_g-cpp.cpp @@ -563,9 +563,6 @@ struct SpeciesRateSolverScratchBuf { // the interpolated chemistry-heating rates at each index-range location grackle::impl::ChemHeatingRates chemheatrates_buf; - // holds computed grain growth/destruction rates: - grackle::impl::GrainSpeciesCollection grain_growth_rates; - }; /// used to help implement the visitor design pattern @@ -600,9 +597,6 @@ void visit_member_pair(SpeciesRateSolverScratchBuf& obj0, vis::previsit_struct_member(VIS_MEMBER_NAME("chemheatrates_buf"), f); visit_member_pair(obj0.chemheatrates_buf, obj1.chemheatrates_buf, f); - vis::previsit_struct_member(VIS_MEMBER_NAME("grain_growth_rates"), f); - visit_member_pair(obj0.grain_growth_rates, obj1.grain_growth_rates, f); - vis::end_visit(f); } @@ -830,7 +824,7 @@ int solve_rate_cool_g( dust2gas.data(), spsolvbuf.h2dust, dom, dx_cgs, c_ljeans, itmask.data(), itmask_metal.data(), dt, my_chemistry, my_rates, my_fields, *my_uvb_rates, internalu, - spsolvbuf.grain_growth_rates, grain_temperatures, + grain_temperatures, logTlininterp_buf, spsolvbuf.kshield_buf, spsolvbuf.rxn_rate_buf, spsolvbuf.chemheatrates_buf, internal_dust_prop_scratch_buf @@ -906,7 +900,7 @@ int solve_rate_cool_g( dtit.data(), idx_range, anydust, spsolvbuf.h2dust, rhoH.data(), spsolvbuf.dedot_prev, spsolvbuf.HIdot_prev, spsolvbuf.itmask_gs, itmask_metal.data(), my_chemistry, my_fields, *my_uvb_rates, - spsolvbuf.grain_growth_rates, spsolvbuf.species_tmpdens, + spsolvbuf.species_tmpdens, spsolvbuf.kshield_buf, spsolvbuf.rxn_rate_buf ); diff --git a/src/clib/step_rate_gauss_seidel.hpp b/src/clib/step_rate_gauss_seidel.hpp index 2006fb933..a5766d5f8 100644 --- a/src/clib/step_rate_gauss_seidel.hpp +++ b/src/clib/step_rate_gauss_seidel.hpp @@ -236,7 +236,6 @@ inline void step_rate_gauss_seidel( double* HIdot_prev, const gr_mask_type* itmask, const gr_mask_type* itmask_metal, chemistry_data* my_chemistry, grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, - grackle::impl::GrainSpeciesCollection grain_growth_rates, grackle::impl::SpeciesCollection species_tmpdens, grackle::impl::PhotoRxnRateCollection kshield_buf, const FullRxnRateBuf rxn_rate_buf @@ -246,7 +245,7 @@ inline void step_rate_gauss_seidel( // end of the current timestep. The results are saved in species_tmpdens grackle::impl::chemistry::species_density_updates_gauss_seidel( species_tmpdens, idx_range, dtit, anydust, h2dust, rhoH, itmask, - itmask_metal, my_chemistry, my_fields, my_uvb_rates, grain_growth_rates, + itmask_metal, my_chemistry, my_fields, my_uvb_rates, kshield_buf, rxn_rate_buf); // update the entries from my_fields with the values in species_tmpdens diff --git a/src/clib/time_deriv_0d.hpp b/src/clib/time_deriv_0d.hpp index 312c12f30..09e3b7c44 100644 --- a/src/clib/time_deriv_0d.hpp +++ b/src/clib/time_deriv_0d.hpp @@ -62,7 +62,6 @@ struct MainScratchBuf { // the remaining buffers were originally reallocated (mostly on the stack) // every time calculated the time derivatives were computed PhotoRxnRateCollection kshield_buf; - GrainSpeciesCollection grain_growth_rates; FullRxnRateBuf rxn_rate_buf; }; @@ -82,7 +81,6 @@ MainScratchBuf new_MainScratchBuf(int grain_opacity_table_size) { out.kshield_buf = new_PhotoRxnRateCollection(nelem); - out.grain_growth_rates = new_GrainSpeciesCollection(nelem); out.rxn_rate_buf = new_FullRxnRateBuf(nelem); return out; } @@ -96,7 +94,6 @@ void drop_MainScratchBuf(MainScratchBuf* ptr) { drop_InternalDustPropBuf(&ptr->internal_dust_prop_scratch_buf); drop_PhotoRxnRateCollection(&ptr->kshield_buf); - drop_GrainSpeciesCollection(&ptr->grain_growth_rates); drop_FullRxnRateBuffer(&ptr->rxn_rate_buf); } @@ -501,7 +498,6 @@ void derivatives( pack.fwd_args.dom, pack.fwd_args.dx_cgs, pack.fwd_args.c_ljeans, pack.other_scratch_buf.itmask, &pack.local_itmask_metal, dt_FIXME, my_chemistry, my_rates, &pack.fields, my_uvb_rates, internalu, - pack.main_scratch_buf.grain_growth_rates, pack.main_scratch_buf.grain_temperatures, pack.main_scratch_buf.logTlininterp_buf, pack.main_scratch_buf.kshield_buf, @@ -548,7 +544,7 @@ void derivatives( gr_chem::species_density_derivatives_0d( rhosp_dot, pack.fwd_args.anydust, pack.other_scratch_buf.h2dust, pack.other_scratch_buf.rhoH, &pack.local_itmask_metal, my_chemistry, - &pack.fields, my_uvb_rates, pack.main_scratch_buf.grain_growth_rates, + &pack.fields, my_uvb_rates, pack.main_scratch_buf.kshield_buf, pack.main_scratch_buf.rxn_rate_buf ); From 833dfcc02fa11ba93baf2a3d7780b771e58a6ad8 Mon Sep 17 00:00:00 2001 From: Matthew Abruzzo Date: Wed, 14 Jan 2026 22:21:33 -0500 Subject: [PATCH 26/31] shift to using rxn_rate_bufs for tracking the self-shielding corrected radiative rates --- src/clib/chemistry_solver_funcs.hpp | 11 +++-------- src/clib/lookup_cool_rates1d.hpp | 25 +++++++++++-------------- src/clib/rate_timestep_g.cpp | 2 +- src/clib/rate_timestep_g.hpp | 2 -- src/clib/solve_rate_cool_g-cpp.cpp | 16 +++------------- src/clib/step_rate_gauss_seidel.hpp | 4 +--- src/clib/time_deriv_0d.hpp | 6 ------ 7 files changed, 19 insertions(+), 47 deletions(-) diff --git a/src/clib/chemistry_solver_funcs.hpp b/src/clib/chemistry_solver_funcs.hpp index 15178422b..5846adfb1 100644 --- a/src/clib/chemistry_solver_funcs.hpp +++ b/src/clib/chemistry_solver_funcs.hpp @@ -57,8 +57,6 @@ namespace grackle::impl::chemistry { /// @param[in] my_uvb_rates specifies precomputed rxn rates dependent on the /// UV background, without accounting for self-shield (we probably don't /// need to pass the whole thing since we also pass kshield_buf) -/// @param[in] kshield_buf specifies the -/// precomputed rxn rates (depends on local physical conditions) /// @param[in] rxn_rate_buf specifies the precomputed rxn rates (depends on /// local physical conditions) /// @@ -114,7 +112,6 @@ inline void species_density_updates_gauss_seidel( const double* rhoH, const gr_mask_type* itmask, const gr_mask_type* itmask_metal, chemistry_data* my_chemistry, grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, - grackle::impl::PhotoRxnRateCollection kshield_buf, const FullRxnRateBuf rxn_rate_buf ) { @@ -186,6 +183,7 @@ inline void species_density_updates_gauss_seidel( // locals const double* const* kcol_buf = FullRxnRateBuf_kcol_bufs(&rxn_rate_buf); + const PhotoRxnRateCollection kshield_buf = rxn_rate_buf.radiative; const double* const* grain_growth_rates = FullRxnRateBuf_grain_growth_bufs(&rxn_rate_buf); @@ -1467,8 +1465,6 @@ inline void species_density_updates_gauss_seidel( /// @param[in] my_fields Specifies field data /// @param[in] my_uvb_rates specifies precomputed rxn rates dependent on the /// UV background -/// @param[in] kshield_buf specifies the -/// precomputed rxn rates (depends on local physical conditions) /// @param[in] rxn_rate_buf specifies the precomputed rxn rates (depends on /// local physical conditions) /// @@ -1497,9 +1493,7 @@ inline void species_density_derivatives_0d( grackle::impl::SpeciesCollection deriv, gr_mask_type anydust, const double* h2dust, const double* rhoH, const gr_mask_type* itmask_metal, const chemistry_data* my_chemistry, const grackle_field_data* my_fields, - const photo_rate_storage my_uvb_rates, - const grackle::impl::PhotoRxnRateCollection kshield_buf, - const FullRxnRateBuf rxn_rate_buf + const photo_rate_storage my_uvb_rates, const FullRxnRateBuf rxn_rate_buf ) { // define some local variables carried over from the fortran version: @@ -1567,6 +1561,7 @@ inline void species_density_derivatives_0d( gr_float& H2Oice = my_fields->H2O_ice_dust_density[0]; const double* const* kcol_buf = FullRxnRateBuf_kcol_bufs(&rxn_rate_buf); + const PhotoRxnRateCollection kshield_buf = rxn_rate_buf.radiative; const double* const* grain_growth_rates = FullRxnRateBuf_grain_growth_bufs(&rxn_rate_buf); diff --git a/src/clib/lookup_cool_rates1d.hpp b/src/clib/lookup_cool_rates1d.hpp index c7efe8bf9..edf176785 100644 --- a/src/clib/lookup_cool_rates1d.hpp +++ b/src/clib/lookup_cool_rates1d.hpp @@ -756,8 +756,6 @@ inline void apply_misc_shield_factors( /// @param[out] logTlininterp_buf Buffers that are filled with values for each /// location in @p idx_range with valuea that are used to linearly /// interpolate tables with respect to the natural log of @p tgas1d -/// @param[out] kshield_buf Buffers filled with shielding-adjusted photo -/// reaction rates for @p idx_range /// @param[out] rxn_rate_buf output buffers to be filled with computed reaction /// rates for @p idx_range /// @param[out] chemheatrates_buf Buffers that are filled with interpolated @@ -778,7 +776,6 @@ inline void lookup_cool_rates1d( InternalGrUnits internalu, grackle::impl::GrainSpeciesCollection grain_temperatures, grackle::impl::LogTLinInterpScratchBuf logTlininterp_buf, - grackle::impl::PhotoRxnRateCollection kshield_buf, FullRxnRateBuf rxn_rate_buf, grackle::impl::ChemHeatingRates chemheatrates_buf, grackle::impl::InternalDustPropBuf internal_dust_prop_scratch_buf) { @@ -848,20 +845,20 @@ inline void lookup_cool_rates1d( for (int i = idx_range.i_start; i < idx_range.i_stop; i++) { if (itmask[i] != MASK_FALSE) { - kshield_buf.k24[i] = my_uvb_rates.k24; - kshield_buf.k25[i] = my_uvb_rates.k25; - kshield_buf.k26[i] = my_uvb_rates.k26; - kshield_buf.k28[i] = my_uvb_rates.k28; - kshield_buf.k29[i] = my_uvb_rates.k29; - kshield_buf.k30[i] = my_uvb_rates.k30; + rxn_rate_buf.radiative.k24[i] = my_uvb_rates.k24; + rxn_rate_buf.radiative.k25[i] = my_uvb_rates.k25; + rxn_rate_buf.radiative.k26[i] = my_uvb_rates.k26; + rxn_rate_buf.radiative.k28[i] = my_uvb_rates.k28; + rxn_rate_buf.radiative.k29[i] = my_uvb_rates.k29; + rxn_rate_buf.radiative.k30[i] = my_uvb_rates.k30; } } // model the effects of H2 self-shielding if (my_chemistry->primordial_chemistry > 1) { - model_H2I_dissociation_shielding(kshield_buf, idx_range, tgas1d, mmw, dom, - dx_cgs, c_ljeans, itmask, my_chemistry, - my_fields, my_uvb_rates, internalu); + model_H2I_dissociation_shielding( + rxn_rate_buf.radiative, idx_range, tgas1d, mmw, dom, dx_cgs, c_ljeans, + itmask, my_chemistry, my_fields, my_uvb_rates, internalu); } // apply some miscellaneous self-shielding adjustments @@ -869,7 +866,7 @@ inline void lookup_cool_rates1d( ShieldFactorCalculator calculator = setup_shield_factor_calculator(tgas1d, idx_range, dom, my_chemistry, my_fields, my_uvb_rates, internalu); - apply_misc_shield_factors(kshield_buf, idx_range, itmask, + apply_misc_shield_factors(rxn_rate_buf.radiative, idx_range, itmask, my_chemistry->self_shielding_method, my_uvb_rates, &calculator); } @@ -879,7 +876,7 @@ inline void lookup_cool_rates1d( // effects of secondary electrons (Shull * Steenberg 1985) // (see calc_rate.src) secondary_ionization_adjustments(idx_range, itmask, my_fields, my_uvb_rates, - internalu, kshield_buf); + internalu, rxn_rate_buf.radiative); #endif } diff --git a/src/clib/rate_timestep_g.cpp b/src/clib/rate_timestep_g.cpp index ad730230a..1866072a4 100644 --- a/src/clib/rate_timestep_g.cpp +++ b/src/clib/rate_timestep_g.cpp @@ -31,7 +31,6 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, const gr_mask_type* itmask, double* edot, double chunit, double dom, chemistry_data* my_chemistry, grackle_field_data* my_fields, IndexRange idx_range, - grackle::impl::PhotoRxnRateCollection kshield_buf, grackle::impl::ChemHeatingRates chemheatrates_buf, FullRxnRateBuf rxn_rate_buf) { // Density fields @@ -116,6 +115,7 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, // locals const double* const* kcol_buf = FullRxnRateBuf_kcol_bufs(&rxn_rate_buf); + const PhotoRxnRateCollection kshield_buf = rxn_rate_buf.radiative; int i; double atten; diff --git a/src/clib/rate_timestep_g.hpp b/src/clib/rate_timestep_g.hpp index c3b5b7511..88e2f9b04 100644 --- a/src/clib/rate_timestep_g.hpp +++ b/src/clib/rate_timestep_g.hpp @@ -44,7 +44,6 @@ namespace grackle::impl { /// @param[in] my_chemistry Holds a number of configuration parameters /// @param[in] my_fields Specifies the field data /// @param[in] idx_range Specifies the current index-range -/// @param[in] kshield_buf Holds various pre-computed radiative reaction rates /// @param[in] chemheatrates_buf Holds various pre-computed chemistry-heating /// rates at each index-range location /// @param[in] rxn_rate_buf Holds pre-computed reaction rates for each location @@ -58,7 +57,6 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, const gr_mask_type* itmask, double* edot, double chunit, double dom, chemistry_data* my_chemistry, grackle_field_data* my_fields, IndexRange idx_range, - grackle::impl::PhotoRxnRateCollection kshield_buf, grackle::impl::ChemHeatingRates chemheatrates_buf, FullRxnRateBuf rxn_rate_buf); diff --git a/src/clib/solve_rate_cool_g-cpp.cpp b/src/clib/solve_rate_cool_g-cpp.cpp index 7c6587993..db9d49ba8 100644 --- a/src/clib/solve_rate_cool_g-cpp.cpp +++ b/src/clib/solve_rate_cool_g-cpp.cpp @@ -551,10 +551,6 @@ struct SpeciesRateSolverScratchBuf { // (currently only used by step_rate_g) grackle::impl::SpeciesCollection species_tmpdens; - // buffers in the following data structure are used to temporarily hold - // the computed radiative reaction rates - grackle::impl::PhotoRxnRateCollection kshield_buf; - /// buffers in the following data structure are used to temporarily hold /// all reaction rates FullRxnRateBuf rxn_rate_buf; @@ -588,9 +584,6 @@ void visit_member_pair(SpeciesRateSolverScratchBuf& obj0, vis::previsit_struct_member(VIS_MEMBER_NAME("species_tmpdens"), f); visit_member_pair(obj0.species_tmpdens, obj1.species_tmpdens, f); - vis::previsit_struct_member(VIS_MEMBER_NAME("kshield_buf"), f); - visit_member_pair(obj0.kshield_buf, obj1.kshield_buf, f); - vis::previsit_struct_member(VIS_MEMBER_NAME("rxn_rate_buf"), f); visit_member_pair(obj0.rxn_rate_buf, obj1.rxn_rate_buf, f); @@ -824,8 +817,7 @@ int solve_rate_cool_g( dust2gas.data(), spsolvbuf.h2dust, dom, dx_cgs, c_ljeans, itmask.data(), itmask_metal.data(), dt, my_chemistry, my_rates, my_fields, *my_uvb_rates, internalu, - grain_temperatures, - logTlininterp_buf, spsolvbuf.kshield_buf, + grain_temperatures, logTlininterp_buf, spsolvbuf.rxn_rate_buf, spsolvbuf.chemheatrates_buf, internal_dust_prop_scratch_buf ); @@ -837,8 +829,7 @@ int solve_rate_cool_g( spsolvbuf.dedot, spsolvbuf.HIdot, anydust, spsolvbuf.h2dust, rhoH.data(), itmask.data(), edot.data(), chunit, dom, my_chemistry, my_fields, idx_range, - spsolvbuf.kshield_buf, spsolvbuf.chemheatrates_buf, - spsolvbuf.rxn_rate_buf + spsolvbuf.chemheatrates_buf, spsolvbuf.rxn_rate_buf ); // Setup masks to identify which chemistry schemes to use. We split @@ -900,8 +891,7 @@ int solve_rate_cool_g( dtit.data(), idx_range, anydust, spsolvbuf.h2dust, rhoH.data(), spsolvbuf.dedot_prev, spsolvbuf.HIdot_prev, spsolvbuf.itmask_gs, itmask_metal.data(), my_chemistry, my_fields, *my_uvb_rates, - spsolvbuf.species_tmpdens, - spsolvbuf.kshield_buf, spsolvbuf.rxn_rate_buf + spsolvbuf.species_tmpdens, spsolvbuf.rxn_rate_buf ); // Solve rate equations with one linearly implicit Gauss-Seidel diff --git a/src/clib/step_rate_gauss_seidel.hpp b/src/clib/step_rate_gauss_seidel.hpp index a5766d5f8..c3fbc9ae5 100644 --- a/src/clib/step_rate_gauss_seidel.hpp +++ b/src/clib/step_rate_gauss_seidel.hpp @@ -237,7 +237,6 @@ inline void step_rate_gauss_seidel( const gr_mask_type* itmask_metal, chemistry_data* my_chemistry, grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, grackle::impl::SpeciesCollection species_tmpdens, - grackle::impl::PhotoRxnRateCollection kshield_buf, const FullRxnRateBuf rxn_rate_buf ) { @@ -245,8 +244,7 @@ inline void step_rate_gauss_seidel( // end of the current timestep. The results are saved in species_tmpdens grackle::impl::chemistry::species_density_updates_gauss_seidel( species_tmpdens, idx_range, dtit, anydust, h2dust, rhoH, itmask, - itmask_metal, my_chemistry, my_fields, my_uvb_rates, - kshield_buf, rxn_rate_buf); + itmask_metal, my_chemistry, my_fields, my_uvb_rates, rxn_rate_buf); // update the entries from my_fields with the values in species_tmpdens update_fields_from_tmpdens_gauss_seidel( diff --git a/src/clib/time_deriv_0d.hpp b/src/clib/time_deriv_0d.hpp index 09e3b7c44..ab62f98f2 100644 --- a/src/clib/time_deriv_0d.hpp +++ b/src/clib/time_deriv_0d.hpp @@ -61,7 +61,6 @@ struct MainScratchBuf { // the remaining buffers were originally reallocated (mostly on the stack) // every time calculated the time derivatives were computed - PhotoRxnRateCollection kshield_buf; FullRxnRateBuf rxn_rate_buf; }; @@ -80,7 +79,6 @@ MainScratchBuf new_MainScratchBuf(int grain_opacity_table_size) { new_InternalDustPropBuf(nelem, grain_opacity_table_size); - out.kshield_buf = new_PhotoRxnRateCollection(nelem); out.rxn_rate_buf = new_FullRxnRateBuf(nelem); return out; } @@ -93,7 +91,6 @@ void drop_MainScratchBuf(MainScratchBuf* ptr) { drop_ChemHeatingRates(&ptr->chemheatrates_buf); drop_InternalDustPropBuf(&ptr->internal_dust_prop_scratch_buf); - drop_PhotoRxnRateCollection(&ptr->kshield_buf); drop_FullRxnRateBuffer(&ptr->rxn_rate_buf); } @@ -500,7 +497,6 @@ void derivatives( my_chemistry, my_rates, &pack.fields, my_uvb_rates, internalu, pack.main_scratch_buf.grain_temperatures, pack.main_scratch_buf.logTlininterp_buf, - pack.main_scratch_buf.kshield_buf, pack.main_scratch_buf.rxn_rate_buf, pack.main_scratch_buf.chemheatrates_buf, pack.main_scratch_buf.internal_dust_prop_scratch_buf @@ -521,7 +517,6 @@ void derivatives( pack.other_scratch_buf.edot, pack.fwd_args.chunit, pack.fwd_args.dom, my_chemistry, &pack.fields, pack.idx_range_1_element, - pack.main_scratch_buf.kshield_buf, pack.main_scratch_buf.chemheatrates_buf, pack.main_scratch_buf.rxn_rate_buf ); @@ -545,7 +540,6 @@ void derivatives( rhosp_dot, pack.fwd_args.anydust, pack.other_scratch_buf.h2dust, pack.other_scratch_buf.rhoH, &pack.local_itmask_metal, my_chemistry, &pack.fields, my_uvb_rates, - pack.main_scratch_buf.kshield_buf, pack.main_scratch_buf.rxn_rate_buf ); } From 7469407dfd35360c08a1c04cff26b8dd38e61cc7 Mon Sep 17 00:00:00 2001 From: Matthew Abruzzo Date: Thu, 15 Jan 2026 15:00:07 -0500 Subject: [PATCH 27/31] shift to using rxn_rate_bufs for tracking h2dust --- src/clib/chemistry_solver_funcs.hpp | 16 +++++++--------- src/clib/dust/lookup_dust_rates1d.hpp | 10 +++++++--- src/clib/lookup_cool_rates1d.hpp | 18 +++++++----------- src/clib/rate_timestep_g.cpp | 7 ++++--- src/clib/rate_timestep_g.hpp | 7 +++---- src/clib/solve_rate_cool_g-cpp.cpp | 14 +++++--------- src/clib/step_rate_gauss_seidel.hpp | 4 ++-- src/clib/step_rate_newton_raphson.hpp | 8 ++++---- src/clib/time_deriv_0d.hpp | 20 +++++++------------- 9 files changed, 46 insertions(+), 58 deletions(-) diff --git a/src/clib/chemistry_solver_funcs.hpp b/src/clib/chemistry_solver_funcs.hpp index 5846adfb1..22175af96 100644 --- a/src/clib/chemistry_solver_funcs.hpp +++ b/src/clib/chemistry_solver_funcs.hpp @@ -44,8 +44,6 @@ namespace grackle::impl::chemistry { /// @param[in] dtit Specifies the timestep of the current sub-cycle for each /// index in @p idx_range. /// @param[in] anydust Indicates whether we are modelling dust -/// @param[in] h2dust Specifies the rate of H2 dust-formation on dust grains -/// for eacg k /// @param[in] rhoH Indicates the mass density of all Hydrogen /// @param[in] itmask The general iteration mask for @p idx_range. /// @param[in] itmask_metal The iteration mask @p idx_range that specifies @@ -108,11 +106,10 @@ namespace grackle::impl::chemistry { /// performance). inline void species_density_updates_gauss_seidel( grackle::impl::SpeciesCollection out_spdens, IndexRange idx_range, - const double* dtit, gr_mask_type anydust, const double* h2dust, - const double* rhoH, const gr_mask_type* itmask, - const gr_mask_type* itmask_metal, chemistry_data* my_chemistry, - grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, - const FullRxnRateBuf rxn_rate_buf + const double* dtit, gr_mask_type anydust, const double* rhoH, + const gr_mask_type* itmask, const gr_mask_type* itmask_metal, + const chemistry_data* my_chemistry, grackle_field_data* my_fields, + photo_rate_storage my_uvb_rates, const FullRxnRateBuf rxn_rate_buf ) { @@ -186,6 +183,7 @@ inline void species_density_updates_gauss_seidel( const PhotoRxnRateCollection kshield_buf = rxn_rate_buf.radiative; const double* const* grain_growth_rates = FullRxnRateBuf_grain_growth_bufs(&rxn_rate_buf); + const double* h2dust = FullRxnRateBuf_h2dust(&rxn_rate_buf); int i; double scoef, acoef; @@ -1456,7 +1454,6 @@ inline void species_density_updates_gauss_seidel( /// species mass densities. The caller must make sure this is filled with /// zeros before calling this function /// @param[in] anydust -/// @param[in] h2dust /// @param[in] rhoH Indicates the mass density of all Hydrogen /// @param[in] itmask_metal Indicates where we should account for metal /// chemistry @@ -1491,7 +1488,7 @@ inline void species_density_updates_gauss_seidel( /// is a reasonable motivation for that choice) inline void species_density_derivatives_0d( grackle::impl::SpeciesCollection deriv, gr_mask_type anydust, - const double* h2dust, const double* rhoH, const gr_mask_type* itmask_metal, + const double* rhoH, const gr_mask_type* itmask_metal, const chemistry_data* my_chemistry, const grackle_field_data* my_fields, const photo_rate_storage my_uvb_rates, const FullRxnRateBuf rxn_rate_buf ) { @@ -1564,6 +1561,7 @@ inline void species_density_derivatives_0d( const PhotoRxnRateCollection kshield_buf = rxn_rate_buf.radiative; const double* const* grain_growth_rates = FullRxnRateBuf_grain_growth_bufs(&rxn_rate_buf); + const double* h2dust = FullRxnRateBuf_h2dust(&rxn_rate_buf); double scoef, acoef; diff --git a/src/clib/dust/lookup_dust_rates1d.hpp b/src/clib/dust/lookup_dust_rates1d.hpp index 1e5c436e5..7dbb16e06 100644 --- a/src/clib/dust/lookup_dust_rates1d.hpp +++ b/src/clib/dust/lookup_dust_rates1d.hpp @@ -104,9 +104,9 @@ namespace grackle::impl { /// > dust-grain density is already 0. inline void lookup_dust_rates1d( IndexRange idx_range, double dlogtem, const double* tdust, - const double* dust2gas, double* h2dust, double dom, - const gr_mask_type* itmask_metal, double dt, chemistry_data* my_chemistry, - chemistry_data_storage* my_rates, grackle_field_data* my_fields, + const double* dust2gas, double dom, const gr_mask_type* itmask_metal, + double dt, chemistry_data* my_chemistry, chemistry_data_storage* my_rates, + grackle_field_data* my_fields, grackle::impl::GrainSpeciesCollection grain_temperatures, grackle::impl::LogTLinInterpScratchBuf logTlininterp_buf, FullRxnRateBuf rxn_rate_buf, @@ -124,6 +124,10 @@ inline void lookup_dust_rates1d( // we should probably enforce the following at initialization! GRIMPL_REQUIRE(my_chemistry->dust_species >= 0, "sanity-check!"); + // h2dust is the buffer that gets filled with the rate for forming + // molecular hydrogen on dust grains + double* h2dust = FullRxnRateBuf_h2dust(&rxn_rate_buf); + if (my_chemistry->dust_species == 0) { // in this branch, we are just tracking a single generic dust field diff --git a/src/clib/lookup_cool_rates1d.hpp b/src/clib/lookup_cool_rates1d.hpp index edf176785..296971bd9 100644 --- a/src/clib/lookup_cool_rates1d.hpp +++ b/src/clib/lookup_cool_rates1d.hpp @@ -731,9 +731,6 @@ inline void apply_misc_shield_factors( /// @param[in] dust2gas Holds the dust-to-gas ratio at each location in the /// index range. In other words, this holds the dust mass per unit gas mass /// (only used in certain configuration) -/// @param[out] h2dust Buffer that gets filled with the rate for forming -/// molecular hydrogen on dust grains. (This is filled whenever @p anydust -/// holds `MASK_TRUE`. /// @param[in] dom a standard quantity used throughout the codebase /// @param[in] dx_cgs The width of a cell in comoving cm (I think). Used in /// certain self-shielding calculations. @@ -768,12 +765,11 @@ inline void apply_misc_shield_factors( /// > docstring of @ref grackle::impl::lookup_dust_rates1d for more details inline void lookup_cool_rates1d( IndexRange idx_range, gr_mask_type anydust, const double* tgas1d, - const double* mmw, const double* tdust, const double* dust2gas, - double* h2dust, double dom, double dx_cgs, double c_ljeans, - const gr_mask_type* itmask, const gr_mask_type* itmask_metal, double dt, - chemistry_data* my_chemistry, chemistry_data_storage* my_rates, - grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, - InternalGrUnits internalu, + const double* mmw, const double* tdust, const double* dust2gas, double dom, + double dx_cgs, double c_ljeans, const gr_mask_type* itmask, + const gr_mask_type* itmask_metal, double dt, chemistry_data* my_chemistry, + chemistry_data_storage* my_rates, grackle_field_data* my_fields, + photo_rate_storage my_uvb_rates, InternalGrUnits internalu, grackle::impl::GrainSpeciesCollection grain_temperatures, grackle::impl::LogTLinInterpScratchBuf logTlininterp_buf, FullRxnRateBuf rxn_rate_buf, @@ -831,8 +827,8 @@ inline void lookup_cool_rates1d( // Look-up rate for H2 formation on dust & (when relevant) grain growth rates if (anydust != MASK_FALSE) { - lookup_dust_rates1d(idx_range, dlogtem, tdust, dust2gas, h2dust, dom, - itmask_metal, dt, my_chemistry, my_rates, my_fields, + lookup_dust_rates1d(idx_range, dlogtem, tdust, dust2gas, dom, itmask_metal, + dt, my_chemistry, my_rates, my_fields, grain_temperatures, logTlininterp_buf, rxn_rate_buf, internal_dust_prop_scratch_buf); } diff --git a/src/clib/rate_timestep_g.cpp b/src/clib/rate_timestep_g.cpp index 1866072a4..495d6de0d 100644 --- a/src/clib/rate_timestep_g.cpp +++ b/src/clib/rate_timestep_g.cpp @@ -27,9 +27,9 @@ namespace grackle::impl { void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, - const double* h2dust, const double* rhoH, - const gr_mask_type* itmask, double* edot, double chunit, - double dom, chemistry_data* my_chemistry, + const double* rhoH, const gr_mask_type* itmask, + double* edot, double chunit, double dom, + chemistry_data* my_chemistry, grackle_field_data* my_fields, IndexRange idx_range, grackle::impl::ChemHeatingRates chemheatrates_buf, FullRxnRateBuf rxn_rate_buf) { @@ -114,6 +114,7 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, my_fields->grid_dimension[1], my_fields->grid_dimension[2]); // locals + const double* h2dust = FullRxnRateBuf_h2dust(&rxn_rate_buf); const double* const* kcol_buf = FullRxnRateBuf_kcol_bufs(&rxn_rate_buf); const PhotoRxnRateCollection kshield_buf = rxn_rate_buf.radiative; diff --git a/src/clib/rate_timestep_g.hpp b/src/clib/rate_timestep_g.hpp index 88e2f9b04..236e63f0f 100644 --- a/src/clib/rate_timestep_g.hpp +++ b/src/clib/rate_timestep_g.hpp @@ -33,7 +33,6 @@ namespace grackle::impl { /// @param[in] dedot Time derivatives of free electron mass density /// @param[in] HIdot Time derivatives of HI mass density /// @param[in] anydust Indicates whether we are modelling dust -/// @param[in] h2dust Rate of H2 formation on dust grains /// @param[in] rhoH Indicates the mass density of all Hydrogen /// @param[in] itmask Specifies the `idx_range`'s iteration-mask for this /// calculation @@ -53,9 +52,9 @@ namespace grackle::impl { /// modified1: November, 2025 by Christopher Bignamini & Matthew Abruzzo; C++ /// port void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, - const double* h2dust, const double* rhoH, - const gr_mask_type* itmask, double* edot, double chunit, - double dom, chemistry_data* my_chemistry, + const double* rhoH, const gr_mask_type* itmask, + double* edot, double chunit, double dom, + chemistry_data* my_chemistry, grackle_field_data* my_fields, IndexRange idx_range, grackle::impl::ChemHeatingRates chemheatrates_buf, FullRxnRateBuf rxn_rate_buf); diff --git a/src/clib/solve_rate_cool_g-cpp.cpp b/src/clib/solve_rate_cool_g-cpp.cpp index db9d49ba8..104b4e592 100644 --- a/src/clib/solve_rate_cool_g-cpp.cpp +++ b/src/clib/solve_rate_cool_g-cpp.cpp @@ -534,9 +534,6 @@ struct SpeciesRateSolverScratchBuf { /// for index_range computed during the previous cycle double *dedot_prev, *HIdot_prev; - /// buffer used to track the rate of H2 formation on dust grains - double* h2dust; - /// iteration mask denoting where the Gauss-Seidel scheme will be used gr_mask_type* itmask_gs; @@ -576,7 +573,6 @@ void visit_member_pair(SpeciesRateSolverScratchBuf& obj0, f(VIS_MEMBER_NAME("HIdot"), obj0.HIdot, obj1.HIdot, vis::idx_range_len_multiple(1)); f(VIS_MEMBER_NAME("dedot_prev"), obj0.dedot_prev, obj1.dedot_prev, vis::idx_range_len_multiple(1)); f(VIS_MEMBER_NAME("HIdot_prev"), obj0.HIdot_prev, obj1.HIdot_prev, vis::idx_range_len_multiple(1)); - f(VIS_MEMBER_NAME("h2dust"), obj0.h2dust, obj1.h2dust, vis::idx_range_len_multiple(1)); f(VIS_MEMBER_NAME("itmask_gs"), obj0.itmask_gs, obj1.itmask_gs, vis::idx_range_len_multiple(1)); f(VIS_MEMBER_NAME("itmask_nr"), obj0.itmask_nr, obj1.itmask_nr, vis::idx_range_len_multiple(1)); f(VIS_MEMBER_NAME("imp_eng"), obj0.imp_eng, obj1.imp_eng, vis::idx_range_len_multiple(1)); @@ -814,8 +810,8 @@ int solve_rate_cool_g( // the C++ docstring for a longer discussion grackle::impl::lookup_cool_rates1d( idx_range, anydust, tgas.data(), mmw.data(), tdust.data(), - dust2gas.data(), spsolvbuf.h2dust, dom, dx_cgs, - c_ljeans, itmask.data(), itmask_metal.data(), dt, my_chemistry, + dust2gas.data(), dom, dx_cgs, c_ljeans, itmask.data(), + itmask_metal.data(), dt, my_chemistry, my_rates, my_fields, *my_uvb_rates, internalu, grain_temperatures, logTlininterp_buf, spsolvbuf.rxn_rate_buf, spsolvbuf.chemheatrates_buf, @@ -826,7 +822,7 @@ int solve_rate_cool_g( // (should add itmask to this call) grackle::impl::rate_timestep_g( - spsolvbuf.dedot, spsolvbuf.HIdot, anydust, spsolvbuf.h2dust, + spsolvbuf.dedot, spsolvbuf.HIdot, anydust, rhoH.data(), itmask.data(), edot.data(), chunit, dom, my_chemistry, my_fields, idx_range, spsolvbuf.chemheatrates_buf, spsolvbuf.rxn_rate_buf @@ -888,7 +884,7 @@ int solve_rate_cool_g( // sweep of a backward Euler method (for all cells specified by // itmask_gs) grackle::impl::step_rate_gauss_seidel( - dtit.data(), idx_range, anydust, spsolvbuf.h2dust, rhoH.data(), + dtit.data(), idx_range, anydust, rhoH.data(), spsolvbuf.dedot_prev, spsolvbuf.HIdot_prev, spsolvbuf.itmask_gs, itmask_metal.data(), my_chemistry, my_fields, *my_uvb_rates, spsolvbuf.species_tmpdens, spsolvbuf.rxn_rate_buf @@ -901,7 +897,7 @@ int solve_rate_cool_g( imetal, idx_range, iter, dom, chunit, dx_cgs, c_ljeans, dtit.data(), p2d.data(), tgas.data(), tdust.data(), metallicity.data(), dust2gas.data(), rhoH.data(), mmw.data(), - spsolvbuf.h2dust, edot.data(), anydust, spsolvbuf.itmask_nr, + edot.data(), anydust, spsolvbuf.itmask_nr, itmask_metal.data(), spsolvbuf.imp_eng, my_chemistry, my_rates, my_fields, *my_uvb_rates, internalu, grain_temperatures, logTlininterp_buf, cool1dmulti_buf, coolingheating_buf, diff --git a/src/clib/step_rate_gauss_seidel.hpp b/src/clib/step_rate_gauss_seidel.hpp index c3fbc9ae5..756cc8e22 100644 --- a/src/clib/step_rate_gauss_seidel.hpp +++ b/src/clib/step_rate_gauss_seidel.hpp @@ -232,7 +232,7 @@ inline void update_fields_from_tmpdens_gauss_seidel( /// integrator to advance the rate equations by one (sub-)cycle (dtit). inline void step_rate_gauss_seidel( const double* dtit, IndexRange idx_range, gr_mask_type anydust, - const double* h2dust, const double* rhoH, double* dedot_prev, + const double* rhoH, double* dedot_prev, double* HIdot_prev, const gr_mask_type* itmask, const gr_mask_type* itmask_metal, chemistry_data* my_chemistry, grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, @@ -243,7 +243,7 @@ inline void step_rate_gauss_seidel( // perform the Gauss-Seidel sweep to compute the species densities at the // end of the current timestep. The results are saved in species_tmpdens grackle::impl::chemistry::species_density_updates_gauss_seidel( - species_tmpdens, idx_range, dtit, anydust, h2dust, rhoH, itmask, + species_tmpdens, idx_range, dtit, anydust, rhoH, itmask, itmask_metal, my_chemistry, my_fields, my_uvb_rates, rxn_rate_buf); // update the entries from my_fields with the values in species_tmpdens diff --git a/src/clib/step_rate_newton_raphson.hpp b/src/clib/step_rate_newton_raphson.hpp index e97d5cc68..b91b4b1fe 100644 --- a/src/clib/step_rate_newton_raphson.hpp +++ b/src/clib/step_rate_newton_raphson.hpp @@ -138,7 +138,7 @@ inline void wrapped_calc_derivatives( /// /// @note /// The values in the various buffers (p2d, tgas, tdust, metallicity, dust2gas, -/// rhoH, mmw, h2dust, edot, grain_temperatures, logTlininterp_buf, +/// rhoH, mmw, edot, grain_temperatures, logTlininterp_buf, /// cool1dmulti_buf, coolingheating_buf, chemheatrates_buf), hold undefined /// values after this function call wherever `itmask_nr` indicates that this /// function runs. @@ -148,7 +148,7 @@ inline void step_rate_newton_raphson( int imetal, IndexRange idx_range, int iter, double dom, double chunit, double dx_cgs, double c_ljeans, double* dtit, double* p2d, double* tgas, double* tdust, double* metallicity, double* dust2gas, double* rhoH, - double* mmw, double* h2dust, double* edot, gr_mask_type anydust, + double* mmw, double* edot, gr_mask_type anydust, gr_mask_type* itmask_nr, gr_mask_type* itmask_metal, int* imp_eng, chemistry_data* my_chemistry, chemistry_data_storage* my_rates, grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, @@ -501,7 +501,7 @@ inline void step_rate_newton_raphson( // copying is the value of cool1dmulti_buf.tgasold -- and that doesn't // currently get used) t_deriv::scratchbufs_copy_into_pack( - i, &pack, p2d, tgas, tdust, metallicity, dust2gas, rhoH, mmw, h2dust, + i, &pack, p2d, tgas, tdust, metallicity, dust2gas, rhoH, mmw, edot, grain_temperatures, logTlininterp_buf, cool1dmulti_buf, coolingheating_buf, chemheatrates_buf ); @@ -659,7 +659,7 @@ inline void step_rate_newton_raphson( // -> we should totally delete this function (we may already be able to // do so) t_deriv::scratchbufs_copy_from_pack( - i, &pack, p2d, tgas, tdust, metallicity, dust2gas, rhoH, mmw, h2dust, + i, &pack, p2d, tgas, tdust, metallicity, dust2gas, rhoH, mmw, edot, grain_temperatures, logTlininterp_buf, cool1dmulti_buf, coolingheating_buf, chemheatrates_buf ); diff --git a/src/clib/time_deriv_0d.hpp b/src/clib/time_deriv_0d.hpp index ab62f98f2..36fd43f70 100644 --- a/src/clib/time_deriv_0d.hpp +++ b/src/clib/time_deriv_0d.hpp @@ -110,7 +110,6 @@ struct Assorted1ElemBuf { double dust2gas[1]; double rhoH[1]; double mmw[1]; - double h2dust[1]; double edot[1]; // the remaining buffers were originally reallocated (on the stack) @@ -268,7 +267,7 @@ inline void configure_ContextPack( inline void scratchbufs_copy_into_pack( int index, ContextPack* pack, const double* p2d, const double* tgas, const double* tdust, const double* metallicity, const double* dust2gas, - const double* rhoH, const double* mmw, const double* h2dust, + const double* rhoH, const double* mmw, const double* edot, grackle::impl::GrainSpeciesCollection grain_temperatures, grackle::impl::LogTLinInterpScratchBuf logTlininterp_buf, grackle::impl::Cool1DMultiScratchBuf cool1dmulti_buf, @@ -331,7 +330,6 @@ inline void scratchbufs_copy_into_pack( pack->other_scratch_buf.dust2gas[0] = dust2gas[index]; pack->other_scratch_buf.rhoH[0] = rhoH[index]; pack->other_scratch_buf.mmw[0] = mmw[index]; - pack->other_scratch_buf.h2dust[0] = h2dust[index]; pack->other_scratch_buf.edot[0] = edot[index]; } @@ -346,7 +344,7 @@ inline void scratchbufs_copy_into_pack( inline void scratchbufs_copy_from_pack( int index, ContextPack* pack, double* p2d, double* tgas, double* tdust, double* metallicity, double* dust2gas, double* rhoH, - double* mmw, double* h2dust, double* edot, + double* mmw, double* edot, grackle::impl::GrainSpeciesCollection grain_temperatures, grackle::impl::LogTLinInterpScratchBuf logTlininterp_buf, grackle::impl::Cool1DMultiScratchBuf cool1dmulti_buf, @@ -387,7 +385,6 @@ inline void scratchbufs_copy_from_pack( dust2gas[index] = pack->other_scratch_buf.dust2gas[0]; rhoH[index] = pack->other_scratch_buf.rhoH[0]; mmw[index] = pack->other_scratch_buf.mmw[0]; - h2dust[index] = pack->other_scratch_buf.h2dust[0]; edot[index] = pack->other_scratch_buf.edot[0]; } @@ -491,7 +488,6 @@ void derivatives( pack.idx_range_1_element, pack.fwd_args.anydust, pack.other_scratch_buf.tgas, pack.other_scratch_buf.mmw, pack.other_scratch_buf.tdust, pack.other_scratch_buf.dust2gas, - pack.other_scratch_buf.h2dust, pack.fwd_args.dom, pack.fwd_args.dx_cgs, pack.fwd_args.c_ljeans, pack.other_scratch_buf.itmask, &pack.local_itmask_metal, dt_FIXME, my_chemistry, my_rates, &pack.fields, my_uvb_rates, internalu, @@ -512,10 +508,9 @@ void derivatives( grackle::impl::rate_timestep_g( pack.other_scratch_buf.dedot, pack.other_scratch_buf.HIdot, - pack.fwd_args.anydust, pack.other_scratch_buf.h2dust, - pack.other_scratch_buf.rhoH, pack.other_scratch_buf.itmask, - pack.other_scratch_buf.edot, pack.fwd_args.chunit, - pack.fwd_args.dom, my_chemistry, &pack.fields, + pack.fwd_args.anydust, pack.other_scratch_buf.rhoH, + pack.other_scratch_buf.itmask, pack.other_scratch_buf.edot, + pack.fwd_args.chunit, pack.fwd_args.dom, my_chemistry, &pack.fields, pack.idx_range_1_element, pack.main_scratch_buf.chemheatrates_buf, pack.main_scratch_buf.rxn_rate_buf @@ -537,9 +532,8 @@ void derivatives( } gr_chem::species_density_derivatives_0d( - rhosp_dot, pack.fwd_args.anydust, pack.other_scratch_buf.h2dust, - pack.other_scratch_buf.rhoH, &pack.local_itmask_metal, my_chemistry, - &pack.fields, my_uvb_rates, + rhosp_dot, pack.fwd_args.anydust, pack.other_scratch_buf.rhoH, + &pack.local_itmask_metal, my_chemistry, &pack.fields, my_uvb_rates, pack.main_scratch_buf.rxn_rate_buf ); } From 40e528a7d4d634b8c8a6422ffb7ea06cf52c7355 Mon Sep 17 00:00:00 2001 From: Matthew Abruzzo Date: Thu, 15 Jan 2026 15:08:58 -0500 Subject: [PATCH 28/31] adjust docstring: species_density_updates_gauss_seidel --- src/clib/chemistry_solver_funcs.hpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/clib/chemistry_solver_funcs.hpp b/src/clib/chemistry_solver_funcs.hpp index 22175af96..6a1ac0c4c 100644 --- a/src/clib/chemistry_solver_funcs.hpp +++ b/src/clib/chemistry_solver_funcs.hpp @@ -64,8 +64,8 @@ namespace grackle::impl::chemistry { /// Right now the implementation of every rate is **very** manual, which makes /// it very easy to forget to add a rate. /// -/// The shorter-term goal is to deduplicate as much as possible with between -/// this function & grackle::impl::chemistry::species_density_derivatives_0d. +/// The shorter-term goal is to deduplicate as much as possible between this +/// function & @ref species_density_derivatives_0d. /// Some important considerations: /// - it will be easiest to deduplicate the metal-chemistry and grain-species /// growth rates (we only need to introduce some light usage of templates) @@ -79,7 +79,7 @@ namespace grackle::impl::chemistry { /// - In the longer term, it would make more sense to use more of a "table /// based approach" in the regime where we have lots of chemistry. /// - We elaborate a little more down below: -/// - we already have a table of 1d rate buffers (i.e. @p kcol_buf ). +/// - we already have a table of 1d rate buffers: @p rxn_rate_buf. /// - we might also track a table (with matching indices) where we track the /// indexes associated with each reactant/product of a rate as well as /// stoichiometric coefficients. @@ -90,14 +90,13 @@ namespace grackle::impl::chemistry { /// by index. Essentially, we would dynamically build up the creational /// & destructive coefficients (``acoef`` & ``scoef``) for a full row and /// use the values to then perform the update. -/// - in practice things would be a little more complex since we have lots -/// of rates not stored in @p kcol_buf, but it's still **very** doable +/// - in practice things would be a little more complex since we have to deal +/// dissociation rates, but it's still **very** doable /// - once this infrastructure is in place, we could replace -/// grackle::impl::chemistry::species_density_derivatives_0d -/// that iterates through all of the rates in a very different manner -/// and directly compute partial derivatives in a much more efficient -/// manner (currently, it's used with finite derivatives for computing -/// these partial derivatives) +/// @ref chemistry::species_density_derivatives_0d with logic that iterates +/// through rates in a very different manner and directly compute partial +/// derivatives in a much more efficient manner (currently, it's used with +/// finite differences for computing the partial derivatives) /// - Importantly, the table-based approach is *probably* slower than the /// manual, hand-coded approach in the limit of a small chemical network. /// I suspect that we'll preserve the hand-coded approach for From c514cea52611377c579f1d173d6f98be2235d233 Mon Sep 17 00:00:00 2001 From: Matthew Abruzzo Date: Thu, 15 Jan 2026 18:16:20 -0500 Subject: [PATCH 29/31] stop treating k27 as a special case --- src/clib/chemistry_solver_funcs.hpp | 13 ++++--------- src/clib/lookup_cool_rates1d.hpp | 11 +++++++++++ src/clib/solve_rate_cool_g-cpp.cpp | 2 +- src/clib/step_rate_gauss_seidel.hpp | 4 ++-- src/clib/time_deriv_0d.hpp | 2 +- 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/clib/chemistry_solver_funcs.hpp b/src/clib/chemistry_solver_funcs.hpp index 6a1ac0c4c..3f1cb14c4 100644 --- a/src/clib/chemistry_solver_funcs.hpp +++ b/src/clib/chemistry_solver_funcs.hpp @@ -52,9 +52,6 @@ namespace grackle::impl::chemistry { /// @param[in] my_chemistry Provides various runtime parameters (we probably /// don't need to pass the whole thing) /// @param[in] my_fields Specifies the current values of the field data -/// @param[in] my_uvb_rates specifies precomputed rxn rates dependent on the -/// UV background, without accounting for self-shield (we probably don't -/// need to pass the whole thing since we also pass kshield_buf) /// @param[in] rxn_rate_buf specifies the precomputed rxn rates (depends on /// local physical conditions) /// @@ -108,7 +105,7 @@ inline void species_density_updates_gauss_seidel( const double* dtit, gr_mask_type anydust, const double* rhoH, const gr_mask_type* itmask, const gr_mask_type* itmask_metal, const chemistry_data* my_chemistry, grackle_field_data* my_fields, - photo_rate_storage my_uvb_rates, const FullRxnRateBuf rxn_rate_buf + const FullRxnRateBuf rxn_rate_buf ) { @@ -675,7 +672,7 @@ inline void species_density_updates_gauss_seidel( acoef = (kcol_buf[CollisionalRxnLUT::k8][i] + kcol_buf[CollisionalRxnLUT::k15][i]) * HI(i,j,k) + (kcol_buf[CollisionalRxnLUT::k16][i] + kcol_buf[CollisionalRxnLUT::k17][i]) * HII(i,j,k) + kcol_buf[CollisionalRxnLUT::k14][i] * de(i,j,k) + kcol_buf[CollisionalRxnLUT::k19][i] * H2II(i,j,k)/2.0f + - my_uvb_rates.k27; + kshield_buf.k27[i]; #ifdef CONTRIBUTION_OF_MINOR_SPECIES if (my_chemistry->primordial_chemistry > 2) { acoef = acoef @@ -1459,8 +1456,6 @@ inline void species_density_updates_gauss_seidel( /// @param[in] my_chemistry Provides various runtime parameters (we probably /// don't need to pass the whole thing) /// @param[in] my_fields Specifies field data -/// @param[in] my_uvb_rates specifies precomputed rxn rates dependent on the -/// UV background /// @param[in] rxn_rate_buf specifies the precomputed rxn rates (depends on /// local physical conditions) /// @@ -1489,7 +1484,7 @@ inline void species_density_derivatives_0d( grackle::impl::SpeciesCollection deriv, gr_mask_type anydust, const double* rhoH, const gr_mask_type* itmask_metal, const chemistry_data* my_chemistry, const grackle_field_data* my_fields, - const photo_rate_storage my_uvb_rates, const FullRxnRateBuf rxn_rate_buf + const FullRxnRateBuf rxn_rate_buf ) { // define some local variables carried over from the fortran version: @@ -2032,7 +2027,7 @@ inline void species_density_derivatives_0d( acoef = (kcol_buf[CollisionalRxnLUT::k8][0] + kcol_buf[CollisionalRxnLUT::k15][0] ) * HI + (kcol_buf[CollisionalRxnLUT::k16][0] + kcol_buf[CollisionalRxnLUT::k17][0] ) * HII + kcol_buf[CollisionalRxnLUT::k14][0] * de + kcol_buf[CollisionalRxnLUT::k19][0] * H2II /2.0f + - my_uvb_rates.k27; + kshield_buf.k27[0]; // contribution of minor species if (my_chemistry->primordial_chemistry > 2) { acoef = acoef diff --git a/src/clib/lookup_cool_rates1d.hpp b/src/clib/lookup_cool_rates1d.hpp index 296971bd9..5de7a532f 100644 --- a/src/clib/lookup_cool_rates1d.hpp +++ b/src/clib/lookup_cool_rates1d.hpp @@ -841,12 +841,23 @@ inline void lookup_cool_rates1d( for (int i = idx_range.i_start; i < idx_range.i_stop; i++) { if (itmask[i] != MASK_FALSE) { + // historically, k27 was treated as a special case: + // - At this time, k27 is always the same everywhere. So we could pass the + // unmodified scalar value rather than use a 1D array + // - For simpler bookkeeping & clarity, we choose to handle k27 using a 1D + // array all other reaction rates (radiative & otherwise). + // - For now, the performance benefits from special treatment would be + // marginal (it is always used with at least ~30 other rates) + rxn_rate_buf.radiative.k27[i] = my_uvb_rates.k27; + + // handle cases that may be corrected rxn_rate_buf.radiative.k24[i] = my_uvb_rates.k24; rxn_rate_buf.radiative.k25[i] = my_uvb_rates.k25; rxn_rate_buf.radiative.k26[i] = my_uvb_rates.k26; rxn_rate_buf.radiative.k28[i] = my_uvb_rates.k28; rxn_rate_buf.radiative.k29[i] = my_uvb_rates.k29; rxn_rate_buf.radiative.k30[i] = my_uvb_rates.k30; + // k31 is handled separately } } diff --git a/src/clib/solve_rate_cool_g-cpp.cpp b/src/clib/solve_rate_cool_g-cpp.cpp index 104b4e592..ae75e238d 100644 --- a/src/clib/solve_rate_cool_g-cpp.cpp +++ b/src/clib/solve_rate_cool_g-cpp.cpp @@ -886,7 +886,7 @@ int solve_rate_cool_g( grackle::impl::step_rate_gauss_seidel( dtit.data(), idx_range, anydust, rhoH.data(), spsolvbuf.dedot_prev, spsolvbuf.HIdot_prev, spsolvbuf.itmask_gs, - itmask_metal.data(), my_chemistry, my_fields, *my_uvb_rates, + itmask_metal.data(), my_chemistry, my_fields, spsolvbuf.species_tmpdens, spsolvbuf.rxn_rate_buf ); diff --git a/src/clib/step_rate_gauss_seidel.hpp b/src/clib/step_rate_gauss_seidel.hpp index 756cc8e22..0b2a3f679 100644 --- a/src/clib/step_rate_gauss_seidel.hpp +++ b/src/clib/step_rate_gauss_seidel.hpp @@ -235,7 +235,7 @@ inline void step_rate_gauss_seidel( const double* rhoH, double* dedot_prev, double* HIdot_prev, const gr_mask_type* itmask, const gr_mask_type* itmask_metal, chemistry_data* my_chemistry, - grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, + grackle_field_data* my_fields, grackle::impl::SpeciesCollection species_tmpdens, const FullRxnRateBuf rxn_rate_buf ) { @@ -244,7 +244,7 @@ inline void step_rate_gauss_seidel( // end of the current timestep. The results are saved in species_tmpdens grackle::impl::chemistry::species_density_updates_gauss_seidel( species_tmpdens, idx_range, dtit, anydust, rhoH, itmask, - itmask_metal, my_chemistry, my_fields, my_uvb_rates, rxn_rate_buf); + itmask_metal, my_chemistry, my_fields, rxn_rate_buf); // update the entries from my_fields with the values in species_tmpdens update_fields_from_tmpdens_gauss_seidel( diff --git a/src/clib/time_deriv_0d.hpp b/src/clib/time_deriv_0d.hpp index 36fd43f70..1527e31c2 100644 --- a/src/clib/time_deriv_0d.hpp +++ b/src/clib/time_deriv_0d.hpp @@ -533,7 +533,7 @@ void derivatives( gr_chem::species_density_derivatives_0d( rhosp_dot, pack.fwd_args.anydust, pack.other_scratch_buf.rhoH, - &pack.local_itmask_metal, my_chemistry, &pack.fields, my_uvb_rates, + &pack.local_itmask_metal, my_chemistry, &pack.fields, pack.main_scratch_buf.rxn_rate_buf ); } From 1dc0820893513d2ca261f6a58f9bd7479e2e65f8 Mon Sep 17 00:00:00 2001 From: Matthew Abruzzo Date: Thu, 15 Jan 2026 18:27:20 -0500 Subject: [PATCH 30/31] variable renaming: kshield_buf -> kph_buf The change in the names reflect the variable now generically references any standard photo-rate (not just rates adjusted for shielding) --- src/clib/chemistry_solver_funcs.hpp | 94 ++++++++++++++--------------- src/clib/lookup_cool_rates1d.hpp | 84 +++++++++++++------------- src/clib/rate_timestep_g.cpp | 20 +++--- 3 files changed, 99 insertions(+), 99 deletions(-) diff --git a/src/clib/chemistry_solver_funcs.hpp b/src/clib/chemistry_solver_funcs.hpp index 3f1cb14c4..2750c72e5 100644 --- a/src/clib/chemistry_solver_funcs.hpp +++ b/src/clib/chemistry_solver_funcs.hpp @@ -176,7 +176,7 @@ inline void species_density_updates_gauss_seidel( // locals const double* const* kcol_buf = FullRxnRateBuf_kcol_bufs(&rxn_rate_buf); - const PhotoRxnRateCollection kshield_buf = rxn_rate_buf.radiative; + const PhotoRxnRateCollection kph_buf = rxn_rate_buf.radiative; const double* const* grain_growth_rates = FullRxnRateBuf_grain_growth_bufs(&rxn_rate_buf); const double* h2dust = FullRxnRateBuf_h2dust(&rxn_rate_buf); @@ -199,7 +199,7 @@ inline void species_density_updates_gauss_seidel( acoef = kcol_buf[CollisionalRxnLUT::k1][i]*de(i,j,k) + kcol_buf[CollisionalRxnLUT::k57][i]*HI(i,j,k) + kcol_buf[CollisionalRxnLUT::k58][i]*HeI(i,j,k)/4. - + kshield_buf.k24[i]; + + kph_buf.k24[i]; if (my_chemistry->use_radiative_transfer == 1) { acoef = acoef + kphHI(i,j,k); } out_spdens.data[SpLUT::HI][i] = (scoef*dtit[i] + HI(i,j,k))/ (1. + acoef*dtit[i]); @@ -226,7 +226,7 @@ inline void species_density_updates_gauss_seidel( scoef = kcol_buf[CollisionalRxnLUT::k1][i]*out_spdens.data[SpLUT::HI][i]*de(i,j,k) + kcol_buf[CollisionalRxnLUT::k57][i]*out_spdens.data[SpLUT::HI][i]*out_spdens.data[SpLUT::HI][i] + kcol_buf[CollisionalRxnLUT::k58][i]*out_spdens.data[SpLUT::HI][i]*HeI(i,j,k)/4. - + kshield_buf.k24[i]*out_spdens.data[SpLUT::HI][i]; + + kph_buf.k24[i]*out_spdens.data[SpLUT::HI][i]; if (my_chemistry->use_radiative_transfer == 1) { scoef = scoef + kphHI(i,j,k)*out_spdens.data[SpLUT::HI][i]; } acoef = kcol_buf[CollisionalRxnLUT::k2][i]*de (i,j,k); @@ -250,7 +250,7 @@ inline void species_density_updates_gauss_seidel( de ( i, j, k ), kphHI ( i, j, k ), out_spdens.data[SpLUT::HI] [ i ], - kshield_buf.k24 [ i ]); + kph_buf.k24 [ i ]); } } @@ -259,9 +259,9 @@ inline void species_density_updates_gauss_seidel( scoef = 0. + kcol_buf[CollisionalRxnLUT::k57][i]*out_spdens.data[SpLUT::HI][i]*out_spdens.data[SpLUT::HI][i] + kcol_buf[CollisionalRxnLUT::k58][i]*out_spdens.data[SpLUT::HI][i]*HeI(i,j,k)/4. - + kshield_buf.k24[i]*HI(i,j,k) - + kshield_buf.k25[i]*HeII(i,j,k)/4. - + kshield_buf.k26[i]*HeI(i,j,k)/4.; + + kph_buf.k24[i]*HI(i,j,k) + + kph_buf.k25[i]*HeII(i,j,k)/4. + + kph_buf.k26[i]*HeI(i,j,k)/4.; if ( (my_chemistry->use_radiative_transfer == 1) && ( my_chemistry->radiative_transfer_hydrogen_only == 0) ) { scoef = scoef + kphHI(i,j,k) * HI(i,j,k) @@ -294,7 +294,7 @@ inline void species_density_updates_gauss_seidel( scoef = kcol_buf[CollisionalRxnLUT::k4][i]*HeII(i,j,k)*de(i,j,k); acoef = kcol_buf[CollisionalRxnLUT::k3][i]*de(i,j,k) - + kshield_buf.k26[i]; + + kph_buf.k26[i]; if ( (my_chemistry->use_radiative_transfer == 1) && (my_chemistry->radiative_transfer_hydrogen_only == 0)) { acoef = acoef + kphHeI(i,j,k); } @@ -315,13 +315,13 @@ inline void species_density_updates_gauss_seidel( scoef = kcol_buf[CollisionalRxnLUT::k3][i]*out_spdens.data[SpLUT::HeI][i]*de(i,j,k) + kcol_buf[CollisionalRxnLUT::k6][i]*HeIII(i,j,k)*de(i,j,k) - + kshield_buf.k26[i]*out_spdens.data[SpLUT::HeI][i]; + + kph_buf.k26[i]*out_spdens.data[SpLUT::HeI][i]; if ( (my_chemistry->use_radiative_transfer == 1) && (my_chemistry->radiative_transfer_hydrogen_only == 0)) { scoef = scoef + kphHeI(i,j,k)*out_spdens.data[SpLUT::HeI][i]; } acoef = kcol_buf[CollisionalRxnLUT::k4][i]*de(i,j,k) + kcol_buf[CollisionalRxnLUT::k5][i]*de(i,j,k) - + kshield_buf.k25[i]; + + kph_buf.k25[i]; if ( (my_chemistry->use_radiative_transfer == 1) && (my_chemistry->radiative_transfer_hydrogen_only == 0)) { acoef = acoef + kphHeII(i,j,k); } @@ -335,7 +335,7 @@ inline void species_density_updates_gauss_seidel( // 6) HeIII scoef = kcol_buf[CollisionalRxnLUT::k5][i]*out_spdens.data[SpLUT::HeII][i]*de(i,j,k) - + kshield_buf.k25[i]*out_spdens.data[SpLUT::HeII][i]; + + kph_buf.k25[i]*out_spdens.data[SpLUT::HeII][i]; if ((my_chemistry->use_radiative_transfer == 1) && (my_chemistry->radiative_transfer_hydrogen_only == 0)) { scoef = scoef + kphHeII(i,j,k) * out_spdens.data[SpLUT::HeII][i]; } acoef = kcol_buf[CollisionalRxnLUT::k6][i]*de(i,j,k); @@ -364,7 +364,7 @@ inline void species_density_updates_gauss_seidel( + 2.*kcol_buf[CollisionalRxnLUT::k16][i]* HM(i,j,k) * HII(i,j,k) + 2.*kcol_buf[CollisionalRxnLUT::k18][i]* H2II(i,j,k)* de(i,j,k)/2. + kcol_buf[CollisionalRxnLUT::k19][i]* H2II(i,j,k)* HM(i,j,k)/2. - + 2.*kshield_buf.k31[i] * H2I(i,j,k)/2.; + + 2.*kph_buf.k31[i] * H2I(i,j,k)/2.; acoef = kcol_buf[CollisionalRxnLUT::k1][i] * de(i,j,k) + kcol_buf[CollisionalRxnLUT::k7][i] * de(i,j,k) @@ -374,7 +374,7 @@ inline void species_density_updates_gauss_seidel( + 2.*kcol_buf[CollisionalRxnLUT::k22][i]* std::pow(HI(i,j,k),2) + kcol_buf[CollisionalRxnLUT::k57][i]* HI(i,j,k) + kcol_buf[CollisionalRxnLUT::k58][i]* HeI(i,j,k)/4. - + kshield_buf.k24[i]; + + kph_buf.k24[i]; if (my_chemistry->use_radiative_transfer == 1) { acoef = acoef + kphHI(i,j,k); } if (my_chemistry->use_radiative_transfer == 1) { @@ -482,7 +482,7 @@ inline void species_density_updates_gauss_seidel( + kcol_buf[CollisionalRxnLUT::k10][i] * H2II(i,j,k)*HI(i,j,k)/2. + kcol_buf[CollisionalRxnLUT::k57][i] * HI(i,j,k) * HI(i,j,k) + kcol_buf[CollisionalRxnLUT::k58][i] * HI(i,j,k) * HeI(i,j,k)/4. - + kshield_buf.k24[i]*HI(i,j,k); + + kph_buf.k24[i]*HI(i,j,k); if (my_chemistry->use_radiative_transfer == 1) { scoef = scoef + kphHI(i,j,k) * HI(i,j,k); } @@ -534,9 +534,9 @@ inline void species_density_updates_gauss_seidel( + kcol_buf[CollisionalRxnLUT::k57][i]* HI(i,j,k) * HI(i,j,k) + kcol_buf[CollisionalRxnLUT::k58][i]* HI(i,j,k) * HeI(i,j,k)/4. // - + kshield_buf.k24[i]*out_spdens.data[SpLUT::HI][i] - + kshield_buf.k25[i]*out_spdens.data[SpLUT::HeII][i]/4. - + kshield_buf.k26[i]*out_spdens.data[SpLUT::HeI][i]/4.; + + kph_buf.k24[i]*out_spdens.data[SpLUT::HI][i] + + kph_buf.k25[i]*out_spdens.data[SpLUT::HeII][i]/4. + + kph_buf.k26[i]*out_spdens.data[SpLUT::HeI][i]/4.; if ( (my_chemistry->use_radiative_transfer == 1) && (my_chemistry->radiative_transfer_hydrogen_only == 0) ) { scoef = scoef + kphHI(i,j,k) * out_spdens.data[SpLUT::HI][i] @@ -606,7 +606,7 @@ inline void species_density_updates_gauss_seidel( + kcol_buf[CollisionalRxnLUT::k22][i] * HI(i,j,k) * std::pow((HI(i,j,k)),2.)); acoef = ( kcol_buf[CollisionalRxnLUT::k13][i]*HI(i,j,k) + kcol_buf[CollisionalRxnLUT::k11][i]*HII(i,j,k) + kcol_buf[CollisionalRxnLUT::k12][i]*de(i,j,k) ) - + kshield_buf.k29[i] + kshield_buf.k31[i]; + + kph_buf.k29[i] + kph_buf.k31[i]; if (anydust != MASK_FALSE) { if(itmask_metal[i] != MASK_FALSE) { @@ -672,7 +672,7 @@ inline void species_density_updates_gauss_seidel( acoef = (kcol_buf[CollisionalRxnLUT::k8][i] + kcol_buf[CollisionalRxnLUT::k15][i]) * HI(i,j,k) + (kcol_buf[CollisionalRxnLUT::k16][i] + kcol_buf[CollisionalRxnLUT::k17][i]) * HII(i,j,k) + kcol_buf[CollisionalRxnLUT::k14][i] * de(i,j,k) + kcol_buf[CollisionalRxnLUT::k19][i] * H2II(i,j,k)/2.0f + - kshield_buf.k27[i]; + kph_buf.k27[i]; #ifdef CONTRIBUTION_OF_MINOR_SPECIES if (my_chemistry->primordial_chemistry > 2) { acoef = acoef @@ -694,22 +694,22 @@ inline void species_density_updates_gauss_seidel( out_spdens.data[SpLUT::H2II][i] = 2.*( kcol_buf[CollisionalRxnLUT::k9] [i]*out_spdens.data[SpLUT::HI][i]*out_spdens.data[SpLUT::HII][i] + kcol_buf[CollisionalRxnLUT::k11][i]*out_spdens.data[SpLUT::H2I][i]/2.*out_spdens.data[SpLUT::HII][i] + kcol_buf[CollisionalRxnLUT::k17][i]*out_spdens.data[SpLUT::HM][i]*out_spdens.data[SpLUT::HII][i] - + kshield_buf.k29[i]*out_spdens.data[SpLUT::H2I][i] + + kph_buf.k29[i]*out_spdens.data[SpLUT::H2I][i] ) / ( kcol_buf[CollisionalRxnLUT::k10][i]*out_spdens.data[SpLUT::HI][i] + kcol_buf[CollisionalRxnLUT::k18][i]*out_spdens.data[SpLUT::e][i] + kcol_buf[CollisionalRxnLUT::k19][i]*out_spdens.data[SpLUT::HM][i] - + (kshield_buf.k28[i]+kshield_buf.k30[i]) + + (kph_buf.k28[i]+kph_buf.k30[i]) ); if (my_chemistry->primordial_chemistry > 3) { out_spdens.data[SpLUT::H2II][i] = 2. * ( kcol_buf[CollisionalRxnLUT::k9] [i]*out_spdens.data[SpLUT::HI][i]*out_spdens.data[SpLUT::HII][i] + kcol_buf[CollisionalRxnLUT::k11][i]*out_spdens.data[SpLUT::H2I][i]/2.*out_spdens.data[SpLUT::HII][i] + kcol_buf[CollisionalRxnLUT::k17][i]*out_spdens.data[SpLUT::HM][i]*out_spdens.data[SpLUT::HII][i] - + kshield_buf.k29[i]*out_spdens.data[SpLUT::H2I][i] + + kph_buf.k29[i]*out_spdens.data[SpLUT::H2I][i] + kcol_buf[CollisionalRxnLUT::k152][i]*HeHII(i,j,k)*out_spdens.data[SpLUT::HI][i]/5. ) / ( kcol_buf[CollisionalRxnLUT::k10][i]*out_spdens.data[SpLUT::HI][i] + kcol_buf[CollisionalRxnLUT::k18][i]*out_spdens.data[SpLUT::e][i] + kcol_buf[CollisionalRxnLUT::k19][i]*out_spdens.data[SpLUT::HM][i] - + (kshield_buf.k28[i]+kshield_buf.k30[i]) + + (kph_buf.k28[i]+kph_buf.k30[i]) + kcol_buf[CollisionalRxnLUT::k150][i]*out_spdens.data[SpLUT::HeI][i]/4. ); } @@ -733,7 +733,7 @@ inline void species_density_updates_gauss_seidel( + kcol_buf[CollisionalRxnLUT::k50][i] * HII(i,j,k) + kcol_buf[CollisionalRxnLUT::k54][i] * H2I(i,j,k)/2. + kcol_buf[CollisionalRxnLUT::k56][i] * HM(i,j,k) - + kshield_buf.k24[i]; + + kph_buf.k24[i]; if (my_chemistry->use_radiative_transfer == 1) { acoef = acoef + kphHI(i,j,k); } if (my_chemistry->primordial_chemistry > 3) { scoef = scoef + 2. * ( 0. @@ -761,7 +761,7 @@ inline void species_density_updates_gauss_seidel( + kcol_buf[CollisionalRxnLUT::k50][i] * HII(i,j,k)* DI(i,j,k) + 2.*kcol_buf[CollisionalRxnLUT::k53][i] * HII(i,j,k)* HDI(i,j,k)/3. ) - + kshield_buf.k24[i]*DI(i,j,k); + + kph_buf.k24[i]*DI(i,j,k); acoef = 0.; // ! initialize GC202002 if (my_chemistry->use_radiative_transfer == 1) { scoef = scoef + kphHI(i,j,k)*DI(i,j,k); } @@ -1552,7 +1552,7 @@ inline void species_density_derivatives_0d( gr_float& H2Oice = my_fields->H2O_ice_dust_density[0]; const double* const* kcol_buf = FullRxnRateBuf_kcol_bufs(&rxn_rate_buf); - const PhotoRxnRateCollection kshield_buf = rxn_rate_buf.radiative; + const PhotoRxnRateCollection kph_buf = rxn_rate_buf.radiative; const double* const* grain_growth_rates = FullRxnRateBuf_grain_growth_bufs(&rxn_rate_buf); const double* h2dust = FullRxnRateBuf_h2dust(&rxn_rate_buf); @@ -1571,7 +1571,7 @@ inline void species_density_derivatives_0d( acoef = kcol_buf[CollisionalRxnLUT::k1][0] *de + kcol_buf[CollisionalRxnLUT::k57][0] *HI + kcol_buf[CollisionalRxnLUT::k58][0] *HeI /4. - + kshield_buf.k24[0]; + + kph_buf.k24[0]; if (my_chemistry->use_radiative_transfer == 1) { acoef = acoef + *(my_fields->RT_HI_ionization_rate); } deriv.data[SpLUT::HI][0] = deriv.data[SpLUT::HI][0] + (scoef - acoef * HI); @@ -1592,7 +1592,7 @@ inline void species_density_derivatives_0d( scoef = kcol_buf[CollisionalRxnLUT::k1][0] *HI *de + kcol_buf[CollisionalRxnLUT::k57][0] *HI *HI + kcol_buf[CollisionalRxnLUT::k58][0] *HI *HeI /4. - + kshield_buf.k24[0] *HI; + + kph_buf.k24[0] *HI; if (my_chemistry->use_radiative_transfer == 1) { scoef = scoef + *(my_fields->RT_HI_ionization_rate) *HI; } acoef = kcol_buf[CollisionalRxnLUT::k2][0] *de; @@ -1618,9 +1618,9 @@ inline void species_density_derivatives_0d( scoef = 0. + kcol_buf[CollisionalRxnLUT::k57][0] *HI *HI + kcol_buf[CollisionalRxnLUT::k58][0] *HI *HeI /4. - + kshield_buf.k24[0] *HI - + kshield_buf.k25[0] *HeII /4. - + kshield_buf.k26[0] *HeI /4.; + + kph_buf.k24[0] *HI + + kph_buf.k25[0] *HeII /4. + + kph_buf.k26[0] *HeI /4.; if ( (my_chemistry->use_radiative_transfer == 1) && ( my_chemistry->radiative_transfer_hydrogen_only == 0) ) { scoef = scoef + *(my_fields->RT_HI_ionization_rate) * HI @@ -1653,7 +1653,7 @@ inline void species_density_derivatives_0d( scoef = kcol_buf[CollisionalRxnLUT::k4][0] *HeII *de; acoef = kcol_buf[CollisionalRxnLUT::k3][0] *de - + kshield_buf.k26[0]; + + kph_buf.k26[0]; if ( (my_chemistry->use_radiative_transfer == 1) && (my_chemistry->radiative_transfer_hydrogen_only == 0)) { acoef = acoef + *(my_fields->RT_HeI_ionization_rate); } @@ -1674,13 +1674,13 @@ inline void species_density_derivatives_0d( scoef = kcol_buf[CollisionalRxnLUT::k3][0] *HeI *de + kcol_buf[CollisionalRxnLUT::k6][0] *HeIII *de - + kshield_buf.k26[0] *HeI; + + kph_buf.k26[0] *HeI; if ( (my_chemistry->use_radiative_transfer == 1) && (my_chemistry->radiative_transfer_hydrogen_only == 0)) { scoef = scoef + *(my_fields->RT_HeI_ionization_rate) *HeI; } acoef = kcol_buf[CollisionalRxnLUT::k4][0] *de + kcol_buf[CollisionalRxnLUT::k5][0] *de - + kshield_buf.k25[0]; + + kph_buf.k25[0]; if ( (my_chemistry->use_radiative_transfer == 1) && (my_chemistry->radiative_transfer_hydrogen_only == 0)) { acoef = acoef + *(my_fields->RT_HeII_ionization_rate); } @@ -1694,7 +1694,7 @@ inline void species_density_derivatives_0d( // 6) HeIII scoef = kcol_buf[CollisionalRxnLUT::k5][0] *HeII *de - + kshield_buf.k25[0] *HeII; + + kph_buf.k25[0] *HeII; if ((my_chemistry->use_radiative_transfer == 1) && (my_chemistry->radiative_transfer_hydrogen_only == 0)) { scoef = scoef + *(my_fields->RT_HeII_ionization_rate) * HeII; } acoef = kcol_buf[CollisionalRxnLUT::k6][0] *de; @@ -1723,7 +1723,7 @@ inline void species_density_derivatives_0d( + 2.*kcol_buf[CollisionalRxnLUT::k16][0] * HM * HII + 2.*kcol_buf[CollisionalRxnLUT::k18][0] * H2II * de /2. + kcol_buf[CollisionalRxnLUT::k19][0] * H2II * HM /2. - + 2.*kshield_buf.k31[0] * H2I /2.; + + 2.*kph_buf.k31[0] * H2I /2.; acoef = kcol_buf[CollisionalRxnLUT::k1][0] * de + kcol_buf[CollisionalRxnLUT::k7][0] * de @@ -1733,7 +1733,7 @@ inline void species_density_derivatives_0d( + 2.*kcol_buf[CollisionalRxnLUT::k22][0] * std::pow(HI ,2) + kcol_buf[CollisionalRxnLUT::k57][0] * HI + kcol_buf[CollisionalRxnLUT::k58][0] * HeI /4. - + kshield_buf.k24[0]; + + kph_buf.k24[0]; if (my_chemistry->use_radiative_transfer == 1) { acoef = acoef + *(my_fields->RT_HI_ionization_rate); } if (my_chemistry->use_radiative_transfer == 1) { @@ -1837,7 +1837,7 @@ inline void species_density_derivatives_0d( + kcol_buf[CollisionalRxnLUT::k10][0] * H2II *HI /2. + kcol_buf[CollisionalRxnLUT::k57][0] * HI * HI + kcol_buf[CollisionalRxnLUT::k58][0] * HI * HeI /4. - + kshield_buf.k24[0] *HI; + + kph_buf.k24[0] *HI; if (my_chemistry->use_radiative_transfer == 1) { scoef = scoef + *(my_fields->RT_HI_ionization_rate) * HI; } @@ -1889,9 +1889,9 @@ inline void species_density_derivatives_0d( + kcol_buf[CollisionalRxnLUT::k57][0] * HI * HI + kcol_buf[CollisionalRxnLUT::k58][0] * HI * HeI /4. // - + kshield_buf.k24[0] *HI - + kshield_buf.k25[0] *HeII /4. - + kshield_buf.k26[0] *HeI /4.; + + kph_buf.k24[0] *HI + + kph_buf.k25[0] *HeII /4. + + kph_buf.k26[0] *HeI /4.; if ( (my_chemistry->use_radiative_transfer == 1) && (my_chemistry->radiative_transfer_hydrogen_only == 0) ) { scoef = scoef + *(my_fields->RT_HI_ionization_rate) * HI @@ -1961,7 +1961,7 @@ inline void species_density_derivatives_0d( + kcol_buf[CollisionalRxnLUT::k22][0] * HI * std::pow((HI ),2.)); acoef = ( kcol_buf[CollisionalRxnLUT::k13][0] *HI + kcol_buf[CollisionalRxnLUT::k11][0] *HII + kcol_buf[CollisionalRxnLUT::k12][0] *de ) - + kshield_buf.k29[0] + kshield_buf.k31[0]; + + kph_buf.k29[0] + kph_buf.k31[0]; if (anydust != MASK_FALSE) { if(itmask_metal[0] != MASK_FALSE ) { @@ -2027,7 +2027,7 @@ inline void species_density_derivatives_0d( acoef = (kcol_buf[CollisionalRxnLUT::k8][0] + kcol_buf[CollisionalRxnLUT::k15][0] ) * HI + (kcol_buf[CollisionalRxnLUT::k16][0] + kcol_buf[CollisionalRxnLUT::k17][0] ) * HII + kcol_buf[CollisionalRxnLUT::k14][0] * de + kcol_buf[CollisionalRxnLUT::k19][0] * H2II /2.0f + - kshield_buf.k27[0]; + kph_buf.k27[0]; // contribution of minor species if (my_chemistry->primordial_chemistry > 2) { acoef = acoef @@ -2049,11 +2049,11 @@ inline void species_density_derivatives_0d( scoef = 2.*( kcol_buf[CollisionalRxnLUT::k9][0] *HI *HII + kcol_buf[CollisionalRxnLUT::k11][0] *H2I /2.*HII + kcol_buf[CollisionalRxnLUT::k17][0] *HM *HII - + kshield_buf.k29[0] *H2I /2. + + kph_buf.k29[0] *H2I /2. ); acoef = kcol_buf[CollisionalRxnLUT::k10][0] *HI + kcol_buf[CollisionalRxnLUT::k18][0] *de + kcol_buf[CollisionalRxnLUT::k19][0] *HM - + (kshield_buf.k28[0] +kshield_buf.k30[0] ); + + (kph_buf.k28[0] +kph_buf.k30[0] ); if (my_chemistry->primordial_chemistry > 3) { scoef = scoef + 2. * ( 0. + kcol_buf[CollisionalRxnLUT::k152][0] * HeHII * HI / 5. @@ -2088,7 +2088,7 @@ inline void species_density_derivatives_0d( + kcol_buf[CollisionalRxnLUT::k50][0] * HII + kcol_buf[CollisionalRxnLUT::k54][0] * H2I /2. + kcol_buf[CollisionalRxnLUT::k56][0] * HM - + kshield_buf.k24[0]; + + kph_buf.k24[0]; if (my_chemistry->use_radiative_transfer == 1) { acoef = acoef + *(my_fields->RT_HI_ionization_rate); } if (my_chemistry->primordial_chemistry > 3) { scoef = scoef + 2. * ( 0. @@ -2116,7 +2116,7 @@ inline void species_density_derivatives_0d( + kcol_buf[CollisionalRxnLUT::k50][0] * HII * DI + 2.*kcol_buf[CollisionalRxnLUT::k53][0] * HII * HDI /3. ) - + kshield_buf.k24[0] *DI; + + kph_buf.k24[0] *DI; acoef = 0.; // ! initialize GC202002 if (my_chemistry->use_radiative_transfer == 1) { scoef = scoef + *(my_fields->RT_HI_ionization_rate) *DI; } diff --git a/src/clib/lookup_cool_rates1d.hpp b/src/clib/lookup_cool_rates1d.hpp index 5de7a532f..d81373a72 100644 --- a/src/clib/lookup_cool_rates1d.hpp +++ b/src/clib/lookup_cool_rates1d.hpp @@ -51,7 +51,7 @@ void secondary_ionization_adjustments( IndexRange idx_range, const gr_mask_type* itmask, grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, InternalGrUnits internalu, - grackle::impl::PhotoRxnRateCollection kshield_buf) { + grackle::impl::PhotoRxnRateCollection kph_buf) { // construct views of HI_density & HII_density fields grackle::impl::View HI( my_fields->HI_density, my_fields->grid_dimension[0], @@ -71,13 +71,13 @@ void secondary_ionization_adjustments( HII(i, idx_range.j, idx_range.k)), 1.0e-4); double factor = 0.3908 * std::pow((1. - std::pow(x, 0.4092)), 1.7592); - kshield_buf.k24[i] = - kshield_buf.k24[i] + + kph_buf.k24[i] = + kph_buf.k24[i] + factor * (my_uvb_rates.piHI + 0.08 * my_uvb_rates.piHeI) / (e24 * everg) * internalu.coolunit * internalu.tbase1; factor = 0.0554 * std::pow((1. - std::pow(x, 0.4614)), 1.6660); - kshield_buf.k26[i] = - kshield_buf.k26[i] + + kph_buf.k26[i] = + kph_buf.k26[i] + factor * (my_uvb_rates.piHI / 0.08 + my_uvb_rates.piHeI) / (e26 * everg) * internalu.coolunit * internalu.tbase1; } @@ -280,7 +280,7 @@ inline void interpolate_collisional_rxn_rates_( /// adjust the rate of neutral H2 photodissoication by modelling self-shielding inline void model_H2I_dissociation_shielding( - grackle::impl::PhotoRxnRateCollection kshield_buf, IndexRange idx_range, + grackle::impl::PhotoRxnRateCollection kph_buf, IndexRange idx_range, const double* tgas1d, const double* mmw, double dom, double dx_cgs, double c_ljeans, const gr_mask_type* itmask, chemistry_data* my_chemistry, grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, @@ -316,13 +316,13 @@ inline void model_H2I_dissociation_shielding( my_chemistry->radiative_transfer_use_H2_shielding == 1) { for (int i = idx_range.i_start; i < idx_range.i_stop; i++) { if (itmask[i] != MASK_FALSE) { - kshield_buf.k31[i] = my_uvb_rates.k31; + kph_buf.k31[i] = my_uvb_rates.k31; } } } else { for (int i = idx_range.i_start; i < idx_range.i_stop; i++) { if (itmask[i] != MASK_FALSE) { - kshield_buf.k31[i] = + kph_buf.k31[i] = my_uvb_rates.k31 + kdissH2I(i, idx_range.j, idx_range.k); } } @@ -398,7 +398,7 @@ inline void model_H2I_dissociation_shielding( // avoid f>1 f_shield = std::fmin(f_shield, 1.); - kshield_buf.k31[i] = f_shield * kshield_buf.k31[i]; + kph_buf.k31[i] = f_shield * kph_buf.k31[i]; } } } @@ -409,8 +409,8 @@ inline void model_H2I_dissociation_shielding( // write(*,*) 'kdissH2I included' for (int i = idx_range.i_start; i < idx_range.i_stop; i++) { if (itmask[i] != MASK_FALSE) { - kshield_buf.k31[i] = - kshield_buf.k31[i] + kdissH2I(i, idx_range.j, idx_range.k); + kph_buf.k31[i] = + kph_buf.k31[i] + kdissH2I(i, idx_range.j, idx_range.k); } } } @@ -424,8 +424,8 @@ inline void model_H2I_dissociation_shielding( for (int i = idx_range.i_start; i < idx_range.i_stop; i++) { if (itmask[i] != MASK_FALSE) { - kshield_buf.k31[i] = - f_shield_custom(i, idx_range.j, idx_range.k) * kshield_buf.k31[i]; + kph_buf.k31[i] = + f_shield_custom(i, idx_range.j, idx_range.k) * kph_buf.k31[i]; } } } @@ -574,7 +574,7 @@ inline ShieldFactor calc_shield_factor(const ShieldFactorCalculator* calc, /// The caller should ensure that the value of `idx_range` passed to this /// function matches the value that was used to construct `calculator` inline void apply_misc_shield_factors( - grackle::impl::PhotoRxnRateCollection kshield_buf, IndexRange idx_range, + grackle::impl::PhotoRxnRateCollection kph_buf, IndexRange idx_range, const gr_mask_type* itmask, int self_shielding_method, photo_rate_storage my_uvb_rates, const ShieldFactorCalculator* calculator) { if (self_shielding_method == 1) { @@ -588,20 +588,20 @@ inline void apply_misc_shield_factors( if (itmask[i] != MASK_FALSE) { ShieldFactor tmp = calc_shield_factor(calculator, i); if (my_uvb_rates.k24 < tiny8) { - kshield_buf.k24[i] = 0.; + kph_buf.k24[i] = 0.; } else { - kshield_buf.k24[i] = kshield_buf.k24[i] * tmp.f_shield_H; + kph_buf.k24[i] = kph_buf.k24[i] * tmp.f_shield_H; } // Scale H2 direct ionization radiation if (my_uvb_rates.k29 < tiny8) { - kshield_buf.k29[i] = 0.; + kph_buf.k29[i] = 0.; } else { - kshield_buf.k29[i] = kshield_buf.k29[i] * tmp.f_shield_H; + kph_buf.k29[i] = kph_buf.k29[i] * tmp.f_shield_H; } - kshield_buf.k25[i] = my_uvb_rates.k25; - kshield_buf.k26[i] = my_uvb_rates.k26; + kph_buf.k25[i] = my_uvb_rates.k25; + kph_buf.k26[i] = my_uvb_rates.k26; } } @@ -620,40 +620,40 @@ inline void apply_misc_shield_factors( if (itmask[i] != MASK_FALSE) { ShieldFactor tmp = calc_shield_factor(calculator, i); if (my_uvb_rates.k24 < tiny8) { - kshield_buf.k24[i] = 0.; + kph_buf.k24[i] = 0.; } else { - kshield_buf.k24[i] = kshield_buf.k24[i] * tmp.f_shield_H; + kph_buf.k24[i] = kph_buf.k24[i] * tmp.f_shield_H; } // Scale H2 direct ionization radiation if (my_uvb_rates.k29 < tiny8) { - kshield_buf.k29[i] = 0.; + kph_buf.k29[i] = 0.; } else { - kshield_buf.k29[i] = kshield_buf.k29[i] * tmp.f_shield_H; + kph_buf.k29[i] = kph_buf.k29[i] * tmp.f_shield_H; } // Apply same equations to HeI (assumes HeI closely follows HI) if (my_uvb_rates.k26 < tiny8) { - kshield_buf.k26[i] = 0.; + kph_buf.k26[i] = 0.; } else { - kshield_buf.k26[i] = kshield_buf.k26[i] * tmp.f_shield_He; + kph_buf.k26[i] = kph_buf.k26[i] * tmp.f_shield_He; } // Scale H2+ dissociation radiation if (my_uvb_rates.k28 < tiny8) { - kshield_buf.k28[i] = 0.0; + kph_buf.k28[i] = 0.0; } else { - kshield_buf.k28[i] = kshield_buf.k28[i] * tmp.f_shield_He; + kph_buf.k28[i] = kph_buf.k28[i] * tmp.f_shield_He; } if (my_uvb_rates.k30 < tiny8) { - kshield_buf.k30[i] = 0.0; + kph_buf.k30[i] = 0.0; } else { - kshield_buf.k30[i] = kshield_buf.k30[i] * tmp.f_shield_He; + kph_buf.k30[i] = kph_buf.k30[i] * tmp.f_shield_He; } - kshield_buf.k25[i] = my_uvb_rates.k25; + kph_buf.k25[i] = my_uvb_rates.k25; } } @@ -665,40 +665,40 @@ inline void apply_misc_shield_factors( if (itmask[i] != MASK_FALSE) { ShieldFactor tmp = calc_shield_factor(calculator, i); if (my_uvb_rates.k24 < tiny8) { - kshield_buf.k24[i] = 0.; + kph_buf.k24[i] = 0.; } else { - kshield_buf.k24[i] = kshield_buf.k24[i] * tmp.f_shield_H; + kph_buf.k24[i] = kph_buf.k24[i] * tmp.f_shield_H; } // Scale H2 direct ionization radiation if (my_uvb_rates.k29 < tiny8) { - kshield_buf.k29[i] = 0.; + kph_buf.k29[i] = 0.; } else { - kshield_buf.k29[i] = kshield_buf.k29[i] * tmp.f_shield_H; + kph_buf.k29[i] = kph_buf.k29[i] * tmp.f_shield_H; } // Apply same equations to HeI (assumes HeI closely follows HI) if (my_uvb_rates.k26 < tiny8) { - kshield_buf.k26[i] = 0.; + kph_buf.k26[i] = 0.; } else { - kshield_buf.k26[i] = kshield_buf.k26[i] * tmp.f_shield_He; + kph_buf.k26[i] = kph_buf.k26[i] * tmp.f_shield_He; } // Scale H2+ dissociation radiation if (my_uvb_rates.k28 < tiny8) { - kshield_buf.k28[i] = 0.0; + kph_buf.k28[i] = 0.0; } else { - kshield_buf.k28[i] = kshield_buf.k28[i] * tmp.f_shield_He; + kph_buf.k28[i] = kph_buf.k28[i] * tmp.f_shield_He; } if (my_uvb_rates.k30 < tiny8) { - kshield_buf.k30[i] = 0.0; + kph_buf.k30[i] = 0.0; } else { - kshield_buf.k30[i] = kshield_buf.k30[i] * tmp.f_shield_He; + kph_buf.k30[i] = kph_buf.k30[i] * tmp.f_shield_He; } - kshield_buf.k25[i] = 0.0; + kph_buf.k25[i] = 0.0; } } } diff --git a/src/clib/rate_timestep_g.cpp b/src/clib/rate_timestep_g.cpp index 495d6de0d..2de60d14f 100644 --- a/src/clib/rate_timestep_g.cpp +++ b/src/clib/rate_timestep_g.cpp @@ -116,7 +116,7 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, // locals const double* h2dust = FullRxnRateBuf_h2dust(&rxn_rate_buf); const double* const* kcol_buf = FullRxnRateBuf_kcol_bufs(&rxn_rate_buf); - const PhotoRxnRateCollection kshield_buf = rxn_rate_buf.radiative; + const PhotoRxnRateCollection kph_buf = rxn_rate_buf.radiative; int i; double atten; @@ -153,9 +153,9 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, kcol_buf[CollisionalRxnLUT::k58][i] * HI(i, idx_range.j, idx_range.k) * HeI(i, idx_range.j, idx_range.k) / 4. + - (kshield_buf.k24[i] * HI(i, idx_range.j, idx_range.k) + - kshield_buf.k25[i] * HeII(i, idx_range.j, idx_range.k) / 4. + - kshield_buf.k26[i] * HeI(i, idx_range.j, idx_range.k) / 4.); + (kph_buf.k24[i] * HI(i, idx_range.j, idx_range.k) + + kph_buf.k25[i] * HeII(i, idx_range.j, idx_range.k) / 4. + + kph_buf.k26[i] * HeI(i, idx_range.j, idx_range.k) / 4.); // Compute the HI density rate-of-change @@ -171,7 +171,7 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, kcol_buf[CollisionalRxnLUT::k58][i] * HI(i, idx_range.j, idx_range.k) * HeI(i, idx_range.j, idx_range.k) / 4. - - kshield_buf.k24[i] * HI(i, idx_range.j, idx_range.k); + kph_buf.k24[i] * HI(i, idx_range.j, idx_range.k); } } } else { @@ -231,8 +231,8 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, kcol_buf[CollisionalRxnLUT::k58][i] * HI(i, idx_range.j, idx_range.k) * HeI(i, idx_range.j, idx_range.k) / 4. - - kshield_buf.k24[i] * HI(i, idx_range.j, idx_range.k) + - 2.0 * kshield_buf.k31[i] * H2I(i, idx_range.j, idx_range.k) / 2.0; + kph_buf.k24[i] * HI(i, idx_range.j, idx_range.k) + + 2.0 * kph_buf.k31[i] * H2I(i, idx_range.j, idx_range.k) / 2.0; // Add H2 formation on dust grains @@ -289,9 +289,9 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, kcol_buf[CollisionalRxnLUT::k58][i] * HI(i, idx_range.j, idx_range.k) * HeI(i, idx_range.j, idx_range.k) / 4. + - (kshield_buf.k24[i] * HI(i, idx_range.j, idx_range.k) + - kshield_buf.k25[i] * HeII(i, idx_range.j, idx_range.k) / 4. + - kshield_buf.k26[i] * HeI(i, idx_range.j, idx_range.k) / 4.); + (kph_buf.k24[i] * HI(i, idx_range.j, idx_range.k) + + kph_buf.k25[i] * HeII(i, idx_range.j, idx_range.k) / 4. + + kph_buf.k26[i] * HeI(i, idx_range.j, idx_range.k) / 4.); // HII, HeII, HeIII recombination heating From 9f36c3ebc9b0238aa5ecc24656f42ffa14b396bd Mon Sep 17 00:00:00 2001 From: Matthew Abruzzo Date: Thu, 15 Jan 2026 18:29:21 -0500 Subject: [PATCH 31/31] Apply clang-format This was separated from the prior commit to make review easier --- src/clib/lookup_cool_rates1d.hpp | 6 +- src/clib/rate_timestep_g.cpp | 146 +++++++++++++++---------------- 2 files changed, 74 insertions(+), 78 deletions(-) diff --git a/src/clib/lookup_cool_rates1d.hpp b/src/clib/lookup_cool_rates1d.hpp index d81373a72..99be95bb0 100644 --- a/src/clib/lookup_cool_rates1d.hpp +++ b/src/clib/lookup_cool_rates1d.hpp @@ -50,8 +50,7 @@ namespace grackle::impl { void secondary_ionization_adjustments( IndexRange idx_range, const gr_mask_type* itmask, grackle_field_data* my_fields, photo_rate_storage my_uvb_rates, - InternalGrUnits internalu, - grackle::impl::PhotoRxnRateCollection kph_buf) { + InternalGrUnits internalu, grackle::impl::PhotoRxnRateCollection kph_buf) { // construct views of HI_density & HII_density fields grackle::impl::View HI( my_fields->HI_density, my_fields->grid_dimension[0], @@ -409,8 +408,7 @@ inline void model_H2I_dissociation_shielding( // write(*,*) 'kdissH2I included' for (int i = idx_range.i_start; i < idx_range.i_stop; i++) { if (itmask[i] != MASK_FALSE) { - kph_buf.k31[i] = - kph_buf.k31[i] + kdissH2I(i, idx_range.j, idx_range.k); + kph_buf.k31[i] = kph_buf.k31[i] + kdissH2I(i, idx_range.j, idx_range.k); } } } diff --git a/src/clib/rate_timestep_g.cpp b/src/clib/rate_timestep_g.cpp index 2de60d14f..9dd2588fb 100644 --- a/src/clib/rate_timestep_g.cpp +++ b/src/clib/rate_timestep_g.cpp @@ -128,34 +128,33 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, if (itmask[i] != MASK_FALSE) { // Compute the electron density rate-of-change - dedot[i] = - +kcol_buf[CollisionalRxnLUT::k1][i] * - HI(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) + - kcol_buf[CollisionalRxnLUT::k3][i] * - HeI(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) / 4. + - kcol_buf[CollisionalRxnLUT::k5][i] * - HeII(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) / 4. - - kcol_buf[CollisionalRxnLUT::k2][i] * - HII(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) - - kcol_buf[CollisionalRxnLUT::k4][i] * - HeII(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) / 4. - - kcol_buf[CollisionalRxnLUT::k6][i] * - HeIII(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) / 4. + - kcol_buf[CollisionalRxnLUT::k57][i] * - HI(i, idx_range.j, idx_range.k) * - HI(i, idx_range.j, idx_range.k) + - kcol_buf[CollisionalRxnLUT::k58][i] * - HI(i, idx_range.j, idx_range.k) * - HeI(i, idx_range.j, idx_range.k) / 4. + - (kph_buf.k24[i] * HI(i, idx_range.j, idx_range.k) + - kph_buf.k25[i] * HeII(i, idx_range.j, idx_range.k) / 4. + - kph_buf.k26[i] * HeI(i, idx_range.j, idx_range.k) / 4.); + dedot[i] = +kcol_buf[CollisionalRxnLUT::k1][i] * + HI(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) + + kcol_buf[CollisionalRxnLUT::k3][i] * + HeI(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. + + kcol_buf[CollisionalRxnLUT::k5][i] * + HeII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. - + kcol_buf[CollisionalRxnLUT::k2][i] * + HII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) - + kcol_buf[CollisionalRxnLUT::k4][i] * + HeII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. - + kcol_buf[CollisionalRxnLUT::k6][i] * + HeIII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. + + kcol_buf[CollisionalRxnLUT::k57][i] * + HI(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) + + kcol_buf[CollisionalRxnLUT::k58][i] * + HI(i, idx_range.j, idx_range.k) * + HeI(i, idx_range.j, idx_range.k) / 4. + + (kph_buf.k24[i] * HI(i, idx_range.j, idx_range.k) + + kph_buf.k25[i] * HeII(i, idx_range.j, idx_range.k) / 4. + + kph_buf.k26[i] * HeI(i, idx_range.j, idx_range.k) / 4.); // Compute the HI density rate-of-change @@ -246,52 +245,51 @@ void rate_timestep_g(double* dedot, double* HIdot, gr_mask_type anydust, // Compute the electron density rate-of-change - dedot[i] = - +kcol_buf[CollisionalRxnLUT::k1][i] * - HI(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) + - kcol_buf[CollisionalRxnLUT::k3][i] * - HeI(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) / 4. + - kcol_buf[CollisionalRxnLUT::k5][i] * - HeII(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) / 4. + - kcol_buf[CollisionalRxnLUT::k8][i] * - HM(i, idx_range.j, idx_range.k) * - HI(i, idx_range.j, idx_range.k) + - kcol_buf[CollisionalRxnLUT::k15][i] * - HM(i, idx_range.j, idx_range.k) * - HI(i, idx_range.j, idx_range.k) + - kcol_buf[CollisionalRxnLUT::k17][i] * - HM(i, idx_range.j, idx_range.k) * - HII(i, idx_range.j, idx_range.k) + - kcol_buf[CollisionalRxnLUT::k14][i] * - HM(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) - - kcol_buf[CollisionalRxnLUT::k2][i] * - HII(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) - - kcol_buf[CollisionalRxnLUT::k4][i] * - HeII(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) / 4. - - kcol_buf[CollisionalRxnLUT::k6][i] * - HeIII(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) / 4. - - kcol_buf[CollisionalRxnLUT::k7][i] * - HI(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) - - kcol_buf[CollisionalRxnLUT::k18][i] * - H2II(i, idx_range.j, idx_range.k) * - de(i, idx_range.j, idx_range.k) / 2. + - kcol_buf[CollisionalRxnLUT::k57][i] * - HI(i, idx_range.j, idx_range.k) * - HI(i, idx_range.j, idx_range.k) + - kcol_buf[CollisionalRxnLUT::k58][i] * - HI(i, idx_range.j, idx_range.k) * - HeI(i, idx_range.j, idx_range.k) / 4. + - (kph_buf.k24[i] * HI(i, idx_range.j, idx_range.k) + - kph_buf.k25[i] * HeII(i, idx_range.j, idx_range.k) / 4. + - kph_buf.k26[i] * HeI(i, idx_range.j, idx_range.k) / 4.); + dedot[i] = +kcol_buf[CollisionalRxnLUT::k1][i] * + HI(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) + + kcol_buf[CollisionalRxnLUT::k3][i] * + HeI(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. + + kcol_buf[CollisionalRxnLUT::k5][i] * + HeII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. + + kcol_buf[CollisionalRxnLUT::k8][i] * + HM(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) + + kcol_buf[CollisionalRxnLUT::k15][i] * + HM(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) + + kcol_buf[CollisionalRxnLUT::k17][i] * + HM(i, idx_range.j, idx_range.k) * + HII(i, idx_range.j, idx_range.k) + + kcol_buf[CollisionalRxnLUT::k14][i] * + HM(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) - + kcol_buf[CollisionalRxnLUT::k2][i] * + HII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) - + kcol_buf[CollisionalRxnLUT::k4][i] * + HeII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. - + kcol_buf[CollisionalRxnLUT::k6][i] * + HeIII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4. - + kcol_buf[CollisionalRxnLUT::k7][i] * + HI(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) - + kcol_buf[CollisionalRxnLUT::k18][i] * + H2II(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 2. + + kcol_buf[CollisionalRxnLUT::k57][i] * + HI(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) + + kcol_buf[CollisionalRxnLUT::k58][i] * + HI(i, idx_range.j, idx_range.k) * + HeI(i, idx_range.j, idx_range.k) / 4. + + (kph_buf.k24[i] * HI(i, idx_range.j, idx_range.k) + + kph_buf.k25[i] * HeII(i, idx_range.j, idx_range.k) / 4. + + kph_buf.k26[i] * HeI(i, idx_range.j, idx_range.k) / 4.); // HII, HeII, HeIII recombination heating