OPAL (Object Oriented Parallel Accelerator Library) 2024.2
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
25
26#include <cmath>
27#include <string>
28
29class LossDataSink;
30template <class T, unsigned Dim>
31class PartBunchBase;
32class FieldMap;
33
53class Ring: public Component {
54
55public:
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
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
259
261 Vector_t getNextNormal() const;
262
267 void setLatticeThetaInit(double thetaInit) {latticeThetaInit_m = thetaInit;}
268
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
331private:
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
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
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
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
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
std::vector< RingSection * > RingSectionList
Interface for a single beam element.
Definition Component.h:50
Component(const std::string &name)
Constructor with given name.
Definition Component.cpp:53
ElementBase(const std::string &name)
Constructor with given name.
virtual const EMField & getField() const override
Definition Ring.h:172
double rfFreq_m
Definition Ring.h:409
double getBeamRInit() const
Definition Ring.h:225
bool isClosed_m
Definition Ring.h:398
LossDataSink * lossDS_m
Definition Ring.h:374
Vector_t getNextPosition() const
Definition Ring.cpp:206
void buildRingSections()
Definition Ring.cpp:351
std::vector< RingSection * > getSectionsAt(const Vector_t &pos)
Definition Ring.cpp:172
void setSymmetry(double symmetry)
Definition Ring.h:276
double maxR2_m
Definition Ring.h:391
PartBunchBase< double, 3 > * getRefPartBunch() const
double getLatticePhiInit() const
Definition Ring.h:255
double getRingMinR() const
Definition Ring.h:297
Rotation3D getRotationStartToEnd(Euclid3D delta) const
Definition Ring.cpp:176
double beamPhiInit_m
Definition Ring.h:379
size_t getNumberOfRingSections() const
Definition Ring.cpp:402
virtual EMField & getField() override
Definition Ring.h:169
double minR2_m
Definition Ring.h:390
bool willDoAperture_m
Definition Ring.h:389
double beamThetaInit_m
Definition Ring.h:380
static bool sectionCompare(RingSection const *const sec1, RingSection const *const sec2)
Definition Ring.cpp:371
void setBeamThetaInit(double thetaInit)
Definition Ring.h:234
Vector_t getNextNormal() const
Definition Ring.cpp:220
double getBeamPRInit() const
Definition Ring.h:243
virtual void finalise() override
Definition Ring.cpp:161
void checkAndClose()
Definition Ring.cpp:336
void resetAzimuths()
Definition Ring.cpp:321
double getSymmetry() const
Definition Ring.h:282
virtual ~Ring()
Definition Ring.cpp:90
virtual bool apply(const size_t &id, const double &t, Vector_t &E, Vector_t &B) override
Definition Ring.cpp:95
Ring & operator=(const Ring &ring)
Ring(const std::string &ring)
Definition Ring.cpp:41
RingSection * getLastSectionPlaced() const
Definition Ring.cpp:364
void setBeamRInit(double rInit)
Definition Ring.h:222
virtual const PlanarArcGeometry & getGeometry() const override
Definition Ring.h:178
void setIsClosed(bool isClosed)
Definition Ring.h:285
void setLatticeThetaInit(double thetaInit)
Definition Ring.h:267
void setRefPartBunch(PartBunchBase< double, 3 > *bunch)
Definition Ring.cpp:167
virtual ElementBase * clone() const override
Definition Ring.h:145
void setHarmonicNumber(double cyclHarm)
Definition Ring.h:209
void setLatticePhiInit(double phiInit)
Definition Ring.h:252
virtual bool bends() const override
Definition Ring.h:131
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField) override
Definition Ring.cpp:156
double getLatticeThetaInit() const
Definition Ring.h:273
double latticeThetaInit_m
Definition Ring.h:385
std::vector< RingSectionList > ringSections_m
Definition Ring.h:413
virtual void accept(BeamlineVisitor &visitor) const override
Definition Ring.cpp:55
void setRingAperture(double minR, double maxR)
Definition Ring.cpp:376
double beamRInit_m
Definition Ring.h:377
void setScale(double scale)
Definition Ring.h:279
double latticePhiInit_m
Definition Ring.h:384
RingSectionList section_list_m
Definition Ring.h:414
double getBeamPhiInit() const
Definition Ring.h:231
void setBeamPRInit(double pRInit)
Definition Ring.h:240
double getIsClosed() const
Definition Ring.h:288
double scale_m
Definition Ring.h:403
double getRingMaxR() const
Definition Ring.h:300
void checkMidplane(Euclid3D delta) const
Definition Ring.cpp:187
double beamPRInit_m
Definition Ring.h:378
void setLossDataSink(LossDataSink *sink)
Definition Ring.cpp:140
int symmetry_m
Definition Ring.h:401
void setBeamPhiInit(double phiInit)
Definition Ring.h:228
double getBeamThetaInit() const
Definition Ring.h:237
double latticeRInit_m
Definition Ring.h:383
PlanarArcGeometry planarArcGeometry_m
Definition Ring.h:363
double getHarmonicNumber()
Definition Ring.h:212
virtual void getDimensions(double &zBegin, double &zEnd) const override
Definition Ring.cpp:145
void setRFFreq(double rfFreq)
Definition Ring.h:216
double phiStep_m
Definition Ring.h:412
void lockRing()
Definition Ring.cpp:291
PartBunchBase< double, 3 > * getLossDataSink() const
double getRFFreq() const
Definition Ring.h:219
void setLatticeRInit(double rInit)
Definition Ring.h:246
virtual PlanarArcGeometry & getGeometry() override
Definition Ring.h:175
bool isLocked_m
Definition Ring.h:394
void appendElement(const Component &element)
Definition Ring.cpp:234
Vector_t getStartNormal() const
Definition Ring.cpp:228
void rotateToCyclCoordinates(Euclid3D &euclid3d) const
Definition Ring.cpp:197
static Vector_t convert(const Vector3D &vec)
Definition Ring.h:421
double cyclHarm_m
Definition Ring.h:406
double getLatticeRInit() const
Definition Ring.h:249
static const double lengthTolerance_m
Definition Ring.h:417
RingSection * getSection(int i) const
Definition Ring.cpp:387
Vector_t getStartPosition() const
Definition Ring.cpp:214
PartBunchBase< double, 3 > * refPartBunch_m
Definition Ring.h:369
static const double angleTolerance_m
Definition Ring.h:418
Displacement and rotation in space.
Definition Euclid3D.h:68
A simple arc in the XZ plane.
Rotation in 3-dimensional space.
Definition Rotation3D.h:46
A 3-dimension vector.
Definition Vector3D.h:31
Abstract base class for electromagnetic fields.
Definition EMField.h:188
Component placement handler in ring geometry.
Definition RingSection.h:58
Definition Vec.h:22
Vektor< double, 3 > Vector_t