/******************************************************************************* * This file is part of SWIFT. * Copyright (c) 2016 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_VECTOR_POWER_H #define SWIFT_VECTOR_POWER_H /** * @file vector_power.h * @brief Powers of 3D vectors to a multi-index with factorial. * * These expressions are to be used in 3D Taylor series. * * We use the notation of Dehnen, Computational Astrophysics and Cosmology, * 1, 1, pp. 24 (2014), arXiv:1405.2255. * * We compute \f$ \frac{1}{\vec{m}!}\vec{v}^{\vec{m}} \f$ for all relevant m. */ /* Config parameters. */ #include /* Local headers. */ #include "inline.h" /***************************/ /* 0th order vector powers */ /***************************/ /** * @brief \f$ \frac{1}{(0,0,0)!}\vec{v}^{(0,0,0)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_000( const double v[3]) { return 1.; } /***************************/ /* 1st order vector powers */ /***************************/ /** * @brief \f$ \frac{1}{(1,0,0)!}\vec{v}^{(1,0,0)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_100( const double v[3]) { return v[0]; } /** * @brief \f$ \frac{1}{(0,1,0)!}\vec{v}^{(0,1,0)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_010( const double v[3]) { return v[1]; } /** * @brief \f$ \frac{1}{(0,0,1)!}\vec{v}^{(0,0,1)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_001( const double v[3]) { return v[2]; } /***************************/ /* 2nd order vector powers */ /***************************/ /** * @brief \f$ \frac{1}{(2,0,0)!}\vec{v}^{(2,0,0)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_200( const double v[3]) { return 0.5 * v[0] * v[0]; } /** * @brief \f$ \frac{1}{(0,2,0)!}\vec{v}^{(0,2,0)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_020( const double v[3]) { return 0.5 * v[1] * v[1]; } /** * @brief \f$ \frac{1}{(0,0,2)!}\vec{v}^{(0,0,2)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_002( const double v[3]) { return 0.5 * v[2] * v[2]; } /** * @brief \f$ \frac{1}{(1,1,0)!}\vec{v}^{(1,1,0)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_110( const double v[3]) { return v[0] * v[1]; } /** * @brief \f$ \frac{1}{(1,0,1)!}\vec{v}^{(1,0,1)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_101( const double v[3]) { return v[0] * v[2]; } /** * @brief \f$ \frac{1}{(0,1,1)!}\vec{v}^{(0,1,1)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_011( const double v[3]) { return v[1] * v[2]; } /***************************/ /* 3rd order vector powers */ /***************************/ /** * @brief \f$ \frac{1}{(3,0,0)!}\vec{v}^{(3,0,0)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_300( const double v[3]) { return 0.1666666666666667 * v[0] * v[0] * v[0]; } /** * @brief \f$ \frac{1}{(0,3,0)!}\vec{v}^{(0,3,0)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_030( const double v[3]) { return 0.1666666666666667 * v[1] * v[1] * v[1]; } /** * @brief \f$ \frac{1}{(0,0,3)!}\vec{v}^{(0,0,3)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_003( const double v[3]) { return 0.1666666666666667 * v[2] * v[2] * v[2]; } /** * @brief \f$ \frac{1}{(2,1,0)!}\vec{v}^{(2,1,0)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_210( const double v[3]) { return 0.5 * v[0] * v[0] * v[1]; } /** * @brief \f$ \frac{1}{(2,0,1)!}\vec{v}^{(2,0,1)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_201( const double v[3]) { return 0.5 * v[0] * v[0] * v[2]; } /** * @brief \f$ \frac{1}{(1,2,0)!}\vec{v}^{(1,2,0)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_120( const double v[3]) { return 0.5 * v[0] * v[1] * v[1]; } /** * @brief \f$ \frac{1}{(0,2,1)!}\vec{v}^{(0,2,1)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_021( const double v[3]) { return 0.5 * v[1] * v[1] * v[2]; } /** * @brief \f$ \frac{1}{(1,0,2)!}\vec{v}^{(1,0,2)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_102( const double v[3]) { return 0.5 * v[0] * v[2] * v[2]; } /** * @brief \f$ \frac{1}{(0,1,2)!}\vec{v}^{(0,1,2)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_012( const double v[3]) { return 0.5 * v[1] * v[2] * v[2]; } /** * @brief \f$ \frac{1}{(1,1,1)!}\vec{v}^{(1,1,1)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_111( const double v[3]) { return v[0] * v[1] * v[2]; } /***************************/ /* 4th order vector powers */ /***************************/ /** * @brief \f$ \frac{1}{(4,0,0)!}\vec{v}^{(4,0,0)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_400( const double v[3]) { const double vv = v[0] * v[0]; return 0.041666666666666667 * vv * vv; } /** * @brief \f$ \frac{1}{(0,4,0)!}\vec{v}^{(0,4,0)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_040( const double v[3]) { const double vv = v[1] * v[1]; return 0.041666666666666667 * vv * vv; } /** * @brief \f$ \frac{1}{(0,0,4)!}\vec{v}^{(0,0,4)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_004( const double v[3]) { const double vv = v[2] * v[2]; return 0.041666666666666667 * vv * vv; } /** * @brief \f$ \frac{1}{(3,1,0)!}\vec{v}^{(3,1,0)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_310( const double v[3]) { return 0.1666666666666667 * v[0] * v[0] * v[0] * v[1]; } /** * @brief \f$ \frac{1}{(3,0,1)!}\vec{v}^{(3,0,1)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_301( const double v[3]) { return 0.1666666666666667 * v[0] * v[0] * v[0] * v[2]; } /** * @brief \f$ \frac{1}{(1,3,0)!}\vec{v}^{(1,3,0)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_130( const double v[3]) { return 0.1666666666666667 * v[0] * v[1] * v[1] * v[1]; } /** * @brief \f$ \frac{1}{(0,3,1)!}\vec{v}^{(0,3,1)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_031( const double v[3]) { return 0.1666666666666667 * v[1] * v[1] * v[1] * v[2]; } /** * @brief \f$ \frac{1}{(1,0,3)!}\vec{v}^{(1,0,3)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_103( const double v[3]) { return 0.1666666666666667 * v[0] * v[2] * v[2] * v[2]; } /** * @brief \f$ \frac{1}{(0,1,3)!}\vec{v}^{(0,1,3)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_013( const double v[3]) { return 0.1666666666666667 * v[1] * v[2] * v[2] * v[2]; } /** * @brief \f$ \frac{1}{(2,2,0)!}\vec{v}^{(2,2,0)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_220( const double v[3]) { return 0.25 * v[0] * v[0] * v[1] * v[1]; } /** * @brief \f$ \frac{1}{(2,0,2)!}\vec{v}^{(2,0,2)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_202( const double v[3]) { return 0.25 * v[0] * v[0] * v[2] * v[2]; } /** * @brief \f$ \frac{1}{(0,2,2)!}\vec{v}^{(0,2,2)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_022( const double v[3]) { return 0.25 * v[1] * v[1] * v[2] * v[2]; } /** * @brief \f$ \frac{1}{(2,1,1)!}\vec{v}^{(2,1,1)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_211( const double v[3]) { return 0.5 * v[0] * v[0] * v[1] * v[2]; } /** * @brief \f$ \frac{1}{(1,2,1)!}\vec{v}^{(1,2,1)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_121( const double v[3]) { return 0.5 * v[0] * v[1] * v[1] * v[2]; } /** * @brief \f$ \frac{1}{(1,1,2)!}\vec{v}^{(1,1,2)} \f$. * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_112( const double v[3]) { return 0.5 * v[0] * v[1] * v[2] * v[2]; } /***************************/ /* 5th order vector powers */ /***************************/ /** * @brief Compute \f$ \frac{1}{(0,0,5)!}\vec{v}^{(0,0,5)} \f$. * * Note \f$ \vec{v}^{(0,0,5)} = v_z^5 \f$ * and \f$ \frac{1}{(0,0,5)!} = 1/(0!*0!*5!) = 1/120 = 8.333333e-03 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_005( const double v[3]) { return 8.333333333333333e-03 * v[2] * v[2] * v[2] * v[2] * v[2]; } /** * @brief Compute \f$ \frac{1}{(0,1,4)!}\vec{v}^{(0,1,4)} \f$. * * Note \f$ \vec{v}^{(0,1,4)} = v_y^1 v_z^4 \f$ * and \f$ \frac{1}{(0,1,4)!} = 1/(0!*1!*4!) = 1/24 = 4.166667e-02 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_014( const double v[3]) { return 4.166666666666666e-02 * v[1] * v[2] * v[2] * v[2] * v[2]; } /** * @brief Compute \f$ \frac{1}{(0,2,3)!}\vec{v}^{(0,2,3)} \f$. * * Note \f$ \vec{v}^{(0,2,3)} = v_y^2 v_z^3 \f$ * and \f$ \frac{1}{(0,2,3)!} = 1/(0!*2!*3!) = 1/12 = 8.333333e-02 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_023( const double v[3]) { return 8.333333333333333e-02 * v[1] * v[1] * v[2] * v[2] * v[2]; } /** * @brief Compute \f$ \frac{1}{(0,3,2)!}\vec{v}^{(0,3,2)} \f$. * * Note \f$ \vec{v}^{(0,3,2)} = v_y^3 v_z^2 \f$ * and \f$ \frac{1}{(0,3,2)!} = 1/(0!*3!*2!) = 1/12 = 8.333333e-02 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_032( const double v[3]) { return 8.333333333333333e-02 * v[1] * v[1] * v[1] * v[2] * v[2]; } /** * @brief Compute \f$ \frac{1}{(0,4,1)!}\vec{v}^{(0,4,1)} \f$. * * Note \f$ \vec{v}^{(0,4,1)} = v_y^4 v_z^1 \f$ * and \f$ \frac{1}{(0,4,1)!} = 1/(0!*4!*1!) = 1/24 = 4.166667e-02 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_041( const double v[3]) { return 4.166666666666666e-02 * v[1] * v[1] * v[1] * v[1] * v[2]; } /** * @brief Compute \f$ \frac{1}{(0,5,0)!}\vec{v}^{(0,5,0)} \f$. * * Note \f$ \vec{v}^{(0,5,0)} = v_y^5 \f$ * and \f$ \frac{1}{(0,5,0)!} = 1/(0!*5!*0!) = 1/120 = 8.333333e-03 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_050( const double v[3]) { return 8.333333333333333e-03 * v[1] * v[1] * v[1] * v[1] * v[1]; } /** * @brief Compute \f$ \frac{1}{(1,0,4)!}\vec{v}^{(1,0,4)} \f$. * * Note \f$ \vec{v}^{(1,0,4)} = v_x^1 v_z^4 \f$ * and \f$ \frac{1}{(1,0,4)!} = 1/(1!*0!*4!) = 1/24 = 4.166667e-02 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_104( const double v[3]) { return 4.166666666666666e-02 * v[0] * v[2] * v[2] * v[2] * v[2]; } /** * @brief Compute \f$ \frac{1}{(1,1,3)!}\vec{v}^{(1,1,3)} \f$. * * Note \f$ \vec{v}^{(1,1,3)} = v_x^1 v_y^1 v_z^3 \f$ * and \f$ \frac{1}{(1,1,3)!} = 1/(1!*1!*3!) = 1/6 = 1.666667e-01 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_113( const double v[3]) { return 1.666666666666667e-01 * v[0] * v[1] * v[2] * v[2] * v[2]; } /** * @brief Compute \f$ \frac{1}{(1,2,2)!}\vec{v}^{(1,2,2)} \f$. * * Note \f$ \vec{v}^{(1,2,2)} = v_x^1 v_y^2 v_z^2 \f$ * and \f$ \frac{1}{(1,2,2)!} = 1/(1!*2!*2!) = 1/4 = 2.500000e-01 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_122( const double v[3]) { return 2.500000000000000e-01 * v[0] * v[1] * v[1] * v[2] * v[2]; } /** * @brief Compute \f$ \frac{1}{(1,3,1)!}\vec{v}^{(1,3,1)} \f$. * * Note \f$ \vec{v}^{(1,3,1)} = v_x^1 v_y^3 v_z^1 \f$ * and \f$ \frac{1}{(1,3,1)!} = 1/(1!*3!*1!) = 1/6 = 1.666667e-01 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_131( const double v[3]) { return 1.666666666666667e-01 * v[0] * v[1] * v[1] * v[1] * v[2]; } /** * @brief Compute \f$ \frac{1}{(1,4,0)!}\vec{v}^{(1,4,0)} \f$. * * Note \f$ \vec{v}^{(1,4,0)} = v_x^1 v_y^4 \f$ * and \f$ \frac{1}{(1,4,0)!} = 1/(1!*4!*0!) = 1/24 = 4.166667e-02 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_140( const double v[3]) { return 4.166666666666666e-02 * v[0] * v[1] * v[1] * v[1] * v[1]; } /** * @brief Compute \f$ \frac{1}{(2,0,3)!}\vec{v}^{(2,0,3)} \f$. * * Note \f$ \vec{v}^{(2,0,3)} = v_x^2 v_z^3 \f$ * and \f$ \frac{1}{(2,0,3)!} = 1/(2!*0!*3!) = 1/12 = 8.333333e-02 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_203( const double v[3]) { return 8.333333333333333e-02 * v[0] * v[0] * v[2] * v[2] * v[2]; } /** * @brief Compute \f$ \frac{1}{(2,1,2)!}\vec{v}^{(2,1,2)} \f$. * * Note \f$ \vec{v}^{(2,1,2)} = v_x^2 v_y^1 v_z^2 \f$ * and \f$ \frac{1}{(2,1,2)!} = 1/(2!*1!*2!) = 1/4 = 2.500000e-01 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_212( const double v[3]) { return 2.500000000000000e-01 * v[0] * v[0] * v[1] * v[2] * v[2]; } /** * @brief Compute \f$ \frac{1}{(2,2,1)!}\vec{v}^{(2,2,1)} \f$. * * Note \f$ \vec{v}^{(2,2,1)} = v_x^2 v_y^2 v_z^1 \f$ * and \f$ \frac{1}{(2,2,1)!} = 1/(2!*2!*1!) = 1/4 = 2.500000e-01 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_221( const double v[3]) { return 2.500000000000000e-01 * v[0] * v[0] * v[1] * v[1] * v[2]; } /** * @brief Compute \f$ \frac{1}{(2,3,0)!}\vec{v}^{(2,3,0)} \f$. * * Note \f$ \vec{v}^{(2,3,0)} = v_x^2 v_y^3 \f$ * and \f$ \frac{1}{(2,3,0)!} = 1/(2!*3!*0!) = 1/12 = 8.333333e-02 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_230( const double v[3]) { return 8.333333333333333e-02 * v[0] * v[0] * v[1] * v[1] * v[1]; } /** * @brief Compute \f$ \frac{1}{(3,0,2)!}\vec{v}^{(3,0,2)} \f$. * * Note \f$ \vec{v}^{(3,0,2)} = v_x^3 v_z^2 \f$ * and \f$ \frac{1}{(3,0,2)!} = 1/(3!*0!*2!) = 1/12 = 8.333333e-02 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_302( const double v[3]) { return 8.333333333333333e-02 * v[0] * v[0] * v[0] * v[2] * v[2]; } /** * @brief Compute \f$ \frac{1}{(3,1,1)!}\vec{v}^{(3,1,1)} \f$. * * Note \f$ \vec{v}^{(3,1,1)} = v_x^3 v_y^1 v_z^1 \f$ * and \f$ \frac{1}{(3,1,1)!} = 1/(3!*1!*1!) = 1/6 = 1.666667e-01 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_311( const double v[3]) { return 1.666666666666667e-01 * v[0] * v[0] * v[0] * v[1] * v[2]; } /** * @brief Compute \f$ \frac{1}{(3,2,0)!}\vec{v}^{(3,2,0)} \f$. * * Note \f$ \vec{v}^{(3,2,0)} = v_x^3 v_y^2 \f$ * and \f$ \frac{1}{(3,2,0)!} = 1/(3!*2!*0!) = 1/12 = 8.333333e-02 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_320( const double v[3]) { return 8.333333333333333e-02 * v[0] * v[0] * v[0] * v[1] * v[1]; } /** * @brief Compute \f$ \frac{1}{(4,0,1)!}\vec{v}^{(4,0,1)} \f$. * * Note \f$ \vec{v}^{(4,0,1)} = v_x^4 v_z^1 \f$ * and \f$ \frac{1}{(4,0,1)!} = 1/(4!*0!*1!) = 1/24 = 4.166667e-02 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_401( const double v[3]) { return 4.166666666666666e-02 * v[0] * v[0] * v[0] * v[0] * v[2]; } /** * @brief Compute \f$ \frac{1}{(4,1,0)!}\vec{v}^{(4,1,0)} \f$. * * Note \f$ \vec{v}^{(4,1,0)} = v_x^4 v_y^1 \f$ * and \f$ \frac{1}{(4,1,0)!} = 1/(4!*1!*0!) = 1/24 = 4.166667e-02 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_410( const double v[3]) { return 4.166666666666666e-02 * v[0] * v[0] * v[0] * v[0] * v[1]; } /** * @brief Compute \f$ \frac{1}{(5,0,0)!}\vec{v}^{(5,0,0)} \f$. * * Note \f$ \vec{v}^{(5,0,0)} = v_x^5 \f$ * and \f$ \frac{1}{(5,0,0)!} = 1/(5!*0!*0!) = 1/120 = 8.333333e-03 \f$ * * @param v vector (\f$ v \f$). */ __attribute__((always_inline, const)) INLINE static double X_500( const double v[3]) { return 8.333333333333333e-03 * v[0] * v[0] * v[0] * v[0] * v[0]; } #endif /* SWIFT_VECTOR_POWER_H */