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