16 :
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) {
87 std::vector<double> fringeDerivatives(
maxOrder_m+2, 0.);
89 for (
size_t i = 0; i < fringeDerivatives.size(); ++i) {
90 fringeDerivatives[i] =
endField_m->function(zRel, i);
95 for (
size_t i = 1; i < x_n.size(); ++i) {
96 x_n[i] = x_n[i-1]*R[0];
105 for (
size_t i = 0; i < coefficients.size(); ++i) {
106 f_n[
n] += coefficients[i]*fringeDerivatives[i];
107 dz_f_n[
n] += coefficients[i]*fringeDerivatives[i+1];
114 for (
size_t n = 0;
n < x_n.size(); ++
n) {
115 B[0] += bref*f_n[
n+1]*(
n+1)/
k_m*x_n[
n];
116 B[1] += bref*f_n[
n]*x_n[
n];
117 B[2] += bref*dz_f_n[
n]/
k_m*x_n[
n];
126 dfCoefficients_m[1] = std::vector<double>();
131 for (
size_t n = 2;
n < dfCoefficients_m.size();
n+=2) {
132 const std::vector<double>& oldCoefficients = dfCoefficients_m[
n-2];
133 std::vector<double> coefficients(oldCoefficients.size()+2, 0);
135 for (
size_t j = 0; j < oldCoefficients.size(); ++j) {
136 coefficients[j] += -1./(
n)/(
n-1)*
k_m*
k_m*oldCoefficients[j];
137 coefficients[j+2] += -1./(
n)/(
n-1)*oldCoefficients[j];
139 dfCoefficients_m[
n] = coefficients;
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
Interface for basic beam line object.
BGeometryBase & getGeometry()
void setEndField(endfieldmodel::EndFieldModel *endField)
Tps< T > exp(const Tps< T > &x)
Exponential.
void calculateDfCoefficients()
Abstract base class for accelerator geometry classes.
void setElType(ElemType elt)
set the element type as enumeration needed in the envelope tracker
virtual void setElementLength(double length)
Set design length.
VerticalFFAMagnet(const std::string &name)
PartBunchBase< double, 3 > * RefPartBunch_m
Abstract base class for electromagnetic fields.
StraightGeometry straightGeometry_m
bool getFieldValue(const Vector_t &R, Vector_t &B) const
void accept(BeamlineVisitor &visitor) const
std::vector< std::vector< double > > dfCoefficients_m
ElementBase * clone() const
virtual void visitVerticalFFAMagnet(const VerticalFFAMagnet &)=0
Apply the algorithm to a vertical FFA magnet.
Interface for a single beam element.
void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField)
std::unique_ptr< endfieldmodel::EndFieldModel > endField_m