Skip to content
Snippets Groups Projects
Commit e13d6795 authored by Matthieu Schaller's avatar Matthieu Schaller
Browse files

Added a unit test to verify that the gravity calculation is correct and accurate enough.

parent efda478c
No related branches found
No related tags found
1 merge request!420Gravity speedup
......@@ -181,1066 +181,11 @@ __attribute__((always_inline)) INLINE static void compute_potential_derivatives(
pot->D_022 = r_y2 * r_z2 * r_inv9 + r_y2 * r_inv7 + r_z2 * r_inv7 + r_inv5;
pot->D_211 = r_x2 * r_y * r_z * r_inv9 + r_y * r_z * r_inv7;
pot->D_121 = r_y2 * r_x * r_z * r_inv9 + r_x * r_z * r_inv7;
pot->D_112 = r_z2 * r_x * r_z * r_inv9 + r_x * r_y * r_inv7;
pot->D_112 = r_z2 * r_x * r_y * r_inv9 + r_x * r_y * r_inv7;
#endif
#if SELF_GRAVITY_MULTIPOLE_ORDER > 5
#error "Missing implementation for order >5"
#endif
}
#if 0
/*************************/
/* 0th order derivatives */
/*************************/
/**
* @brief \f$ \phi(r_x, r_y, r_z) \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_000(double r_x,
double r_y,
double r_z,
double r_inv) {
return r_inv;
}
/*************************/
/* 1st order derivatives */
/*************************/
/**
* @brief \f$ \frac{\partial\phi(r_x, r_y, r_z)}{\partial r_x} \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_100(double r_x,
double r_y,
double r_z,
double r_inv) {
return -r_x * r_inv * r_inv * r_inv;
}
/**
* @brief \f$ \frac{\partial\phi(r_x, r_y, r_z)}{\partial r_x} \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_010(double r_x,
double r_y,
double r_z,
double r_inv) {
return -r_y * r_inv * r_inv * r_inv;
}
/**
* @brief \f$ \frac{\partial\phi(r_x, r_y, r_z)}{\partial r_x} \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_001(double r_x,
double r_y,
double r_z,
double r_inv) {
return -r_z * r_inv * r_inv * r_inv;
}
/*************************/
/* 2nd order derivatives */
/*************************/
/**
* @brief \f$ \frac{\partial^2\phi(r_x, r_y, r_z)}{\partial r_x^2} \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_200(double r_x,
double r_y,
double r_z,
double r_inv) {
const double r_inv2 = r_inv * r_inv;
const double r_inv3 = r_inv * r_inv2;
const double r_inv5 = r_inv3 * r_inv2;
return 3. * r_x * r_x * r_inv5 - r_inv3;
}
/**
* @brief \f$ \frac{\partial^2\phi(r_x, r_y, r_z)}{\partial r_y^2} \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_020(double r_x,
double r_y,
double r_z,
double r_inv) {
const double r_inv2 = r_inv * r_inv;
const double r_inv3 = r_inv * r_inv2;
const double r_inv5 = r_inv3 * r_inv2;
return 3. * r_y * r_y * r_inv5 - r_inv3;
}
/**
* @brief \f$ \frac{\partial^2\phi(r_x, r_y, r_z)}{\partial r_z^2} \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_002(double r_x,
double r_y,
double r_z,
double r_inv) {
const double r_inv2 = r_inv * r_inv;
const double r_inv3 = r_inv * r_inv2;
const double r_inv5 = r_inv3 * r_inv2;
return 3. * r_z * r_z * r_inv5 - r_inv3;
}
/**
* @brief \f$ \frac{\partial^2\phi(r_x, r_y, r_z)}{\partial r_x\partial r_y}
* \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_110(double r_x,
double r_y,
double r_z,
double r_inv) {
const double r_inv2 = r_inv * r_inv;
const double r_inv5 = r_inv2 * r_inv2 * r_inv;
return 3. * r_x * r_y * r_inv5;
}
/**
* @brief \f$ \frac{\partial^2\phi(r_x, r_y, r_z)}{\partial r_x\partial r_z}
* \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_101(double r_x,
double r_y,
double r_z,
double r_inv) {
const double r_inv2 = r_inv * r_inv;
const double r_inv5 = r_inv2 * r_inv2 * r_inv;
return 3. * r_x * r_z * r_inv5;
}
/**
* @brief \f$ \frac{\partial^2\phi(r_x, r_y, r_z)}{\partial r_y\partial r_z}
* \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_011(double r_x,
double r_y,
double r_z,
double r_inv) {
const double r_inv2 = r_inv * r_inv;
const double r_inv5 = r_inv2 * r_inv2 * r_inv;
return 3. * r_y * r_z * r_inv5;
}
/*************************/
/* 3rd order derivatives */
/*************************/
/**
* @brief \f$ \frac{\partial^3\phi(r_x, r_y, r_z)}{\partial r_x^3} \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_300(double r_x,
double r_y,
double r_z,
double r_inv) {
const double r_inv2 = r_inv * r_inv;
const double r_inv5 = r_inv2 * r_inv2 * r_inv;
const double r_inv7 = r_inv5 * r_inv2;
return -15. * r_x * r_x * r_x * r_inv7 + 9. * r_x * r_inv5;
}
/**
* @brief \f$ \frac{\partial^3\phi(r_x, r_y, r_z)}{\partial r_y^3} \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_030(double r_x,
double r_y,
double r_z,
double r_inv) {
const double r_inv2 = r_inv * r_inv;
const double r_inv5 = r_inv2 * r_inv2 * r_inv;
const double r_inv7 = r_inv5 * r_inv2;
return -15. * r_y * r_y * r_y * r_inv7 + 9. * r_y * r_inv5;
}
/**
* @brief \f$ \frac{\partial^3\phi(r_x, r_y, r_z)}{\partial r_z^3} \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_003(double r_x,
double r_y,
double r_z,
double r_inv) {
const double r_inv2 = r_inv * r_inv;
const double r_inv5 = r_inv2 * r_inv2 * r_inv;
const double r_inv7 = r_inv5 * r_inv2;
return -15. * r_z * r_z * r_z * r_inv7 + 9. * r_z * r_inv5;
}
/**
* @brief \f$ \frac{\partial^3\phi(r_x, r_y, r_z)}{\partial r_x^2\partial r_y}
* \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_210(double r_x,
double r_y,
double r_z,
double r_inv) {
const double r_inv2 = r_inv * r_inv;
const double r_inv5 = r_inv2 * r_inv2 * r_inv;
const double r_inv7 = r_inv5 * r_inv2;
return -15. * r_x * r_x * r_y * r_inv7 + 3. * r_y * r_inv5;
}
/**
* @brief \f$ \frac{\partial^3\phi(r_x, r_y, r_z)}{\partial r_x^2\partial r_z}
* \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_201(double r_x,
double r_y,
double r_z,
double r_inv) {
const double r_inv2 = r_inv * r_inv;
const double r_inv5 = r_inv2 * r_inv2 * r_inv;
const double r_inv7 = r_inv5 * r_inv2;
return -15. * r_x * r_x * r_z * r_inv7 + 3. * r_z * r_inv5;
}
/**
* @brief \f$ \frac{\partial^3\phi(r_x, r_y, r_z)}{\partial r_x\partial r_y^2}
* \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_120(double r_x,
double r_y,
double r_z,
double r_inv) {
const double r_inv2 = r_inv * r_inv;
const double r_inv5 = r_inv2 * r_inv2 * r_inv;
const double r_inv7 = r_inv5 * r_inv2;
return -15. * r_x * r_y * r_y * r_inv7 + 3. * r_x * r_inv5;
}
/**
* @brief \f$ \frac{\partial^3\phi(r_x, r_y, r_z)}{\partial r_y^2\partial r_z}
* \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_021(double r_x,
double r_y,
double r_z,
double r_inv) {
const double r_inv2 = r_inv * r_inv;
const double r_inv5 = r_inv2 * r_inv2 * r_inv;
const double r_inv7 = r_inv5 * r_inv2;
return -15. * r_z * r_y * r_y * r_inv7 + 3. * r_z * r_inv5;
}
/**
* @brief \f$ \frac{\partial^3\phi(r_x, r_y, r_z)}{\partial r_x\partial r_z^2}
* \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_102(double r_x,
double r_y,
double r_z,
double r_inv) {
const double r_inv2 = r_inv * r_inv;
const double r_inv5 = r_inv2 * r_inv2 * r_inv;
const double r_inv7 = r_inv5 * r_inv2;
return -15. * r_x * r_z * r_z * r_inv7 + 3. * r_x * r_inv5;
}
/**
* @brief \f$ \frac{\partial^3\phi(r_x, r_y, r_z)}{\partial r_y\partial r_z^2}
* \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_012(double r_x,
double r_y,
double r_z,
double r_inv) {
const double r_inv2 = r_inv * r_inv;
const double r_inv5 = r_inv2 * r_inv2 * r_inv;
const double r_inv7 = r_inv5 * r_inv2;
return -15. * r_y * r_z * r_z * r_inv7 + 3. * r_y * r_inv5;
}
/**
* @brief \f$ \frac{\partial^3\phi(r_x, r_y, r_z)}{\partial r_z\partial
* r_y\partial r_z} \f$.
*
* @param r_x x-coordinate of the distance vector (\f$ r_x \f$).
* @param r_y y-coordinate of the distance vector (\f$ r_y \f$).
* @param r_z z-coordinate of the distance vector (\f$ r_z \f$).
* @param r_inv Inverse of the norm of the distance vector (\f$ |r|^{-1} \f$)
*/
__attribute__((always_inline)) INLINE static double D_111(double r_x,
double r_y,
double r_z,
double r_inv) {
const double r_inv3 = r_inv * r_inv * r_inv;
const double r_inv7 = r_inv3 * r_inv3 * r_inv;
return -15. * r_x * r_y * r_z * r_inv7;
}
/*********************************/
/* 4th order gravity derivatives */
/*********************************/
/**
* @brief Compute \f$ \frac{\partial^4}{ \partial_z^4 }\phi(x, y, z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_004(double r_x,
double r_y,
double r_z,
double r_inv) {
return +105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_z * r_z * r_z * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 6.0 *
(r_z * r_z) +
3. * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0;
/* 5 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^4}{ \partial_y^1 \partial_z^3 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_013(double r_x,
double r_y,
double r_z,
double r_inv) {
return +105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_y * r_z * r_z * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0 *
(r_y * r_z);
/* 11 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^4}{ \partial_y^2 \partial_z^2 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_022(double r_x,
double r_y,
double r_z,
double r_inv) {
return +105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_y * r_y * r_z * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
(r_y * r_y) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
(r_z * r_z) +
3. * r_inv * r_inv * r_inv * r_inv * r_inv;
/* 11 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^4}{ \partial_y^3 \partial_z^1 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_031(double r_x,
double r_y,
double r_z,
double r_inv) {
return +105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_y * r_y * r_y * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0 *
(r_y * r_z);
/* 11 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^4}{ \partial_y^4 }\phi(x, y, z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_040(double r_x,
double r_y,
double r_z,
double r_inv) {
return +105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_y * r_y * r_y * r_y) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 6.0 *
(r_y * r_y) +
3. * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0;
/* 5 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^4}{ \partial_x^1 \partial_z^3 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_103(double r_x,
double r_y,
double r_z,
double r_inv) {
return +105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_x * r_z * r_z * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0 *
(r_x * r_z);
/* 11 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^4}{ \partial_x^1 \partial_y^1 \partial_z^2
* }\phi(x, y, z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_112(double r_x,
double r_y,
double r_z,
double r_inv) {
return +105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_x * r_y * r_z * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
(r_x * r_y);
/* 13 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^4}{ \partial_x^1 \partial_y^2 \partial_z^1
* }\phi(x, y, z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_121(double r_x,
double r_y,
double r_z,
double r_inv) {
return +105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_x * r_y * r_y * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
(r_x * r_z);
/* 13 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^4}{ \partial_x^1 \partial_y^3 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_130(double r_x,
double r_y,
double r_z,
double r_inv) {
return +105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_x * r_y * r_y * r_y) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0 *
(r_x * r_y);
/* 11 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^4}{ \partial_x^2 \partial_z^2 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_202(double r_x,
double r_y,
double r_z,
double r_inv) {
return +105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_x * r_x * r_z * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
(r_x * r_x) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
(r_z * r_z) +
3. * r_inv * r_inv * r_inv * r_inv * r_inv;
/* 11 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^4}{ \partial_x^2 \partial_y^1 \partial_z^1
* }\phi(x, y, z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_211(double r_x,
double r_y,
double r_z,
double r_inv) {
return +105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_x * r_x * r_y * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
(r_y * r_z);
/* 13 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^4}{ \partial_x^2 \partial_y^2 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_220(double r_x,
double r_y,
double r_z,
double r_inv) {
return +105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_x * r_x * r_y * r_y) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
(r_x * r_x) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
(r_y * r_y) +
3. * r_inv * r_inv * r_inv * r_inv * r_inv;
/* 11 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^4}{ \partial_x^3 \partial_z^1 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_301(double r_x,
double r_y,
double r_z,
double r_inv) {
return +105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_x * r_x * r_x * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0 *
(r_x * r_z);
/* 11 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^4}{ \partial_x^3 \partial_y^1 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_310(double r_x,
double r_y,
double r_z,
double r_inv) {
return +105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_x * r_x * r_x * r_y) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0 *
(r_x * r_y);
/* 11 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^4}{ \partial_x^4 }\phi(x, y, z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_400(double r_x,
double r_y,
double r_z,
double r_inv) {
return +105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_x * r_x * r_x * r_x) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 6.0 *
(r_x * r_x) +
3. * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0;
/* 5 zero-valued terms not written out */
}
/*********************************/
/* 5th order gravity derivatives */
/*********************************/
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_z^5 }\phi(x, y, z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_005(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_z * r_z * r_z * r_z * r_z) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * 10.0 * (r_z * r_z * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 15.0 *
(r_z);
/* 26 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_y^1 \partial_z^4 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_014(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_y * r_z * r_z * r_z * r_z) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * 6.0 * (r_y * r_z * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0 *
(r_y);
/* 42 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_y^2 \partial_z^3 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_023(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_y * r_y * r_z * r_z * r_z) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * 3.0 * (r_y * r_y * r_z) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_z * r_z * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0 *
(r_z);
/* 44 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_y^3 \partial_z^2 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_032(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_y * r_y * r_y * r_z * r_z) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_y * r_y * r_y) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * 3.0 * (r_y * r_z * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0 *
(r_y);
/* 44 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_y^4 \partial_z^1 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_041(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_y * r_y * r_y * r_y * r_z) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * 6.0 * (r_y * r_y * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0 *
(r_z);
/* 42 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_y^5 }\phi(x, y, z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_050(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_y * r_y * r_y * r_y * r_y) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * 10.0 * (r_y * r_y * r_y) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 15.0 *
(r_y);
/* 26 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_x^1 \partial_z^4 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_104(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_x * r_z * r_z * r_z * r_z) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * 6.0 * (r_x * r_z * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0 *
(r_x);
/* 42 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_x^1 \partial_y^1 \partial_z^3
* }\phi(x, y, z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_113(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_x * r_y * r_z * r_z * r_z) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * 3.0 * (r_x * r_y * r_z);
/* 48 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_x^1 \partial_y^2 \partial_z^2
* }\phi(x, y, z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_122(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_x * r_y * r_y * r_z * r_z) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_x * r_y * r_y) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_x * r_z * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * (r_x);
/* 48 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_x^1 \partial_y^3 \partial_z^1
* }\phi(x, y, z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_131(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_x * r_y * r_y * r_y * r_z) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * 3.0 * (r_x * r_y * r_z);
/* 48 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_x^1 \partial_y^4 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_140(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_x * r_y * r_y * r_y * r_y) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * 6.0 * (r_x * r_y * r_y) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0 *
(r_x);
/* 42 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_x^2 \partial_z^3 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_203(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_x * r_x * r_z * r_z * r_z) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * 3.0 * (r_x * r_x * r_z) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_z * r_z * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0 *
(r_z);
/* 44 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_x^2 \partial_y^1 \partial_z^2
* }\phi(x, y, z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_212(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_x * r_x * r_y * r_z * r_z) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_x * r_x * r_y) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_y * r_z * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * (r_y);
/* 48 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_x^2 \partial_y^2 \partial_z^1
* }\phi(x, y, z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_221(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_x * r_x * r_y * r_y * r_z) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_x * r_x * r_z) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_y * r_y * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * (r_z);
/* 48 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_x^2 \partial_y^3 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_230(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_x * r_x * r_y * r_y * r_y) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * 3.0 * (r_x * r_x * r_y) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_y * r_y * r_y) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0 *
(r_y);
/* 44 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_x^3 \partial_z^2 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_302(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_x * r_x * r_x * r_z * r_z) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_x * r_x * r_x) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * 3.0 * (r_x * r_z * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0 *
(r_x);
/* 44 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_x^3 \partial_y^1 \partial_z^1
* }\phi(x, y, z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_311(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_x * r_x * r_x * r_y * r_z) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * 3.0 * (r_x * r_y * r_z);
/* 48 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_x^3 \partial_y^2 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_320(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_x * r_x * r_x * r_y * r_y) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * (r_x * r_x * r_x) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * 3.0 * (r_x * r_y * r_y) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0 *
(r_x);
/* 44 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_x^4 \partial_z^1 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_401(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_x * r_x * r_x * r_x * r_z) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * 6.0 * (r_x * r_x * r_z) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0 *
(r_z);
/* 42 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_x^4 \partial_y^1 }\phi(x, y,
* z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_410(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_x * r_x * r_x * r_x * r_y) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * 6.0 * (r_x * r_x * r_y) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 3.0 *
(r_y);
/* 42 zero-valued terms not written out */
}
/**
* @brief Compute \f$ \frac{\partial^5}{ \partial_x^5 }\phi(x, y, z} \f$.
*
* Note that r_inv = 1./sqrt(r_x^2 + r_y^2 + r_z^2)
*/
__attribute__((always_inline)) INLINE static double D_500(double r_x,
double r_y,
double r_z,
double r_inv) {
return -945. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * r_inv * r_inv * (r_x * r_x * r_x * r_x * r_x) +
105. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv *
r_inv * 10.0 * (r_x * r_x * r_x) -
15. * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * r_inv * 15.0 *
(r_x);
/* 26 zero-valued terms not written out */
}
#endif
#endif /* SWIFT_GRAVITY_DERIVATIVE_H */
......@@ -25,7 +25,7 @@ TESTS = testGreetings testMaths testReading.sh testSingle testKernel testSymmetr
testParser.sh testSPHStep test125cells.sh test125cellsPerturbed.sh testFFT \
testAdiabaticIndex testRiemannExact testRiemannTRRS testRiemannHLLC \
testMatrixInversion testThreadpool testDump testLogger \
testVoronoi1D testVoronoi2D testVoronoi3D \
testVoronoi1D testVoronoi2D testVoronoi3D testGravityDerivatives \
testPeriodicBC.sh testPeriodicBCPerturbed.sh
# List of test programs to compile
......@@ -35,7 +35,8 @@ check_PROGRAMS = testGreetings testReading testSingle testTimeIntegration \
testSymmetry testThreadpool benchmarkInteractions \
testAdiabaticIndex testRiemannExact testRiemannTRRS \
testRiemannHLLC testMatrixInversion testDump testLogger \
testVoronoi1D testVoronoi2D testVoronoi3D testPeriodicBC
testVoronoi1D testVoronoi2D testVoronoi3D testPeriodicBC \
testGravityDerivatives
# Rebuild tests when SWIFT is updated.
$(check_PROGRAMS): ../src/.libs/libswiftsim.a
......@@ -95,6 +96,8 @@ testDump_SOURCES = testDump.c
testLogger_SOURCES = testLogger.c
testGravityDerivatives_SOURCES = testGravityDerivatives.c
# Files necessary for distribution
EXTRA_DIST = testReading.sh makeInput.py testPair.sh testPairPerturbed.sh \
test27cells.sh test27cellsPerturbed.sh testParser.sh testPeriodicBC.sh \
......
This diff is collapsed.
......@@ -2,6 +2,7 @@
\usepackage{graphicx}
\usepackage{amsmath,paralist,xcolor,xspace,amssymb}
\usepackage{times}
\usepackage{comment}
\newcommand{\swift}{{\sc Swift}\xspace}
\newcommand{\nbody}{$N$-body\xspace}
......
......@@ -4,19 +4,139 @@
For completeness, we give here the full expression for the first few
derivatives of the potential that are used in our FMM scheme. We use
the notation $\mathbf{r}=(r_x, r_y, r_z)$, $r = |\mathbf{r}|$ and
$u=r/H$. Starting from the potential (Eq. \ref{eq:fmm:potential},
reproduced here for clarity),
$u=r/H$. We can construct the higher order derivatives by successively
applying the "chain rule". We show representative examples of the
first few relevant ones here split by order. We start by constructing
common quantities that appear in derivatives of multiple orders.
\begin{align}
\mathsf{D}_{000}(\mathbf{r}) = \varphi (\mathbf{r},H) =
\left\lbrace\begin{array}{rcl}
\frac{1}{H} \left(-3u^7 + 15u^6 - 28u^5 + 21u^4 - 7u^2 + 3\right) & \mbox{if} & u < 1,\\
\frac{1}{r} & \mbox{if} & u \geq 1,
\end{array}
\right.\nonumber
\mathsf{\tilde{D}}_{1}(r, u, H) =
\left\lbrace\begin{array}{rcl}
\left(-3u^7 + 15u^6 - 28u^5 + 21u^4 - 7u^2 + 3\right)\times H^{-1} & \mbox{if} & u < 1,\\
r^{-1} & \mbox{if} & u \geq 1,
\end{array}
\right.\nonumber
\end{align}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{align}
\mathsf{\tilde{D}}_{3}(r, u, H) =
\left\lbrace\begin{array}{rcl}
-\left(21u^5 - 90u^4 + 140u^3 -84u^2 +14\right)\times H^{-3}& \mbox{if} & u < 1,\\
-1 \times r^{-3} & \mbox{if} & u \geq 1,
\end{array}
\right.\nonumber
\end{align}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{align}
\mathsf{\tilde{D}}_{5}(r, u, H) =
\left\lbrace\begin{array}{rcl}
\left(-105u^3 + 360u^2 - 420u + 168\right)\times H^{-5}& \mbox{if} & u < 1,\\
3\times r^{-5} & \mbox{if} & u \geq 1,
\end{array}
\right.\nonumber
\end{align}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{align}
\mathsf{\tilde{D}}_{7}(r, u, H) =
\left\lbrace\begin{array}{rcl}
-\left(315u - 720 + 420u^{-1}\right)\times H^{-7} & \mbox{if} & u < 1,\\
-15\times r^{-7} & \mbox{if} & u \geq 1,
\end{array}
\right.\nonumber
\end{align}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{align}
\mathsf{\tilde{D}}_{9}(r, u, H) =
\left\lbrace\begin{array}{rcl}
\left(-315u^{-1} + 420u^{-3}\right)\times H^{-9}& \mbox{if} & u < 1,\\
105\times r^{-9} & \mbox{if} & u \geq 1.
\end{array}
\right.\nonumber
\end{align}
Starting from the potential (Eq. \ref{eq:fmm:potential},
reproduced here for completeness), we can now build all the relevent derivatives
\begin{align}
\mathsf{D}_{000}(\mathbf{r}) = \varphi (\mathbf{r},H) =
\mathsf{\tilde{D}}_{1}(r, u, H) \nonumber
\end{align}
\noindent\rule{6cm}{0.4pt}
\begin{align}
\mathsf{D}_{100}(\mathbf{r}) = \frac{\partial}{\partial r_x} \varphi (\mathbf{r},H) =
r_x \mathsf{\tilde{D}}_{3}(r, u, H) \nonumber
\end{align}
\noindent\rule{6cm}{0.4pt}
\begin{align}
\mathsf{D}_{200}(\mathbf{r}) = \frac{\partial^2}{\partial r_x^2} \varphi (\mathbf{r},H) =
r_x^2 \mathsf{\tilde{D}}_{5}(r, u, H) +
\mathsf{\tilde{D}}_{3}(r, u, H)\nonumber
\end{align}
\begin{align}
\mathsf{D}_{110}(\mathbf{r}) = \frac{\partial^2}{\partial r_x\partial r_y} \varphi (\mathbf{r},H) =
r_x r_y \mathsf{\tilde{D}}_{5}(r, u, H) \nonumber
\end{align}
\noindent\rule{6cm}{0.4pt}
\begin{align}
\mathsf{D}_{300}(\mathbf{r}) = \frac{\partial^3}{\partial r_x^3} \varphi (\mathbf{r},H) =
r_x^3 \mathsf{\tilde{D}}_{7}(r, u, H)
+ 3 r_x \mathsf{\tilde{D}}_{5}(r, u, H) \nonumber
\end{align}
\begin{align}
\mathsf{D}_{210}(\mathbf{r}) = \frac{\partial^3}{\partial r_x^2 r_y} \varphi (\mathbf{r},H) =
r_x^2 r_y \mathsf{\tilde{D}}_{7}(r, u, H) +
r_y \mathsf{\tilde{D}}_{5}(r, u, H) \nonumber
\end{align}
\begin{align}
\mathsf{D}_{111}(\mathbf{r}) = \frac{\partial^3}{\partial r_x\partial r_y\partial r_z} \varphi (\mathbf{r},H) =
r_x r_y r_z \mathsf{\tilde{D}}_{7}(r, u, H) \nonumber
\end{align}
\noindent\rule{6cm}{0.4pt}
\begin{align}
\mathsf{D}_{400}(\mathbf{r}) &= \frac{\partial^4}{\partial r_x^4}
\varphi (\mathbf{r},H) =
r_x^4 \mathsf{\tilde{D}}_{9}(r, u, H)+
6r_x^2 \mathsf{\tilde{D}}_{7}(r, u, H) +
3 \mathsf{\tilde{D}}_{5}(r, u, H)
\nonumber
\end{align}
we can construct the higher order terms by successively applying the
"chain rule". We show representative examples of the first few
relevant ones here split by order.
\begin{align}
\mathsf{D}_{310}(\mathbf{r}) &= \frac{\partial^4}{\partial r_x^3
\partial r_y} \varphi (\mathbf{r},H) =
r_x^3 r_y \mathsf{\tilde{D}}_{9}(r, u, H) +
3 r_x r_y \mathsf{\tilde{D}}_{7}(r, u, H)
\nonumber
\end{align}
\begin{align}
\mathsf{D}_{220}(\mathbf{r}) &= \frac{\partial^4}{\partial r_x^2
\partial r_y^2} \varphi (\mathbf{r},H) =
r_x^2 r_y^2 \mathsf{\tilde{D}}_{9}(r, u, H) +
r_x^2 \mathsf{\tilde{D}}_{7}(r, u, H) +
r_y^2 \mathsf{\tilde{D}}_{7}(r, u, H) +
\mathsf{\tilde{D}}_{5}(r, u, H)
\nonumber
\end{align}
\begin{align}
\mathsf{D}_{211}(\mathbf{r}) &= \frac{\partial^4}{\partial r_x^2
\partial r_y \partial r_z} \varphi (\mathbf{r},H) =
r_x^2 r_y r_z \mathsf{\tilde{D}}_{9}(r, u, H) +
r_y r_z \mathsf{\tilde{D}}_{7}(r, u, H)
\nonumber
\end{align}
\begin{comment}
\noindent\rule{6cm}{0.4pt}
\begin{align}
\mathsf{D}_{100}(\mathbf{r}) = \frac{\partial}{\partial r_x} \varphi (\mathbf{r},H) =
......@@ -101,3 +221,5 @@ relevant ones here split by order.
\mathsf{D}_{211}(\mathbf{r}) &=
\nonumber
\end{align}
\end{comment}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment