/*******************************************************************************
* 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 */