Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .clang-format-ignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ src/clib/solve_chemistry.c
src/clib/solve_rate_cool_g-cpp.cpp
src/clib/status_reporting.c
src/clib/status_reporting.h
src/clib/step_rate_gauss_seidel.hpp
src/clib/step_rate_newton_raphson.hpp
src/clib/time_deriv_0d.hpp
src/clib/update_UVbackground_rates.c
Expand Down
3 changes: 3 additions & 0 deletions .clang-tidy
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,15 @@ Checks: >
cert-flp30-c,
cert-mem57-cpp,

clang-analyzer-*,

cppcoreguidelines-avoid-goto,
cppcoreguidelines-avoid-non-const-global-variables,
cppcoreguidelines-virtual-class-destructor

google-build-using-namespace,
google-explicit-constructor,
google-global-names-in-headers,
google-readability-avoid-underscore-in-googletest-name,
google-runtime-float,
google-upgrade-googletest-case,
Expand Down
1 change: 1 addition & 0 deletions src/clib/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ add_library(Grackle_Grackle
rate_utils.cpp
scale_fields.cpp scale_fields.hpp
solve_rate_cool_g-cpp.cpp solve_rate_cool_g-cpp.h
step_rate_gauss_seidel.hpp
step_rate_newton_raphson.hpp
time_deriv_0d.hpp
utils-cpp.cpp utils-cpp.hpp
Expand Down
11 changes: 10 additions & 1 deletion src/clib/calc_temp_cloudy_g.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,16 @@ void calc_temp_cloudy_g(gr_float* temperature_data_, int imetal,
const double dom = internalu_calc_dom_(internalu);
const double zr = 1. / (internalu.a_value * internalu.a_units) - 1.;

// Convert densities from comoving to proper
// this assertion is a hint to clang-analyzer about the relationship between
// `imetal` and whether `metal_density` is a nullptr
// -> for context, `scale_fields_table` is inlined into this function. Rather
// than look at `imetal`, it checks if `metal_density` is a nullptr
// -> without this assertion clang-tidy will infer that since there's an
// explicit check for whether `metal_density` is null, regardless of
// `imetal`'s value, then it must be possible for `metal_density` to be
// null when `imetal` is 1. Then, it would report an error
GR_INTERNAL_REQUIRE((imetal != 1) || (my_fields->metal_density != nullptr),
"imetal has an incorrect value");

if (internalu.extfields_in_comoving == 1) {
double factor = std::pow(internalu.a_value, -3);
Expand Down
1,412 changes: 1,412 additions & 0 deletions src/clib/chemistry_solver_funcs.hpp

Large diffs are not rendered by default.

3 changes: 1 addition & 2 deletions src/clib/cool1d_multi_g.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -959,7 +959,6 @@ void grackle::impl::cool1d_multi_g(
if (itmask[i] != MASK_FALSE) {
// Only calculate if H2I(i) is a substantial fraction
if (d(i, idx_range.j, idx_range.k) * dom > 1e10) {
ciefudge = 1.;
tau = std::pow(((d(i, idx_range.j, idx_range.k) / 2e16) * dom),
2.8); // 2e16 is in units of cm^-3
tau = std::fmax(tau, 1.e-5);
Expand Down Expand Up @@ -1969,4 +1968,4 @@ void grackle::impl::cool1d_multi_g(
grackle::impl::drop_GrainSpeciesCollection(&gas_grainsp_heatrate);

return;
}
}
64 changes: 0 additions & 64 deletions src/clib/fortran_func_decls.h
Original file line number Diff line number Diff line change
Expand Up @@ -266,70 +266,6 @@ void FORTRAN_NAME(rate_timestep_g)(
gr_float* kdissH2O_data_ptr
);

void FORTRAN_NAME(step_rate_g)(
gr_float* de_data_ptr, gr_float* HI_data_ptr, gr_float* HII_data_ptr,
gr_float* HeI_data_ptr, gr_float* HeII_data_ptr, gr_float* HeIII_data_ptr,
gr_float* d_data_ptr, gr_float* HM_data_ptr, gr_float* H2I_data_ptr,
gr_float* H2II_data_ptr, gr_float* DI_data_ptr, gr_float* DII_data_ptr,
gr_float* HDI_data_ptr, double* dtit, int* in, int* jn, int* kn, int* is,
int* ie, int* j, int* k, int* ispecies, gr_mask_type* anydust, 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* rhoH, double* k24shield, double* k25shield,
double* k26shield, double* k28shield, double* k29shield, double* k30shield,
double* k31shield, double* HIp, double* HIIp, double* HeIp, double* HeIIp,
double* HeIIIp, double* dep, double* HMp, double* H2Ip, double* H2IIp,
double* DIp, double* DIIp, double* HDIp, double* dedot_prev,
double* HIdot_prev, int* iradtrans, int* irt_honly, gr_float* kphHI_data_ptr,
gr_float* kphHeI_data_ptr, gr_float* kphHeII_data_ptr, gr_mask_type* itmask,
gr_mask_type* itmask_metal, gr_float* DM_data_ptr, gr_float* HDII_data_ptr,
gr_float* HeHII_data_ptr, int* imetal, gr_float* metal_data_ptr, int* imchem,
int* idspecies, int* igrgr, int* idsub, gr_float* CI_data_ptr,
gr_float* CII_data_ptr, gr_float* CO_data_ptr, gr_float* CO2_data_ptr,
gr_float* OI_data_ptr, gr_float* OH_data_ptr, gr_float* H2O_data_ptr,
gr_float* O2_data_ptr, gr_float* SiI_data_ptr, gr_float* SiOI_data_ptr,
gr_float* SiO2I_data_ptr, gr_float* CH_data_ptr, gr_float* CH2_data_ptr,
gr_float* COII_data_ptr, gr_float* OII_data_ptr, gr_float* OHII_data_ptr,
gr_float* H2OII_data_ptr, gr_float* H3OII_data_ptr, gr_float* O2II_data_ptr,
gr_float* Mg_data_ptr, gr_float* Al_data_ptr, gr_float* S_data_ptr,
gr_float* Fe_data_ptr, gr_float* SiM_data_ptr, gr_float* FeM_data_ptr,
gr_float* Mg2SiO4_data_ptr, gr_float* MgSiO3_data_ptr,
gr_float* Fe3O4_data_ptr, gr_float* AC_data_ptr, gr_float* SiO2D_data_ptr,
gr_float* MgO_data_ptr, gr_float* FeS_data_ptr, gr_float* Al2O3_data_ptr,
gr_float* reforg_data_ptr, gr_float* volorg_data_ptr,
gr_float* H2Oice_data_ptr, double* k125, double* k129, double* k130,
double* k131, double* k132, double* k133, double* k134, double* k135,
double* k136, double* k137, double* k148, double* k149, double* k150,
double* k151, double* k152, double* k153, double* kz15, double* kz16,
double* kz17, double* kz18, double* kz19, double* kz20, double* kz21,
double* kz22, double* kz23, double* kz24, double* kz25, double* kz26,
double* kz27, double* kz28, double* kz29, double* kz30, double* kz31,
double* kz32, double* kz33, double* kz34, double* kz35, double* kz36,
double* kz37, double* kz38, double* kz39, double* kz40, double* kz41,
double* kz42, double* kz43, double* kz44, double* kz45, double* kz46,
double* kz47, double* kz48, double* kz49, double* kz50, double* kz51,
double* kz52, double* kz53, double* kz54, double* DMp, double* HDIIp,
double* HeHIIp, double* CIp, double* CIIp, double* COp, double* CO2p,
double* OIp, double* OHp, double* H2Op, double* O2p, double* SiIp,
double* SiOIp, double* SiO2Ip, double* CHp, double* CH2p, double* COIIp,
double* OIIp, double* OHIIp, double* H2OIIp, double* H3OIIp, double* O2IIp,
double* Mgp, double* Alp, double* Sp, double* Fep, gr_float* SiMp,
gr_float* FeMp, gr_float* Mg2SiO4p, gr_float* MgSiO3p, gr_float* Fe3O4p,
gr_float* ACp, gr_float* SiO2Dp, gr_float* MgOp, gr_float* FeSp,
gr_float* Al2O3p, gr_float* reforgp, gr_float* volorgp, gr_float* H2Oicep,
double* kdSiM, double* kdFeM, double* kdMg2SiO4, double* kdMgSiO3,
double* kdFe3O4, double* kdAC, double* kdSiO2D, double* kdMgO, double* kdFeS,
double* kdAl2O3, double* kdreforg, double* kdvolorg, double* kdH2Oice,
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,
Expand Down
75 changes: 2 additions & 73 deletions src/clib/fortran_func_wrappers.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
#include "LUT.hpp"
#include "utils-cpp.hpp"

#include "step_rate_gauss_seidel.hpp"

// callers of these functions are generally expected to locally shorten the
// namespace name when they call these routines
namespace grackle::impl::fortran_wrapper {
Expand Down Expand Up @@ -370,79 +372,6 @@ inline void rate_timestep_g(
);
}

/// Uses one linearly implicit Gauss-Seidel sweep of a backward-Euler time
/// integrator to advance the rate equations by one (sub-)cycle (dtit).
inline void step_rate_g(
double* dtit, IndexRange idx_range, gr_mask_type anydust, double* h2dust,
double* rhoH, double* dedot_prev, double* HIdot_prev,
gr_mask_type* itmask, gr_mask_type* itmask_metal, int imetal,
chemistry_data* my_chemistry, grackle_field_data* my_fields,
photo_rate_storage my_uvb_rates,
grackle::impl::GrainSpeciesCollection grain_growth_rates,
grackle::impl::SpeciesCollection species_tmpdens,
grackle::impl::CollisionalRxnRateCollection kcr_buf,
grackle::impl::PhotoRxnRateCollection kshield_buf
) {
FORTRAN_NAME(step_rate_g)(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->DI_density, my_fields->DII_density, my_fields->HDI_density, dtit,
&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,
&my_chemistry->primordial_chemistry, &anydust,
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, rhoH,
kshield_buf.k24, kshield_buf.k25, kshield_buf.k26,
kshield_buf.k28, kshield_buf.k29, kshield_buf.k30, kshield_buf.k31,
species_tmpdens.data[SpLUT::HI], species_tmpdens.data[SpLUT::HII], species_tmpdens.data[SpLUT::HeI], species_tmpdens.data[SpLUT::HeII], species_tmpdens.data[SpLUT::HeIII], species_tmpdens.data[SpLUT::e],
species_tmpdens.data[SpLUT::HM], species_tmpdens.data[SpLUT::H2I], species_tmpdens.data[SpLUT::H2II], species_tmpdens.data[SpLUT::DI], species_tmpdens.data[SpLUT::DII], species_tmpdens.data[SpLUT::HDI],
dedot_prev, HIdot_prev,
&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, itmask_metal,
my_fields->DM_density, my_fields->HDII_density, my_fields->HeHII_density, &imetal, my_fields->metal_density,
&my_chemistry->metal_chemistry, &my_chemistry->dust_species, &my_chemistry->grain_growth, &my_chemistry->dust_sublimation,
my_fields->CI_density, my_fields->CII_density, my_fields->CO_density, my_fields->CO2_density,
my_fields->OI_density, my_fields->OH_density, my_fields->H2O_density, my_fields->O2_density,
my_fields->SiI_density, my_fields->SiOI_density, my_fields->SiO2I_density,
my_fields->CH_density, my_fields->CH2_density, my_fields->COII_density, my_fields->OII_density,
my_fields->OHII_density, my_fields->H2OII_density, my_fields->H3OII_density, my_fields->O2II_density,
my_fields->Mg_density, my_fields->Al_density, my_fields->S_density, my_fields->Fe_density,
my_fields->SiM_dust_density, my_fields->FeM_dust_density, my_fields->Mg2SiO4_dust_density, my_fields->MgSiO3_dust_density, my_fields->Fe3O4_dust_density,
my_fields->AC_dust_density, my_fields->SiO2_dust_density, my_fields->MgO_dust_density, my_fields->FeS_dust_density, my_fields->Al2O3_dust_density,
my_fields->ref_org_dust_density, my_fields->vol_org_dust_density, my_fields->H2O_ice_dust_density,
kcr_buf.data[CollisionalRxnLUT::k125], kcr_buf.data[CollisionalRxnLUT::k129], kcr_buf.data[CollisionalRxnLUT::k130], kcr_buf.data[CollisionalRxnLUT::k131], kcr_buf.data[CollisionalRxnLUT::k132],
kcr_buf.data[CollisionalRxnLUT::k133], kcr_buf.data[CollisionalRxnLUT::k134], kcr_buf.data[CollisionalRxnLUT::k135], kcr_buf.data[CollisionalRxnLUT::k136], kcr_buf.data[CollisionalRxnLUT::k137],
kcr_buf.data[CollisionalRxnLUT::k148], kcr_buf.data[CollisionalRxnLUT::k149], kcr_buf.data[CollisionalRxnLUT::k150], kcr_buf.data[CollisionalRxnLUT::k151], kcr_buf.data[CollisionalRxnLUT::k152],
kcr_buf.data[CollisionalRxnLUT::k153],
kcr_buf.data[CollisionalRxnLUT::kz15], kcr_buf.data[CollisionalRxnLUT::kz16], kcr_buf.data[CollisionalRxnLUT::kz17], kcr_buf.data[CollisionalRxnLUT::kz18], kcr_buf.data[CollisionalRxnLUT::kz19],
kcr_buf.data[CollisionalRxnLUT::kz20], kcr_buf.data[CollisionalRxnLUT::kz21], kcr_buf.data[CollisionalRxnLUT::kz22], kcr_buf.data[CollisionalRxnLUT::kz23], kcr_buf.data[CollisionalRxnLUT::kz24],
kcr_buf.data[CollisionalRxnLUT::kz25], kcr_buf.data[CollisionalRxnLUT::kz26], kcr_buf.data[CollisionalRxnLUT::kz27], kcr_buf.data[CollisionalRxnLUT::kz28], kcr_buf.data[CollisionalRxnLUT::kz29],
kcr_buf.data[CollisionalRxnLUT::kz30], kcr_buf.data[CollisionalRxnLUT::kz31], kcr_buf.data[CollisionalRxnLUT::kz32], kcr_buf.data[CollisionalRxnLUT::kz33], kcr_buf.data[CollisionalRxnLUT::kz34],
kcr_buf.data[CollisionalRxnLUT::kz35], kcr_buf.data[CollisionalRxnLUT::kz36], kcr_buf.data[CollisionalRxnLUT::kz37], kcr_buf.data[CollisionalRxnLUT::kz38], kcr_buf.data[CollisionalRxnLUT::kz39],
kcr_buf.data[CollisionalRxnLUT::kz40], kcr_buf.data[CollisionalRxnLUT::kz41], kcr_buf.data[CollisionalRxnLUT::kz42], kcr_buf.data[CollisionalRxnLUT::kz43], kcr_buf.data[CollisionalRxnLUT::kz44],
kcr_buf.data[CollisionalRxnLUT::kz45], kcr_buf.data[CollisionalRxnLUT::kz46], kcr_buf.data[CollisionalRxnLUT::kz47], kcr_buf.data[CollisionalRxnLUT::kz48], kcr_buf.data[CollisionalRxnLUT::kz49],
kcr_buf.data[CollisionalRxnLUT::kz50], kcr_buf.data[CollisionalRxnLUT::kz51], kcr_buf.data[CollisionalRxnLUT::kz52], kcr_buf.data[CollisionalRxnLUT::kz53], kcr_buf.data[CollisionalRxnLUT::kz54],
species_tmpdens.data[SpLUT::DM], species_tmpdens.data[SpLUT::HDII], species_tmpdens.data[SpLUT::HeHII],
species_tmpdens.data[SpLUT::CI], species_tmpdens.data[SpLUT::CII], species_tmpdens.data[SpLUT::CO], species_tmpdens.data[SpLUT::CO2],
species_tmpdens.data[SpLUT::OI], species_tmpdens.data[SpLUT::OH], species_tmpdens.data[SpLUT::H2O], species_tmpdens.data[SpLUT::O2],
species_tmpdens.data[SpLUT::SiI], species_tmpdens.data[SpLUT::SiOI], species_tmpdens.data[SpLUT::SiO2I],
species_tmpdens.data[SpLUT::CH], species_tmpdens.data[SpLUT::CH2], species_tmpdens.data[SpLUT::COII], species_tmpdens.data[SpLUT::OII],
species_tmpdens.data[SpLUT::OHII], species_tmpdens.data[SpLUT::H2OII], species_tmpdens.data[SpLUT::H3OII], species_tmpdens.data[SpLUT::O2II],
species_tmpdens.data[SpLUT::Mg], species_tmpdens.data[SpLUT::Al], species_tmpdens.data[SpLUT::S], species_tmpdens.data[SpLUT::Fe],
species_tmpdens.data[SpLUT::SiM_dust], species_tmpdens.data[SpLUT::FeM_dust], species_tmpdens.data[SpLUT::Mg2SiO4_dust], species_tmpdens.data[SpLUT::MgSiO3_dust], species_tmpdens.data[SpLUT::Fe3O4_dust],
species_tmpdens.data[SpLUT::AC_dust], species_tmpdens.data[SpLUT::SiO2_dust], species_tmpdens.data[SpLUT::MgO_dust], species_tmpdens.data[SpLUT::FeS_dust], species_tmpdens.data[SpLUT::Al2O3_dust],
species_tmpdens.data[SpLUT::ref_org_dust], species_tmpdens.data[SpLUT::vol_org_dust], species_tmpdens.data[SpLUT::H2O_ice_dust],
grain_growth_rates.data[OnlyGrainSpLUT::SiM_dust], grain_growth_rates.data[OnlyGrainSpLUT::FeM_dust], grain_growth_rates.data[OnlyGrainSpLUT::Mg2SiO4_dust], grain_growth_rates.data[OnlyGrainSpLUT::MgSiO3_dust], grain_growth_rates.data[OnlyGrainSpLUT::Fe3O4_dust],
grain_growth_rates.data[OnlyGrainSpLUT::AC_dust], grain_growth_rates.data[OnlyGrainSpLUT::SiO2_dust], grain_growth_rates.data[OnlyGrainSpLUT::MgO_dust], grain_growth_rates.data[OnlyGrainSpLUT::FeS_dust], grain_growth_rates.data[OnlyGrainSpLUT::Al2O3_dust],
grain_growth_rates.data[OnlyGrainSpLUT::ref_org_dust], grain_growth_rates.data[OnlyGrainSpLUT::vol_org_dust], grain_growth_rates.data[OnlyGrainSpLUT::H2O_ice_dust],
&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 */
Expand Down
38 changes: 28 additions & 10 deletions src/clib/initialize_chemistry_data.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -463,16 +463,34 @@ extern "C" int local_initialize_chemistry_data(chemistry_data *my_chemistry,
tm_info = localtime(&timer);
strftime(tstr, 26, "%Y-%m-%d %H:%M:%S", tm_info);

FILE *fptr = fopen("GRACKLE_INFO", "w");
fprintf(fptr, "%s\n", tstr);
show_version(fptr);
fprintf(fptr, "Grackle build options:\n");
auto_show_config(fptr);
fprintf(fptr, "Grackle build flags:\n");
auto_show_flags(fptr);
fprintf(fptr, "Grackle run-time parameters:\n");
show_parameters(fptr, my_chemistry);
fclose(fptr);
const char* fname = "GRACKLE_INFO";

FILE *fptr = fopen(fname, "w");
if (fptr == nullptr) {
// on posix platforms we could give a more detailed error message
// - posix (not the C or C++ standard) mandates that `fopen` set errno
// upon failure
// - properly informing the user of the error gets a little "hairy." We
// should use POSIX's strerror_r to get the error (since regular
// strerror may not be threadsafe). But we would need to account for
// the fact that glibc describes an incompatible signature for
// strerror_r (https://www.club.cc.cmu.edu/~cmccabe/blog_strerror.html)
// Since this isn't central to Grackle's functionality, we'll punt on
// this...
fprintf(stderr, "Failed to open \"%s\" file (to record config info)\n",
fname);
// an argument could be made that we should return with an error
} else {
fprintf(fptr, "%s\n", tstr);
show_version(fptr);
fprintf(fptr, "Grackle build options:\n");
auto_show_config(fptr);
fprintf(fptr, "Grackle build flags:\n");
auto_show_flags(fptr);
fprintf(fptr, "Grackle run-time parameters:\n");
show_parameters(fptr, my_chemistry);
fclose(fptr);
}

fprintf(stdout, "Grackle run-time parameters:\n");
show_parameters(stdout, my_chemistry);
Expand Down
Loading