OPAL (Object Oriented Parallel Accelerator Library)  2024.1
OPAL
Ring.h
Go to the documentation of this file.
1 //
2 // Class Ring
3 // Defines the abstract interface for a ring type geometry.
4 //
5 // Copyright (c) 2012 - 2023, Chris Rogers, STFC Rutherford Appleton Laboratory, Didcot, UK
6 // All rights reserved
7 //
8 // This file is part of OPAL.
9 //
10 // OPAL is free software: you can redistribute it and/or modify
11 // it under the terms of the GNU General Public License as published by
12 // the Free Software Foundation, either version 3 of the License, or
13 // (at your option) any later version.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with OPAL. If not, see <https://www.gnu.org/licenses/>.
17 //
18 #ifndef RING_H
19 #define RING_H
20 
21 #include "AbsBeamline/Component.h"
24 #include "Utilities/RingSection.h"
25 
26 #include <cmath>
27 #include <string>
28 
29 class LossDataSink;
30 template <class T, unsigned Dim>
31 class PartBunchBase;
32 class FieldMap;
33 
53 class Ring: public Component {
54 
55 public:
60  Ring(const std::string& ring);
61 
66  Ring(const Ring& ring);
67 
69  virtual ~Ring();
70 
84  virtual bool apply(const size_t& id, const double& t, Vector_t& E,
85  Vector_t& B) override;
86 
103  virtual bool apply(const Vector_t& R, const Vector_t& P,
104  const double& t, Vector_t& E, Vector_t& B) override;
105 
114  virtual void initialise(PartBunchBase<double, 3>* bunch, double& startField,
115  double& endField) override;
116 
122  virtual void initialise(PartBunchBase<double, 3>* bunch);
123 
128  virtual void finalise() override;
129 
131  virtual bool bends() const override {return true;}
132 
139  virtual void accept(BeamlineVisitor& visitor) const override;
140 
142  virtual void getDimensions(double& zBegin, double& zEnd) const override;
143 
145  virtual ElementBase* clone() const override {return new Ring(*this);}
146 
166  void appendElement(const Component& element);
167 
169  virtual EMField& getField() override {throw GeneralClassicException("Ring::getField", "Not implemented");}
170 
172  virtual const EMField& getField() const override {throw GeneralClassicException("Ring::getField", "Not implemented");}
173 
175  virtual PlanarArcGeometry& getGeometry() override {return planarArcGeometry_m;}
176 
178  virtual const PlanarArcGeometry& getGeometry() const override {return planarArcGeometry_m;}
179 
185  void setLossDataSink(LossDataSink* sink);
186 
192 
201 
207 
209  void setHarmonicNumber(double cyclHarm) {cyclHarm_m = cyclHarm;}
210 
212  double getHarmonicNumber() {return cyclHarm_m;}
213  // note this is not a const method to follow parent
214 
216  void setRFFreq(double rfFreq) {rfFreq_m = rfFreq;}
217 
219  double getRFFreq() const {return rfFreq_m;}
220 
222  void setBeamRInit(double rInit) {beamRInit_m = rInit;}
223 
225  double getBeamRInit() const {return beamRInit_m;}
226 
228  void setBeamPhiInit(double phiInit) {beamPhiInit_m = phiInit;}
229 
231  double getBeamPhiInit() const {return beamPhiInit_m;}
232 
234  void setBeamThetaInit(double thetaInit) {beamThetaInit_m = thetaInit;}
235 
237  double getBeamThetaInit() const {return beamThetaInit_m;}
238 
240  void setBeamPRInit(double pRInit) {beamPRInit_m = pRInit;}
241 
243  double getBeamPRInit() const {return beamPRInit_m;}
244 
246  void setLatticeRInit(double rInit) {latticeRInit_m = rInit;}
247 
249  double getLatticeRInit() const {return latticeRInit_m;}
250 
252  void setLatticePhiInit(double phiInit) {latticePhiInit_m = phiInit;}
253 
255  double getLatticePhiInit() const {return latticePhiInit_m;}
256 
258  Vector_t getNextPosition() const;
259 
261  Vector_t getNextNormal() const;
262 
267  void setLatticeThetaInit(double thetaInit) {latticeThetaInit_m = thetaInit;}
268 
273  double getLatticeThetaInit() const {return latticeThetaInit_m;}
274 
276  void setSymmetry(double symmetry) {symmetry_m = symmetry;}
277 
279  void setScale(double scale) {scale_m = scale;}
280 
282  double getSymmetry() const {return symmetry_m;}
283 
285  void setIsClosed(bool isClosed) {isClosed_m = isClosed;}
286 
288  double getIsClosed() const {return isClosed_m;}
289 
294  void setRingAperture(double minR, double maxR);
295 
297  double getRingMinR() const {return std::sqrt(minR2_m);}
298 
300  double getRingMaxR() const {return std::sqrt(maxR2_m);}
301 
311  void lockRing();
312 
314  RingSection* getSection(int i) const;
315 
318 
320  size_t getNumberOfRingSections() const;
321 
323  std::vector<RingSection*> getSectionsAt(const Vector_t& pos);
324 
326  static inline Vector_t convert(const Vector3D& vec);
327 
329  static inline Vector3D convert(const Vector_t& vec);
330 
331 private:
332  // Force end to have azimuthal angle > start unless crossing phi = pi/-pi
333  void resetAzimuths();
334 
335  // check for closure; throw an exception is ring is not closed within
336  // tolerance; enforce closure to floating point precision
337  void checkAndClose();
338 
339  // build a map that maps section to sections that overlap it
340  void buildRingSections();
341 
342  void rotateToCyclCoordinates(Euclid3D& euclid3d) const;
343 
344  // get the initial position
345  Vector_t getStartPosition() const;
346 
347  // get the initial normal
348  Vector_t getStartNormal() const;
349 
350  // predicate for sorting
351  static bool sectionCompare(RingSection const* const sec1,
352  RingSection const* const sec2);
353 
355  Ring();
356 
358  Ring& operator=(const Ring& ring);
359 
360  void checkMidplane(Euclid3D delta) const;
362 
364 
365  // points to same location as RefPartBunch_m on the child bunch, but we
366  // rename to keep in line with style guide
367  //
368  // Ring borrows this memory
370 
371  // store for particles out of the aperture
372  //
373  // Ring owns this memory
375 
376  // initial position of the beam
377  double beamRInit_m;
378  double beamPRInit_m;
381 
382  // position, orientation of the first lattice element
386 
387  // aperture cut on the ring (before any field maps tracking)
388  // note we store r^2
389  bool willDoAperture_m = false;
390  double minR2_m;
391  double maxR2_m;
392 
393  // Ring is locked - new elements cannot be added
395 
396  // Set to false to enable a non-circular ring (e.g. some weird spiral
397  // geometry)
399 
400  // number of cells/rotational symmetry of the ring
402 
403  double scale_m = 1.;
404 
405  // rf harmonic number
406  double cyclHarm_m;
407 
408  // nominal rf frequency
409  double rfFreq_m;
410 
411  // vector of RingSection sorted by phi (Component placement)
412  double phiStep_m;
413  std::vector<RingSectionList> ringSections_m;
415 
416  // tolerance on checking for geometry consistency
417  static const double lengthTolerance_m;
418  static const double angleTolerance_m;
419 };
420 
422  return Vector_t(vec_3d(0), vec_3d(1), vec_3d(2));
423 }
424 
426  return Vector3D(vec_t[0], vec_t[1], vec_t[2]);
427 }
428 
429 #endif //#ifndef RING_H
static Vector_t convert(const Vector3D &vec)
Definition: Ring.h:421
bool isClosed_m
Definition: Ring.h:398
Tps< T > sqrt(const Tps< T > &x)
Square root.
Definition: TpsMath.h:91
bool willDoAperture_m
Definition: Ring.h:389
double beamPhiInit_m
Definition: Ring.h:379
Rotation in 3-dimensional space.
Definition: Rotation3D.h:46
double getHarmonicNumber()
Definition: Ring.h:212
PartBunchBase< double, 3 > * getRefPartBunch() const
void setRFFreq(double rfFreq)
Definition: Ring.h:216
Vector_t getStartNormal() const
Definition: Ring.cpp:228
void setLatticeRInit(double rInit)
Definition: Ring.h:246
LossDataSink * lossDS_m
Definition: Ring.h:374
double minR2_m
Definition: Ring.h:390
static const double lengthTolerance_m
Definition: Ring.h:417
RingSection * getLastSectionPlaced() const
Definition: Ring.cpp:364
double getSymmetry() const
Definition: Ring.h:282
void setSymmetry(double symmetry)
Definition: Ring.h:276
virtual const EMField & getField() const override
Definition: Ring.h:172
double getLatticePhiInit() const
Definition: Ring.h:255
Abstract base class for electromagnetic fields.
Definition: EMField.h:188
void buildRingSections()
Definition: Ring.cpp:351
double phiStep_m
Definition: Ring.h:412
void rotateToCyclCoordinates(Euclid3D &euclid3d) const
Definition: Ring.cpp:197
Vektor< double, 3 > Vector_t
Definition: Vektor.h:6
double getBeamPRInit() const
Definition: Ring.h:243
int symmetry_m
Definition: Ring.h:401
virtual void getDimensions(double &zBegin, double &zEnd) const override
Definition: Ring.cpp:145
std::vector< RingSectionList > ringSections_m
Definition: Ring.h:413
void setScale(double scale)
Definition: Ring.h:279
A simple arc in the XZ plane.
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField) override
Definition: Ring.cpp:156
PlanarArcGeometry planarArcGeometry_m
Definition: Ring.h:363
void setIsClosed(bool isClosed)
Definition: Ring.h:285
void checkMidplane(Euclid3D delta) const
Definition: Ring.cpp:187
void checkAndClose()
Definition: Ring.cpp:336
virtual PlanarArcGeometry & getGeometry() override
Definition: Ring.h:175
virtual EMField & getField() override
Definition: Ring.h:169
double cyclHarm_m
Definition: Ring.h:406
double getLatticeRInit() const
Definition: Ring.h:249
virtual void finalise() override
Definition: Ring.cpp:161
void appendElement(const Component &element)
Definition: Ring.cpp:234
void resetAzimuths()
Definition: Ring.cpp:321
double getBeamRInit() const
Definition: Ring.h:225
virtual const PlanarArcGeometry & getGeometry() const override
Definition: Ring.h:178
double getBeamPhiInit() const
Definition: Ring.h:231
RingSectionList section_list_m
Definition: Ring.h:414
size_t getNumberOfRingSections() const
Definition: Ring.cpp:402
std::vector< RingSection * > getSectionsAt(const Vector_t &pos)
Definition: Ring.cpp:172
double beamRInit_m
Definition: Ring.h:377
void setBeamRInit(double rInit)
Definition: Ring.h:222
RingSection * getSection(int i) const
Definition: Ring.cpp:387
virtual void accept(BeamlineVisitor &visitor) const override
Definition: Ring.cpp:55
std::vector< RingSection * > RingSectionList
Definition: RingSection.h:205
double getRingMaxR() const
Definition: Ring.h:300
Component placement handler in ring geometry.
Definition: RingSection.h:58
void setRefPartBunch(PartBunchBase< double, 3 > *bunch)
Definition: Ring.cpp:167
Vector_t getStartPosition() const
Definition: Ring.cpp:214
Definition: Vec.h:21
bool isLocked_m
Definition: Ring.h:394
virtual bool apply(const size_t &id, const double &t, Vector_t &E, Vector_t &B) override
Definition: Ring.cpp:95
double scale_m
Definition: Ring.h:403
void setBeamPhiInit(double phiInit)
Definition: Ring.h:228
void setRingAperture(double minR, double maxR)
Definition: Ring.cpp:376
void setLossDataSink(LossDataSink *sink)
Definition: Ring.cpp:140
PartBunchBase< double, 3 > * getLossDataSink() const
double beamThetaInit_m
Definition: Ring.h:380
double latticePhiInit_m
Definition: Ring.h:384
double latticeThetaInit_m
Definition: Ring.h:385
double beamPRInit_m
Definition: Ring.h:378
static const double angleTolerance_m
Definition: Ring.h:418
void setHarmonicNumber(double cyclHarm)
Definition: Ring.h:209
Vector_t getNextPosition() const
Definition: Ring.cpp:206
virtual bool bends() const override
Definition: Ring.h:131
void setBeamPRInit(double pRInit)
Definition: Ring.h:240
Vector_t getNextNormal() const
Definition: Ring.cpp:220
void lockRing()
Definition: Ring.cpp:291
double getIsClosed() const
Definition: Ring.h:288
void setLatticeThetaInit(double thetaInit)
Definition: Ring.h:267
Ring & operator=(const Ring &ring)
Displacement and rotation in space.
Definition: Euclid3D.h:68
PartBunchBase< double, 3 > * refPartBunch_m
Definition: Ring.h:369
void setBeamThetaInit(double thetaInit)
Definition: Ring.h:234
Rotation3D getRotationStartToEnd(Euclid3D delta) const
Definition: Ring.cpp:176
Ring describes a ring type geometry for tracking.
Definition: Ring.h:53
double rfFreq_m
Definition: Ring.h:409
static bool sectionCompare(RingSection const *const sec1, RingSection const *const sec2)
Definition: Ring.cpp:371
Interface for a single beam element.
Definition: Component.h:50
double getBeamThetaInit() const
Definition: Ring.h:237
double getRingMinR() const
Definition: Ring.h:297
double latticeRInit_m
Definition: Ring.h:383
double maxR2_m
Definition: Ring.h:391
double getRFFreq() const
Definition: Ring.h:219
A 3-dimension vector.
Definition: Vector3D.h:31
virtual ElementBase * clone() const override
Definition: Ring.h:145
double getLatticeThetaInit() const
Definition: Ring.h:273
virtual ~Ring()
Definition: Ring.cpp:90
void setLatticePhiInit(double phiInit)
Definition: Ring.h:252