18 :
Component(name), straightGeometry_m(1.) {}
22 straightGeometry_m(right.straightGeometry_m),
24 maxOrder_m(right.maxOrder_m),
27 zNegExtent_m(right.zNegExtent_m),
28 zPosExtent_m(right.zPosExtent_m),
29 halfWidth_m(right.halfWidth_m),
30 bbLength_m(right.bbLength_m),
31 endField_m(right.endField_m->clone()),
32 dfCoefficients_m(right.dfCoefficients_m) {
74 std::vector<double> fringeDerivatives(
maxOrder_m + 2, 0.);
76 for (
size_t i = 0; i < fringeDerivatives.size(); ++i) {
77 fringeDerivatives[i] =
endField_m->function(zRel, i);
82 for (
size_t i = 1; i < x_n.size(); ++i) {
83 x_n[i] = x_n[i - 1] * R[0];
89 std::vector<double> dz_f_n(
maxOrder_m + 1, 0.);
92 for (
size_t i = 0; i < coefficients.size(); ++i) {
93 f_n[n] += coefficients[i] * fringeDerivatives[i];
94 dz_f_n[n] += coefficients[i] * fringeDerivatives[i + 1];
97 double bref =
Bz_m * exp(
k_m * R[1]);
101 for (
size_t n = 0; n < x_n.size(); ++n) {
102 B[0] += bref * f_n[n + 1] * (n + 1) /
k_m * x_n[n];
103 B[1] += bref * f_n[n] * x_n[n];
104 B[2] += bref * dz_f_n[n] /
k_m * x_n[n];
120 std::vector<double> coefficients(oldCoefficients.size() + 2, 0);
122 for (
size_t j = 0; j < oldCoefficients.size(); ++j) {
123 coefficients[j] += -1. / (n) / (n - 1) *
k_m *
k_m * oldCoefficients[j];
124 coefficients[j + 2] += -1. / (n) / (n - 1) * oldCoefficients[j];
ippl::Vector< T, Dim > Vector_t
Abstract base class for accelerator geometry classes.
virtual void visitVerticalFFAMagnet(const VerticalFFAMagnet &)=0
Apply the algorithm to a vertical FFA magnet.
PartBunch_t * RefPartBunch_m
Abstract base class for electromagnetic fields.
virtual void setElementLength(double length)
Set design length.
ElementBase * clone() const
void accept(BeamlineVisitor &visitor) const
void initialise(PartBunch_t *bunch, double &startField, double &endField)
std::unique_ptr< endfieldmodel::EndFieldModel > endField_m
void calculateDfCoefficients()
BGeometryBase & getGeometry()
void setMaxOrder(size_t maxOrder)
std::vector< std::vector< double > > dfCoefficients_m
StraightGeometry straightGeometry_m
VerticalFFAMagnet(const std::string &name)
bool getFieldValue(const Vector_t< double, 3 > &R, Vector_t< double, 3 > &B) const
void setEndField(endfieldmodel::EndFieldModel *endField)