/*******************************************************************************
* 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 .
*
******************************************************************************/
/* Config parameters. */
#ifndef SWIFT_ADAPTIVE_SOFTENING_IACT_H
#define SWIFT_ADAPTIVE_SOFTENING_IACT_H
/* Config parameters. */
#include
/* Local headers. */
#include "adaptive_softening_struct.h"
#include "inline.h"
#include "kernel_hydro.h"
#ifdef ADAPTIVE_SOFTENING
/**
* @brief Computes the contribution to the softening length change term.
*
* Computes equation 26 of Price & Monaghan 2007, MNRAS, 374, 4.
* without the prefactor. The prefactor gets added in end_density().
*
* @param pi The #part for which we compute terms.
* @param ui The ratio of the inter-particle distance to the smoothing length.
* @param hi_inv The inverse the particle's smoothing length.
* @param mj The mass of the other particle.
*/
__attribute__((always_inline)) INLINE static void
adaptive_softening_add_correction_term(struct part *pi, const float ui,
const float hi_inv, const float mj) {
pi->adaptive_softening_data.zeta += mj * potential_dh(ui, hi_inv);
}
/**
* @brief Computes the norm of the accleration due to the change in softening.
*
* Computes equation 27 of Price & Monaghan 2007, MNRAS, 374, 4.
* without the mass and the distance vector. These are multiplied in
* by the parent function.
*
* @param pi The first #part.
* @param pj The second #part.
* @param wi_dr The norm of the kernel gradient for i.
* @param wj_dr The norm of the kernel gradient for j.
* @param f_ij The smoothling-length correction term for i.
* @param f_ji The smoothling-length correction term for j.
* @param r_inv the inverse of the distance linking the particles.
*/
__attribute__((always_inline)) INLINE static float
adaptive_softening_get_acc_term(const struct part *restrict pi,
const struct part *restrict pj,
const float wi_dr, const float wj_dr,
const float f_ij, const float f_ji,
const float r_inv) {
/* Recover some data */
const float zetai = pi->adaptive_softening_data.zeta;
const float zetaj = pj->adaptive_softening_data.zeta;
/* Adaptive softening acceleration term
* Price & Monaghan 2007, eq. 27 (second term)
* Note that G/2 is included in the zeta terms.
* Note also that f_ij is 1/Omega_i in Price's notation. */
const float adap_acc_term =
0.5f * (zetai * f_ij * wi_dr + zetaj * f_ji * wj_dr) * r_inv;
return adap_acc_term;
}
#else
/**
* @brief Computes the contribution to the softening length change term.
*
* No adaptive softening --> Nothing to do.
*
* @param pi The #part for which we compute terms.
* @param ui The ratio of the inter-particle distance to the smoothing length.
* @param hi_inv The inverse the particle's smoothing length.
* @param mj The mass of the other particle.
*/
__attribute__((always_inline)) INLINE static void
adaptive_softening_add_correction_term(struct part *pi, const float ui,
const float hi_inv, const float mj) {}
/**
* @brief Computes the norm of the accleration due to the change in softening.
*
* No adaptive softening --> Nothing to do --> Return 0.
*
* @param pi The first #part.
* @param pj The second #part.
* @param wi_dr The norm of the kernel gradient for i.
* @param wj_dr The norm of the kernel gradient for j.
* @param f_ij The smoothling-length correction term for i.
* @param f_ji The smoothling-length correction term for j.
* @param r_inv the inverse of the distance linking the particles.
*/
__attribute__((always_inline)) INLINE static float
adaptive_softening_get_acc_term(const struct part *restrict pi,
const struct part *restrict pj,
const float wi_dr, const float wj_dr,
const float f_ij, const float f_ji,
const float r_inv) {
return 0.f;
}
#endif /* ADAPTIVE_SOFTENING */
#endif /* SWIFT_ADAPTIVE_SOFTENING_IACT_H */