28#ifndef OPAL_ParallelCyclotronTracker_HH
29#define OPAL_ParallelCyclotronTracker_HH
45template <
class T,
unsigned Dim>
61 typedef std::pair<ElementType, element_pair>
type_pair;
72 bool revTrack,
int maxSTEPS,
77 const std::string& mbMode,
78 const std::string& mbBinning);
293 const short& bunchNr = 0);
311 void openFiles(
size_t numFiles, std::string fn);
325 bool RFkick(
RFCavity* rfcavity,
const double t,
const double dt,
const int Pindex);
351 double phi,
Vector_t const translationToGlobal = 0);
356 double phi,
Vector_t const translationToGlobal = 0);
370 double const phi,
double const psi,
375 double const phi,
double const psi,
380 double const phi,
double const psi,
385 double const phi,
double const psi,
477 void update_m(
double& t,
const double& dt,
const bool& finishedTurn);
491 void seoMode_m(
double& t,
const double dt,
bool& finishedTurn,
495 void singleMode_m(
double& t,
const double dt,
bool& finishedTurn,
double& oldReferenceTheta);
497 void bunchMode_m(
double& t,
const double dt,
bool& finishedTurn);
506 const double& oldReferenceTheta,
507 const double& temp_meanTheta);
512 const double& temp_meanTheta,
boost::numeric::ublas::matrix< double > matrix_t
PETE_TBTree< FnArcTan2, PETE_Scalar< Vektor< T1, Dim > >, typename T2::PETE_Expr_t > atan2(const Vektor< T1, Dim > &l, const PETE_Expr< T2 > &r)
constexpr double two_pi
The value of.
double function(PyOpalObjectNS::PyOpalObject< C > pyobject, double t)
void computePathLengthUpdate(std::vector< double > &dl, const double &dt)
void setLastDumpedStep(const int para)
set last dumped step
std::vector< PluginElement * > pluginElements_m
void dumpAzimuthAngles_m(const double &t, const Vector_t &R, const Vector_t &P, const double &oldReferenceTheta, const double &temp_meanTheta)
IpplTimings::TimerRef IntegrationTimer_m
IpplTimings::TimerRef PluginElemTimer_m
virtual void visitDegrader(const Degrader &)
Apply the algorithm to a degrader.
virtual void visitRBend(const RBend &)
Apply the algorithm to a rectangular bend.
static Vector_t const xaxis
The positive axes unit vectors.
Vector_t calcMeanP() const
virtual void visitProbe(const Probe &)
Apply the algorithm to a probe.
virtual void visitVacuum(const Vacuum &)
Apply the algorithm to a vacuum space.
void evaluateSpaceChargeField()
void setPr(double x)
Method for restart.
void operator=(const ParallelCyclotronTracker &)
std::function< bool(const double &, const size_t &, Vector_t &, Vector_t &)> function_t
bool computeExternalFields_m(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &Efield, Vector_t &Bfield)
Calculate the field map at an arbitrary point.
std::vector< double > azimuth_angle_m
the different azimuthal angles for the outfTheta_m output files
std::unique_ptr< MultiBunchHandler > mbHandler_m
void injectBunch(bool &flagTransition)
void closeFiles()
Close all files related to special output in the Cyclotron mode.
std::pair< double[8], Component * > element_pair
void rotateAroundZ(ParticleAttrib< Vector_t > &particleVectors, double const phi)
virtual void visitStripper(const Stripper &)
Apply the algorithm to a particle stripper.
void normalizeQuaternion(Quaternion_t &quaternion)
virtual void visitCCollimator(const CCollimator &)
Apply the algorithm to a collimator.
void singleMode_m(double &t, const double dt, bool &finishedTurn, double &oldReferenceTheta)
void update_m(double &t, const double &dt, const bool &finishedTurn)
Update time and path length, write to output files.
ParallelCyclotronTracker()
void initializeBoundaryGeometry()
virtual ~ParallelCyclotronTracker()
Destructor ParallelCyclotronTracker.
std::vector< std::unique_ptr< std::ofstream > > outfTheta_m
output coordinates at different azimuthal angles and one after every turn
void computeSpaceChargeFields_m()
bool hasMultiBunch() const
double getHarmonicNumber() const
void rotateAroundX(ParticleAttrib< Vector_t > &particleVectors, double const psi)
double calculateAngle(double x, double y)
bool isTurnDone()
Check if turn done.
virtual void visitBeamline(const Beamline &)
Apply the algorithm to a beam line.
bool checkGapCross(Vector_t Rold, Vector_t Rnew, RFCavity *rfcavity, double &DistOld)
virtual void visitOffset(const Offset &)
Apply the algorithm to a offset (placement).
IpplTimings::TimerRef DelParticleTimer_m
void normalizeVector(Vector_t &vector)
bool RFkick(RFCavity *rfcavity, const double t, const double dt, const int Pindex)
virtual void visitScalingFFAMagnet(const ScalingFFAMagnet &bend)
Apply the algorithm to a scaling FFA magnet.
double computeRadius(const Vector_t &meanR) const
void updatePathLength(const double &dt)
void updateTime(const double &dt)
void openFiles(size_t numFiles, std::string fn)
@ open / close output coordinate files
virtual void visitSBend3D(const SBend3D &)
Apply the algorithm to a sector bend with 3D field map.
void borisExternalFields(double h)
double bega
The reference variables.
void dumpAngle(const double &theta, double &prevAzimuth, double &azimuth, const short &bunchNr=0)
bool applyPluginElements(const double dt)
std::list< type_pair * > beamline_list
virtual void visitCorrector(const Corrector &)
Apply the algorithm to a closed orbit corrector.
static Vector_t const yaxis
std::tuple< double, double, double > initializeTracking_m()
std::pair< ElementType, element_pair > type_pair
virtual void visitRing(const Ring &ring)
Apply the algorithm to a ring.
IpplTimings::TimerRef BinRepartTimer_m
void globalToLocal(ParticleAttrib< Vector_t > &vectorArray, double phi, Vector_t const translationToGlobal=0)
static Vector_t const zaxis
void updateAzimuthAndRadius()
const size_t initialLocalNum_m
bool getFieldsAtPoint(const double &t, const size_t &Pindex, Vector_t &Efield, Vector_t &Bfield)
std::vector< CavityCrossData > cavCrossDatas_m
beamline_list FieldDimensions
virtual void visitDrift(const Drift &)
Apply the algorithm to a drift space.
std::unique_ptr< Stepper< function_t > > itsStepper_mp
struct ParallelCyclotronTracker::settings setup_m
std::ofstream outfTrackOrbit_m
output file for six dimensional phase space
void finalizeTracking_m(dvector_t &Ttime, dvector_t &Tdeltr, dvector_t &Tdeltz, ivector_t &TturnNumber)
virtual void visitVariableRFCavityFringeField(const VariableRFCavityFringeField &cav)
Apply the algorithm to a variable RF cavity with Fringe Field.
void gapCrossKick_m(size_t i, double t, double dt, const Vector_t &Rold, const Vector_t &Pold)
void getQuaternionTwoVectors(Vector_t u, Vector_t v, Quaternion_t &quaternion)
virtual void visitSBend(const SBend &)
Apply the algorithm to a sector bend.
virtual void visitMarker(const Marker &)
Apply the algorithm to a marker.
virtual void execute()
Apply the algorithm to the top-level beamline.
void dumpThetaEachTurn_m(const double &t, const Vector_t &R, const Vector_t &P, const double &temp_meanTheta, bool &finishedTurn)
void bunchMode_m(double &t, const double dt, bool &finishedTurn)
void initTrackOrbitFile()
std::list< Component * > myElements
std::unique_ptr< LossDataSink > lossDs_m
virtual void visitMultipoleT(const MultipoleT &)
Apply the algorithm to an arbitrary multipole.
virtual void visitVariableRFCavity(const VariableRFCavity &cav)
Apply the algorithm to a variabel RF cavity.
const size_t initialTotalNum_m
void bgf_main_collision_test()
double beamInitialRotation
void initPathLength()
multi-bunch mode: set the path length of each bunch in case of restart mode
void buildupFieldList(double BcParameter[], ElementType elementType, Component *elptr)
void rotateWithQuaternion(ParticleAttrib< Vector_t > &vectorArray, Quaternion_t const quaternion)
virtual void visitMultipole(const Multipole &)
Apply the algorithm to a multipole.
virtual void visitSolenoid(const Solenoid &)
Apply the algorithm to a solenoid.
Steppers::TimeIntegrator stepper_m
std::vector< double > dvector_t
void bunchDumpPhaseSpaceData()
void setPreviousH5Local(bool x)
IpplTimings::TimerRef TransformTimer_m
ParallelCyclotronTracker(const ParallelCyclotronTracker &)
Vector_t calcMeanR(short bunchNr=-1) const
double calculateAngle2(double x, double y)
virtual void visitCyclotron(const Cyclotron &cycl)
Apply the algorithm to a cyclotron.
bool deleteParticle(bool=false)
void localToGlobal(ParticleAttrib< Vector_t > &vectorArray, double phi, Vector_t const translationToGlobal=0)
virtual void visitRFCavity(const RFCavity &)
Apply the algorithm to a RF cavity.
bool getTunes(dvector_t &t, dvector_t &r, dvector_t &z, int lastTurn, double &nur, double &nuz)
virtual void visitFlexibleCollimator(const FlexibleCollimator &)
Apply the algorithm to a flexible collimator.
void checkNumPart(std::string s)
void singleParticleDump()
virtual void visitVerticalFFAMagnet(const VerticalFFAMagnet &bend)
Apply the algorithm to a vertical FFA magnet.
virtual void visitSeptum(const Septum &)
Apply the algorithm to a septum.
IpplTimings::TimerRef DumpTimer_m
bool isMultiBunch() const
void seoMode_m(double &t, const double dt, bool &finishedTurn, dvector_t &Ttime, dvector_t &Tdeltr, dvector_t &Tdeltz, ivector_t &TturnNumber)
int maxSteps_m
The maximal number of steps the system is integrated.
virtual void visitOutputPlane(const OutputPlane &)
Apply the algorithm to a outputplane.
void initDistInGlobalFrame()
virtual void visitMonitor(const Monitor &)
Apply the algorithm to a beam position monitor.
std::vector< int > ivector_t
Interface for a single beam element.
Interface for general corrector.
Interface for drift space.
Interface for general multipole.
Ring describes a ring type geometry for tracking.
Sector bending magnet from a 3D field map.
Sector bending magnet with an FFA-style field index and spiral end shape.
Generates a field like E = a(t) * sin{2*pi * integral(f(tau),0,t) + q(t)} B = 0 where E0,...
Generates a field like Ey = E0*a(t)*y^{2n+1} g_n(z) sin{f(t)*t-q(t)} Ez = E0*a(t)*y^{2n} f_n(z) sin{f...
Bending magnet with an exponential dependence on field in the vertical plane.
PartBunchBase< double, 3 > * itsBunch_m
The bunch of particles to be tracked.
An abstract sequence of beam line components.
Timing::TimerRef TimerRef
Vektor< double, 3 > Vector_t