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