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");
379 #endif // CLASSIC_BEND_H
bool findIdealBendParameters(double chordLength)
double entranceParameter3_m
double tanEntranceAngle_m
std::size_t getNSlices() const
void setFieldBoundaries(double startField, double endField)
bool isPositionInExitField(const Vector_t &R) const
std::vector< Vector_t > getOutline() const
double designRadius_m
through the bend.
int polyOrderEntry_m
function origin that Enge function ends.
bool setupBendGeometry(double &startField, double &endField)
double startField_m
Dipole field index.
item[EANGLE] Entrance edge angle(radians).\item[ROTATION] Rotation of the magnet about its central axis(radians
Tps< T > tan(const Tps< T > &x)
Tangent.
std::array< double, 2 > getEntranceFringeFieldLength() const
Get entrance fringe field length.
double deltaEndEntry_m
function origin where Enge function starts.
double getStartField() const
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
double endField_m
Start of magnet field map in s coordinates (m).
Vector_t transformToEntranceRegion(const Vector_t &R) const
virtual bool isInside(const Vector_t &r) const override
void setMessageHeader(const std::string &header)
gsl_interp_accel * entryFieldAccel_m
CoordinateSystemTrafo toEntranceRegion_m
gsl_spline ** exitFieldValues_m
Vector_t calcCentralField(const Vector_t &R, double deltaX)
double entranceParameter2_m
std::array< double, 2 > getExitFringeFieldLength() const
Get exit fringe field length.
virtual ElementType getType() const override=0
Get element type std::string.
Vector_t calcEntranceFringeField(const Vector_t &R, double deltaX)
double widthEntranceFringe_m
End of magnet field map in s coordinates (m).
bool setupDefaultFieldMap()
bool calculateMapField(const Vector_t &R, Vector_t &B)
void findBendEffectiveLength(double startField, double endField)
void setCSTrafoToExitRegion(const CoordinateSystemTrafo &trafo)
bool inMagnetEntranceRegion(const Vector_t &R) const
virtual bool findChordLength(double &chordLength)=0
double calculateBendAngle()
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.
bool initializeFieldMap()
double fieldIndex_m
and the exit face of the magnet (radians).
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField) override
virtual bool applyToReferenceParticle(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B) override
bool isPositionInEntranceField(const Vector_t &R) const
CoordinateSystemTrafo getBeginToEnd_local() const
double exitAngle_m
Bend design radius (m).
bool inMagnetCentralRegion(const Vector_t &R) const
double getEffectiveCenter() const
std::string messageHeader_m
void operator=(const Bend2D &)
double deltaBeginExit_m
Enge function order for entry region.
double sinEntranceAngle_m
double angle_m
Bend angle.
bool inMagnetExitRegion(const Vector_t &R) const
void adjustFringeFields(double ratio)
CoordinateSystemTrafo beginToEnd_lcs_m
MeshData getSurfaceMesh() const
gsl_spline ** entryFieldValues_m
Vector_t calcExitFringeField(const Vector_t &R, double deltaX)
void calcEngeFunction(double zNormalized, const std::vector< double > &engeCoeff, int polyOrder, double &engeFunc, double &engeFuncDeriv, double &engeFuncSecDerivNorm)
void setGapFromFieldMap()
void setEngeOriginDelta(double delta)
Vector_t transformTo(const Vector_t &r) const
std::vector< double > engeCoeffsEntry_m
Enge coefficients for map entry and exit regions.
void setK1(double k1)
Set quadrupole field component.
virtual void setEntranceAngle(double entranceAngle)
void setExitAngle(double exitAngle)
Tps< T > cos(const Tps< T > &x)
Cosine.
double cosEntranceAngle_m
Enge function order for entry region.
virtual void accept(BeamlineVisitor &) const override=0
Apply visitor to Bend2D.
void setupPusher(PartBunchBase< double, 3 > *bunch)
virtual CoordinateSystemTrafo getEdgeToEnd() const override
void setCSTrafoToEntranceRegion(const CoordinateSystemTrafo &trafo)
void calculateRefTrajectory(double &angleX, double &angleY)
gsl_interp_accel * exitFieldAccel_m
virtual double getExitAngle() const override
CoordinateSystemTrafo computeAngleTrafo_m
virtual void goOnline(const double &kineticEnergy) override
double getBendRadius() const
void print(Inform &msg, double bendAngleX, double bendAngle)
virtual void getDimensions(double &sBegin, double &sEnd) const override
CoordinateSystemTrafo toExitRegion_m
virtual void finalise() override
void setBendEffectiveLength(double startField, double endField)
virtual void setEntranceAngle(double entranceAngle) override
Tps< T > sin(const Tps< T > &x)
Sine.
BoundingBox getBoundingBoxInLabCoords() const override
int polyOrderExit_m
function origin that Enge function ends.
CoordinateSystemTrafo beginToEnd_m
double estimateFieldAdjustmentStep(double actualBendAngle)
double deltaEndExit_m
function origin that Enge function starts.
void readFieldMap(Inform &msg)
std::vector< double > engeCoeffsExit_m
void setNSlices(const std::size_t &nSlices)
double entranceParameter1_m
double getEffectiveLength() const
Vector_t transformToExitRegion(const Vector_t &R) const