/******************************************************************************* * This file is part of SWIFT. * Copyright (c) 2016 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_DEFAULT_BLACK_HOLES_H #define SWIFT_DEFAULT_BLACK_HOLES_H #include /* Local includes */ #include "black_holes_properties.h" #include "black_holes_struct.h" #include "cooling_properties.h" #include "dimension.h" #include "kernel_hydro.h" #include "minmax.h" /** * @brief Computes the time-step of a given black hole particle. * * @param bp Pointer to the s-particle data. * @param props The properties of the black hole scheme. * @param constants The physical constants (in internal units). */ __attribute__((always_inline)) INLINE static float black_holes_compute_timestep( const struct bpart* const bp, const struct black_holes_props* props, const struct phys_const* constants, const struct cosmology* cosmo) { return FLT_MAX; } /** * @brief Initialises the b-particles for the first time * * This function is called only once just after the ICs have been * read in to do some conversions. * * @param bp The particle to act upon * @param props The properties of the black holes model. */ __attribute__((always_inline)) INLINE static void black_holes_first_init_bpart( struct bpart* bp, const struct black_holes_props* props) { bp->time_bin = 0; } /** * @brief Prepares a b-particle for its interactions * * @param bp The particle to act upon */ __attribute__((always_inline)) INLINE static void black_holes_init_bpart( struct bpart* bp) { #ifdef DEBUG_INTERACTIONS_BLACK_HOLES for (int i = 0; i < MAX_NUM_OF_NEIGHBOURS_STARS; ++i) bp->ids_ngbs_density[i] = -1; bp->num_ngb_density = 0; #endif bp->density.wcount = 0.f; bp->density.wcount_dh = 0.f; } /** * @brief Predict additional particle fields forward in time when drifting * * @param bp The particle * @param dt_drift The drift time-step for positions. */ __attribute__((always_inline)) INLINE static void black_holes_predict_extra( struct bpart* restrict bp, float dt_drift) {} /** * @brief Sets the values to be predicted in the drifts to their values at a * kick time * * @param bp The particle. */ __attribute__((always_inline)) INLINE static void black_holes_reset_predicted_values(struct bpart* restrict bp) {} /** * @brief Kick the additional variables * * @param bp The particle to act upon * @param dt The time-step for this kick */ __attribute__((always_inline)) INLINE static void black_holes_kick_extra( struct bpart* bp, float dt) {} /** * @brief Finishes the calculation of density on black holes * * @param bp The particle to act upon * @param cosmo The current cosmological model. */ __attribute__((always_inline)) INLINE static void black_holes_end_density( struct bpart* bp, const struct cosmology* cosmo) { /* Some smoothing length multiples. */ const float h = bp->h; const float h_inv = 1.0f / h; /* 1/h */ const float h_inv_dim = pow_dimension(h_inv); /* 1/h^d */ const float h_inv_dim_plus_one = h_inv_dim * h_inv; /* 1/h^(d+1) */ /* Finish the calculation by inserting the missing h-factors */ bp->density.wcount *= h_inv_dim; bp->density.wcount_dh *= h_inv_dim_plus_one; } /** * @brief Sets all particle fields to sensible values when the #spart has 0 * ngbs. * * @param bp The particle to act upon * @param cosmo The current cosmological model. */ __attribute__((always_inline)) INLINE static void black_holes_bpart_has_no_neighbours(struct bpart* restrict bp, const struct cosmology* cosmo) { warning( "BH particle with ID %lld treated as having no neighbours (h: %g, " "wcount: %g).", bp->id, bp->h, bp->density.wcount); /* Some smoothing length multiples. */ const float h = bp->h; const float h_inv = 1.0f / h; /* 1/h */ const float h_inv_dim = pow_dimension(h_inv); /* 1/h^d */ /* Re-set problematic values */ bp->density.wcount = kernel_root * h_inv_dim; bp->density.wcount_dh = 0.f; } /** * @brief Return the current instantaneous accretion rate of the BH. * * Empty BH model --> return 0. * * @param bp the #bpart. */ __attribute__((always_inline)) INLINE static double black_holes_get_accretion_rate(const struct bpart* bp) { return 0.; } /** * @brief Return the total accreted gas mass of this BH. * * Empty BH model --> return 0. * * @param bp the #bpart. */ __attribute__((always_inline)) INLINE static double black_holes_get_accreted_mass(const struct bpart* bp) { return 0.; } /** * @brief Return the subgrid mass of this BH. * * Empty BH model --> return 0. * * @param bp the #bpart. */ __attribute__((always_inline)) INLINE static double black_holes_get_subgrid_mass(const struct bpart* bp) { return 0.; } /** * @brief Return the current bolometric luminosity of the BH. * * @param bp the #bpart. */ __attribute__((always_inline)) INLINE static double black_holes_get_bolometric_luminosity(const struct bpart* bp, const struct phys_const* constants) { return 0.; } /** * @brief Return the current kinetic jet power of the BH. * * @param bp the #bpart. */ __attribute__((always_inline)) INLINE static double black_holes_get_jet_power( const struct bpart* bp, const struct phys_const* constants) { return 0.; } /** * @brief Update the properties of a black hole particles by swallowing * a gas particle. * * @param bp The #bpart to update. * @param p The #part that is swallowed. * @param xp The #xpart that is swallowed. * @param cosmo The current cosmological model. */ __attribute__((always_inline)) INLINE static void black_holes_swallow_part( struct bpart* bp, const struct part* p, const struct xpart* xp, const struct cosmology* cosmo) { /* Nothing to do here: No swallowing in the default model */ } /** * @brief Update the properties of a black hole particles by swallowing * a BH particle. * * @param bpi The #bpart to update. * @param bpj The #bpart that is swallowed. * @param cosmo The current cosmological model. * @param time Time since the start of the simulation (non-cosmo mode). * @param with_cosmology Are we running with cosmology? * @param props The properties of the black hole scheme. * @param constants The physical constants in internal units. */ __attribute__((always_inline)) INLINE static void black_holes_swallow_bpart( struct bpart* bpi, const struct bpart* bpj, const struct cosmology* cosmo, const double time, const int with_cosmology, const struct black_holes_props* props, const struct phys_const* constants) { /* Nothing to do here: No merging in the default model */ } /** * @brief Compute the accretion rate of the black hole and all the quantites * required for the feedback loop. * * Nothing to do here. * * @param bp The black hole particle. * @param props The properties of the black hole scheme. * @param constants The physical constants (in internal units). * @param cosmo The cosmological model. * @param cooling Properties of the cooling model. * @param floor_props Properties of the entropy fllor. * @param time Time since the start of the simulation (non-cosmo mode). * @param with_cosmology Are we running with cosmology? * @param dt The time-step size (in physical internal units). */ __attribute__((always_inline)) INLINE static void black_holes_prepare_feedback( struct bpart* restrict bp, const struct black_holes_props* props, const struct phys_const* constants, const struct cosmology* cosmo, const struct cooling_function_data* cooling, const struct entropy_floor_properties* floor_props, const double time, const int with_cosmology, const double dt, const integertime_t ti_begin) {} /** * @brief Finish the calculation of the new BH position. * * Nothing to do here. * * @param bp The black hole particle. * @param props The properties of the black hole scheme. * @param constants The physical constants (in internal units). * @param cosmo The cosmological model. * @param dt The black hole particle's time step. * @param ti_begin The time at the start of the temp */ __attribute__((always_inline)) INLINE static void black_holes_end_reposition( struct bpart* restrict bp, const struct black_holes_props* props, const struct phys_const* constants, const struct cosmology* cosmo, const double dt, const integertime_t ti_begin) {} /** * @brief Reset acceleration fields of a particle * * This is the equivalent of hydro_reset_acceleration. * We do not compute the acceleration on black hole, therefore no need to use * it. * * @param bp The particle to act upon */ __attribute__((always_inline)) INLINE static void black_holes_reset_feedback( struct bpart* restrict bp) { #ifdef DEBUG_INTERACTIONS_BLACK_HOLES for (int i = 0; i < MAX_NUM_OF_NEIGHBOURS_STARS; ++i) bp->ids_ngbs_force[i] = -1; bp->num_ngb_force = 0; #endif } /** * @brief Store the gravitational potential of a black hole by copying it from * its #gpart friend. * * Nothing to do here. * * @param bp The black hole particle. * @param gp The black hole's #gpart. */ __attribute__((always_inline)) INLINE static void black_holes_store_potential_in_bpart(struct bpart* bp, const struct gpart* gp) { } /** * @brief Store the gravitational potential of a particle by copying it from * its #gpart friend. * * Nothing to do here. * * @param p_data The black hole data of a gas particle. * @param gp The black hole's #gpart. */ __attribute__((always_inline)) INLINE static void black_holes_store_potential_in_part(struct black_holes_part_data* p_data, const struct gpart* gp) {} /** * @brief Initialise a BH particle that has just been seeded. * * @param bp The #bpart to initialise. * @param props The properties of the black hole scheme. * @param constants The physical constants in internal units. * @param cosmo The current cosmological model. * @param p The #part that became a black hole. * @param xp The #xpart that became a black hole. * @param ti_current the current time on the time-line. */ INLINE static void black_holes_create_from_gas( struct bpart* bp, const struct black_holes_props* props, const struct phys_const* constants, const struct cosmology* cosmo, const struct part* p, const struct xpart* xp, const integertime_t ti_current) { /* First initialisation */ black_holes_init_bpart(bp); } #endif /* SWIFT_DEFAULT_BLACK_HOLES_H */