34 :
Component(name), planarArcGeometry_m(1., 1.), dummy(), endField_m(nullptr) {}
38 planarArcGeometry_m(right.planarArcGeometry_m),
40 maxOrder_m(right.maxOrder_m),
41 tanDelta_m(right.tanDelta_m),
47 phiStart_m(right.phiStart_m),
48 phiEnd_m(right.phiEnd_m),
49 azimuthalExtent_m(right.azimuthalExtent_m),
50 verticalExtent_m(right.verticalExtent_m),
51 centre_m(right.centre_m),
53 endFieldName_m(right.endFieldName_m),
54 dfCoefficients_m(right.dfCoefficients_m) {
77 std::shared_ptr<ParticleContainer_t> pc =
RefPartBunch_m->getParticleContainer();
78 auto Rview = pc->
R.getView();
79 auto Pview = pc->P.getView();
83 return apply(R, P, t, E, B);
108 double r = std::sqrt(pos[0] * pos[0] + pos[2] * pos[2]);
109 double phi = std::atan2(
116 B[0] += bCyl[0] * std::cos(phi) - bCyl[2] * std::sin(phi);
117 B[2] += bCyl[0] * std::sin(phi) + bCyl[2] * std::cos(phi);
126 if (r < rMin_m || r >
rMax_m) {
130 double normRadius = r /
r0_m;
133 double h = std::pow(normRadius,
k_m) *
Bz_m;
143 std::vector<double> fringeDerivatives(
maxOrder_m + 1, 0.);
144 for (
size_t i = 0; i < fringeDerivatives.size(); ++i) {
153 deltaB[1] = f2n * h * std::pow(z / r, n);
160 deltaB[0] = (f2n * (
k_m - n) / (n + 1) -
tanDelta_m * f2nplus1) * h
161 * std::pow(z / r, n + 1);
163 f2nplus1 * h * std::pow(z / r, n + 1);
215 std::shared_ptr<endfieldmodel::EndFieldModel> efm =
ippl::Vector< T, Dim > Vector_t
Template PIC bunch: IPPL PicManager, shared field mesh/solver, and multiple particle containers.
Abstract base class for accelerator geometry classes.
virtual void visitScalingFFAMagnet(const ScalingFFAMagnet &)=0
PartBunch_t * RefPartBunch_m
Abstract base class for electromagnetic fields.
Vector_t< double, Dim > R(size_t)
Do not use; throws (access positions via ParticleContainer::R).
void setCurvature(double)
Set curvature.
virtual void setElementLength(double)
Set length.
std::string endFieldName_m
void accept(BeamlineVisitor &visitor) const override
void setAzimuthalExtent(double azimuthalExtent)
endfieldmodel::EndFieldModel * endField_m
ScalingFFAMagnet * clone() const override
ScalingFFAMagnet(const std::string &name)
void calculateDfCoefficients()
void setPhiStart(double phiStart)
bool apply(const std::shared_ptr< ParticleContainer_t > &pc) override
EMField & getField() override
void setEndField(endfieldmodel::EndFieldModel *endField)
void setPhiEnd(double phiEnd)
bool getFieldValue(const Vector_t< double, 3 > &R, Vector_t< double, 3 > &B) const
Vector_t< double, 3 > centre_m
std::vector< std::vector< double > > dfCoefficients_m
bool getFieldValueCylindrical(const Vector_t< double, 3 > &R, Vector_t< double, 3 > &B) const
double getPhiStart() const
BGeometryBase & getGeometry() override
bool bends() const override
void initialise(PartBunch_t *bunch, double &startField, double &endField) override
PlanarArcGeometry planarArcGeometry_m
static std::shared_ptr< EndFieldModel > getEndFieldModel(std::string name)
virtual void rescale(double scaleFactor)=0
virtual double getCentreLength() const =0
virtual double getEndLength() const =0
virtual double function(double x, int n) const =0
virtual EndFieldModel * clone() const =0