diff --git a/examples/SubgridTests/StellarEvolution/stellar_evolution.yml b/examples/SubgridTests/StellarEvolution/stellar_evolution.yml index 559e415f706ebfbd0aa20db7b85dc79b61c48151..9baa1b57be2b14564c50aec2796d15fb3364aa17 100644 --- a/examples/SubgridTests/StellarEvolution/stellar_evolution.yml +++ b/examples/SubgridTests/StellarEvolution/stellar_evolution.yml @@ -78,33 +78,35 @@ EAGLEChemistry: # Properties of the EAGLE feedback and enrichment model. EAGLEFeedback: - use_SNe_feedback: 0 # No SNe feedback in this test. - use_AGB_enrichment: 1 - use_SNII_enrichment: 1 - use_SNIa_enrichment: 1 - filename: ./yieldtables/ - IMF_min_mass_Msun: 0.1 - IMF_max_mass_Msun: 100.0 - SNII_min_mass_Msun: 6.0 - SNII_max_mass_Msun: 100.0 - SNII_wind_delay_Gyr: 0.03 - SNII_delta_T_K: 3.16228e7 - SNII_Energy_erg: 1.0e51 - SNII_Energy_fraction_min: 3.0 - SNII_Energy_fraction_max: 0.3 - SNII_Energy_fraction_Z_0: 0.0012663729 - SNII_Energy_fraction_n_0_H_p_cm3: 0.67 - SNII_Energy_fraction_n_n: 0.8686 - SNII_Energy_fraction_n_Z: 0.8686 - SNIa_max_mass_Msun: 8.0 - SNIa_timescale_Gyr: 2.0 - SNIa_efficiency_p_Msun: 0.002 - SNII_yield_factor_Hydrogen: 1.0 # Correction to the yields following the EAGLE REF values - SNII_yield_factor_Helium: 1.0 - SNII_yield_factor_Carbon: 0.5 - SNII_yield_factor_Nitrogen: 1.0 - SNII_yield_factor_Oxygen: 1.0 - SNII_yield_factor_Neon: 1.0 - SNII_yield_factor_Magnesium: 2.0 - SNII_yield_factor_Silicon: 1.0 - SNII_yield_factor_Iron: 0.5 + use_SNe_feedback: 0 # Global switch for SNe thermal feedback. + use_AGB_enrichment: 1 # Global switch for enrichement from AGB stars. + use_SNII_enrichment: 1 # Global switch for enrichement from SNII stars. + use_SNIa_enrichment: 1 # Global switch for enrichement from SNIa stars. + filename: ./yieldtables/ # Path to the directory containing the EAGLE yield tables. + IMF_min_mass_Msun: 0.1 # Minimal stellar mass considered for the Chabrier IMF in solar masses. + IMF_max_mass_Msun: 100.0 # Maximal stellar mass considered for the Chabrier IMF in solar masses. + SNII_min_mass_Msun: 6.0 # Minimal mass considered for SNII feedback (not SNII enrichment!) in solar masses. + SNII_max_mass_Msun: 100.0 # Maximal mass considered for SNII feedback (not SNII enrichment!) in solar masses. + SNII_wind_delay_Gyr: 0.03 # Time in Gyr between a star's birth and the SNII thermal feedback event. + SNII_delta_T_K: 3.16228e7 # Change in temperature to apply to the gas particle in a SNII thermal feedback event in Kelvin. + SNII_Energy_erg: 1.0e51 # Energy of one SNII explosion in ergs. + SNII_Energy_fraction_min: 3.0 # Maximal fraction of energy applied in a SNII feedback event. + SNII_Energy_fraction_max: 0.3 # Minimal fraction of energy applied in a SNII feedback event. + SNII_Energy_fraction_Z_0: 0.0012663729 # Pivot point for the metallicity dependance of the SNII energy fraction (metal mass fraction). + SNII_Energy_fraction_n_0_H_p_cm3: 0.67 # Pivot point for the birth density dependance of the SNII energy fraction in cm^-3. + SNII_Energy_fraction_n_Z: 0.8686 # Power-law for the metallicity dependance of the SNII energy fraction. + SNII_Energy_fraction_n_n: 0.8686 # Power-law for the birth density dependance of the SNII energy fraction. + SNIa_max_mass_Msun: 8.0 # Maximal mass considered for SNIa feedback and enrichment in solar masses. + SNIa_timescale_Gyr: 2.0 # Time-scale of the exponential decay of the SNIa rates in Gyr. + SNIa_efficiency_p_Msun: 0.002 # Normalisation of the SNIa rates in inverse solar masses. + SNIa_Energy_erg: 1.0e51 # Energy of one SNIa explosion in ergs. + AGB_ejecta_velocity_km_p_s: 10.0 # Velocity of the AGB ejectas in km/s. + SNII_yield_factor_Hydrogen: 1.0 # (Optional) Correction factor to apply to the Hydrogen yield from the SNII channel. + SNII_yield_factor_Helium: 1.0 # (Optional) Correction factor to apply to the Helium yield from the SNII channel. + SNII_yield_factor_Carbon: 0.5 # (Optional) Correction factor to apply to the Carbon yield from the SNII channel. + SNII_yield_factor_Nitrogen: 1.0 # (Optional) Correction factor to apply to the Nitrogen yield from the SNII channel. + SNII_yield_factor_Oxygen: 1.0 # (Optional) Correction factor to apply to the Oxygen yield from the SNII channel. + SNII_yield_factor_Neon: 1.0 # (Optional) Correction factor to apply to the Neon yield from the SNII channel. + SNII_yield_factor_Magnesium: 2.0 # (Optional) Correction factor to apply to the Magnesium yield from the SNII channel. + SNII_yield_factor_Silicon: 1.0 # (Optional) Correction factor to apply to the Silicon yield from the SNII channel. + SNII_yield_factor_Iron: 0.5 # (Optional) Correction factor to apply to the Iron yield from the SNII channel. diff --git a/examples/parameter_example.yml b/examples/parameter_example.yml index 26a85f4bc2b40a9bfe21b3c7eaa5b25520e1e1be..d077a216890b04ce05e73110b34802f09a032dd5 100644 --- a/examples/parameter_example.yml +++ b/examples/parameter_example.yml @@ -360,6 +360,8 @@ EAGLEFeedback: SNIa_max_mass_Msun: 8.0 # Maximal mass considered for SNIa feedback and enrichment in solar masses. SNIa_timescale_Gyr: 2.0 # Time-scale of the exponential decay of the SNIa rates in Gyr. SNIa_efficiency_p_Msun: 0.002 # Normalisation of the SNIa rates in inverse solar masses. + SNIa_Energy_erg: 1.0e51 # Energy of one SNIa explosion in ergs. + AGB_ejecta_velocity_km_p_s: 10.0 # Velocity of the AGB ejectas in km/s. SNII_yield_factor_Hydrogen: 1.0 # (Optional) Correction factor to apply to the Hydrogen yield from the SNII channel. SNII_yield_factor_Helium: 1.0 # (Optional) Correction factor to apply to the Helium yield from the SNII channel. SNII_yield_factor_Carbon: 0.5 # (Optional) Correction factor to apply to the Carbon yield from the SNII channel. diff --git a/src/feedback/EAGLE/feedback.c b/src/feedback/EAGLE/feedback.c index 612fc8c798bf9c797a5e2b82694790c8f431ceb2..d0d05d35fa3840bf0f82a5da0ad334f90c1694b9 100644 --- a/src/feedback/EAGLE/feedback.c +++ b/src/feedback/EAGLE/feedback.c @@ -344,6 +344,9 @@ INLINE static void evolve_SNIa(const float log10_min_mass, sp->feedback_data.to_distribute.Fe_mass_from_SNIa += num_SNIa * props->yield_SNIa_IMF_resampled[chemistry_element_Fe] * props->solar_mass_to_mass; + + /* Compute the energy to be injected */ + sp->feedback_data.to_distribute.d_energy += num_SNIa * props->E_SNIa; } /** @@ -717,7 +720,7 @@ void compute_stellar_evolution(const struct feedback_props* feedback_props, /* Integration interval is zero - this can happen if minimum and maximum * dying masses are above imf_max_mass_Msun. Return without doing any - * feedback. */ + * enrichment. */ if (min_dying_mass_Msun == max_dying_mass_Msun) return; /* Life is better in log */ @@ -739,20 +742,27 @@ void compute_stellar_evolution(const struct feedback_props* feedback_props, stellar_yields, feedback_props, sp); } +#ifdef SWIFT_DEBUG_CHECKS + if (sp->feedback_data.to_distribute.mass != 0.f) + error("Injected mass will be lost"); +#endif + /* Compute the total mass to distribute (H + He metals) */ sp->feedback_data.to_distribute.mass = sp->feedback_data.to_distribute.total_metal_mass + sp->feedback_data.to_distribute.metal_mass[chemistry_element_H] + sp->feedback_data.to_distribute.metal_mass[chemistry_element_He]; - /* /\* Compute energy change due to thermal and kinetic energy of ejecta *\/ - */ - /* sp->feedback_data.to_distribute.d_energy = */ - /* sp->feedback_data.to_distribute.mass * */ - /* (feedback_props->ejecta_specific_thermal_energy + */ - /* 0.5 * (sp->v[0] * sp->v[0] + sp->v[1] * sp->v[1] + sp->v[2] * - * sp->v[2]) * */ - /* cosmo->a2_inv); */ + /* Compute energy change due to kinetic energy of ejectas */ + sp->feedback_data.to_distribute.d_energy += + sp->feedback_data.to_distribute.mass * + feedback_props->AGB_ejecta_specific_kinetic_energy; + + /* Compute energy change due to kinetic energy of the star */ + sp->feedback_data.to_distribute.d_energy += + sp->feedback_data.to_distribute.mass * 0.5f * + (sp->v[0] * sp->v[0] + sp->v[1] * sp->v[1] + sp->v[2] * sp->v[2]) * + cosmo->a2_inv; } /** @@ -867,6 +877,27 @@ void feedback_props_init(struct feedback_props* fp, parser_get_param_float(params, "EAGLEFeedback:SNIa_timescale_Gyr"); fp->SNIa_timescale_Gyr_inv = 1.f / fp->SNIa_timescale_Gyr; + /* Energy released by supernova type Ia */ + fp->E_SNIa_cgs = + parser_get_param_double(params, "EAGLEFeedback:SNIa_Energy_erg"); + fp->E_SNIa = + fp->E_SNIa_cgs / units_cgs_conversion_factor(us, UNIT_CONV_ENERGY); + + /* Properties of the SNIa enrichment model -------------------------------- */ + + /* Read AGB ejecta velocity */ + const float ejecta_velocity_km_p_s = parser_get_param_float( + params, "EAGLEFeedback:AGB_ejecta_velocity_km_p_s"); + + /* Convert to internal units */ + const float ejecta_velocity_cgs = ejecta_velocity_km_p_s * 1e5; + const float ejecta_velocity = + ejecta_velocity_cgs / units_cgs_conversion_factor(us, UNIT_CONV_SPEED); + + /* Convert to specific thermal energy */ + fp->AGB_ejecta_specific_kinetic_energy = + 0.5f * ejecta_velocity * ejecta_velocity; + /* Gather common conversion factors --------------------------------------- */ /* Calculate internal mass to solar mass conversion factor */ @@ -889,14 +920,6 @@ void feedback_props_init(struct feedback_props* fp, fp->rho_to_n_cgs = (X_H / m_p) * units_cgs_conversion_factor(us, UNIT_CONV_NUMBER_DENSITY); - // MATTHIEU up to here - - /* Set ejecta thermal energy */ - const float ejecta_velocity = - 1.0e6 / units_cgs_conversion_factor( - us, UNIT_CONV_SPEED); // EAGLE parameter is 10 km/s - fp->ejecta_specific_thermal_energy = 0.5 * ejecta_velocity * ejecta_velocity; - /* Initialise the IMF ------------------------------------------------- */ init_imf(fp); diff --git a/src/feedback/EAGLE/feedback_iact.h b/src/feedback/EAGLE/feedback_iact.h index 151308696ede4d67bf1e26f7cb5a7ca54cf7e9a0..c32524dceaea5a544df32b70464d95040e5e29a4 100644 --- a/src/feedback/EAGLE/feedback_iact.h +++ b/src/feedback/EAGLE/feedback_iact.h @@ -216,15 +216,14 @@ runner_iact_nonsym_feedback_apply(const float r2, const float *dx, pj->chemistry_data.metal_mass_fraction_from_AGB = new_metal_mass_from_AGB / new_mass; - /* /\* Update momentum *\/ */ - /* for (int i = 0; i < 3; i++) { */ - /* pj->v[i] += si->feedback_data.to_distribute.mass * Omega_frac * */ - /* (si->v[i] - pj->v[i]); */ - /* } */ + /* Update momentum */ + for (int i = 0; i < 3; i++) { + pj->v[i] += si->feedback_data.to_distribute.mass * Omega_frac * + (si->v[i] - pj->v[i]); + } /* Energy feedback */ - // d_energy += si->feedback_data.to_distribute.d_energy * - // Omega_frac; + // d_energy += ; /* if (feedback_props->continuous_heating) { */ /* // We're doing ONLY continuous heating */ @@ -233,16 +232,18 @@ runner_iact_nonsym_feedback_apply(const float r2, const float *dx, /* si->mass_init; */ /* } else { */ - /* /\* Add contribution from thermal and kinetic energy of ejected material */ - /* (and continuous SNIa feedback) *\/ */ - /* u_init = hydro_get_physical_internal_energy(pj, xp, cosmo); */ - /* du = d_energy / hydro_get_mass(pj); */ - /* hydro_set_physical_internal_energy(pj, xp, cosmo, u_init + du); */ - /* hydro_set_drifted_physical_internal_energy(pj, cosmo, u_init + du); */ + /* Add contribution from thermal and kinetic energy of ejected material + (and continuous SNIa feedback) */ + /* const double u_init = hydro_get_physical_internal_energy(pj, xp, cosmo); */ + /* const double delta_energy = si->feedback_data.to_distribute.d_energy * + * Omega_frac; */ + /* const double delta_u = delta_energy / new_mass; */ + /* const double u_new = u_init + delta_u; */ + /* hydro_set_physical_internal_energy(pj, xp, cosmo, u_new); */ + /* hydro_set_drifted_physical_internal_energy(pj, cosmo, u_new); */ /* Get the SNII feedback properties */ const float prob = si->feedback_data.to_distribute.SNII_heating_probability; - const float delta_u = si->feedback_data.to_distribute.SNII_delta_u; /* Are we doing some SNII feedback? */ if (prob > 0.f) { @@ -254,8 +255,9 @@ runner_iact_nonsym_feedback_apply(const float r2, const float *dx, if (rand < prob) { /* Compute new energy of this particle */ - const float u_init = hydro_get_physical_internal_energy(pj, xp, cosmo); - const float u_new = u_init + delta_u; + const double u_init = hydro_get_physical_internal_energy(pj, xp, cosmo); + const float delta_u = si->feedback_data.to_distribute.SNII_delta_u; + const double u_new = u_init + delta_u; /* Inject energy into the particle */ hydro_set_physical_internal_energy(pj, xp, cosmo, u_new); diff --git a/src/feedback/EAGLE/feedback_properties.h b/src/feedback/EAGLE/feedback_properties.h index 3ea28b82d9689695236b239b7c5a3f7c7ffa2e9c..69aee1124c88ccb21a37d22dea5b720a3af8d0aa 100644 --- a/src/feedback/EAGLE/feedback_properties.h +++ b/src/feedback/EAGLE/feedback_properties.h @@ -87,11 +87,6 @@ struct feedback_props { /*! Are we doing SNIa enrichment? */ int with_SNIa_enrichment; - /* ------------ Energy injection ----------------- */ - - /* Kinetic energy of SN ejecta per unit mass (check name with Richard)*/ - float ejecta_specific_thermal_energy; - /* ------------ Yield tables ----------------- */ /* Yield tables for AGB and SNII */ @@ -138,6 +133,17 @@ struct feedback_props { /*! Log 10 of the maximal mass used for SNIa feedback (in solar masses) */ float log10_SNIa_max_mass_msun; + /*! Energy released by one supernova type II in cgs units */ + double E_SNIa_cgs; + + /*! Energy released by one supernova type II in internal units */ + float E_SNIa; + + /* ------------- AGB parameters ---------------- */ + + /*! Specific kinetic energy injected from AGB ejectas (in internal units). */ + float AGB_ejecta_specific_kinetic_energy; + /* ------------- Conversion factors --------------- */ /*! Conversion factor from internal mass unit to solar mass */