33#include <gsl/gsl_math.h>
123 double Bx =
getBx(R_prime);
124 double Bs =
getBs(R_prime);
125 B[0] = Bx * cos(theta) - Bs * sin(theta);
126 B[2] = Bx * sin(theta) + Bs * cos(theta);
127 B[1] =
getBz(R_prime);
131 for (
int i = 0; i < 3; i++) {
140 std::shared_ptr<ParticleContainer_t> pc =
RefPartBunch_m->getParticleContainer();
141 auto Rview = pc->R.getView();
142 auto Pview = pc->P.getView();
147 return apply(R(i), P(i), t, E, B);
162 R_pprime[1] = R_prime[1];
193 double alpha = atan(R[2] / (R[0] + radius));
194 if (alpha != 0.0 &&
angle_m != 0.0) {
195 X[0] = R[2] / sin(alpha) - radius;
197 X[2] = radius * alpha;
219 while (maxOrder >= N) {
228 while (maxOrder >= N) {
266 for (std::size_t n = 0; n <=
maxOrder_m; n++) {
268 for (std::size_t i = 0; i <= n; i++) {
272 f_n *= gsl_sf_pow_int(-1.0, n);
273 Bz += gsl_sf_pow_int(R[1], 2 * n) / gsl_sf_fact(2 * n) * f_n;
282 for (std::size_t n = 0; n <=
maxOrder_m; n++) {
283 double f_n =
getFn(n, R[0], R[2]);
284 Bz += gsl_sf_pow_int(R[1], 2 * n) / gsl_sf_fact(2 * n) * f_n;
297 for (std::size_t n = 0; n <=
maxOrder_m; n++) {
299 for (std::size_t i = 0; i <= n; i++) {
303 f_n *= gsl_sf_pow_int(-1.0, n);
304 Bx += gsl_sf_pow_int(R[1], 2 * n + 1) / gsl_sf_fact(2 * n + 1) * f_n;
313 for (std::size_t n = 0; n <=
maxOrder_m; n++) {
315 Bx += partialX_fn * gsl_sf_pow_int(R[1], 2 * n + 1) / gsl_sf_fact(2 * n + 1);
328 for (std::size_t n = 0; n <=
maxOrder_m; n++) {
330 for (std::size_t i = 0; i <= n; i++) {
334 f_n *= gsl_sf_pow_int(-1.0, n);
335 Bs += gsl_sf_pow_int(R[1], 2 * n + 1) / gsl_sf_fact(2 * n + 1) * f_n;
344 for (std::size_t n = 0; n <=
maxOrder_m; n++) {
346 Bs += partialS_fn * gsl_sf_pow_int(R[1], 2 * n + 1) / gsl_sf_fact(2 * n + 1);
373 for (std::size_t i = 1; i <= n; i++) {
377 temp[j] = temp[j + 1] * (j + 1);
387 func += temp[k] * gsl_sf_pow_int(x, k);
413 std::vector<double> temp(2, 0.0);
420 std::vector<double> temp(2, 0.0);
429 return centralRadius;
451 double stepSize = 1e-3;
452 deriv += 1. *
getFn(n, x - 2. * stepSize, s);
453 deriv += -8. *
getFn(n, x - stepSize, s);
454 deriv += 8. *
getFn(n, x + stepSize, s);
455 deriv += -1. *
getFn(n, x + 2. * stepSize, s);
456 deriv /= 12 * stepSize;
465 double stepSize = 1e-3;
466 deriv += 1. *
getFn(n, x, s - 2. * stepSize);
467 deriv += -8. *
getFn(n, x, s - stepSize);
468 deriv += 8. *
getFn(n, x, s + stepSize);
469 deriv += -1. *
getFn(n, x, s + 2. * stepSize);
470 deriv /= 12 * stepSize;
490 / gsl_sf_pow_int(rho, 2 * n - i - 2 * j);
493 func *= gsl_sf_pow_int(-1.0, n);
500 std::vector<double> fringeDerivatives;
509 * fringeDerivatives.at(j);
513 func *= gsl_sf_pow_int(-1.0, n) * S_0 * rho;
PartBunch< PLayout_t< double, 3 >, double, 3 > PartBunch_t
ippl::Vector< T, Dim > Vector_t
double integrate(const double &a, const double &s0, const double &lambdaleft, const double &lambdaright, const int &n)
virtual void visitMultipoleT(const MultipoleT &)=0
Apply the algorithm to an arbitrary multipole.
Component(const std::string &name)
Constructor with given name.
PartBunch_t * RefPartBunch_m
bool getFlagDeleteOnTransverseExit() const
ElementBase(const std::string &name)
Constructor with given name.
std::vector< double > transProfile_m
void setDipoleConstant(double B0)
std::size_t transMaxOrder_m
void setAperture(double vertAp, double horizAp)
Vector_t< double, 3 > rotateFrameInverse(Vector_t< double, 3 > &B)
Vector_t< double, 3 > transformCoords(const Vector_t< double, 3 > &R)
double getTransDeriv(std::size_t n, double x)
void setMaxOrder(std::size_t maxOrder)
std::vector< polynomial::RecursionRelationTwo > recursion_VarRadius_m
bool apply(const Vector_t< double, 3 > &R, const Vector_t< double, 3 > &P, const double &t, Vector_t< double, 3 > &E, Vector_t< double, 3 > &B) override
endfieldmodel::Tanh fringeField_r
endfieldmodel::Tanh fringeField_l
double getBz(const Vector_t< double, 3 > &R)
ElementBase * clone() const override
bool insideAperture(const Vector_t< double, 3 > &R)
EMField & getField() override
double getScaleFactor(double x, double s)
double getFnDerivX(std::size_t n, double x, double s)
void accept(BeamlineVisitor &visitor) const override
void getDimensions(double &zBegin, double &zEnd) const override
double getFnDerivS(std::size_t n, double x, double s)
double getRadius(double s)
std::vector< polynomial::RecursionRelation > recursion_ConstRadius_m
double getBx(const Vector_t< double, 3 > &R)
double getFn(std::size_t n, double x, double s)
bool setFringeField(double s0, double lambda_left, double lambda_right)
void initialise(PartBunch_t *, double &startField, double &endField) override
double getFringeDeriv(int n, double s)
PlanarArcGeometry planarArcGeometry_m
bool bends() const override
std::vector< double > getAperture() const
void setTransProfile(std::size_t n, double Bn)
double boundingBoxLength_m
MultipoleT(const std::string &name)
Vector_t< double, 3 > rotateFrame(const Vector_t< double, 3 > &R)
double getBs(const Vector_t< double, 3 > &R)
PlanarArcGeometry & getGeometry() override
std::vector< double > getFringeLength() const
std::vector< double > getTransformation() const
void resizeX(const std::size_t &xDerivatives)
void truncate(std::size_t highestXorder)
void truncate(std::size_t highestXorder)
void resizeX(const std::size_t &xDerivatives)
A simple arc in the XZ plane.
Abstract base class for electromagnetic fields.