/******************************************************************************* * This file is part of SWIFT. * Copyright (c) 2017 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_COSMOLOGY_H #define SWIFT_COSMOLOGY_H /* Config parameters. */ #include /* Local includes. */ #include "parser.h" #include "physical_constants.h" #include "timeline.h" #include "units.h" /** * @brief Cosmological parameters */ struct cosmology { /*! Current expansion factor of the Universe */ double a; /*! Inverse of the current expansion factor of the Universe */ double a_inv; /*! Inverse square of the current expansion factor of the Universe */ double a2_inv; /*! Inverse cube of the current expansion factor of the Universe */ double a3_inv; /*! Power of the scale-factor used for internal energy conversion to physical */ double a_factor_internal_energy; /*! Power of the scale-factor used for pressure conversion to physical */ double a_factor_pressure; /*! Power of the scale-factor used for sound-speed conversion to physical */ double a_factor_sound_speed; /*! Power of the scale-factor used for relative velocities in visc. terms */ double a_factor_mu; /*! Power of the scale-factor used for epsilon term in the Balsara switch */ double a_factor_Balsara_eps; /*! Power of the scale-factor used for gravity accelerations */ double a_factor_grav_accel; /*! Power of the scale-factor used for hydro accelerations */ double a_factor_hydro_accel; /*! Current redshift */ double z; /*! Hubble constant at the current redshift (in internal units) */ double H; /*! The critical density at the current redshift (in internal physical units) */ double critical_density; /*! The critical density at redshift 0 (in internal physical units) */ double critical_density_0; /*! The mean density at the current redshift (in internal physical units) */ double mean_density; /*! The mean matter density at the current redshift (in internal physical * units) */ double mean_density_Omega_m; /*! The mean baryonic density at the current redshift (in internal physical * units) */ double mean_density_Omega_b; /*! Over-density for virialised haloes at the current redshift * from the Bryan & Norman 1998 fit */ double overdensity_BN98; /*! Conversion factor from internal time-step size to cosmological step */ double time_step_factor; /*! Expansion rate at the current redshift (in internal units) */ double a_dot; /*! Time (in internal units) since the Big Bang */ double time; /*! Lookback time (in internal units) */ double lookback_time; /*! Dark-energy equation of state at the current time */ double w; /*! Scale-factor at the previous time-step */ double a_old; /*! Redshift at the previous time-step */ double z_old; /*------------------------------------------------------------------ */ /*! Starting expansion factor */ double a_begin; /*! Final expansion factor */ double a_end; /*! Time (in internal units) since the Big Bang at the start */ double time_begin; /*! Time (in internal units) since the Big Bang at the end */ double time_end; /*! Conversion factor from integer time-line to \f$ d\log{a} \f$ */ double time_base; /*! Inverse of conversion factor from integer time-line to \f$ d\log{a} \f$ */ double time_base_inv; /*! Reduced Hubble constant (H0 / (100km/s/Mpc)) */ double h; /*! Hubble constant at z = 0 (in internal units) */ double H0; /*! Hubble time 1/H0 */ double Hubble_time; /*! Cold Dark Matter density parameter */ double Omega_cdm; /*! Baryon density parameter */ double Omega_b; /*! Cosmological constant density parameter */ double Omega_lambda; /*! Total radiation density parameter (photons and other relics) */ double Omega_r; /*! CMB radiation density parameter (Omega_gamma) */ double Omega_g; /*! Massive neutrino density parameter */ double Omega_nu; /*! Massive neutrino density parameter at z=0 */ double Omega_nu_0; /*! Ultra-relativistic species (e.g. massless neutrinos) density parameter */ double Omega_ur; /*! Curvature density parameter */ double Omega_k; /*! Dark-energy equation of state at z=0 */ double w_0; /*! Dark-energy evolution parameter */ double w_a; /*! CMB temperature at z = 0 implied by cosmology (internal units) */ double T_CMB_0; /*! CMB temperature at z = 0 implied by cosmology (Kelvins) */ double T_CMB_0_K; /*! Neutrino temperature at z = 0 (internal units) */ double T_nu_0; /* Neutrino temperature at z = 0 (electron-volts) */ double T_nu_0_eV; /*! Number of massive neutrino species */ int N_nu; /*! Number of ultra-relativistic species (excluding massive neutrinos) */ double N_ur; /*! Effective number of relativistic species (including massive neutrinos) */ double N_eff; /*! Mass of each massive neutrino species in electron-volts */ double *M_nu_eV; /*! Degeneracy of each massive neutrino species */ double *deg_nu; /*! Sum of massive neutrino degeneracies */ double deg_nu_tot; /*! Log of starting expansion factor for neutrino interpolation tables */ double log_a_long_begin; /*! Log of midpoint expansion factor for neutrino interpolation tables */ double log_a_long_mid; /*! Log of ending expansion factor for neutrino interpolation tables */ double log_a_long_end; /*! Log of starting expansion factor */ double log_a_begin; /*! Log of final expansion factor */ double log_a_end; /*! Speed of light (internal units) */ double const_speed_light_c; /*! Drift factor interpolation table */ double *drift_fac_interp_table; /*! Kick factor (gravity) interpolation table */ double *grav_kick_fac_interp_table; /*! Kick factor (hydro) interpolation table */ double *hydro_kick_fac_interp_table; /*! Kick factor (hydro correction) interpolation table (GIZMO-MFV only) */ double *hydro_kick_corr_interp_table; /*! Time interpolation table */ double *time_interp_table; /*! Scale factor interpolation table */ double *scale_factor_interp_table; /*! Comoving distance interpolation table */ double *comoving_distance_interp_table; /*! Comoving distance from present day (a=1) to a_end */ double comoving_distance_interp_table_offset; /*! Comoving distance from a_start to a_end */ double comoving_distance_start_to_end; /*! Comoving distance inverse interpolation table */ double *comoving_distance_inverse_interp_table; /*! Massive neutrino density interpolation table at early times */ double *neutrino_density_early_table; /*! Massive neutrino density interpolation table at late times */ double *neutrino_density_late_table; /*! Time between Big Bang and first entry in the table */ double time_interp_table_offset; /*! Time between Big Bang and last entry in the table */ double time_interp_table_max; /*! Time at the present-day (a=1) */ double universe_age_at_present_day; }; void cosmology_update(struct cosmology *c, const struct phys_const *phys_const, integertime_t ti_current); double cosmology_get_drift_factor(const struct cosmology *cosmo, const integertime_t ti_start, const integertime_t ti_end); double cosmology_get_grav_kick_factor(const struct cosmology *cosmo, const integertime_t ti_start, const integertime_t ti_end); double cosmology_get_hydro_kick_factor(const struct cosmology *cosmo, const integertime_t ti_start, const integertime_t ti_end); double cosmology_get_therm_kick_factor(const struct cosmology *cosmo, const integertime_t ti_start, const integertime_t ti_end); double cosmology_get_corr_kick_factor(const struct cosmology *cosmo, const integertime_t ti_start, const integertime_t ti_end); double cosmology_get_delta_time(const struct cosmology *c, const integertime_t ti_start, const integertime_t ti_end); double cosmology_get_neutrino_density(const struct cosmology *c, double a); double cosmology_get_delta_time_from_scale_factors(const struct cosmology *c, const double a_start, const double a_end); double cosmology_get_timebase(struct cosmology *c, const integertime_t ti_current); double cosmology_get_scale_factor(const struct cosmology *cosmo, double t); double cosmology_get_comoving_distance(const struct cosmology *c, const double a); double cosmology_scale_factor_at_comoving_distance(const struct cosmology *c, double r); double cosmology_get_time_since_big_bang(const struct cosmology *c, double a); void cosmology_init(struct swift_params *params, const struct unit_system *us, const struct phys_const *phys_const, struct cosmology *c); void cosmology_init_no_cosmo(struct cosmology *c); void cosmology_print(const struct cosmology *c); void cosmology_clean(struct cosmology *c); #ifdef HAVE_HDF5 void cosmology_write_model(hid_t h_grp, const struct cosmology *c); #endif /* Dump/restore. */ void cosmology_struct_dump(const struct cosmology *cosmology, FILE *stream); void cosmology_struct_restore(int enabled, struct cosmology *cosmology, FILE *stream); #endif /* SWIFT_COSMOLOGY_H */