OPAL (Object Oriented Parallel Accelerator Library)  2024.1
OPAL
RFCavity.h
Go to the documentation of this file.
1 //
2 // Class RFCavity
3 // Defines the abstract interface for for RF cavities.
4 //
5 // Copyright (c) 200x - 2021, Paul Scherrer Institut, Villigen PSI, Switzerland
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 CLASSIC_RFCavity_HH
19 #define CLASSIC_RFCavity_HH
20 
21 #include "AbsBeamline/Component.h"
23 #include "Physics/Physics.h"
24 #include "Fields/Definitions.h"
25 
26 #include <boost/bimap.hpp>
27 
28 #include <cmath>
29 #include <string>
30 
31 enum class CavityType: unsigned short {
32  SW,
33  SGSW
34 };
35 
36 class RFCavity: public Component {
37 
38 public:
39 
41  explicit RFCavity(const std::string& name);
42 
43  RFCavity();
44  RFCavity(const RFCavity&);
45  virtual ~RFCavity();
46 
48  virtual void accept(BeamlineVisitor& ) const override;
49 
51  virtual double getAmplitude() const = 0;
52 
54  virtual double getFrequency() const = 0;
55  void setFrequency(double freq);
56 
58  virtual double getPhase() const = 0;
59 
60  void dropFieldmaps();
61 
63  virtual void setFieldMapFN(const std::string& fmapfn);
64  virtual std::string getFieldMapFN() const;
65 
66  virtual void setAmplitudem(double vPeak);
67  virtual double getAmplitudem() const;
68 
69  virtual void setAmplitudeError(double vPeakError);
70  virtual double getAmplitudeError() const;
71 
72  virtual void setFrequencym(double freq);
73  virtual double getFrequencym() const;
74 
75  virtual void setPhasem(double phase);
76  virtual double getPhasem() const;
77  double getPhasem(double t) const;
78 
79  virtual void setPhaseError(double phaseError);
80  virtual double getPhaseError() const;
81 
82  void setCavityType(const std::string& type);
83  CavityType getCavityType() const;
84  std::string getCavityTypeString() const;
85 
86  virtual void setFast(bool fast);
87  virtual bool getFast() const;
88 
89  virtual void setAutophaseVeto(bool veto = true);
90  virtual bool getAutophaseVeto() const;
91 
92  virtual double getAutoPhaseEstimate(const double& E0, const double& t0, const double& q, const double& m);
93  virtual double getAutoPhaseEstimateFallback(double E0, double t0, double q, double m);
94 
95  virtual std::pair<double, double> trackOnAxisParticle(const double& p0,
96  const double& t0,
97  const double& dt,
98  const double& q,
99  const double& mass,
100  std::ofstream *out = nullptr);
101 
102  virtual bool apply(const size_t& i,
103  const double& t,
104  Vector_t& E,
105  Vector_t& B) override;
106 
107  virtual bool apply(const Vector_t& R,
108  const Vector_t& P,
109  const double& t,
110  Vector_t& E,
111  Vector_t& B) override;
112 
113  virtual bool applyToReferenceParticle(const Vector_t& R,
114  const Vector_t& P,
115  const double& t,
116  Vector_t& E,
117  Vector_t& B) override;
118 
119  virtual void initialise(PartBunchBase<double, 3>* bunch, double& startField, double& endField) override;
120 
121  virtual void initialise(PartBunchBase<double, 3>* bunch,
122  std::shared_ptr<AbstractTimeDependence> freq_atd,
123  std::shared_ptr<AbstractTimeDependence> ampl_atd,
124  std::shared_ptr<AbstractTimeDependence> phase_atd);
125 
126  virtual void finalise() override;
127 
128  virtual bool bends() const override;
129 
130  virtual void goOnline(const double& kineticEnergy) override;
131 
132  virtual void goOffline() override;
133 
134  virtual void setDesignEnergy(const double& ekin, bool changeable = true) override;
135  virtual double getDesignEnergy() const override;
136 
137  void setRmin(double rmin);
138  virtual double getRmin() const;
139 
140  void setRmax(double rmax);
141  virtual double getRmax() const;
142 
143  void setAzimuth(double angle);
144  virtual double getAzimuth() const;
145 
146  void setPerpenDistance(double pdis);
147  virtual double getPerpenDistance() const;
148 
149  void setGapWidth(double gapwidth);
150  virtual double getGapWidth() const;
151 
152  void setPhi0(double phi0);
153  virtual double getPhi0() const;
154 
155  virtual double getCosAzimuth() const;
156 
157  virtual double getSinAzimuth() const;
158 
159  virtual double getCycFrequency() const;
160 
161  void getMomentaKick(const double normalRadius,
162  double momentum[],
163  const double t,
164  const double dtCorrt,
165  const int PID,
166  const double restMass,
167  const int chargenumber);
168 
169  double spline(double z, double* za);
170 
171  virtual ElementType getType() const override;
172 
173  virtual void getDimensions(double& zBegin, double& zEnd) const override;
174 
175  virtual bool isInside(const Vector_t& r) const override;
176 
177  void setAmplitudeModel(std::shared_ptr<AbstractTimeDependence> time_dep);
178  void setAmplitudeModelName(std::string name);
179  std::string getAmplitudeModelName();
180 
181  void setPhaseModel(std::shared_ptr<AbstractTimeDependence> time_dep);
182  void setPhaseModelName(std::string name);
183  std::string getPhaseModelName();
184 
185  void setFrequencyModel(std::shared_ptr<AbstractTimeDependence> time_dep);
186  void setFrequencyModelName(std::string name);
187  std::string getFrequencyModelName();
188 
189  virtual double getElementLength() const override;
190  virtual void getElementDimensions(double& begin,
191  double& end) const override;
192 
193  virtual CoordinateSystemTrafo getEdgeToBegin() const override;
194  virtual CoordinateSystemTrafo getEdgeToEnd() const override;
195 
196 protected:
197  std::shared_ptr<AbstractTimeDependence> phaseTD_m;
198  std::string phaseName_m;
199  std::shared_ptr<AbstractTimeDependence> amplitudeTD_m;
200  std::string amplitudeName_m;
201  std::shared_ptr<AbstractTimeDependence> frequencyTD_m;
202  std::string frequencyName_m;
203 
204  std::string filename_m;
206  double scale_m;
207  double scaleError_m;
208  double phase_m;
209  double phaseError_m;
210  double frequency_m;
212  bool fast_m;
214 
216 
218  double startField_m;
220 private:
221  double endField_m;
222 
224 
225  static const boost::bimap<CavityType, std::string> bmCavityTypeString_s;
226 
227  double rmin_m;
228  double rmax_m;
229  double angle_m;
230  double sinAngle_m;
231  double cosAngle_m;
232  double pdis_m;
233  double gapwidth_m;
234  double phi0_m;
235 
236  std::unique_ptr<double[]> RNormal_m;
237  std::unique_ptr<double[]> VrNormal_m;
238  std::unique_ptr<double[]> DvDr_m;
240 
241  double getdE(const int& i,
242  const std::vector<double>& t,
243  const double& dz,
244  const double& phi,
245  const double& frequency,
246  const std::vector<double>& F) const;
247 
248  double getdT(const int& i,
249  const std::vector<double>& E,
250  const double& dz,
251  const double mass) const;
252 
253  double getdA(const int& i,
254  const std::vector<double>& t,
255  const double& dz,
256  const double& frequency,
257  const std::vector<double>& F) const;
258 
259  double getdB(const int& i,
260  const std::vector<double>& t,
261  const double& dz,
262  const double& frequency,
263  const std::vector<double>& F) const;
264 
265  // Not implemented.
266  void operator=(const RFCavity&);
267 };
268 
269 inline
270 double RFCavity::getdE(const int& i,
271  const std::vector<double>& t,
272  const double& dz,
273  const double& phi,
274  const double& frequency,
275  const std::vector<double>& F) const {
276  return dz / (frequency * frequency * (t[i] - t[i-1]) * (t[i] - t[i-1])) *
277  (frequency * (t[i] - t[i-1]) * (F[i] * std::sin(frequency * t[i] + phi) - F[i-1] * std::sin(frequency * t[i-1] + phi)) +
278  (F[i] - F[i-1]) * (std::cos(frequency * t[i] + phi) - std::cos(frequency * t[i-1] + phi)));
279 }
280 
281 inline
282 double RFCavity::getdT(const int& i,
283  const std::vector<double>& E,
284  const double& dz,
285  const double mass) const {
286  double gamma1 = 1. + (19. * E[i-1] + 1. * E[i]) / (20. * mass);
287  double gamma2 = 1. + (17. * E[i-1] + 3. * E[i]) / (20. * mass);
288  double gamma3 = 1. + (15. * E[i-1] + 5. * E[i]) / (20. * mass);
289  double gamma4 = 1. + (13. * E[i-1] + 7. * E[i]) / (20. * mass);
290  double gamma5 = 1. + (11. * E[i-1] + 9. * E[i]) / (20. * mass);
291  double gamma6 = 1. + (9. * E[i-1] + 11. * E[i]) / (20. * mass);
292  double gamma7 = 1. + (7. * E[i-1] + 13. * E[i]) / (20. * mass);
293  double gamma8 = 1. + (5. * E[i-1] + 15. * E[i]) / (20. * mass);
294  double gamma9 = 1. + (3. * E[i-1] + 17. * E[i]) / (20. * mass);
295  double gamma10 = 1. + (1. * E[i-1] + 19. * E[i]) / (20. * mass);
296  return dz *
297  (1. / std::sqrt(1. - 1. / (gamma1 * gamma1)) +
298  1. / std::sqrt(1. - 1. / (gamma2 * gamma2)) +
299  1. / std::sqrt(1. - 1. / (gamma3 * gamma3)) +
300  1. / std::sqrt(1. - 1. / (gamma4 * gamma4)) +
301  1. / std::sqrt(1. - 1. / (gamma5 * gamma5)) +
302  1. / std::sqrt(1. - 1. / (gamma6 * gamma6)) +
303  1. / std::sqrt(1. - 1. / (gamma7 * gamma7)) +
304  1. / std::sqrt(1. - 1. / (gamma8 * gamma8)) +
305  1. / std::sqrt(1. - 1. / (gamma9 * gamma9)) +
306  1. / std::sqrt(1. - 1. / (gamma10 * gamma10))) / (10. * Physics::c);
307 }
308 
309 inline
310 double RFCavity::getdA(const int& i,
311  const std::vector<double>& t,
312  const double& dz,
313  const double& frequency,
314  const std::vector<double>& F) const {
315  double dt = t[i] - t[i-1];
316  return dz / (frequency * frequency * dt * dt) *
317  (frequency * dt * (F[i] * std::cos(frequency * t[i]) - F[i-1] * std::cos(frequency * t[i-1])) -
318  (F[i] - F[i-1]) * (std::sin(frequency * t[i]) - std::sin(frequency * t[i-1])));
319 }
320 
321 inline
322 double RFCavity::getdB(const int& i,
323  const std::vector<double>& t,
324  const double& dz,
325  const double& frequency,
326  const std::vector<double>& F) const {
327  double dt = t[i] - t[i-1];
328  return dz / (frequency * frequency * dt * dt) *
329  (frequency * dt * (F[i] * std::sin(frequency * t[i]) - F[i-1] * std::sin(frequency * t[i-1])) +
330  (F[i] - F[i-1]) * (std::cos(frequency * t[i]) - std::cos(frequency * t[i-1])));
331 }
332 
333 inline
334 void RFCavity::setDesignEnergy(const double& ekin, bool) {
335  designEnergy_m = ekin;
336 }
337 
338 inline
340  return designEnergy_m;
341 }
342 
343 inline
345  fieldmap_m = nullptr;
346 }
347 
348 inline
349 void RFCavity::setFieldMapFN(const std::string& fn) {
350  filename_m = fn;
351 }
352 
353 inline
354 void RFCavity::setAmplitudem(double vPeak) {
355  scale_m = vPeak;
356 }
357 
358 inline
359 double RFCavity::getAmplitudem() const {
360  return scale_m;
361 }
362 
363 inline
364 void RFCavity::setAmplitudeError(double vPeakError) {
365  scaleError_m = vPeakError;
366 }
367 
368 inline
370  return scaleError_m;
371 }
372 
373 inline
374 void RFCavity::setFrequency(double freq) {
375  frequency_m = freq;
376 }
377 
378 inline
379 void RFCavity::setFrequencym(double freq) {
380  frequency_m = freq;
381 }
382 
383 inline
384 double RFCavity::getFrequencym() const {
385  return frequency_m;
386 }
387 
388 inline
389 void RFCavity::setPhasem(double phase) {
390  phase_m = phase;
391 }
392 
393 inline
394 double RFCavity::getPhasem() const {
395  return phase_m;
396 }
397 
398 inline
399 double RFCavity::getPhasem(double t) const {
400  return phase_m + t * frequency_m;
401 }
402 
403 inline
404 void RFCavity::setPhaseError(double phaseError) {
405  phaseError_m = phaseError;
406 }
407 
408 inline
409 double RFCavity::getPhaseError() const {
410  return phaseError_m;
411 }
412 
413 inline
415  return type_m;
416 }
417 
418 inline
419 void RFCavity::setFast(bool fast) {
420  fast_m = fast;
421 }
422 
423 inline
424 bool RFCavity::getFast() const {
425  return fast_m;
426 }
427 
428 inline
429 void RFCavity::setAutophaseVeto(bool veto) {
430  autophaseVeto_m = veto;
431 }
432 
433 inline
435  return autophaseVeto_m;
436 }
437 
438 inline
439 void RFCavity::setAmplitudeModel(std::shared_ptr<AbstractTimeDependence> amplitudeTD) {
440  amplitudeTD_m = amplitudeTD;
441 }
442 
443 inline
446 }
447 
448 inline
450  return amplitudeName_m;
451 }
452 
453 inline
454 void RFCavity::setPhaseModel(std::shared_ptr<AbstractTimeDependence> phaseTD) {
455  phaseTD_m = phaseTD;
456 }
457 
458 inline
461 }
462 
463 inline
465  return phaseName_m;
466 }
467 
468 inline
469 void RFCavity::setFrequencyModel(std::shared_ptr<AbstractTimeDependence> frequencyTD) {
470  frequencyTD_m = frequencyTD;
471 }
472 
473 inline
476 }
477 
478 inline
480  return frequencyName_m;
481 }
482 
483 inline
486  Quaternion(1, 0, 0, 0));
487  return ret;
488 }
489 
490 inline
493  Quaternion(1, 0, 0, 0));
494  return ret;
495 }
496 
497 #endif // CLASSIC_RFCavity_HH
virtual bool getAutophaseVeto() const
Definition: RFCavity.h:434
virtual double getCosAzimuth() const
Definition: RFCavity.cpp:316
std::unique_ptr< double[]> RNormal_m
Definition: RFCavity.h:236
virtual double getAmplitudem() const
Definition: RFCavity.h:359
Tps< T > sqrt(const Tps< T > &x)
Square root.
Definition: TpsMath.h:91
constexpr double c
The velocity of light in m/s.
Definition: Physics.h:45
double cosAngle_m
Definition: RFCavity.h:231
virtual void setFast(bool fast)
Definition: RFCavity.h:419
virtual double getRmax() const
Definition: RFCavity.cpp:299
virtual double getAutoPhaseEstimate(const double &E0, const double &t0, const double &q, const double &m)
Definition: RFCavity.cpp:545
virtual double getRmin() const
Definition: RFCavity.cpp:290
std::string getCavityTypeString() const
Definition: RFCavity.cpp:341
virtual void setFrequencym(double freq)
Definition: RFCavity.h:379
item[EANGLE] Entrance edge angle(radians).\item[ROTATION] Rotation of the magnet about its central axis(radians
void setPhaseModelName(std::string name)
Definition: RFCavity.h:459
double getdB(const int &i, const std::vector< double > &t, const double &dz, const double &frequency, const std::vector< double > &F) const
Definition: RFCavity.h:322
virtual CoordinateSystemTrafo getEdgeToBegin() const override
Definition: RFCavity.h:484
virtual double getAzimuth() const
Definition: RFCavity.cpp:308
virtual double getAutoPhaseEstimateFallback(double E0, double t0, double q, double m)
Definition: RFCavity.cpp:503
virtual bool bends() const override
Definition: RFCavity.cpp:250
double rmin_m
Definition: RFCavity.h:227
static const boost::bimap< CavityType, std::string > bmCavityTypeString_s
Definition: RFCavity.h:225
CavityType
Definition: RFCavity.h:31
void setFrequency(double freq)
Definition: RFCavity.h:374
double phaseError_m
Definition: RFCavity.h:209
CavityType type_m
Definition: RFCavity.h:223
void setCavityType(const std::string &type)
Definition: RFCavity.cpp:332
int num_points_m
Definition: RFCavity.h:239
void setRmax(double rmax)
Definition: RFCavity.cpp:270
Vektor< double, 3 > Vector_t
Definition: Vektor.h:6
virtual void goOnline(const double &kineticEnergy) override
Definition: RFCavity.cpp:254
double sinAngle_m
Definition: RFCavity.h:230
void setPhaseModel(std::shared_ptr< AbstractTimeDependence > time_dep)
Definition: RFCavity.h:454
virtual CoordinateSystemTrafo getEdgeToEnd() const override
Definition: RFCavity.h:491
void setAmplitudeModelName(std::string name)
Definition: RFCavity.h:444
virtual double getPhi0() const
Definition: RFCavity.cpp:328
std::unique_ptr< double[]> VrNormal_m
Definition: RFCavity.h:237
void setAzimuth(double angle)
Definition: RFCavity.cpp:274
virtual ElementType getType() const override
Get element type std::string.
Definition: RFCavity.cpp:499
clearpage the user may choose between constant or variable radius This model includes fringe fields begin
Definition: multipole_t.tex:6
virtual void setFieldMapFN(const std::string &fmapfn)
Set the name of the field map.
Definition: RFCavity.h:349
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField) override
Definition: RFCavity.cpp:167
virtual double getFrequency() const =0
Get RF frequency.
virtual double getDesignEnergy() const override
Definition: RFCavity.h:339
virtual double getGapWidth() const
Definition: RFCavity.cpp:324
virtual double getCycFrequency() const
Definition: RFCavity.cpp:359
double scale_m
Definition: RFCavity.h:206
virtual void getElementDimensions(double &begin, double &end) const override
Definition: RFCavity.cpp:743
double scaleError_m
Definition: RFCavity.h:207
RFCavity()
Definition: RFCavity.cpp:45
virtual bool apply(const size_t &i, const double &t, Vector_t &E, Vector_t &B) override
Definition: RFCavity.cpp:123
std::shared_ptr< _Fieldmap > Fieldmap
Definition: Definitions.h:24
void setAmplitudeModel(std::shared_ptr< AbstractTimeDependence > time_dep)
Definition: RFCavity.h:439
std::shared_ptr< AbstractTimeDependence > amplitudeTD_m
Definition: RFCavity.h:199
std::string getFrequencyModelName()
Definition: RFCavity.h:479
virtual double getPhasem() const
Definition: RFCavity.h:394
std::shared_ptr< AbstractTimeDependence > phaseTD_m
Definition: RFCavity.h:197
std::string getPhaseModelName()
Definition: RFCavity.h:464
virtual double getFrequencym() const
Definition: RFCavity.h:384
CavityType getCavityType() const
Definition: RFCavity.h:414
void getMomentaKick(const double normalRadius, double momentum[], const double t, const double dtCorrt, const int PID, const double restMass, const int chargenumber)
used in OPAL-cycl
Definition: RFCavity.cpp:373
virtual double getAmplitudeError() const
Definition: RFCavity.h:369
std::string frequencyName_m
Definition: RFCavity.h:202
double angle_m
Definition: RFCavity.h:229
virtual void accept(BeamlineVisitor &) const override
Apply visitor to RFCavity.
Definition: RFCavity.cpp:119
virtual std::pair< double, double > trackOnAxisParticle(const double &p0, const double &t0, const double &dt, const double &q, const double &mass, std::ofstream *out=nullptr)
Definition: RFCavity.cpp:675
double phase_m
Definition: RFCavity.h:208
void setGapWidth(double gapwidth)
Definition: RFCavity.cpp:282
ElementType
Definition: ElementBase.h:88
double frequency_m
Definition: RFCavity.h:210
std::string amplitudeName_m
Definition: RFCavity.h:200
double pdis_m
Definition: RFCavity.h:232
std::unique_ptr< double[]> DvDr_m
Definition: RFCavity.h:238
virtual void setAmplitudem(double vPeak)
Definition: RFCavity.h:354
void setRmin(double rmin)
Definition: RFCavity.cpp:266
double startField_m
Definition: RFCavity.h:218
void setFrequencyModelName(std::string name)
Definition: RFCavity.h:474
virtual void setAutophaseVeto(bool veto=true)
Definition: RFCavity.h:429
virtual void goOffline() override
Definition: RFCavity.cpp:260
virtual bool applyToReferenceParticle(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B) override
Definition: RFCavity.cpp:147
virtual void finalise() override
Definition: RFCavity.cpp:247
void setPerpenDistance(double pdis)
Definition: RFCavity.cpp:278
Tps< T > cos(const Tps< T > &x)
Cosine.
Definition: TpsMath.h:129
void setFrequencyModel(std::shared_ptr< AbstractTimeDependence > time_dep)
Definition: RFCavity.h:469
bool autophaseVeto_m
Definition: RFCavity.h:213
double endField_m
Definition: RFCavity.h:221
const std::string name
Fieldmap fieldmap_m
Definition: RFCavity.h:217
double designEnergy_m
Definition: RFCavity.h:215
virtual double getElementLength() const override
Get design length.
Definition: RFCavity.cpp:732
virtual double getAmplitude() const =0
Get RF amplitude.
double getdA(const int &i, const std::vector< double > &t, const double &dz, const double &frequency, const std::vector< double > &F) const
Definition: RFCavity.h:310
virtual void setDesignEnergy(const double &ekin, bool changeable=true) override
Definition: RFCavity.h:334
std::string phaseName_m
Definition: RFCavity.h:198
virtual bool getFast() const
Definition: RFCavity.h:424
virtual double getPerpenDistance() const
Definition: RFCavity.cpp:320
double getdE(const int &i, const std::vector< double > &t, const double &dz, const double &phi, const double &frequency, const std::vector< double > &F) const
Definition: RFCavity.h:270
double phi0_m
Definition: RFCavity.h:234
virtual std::string getFieldMapFN() const
Definition: RFCavity.cpp:345
std::string getAmplitudeModelName()
Definition: RFCavity.h:449
void setPhi0(double phi0)
Definition: RFCavity.cpp:286
virtual void setAmplitudeError(double vPeakError)
Definition: RFCavity.h:364
double spline(double z, double *za)
Definition: RFCavity.cpp:433
virtual void getDimensions(double &zBegin, double &zEnd) const override
Definition: RFCavity.cpp:493
Interface for a single beam element.
Definition: Component.h:50
void dropFieldmaps()
Definition: RFCavity.h:344
Tps< T > sin(const Tps< T > &x)
Sine.
Definition: TpsMath.h:111
std::shared_ptr< AbstractTimeDependence > frequencyTD_m
Definition: RFCavity.h:201
virtual bool isInside(const Vector_t &r) const override
Definition: RFCavity.cpp:724
virtual void setPhaseError(double phaseError)
Definition: RFCavity.h:404
virtual ~RFCavity()
Definition: RFCavity.cpp:116
double getdT(const int &i, const std::vector< double > &E, const double &dz, const double mass) const
Definition: RFCavity.h:282
virtual double getSinAzimuth() const
Definition: RFCavity.cpp:312
SDDS1 &description type
Definition: test.stat:4
virtual double getPhase() const =0
Get RF phase.
virtual double getPhaseError() const
Definition: RFCavity.h:409
double rmax_m
Definition: RFCavity.h:228
end
Definition: multipole_t.tex:9
double gapwidth_m
Definition: RFCavity.h:233
std::string filename_m
Definition: RFCavity.h:204
bool fast_m
Definition: RFCavity.h:212
void operator=(const RFCavity &)
virtual void setPhasem(double phase)
Definition: RFCavity.h:389