18 :
Component(name), straightGeometry_m(1.) {
23 straightGeometry_m(right.straightGeometry_m),
25 maxOrder_m(right.maxOrder_m),
28 zNegExtent_m(right.zNegExtent_m),
29 zPosExtent_m(right.zPosExtent_m),
30 halfWidth_m(right.halfWidth_m),
31 bbLength_m(right.bbLength_m),
32 endField_m(right.endField_m->clone()),
33 dfCoefficients_m(right.dfCoefficients_m) {
88 std::vector<double> fringeDerivatives(
maxOrder_m+2, 0.);
90 for (
size_t i = 0; i < fringeDerivatives.size(); ++i) {
91 fringeDerivatives[i] =
endField_m->function(zRel, i);
96 for (
size_t i = 1; i < x_n.size(); ++i) {
97 x_n[i] = x_n[i-1]*R[0];
106 for (
size_t i = 0; i < coefficients.size(); ++i) {
107 f_n[n] += coefficients[i]*fringeDerivatives[i];
108 dz_f_n[n] += coefficients[i]*fringeDerivatives[i+1];
111 double bref =
Bz_m*exp(
k_m*R[1]);
115 for (
size_t n = 0; n < x_n.size(); ++n) {
116 B[0] += bref*f_n[n+1]*(n+1)/
k_m*x_n[n];
117 B[1] += bref*f_n[n]*x_n[n];
118 B[2] += bref*dz_f_n[n]/
k_m*x_n[n];
134 std::vector<double> coefficients(oldCoefficients.size()+2, 0);
136 for (
size_t j = 0; j < oldCoefficients.size(); ++j) {
137 coefficients[j] += -1./(n)/(n-1)*
k_m*
k_m*oldCoefficients[j];
138 coefficients[j+2] += -1./(n)/(n-1)*oldCoefficients[j];
virtual void visitVerticalFFAMagnet(const VerticalFFAMagnet &)=0
Apply the algorithm to a vertical FFA magnet.
Interface for a single beam element.
PartBunch_t * RefPartBunch_m
Bending magnet with an exponential dependence on field in the vertical plane.
void finalise()
Finalise the VerticalFFAMagnet - sets bunch to nullptr.
ElementBase * clone() const
Inheritable copy constructor.
void accept(BeamlineVisitor &visitor) const
Accept a beamline visitor.
void initialise()
Initialise the VerticalFFAMagnet.
void initialise(PartBunch_t *bunch, double &startField, double &endField)
Initialise the VerticalFFAMagnet.
std::unique_ptr< endfieldmodel::EndFieldModel > endField_m
void calculateDfCoefficients()
BGeometryBase & getGeometry()
Return the cell geometry.
void setMaxOrder(size_t maxOrder)
Set the maximum power of x used in the off-midplane expansion;.
std::vector< std::vector< double > > dfCoefficients_m
StraightGeometry straightGeometry_m
EMField & getField()
Return a dummy (0.) field value (what is this for?)
VerticalFFAMagnet(const std::string &name)
Construct a new VerticalFFAMagnet.
~VerticalFFAMagnet()
Destructor - deletes the field.
bool getFieldValue(const Vector_t< double, 3 > &R, Vector_t< double, 3 > &B) const
Calculate the field at some arbitrary position in cartesian coordinates.
void setEndField(endfieldmodel::EndFieldModel *endField)
Set the fringe field.
Abstract base class for accelerator geometry classes.
virtual void setElementLength(double length)
Set design length.
Abstract base class for electromagnetic fields.