27 :
Component(name), straightGeometry_m(1.) {
32 straightGeometry_m(right.straightGeometry_m),
34 maxOrder_m(right.maxOrder_m),
37 zNegExtent_m(right.zNegExtent_m),
38 zPosExtent_m(right.zPosExtent_m),
39 halfWidth_m(right.halfWidth_m),
40 bbLength_m(right.bbLength_m),
41 endField_m(right.endField_m->clone()),
42 dfCoefficients_m(right.dfCoefficients_m)
98 std::vector<double> fringeDerivatives(
maxOrder_m+2, 0.);
100 for (
size_t i = 0; i < fringeDerivatives.size(); ++i) {
101 fringeDerivatives[i] =
endField_m->function(zRel, i);
106 for (
size_t i = 1; i < x_n.size(); ++i) {
107 x_n[i] = x_n[i-1] * R[0];
113 std::vector<double> dz_f_n(
maxOrder_m + 1, 0.);
116 for (
size_t i = 0; i < coefficients.size(); ++i) {
117 f_n[
n] += coefficients[i] * fringeDerivatives[i];
118 dz_f_n[
n] += coefficients[i] * fringeDerivatives[i+1];
125 for (
size_t n = 0;
n < x_n.size(); ++
n) {
126 B[0] += bref * f_n[
n+1] * (
n+1) /
k_m * x_n[
n];
127 B[1] += bref * f_n[
n] * x_n[
n];
128 B[2] += bref * dz_f_n[
n] /
k_m * x_n[
n];
137 dfCoefficients_m[1] = std::vector<double>();
142 for (
size_t n = 2;
n < dfCoefficients_m.size();
n+=2) {
143 const std::vector<double>& oldCoefficients = dfCoefficients_m[
n-2];
144 std::vector<double> coefficients(oldCoefficients.size() + 2, 0);
146 for (
size_t j = 0; j < oldCoefficients.size(); ++j) {
147 coefficients[j] += -1./(
n)/(
n-1) *
k_m *
k_m * oldCoefficients[j];
148 coefficients[j+2] += -1./(
n)/(
n-1) * oldCoefficients[j];
150 dfCoefficients_m[
n] = coefficients;
ElementBase * clone() const
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
Abstract base class for electromagnetic fields.
void setEndField(endfieldmodel::EndFieldModel *endField)
void accept(BeamlineVisitor &visitor) const
VerticalFFAMagnet(const std::string &name)
StraightGeometry straightGeometry_m
Abstract base class for accelerator geometry classes.
PartBunchBase< double, 3 > * RefPartBunch_m
virtual void visitVerticalFFAMagnet(const VerticalFFAMagnet &)=0
Apply the algorithm to a vertical FFA magnet.
Tps< T > exp(const Tps< T > &x)
Exponential.
void calculateDfCoefficients()
void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField)
std::vector< std::vector< double > > dfCoefficients_m
BGeometryBase & getGeometry()
std::unique_ptr< endfieldmodel::EndFieldModel > endField_m
Interface for a single beam element.
void setMaxOrder(size_t maxOrder)
bool getFieldValue(const Vector_t &R, Vector_t &B) const
virtual void setElementLength(double length)
Set design length.
item[EANGLE] Entrance edge counterclockwise This enables to obtain skew at each point along the magnet