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