/******************************************************************************* * This file is part of SWIFT. * Copyright (c) 2020 Loic Hausammann (loic.hausammann@epfl.ch) * * 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_SINK_H #define SWIFT_DEFAULT_SINK_H #include /* Local includes */ #include "minmax.h" #include "random.h" #include "sink_part.h" #include "sink_properties.h" /** * @brief Computes the time-step of a given sink particle. * * Note: In the Default sink, no time-step limit is applied. * * @param sink Pointer to the sink-particle data. * @param sink_properties Properties of the sink model. * @param with_cosmology Are we running with cosmological time integration. * @param cosmo The current cosmological model (used if running with * cosmology). * @param grav_props The current gravity properties. * @param time The current time (used if running without cosmology). * @param time_base The time base. */ __attribute__((always_inline)) INLINE static float sink_compute_timestep( const struct sink* const sink, const struct sink_props* sink_properties, const int with_cosmology, const struct cosmology* cosmo, const struct gravity_props* grav_props, const double time, const double time_base) { return FLT_MAX; } /** * @brief Initialises the sink-particles for the first time * * This function is called only once just after the ICs have been * read in to do some conversions. * * @param sp The particle to act upon * @param sink_props The properties of the sink particles scheme. * @param e The #engine */ __attribute__((always_inline)) INLINE static void sink_first_init_sink( struct sink* sp, const struct sink_props* sink_props, const struct engine* e) {} /** * @brief Prepares a particle for the sink calculation. * * @param p The #part to act upon. * @param sink_props The properties of the sink particles scheme. */ __attribute__((always_inline)) INLINE static void sink_init_part( struct part* restrict p, const struct sink_props* sink_props) {} /** * @brief Prepares a sink-particle for its interactions * * @param sp The #sink particle to act upon. */ __attribute__((always_inline)) INLINE static void sink_init_sink( struct sink* sp) { sp->density.wcount = 0.f; sp->density.wcount_dh = 0.f; #ifdef SWIFT_SINK_DENSITY_CHECKS sp->N_check_density = 0; sp->N_check_density_exact = 0; sp->rho_check = 0.f; sp->rho_check_exact = 0.f; sp->n_check = 0.f; sp->n_check_exact = 0.f; sp->inhibited_check_exact = 0; #endif } /** * @brief Predict additional particle fields forward in time when drifting * * @param sp The #sink. * @param dt_drift The drift time-step for positions. */ __attribute__((always_inline)) INLINE static void sink_predict_extra( struct sink* restrict sp, float dt_drift) {} /** * @brief Sets the values to be predicted in the drifts to their values at a * kick time * * @param sp The #sink particle. */ __attribute__((always_inline)) INLINE static void sink_reset_predicted_values( struct sink* restrict sp) {} /** * @brief Kick the additional variables * * @param sp The #sink particle to act upon * @param dt The time-step for this kick */ __attribute__((always_inline)) INLINE static void sink_kick_extra( struct sink* sp, float dt) {} /** * @brief Finishes the calculation of density on sinks * * @param si The particle to act upon * @param cosmo The current cosmological model. */ __attribute__((always_inline)) INLINE static void sink_end_density( struct sink* si, const struct cosmology* cosmo) { /* Some smoothing length multiples. */ const float h = si->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 */ si->density.wcount *= h_inv_dim; si->density.wcount_dh *= h_inv_dim_plus_one; #ifdef SWIFT_SINK_DENSITY_CHECKS si->rho_check *= h_inv_dim; si->n_check *= h_inv_dim; #endif } /** * @brief Sets all particle fields to sensible values when the #sink has 0 * ngbs. * * @param sp The particle to act upon * @param cosmo The current cosmological model. */ __attribute__((always_inline)) INLINE static void sinks_sink_has_no_neighbours( struct sink* restrict sp, const struct cosmology* cosmo) { warning( "Sink particle with ID %lld treated as having no neighbours (h: %g, " "wcount: %g).", sp->id, sp->h, sp->density.wcount); /* Some smoothing length multiples. */ const float h = sp->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 */ sp->density.wcount = kernel_root * h_inv_dim; sp->density.wcount_dh = 0.f; } /** * @brief Compute the accretion rate of the sink and any quantities * required swallowing based on an accretion rate * * Adapted from black_holes_prepare_feedback * * @param si The sink particle. * @param props The properties of the sink 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 floor. * @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). * @param ti_begin Integer time value at the beginning of timestep */ __attribute__((always_inline)) INLINE static void sink_prepare_swallow( struct sink* restrict si, const struct sink_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 Calculate if the gas has the potential of becoming * a sink. * * Return 0 if no sink formation should occur. * Note: called in runner_do_sink_formation * * @param p the gas particles. * @param xp the additional properties of the gas particles. * @param sink_props the sink properties to use. * @param phys_const the physical constants in internal units. * @param cosmo the cosmological parameters and properties. * @param hydro_props The properties of the hydro scheme. * @param us The internal system of units. * @param cooling The cooling data struct. * @param entropy_floor The entropy_floor properties. * */ INLINE static int sink_is_forming( const struct part* restrict p, const struct xpart* restrict xp, const struct sink_props* sink_props, const struct phys_const* phys_const, const struct cosmology* cosmo, const struct hydro_props* restrict hydro_props, const struct unit_system* restrict us, const struct cooling_function_data* restrict cooling, const struct entropy_floor_properties* restrict entropy_floor) { return 0; } /** * @brief Decides whether a particle should be converted into a * sink or not. * * No SF should occur, so return 0. * Note: called in runner_do_sink_formation * * @param p The #part. * @param xp The #xpart. * @param sink_props The properties of the sink model. * @param e The #engine (for random numbers). * @param dt_sink The time-step of this particle * @return 1 if a conversion should be done, 0 otherwise. */ INLINE static int sink_should_convert_to_sink( const struct part* p, const struct xpart* xp, const struct sink_props* sink_props, const struct engine* e, const double dt_sink) { return 0; } /** * @brief Copies the properties of the gas particle over to the * sink particle. * * Nothing to do here. * * @param p The gas particles. * @param xp The additional properties of the gas particles. * @param sink the new created #sink particle. * @param e The #engine. * @param sink_props The sink properties to use. * @param cosmo the cosmological parameters and properties. * @param with_cosmology if we run with cosmology. * @param phys_const The physical constants in internal units. * @param hydro_props The hydro properties to use. * @param us The internal unit system. * @param cooling The cooling function to use. */ INLINE static void sink_copy_properties( const struct part* p, const struct xpart* xp, struct sink* sink, const struct engine* e, const struct sink_props* sink_props, const struct cosmology* cosmo, const int with_cosmology, const struct phys_const* phys_const, const struct hydro_props* restrict hydro_props, const struct unit_system* restrict us, const struct cooling_function_data* restrict cooling) { /* Set a smoothing length */ sink->h = p->h; } /** * @brief Update the properties of a sink particles by swallowing * a gas particle. * * @param sp The #sink 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 sink_swallow_part( struct sink* sp, const struct part* p, const struct xpart* xp, const struct cosmology* cosmo) {} /** * @brief Update the properties of a sink particles by swallowing * a sink particle. * * @param spi The #sink to update. * @param spj The #sink that is swallowed. * @param cosmo The current cosmological model. */ __attribute__((always_inline)) INLINE static void sink_swallow_sink( struct sink* spi, const struct sink* spj, const struct cosmology* cosmo) {} /** * @brief Should the sink spawn a star particle? * * Nothing to do here. * * @param sink the sink particle. * @param e The #engine * @param sink_props The sink properties to use. * @param cosmo The cosmological parameters and properties. * @param with_cosmology If we run with cosmology. * @param phys_const The physical constants in internal units. * @param us The internal unit system. */ INLINE static int sink_spawn_star(struct sink* sink, const struct engine* e, const struct sink_props* sink_props, const struct cosmology* cosmo, const int with_cosmology, const struct phys_const* phys_const, const struct unit_system* restrict us) { return 0; } /** * @brief Copy the properties of the sink particle towards the new star. * This function also needs to update the sink particle. * * Nothing to do here. * * @param sink The #sink particle. * @param sp The star particle. * @param e The #engine * @param sink_props The sink properties to use. * @param cosmo The cosmological parameters and properties. * @param with_cosmology If we run with cosmology. * @param phys_const The physical constants in internal units. * @param us The internal unit system. */ INLINE static void sink_copy_properties_to_star( struct sink* sink, struct spart* sp, const struct engine* e, const struct sink_props* sink_props, const struct cosmology* cosmo, const int with_cosmology, const struct phys_const* phys_const, const struct unit_system* restrict us) {} /** * @brief Update the #sink particle properties before spawning a star. * * @param sink The #sink particle. * @param e The #engine * @param sink_props The sink properties to use. * @param phys_const The physical constants in internal units. */ INLINE static void sink_update_sink_properties_before_star_formation( struct sink* sink, const struct engine* e, const struct sink_props* sink_props, const struct phys_const* phys_const) {} /** * @brief Update the #sink particle properties right after spawning a star. * * @param sink The #sink particle that spawed stars. * @param sp The #spart particle spawned. * @param e The #engine * @param sink_props the sink properties to use. * @param phys_const the physical constants in internal units. * @param star_counter The star loop counter. */ INLINE static void sink_update_sink_properties_during_star_formation( struct sink* sink, const struct spart* sp, const struct engine* e, const struct sink_props* sink_props, const struct phys_const* phys_const, int star_counter) {} /** * @brief Update the #sink particle properties after star formation. * * @param sink The #sink particle. * @param e The #engine * @param sink_props The sink properties to use. * @param phys_const The physical constants in internal units. */ INLINE static void sink_update_sink_properties_after_star_formation( struct sink* sink, const struct engine* e, const struct sink_props* sink_props, const struct phys_const* phys_const) {} /** * @brief Store the gravitational potential of a particle by copying it from * its #gpart friend. * * @param p_data The sink data of a gas particle. * @param gp The part's #gpart. */ __attribute__((always_inline)) INLINE static void sink_store_potential_in_part( struct sink_part_data* p_data, const struct gpart* gp) {} /** * @brief Compute all quantities required for the formation of a sink such as * kinetic energy, potential energy, etc. This function works on the * neighbouring gas particles. * * Nothing to do here. * * @param e The #engine. * @param p The #part for which we compute the quantities. * @param xp The #xpart data of the particle #p. * @param pi A neighbouring #part of #p. * @param xpi The #xpart data of the particle #pi. * @param cosmo The cosmological parameters and properties. * @param sink_props The sink properties to use. */ INLINE static void sink_prepare_part_sink_formation_gas_criteria( struct engine* e, struct part* restrict p, struct xpart* restrict xp, struct part* restrict pi, struct xpart* restrict xpi, const struct cosmology* cosmo, const struct sink_props* sink_props) {} /** * @brief Compute all quantities required for the formation of a sink. This * function works on the neighbouring sink particles. * * Nothing to do here. * * @param e The #engine. * @param p The #part for which we compute the quantities. * @param xp The #xpart data of the particle #p. * @param si A neighbouring #sink of #p. * @param cosmo The cosmological parameters and properties. * @param sink_props The sink properties to use. */ INLINE static void sink_prepare_part_sink_formation_sink_criteria( struct engine* e, struct part* restrict p, struct xpart* restrict xp, struct sink* restrict si, const int with_cosmology, const struct cosmology* cosmo, const struct sink_props* sink_props, const double time) {} #endif /* SWIFT_DEFAULT_SINK_H */