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