18#ifndef ABSBEAMLINE_MULTIPOLET_CURVED_CONST_RADIUS_H
19#define ABSBEAMLINE_MULTIPOLET_CURVED_CONST_RADIUS_H
84 double scaling)
override;
93 template <
class ViewType>
106 const double rMinusX = radius - R[0];
107 const double alpha = Kokkos::hypot(rMinusX, R[2]);
108 result[0] = alpha - radius;
110 result[2] = radius * Kokkos::atan2(R[2], rMinusX);
116template <
class ViewType>
125 if (insideAperture && insideBoundingBox) {
127 Kokkos::Array<double, MaxDerivatives> dt{};
128 Kokkos::Array<double, MaxDerivatives> ds{};
129 Kokkos::Array<double, MaxPowerInteger> rhoPowers{};
130 Kokkos::Array<double, MaxPowerInteger> hsPowers{};
135 tanhCoefficients, ds);
138 const double hs = 1 + RPrime[0] / rho;
140 for (
unsigned int n = 0; n <= config.
maxFOrder_m; n++) {
144 for (
unsigned int i = 0; i <= n; i++) {
145 for (
unsigned int j = 0; j <= n - i; j++) {
148 const double rhoHs = 1.0 / rhoPowers[i] / hsPowers[2 * n - i - 2 * j];
150 dt[i + 2 * j + 1] - (2 * n - i - 2 * j) / rho / hs * dt[i + 2 * j];
151 innerSumX += k * rhoHs * dtx * ds[2 * n - 2 * i - 2 * j];
152 innerSumZ += k * rhoHs * dt[i + 2 * j] * ds[2 * n - 2 * i - 2 * j];
153 innerSumS += k * rhoHs * dt[i + 2 * j] * ds[2 * n - 2 * i - 2 * j + 1];
160 myB[0] += innerSumX * xszk;
161 myB[1] += innerSumZ * zzk;
162 myB[2] += innerSumS * xszk;
166 return !insideAperture;
ippl::Vector< T, Dim > Vector_t
Abstract base class for accelerator geometry classes.
static KOKKOS_INLINE_FUNCTION Vector_t< double, 3 > rotateFrame(const Vector_t< double, 3 > &R, const MultipoleTConfig &config)
static KOKKOS_INLINE_FUNCTION double powerInteger(double x, unsigned int n)
static KOKKOS_INLINE_FUNCTION void calcTransverseDerivatives(const Kokkos::Array< double, MultipoleTConfig::NumPoles > &poles, unsigned int numDerivatives, double x, Kokkos::Array< double, MaxDerivatives > &derivatives)
static KOKKOS_INLINE_FUNCTION void calcPowers(double value, unsigned int maxPower, Kokkos::Array< double, MaxPowerInteger > &powers)
static KOKKOS_INLINE_FUNCTION void calcFringeDerivatives(const double &s0, const double &lambdaLeft, const double &lambdaRight, double s, const ViewType &tanhCoefficients, Kokkos::Array< double, MaxDerivatives > &derivatives)
static KOKKOS_INLINE_FUNCTION double factorial(unsigned int n)
void getField(Kokkos::View< Vector_t< double, 3 > * > R, Kokkos::View< Vector_t< double, 3 > * > E, Kokkos::View< Vector_t< double, 3 > * > B, double scaling, size_t count) override
static KOKKOS_INLINE_FUNCTION bool computeBField(const Vector_t< double, 3 > &R, Vector_t< double, 3 > &B, double scaling, const MultipoleTConfig &config, const ViewType &tanhCoefficients)
PlanarArcGeometry planarArcGeometry_m
static KOKKOS_INLINE_FUNCTION Vector_t< double, 3 > toMagnetCoords(const Vector_t< double, 3 > &R, const MultipoleTConfig &config)
BGeometryBase * getGeometry() override
void initialise() override
A simple arc in the XZ plane.
double horizontalAperture_m
double fringeLambdaRight_m
double verticalAperture_m
Kokkos::Array< double, NumPoles > transverseProfile_m
double fringeLambdaLeft_m
double boundingBoxLength_m