41 myFieldmap_m(right.myFieldmap_m),
42 fieldAmplitudeError_m(right.fieldAmplitudeError_m),
43 startField_m(right.startField_m),
44 lengthField_m(right.lengthField_m),
46 geometry_m(right.geometry_m),
55 fieldAmplitudeError_m(0.0),
98 Vector_t tmpE(0.0, 0.0, 0.0), tmpB(0.0, 0.0, 0.0);
118 Inform msg(
"RBend3D ", *gmsg);
128 double zBegin = 0.0, zEnd = 0.0, rBegin = 0.0, rEnd = 0.0;
133 double fieldLength = zEnd - zBegin;
134 double z = 0.0, dz = fieldLength / 1000;
136 while (z < fieldLength && B(1) < 0.5) {
140 double zEntryEdge = z;
143 while (z > 0.0 && B(1) < 0.5) {
158 double refCharge = bunch->
getQ();
160 if (refCharge < 0.0) {
177 const double refBetaGamma =
sqrt(
pow(refGamma, 2.0) - 1.0);
180 double z = 0.0, dz = lengthField_m / 999;
181 double integratedBy = 0.0;
184 integratedBy += 0.5 * B(1);
186 while (z < lengthField_m) {
189 integratedBy += B(1);
192 integratedBy -= 0.5 * B(1);
193 integratedBy *= lengthField_m / 1000;
201 for (
unsigned int i = 0; i < 10; ++ i) {
213 endField = startField;
304 const double refBetaGamma =
sqrt(
pow(refGamma, 2.0) - 1.0);
305 const double stepSize = refBetaGamma / refGamma *
Physics::c * dt;
309 std::ofstream trajectoryOutput;
312 trajectoryOutput.precision(12);
313 trajectoryOutput <<
"# " << std::setw(18) <<
"s"
314 << std::setw(20) <<
"x"
315 << std::setw(20) <<
"z"
316 << std::setw(20) <<
"By"
333 pusher.push(
X, P, dt);
338 trajectoryOutput << std::setw(20) << deltaS + 0.5 * stepSize
339 << std::setw(20) <<
X(0)
340 << std::setw(20) <<
X(2)
341 << std::setw(20) << B(1)
345 pusher.kick(
X, P, E, B, dt);
348 pusher.push(
X, P, dt);
ParticleAttrib< Vector_t > P
virtual void getInfo(Inform *msg)=0
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
Interface for basic beam line object.
Tps< T > sin(const Tps< T > &x)
Sine.
PETE_TBTree< FnCopysign, PETE_Scalar< Vektor< T1, Dim > >, typename T2::PETE_Expr_t > copysign(const Vektor< T1, Dim > &l, const PETE_Expr< T2 > &r)
virtual bool isInside(const Vector_t &r) const
virtual void getFieldDimensions(double &zBegin, double &zEnd, double &rBegin, double &rEnd) const =0
const PartData * getReference() const
virtual const std::string & getName() const
Get element name.
Tps< T > tan(const Tps< T > &x)
Tangent.
virtual ElementBase::ElementType getType() const override
Get element type std::string.
static Fieldmap * getFieldmap(std::string Filename, bool fast=false)
StraightGeometry geometry_m
virtual bool isInside(const Vector_t &r) const override
BMultipoleField dummyField_m
MeshData getSurfaceMesh() const
Inform & level2(Inform &inf)
static OpalData * getInstance()
virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const =0
double fieldAmplitudeError_m
Abstract base class for accelerator geometry classes.
constexpr double pi
The value of .
void setElType(ElemType elt)
set the element type as enumeration needed in the envelope tracker
constexpr double c
The velocity of light in m/s.
std::vector< Vector_t > vertices_m
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField) override
virtual void addKT(int i, double t, Vector_t &K) override
PartBunchBase< double, 3 > * RefPartBunch_m
PETE_TBTree< FnArcTan2, PETE_Scalar< Vektor< T1, Dim > >, typename T2::PETE_Expr_t > atan2(const Vektor< T1, Dim > &l, const PETE_Expr< T2 > &r)
ElementBase * clone() const override
Tps< T > pow(const Tps< T > &x, int y)
Integer power.
Vektor< double, 3 > Vector_t
virtual void addKR(int i, double t, Vector_t &K) override
Abstract base class for electromagnetic fields.
BGeometryBase & getGeometry() override
EMField & getField() override
Tps< T > sqrt(const Tps< T > &x)
Square root.
std::vector< Vektor< unsigned int, 3 > > triangles_m
virtual void goOnline(const double &kineticEnergy) override
virtual bool applyToReferenceParticle(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B) override
Tps< T > cos(const Tps< T > &x)
Cosine.
virtual void getDimensions(double &zBegin, double &zEnd) const override
double getQ() const
Access to reference data.
virtual void accept(BeamlineVisitor &) const override
Apply visitor to RBend3D.
void setFieldMapFN(std::string fn)
virtual void finalise() override
virtual bool bends() const override
Indicates that element bends the beam.
virtual void goOffline() override
virtual bool apply(const size_t &i, const double &t, Vector_t &E, Vector_t &B) override
double trackRefParticleThrough(double dt, bool print=false)
virtual void visitRBend3D(const RBend3D &)
Apply the algorithm to a rectangular bend.
Inform & endl(Inform &inf)
bool writeBendTrajectories