diff --git a/src/clib/CMakeLists.txt b/src/clib/CMakeLists.txt index 06512f604..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 @@ -119,6 +120,7 @@ add_library(Grackle_Grackle lookup_cool_rates1d.hpp make_consistent.cpp make_consistent.hpp opaque_storage.hpp + rate_timestep_g.cpp rate_timestep_g.hpp rate_utils.cpp solve_chemistry.cpp scale_fields.cpp scale_fields.hpp @@ -131,6 +133,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/Make.config.objects b/src/clib/Make.config.objects index 7a4bb87af..a07a6f9c4 100644 --- a/src/clib/Make.config.objects +++ b/src/clib/Make.config.objects @@ -36,6 +36,7 @@ OBJS_CONFIG_LIB = \ initialize_rates.lo \ initialize_UVbackground_data.lo \ interpolators_g.lo \ + rate_timestep_g.lo \ make_consistent.lo \ scale_fields.lo \ set_default_chemistry_parameters.lo \ 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 */ diff --git a/src/clib/chemistry_solver_funcs.hpp b/src/clib/chemistry_solver_funcs.hpp index f36db0a7f..2750c72e5 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,12 +19,15 @@ /// 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 #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" @@ -36,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 @@ -46,11 +52,8 @@ 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] 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 /// ----------------- @@ -58,8 +61,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) @@ -73,7 +76,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. @@ -84,14 +87,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 @@ -100,13 +102,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, - grackle::impl::GrainSpeciesCollection grain_growth_rates, - grackle::impl::CollisionalRxnRateCollection kcol_buf, - grackle::impl::PhotoRxnRateCollection kshield_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, + const FullRxnRateBuf rxn_rate_buf ) { @@ -176,6 +175,11 @@ 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); + 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); int i; double scoef, acoef; @@ -191,11 +195,11 @@ 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. - + kshield_buf.k24[i]; + 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. + + 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]); @@ -219,13 +223,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. - + kshield_buf.k24[i]*out_spdens.data[SpLUT::HI][i]; + 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. + + 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.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]); // @@ -242,22 +246,22 @@ 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 ], - kshield_buf.k24 [ i ]); + kph_buf.k24 [ i ]); } } // 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. - + 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.; + + 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. + + 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) @@ -268,11 +272,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]); @@ -288,53 +292,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) - + kshield_buf.k26[i]; + scoef = kcol_buf[CollisionalRxnLUT::k4][i]*HeII(i,j,k)*de(i,j,k); + acoef = kcol_buf[CollisionalRxnLUT::k3][i]*de(i,j,k) + + kph_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) - + kshield_buf.k26[i]*out_spdens.data[SpLUT::HeI][i]; + 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) + + 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.data[CollisionalRxnLUT::k4][i]*de(i,j,k) + kcol_buf.data[CollisionalRxnLUT::k5][i]*de(i,j,k) - + kshield_buf.k25[i]; + acoef = kcol_buf[CollisionalRxnLUT::k4][i]*de(i,j,k) + kcol_buf[CollisionalRxnLUT::k5][i]*de(i,j,k) + + kph_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) - + kshield_buf.k25[i]*out_spdens.data[SpLUT::HeII][i]; + scoef = kcol_buf[CollisionalRxnLUT::k5][i]*out_spdens.data[SpLUT::HeII][i]*de(i,j,k) + + 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.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] ); @@ -351,26 +355,26 @@ 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. - + 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. - + kshield_buf.k24[i]; + 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.*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) + + 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. + + kph_buf.k24[i]; if (my_chemistry->use_radiative_transfer == 1) { acoef = acoef + kphHI(i,j,k); } if (my_chemistry->use_radiative_transfer == 1) { @@ -396,63 +400,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] ); @@ -474,65 +478,65 @@ 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. - + kshield_buf.k24[i]*HI(i,j,k); + 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. + + 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); } - 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. - + 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] @@ -551,56 +555,58 @@ 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) && (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. - + 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) ) - + kshield_buf.k29[i] + kshield_buf.k31[i]; + 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) ) + + kph_buf.k29[i] + kph_buf.k31[i]; if (anydust != MASK_FALSE) { if(itmask_metal[i] != MASK_FALSE) { @@ -611,49 +617,49 @@ 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. * - 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.; } } } @@ -662,22 +668,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 + - my_uvb_rates.k27; + 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 + + kph_buf.k27[i]; #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]); @@ -685,26 +691,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] - + kshield_buf.k29[i]*out_spdens.data[SpLUT::H2I][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] + + kph_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] - + (kshield_buf.k28[i]+kshield_buf.k30[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] + + (kph_buf.k28[i]+kph_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] - + 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. + 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] + + 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.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] - + (kshield_buf.k28[i]+kshield_buf.k30[i]) - + kcol_buf.data[CollisionalRxnLUT::k150][i]*out_spdens.data[SpLUT::HeI][i]/4. + / ( 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] + + (kph_buf.k28[i]+kph_buf.k30[i]) + + kcol_buf[CollisionalRxnLUT::k150][i]*out_spdens.data[SpLUT::HeI][i]/4. ); } } @@ -718,28 +724,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) - + kshield_buf.k24[i]; + 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) + + 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. - + 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) { @@ -751,35 +757,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); + + 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); } - 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 @@ -788,8 +794,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) ) @@ -806,39 +812,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] ); @@ -854,19 +860,19 @@ 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 - + 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) { @@ -888,9 +894,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 @@ -904,19 +910,19 @@ 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 - + 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) { @@ -932,7 +938,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.; @@ -942,23 +948,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 @@ -977,24 +983,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 @@ -1010,28 +1016,28 @@ 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 - + 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) { @@ -1047,15 +1053,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] ); @@ -1065,12 +1071,12 @@ 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 - + 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.; } } @@ -1080,19 +1086,19 @@ 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 - + 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.; } } @@ -1102,13 +1108,13 @@ 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) ) { 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.; } } @@ -1118,14 +1124,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] ); @@ -1133,15 +1139,15 @@ 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 - + 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; } } @@ -1151,10 +1157,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] ); @@ -1162,13 +1168,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 @@ -1182,11 +1188,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] ); @@ -1194,13 +1200,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] ); @@ -1208,11 +1214,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] ); @@ -1220,10 +1226,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] ); @@ -1235,11 +1241,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) ) @@ -1252,7 +1258,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] ); @@ -1262,7 +1268,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] ); @@ -1272,9 +1278,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] ); @@ -1295,7 +1301,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) ) @@ -1305,7 +1311,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) ) @@ -1317,7 +1323,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) ) @@ -1327,7 +1333,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) ) @@ -1337,7 +1343,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) ) @@ -1347,7 +1353,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) ) @@ -1357,7 +1363,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) ) @@ -1367,7 +1373,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) ) @@ -1377,7 +1383,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) ) @@ -1387,7 +1393,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) ) @@ -1399,7 +1405,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) ) @@ -1409,7 +1415,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) ) @@ -1419,7 +1425,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) ) @@ -1444,17 +1450,14 @@ 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 /// @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] 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 @@ -1479,12 +1482,9 @@ 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 grackle::impl::GrainSpeciesCollection grain_growth_rates, - const grackle::impl::CollisionalRxnRateCollection kcr_buf, - const grackle::impl::PhotoRxnRateCollection kshield_buf + const FullRxnRateBuf rxn_rate_buf ) { // define some local variables carried over from the fortran version: @@ -1551,6 +1551,12 @@ 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); + 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); + double scoef, acoef; // A) the 6-species integrator @@ -1561,11 +1567,11 @@ 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. - + kshield_buf.k24[0]; + 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. + + 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); @@ -1583,13 +1589,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. - + kshield_buf.k24[0] *HI; + scoef = kcol_buf[CollisionalRxnLUT::k1][0] *HI *de + + kcol_buf[CollisionalRxnLUT::k57][0] *HI *HI + + kcol_buf[CollisionalRxnLUT::k58][0] *HI *HeI /4. + + kph_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); @@ -1610,11 +1616,11 @@ 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. - + kshield_buf.k24[0] *HI - + kshield_buf.k25[0] *HeII /4. - + kshield_buf.k26[0] *HeI /4.; + + kcol_buf[CollisionalRxnLUT::k57][0] *HI *HI + + kcol_buf[CollisionalRxnLUT::k58][0] *HI *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 @@ -1625,11 +1631,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); @@ -1645,53 +1651,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 - + kshield_buf.k26[0]; + scoef = kcol_buf[CollisionalRxnLUT::k4][0] *HeII *de; + acoef = kcol_buf[CollisionalRxnLUT::k3][0] *de + + 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); } 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 - + kshield_buf.k26[0] *HeI; + scoef = kcol_buf[CollisionalRxnLUT::k3][0] *HeI *de + + kcol_buf[CollisionalRxnLUT::k6][0] *HeIII *de + + 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 = kcr_buf.data[CollisionalRxnLUT::k4][0] *de + kcr_buf.data[CollisionalRxnLUT::k5][0] *de - + kshield_buf.k25[0]; + acoef = kcol_buf[CollisionalRxnLUT::k4][0] *de + kcol_buf[CollisionalRxnLUT::k5][0] *de + + 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); } 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 - + kshield_buf.k25[0] *HeII; + scoef = kcol_buf[CollisionalRxnLUT::k5][0] *HeII *de + + 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 = 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); @@ -1708,26 +1714,26 @@ 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. - + 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. - + kshield_buf.k24[0]; + 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.*kph_buf.k31[0] * H2I /2.; + + 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. + + 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) { @@ -1753,63 +1759,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); @@ -1827,65 +1833,65 @@ 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. - + kshield_buf.k24[0] *HI; + 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. + + kph_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. - + 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 @@ -1904,56 +1910,58 @@ 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) && (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. - + 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 ) - + kshield_buf.k29[0] + kshield_buf.k31[0]; + 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 ) + + kph_buf.k29[0] + kph_buf.k31[0]; if (anydust != MASK_FALSE) { if(itmask_metal[0] != MASK_FALSE ) { @@ -1964,49 +1972,49 @@ 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. * - 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.; } } } @@ -2015,22 +2023,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 + - my_uvb_rates.k27; + 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 + + kph_buf.k27[0]; // 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); @@ -2038,20 +2046,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 - + kshield_buf.k29[0] *H2I /2. + scoef = 2.*( kcol_buf[CollisionalRxnLUT::k9][0] *HI *HII + + kcol_buf[CollisionalRxnLUT::k11][0] *H2I /2.*HII + + kcol_buf[CollisionalRxnLUT::k17][0] *HM *HII + + kph_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 - + (kshield_buf.k28[0] +kshield_buf.k30[0] ); + acoef = kcol_buf[CollisionalRxnLUT::k10][0] *HI + kcol_buf[CollisionalRxnLUT::k18][0] *de + + kcol_buf[CollisionalRxnLUT::k19][0] *HM + + (kph_buf.k28[0] +kph_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); @@ -2071,28 +2079,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 - + kshield_buf.k24[0]; + 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 + + 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. - + 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) { @@ -2104,35 +2112,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; + + 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; } - 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 @@ -2141,8 +2149,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); @@ -2160,13 +2168,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); @@ -2174,12 +2182,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); @@ -2187,14 +2195,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); @@ -2210,19 +2218,19 @@ 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 - + 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) { @@ -2244,9 +2252,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 @@ -2260,19 +2268,19 @@ 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 - + 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) { @@ -2288,7 +2296,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.; @@ -2298,23 +2306,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 @@ -2333,24 +2341,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 @@ -2366,28 +2374,28 @@ 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 - + 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) { @@ -2403,15 +2411,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); @@ -2421,12 +2429,12 @@ 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 - + grain_growth_rates.data[OnlyGrainSpLUT::SiM_dust][0] / SiI * 28.; + + grain_growth_rates[OnlyGrainSpLUT::SiM_dust][0] / SiI * 28.; } } @@ -2436,19 +2444,19 @@ 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 - + 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.; } } @@ -2458,13 +2466,13 @@ 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) ) { 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.; } } @@ -2474,14 +2482,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); @@ -2489,15 +2497,15 @@ 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 - + 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; } } @@ -2507,10 +2515,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); @@ -2518,13 +2526,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 @@ -2538,11 +2546,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); @@ -2550,13 +2558,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); @@ -2564,11 +2572,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); @@ -2576,10 +2584,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); @@ -2591,11 +2599,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); @@ -2608,7 +2616,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); @@ -2618,7 +2626,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); @@ -2628,9 +2636,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); @@ -2651,7 +2659,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); @@ -2661,7 +2669,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); @@ -2673,7 +2681,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); @@ -2683,7 +2691,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); @@ -2693,7 +2701,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); @@ -2703,7 +2711,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); @@ -2713,7 +2721,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); @@ -2723,7 +2731,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); @@ -2733,7 +2741,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); @@ -2743,7 +2751,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); @@ -2755,7 +2763,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); @@ -2765,7 +2773,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); @@ -2775,7 +2783,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..7dbb16e06 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) /// @@ -105,12 +104,12 @@ 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, - grackle::impl::GrainSpeciesCollection grain_growth_rates, + 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, 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; @@ -125,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 @@ -299,6 +302,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 +371,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 +407,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/fortran_func_decls.h b/src/clib/fortran_func_decls.h index 3d885a126..45a7ede63 100644 --- a/src/clib/fortran_func_decls.h +++ b/src/clib/fortran_func_decls.h @@ -240,32 +240,6 @@ void FORTRAN_NAME(ceiling_species_g)( gr_float* metal_Y19_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(make_consistent_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 6cf0b6b1b..9043bc14e 100644 --- a/src/clib/fortran_func_wrappers.hpp +++ b/src/clib/fortran_func_wrappers.hpp @@ -340,38 +340,6 @@ inline double interpolate_5d_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 - ); -} - } // namespace grackle::impl::fortran_wrapper #endif /* FORTRAN_FUNC_WRAPPERS_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/lookup_cool_rates1d.hpp b/src/clib/lookup_cool_rates1d.hpp index 1b5914150..99be95bb0 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" @@ -49,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 kshield_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], @@ -70,13 +70,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; } @@ -127,7 +127,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 @@ -140,7 +140,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) { @@ -152,6 +152,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) { @@ -159,10 +160,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]; } } } @@ -171,7 +172,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` @@ -183,17 +184,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); @@ -228,11 +228,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]; @@ -253,7 +254,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; } } } @@ -278,7 +279,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, @@ -314,13 +315,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); } } @@ -396,7 +397,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]; } } } @@ -407,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) { - 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); } } } @@ -422,8 +422,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]; } } } @@ -572,7 +572,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) { @@ -586,20 +586,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; } } @@ -618,40 +618,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; } } @@ -663,40 +663,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; } } } @@ -729,9 +729,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. @@ -748,19 +745,14 @@ 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) /// @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 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 @@ -771,17 +763,14 @@ 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, - grackle::impl::GrainSpeciesCollection grain_growth_rates, + 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, - 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. @@ -822,8 +811,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. @@ -836,10 +825,10 @@ 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, - grain_growth_rates, grain_temperatures, - logTlininterp_buf, internal_dust_prop_scratch_buf); + 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); } // Deal with the photo reaction rates @@ -850,20 +839,31 @@ 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; + // 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 } } // 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 @@ -871,7 +871,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); } @@ -881,7 +881,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 new file mode 100644 index 000000000..9dd2588fb --- /dev/null +++ b/src/clib/rate_timestep_g.cpp @@ -0,0 +1,433 @@ +//===----------------------------------------------------------------------===// +// +// 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, + 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) { + // 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 + const double* h2dust = FullRxnRateBuf_h2dust(&rxn_rate_buf); + const double* const* kcol_buf = FullRxnRateBuf_kcol_bufs(&rxn_rate_buf); + const PhotoRxnRateCollection kph_buf = rxn_rate_buf.radiative; + + int i; + double atten; + 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) { + // 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.); + + // Compute the HI density rate-of-change + + HIdot[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::k2][i] * + HII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) - + 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); + } + } + } 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] = + -kcol_buf[CollisionalRxnLUT::k1][i] * + de(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) - + kcol_buf[CollisionalRxnLUT::k7][i] * + de(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) - + kcol_buf[CollisionalRxnLUT::k8][i] * + HM(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) - + kcol_buf[CollisionalRxnLUT::k9][i] * + HII(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) - + kcol_buf[CollisionalRxnLUT::k10][i] * + H2II(i, idx_range.j, idx_range.k) * + HI(i, idx_range.j, idx_range.k) / 2. - + 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) + + kcol_buf[CollisionalRxnLUT::k2][i] * + HII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) + + 2. * kcol_buf[CollisionalRxnLUT::k13][i] * + HI(i, idx_range.j, idx_range.k) * + H2I(i, idx_range.j, idx_range.k) / 2. + + kcol_buf[CollisionalRxnLUT::k11][i] * + HII(i, idx_range.j, idx_range.k) * + H2I(i, idx_range.j, idx_range.k) / 2. + + 2. * kcol_buf[CollisionalRxnLUT::k12][i] * + de(i, idx_range.j, idx_range.k) * + H2I(i, idx_range.j, idx_range.k) / 2. + + kcol_buf[CollisionalRxnLUT::k14][i] * + HM(i, idx_range.j, idx_range.k) * + de(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) + + 2. * kcol_buf[CollisionalRxnLUT::k16][i] * + HM(i, idx_range.j, idx_range.k) * + HII(i, idx_range.j, idx_range.k) + + 2. * 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::k19][i] * + H2II(i, idx_range.j, idx_range.k) * + HM(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) + + 2.0 * kph_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); + } + } + + // 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.); + + // HII, HeII, HeIII recombination heating + + edot[i] = edot[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) - + kcol_buf[CollisionalRxnLUT::k2][i] * + HII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k)) + + 24.6 * (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::k4][i] * + HeII(i, idx_range.j, idx_range.k) * + de(i, idx_range.j, idx_range.k) / 4.) + + 79.0 * (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::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.)); + + // 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 * kcol_buf[CollisionalRxnLUT::k8][i] * + HM(i, idx_range.j, idx_range.k) + + 4.48 * kcol_buf[CollisionalRxnLUT::k22][i] * + std::pow(HI(i, idx_range.j, idx_range.k), 2.)) * + h2heatfac[i] - + 4.48 * kcol_buf[CollisionalRxnLUT::k13][i] * + H2I(i, idx_range.j, idx_range.k) / 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.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]); + } + } + + // 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) */ + } + } + } + + // 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.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) + + 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.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); + } + } + } + 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.j, idx_range.k) * + HDI(i, idx_range.j, idx_range.k) / 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.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; + } + } + } + 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.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; + } + } + } + } + + 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..236e63f0f --- /dev/null +++ b/src/clib/rate_timestep_g.hpp @@ -0,0 +1,64 @@ +//===----------------------------------------------------------------------===// +// +// 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_HPP +#define RATE_TIMESTEP_HPP + +#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 { + +/// 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] 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] 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 +/// in `idx_range`. +/// @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* 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); + +} // 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 f96243f58..ae75e238d 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" @@ -32,6 +33,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" @@ -313,7 +315,7 @@ 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 +/// @param[in] rxn_rate_buf holds various pre-computed reaction rates for /// each location in `idx_range`. /// /// @todo @@ -331,8 +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; @@ -376,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]))); @@ -413,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 ); @@ -530,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; @@ -547,22 +548,14 @@ 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; + /// 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; - // holds computed grain growth/destruction rates: - grackle::impl::GrainSpeciesCollection grain_growth_rates; - }; /// used to help implement the visitor design pattern @@ -580,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)); @@ -588,18 +580,12 @@ 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); + 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); - 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); } @@ -642,8 +628,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); @@ -791,7 +775,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 ---------------- @@ -826,23 +810,22 @@ 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, - spsolvbuf.grain_growth_rates, grain_temperatures, - logTlininterp_buf, spsolvbuf.kcr_buf, spsolvbuf.kshield_buf, - spsolvbuf.chemheatrates_buf, internal_dust_prop_scratch_buf + grain_temperatures, logTlininterp_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 // (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, - spsolvbuf.kcr_buf, spsolvbuf.kshield_buf, - spsolvbuf.chemheatrates_buf + grackle::impl::rate_timestep_g( + 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 ); // Setup masks to identify which chemistry schemes to use. We split @@ -869,7 +852,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 ); } @@ -901,11 +884,10 @@ 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.grain_growth_rates, spsolvbuf.species_tmpdens, - spsolvbuf.kcr_buf, spsolvbuf.kshield_buf + itmask_metal.data(), my_chemistry, my_fields, + spsolvbuf.species_tmpdens, spsolvbuf.rxn_rate_buf ); // Solve rate equations with one linearly implicit Gauss-Seidel @@ -915,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/solve_rate_cool_g.F b/src/clib/solve_rate_cool_g.F index d8a6cc630..69ac2d206 100644 --- a/src/clib/solve_rate_cool_g.F +++ b/src/clib/solve_rate_cool_g.F @@ -214,325 +214,3 @@ subroutine ceiling_species_g(d, de, HI, HII, HeI, HeII, HeIII, 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/step_rate_gauss_seidel.hpp b/src/clib/step_rate_gauss_seidel.hpp index 3fe3928a6..0b2a3f679 100644 --- a/src/clib/step_rate_gauss_seidel.hpp +++ b/src/clib/step_rate_gauss_seidel.hpp @@ -232,22 +232,19 @@ 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, - grackle::impl::GrainSpeciesCollection grain_growth_rates, + grackle_field_data* my_fields, grackle::impl::SpeciesCollection species_tmpdens, - grackle::impl::CollisionalRxnRateCollection kcol_buf, - grackle::impl::PhotoRxnRateCollection kshield_buf + const FullRxnRateBuf rxn_rate_buf ) { // 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, - itmask_metal, my_chemistry, my_fields, my_uvb_rates, grain_growth_rates, - kcol_buf, kshield_buf); + species_tmpdens, idx_range, dtit, anydust, rhoH, itmask, + 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/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/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 diff --git a/src/clib/time_deriv_0d.hpp b/src/clib/time_deriv_0d.hpp index 79c4a3f82..1527e31c2 100644 --- a/src/clib/time_deriv_0d.hpp +++ b/src/clib/time_deriv_0d.hpp @@ -10,10 +10,12 @@ #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" #include "internal_types.hpp" +#include "rate_timestep_g.hpp" #include "lookup_cool_rates1d.hpp" #include "utils-field.hpp" @@ -59,9 +61,7 @@ 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; }; @@ -79,9 +79,7 @@ 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); return out; } @@ -93,9 +91,7 @@ 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); } /// this is a collections of values intended to act as 1-element arrays and @@ -114,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) @@ -272,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, @@ -335,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]; } @@ -350,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, @@ -391,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]; } @@ -495,14 +488,12 @@ 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, - 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.rxn_rate_buf, pack.main_scratch_buf.chemheatrates_buf, pack.main_scratch_buf.internal_dust_prop_scratch_buf ); @@ -515,16 +506,16 @@ 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.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, - my_uvb_rates, pack.main_scratch_buf.kcr_buf, - pack.main_scratch_buf.kshield_buf, - pack.main_scratch_buf.chemheatrates_buf + pack.idx_range_1_element, + pack.main_scratch_buf.chemheatrates_buf, + pack.main_scratch_buf.rxn_rate_buf ); + } // Heating/cooling rate (per unit volume -> gas mass) @@ -541,10 +532,9 @@ 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.main_scratch_buf.kcr_buf, pack.main_scratch_buf.kshield_buf + rhosp_dot, pack.fwd_args.anydust, pack.other_scratch_buf.rhoH, + &pack.local_itmask_metal, my_chemistry, &pack.fields, + pack.main_scratch_buf.rxn_rate_buf ); }