OPAL (Object Oriented Parallel Accelerator Library) 2024.2
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
23#include "Physics/Physics.h"
24#include "Fields/Definitions.h"
25
26#include <boost/bimap.hpp>
27
28#include <cmath>
29#include <string>
30
31enum class CavityType: unsigned short {
34};
35
36class RFCavity: public Component {
37
38public:
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);
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
196protected:
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;
205
206 double scale_m;
208 double phase_m;
210 double frequency_m;
211
212 bool fast_m;
214
216
219
220private:
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;
232 double pdis_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
269inline
270double 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
281inline
282double 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
309inline
310double 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
321inline
322double 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
333inline
334void RFCavity::setDesignEnergy(const double& ekin, bool) {
335 designEnergy_m = ekin;
336}
337
338inline
340 return designEnergy_m;
341}
342
343inline
345 fieldmap_m = nullptr;
346}
347
348inline
349void RFCavity::setFieldMapFN(const std::string& fn) {
350 filename_m = fn;
351}
352
353inline
354void RFCavity::setAmplitudem(double vPeak) {
355 scale_m = vPeak;
356}
357
358inline
360 return scale_m;
361}
362
363inline
364void RFCavity::setAmplitudeError(double vPeakError) {
365 scaleError_m = vPeakError;
366}
367
368inline
370 return scaleError_m;
371}
372
373inline
374void RFCavity::setFrequency(double freq) {
375 frequency_m = freq;
376}
377
378inline
379void RFCavity::setFrequencym(double freq) {
380 frequency_m = freq;
381}
382
383inline
385 return frequency_m;
386}
387
388inline
389void RFCavity::setPhasem(double phase) {
390 phase_m = phase;
391}
392
393inline
394double RFCavity::getPhasem() const {
395 return phase_m;
396}
397
398inline
399double RFCavity::getPhasem(double t) const {
400 return phase_m + t * frequency_m;
401}
402
403inline
404void RFCavity::setPhaseError(double phaseError) {
405 phaseError_m = phaseError;
406}
407
408inline
410 return phaseError_m;
411}
412
413inline
415 return type_m;
416}
417
418inline
419void RFCavity::setFast(bool fast) {
420 fast_m = fast;
421}
422
423inline
424bool RFCavity::getFast() const {
425 return fast_m;
426}
427
428inline
430 autophaseVeto_m = veto;
431}
432
433inline
435 return autophaseVeto_m;
436}
437
438inline
439void RFCavity::setAmplitudeModel(std::shared_ptr<AbstractTimeDependence> amplitudeTD) {
440 amplitudeTD_m = amplitudeTD;
441}
442
443inline
447
448inline
450 return amplitudeName_m;
451}
452
453inline
454void RFCavity::setPhaseModel(std::shared_ptr<AbstractTimeDependence> phaseTD) {
455 phaseTD_m = phaseTD;
456}
457
458inline
461}
462
463inline
465 return phaseName_m;
466}
467
468inline
469void RFCavity::setFrequencyModel(std::shared_ptr<AbstractTimeDependence> frequencyTD) {
470 frequencyTD_m = frequencyTD;
471}
472
473inline
477
478inline
480 return frequencyName_m;
481}
482
483inline
486 Quaternion(1, 0, 0, 0));
487 return ret;
488}
489
490inline
493 Quaternion(1, 0, 0, 0));
494 return ret;
495}
496
497#endif // CLASSIC_RFCavity_HH
CavityType
Definition RFCavity.h:31
ElementType
Definition ElementBase.h:88
PartBunchBase< T, Dim >::ConstIterator end(PartBunchBase< T, Dim > const &bunch)
PartBunchBase< T, Dim >::ConstIterator begin(PartBunchBase< T, Dim > const &bunch)
std::shared_ptr< _Fieldmap > Fieldmap
Definition Definitions.h:24
const std::string name
constexpr double c
The velocity of light in m/s.
Definition Physics.h:45
Component(const std::string &name)
Constructor with given name.
Definition Component.cpp:53
void setFrequencyModel(std::shared_ptr< AbstractTimeDependence > time_dep)
Definition RFCavity.h:469
virtual bool isInside(const Vector_t &r) const override
Definition RFCavity.cpp:724
virtual double getPhasem() const
Definition RFCavity.h:394
virtual bool bends() const override
Definition RFCavity.cpp:250
bool fast_m
Definition RFCavity.h:212
std::string getPhaseModelName()
Definition RFCavity.h:464
virtual double getRmax() const
Definition RFCavity.cpp:299
double phi0_m
Definition RFCavity.h:234
void setPerpenDistance(double pdis)
Definition RFCavity.cpp:278
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 getAzimuth() const
Definition RFCavity.cpp:308
std::string getAmplitudeModelName()
Definition RFCavity.h:449
virtual ElementType getType() const override
Get element type std::string.
Definition RFCavity.cpp:499
virtual void setAmplitudeError(double vPeakError)
Definition RFCavity.h:364
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
virtual void accept(BeamlineVisitor &) const override
Apply visitor to RFCavity.
Definition RFCavity.cpp:119
double endField_m
Definition RFCavity.h:221
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
double designEnergy_m
Definition RFCavity.h:215
std::string filename_m
Definition RFCavity.h:204
CavityType type_m
Definition RFCavity.h:223
std::unique_ptr< double[]> DvDr_m
Definition RFCavity.h:238
void setPhaseModelName(std::string name)
Definition RFCavity.h:459
virtual void finalise() override
Definition RFCavity.cpp:247
virtual ~RFCavity()
Definition RFCavity.cpp:116
void setRmin(double rmin)
Definition RFCavity.cpp:266
void operator=(const RFCavity &)
void setPhaseModel(std::shared_ptr< AbstractTimeDependence > time_dep)
Definition RFCavity.h:454
virtual double getFrequency() const =0
Get RF frequency.
void setFrequencyModelName(std::string name)
Definition RFCavity.h:474
virtual double getPhase() const =0
Get RF phase.
virtual void getElementDimensions(double &begin, double &end) const override
Definition RFCavity.cpp:743
virtual double getCosAzimuth() const
Definition RFCavity.cpp:316
virtual double getAmplitudem() const
Definition RFCavity.h:359
double rmin_m
Definition RFCavity.h:227
double scale_m
Definition RFCavity.h:206
void setFrequency(double freq)
Definition RFCavity.h:374
void setAmplitudeModelName(std::string name)
Definition RFCavity.h:444
virtual bool getAutophaseVeto() const
Definition RFCavity.h:434
double phaseError_m
Definition RFCavity.h:209
virtual void setAmplitudem(double vPeak)
Definition RFCavity.h:354
std::shared_ptr< AbstractTimeDependence > phaseTD_m
Definition RFCavity.h:197
virtual bool getFast() const
Definition RFCavity.h:424
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField) override
Definition RFCavity.cpp:167
double cosAngle_m
Definition RFCavity.h:231
Fieldmap fieldmap_m
Definition RFCavity.h:217
std::string frequencyName_m
Definition RFCavity.h:202
virtual void setPhaseError(double phaseError)
Definition RFCavity.h:404
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
virtual CoordinateSystemTrafo getEdgeToBegin() const override
Definition RFCavity.h:484
std::unique_ptr< double[]> RNormal_m
Definition RFCavity.h:236
std::shared_ptr< AbstractTimeDependence > amplitudeTD_m
Definition RFCavity.h:199
double gapwidth_m
Definition RFCavity.h:233
virtual void setPhasem(double phase)
Definition RFCavity.h:389
RFCavity(const std::string &name)
Constructor with given name.
Definition RFCavity.cpp:84
double sinAngle_m
Definition RFCavity.h:230
virtual double getSinAzimuth() const
Definition RFCavity.cpp:312
void setPhi0(double phi0)
Definition RFCavity.cpp:286
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
double spline(double z, double *za)
Definition RFCavity.cpp:433
std::shared_ptr< AbstractTimeDependence > frequencyTD_m
Definition RFCavity.h:201
double frequency_m
Definition RFCavity.h:210
virtual std::string getFieldMapFN() const
Definition RFCavity.cpp:345
virtual void setFrequencym(double freq)
Definition RFCavity.h:379
virtual double getFrequencym() const
Definition RFCavity.h:384
std::string phaseName_m
Definition RFCavity.h:198
virtual void setFieldMapFN(const std::string &fmapfn)
Set the name of the field map.
Definition RFCavity.h:349
void setAzimuth(double angle)
Definition RFCavity.cpp:274
std::unique_ptr< double[]> VrNormal_m
Definition RFCavity.h:237
virtual void goOnline(const double &kineticEnergy) override
Definition RFCavity.cpp:254
double pdis_m
Definition RFCavity.h:232
void setCavityType(const std::string &type)
Definition RFCavity.cpp:332
double startField_m
Definition RFCavity.h:218
void dropFieldmaps()
Definition RFCavity.h:344
virtual CoordinateSystemTrafo getEdgeToEnd() const override
Definition RFCavity.h:491
virtual void setAutophaseVeto(bool veto=true)
Definition RFCavity.h:429
virtual double getCycFrequency() const
Definition RFCavity.cpp:359
virtual double getAmplitudeError() const
Definition RFCavity.h:369
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 double getAmplitude() const =0
Get RF amplitude.
virtual double getGapWidth() const
Definition RFCavity.cpp:324
virtual double getAutoPhaseEstimate(const double &E0, const double &t0, const double &q, const double &m)
Definition RFCavity.cpp:545
double rmax_m
Definition RFCavity.h:228
virtual void getDimensions(double &zBegin, double &zEnd) const override
Definition RFCavity.cpp:493
virtual double getPhaseError() const
Definition RFCavity.h:409
double scaleError_m
Definition RFCavity.h:207
static const boost::bimap< CavityType, std::string > bmCavityTypeString_s
Definition RFCavity.h:225
std::string getFrequencyModelName()
Definition RFCavity.h:479
virtual double getPerpenDistance() const
Definition RFCavity.cpp:320
virtual double getDesignEnergy() const override
Definition RFCavity.h:339
std::string amplitudeName_m
Definition RFCavity.h:200
virtual void setDesignEnergy(const double &ekin, bool changeable=true) override
Definition RFCavity.h:334
void setGapWidth(double gapwidth)
Definition RFCavity.cpp:282
virtual void setFast(bool fast)
Definition RFCavity.h:419
CavityType getCavityType() const
Definition RFCavity.h:414
virtual double getElementLength() const override
Get design length.
Definition RFCavity.cpp:732
double phase_m
Definition RFCavity.h:208
virtual bool apply(const size_t &i, const double &t, Vector_t &E, Vector_t &B) override
Definition RFCavity.cpp:123
bool autophaseVeto_m
Definition RFCavity.h:213
virtual void goOffline() override
Definition RFCavity.cpp:260
double angle_m
Definition RFCavity.h:229
virtual double getPhi0() const
Definition RFCavity.cpp:328
virtual double getAutoPhaseEstimateFallback(double E0, double t0, double q, double m)
Definition RFCavity.cpp:503
std::string getCavityTypeString() const
Definition RFCavity.cpp:341
void setRmax(double rmax)
Definition RFCavity.cpp:270
void setAmplitudeModel(std::shared_ptr< AbstractTimeDependence > time_dep)
Definition RFCavity.h:439
virtual double getRmin() const
Definition RFCavity.cpp:290
int num_points_m
Definition RFCavity.h:239
double getdT(const int &i, const std::vector< double > &E, const double &dz, const double mass) const
Definition RFCavity.h:282
Vektor< double, 3 > Vector_t