OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
ParallelSliceTracker.h
Go to the documentation of this file.
1 #ifndef OPAL_ParallelSliceTracker_HH
2 #define OPAL_ParallelSliceTracker_HH
3 
4 #include <list>
5 #include <memory>
6 
8 
9 #include "Algorithms/Vektor.h"
10 #include "Algorithms/Tracker.h"
11 #include "Structure/DataSink.h"
12 #include "Utilities/Options.h"
13 
14 #include "Physics/Physics.h"
15 
18 #include "AbsBeamline/BeamBeam.h"
21 #include "AbsBeamline/Corrector.h"
22 #include "AbsBeamline/Diagnostic.h"
23 #include "AbsBeamline/Drift.h"
25 #include "AbsBeamline/Lambertson.h"
26 #include "AbsBeamline/Marker.h"
27 #include "AbsBeamline/Monitor.h"
28 #include "AbsBeamline/Multipole.h"
29 #include "AbsBeamline/Probe.h"
30 #include "AbsBeamline/RBend.h"
31 #include "AbsBeamline/RFCavity.h"
34 #include "AbsBeamline/SBend.h"
35 #include "AbsBeamline/Separator.h"
36 #include "AbsBeamline/Septum.h"
37 #include "AbsBeamline/Solenoid.h"
40 
42 
43 #include "Beamlines/Beamline.h"
44 #include "Elements/OpalBeamline.h"
45 
47 
48 public:
49 
50  // The particle bunch tracked is initially empty.
51  // If [b]revBeam[/b] is true, the beam runs from s = C to s = 0.
52  // If [b]revTrack[/b] is true, we track against the beam.
53  explicit ParallelSliceTracker(const Beamline &bl, const PartData &data,
54  bool revBeam, bool revTrack);
55 
56  // If [b]revBeam[/b] is true, the beam runs from s = C to s = 0.
57  // If [b]revTrack[/b] is true, we track against the beam.
58  explicit ParallelSliceTracker(const Beamline &bl,
59  EnvelopeBunch &bunch,
60  DataSink &ds,
61  const PartData &data,
62  bool revBeam,
63  bool revTrack,
64  const std::vector<unsigned long long> &maxSTEPS,
65  double zstart,
66  const std::vector<double> &zstop,
67  const std::vector<double> &dt);
68 
69  virtual ~ParallelSliceTracker();
70 
71  virtual void visitAlignWrapper(const AlignWrapper &);
72  virtual void visitBeamBeam(const BeamBeam &);
73  virtual void visitCCollimator(const CCollimator &);
74  virtual void visitCorrector(const Corrector &);
75  virtual void visitDegrader(const Degrader &);
76  virtual void visitDiagnostic(const Diagnostic &);
77  virtual void visitDrift(const Drift &);
78  virtual void visitFlexibleCollimator(const FlexibleCollimator &);
79  virtual void visitLambertson(const Lambertson &);
80  virtual void visitMarker(const Marker &);
81  virtual void visitMonitor(const Monitor &);
82  virtual void visitMultipole(const Multipole &);
83  virtual void visitProbe(const Probe &);
84  virtual void visitRBend(const RBend &);
85  virtual void visitRFCavity(const RFCavity &);
86  virtual void visitTravelingWave(const TravelingWave &);
87  virtual void visitRFQuadrupole(const RFQuadrupole &);
88  virtual void visitSBend(const SBend &);
89  virtual void visitSeparator(const Separator &);
90  virtual void visitSeptum(const Septum &);
91  virtual void visitSolenoid(const Solenoid &);
92  virtual void visitSource(const Source &);
93  virtual void visitParallelPlate(const ParallelPlate &);
94  virtual void visitCyclotronValley(const CyclotronValley &);
95 
96  virtual void execute();
97 
99  // overwrite the execute-methode from DefaultVisitor
100  virtual void visitBeamline(const Beamline &);
101 
102 
103 private:
104 
107  void operator=(const ParallelSliceTracker &);
108 
109  void saveCavityPhases();
110  void restoreCavityPhases();
111  void updateRFElement(std::string elName, double maxPhi);
112  void printRFPhases();
113 
114  void findStartPosition(const BorisPusher &pusher);
115  void autophaseCavities(const BorisPusher &pusher);
116 
119 
121 
123 
125 
128 
129  double pathLength_m;
130 
132  double zstart_m;
133 
135  std::queue<double> zStop_m;
136 
138  std::queue<double> dtAllTracks_m;
139 
141  std::queue<unsigned long long> localTrackSteps_m;
142 
144 
145  // Fringe fields for entrance and exit of magnetic elements.
146  void applyEntranceFringe(double edge, double curve,
147  const BMultipoleField &field, double scale);
148  void applyExitFringe(double edge, double curve,
149  const BMultipoleField &field, double scale);
150 
151  void FieldsOutput(double z, double Ex, double Ey, double Ez,
152  double Bx, double By, double Bz);
153 
154  void kickParticles();
155 
156  void updateReferenceParticle(const BorisPusher &pusher);
157  // void updateReferenceParticle();
158  void updateSpaceOrientation(const bool &move = false);
159  void kickReferenceParticle(const Vector_t &externalE,
160  const Vector_t &externalB);
161  void writePhaseSpace(const long long step, const double &sposRef);
162  void writeLastStepPhaseSpace(const long long step, const double &sposRef);
163 
164  void prepareSections();
165  void handleAutoPhasing();
166  void timeIntegration();
168  void switchElements(double scaleMargin = 3.0);
170  void dumpStats(long long step);
171  bool hasEndOfLineReached();
172  void handleRestartRun();
173  void setTime();
174  void setLastStep();
175  unsigned long long getMaxSteps(std::queue<unsigned long long> numSteps);
176  void selectDT();
177  void changeDT();
183 };
184 
186  itsOpalBeamline_m.visit(wrap, *this, itsBunch_m);
187 }
188 
190  itsOpalBeamline_m.visit(bb, *this, itsBunch_m);
191 }
192 
194  // itsOpalBeamline_m.visit(coll, *this, itsBunch_m);
195 }
196 
198  // itsOpalBeamline_m.visit(coll, *this, itsBunch_m);
199 }
200 
202  itsOpalBeamline_m.visit(corr, *this, itsBunch_m);
203 }
204 
206  itsOpalBeamline_m.visit(deg, *this, itsBunch_m);
207 }
208 
210  itsOpalBeamline_m.visit(diag, *this, itsBunch_m);
211 }
212 
213 
214 inline void ParallelSliceTracker::visitDrift(const Drift &drift) {
215  itsOpalBeamline_m.visit(drift, *this, itsBunch_m);
216 }
217 
218 
220  itsOpalBeamline_m.visit(lamb, *this, itsBunch_m);
221 }
222 
223 
224 inline void ParallelSliceTracker::visitMarker(const Marker &marker) {
225  itsOpalBeamline_m.visit(marker, *this, itsBunch_m);
226 }
227 
228 
230  itsOpalBeamline_m.visit(mon, *this, itsBunch_m);
231 }
232 
233 
235  itsOpalBeamline_m.visit(mult, *this, itsBunch_m);
236 }
237 
238 
239 inline void ParallelSliceTracker::visitProbe(const Probe &prob) {
240  itsOpalBeamline_m.visit(prob, *this, itsBunch_m);
241 }
242 
243 
244 inline void ParallelSliceTracker::visitRBend(const RBend &bend) {
245  // itsOpalBeamline_m.visit(bend, *this, itsBunch_m);
246 }
247 
248 
250  itsOpalBeamline_m.visit(as, *this, itsBunch_m);
251 }
252 
254  itsOpalBeamline_m.visit(as, *this, itsBunch_m);
255 }
256 
257 
259  itsOpalBeamline_m.visit(rfq, *this, itsBunch_m);
260 }
261 
262 inline void ParallelSliceTracker::visitSBend(const SBend &bend) {
263  // itsOpalBeamline_m.visit(bend, *this, itsBunch_m);
264 }
265 
266 
268  itsOpalBeamline_m.visit(sep, *this, itsBunch_m);
269 }
270 
271 
272 inline void ParallelSliceTracker::visitSeptum(const Septum &sept) {
273  itsOpalBeamline_m.visit(sept, *this, itsBunch_m);
274 }
275 
276 
277 inline void ParallelSliceTracker::visitSolenoid(const Solenoid &solenoid) {
278  itsOpalBeamline_m.visit(solenoid, *this, itsBunch_m);
279 }
280 
281 inline void ParallelSliceTracker::visitSource(const Source &source) {
282  itsOpalBeamline_m.visit(source, *this, itsBunch_m);
283 }
284 
286  //do nothing.
287 }
288 
290  // Do nothing here.
291 }
292 
294 }
295 
296 inline void ParallelSliceTracker::updateSpaceOrientation(const bool &move) {
298 }
299 
300 inline void ParallelSliceTracker::kickReferenceParticle(const Vector_t &externalE, const Vector_t &externalB) {
301 }
302 
303 inline void ParallelSliceTracker::writePhaseSpace(const long long step, const double &sposRef) {
304  Inform msg("ParallelSliceTracker");
305  Vector_t externalE, externalB;
306  Vector_t FDext[6]; // = {BHead, EHead, BRef, ERef, BTail, ETail}.
307 
308  /*
309  * Sample fields at (xmin, ymin, zmin), (xmax, ymax, zmax) and the
310  * centroid location. We are sampling the electric and magnetic fields at
311  * the back, front and center of the beam.
312  */
313  Vector_t rmin, rmax;
314  itsBunch_m->get_bounds(rmin, rmax);
315 
316  Vector_t pos[3];
317  pos[0] = Vector_t(rmax(0), rmax(1), rmax(2));
318  pos[1] = Vector_t(0.0, 0.0, sposRef);
319  pos[2] = Vector_t(rmin(0), rmin(1), rmin(2));
320 
321  for(int k = 0; k < 3; ++k) {
322  externalB = Vector_t(0.0);
323  externalE = Vector_t(0.0);
324  double bunch_time = itsBunch_m->getT() - 0.5 * itsBunch_m->getdT();
326  bunch_time, externalE, externalB);
327 
328  FDext[2*k] = externalB;
329  FDext[2*k+1] = externalE * 1e-6;
330  }
331 
332  if(step % Options::psDumpFreq == 0) {
333  //itsDataSink->stashPhaseSpaceEnvelope(*itsBunch_m, FDext, rmax(2), sposRef, rmin(2));
334  itsDataSink_m->dumpH5(*itsBunch_m, FDext, rmax(2), sposRef, rmin(2));
335  msg << *itsBunch_m << endl;
336  }
337 
338  if(step % Options::statDumpFreq == 0) {
339  itsDataSink_m->dumpSDDS(*itsBunch_m, FDext, rmax(2), sposRef, rmin(2));
340  }
341 }
342 
343 inline void ParallelSliceTracker::writeLastStepPhaseSpace(const long long step, const double &sposRef) {
344  Inform msg("ParallelSliceTracker");
345  if(itsBunch_m->isValid_m) {
346  Vector_t externalE, externalB;
347  Vector_t FDext[6];
348  Vector_t rmin, rmax;
349  itsBunch_m->get_bounds(rmin, rmax);
350 
351  Vector_t pos[3];
352  pos[0] = Vector_t(rmax(0), rmax(1), rmax(2));
353  pos[1] = Vector_t(0.0, 0.0, sposRef);
354  pos[2] = Vector_t(rmin(0), rmin(1), rmin(2));
355 
356  for(int k = 0; k < 3; ++k) {
357  externalB = Vector_t(0.0);
358  externalE = Vector_t(0.0);
359  FDext[2*k] = externalB;
360  FDext[2*k+1] = externalE * 1e-6;
361  }
362 
363  itsDataSink_m->dumpSDDS(*itsBunch_m, FDext, rmax(2), sposRef, rmin(2));
364  } else
365  INFOMSG("* Invalid bunch! No statistics dumped." << endl);
366 }
367 
368 inline unsigned long long ParallelSliceTracker::getMaxSteps(std::queue<unsigned long long> numSteps) {
369  unsigned long long totalNumSteps = 0;
370 
371  while (numSteps.size() > 0) {
372  totalNumSteps += numSteps.front();
373  numSteps.pop();
374  }
375 
376  return totalNumSteps;
377 }
378 
379 
380 #endif
IpplTimings::TimerRef WakeFieldTimer_m
Definition: Source.h:12
virtual void visitCorrector(const Corrector &)
Apply the algorithm to a corrector.
void applyExitFringe(double edge, double curve, const BMultipoleField &field, double scale)
constexpr double e
The value of .
Definition: Physics.h:40
double getT()
returns the current time of the bunch
virtual void visitParallelPlate(const ParallelPlate &)
Apply the algorithm to a ParallelPlate.
virtual void visitBeamline(const Beamline &)
Apply the algorithm to a beam line.
Interface for septum magnet.
Definition: Septum.h:11
core of the envelope tracker based on Rene Bakkers BET implementation
Definition: EnvelopeBunch.h:60
void applyEntranceFringe(double edge, double curve, const BMultipoleField &field, double scale)
Interface for electrostatic separator.
Definition: Separator.h:33
virtual void visitSeptum(const Septum &)
Apply the algorithm to a septum.
void operator=(const ParallelSliceTracker &)
Interface for beam position monitors.
Definition: Monitor.h:41
Interface for RF Quadrupole.
Definition: RFQuadrupole.h:30
IpplTimings::TimerRef timeIntegrationTimer2_m
Define the position of a misaligned element.
Definition: AlignWrapper.h:39
Interface for RF cavity.
Definition: ParallelPlate.h:36
Particle reference data.
Definition: PartData.h:38
double getdT() const
Interface for general corrector.
Definition: Corrector.h:35
Abstract collimator.
Definition: RBend.h:73
void kickReferenceParticle(const Vector_t &externalE, const Vector_t &externalB)
Interface for beam diagnostics.
Definition: Diagnostic.h:32
CoordinateSystemTrafo referenceToLabCSTrafo_m
Interface for a marker.
Definition: Marker.h:32
virtual void visitMonitor(const Monitor &)
Apply the algorithm to a monitor.
virtual void visitRFQuadrupole(const RFQuadrupole &)
Apply the algorithm to a RF quadrupole.
void computeExternalFields(OrbitThreader &oth)
Interface for drift space.
Definition: Drift.h:33
void updateReferenceParticle(const BorisPusher &pusher)
unsigned long getFieldAt(const unsigned int &, const Vector_t &, const long &, const double &, Vector_t &, Vector_t &)
std::queue< double > zStop_m
where to stop
std::queue< double > dtAllTracks_m
Interface for general multipole.
Definition: Multipole.h:46
int statDumpFreq
The frequency to dump statistical values, e.e. dump data when stepstatDumpFreq==0.
Definition: Options.cpp:54
T deg(T x)
Convert radians to degrees.
Definition: matheval.hpp:82
virtual void visitProbe(const Probe &)
Apply the algorithm to a probe.
virtual void visitTravelingWave(const TravelingWave &)
Apply the algorithm to a RF cavity.
virtual void visitMultipole(const Multipole &)
Apply the algorithm to a multipole.
virtual void visitDrift(const Drift &)
Apply the algorithm to a drift.
Vector_t get_rmean() const
Interface for probe.
Definition: Probe.h:16
virtual void visitSeparator(const Separator &)
Apply the algorithm to a separator.
IpplTimings::TimerRef BinRepartTimer_m
virtual void visitDegrader(const Degrader &)
Apply the algorithm to a drift.
void FieldsOutput(double z, double Ex, double Ey, double Ez, double Bx, double By, double Bz)
virtual void visitAlignWrapper(const AlignWrapper &)
Apply the algorithm to an align wrapper.
virtual void visitCyclotronValley(const CyclotronValley &)
Apply the algorithm to a CyclotronValley.
unsigned long long getMaxSteps(std::queue< unsigned long long > numSteps)
virtual void visitCCollimator(const CCollimator &)
Apply the algorithm to a collimator.
void switchElements(double scaleMargin=3.0)
virtual void visitSolenoid(const Solenoid &)
Apply the algorithm to a solenoid.
Interface for cyclotron collimator.
Definition: CCollimator.h:13
void updateSpaceOrientation(const bool &move=false)
Abstract beam-beam interaction.
Definition: BeamBeam.h:37
void visit(const T &, BeamlineVisitor &, PartBunchBase< double, 3 > *)
Definition: OpalBeamline.h:98
Interface for RF cavity.
Definition: TravelingWave.h:37
#define INFOMSG(msg)
Definition: IpplInfo.h:397
Definition: SBend.h:68
Interface for cyclotron valley.
void dumpH5(PartBunchBase< double, 3 > *beam, Vector_t FDext[]) const
Definition: DataSink.cpp:69
virtual void visitDiagnostic(const Diagnostic &)
Apply the algorithm to a diagnostic.
virtual void execute()
Apply the algorithm to the top-level beamline.
Vektor< double, 3 > Vector_t
Definition: Vektor.h:6
void writeLastStepPhaseSpace(const long long step, const double &sposRef)
Interface for solenoids.
Definition: Solenoid.h:36
An abstract sequence of beam line components.
Definition: Beamline.h:37
void updateRFElement(std::string elName, double maxPhi)
std::queue< unsigned long long > localTrackSteps_m
The maximal number of steps the system is integrated per TRACK.
int psDumpFreq
The frequency to dump the phase space, i.e.dump data when steppsDumpFreq==0.
Definition: Options.cpp:48
IpplTimings::TimerRef timeIntegrationTimer1_m
The magnetic field of a multipole.
virtual void visitSBend(const SBend &)
Apply the algorithm to a sector bend.
virtual void visitLambertson(const Lambertson &)
Apply the algorithm to a Lambertson.
Interface for RF cavity.
Definition: RFCavity.h:37
virtual void visitRBend(const RBend &)
Apply the algorithm to a rectangular bend.
Abstract collimator.
Definition: Degrader.h:37
virtual void visitRFCavity(const RFCavity &)
Apply the algorithm to a RF cavity.
void findStartPosition(const BorisPusher &pusher)
void autophaseCavities(const BorisPusher &pusher)
virtual void visitBeamBeam(const BeamBeam &)
Apply the algorithm to a beam-beam.
void dumpSDDS(PartBunchBase< double, 3 > *beam, Vector_t FDext[], const double &azimuth=-1) const
Definition: DataSink.cpp:99
double zstart_m
where to start
void get_bounds(Vector_t &min, Vector_t &max)
returns bounds of envelope bunch
void dumpStats(long long step)
Timing::TimerRef TimerRef
Definition: IpplTimings.h:176
Definition: Inform.h:41
virtual void visitSource(const Source &)
Apply the algorithm to a source.
IpplTimings::TimerRef timeFieldEvaluation_m
void calcBeamParameters()
calculates envelope statistics
void writePhaseSpace(const long long step, const double &sposRef)
Inform & endl(Inform &inf)
Definition: Inform.cpp:42
virtual void visitFlexibleCollimator(const FlexibleCollimator &)
Apply the algorithm to a flexible collimator.
Interface for a Lambertson septum.
Definition: Lambertson.h:33
virtual void visitMarker(const Marker &)
Apply the algorithm to a marker.
Track particles or bunches.
Definition: Tracker.h:84