29#include "gsl/gsl_sf_pow_int.h"
44 auto [s0, leftFringe, rightFringe] =
element_m->getFringeField();
84 return {x_rotated, r[1], -z_rotated};
88 auto [s0, leftFringe, rightFringe] =
element_m->getFringeField();
92 return {result[0], result[1], result[2]};
96 auto [s0, leftFringe, rightFringe] =
element_m->getFringeField();
98 double prefactor = rho * (
tanh(s0 / leftFringe) +
tanh(s0 / rightFringe));
99 double theta = leftFringe *
log(
cosh((R[2] + s0) / leftFringe)) -
100 rightFringe *
log(
cosh((R[2] - s0) / rightFringe));
102 double Bx = B[0], Bs = B[2];
103 B[0] = Bx *
cos(theta) - Bs *
sin(theta);
104 B[2] = Bx *
sin(theta) + Bs *
cos(theta);
109 while (orderZ >= N) {
120 if (
element_m->getFringeDeriv(0, s) > 1.0e-12) {
123 result += x / radius;
134 double S_0 =
element_m->getFringeDeriv(0, 0);
135 double y =
element_m->getFringeDeriv(0, s) / (S_0 * rho);
136 std::vector<double> fringeDerivatives;
137 for (std::size_t j = 0; j <=
recursion_m.at(n).getMaxSDerivatives(); j++) {
138 fringeDerivatives.push_back(
element_m->getFringeDeriv(j, s) / (S_0 * rho));
140 for (std::size_t i = 0; i <=
recursion_m.at(n).getMaxXDerivatives(); i++) {
142 for (std::size_t j = 0; j <=
recursion_m.at(n).getMaxSDerivatives(); j++) {
143 temp +=
recursion_m.at(n).evaluatePolynomial(x, y, i, j, fringeDerivatives)
144 * fringeDerivatives.at(j);
146 result += temp *
element_m->getTransDeriv(i, x);
148 result *= gsl_sf_pow_int(-1.0,
static_cast<int>(n)) * S_0 * rho;
159 double dx =
c[0] - target[0];
160 double ds =
c[2] - target[2];
161 return sqrt(dx * dx + ds * ds);
173 bool improved =
false;
174 for (
int dim = 0; dim < 2; ++dim) {
175 for (
int dir = -1; dir <= 1; dir += 2) {
178 trial[0] += dir * step;
180 trial[2] += dir * step;
183 if (res < best_res) {
Tps< T > log(const Tps< T > &x)
Natural logarithm.
Tps< T > cos(const Tps< T > &x)
Cosine.
Tps< T > cosh(const Tps< T > &x)
Hyperbolic cosine.
Tps< T > tanh(const Tps< T > &x)
Hyperbolic tangent.
Tps< T > sin(const Tps< T > &x)
Sine.
Tps< T > sqrt(const Tps< T > &x)
Square root.
constexpr double c
The velocity of light in m/s.
PETE_TBTree< FnArcTan2, PETE_Scalar< Vektor< T1, Dim > >, typename T2::PETE_Expr_t > atan2(const Vektor< T1, Dim > &l, const PETE_Expr< T2 > &r)
MultipoleTBase(MultipoleT *element)
void initialise() override
std::vector< polynomial::RecursionRelationTwo > recursion_m
void transformBField(Vector_t &, const Vector_t &) override
double getScaleFactor(double x, double s) override
double reverseTransformResidual(const Vector_t &r, const Vector_t &target)
static constexpr double TangentStep
double getFn(size_t n, double x, double s) override
MultipoleTCurvedVarRadius(MultipoleT *element)
static constexpr size_t ReverseTransformMaxIterations
void setMaxOrder(size_t orderZ, size_t orderX) override
Vector_t localCartesianEntryPoint_
double localCartesianRotation_
VarRadiusGeometry varRadiusGeometry_m
Vector_t localCartesianToCurvilinear(const Vector_t &r)
void transformCoords(Vector_t &) override
static constexpr double ReverseTransformTolerance
Vector_t localCartesianToOpalCartesian(const Vector_t &r) override
Vector_t curvilinearToLocalCartesian(const Vector_t &r)
std::vector< double > getTransformation() const
void truncate(std::size_t highestXorder)
void resizeX(const std::size_t &xDerivatives)
Vektor< double, 3 > Vector_t