/*******************************************************************************
* This file is part of SWIFT.
* Copyright (c) 2018 Matthieu Schaller (schaller@strw.leidenuniv.nl)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*
******************************************************************************/
#ifndef SWIFT_EAGLE_FEEDBACK_PROPERTIES_THERMAL_H
#define SWIFT_EAGLE_FEEDBACK_PROPERTIES_THERMAL_H
/* Config parameters. */
#include
/* Local includes. */
#include "chemistry.h"
#include "hydro_properties.h"
/**
* @brief Modes of energy injection for SNII feedback
*/
enum SNII_feedback_models {
SNII_random_ngb_model, /*< Random neighbour model for SNII feedback */
SNII_isotropic_model, /*< Isotropic model of SNII feedback */
SNII_minimum_distance_model, /*< Minimum-distance model of SNII feedback */
SNII_minimum_density_model /*< Minimum-density model of SNII feedback */
};
/**
* @brief Form of SNII energy scaling with density and metallicity
*/
enum SNII_energy_scalings {
SNII_scaling_EAGLE, /*< Energy scaling as in EAGLE-Ref */
SNII_scaling_separable, /*< Separable Z and n dependence */
SNII_scaling_independent /*< Independent Z and n dependence */
};
/**
* @brief Stores AGB and SNII yield tables
*/
struct yield_table {
/*! Yield table mass bins */
double *mass;
/*! Yield table metallicity (metal mass fractions) bins */
double *metallicity;
/*! Array to store yield table (individual metals produced by the star)
resampled by IMF mass bins */
double *yield_IMF_resampled;
/*! Array to store yield table being read in */
double *yield;
/*! Array to store table of ejecta (metals alredy in the stars that are
ejected) resampled by IMF mass bins */
double *ejecta_IMF_resampled;
/*! Array to store table of ejecta being read in */
double *ejecta;
/*! Array to store table of total mass released ( metals produced by the star)
resampled by IMF mass bins */
double *total_metals_IMF_resampled;
/* Array to store table of total mass released being read in */
double *total_metals;
};
/**
* @brief Stores tables to determine stellar lifetimes. Used for calculation of
* IMF
*/
struct lifetime_table {
/* table of masses */
double *mass;
/* table of metallicities */
double *metallicity;
/* table of lifetimes depending on mass an metallicity */
double **dyingtime;
};
/**
* @brief Functional form of the SNIa delay time distribution.
*/
enum eagle_feedback_SNIa_DTD {
/*! Power-law with slope -1 */
eagle_feedback_SNIa_DTD_power_law = 1,
/*! Exponential model (EAGLE default) */
eagle_feedback_SNIa_DTD_exponential = 2
};
/**
* @brief Properties of the EAGLE feedback model.
*/
struct feedback_props {
/* ------------ Main operation modes ------------- */
/*! Are we doing AGB enrichment? */
int with_AGB_enrichment;
/*! Are we doing SNII enrichment? */
int with_SNII_enrichment;
/*! Are we doing SNIa enrichment? */
int with_SNIa_enrichment;
/*! Are we doing SNII feedback? */
int with_SNII_feedback;
/*! Are we doing SNIa feedback? */
int with_SNIa_feedback;
/* ------------ Yield tables ----------------- */
/* Yield tables for AGB and SNII */
struct yield_table yield_AGB;
struct yield_table yield_SNII;
/* Arrays of yield tables for SNIa */
double *yield_SNIa_IMF_resampled;
double yield_SNIa_total_metals_IMF_resampled;
double *yields_SNIa;
/* Arrays for names of elements being tracked for each enrichment channel */
char **SNIa_element_names;
char **SNII_element_names;
char **AGB_element_names;
/* Array of mass bins for yield calculations */
double *yield_mass_bins;
/* Location of yield tables */
char yield_table_path[200];
/* ------------- Lifetime tracks --------------- */
/* Table of lifetime values */
struct lifetime_table lifetimes;
/* ------------- SNII parameters --------------- */
/* Array of adjustment factors for SNII */
float SNII_yield_factor[chemistry_element_count];
/* ------------- SNIa parameters --------------- */
/* What delay time distribution are we using? */
enum eagle_feedback_SNIa_DTD SNIa_DTD;
/*! Normalisation of the SNIa DTD in the exponential model */
float SNIa_DTD_exp_norm;
/*! Time-scale of the SNIa decay function in the exponential model in
* Giga-years */
float SNIa_DTD_exp_timescale_Gyr;
/*! Inverse of time-scale of the SNIa decay function in the exponential model
* in Giga-years */
float SNIa_DTD_exp_timescale_Gyr_inv;
/*! Normalisation of the SNIa DTD in the power-law model */
float SNIa_DTD_power_law_norm;
/*! Stellar age below which no SNIa explode in Giga-years */
float SNIa_DTD_delay_Gyr;
/*! 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 */
double mass_to_solar_mass;
/*! Conversion factor from internal mass unit to solar mass */
double solar_mass_to_mass;
/*! Conversion factor from density in internal units to Hydrogen number
* density in cgs */
double rho_to_n_cgs;
/*! Conversion factor from temperature to internal energy */
float temp_to_u_factor;
/* ------------- Parameters for IMF --------------- */
/*! Array to store calculated IMF */
double *imf;
/*! Arrays to store IMF mass bins */
double *imf_mass_bin;
/*! Arrays to store IMF mass bins (log10)*/
double *imf_mass_bin_log10;
/*! Minimal stellar mass considered by the IMF (in solar masses) */
double imf_min_mass_msun;
/*! Maximal stellar mass considered by the IMF (in solar masses) */
double imf_max_mass_msun;
/*! Log 10 of the minimal stellar mass considered by the IMF (in solar masses)
*/
double log10_imf_min_mass_msun;
/*! Log 10 of the maximal stellar mass considered by the IMF (in solar masses)
*/
double log10_imf_max_mass_msun;
/* ------------ SNe feedback properties ------------ */
/*! SNII feedback model: random, isotropic or minimum distance */
enum SNII_feedback_models feedback_model;
/*! Minimal stellar mass considered for SNII feedback (in solar masses) */
double SNII_min_mass_msun;
/*! Maximal stellar mass considered for SNII feedback (in solar masses) */
double SNII_max_mass_msun;
/*! Log 10 of the minimal stellar mass considered for SNII feedback (in solar
* masses) */
double log10_SNII_min_mass_msun;
/*! Log 10 of the maximal stellar mass considered for SNII feedback (in solar
* masses) */
double log10_SNII_max_mass_msun;
/*! Number of type II supernovae per solar mass */
float num_SNII_per_msun;
/*! Are we sampling the SNII life-times or using a fixed delay? */
int SNII_sampled_delay;
/*! Wind delay time for SNII when using a fixed delay */
double SNII_wind_delay;
/*! Temperature increase induced by SNe feedback */
float SNe_deltaT_desired;
/*! Energy released by one supernova type II in cgs units */
double E_SNII_cgs;
/*! Energy released by one supernova type II in internal units */
float E_SNII;
/*! Which model are we using for the SNII energy scaling? */
enum SNII_energy_scalings SNII_energy_scaling;
/*! Minimal energy fraction for supernova type II feedback */
double f_E_min;
/*! Maximal energy fraction for supernova type II feedback */
double f_E_max;
/*! Maximum energy increase due to density */
double SNII_delta_E_n;
/*! Pivot point for the metallicity dependance of the feedback energy fraction
* model */
double Z_0;
/*! Pivot point for the density dependance of the feedback energy fraction
* model */
double n_0_cgs;
/*! Slope of the density dependance of the feedback energy fraction model */
double n_n;
/*! Slope of the metallicity dependance of the feedback energy fraction model
*/
double n_Z;
/*! Are we using the birth density to compute f_th or the properties at
* feedback time? */
int use_birth_density_for_f_th;
/*! Are we using the birth metallicity to compute f_th or the properties at
* feedback time? */
int use_birth_Z_for_f_th;
/* ------------ Enrichment sampling properties ------------ */
/*! Star age above which the enrichment will be downsampled (in internal
* units) */
double stellar_evolution_age_cut;
/*! Number of time-steps in-between two enrichment events */
int stellar_evolution_sampling_rate;
};
void feedback_props_init(struct feedback_props *fp,
const struct phys_const *phys_const,
const struct unit_system *us,
struct swift_params *params,
const struct hydro_props *hydro_props,
const struct cosmology *cosmo);
#endif /* SWIFT_EAGLE_FEEDBACK_PROPERTIES_THERMAL_H */