Adding Hydro Schemes
SWIFT is engineered to enable you to add your own hydrodynamics schemes easily. We enable this through the use of header files to encapsulate each scheme.
Note that it’s unlikely you will ever have to consider parallelism or ‘loops over neighbours’ for SWIFT; all of this is handled by the tasking system. All we ask for is the interaction functions that tell us how to a) compute the density and b) compute forces.
The hydro schemes are stored in
src/hydro. You will need to create a folder
with a sensible name that you are going to store your scheme-specific information
in. Then, you will need to create the following files:
hydro.h, which includes functions that are applied to particles at the end of the density loop and beginning of the force loop, along with helper functions
hydro_debug.h, which includes a quick function that prints out your particle properties for debugging purposes
hydro_iact.hthat includes the interaction functions
hydro_io.hwhich includes the information on what should be read from the initial conditions file, as well as written to the output files
hydro_part.hwhich includes your particle definition. SWIFT uses an array-of -structures scheme.
As previously noted,
hydro.h includes the helper functions for your scheme. You
will need to ‘fill out’ the following:
hydro_get_comoving_internal_energy(p)which returns the comoving internal energy of your particles (typically this will just be
hydro_get_physical_internal_energy(p, cosmo)which returns the physical internal energy. You can use the
hydro_get_comoving_pressure(p)which returns the comoving pressure.
hydro_get_comoving_entropy(p)which returns the comoving entropy.
hydro_get_physical_entropy(p, cosmo)which returns the physical entropy. In our formalism, usually there is no conversion factor here so it is the same as the comoving version.
hydro_get_comoving_soundspeed(p)which returns the comoving sound speed.
hydro_get_physical_soundspeed(p, cosmo)which returns the physical sound speed. You can use the
hydro_get_comoving_density(p)which returns the comoving density.
hydro_get_physical_density(p, cosmo)which returns the physical density. You can use the
a3_invmember of the
hydro_get_mass(p)returns the mass of particle
hydro_get_drifted_velocities(p, xp, dt_kick_hydro, dt_kick_grav, v)gets the drifted velocities; this is just
a_hydro * dt_kick_hydro+
a_grav * dt_kick_gravin most implementations.
hydro_get_energy_dt(p)returns the time derivative of the (comoving) internal energy of the particle.
hydro_set_energy_dt(p)sets the time derivative of the (comoving) internal energy of the particle.
hydro_compute_timestep(p, xp, hydro_props, cosmo)returns the timestep for the hydrodynamics particles.
hydro_timestep_extra(p, dt)does some extra hydro operations once the physical timestep for the particle is known.
hydro_init_part(p, hydro_space)initialises the particle in preparation for the density calculation. This essentially sets properties, such as the density, to zero.
hydro_end_density(p, cosmo)performs operations directly after the density loop on each particle. Note that you will have to add a particle’s self-contribution at this stage as particles are never ‘interacted’ with themselves.
hydro_part_has_no_neighbours(p, xp, cosmo)resets properties to a sensible value if a particle is found to have no neighbours.
hydro_prepare_force(p, xp, cosmo)is computed for each particle before the force loop. You can use this to pre-compute particle properties that are used in the force loop, but only depend on the particle itself.
hydro_reset_acceleration(p)resets the acceleration variables of the particles to zero in preparation for the force loop.
hydro_predict_extra(p, xp, dt_drift, dt_therm)predicts extra particle properties when drifting, such as the smoothing length.
hydro_end_force(p, cosmo)is called after the force loop for each particle and can be used to e.g. include overall factors of the smoothing length.
hydro_kick_extra(p, xp, dt_therm)kicks extra variables.
hydro_convert_quantities(p, xp)converts quantities at the start of a run (e.g. internal energy to entropy).
hydro_first_init_part(p, xp)is called for every particle at the start of a run and is used to initialise variables.