diff --git a/examples/GEAR/getChemistryTable.sh b/examples/GEAR/getChemistryTable.sh index b8f8ac7886e568c914ecad6db97257196cc4c23d..410b0e49cfeb32a4849696d770d332f9bf630f5b 100755 --- a/examples/GEAR/getChemistryTable.sh +++ b/examples/GEAR/getChemistryTable.sh @@ -1,2 +1,3 @@ #!/bin/bash wget https://obswww.unige.ch/lastro/projects/Clastro/PySWIFTsim/chemistry-AGB+OMgSFeZnSrYBaEu-16072013.h5 +wget https://obswww.unige.ch/lastro/projects/Clastro/PySWIFTsim/chemistry-PopIII.hdf5 diff --git a/examples/parameter_example.yml b/examples/parameter_example.yml index 9e63352dddde47b3e2d2a8a5997a38aae5c5038a..77d18ef92855a2f0f5b0ed584df3def6048e96bf 100644 --- a/examples/parameter_example.yml +++ b/examples/parameter_example.yml @@ -527,9 +527,12 @@ EAGLEFeedback: # GEAR feedback model GEARFeedback: - supernovae_energy_erg: 0.135e51 # Energy released by a single supernovae. + supernovae_energy_erg: 0.1e51 # Energy released by a single supernovae. yields_table: chemistry-AGB+OMgSFeZnSrYBaEu-16072013.h5 # Table containing the yields. + yields_table: chemistry-PopIII.hdf5 # Table containing the yields of the first stars. + metallicity_max_first_stars: -1 # Maximal metallicity (in mass fraction) for a first star (-1 to deactivate). discrete_yields: 0 # Should we use discrete yields or the IMF integrated one? + elements: [Fe, Mg, O, S, Zn, Sr, Y, Ba, Eu] # Elements to read in the yields table. The number of element should be one less than the number of elements (N) requested during the configuration (--with-chemistry=GEAR_N). # Parameters related to AGN models ----------------------------------------------- diff --git a/src/feedback/GEAR/feedback.c b/src/feedback/GEAR/feedback.c index e32c72dd4914bb5b11d73d89e39de85205966282..8532ab316a49cdc560afdd6533d3fb34f3019fe3 100644 --- a/src/feedback/GEAR/feedback.c +++ b/src/feedback/GEAR/feedback.c @@ -242,10 +242,17 @@ void feedback_evolve_spart(struct spart* restrict sp, sp->feedback_data.enrichment_weight *= hi_inv_dim; + /* Pick the correct table. (if only one table, threshold is < 0) */ + const float metal = chemistry_get_total_metal_mass_fraction_for_feedback(sp); + const float threshold = feedback_props->metallicity_max_first_stars; + + const struct stellar_model* model = + metal < threshold ? &feedback_props->stellar_model_first_stars + : &feedback_props->stellar_model; + /* Compute the stellar evolution */ - stellar_evolution_evolve_spart(sp, &feedback_props->stellar_model, cosmo, us, - phys_const, ti_begin, star_age_beg_step_safe, - dt); + stellar_evolution_evolve_spart(sp, model, cosmo, us, phys_const, ti_begin, + star_age_beg_step_safe, dt); /* Transform the number of SN to the energy */ sp->feedback_data.energy_ejected = @@ -264,6 +271,9 @@ void feedback_struct_dump(const struct feedback_props* feedback, FILE* stream) { stream, "feedback", "feedback function"); stellar_evolution_dump(&feedback->stellar_model, stream); + if (feedback->metallicity_max_first_stars != -1) { + stellar_evolution_dump(&feedback->stellar_model_first_stars, stream); + } } /** @@ -279,6 +289,10 @@ void feedback_struct_restore(struct feedback_props* feedback, FILE* stream) { NULL, "feedback function"); stellar_evolution_restore(&feedback->stellar_model, stream); + + if (feedback->metallicity_max_first_stars != -1) { + stellar_evolution_restore(&feedback->stellar_model_first_stars, stream); + } } /** @@ -289,4 +303,7 @@ void feedback_struct_restore(struct feedback_props* feedback, FILE* stream) { void feedback_clean(struct feedback_props* feedback) { stellar_evolution_clean(&feedback->stellar_model); + if (feedback->metallicity_max_first_stars != -1) { + stellar_evolution_clean(&feedback->stellar_model_first_stars); + } } diff --git a/src/feedback/GEAR/feedback_properties.h b/src/feedback/GEAR/feedback_properties.h index df79e6e797e999a72903842e2219704209633775..812693933b521fb28eade94065073a9b5290bf52 100644 --- a/src/feedback/GEAR/feedback_properties.h +++ b/src/feedback/GEAR/feedback_properties.h @@ -31,11 +31,14 @@ struct feedback_props { /*! Energy per supernovae */ float energy_per_supernovae; - /*! filename of the chemistry table */ - char filename[PARSER_MAX_LINE_SIZE]; - /*! The stellar model */ struct stellar_model stellar_model; + + /*! The stellar model for first stars */ + struct stellar_model stellar_model_first_stars; + + /* Metallicity limits for the first stars */ + float metallicity_max_first_stars; }; /** @@ -51,13 +54,36 @@ __attribute__((always_inline)) INLINE static void feedback_props_print( return; } + /* Print the name of the elements */ + char txt[GEAR_CHEMISTRY_ELEMENT_COUNT * (GEAR_LABELS_SIZE + 2)] = ""; + for (int i = 0; i < GEAR_CHEMISTRY_ELEMENT_COUNT; i++) { + if (i != 0) { + strcat(txt, ", "); + } + strcat(txt, stellar_evolution_get_element_name( + &feedback_props->stellar_model, i)); + } + + if (engine_rank == 0) { + message("Chemistry elements: %s", txt); + } + /* Print the feedback properties */ message("Energy per supernovae = %.2g", feedback_props->energy_per_supernovae); - message("Yields table = %s", feedback_props->filename); + message("Yields table = %s", feedback_props->stellar_model.yields_table); /* Print the stellar model */ stellar_model_print(&feedback_props->stellar_model); + + /* Print the first stars */ + if (feedback_props->metallicity_max_first_stars != -1) { + message("Yields table first stars = %s", + feedback_props->stellar_model_first_stars.yields_table); + stellar_model_print(&feedback_props->stellar_model_first_stars); + message("Metallicity max for the first stars (in mass fraction) = %g", + feedback_props->metallicity_max_first_stars); + } } /** @@ -81,13 +107,33 @@ __attribute__((always_inline)) INLINE static void feedback_props_init( e_feedback /= units_cgs_conversion_factor(us, UNIT_CONV_ENERGY); fp->energy_per_supernovae = e_feedback; - /* filename of the chemistry table */ - parser_get_param_string(params, "GEARFeedback:yields_table", fp->filename); + /* filename of the chemistry tables. */ + parser_get_param_string(params, "GEARFeedback:yields_table", + fp->stellar_model.yields_table); - /* Initialize the stellar model */ + /* Initialize the stellar models. */ stellar_evolution_props_init(&fp->stellar_model, phys_const, us, params, cosmo); + /* Now the same for first stars. */ + fp->metallicity_max_first_stars = parser_get_opt_param_float( + params, "GEARFeedback:metallicity_max_first_stars", -1); + + if (fp->metallicity_max_first_stars == -1) { + message("First stars are disabled."); + } else { + if (fp->metallicity_max_first_stars < 0) { + error( + "The metallicity threshold for the first stars is in mass fraction. " + "It cannot be lower than 0."); + } + message("Reading the stellar model for the first stars"); + parser_get_param_string(params, "GEARFeedback:yields_table_first_stars", + fp->stellar_model_first_stars.yields_table); + stellar_evolution_props_init(&fp->stellar_model_first_stars, phys_const, us, + params, cosmo); + } + /* Print the stellar properties */ feedback_props_print(fp); diff --git a/src/feedback/GEAR/initial_mass_function.c b/src/feedback/GEAR/initial_mass_function.c index a08420b3ef9e147c01f681bfe5000cd9af3c1413..d78809dbe6fbb406e5120cd93b10fcb6cb238399 100644 --- a/src/feedback/GEAR/initial_mass_function.c +++ b/src/feedback/GEAR/initial_mass_function.c @@ -333,15 +333,15 @@ void initial_mass_function_compute_coefficients( * * @param imf The #initial_mass_function. * @param params The #swift_params. + * @param filename The filename of the chemistry table. */ void initial_mass_function_read_from_table(struct initial_mass_function *imf, - struct swift_params *params) { + struct swift_params *params, + const char *filename) { hid_t file_id, group_id; /* Open IMF group */ - char filename[FILENAME_BUFFER_SIZE]; - parser_get_param_string(params, "GEARFeedback:yields_table", filename); h5_open_group(filename, "Data/IMF", &file_id, &group_id); /* Read number of parts */ @@ -381,58 +381,6 @@ void initial_mass_function_read_from_table(struct initial_mass_function *imf, h5_close_group(file_id, group_id); } -/** - * @brief Reads the parameters file and if required overwrites the parameters - * found in the yields table. - * - * @param imf The #initial_mass_function. - * @param params The #swift_params. - */ -void initial_mass_function_read_from_params(struct initial_mass_function *imf, - struct swift_params *params) { - - /* Read the number of elements */ - const int n_parts = parser_get_opt_param_int( - params, "GEARInitialMassFunction:number_function_part", imf->n_parts); - - const int n_parts_changed = n_parts != imf->n_parts; - imf->n_parts = n_parts; - - /* Reallocate the exponent memory */ - if (n_parts_changed) { - free(imf->exp); - if ((imf->exp = (float *)malloc(sizeof(float) * imf->n_parts)) == NULL) - error("Failed to allocate the IMF exponents."); - } - - /* Read the exponents */ - const char *exponent_name = "GEARInitialMassFunction:exponents"; - if (n_parts_changed) { - parser_get_param_float_array(params, exponent_name, imf->n_parts, imf->exp); - } else { - parser_get_opt_param_float_array(params, exponent_name, imf->n_parts, - imf->exp); - } - - /* Reallocate the mass limits memory */ - if (n_parts_changed) { - free(imf->mass_limits); - if ((imf->mass_limits = - (float *)malloc(sizeof(float) * (imf->n_parts + 1))) == NULL) - error("Failed to allocate the IMF masses."); - } - - /* Read the mass limits */ - const char *mass_limits_name = "GEARInitialMassFunction:mass_limits_msun"; - if (n_parts_changed) { - parser_get_param_float_array(params, mass_limits_name, imf->n_parts + 1, - imf->mass_limits); - } else { - parser_get_opt_param_float_array(params, mass_limits_name, imf->n_parts + 1, - imf->mass_limits); - } -} - /** * @brief Initialize the initial mass function. * @@ -440,17 +388,16 @@ void initial_mass_function_read_from_params(struct initial_mass_function *imf, * @param phys_const The #phys_const. * @param us The #unit_system. * @param params The #swift_params. + * @param filename The filename of the chemistry table. */ void initial_mass_function_init(struct initial_mass_function *imf, const struct phys_const *phys_const, const struct unit_system *us, - struct swift_params *params) { + struct swift_params *params, + const char *filename) { /* Read the parameters from the yields table */ - initial_mass_function_read_from_table(imf, params); - - /* Overwrites the parameters if found in the params file */ - initial_mass_function_read_from_params(imf, params); + initial_mass_function_read_from_table(imf, params, filename); /* Write the masses in the correct attributes */ imf->mass_min = imf->mass_limits[0]; diff --git a/src/feedback/GEAR/initial_mass_function.h b/src/feedback/GEAR/initial_mass_function.h index f4f2db6f7a9d96dd559345685e24ad593398f698..dc53dfd06594959c374686358c662f2f108345ad 100644 --- a/src/feedback/GEAR/initial_mass_function.h +++ b/src/feedback/GEAR/initial_mass_function.h @@ -41,14 +41,14 @@ void initial_mass_function_compute_coefficients( struct initial_mass_function *imf); void initial_mass_function_read_from_table(struct initial_mass_function *imf, - struct swift_params *params); -void initial_mass_function_read_from_params(struct initial_mass_function *imf, - struct swift_params *params); + struct swift_params *params, + const char *filename); void initial_mass_function_init(struct initial_mass_function *imf, const struct phys_const *phys_const, const struct unit_system *us, - struct swift_params *params); + struct swift_params *params, + const char *filename); void initial_mass_function_dump(const struct initial_mass_function *imf, FILE *stream, const struct stellar_model *sm); diff --git a/src/feedback/GEAR/lifetime.h b/src/feedback/GEAR/lifetime.h index 5025fb090404ebc688e347ba7b8060c57b22a111..fc06af4409cd63fd597b7bd03b4b8154be063bfd 100644 --- a/src/feedback/GEAR/lifetime.h +++ b/src/feedback/GEAR/lifetime.h @@ -124,15 +124,14 @@ lifetime_get_log_mass_from_lifetime(const struct lifetime* life, float log_time, * * @param lt The #lifetime. * @param params The #swift_params. + * @param filename The filename of the chemistry table. */ __attribute__((always_inline)) INLINE static void lifetime_read_from_tables( - struct lifetime* lt, struct swift_params* params) { + struct lifetime* lt, struct swift_params* params, const char* filename) { hid_t file_id, group_id; /* Open IMF group */ - char filename[256]; - parser_get_param_string(params, "GEARFeedback:yields_table", filename); h5_open_group(filename, "Data/LifeTimes", &file_id, &group_id); /* Allocate the temporary array */ @@ -156,28 +155,6 @@ __attribute__((always_inline)) INLINE static void lifetime_read_from_tables( h5_close_group(file_id, group_id); } -/** - * @brief Read lifetime parameters from params. - * - * @param lt The #lifetime. - * @param params The #swift_params. - */ -__attribute__((always_inline)) INLINE static void lifetime_read_from_params( - struct lifetime* lt, struct swift_params* params) { - - /* Read quadratic terms */ - parser_get_opt_param_float_array(params, "GEARLifetime:quadratic", 3, - lt->quadratic); - - /* Read linear terms */ - parser_get_opt_param_float_array(params, "GEARLifetime:linear", 3, - lt->linear); - - /* Read constant terms */ - parser_get_opt_param_float_array(params, "GEARLifetime:constant", 3, - lt->constant); -} - /** * @brief Inititialize the Lifetime. * @@ -185,16 +162,15 @@ __attribute__((always_inline)) INLINE static void lifetime_read_from_params( * @param phys_const The #phys_const. * @param us The #unit_system. * @param params The #swift_params. + * @param filename The filename of the chemistry table. */ __attribute__((always_inline)) INLINE static void lifetime_init( struct lifetime* lt, const struct phys_const* phys_const, - const struct unit_system* us, struct swift_params* params) { + const struct unit_system* us, struct swift_params* params, + const char* filename) { /* Read params from yields table */ - lifetime_read_from_tables(lt, params); - - /* overwrite the parameters if found in the params */ - lifetime_read_from_params(lt, params); + lifetime_read_from_tables(lt, params, filename); /* Change units from yr into Myr */ const int dim = 3; diff --git a/src/feedback/GEAR/stellar_evolution.c b/src/feedback/GEAR/stellar_evolution.c index 2dcbc0b5ee63ce3b482b0aed25565f0ae751f066..ec89d23e6c56cc428b9e3606e3605057fc54d4c2 100644 --- a/src/feedback/GEAR/stellar_evolution.c +++ b/src/feedback/GEAR/stellar_evolution.c @@ -382,42 +382,37 @@ const char* stellar_evolution_get_element_name(const struct stellar_model* sm, void stellar_evolution_read_elements(struct stellar_model* sm, struct swift_params* params) { - hid_t file_id, group_id; - - /* Open IMF group */ - h5_open_group(sm->yields_table, "Data", &file_id, &group_id); - - /* Read the elements */ - io_read_string_array_attribute(group_id, "elts", sm->elements_name, - GEAR_CHEMISTRY_ELEMENT_COUNT, - GEAR_LABELS_SIZE); - - /* Check that we received correctly the metals */ - if (strcmp(stellar_evolution_get_element_name( - sm, GEAR_CHEMISTRY_ELEMENT_COUNT - 1), - "Metals") != 0) { + /* Read the elements from the parameter file. */ + int nval = -1; + char** elements; + parser_get_param_string_array(params, "GEARFeedback:elements", &nval, + &elements); + + /* Check that we have the correct number of elements. */ + if (nval != GEAR_CHEMISTRY_ELEMENT_COUNT - 1) { error( - "The chemistry table should contain the metals in the last column " - "(found %s)", - stellar_evolution_get_element_name(sm, - GEAR_CHEMISTRY_ELEMENT_COUNT - 1)); + "You need to provide %i elements but found %i. " + "If you wish to provide a different number of elements, " + "you need to compile with --with-chemistry=GEAR_N where N " + "is the number of elements + 1.", + GEAR_CHEMISTRY_ELEMENT_COUNT, nval); } - /* Print the name of the elements */ - char txt[GEAR_CHEMISTRY_ELEMENT_COUNT * (GEAR_LABELS_SIZE + 2)] = ""; - for (int i = 0; i < GEAR_CHEMISTRY_ELEMENT_COUNT; i++) { - if (i != 0) { - strcat(txt, ", "); + /* Copy the elements into the stellar model. */ + for (int i = 0; i < nval; i++) { + if (strlen(elements[i]) >= GEAR_LABELS_SIZE) { + error("Element name '%s' too long", elements[i]); } - strcat(txt, stellar_evolution_get_element_name(sm, i)); + strcpy(sm->elements_name + i * GEAR_LABELS_SIZE, elements[i]); } - if (engine_rank == 0) { - message("Chemistry elements: %s", txt); - } + /* Cleanup. */ + parser_free_param_string_array(nval, elements); - /* Cleanup everything */ - h5_close_group(file_id, group_id); + /* Add the metals to the end. */ + strcpy( + sm->elements_name + (GEAR_CHEMISTRY_ELEMENT_COUNT - 1) * GEAR_LABELS_SIZE, + "Metals"); } /** @@ -435,10 +430,6 @@ void stellar_evolution_props_init(struct stellar_model* sm, struct swift_params* params, const struct cosmology* cosmo) { - /* Get filename. */ - parser_get_param_string(params, "GEARFeedback:yields_table", - sm->yields_table); - /* Read the list of elements */ stellar_evolution_read_elements(sm, params); @@ -447,10 +438,11 @@ void stellar_evolution_props_init(struct stellar_model* sm, parser_get_param_int(params, "GEARFeedback:discrete_yields"); /* Initialize the initial mass function */ - initial_mass_function_init(&sm->imf, phys_const, us, params); + initial_mass_function_init(&sm->imf, phys_const, us, params, + sm->yields_table); /* Initialize the lifetime model */ - lifetime_init(&sm->lifetime, phys_const, us, params); + lifetime_init(&sm->lifetime, phys_const, us, params, sm->yields_table); /* Initialize the supernovae Ia model */ supernovae_ia_init(&sm->snia, phys_const, us, params, sm); diff --git a/src/feedback/GEAR/supernovae_ia.c b/src/feedback/GEAR/supernovae_ia.c index d09312c4a5125bc549f1b0a341fb30b1c7cb49ff..14fc5641e59953c69ad0f73dbc4463ae945fb16c 100644 --- a/src/feedback/GEAR/supernovae_ia.c +++ b/src/feedback/GEAR/supernovae_ia.c @@ -168,26 +168,32 @@ float supernovae_ia_get_number_per_unit_mass(const struct supernovae_ia *snia, * @param snia The #supernovae_ia model. * @param params The #swift_params. * @param sm The #stellar_model. + * @param filename The filename of the chemistry table. */ void supernovae_ia_read_yields(struct supernovae_ia *snia, struct swift_params *params, - const struct stellar_model *sm) { + const struct stellar_model *sm, + const char *filename) { hid_t file_id, group_id; - const int number_labels = GEAR_CHEMISTRY_ELEMENT_COUNT + 2; /* Open IMF group */ - char filename[FILENAME_BUFFER_SIZE]; - parser_get_param_string(params, "GEARFeedback:yields_table", filename); h5_open_group(filename, "Data/SNIa/Metals", &file_id, &group_id); + /* Get the number of elements. */ + const hid_t attr = H5Aopen(group_id, "elts", H5P_DEFAULT); + if (attr < 0) error("Error while opening attribute elts in Data/SNIa/Metals"); + + size_t nval = io_get_number_element_in_attribute(attr); + H5Aclose(attr); + /* Read the yields */ - float *yields = (float *)malloc(sizeof(float) * number_labels); - io_read_array_attribute(group_id, "data", FLOAT, yields, number_labels); + float *yields = (float *)malloc(sizeof(float) * nval); + io_read_array_attribute(group_id, "data", FLOAT, yields, nval); /* Read the labels */ - char labels[(GEAR_CHEMISTRY_ELEMENT_COUNT + 2) * GEAR_LABELS_SIZE] = ""; - io_read_string_array_attribute(group_id, "elts", labels, number_labels, + char *labels = malloc(nval * GEAR_LABELS_SIZE); + io_read_string_array_attribute(group_id, "elts", labels, nval, GEAR_LABELS_SIZE); /* Save the yields */ @@ -195,7 +201,7 @@ void supernovae_ia_read_yields(struct supernovae_ia *snia, for (int i = 0; i < GEAR_CHEMISTRY_ELEMENT_COUNT; i++) { int found = 0; /* Loop over SNIa yields labels */ - for (int j = 0; j < number_labels; j++) { + for (size_t j = 0; j < nval; j++) { const char *s1 = labels + j * GEAR_LABELS_SIZE; const char *s2 = stellar_evolution_get_element_name(sm, i); if (strcmp(s1, s2) == 0) { @@ -207,13 +213,14 @@ void supernovae_ia_read_yields(struct supernovae_ia *snia, /* Check if found an element */ if (!found) { - error("Cannot find element %s in SNIa yields", + error("Cannot find element '%s' in SNIa yields", stellar_evolution_get_element_name(sm, i)); } } /* Cleanup everything */ free(yields); + free(labels); h5_close_group(file_id, group_id); }; @@ -242,15 +249,15 @@ void supernovae_ia_init_companion(struct supernovae_ia *snia) { * * @param snia The #supernovae_ia model. * @param params The simulation parameters. + * @param filename The filename of the chemistry table. */ void supernovae_ia_read_from_tables(struct supernovae_ia *snia, - struct swift_params *params) { + struct swift_params *params, + const char *filename) { hid_t file_id, group_id; /* Open IMF group */ - char filename[FILENAME_BUFFER_SIZE]; - parser_get_param_string(params, "GEARFeedback:yields_table", filename); h5_open_group(filename, "Data/SNIa", &file_id, &group_id); /* Read the exponent of the IMF for companion */ @@ -295,62 +302,6 @@ void supernovae_ia_read_from_tables(struct supernovae_ia *snia, h5_close_group(file_id, group_id); } -/** - * @brief Reads the supernovae Ia parameters from the parameters file. - * - * @param snia The #supernovae_ia model. - * @param params The simulation parameters. - */ -void supernovae_ia_read_from_params(struct supernovae_ia *snia, - struct swift_params *params) { - - /* Read the exponent of the IMF for companion */ - snia->companion_exponent = parser_get_opt_param_float( - params, "GEARSupernovaeIa:exponent", snia->companion_exponent); - - /* Read the minimal mass for a white dwarf */ - snia->mass_min_progenitor = parser_get_opt_param_float( - params, "GEARSupernovaeIa:min_mass_white_dwarf_progenitor", - snia->mass_min_progenitor); - - /* Read the maximal mass for a white dwarf */ - snia->mass_max_progenitor = parser_get_opt_param_float( - params, "GEARSupernovaeIa:max_mass_white_dwarf_progenitor", - snia->mass_max_progenitor); - - /* Read the maximal mass of a red giant companion */ - snia->companion[0].mass_max = - parser_get_opt_param_float(params, "GEARSupernovaeIa:max_mass_red_giant", - snia->companion[0].mass_max); - - /* Read the minimal mass of a red giant companion */ - snia->companion[0].mass_min = - parser_get_opt_param_float(params, "GEARSupernovaeIa:min_mass_red_giant", - snia->companion[0].mass_min); - - /* Read the coefficient of the main sequence companion */ - snia->companion[0].coef = parser_get_opt_param_float( - params, "GEARSupernovaeIa:coef_red_giant", snia->companion[0].coef); - - /* Read the maximal mass of a main sequence companion */ - snia->companion[1].mass_max = parser_get_opt_param_float( - params, "GEARSupernovaeIa:max_mass_main_sequence", - snia->companion[1].mass_max); - - /* Read the minimal mass of a main sequence companion */ - snia->companion[1].mass_min = parser_get_opt_param_float( - params, "GEARSupernovaeIa:min_mass_main_sequence", - snia->companion[1].mass_min); - - /* Read the coefficient of the main sequence companion */ - snia->companion[1].coef = parser_get_opt_param_float( - params, "GEARSupernovaeIa:coef_main_sequence", snia->companion[1].coef); - - /* Read the mass of a white dwarf */ - snia->mass_white_dwarf = parser_get_opt_param_float( - params, "GEARSupernovaeIa:white_dwarf_mass", snia->mass_white_dwarf); -} - /** * @brief Initialize the #supernovae_ia structure. * @@ -367,13 +318,10 @@ void supernovae_ia_init(struct supernovae_ia *snia, const struct stellar_model *sm) { /* Read the parameters from the tables */ - supernovae_ia_read_from_tables(snia, params); - - /* Read the parameters from the params file */ - supernovae_ia_read_from_params(snia, params); + supernovae_ia_read_from_tables(snia, params, sm->yields_table); /* Read the yields */ - supernovae_ia_read_yields(snia, params, sm); + supernovae_ia_read_yields(snia, params, sm, sm->yields_table); /* Get the IMF parameters */ snia->progenitor_exponent = initial_mass_function_get_exponent( diff --git a/src/feedback/GEAR/supernovae_ia.h b/src/feedback/GEAR/supernovae_ia.h index ef533e7f335042d5583b90a0923ca688620324f0..2a21fbb1d1a026da16a12e1e22317968fc1586c7 100644 --- a/src/feedback/GEAR/supernovae_ia.h +++ b/src/feedback/GEAR/supernovae_ia.h @@ -37,15 +37,14 @@ float supernovae_ia_get_number_per_unit_mass(const struct supernovae_ia *snia, void supernovae_ia_read_yields(struct supernovae_ia *snia, struct swift_params *params, - const struct stellar_model *sm); + const struct stellar_model *sm, + const char *filename); void supernovae_ia_init_companion(struct supernovae_ia *snia); void supernovae_ia_read_from_tables(struct supernovae_ia *snia, - struct swift_params *params); - -void supernovae_ia_read_from_params(struct supernovae_ia *snia, - struct swift_params *params); + struct swift_params *params, + const char *filename); void supernovae_ia_init(struct supernovae_ia *snia, const struct phys_const *phys_const, diff --git a/src/feedback/GEAR/supernovae_ii.c b/src/feedback/GEAR/supernovae_ii.c index 166db97e09a85093b8101b2d86582606341cf504..a6e4260e6336d52bdf3d5bad0f1849d126c85a74 100644 --- a/src/feedback/GEAR/supernovae_ii.c +++ b/src/feedback/GEAR/supernovae_ii.c @@ -318,38 +318,20 @@ void supernovae_ii_read_yields(struct supernovae_ii *snii, h5_close_group(file_id, group_id); }; -/** - * @brief Reads the supernovae II parameters from parameters file. - * - * @param snii The #supernovae_ii model. - * @param params The simulation parameters. - */ -void supernovae_ii_read_from_params(struct supernovae_ii *snii, - struct swift_params *params) { - - /* Read the minimal mass of a supernovae */ - snii->mass_min = parser_get_opt_param_float( - params, "GEARSupernovaeII:min_mass", snii->mass_min); - - /* Read the maximal mass of a supernovae */ - snii->mass_max = parser_get_opt_param_float( - params, "GEARSupernovaeII:max_mass", snii->mass_max); -} - /** * @brief Reads the supernovae II parameters from tables. * * @param snii The #supernovae_ii model. * @param params The simulation parameters. + * @param filename The filename of the chemistry table. */ void supernovae_ii_read_from_tables(struct supernovae_ii *snii, - struct swift_params *params) { + struct swift_params *params, + const char *filename) { hid_t file_id, group_id; /* Open IMF group */ - char filename[FILENAME_BUFFER_SIZE]; - parser_get_param_string(params, "GEARFeedback:yields_table", filename); h5_open_group(filename, "Data/SNII", &file_id, &group_id); /* Read the minimal mass of a supernovae */ @@ -373,10 +355,7 @@ void supernovae_ii_init(struct supernovae_ii *snii, struct swift_params *params, const struct stellar_model *sm) { /* Read the parameters from the tables */ - supernovae_ii_read_from_tables(snii, params); - - /* Read the parameters from the params file */ - supernovae_ii_read_from_params(snii, params); + supernovae_ii_read_from_tables(snii, params, sm->yields_table); /* Read the supernovae yields */ supernovae_ii_read_yields(snii, params, sm, /* restart */ 0); diff --git a/src/feedback/GEAR/supernovae_ii.h b/src/feedback/GEAR/supernovae_ii.h index c9b431bdff9ae94a964e0a7ba295e132c19bff37..8107fff264756c85e8e336b7bbc1b94dae42c4e1 100644 --- a/src/feedback/GEAR/supernovae_ii.h +++ b/src/feedback/GEAR/supernovae_ii.h @@ -60,7 +60,8 @@ void supernovae_ii_read_from_params(struct supernovae_ii *snii, struct swift_params *params); void supernovae_ii_read_from_tables(struct supernovae_ii *snii, - struct swift_params *params); + struct swift_params *params, + const char *filename); void supernovae_ii_init(struct supernovae_ii *snii, struct swift_params *params, const struct stellar_model *sm); void supernovae_ii_dump(const struct supernovae_ii *snii, FILE *stream,