28 #include "gsl/gsl_spline.h"
29 #include "gsl/gsl_interp.h"
31 #ifdef WITH_UNIT_TESTS
32 #include <gtest/gtest_prod.h>
71 virtual bool apply(
const size_t &i,
89 virtual void goOnline(
const double &kineticEnergy)
override;
92 virtual void getDimensions(
double &sBegin,
double &sEnd)
const override;
96 double &endField)
override;
103 void setK1(
double k1);
139 #ifdef WITH_UNIT_TESTS
140 FRIEND_TEST(Maxwell, Zeros);
148 const std::vector<double> &engeCoeff,
151 double &engeFuncDeriv,
152 double &engeFuncSecDerivNorm);
176 void print(
Inform &msg,
double bendAngleX,
double bendAngle);
308 "Quadrupole field temporarily not supported");
Tps< T > cos(const Tps< T > &x)
Cosine.
Tps< T > tan(const Tps< T > &x)
Tangent.
Tps< T > sin(const Tps< T > &x)
Sine.
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
void calculateRefTrajectory(double &angleX, double &angleY)
virtual void getDimensions(double &sBegin, double &sEnd) const override
virtual bool apply(const size_t &i, const double &t, Vector_t &E, Vector_t &B) override
Apply field to particles with coordinates in magnet frame.
Vector_t transformToExitRegion(const Vector_t &R) const
void readFieldMap(Inform &msg)
int polyOrderExit_m
function origin that Enge function ends.
Vector_t calcExitFringeField(const Vector_t &R, double deltaX)
virtual bool findChordLength(double &chordLength)=0
gsl_interp_accel * entryFieldAccel_m
bool inMagnetCentralRegion(const Vector_t &R) const
std::vector< double > engeCoeffsEntry_m
Enge coefficients for map entry and exit regions.
std::array< double, 2 > getEntranceFringeFieldLength() const
Get entrance fringe field length.
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField) override
double deltaEndEntry_m
function origin where Enge function starts.
double getEffectiveLength() const
virtual double getExitAngle() const override
void setExitAngle(double exitAngle)
bool inMagnetExitRegion(const Vector_t &R) const
CoordinateSystemTrafo beginToEnd_m
void setK1(double k1)
Set quadrupole field component.
CoordinateSystemTrafo getBeginToEnd_local() const
double deltaBeginExit_m
Enge function order for entry region.
void setCSTrafoToEntranceRegion(const CoordinateSystemTrafo &trafo)
Vector_t calcCentralField(const Vector_t &R, double deltaX)
void setEngeOriginDelta(double delta)
double entranceParameter3_m
bool calculateMapField(const Vector_t &R, Vector_t &B)
double getStartField() const
double widthEntranceFringe_m
End of magnet field map in s coordinates (m).
gsl_spline ** exitFieldValues_m
std::vector< double > engeCoeffsExit_m
double entranceParameter1_m
double designRadius_m
through the bend.
double getEffectiveCenter() const
double sinEntranceAngle_m
void setBendEffectiveLength(double startField, double endField)
void setNSlices(const std::size_t &nSlices)
Vector_t calcEntranceFringeField(const Vector_t &R, double deltaX)
bool setupBendGeometry(double &startField, double &endField)
bool findIdealBendParameters(double chordLength)
BoundingBox getBoundingBoxInLabCoords() const override
std::string messageHeader_m
double tanEntranceAngle_m
virtual void setEntranceAngle(double entranceAngle) override
double startField_m
Dipole field index.
virtual void goOnline(const double &kineticEnergy) override
double endField_m
Start of magnet field map in s coordinates (m).
CoordinateSystemTrafo toEntranceRegion_m
bool isPositionInExitField(const Vector_t &R) const
void setFieldBoundaries(double startField, double endField)
gsl_interp_accel * exitFieldAccel_m
double deltaEndExit_m
function origin that Enge function starts.
Vector_t transformToEntranceRegion(const Vector_t &R) const
bool inMagnetEntranceRegion(const Vector_t &R) const
void adjustFringeFields(double ratio)
double exitAngle_m
Bend design radius (m).
double fieldIndex_m
and the exit face of the magnet (radians).
MeshData getSurfaceMesh() const
void setMessageHeader(const std::string &header)
std::array< double, 2 > getExitFringeFieldLength() const
Get exit fringe field length.
CoordinateSystemTrafo beginToEnd_lcs_m
void operator=(const Bend2D &)
double entranceParameter2_m
virtual void finalise() override
virtual void accept(BeamlineVisitor &) const override=0
Apply visitor to Bend2D.
int polyOrderEntry_m
function origin that Enge function ends.
double estimateFieldAdjustmentStep(double actualBendAngle)
virtual bool isInside(const Vector_t &r) const override
virtual CoordinateSystemTrafo getEdgeToEnd() const override
bool setupDefaultFieldMap()
std::vector< Vector_t > getOutline() const
CoordinateSystemTrafo toExitRegion_m
gsl_spline ** entryFieldValues_m
bool initializeFieldMap()
CoordinateSystemTrafo computeAngleTrafo_m
void calcEngeFunction(double zNormalized, const std::vector< double > &engeCoeff, int polyOrder, double &engeFunc, double &engeFuncDeriv, double &engeFuncSecDerivNorm)
std::size_t getNSlices() const
double getBendRadius() const
virtual ElementBase::ElementType getType() const override=0
Get element type std::string.
void setupPusher(PartBunchBase< double, 3 > *bunch)
void print(Inform &msg, double bendAngleX, double bendAngle)
virtual bool applyToReferenceParticle(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B) override
void findBendEffectiveLength(double startField, double endField)
void setGapFromFieldMap()
bool isPositionInEntranceField(const Vector_t &R) const
void setCSTrafoToExitRegion(const CoordinateSystemTrafo &trafo)
double cosEntranceAngle_m
Enge function order for entry region.
double calculateBendAngle()
virtual void setEntranceAngle(double entranceAngle)
double angle_m
Bend angle.
Vector_t transformTo(const Vector_t &r) const