/*******************************************************************************
* This file is part of SWIFT.
* Copyright (c) 2023 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_ADAPTIVE_SOFTENING_H
#define SWIFT_ADAPTIVE_SOFTENING_H
/* Config parameters. */
#include
/* Local headers. */
#include "error.h"
#include "gravity_properties.h"
#include "inline.h"
#include "kernel_hydro.h"
#ifdef ADAPTIVE_SOFTENING
/* Force the gravity tasks to take place after the density loop */
#define gravity_after_hydro_density 1
/* Verify the correct hydro kernel is being used. */
#ifndef WENDLAND_C2_KERNEL
#error \
"The adaptive softening terms are only defined for the Wendland-C2 kernel used in the gravity scheme."
#endif
/* Verify we are using the allowed hydro schemes */
#if defined(GIZMO_MFM_SPH) || defined(GIZMO_MFV_SPH) || defined(SHADOWFAX_SPH)
#error "Adaptive softening only implemented for the SPH schemes."
#endif
/* Verify we are using the correct gravity scheme */
#ifndef MULTI_SOFTENING_GRAVITY
#error \
"Adaptive softening only implemented for the Multi-softening gravity scheme."
#endif
/**
* @ifdef Update the gravity softening based on the gas' smoothing length.
*
* @param gp the #gpart to update.
* @param p The #part.
* @param grav_props The properties of the gravity scheme.
*/
INLINE static void gravity_update_softening(
struct gpart* gp, const struct part* p,
const struct gravity_props* grav_props) {
#ifdef SWIFT_DEBUG_CHECKS
if (gp != p->gpart) error("Unlinked part and gpart!");
#endif
const float new_softening = p->h * kernel_gamma;
/* Update the softening but respect limits */
if (new_softening > grav_props->max_adaptive_softening)
gp->epsilon = grav_props->max_adaptive_softening;
else if (new_softening < grav_props->min_adaptive_softening)
gp->epsilon = grav_props->min_adaptive_softening;
else
gp->epsilon = new_softening;
}
/**
* @brief Prepares a particle for the density calculation.
*
* @param p The particle to act upon
*/
INLINE static void adaptive_softening_init_part(struct part* p) {
p->adaptive_softening_data.zeta = 0.f;
}
/**
* @brief Finishes the density calculation.
*
* Finish the equation 26 of Price & Monaghan 2007, MNRAS, 374, 4
* by adding the pre-factors. Also adds the G/2 factor of eq. 27.
*
* @param p The particle to act upon.
* @param props The properties of the gravity scheme.
*/
INLINE static void adaptive_softening_end_density(
struct part* p, const struct gravity_props* props) {
/* Finish calculation of the adaptive softening prefactor (zeta)
* Pre-factor in eq. 26 of Price & Monaghan 2007 */
const float rho_inv = 1.f / p->rho;
const float h_drho = -p->h * rho_inv * hydro_dimension_inv;
p->adaptive_softening_data.zeta *= h_drho;
/* Multiply in the Gravitational constant
* See the prefactor in eq. 27 of Price & Monaghan 2007 */
p->adaptive_softening_data.zeta *= 0.5f * props->G_Newton;
}
#else
/* Gravity tasks can take place at the same time as hydro */
#define gravity_after_hydro_density 0
/**
* @ifdef Update the gravity softening based on the gas' smoothing length.
*
* Softening is fixed: Nothing to do here.
*
* @param gp the #gpart to update.
* @param p The #part.
* @param grav_props The properties of the gravity scheme.
*/
INLINE static void gravity_update_softening(
struct gpart* gp, const struct part* p,
const struct gravity_props* grav_props) {}
/**
* @brief Prepares a particle for the density calculation.
*
* Nothing to do here.
*
* @param p The particle to act upon
*/
INLINE static void adaptive_softening_init_part(struct part* p) {}
/**
* @brief Finishes the density calculation.
*
* Nothing to do here.
*
* @param p The particle to act upon
* @param props The properties of the gravity scheme.
*/
INLINE static void adaptive_softening_end_density(
struct part* p, const struct gravity_props* props) {}
#endif /* ADAPTIVE_SOFTENING */
#endif /* SWIFT_ADAPTIVE_SOFTENING_H */