OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
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 OPALX_RFCavity_HH
19#define OPALX_RFCavity_HH
20
23#include "Physics/Physics.h"
24
25#include "Utilities/BiMap.h"
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,
94 const double& mass, std::ofstream* out = nullptr);
95
96 virtual bool apply(const std::shared_ptr<ParticleContainer_t>& pc) override;
97
98 virtual bool apply(
99 const size_t& i, const double& t, Vector_t<double, 3>& E,
100 Vector_t<double, 3>& B) override;
101
102 virtual bool apply(
103 const Vector_t<double, 3>& R, const Vector_t<double, 3>& P, const double& t,
105
106 virtual bool applyToReferenceParticle(
107 const Vector_t<double, 3>& R, const Vector_t<double, 3>& P, const double& t,
109
110 virtual void initialise(PartBunch_t* bunch, double& startField, double& endField) override;
111
112 virtual void initialise(
113 PartBunch_t* bunch, std::shared_ptr<AbstractTimeDependence> freq_atd,
114 std::shared_ptr<AbstractTimeDependence> ampl_atd,
115 std::shared_ptr<AbstractTimeDependence> phase_atd);
116
117 virtual void finalise() override;
118
119 virtual bool bends() const override;
120
121 virtual void goOnline(const double& kineticEnergy) override;
122
123 virtual void goOffline() override;
124
125 virtual void setDesignEnergy(const double& ekin, bool changeable = true) override;
126 virtual double getDesignEnergy() const override;
127
128 void setRmin(double rmin);
129 virtual double getRmin() const;
130
131 void setRmax(double rmax);
132 virtual double getRmax() const;
133
134 void setAzimuth(double angle);
135 virtual double getAzimuth() const;
136
137 void setPerpenDistance(double pdis);
138 virtual double getPerpenDistance() const;
139
140 void setGapWidth(double gapwidth);
141 virtual double getGapWidth() const;
142
143 void setPhi0(double phi0);
144 virtual double getPhi0() const;
145
146 virtual double getCosAzimuth() const;
147
148 virtual double getSinAzimuth() const;
149
150 virtual double getCycFrequency() const;
151
152 void getMomentaKick(
153 const double normalRadius, double momentum[], const double t, const double dtCorrt,
154 const int PID, const double restMass, const int chargenumber);
155
156 double spline(double z, double* za);
157
158 virtual ElementType getType() const override;
159
169 virtual void getFieldExtend(double& zBegin, double& zEnd) const override;
170
171 virtual bool isInside(const Vector_t<double, 3>& r) const override;
172
173 void setAmplitudeModel(std::shared_ptr<AbstractTimeDependence> time_dep);
174 void setAmplitudeModelName(std::string name);
175 std::string getAmplitudeModelName();
176
177 void setPhaseModel(std::shared_ptr<AbstractTimeDependence> time_dep);
178 void setPhaseModelName(std::string name);
179 std::string getPhaseModelName();
180
181 void setFrequencyModel(std::shared_ptr<AbstractTimeDependence> time_dep);
182 void setFrequencyModelName(std::string name);
183 std::string getFrequencyModelName();
184
192 virtual double getElementLength() const override;
193 virtual void getElementDimensions(double& begin, double& end) const override;
194
195 virtual CoordinateSystemTrafo getEdgeToBegin() const override;
196 virtual CoordinateSystemTrafo getEdgeToEnd() const override;
197
198protected:
199 std::shared_ptr<AbstractTimeDependence> phaseTD_m;
200 std::string phaseName_m;
201 std::shared_ptr<AbstractTimeDependence> amplitudeTD_m;
202 std::string amplitudeName_m;
203 std::shared_ptr<AbstractTimeDependence> frequencyTD_m;
204 std::string frequencyName_m;
205
206 std::string filename_m;
208 double scale_m;
210 double phase_m;
212 double frequency_m;
214 bool fast_m;
216
218
221 double endField_m;
223private:
225
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(
243 const int& i, const std::vector<double>& t, const double& dz, const double& phi,
244 const double& frequency, const std::vector<double>& F) const;
245
246 double getdT(
247 const int& i, const std::vector<double>& E, const double& dz, const double mass) const;
248
249 double getdA(
250 const int& i, const std::vector<double>& t, const double& dz, const double& frequency,
251 const std::vector<double>& F) const;
252
253 double getdB(
254 const int& i, const std::vector<double>& t, const double& dz, const double& frequency,
255 const std::vector<double>& F) const;
256
257 // Not implemented.
258 void operator=(const RFCavity&);
259};
260
261inline double RFCavity::getdE(
262 const int& i, const std::vector<double>& t, const double& dz, const double& phi,
263 const double& frequency, const std::vector<double>& F) const {
264 return dz / (frequency * frequency * (t[i] - t[i - 1]) * (t[i] - t[i - 1]))
265 * (frequency * (t[i] - t[i - 1])
266 * (F[i] * std::sin(frequency * t[i] + phi)
267 - F[i - 1] * std::sin(frequency * t[i - 1] + phi))
268 + (F[i] - F[i - 1])
269 * (std::cos(frequency * t[i] + phi)
270 - std::cos(frequency * t[i - 1] + phi)));
271}
272
273inline double RFCavity::getdT(
274 const int& i, const std::vector<double>& E, const double& dz, const double mass) const {
275 double gamma1 = 1. + (19. * E[i - 1] + 1. * E[i]) / (20. * mass);
276 double gamma2 = 1. + (17. * E[i - 1] + 3. * E[i]) / (20. * mass);
277 double gamma3 = 1. + (15. * E[i - 1] + 5. * E[i]) / (20. * mass);
278 double gamma4 = 1. + (13. * E[i - 1] + 7. * E[i]) / (20. * mass);
279 double gamma5 = 1. + (11. * E[i - 1] + 9. * E[i]) / (20. * mass);
280 double gamma6 = 1. + (9. * E[i - 1] + 11. * E[i]) / (20. * mass);
281 double gamma7 = 1. + (7. * E[i - 1] + 13. * E[i]) / (20. * mass);
282 double gamma8 = 1. + (5. * E[i - 1] + 15. * E[i]) / (20. * mass);
283 double gamma9 = 1. + (3. * E[i - 1] + 17. * E[i]) / (20. * mass);
284 double gamma10 = 1. + (1. * E[i - 1] + 19. * E[i]) / (20. * mass);
285 return dz
286 * (1. / std::sqrt(1. - 1. / (gamma1 * gamma1))
287 + 1. / std::sqrt(1. - 1. / (gamma2 * gamma2))
288 + 1. / std::sqrt(1. - 1. / (gamma3 * gamma3))
289 + 1. / std::sqrt(1. - 1. / (gamma4 * gamma4))
290 + 1. / std::sqrt(1. - 1. / (gamma5 * gamma5))
291 + 1. / std::sqrt(1. - 1. / (gamma6 * gamma6))
292 + 1. / std::sqrt(1. - 1. / (gamma7 * gamma7))
293 + 1. / std::sqrt(1. - 1. / (gamma8 * gamma8))
294 + 1. / std::sqrt(1. - 1. / (gamma9 * gamma9))
295 + 1. / std::sqrt(1. - 1. / (gamma10 * gamma10)))
296 / (10. * Physics::c);
297}
298
299inline double RFCavity::getdA(
300 const int& i, const std::vector<double>& t, const double& dz, const double& frequency,
301 const std::vector<double>& F) const {
302 double dt = t[i] - t[i - 1];
303 return dz / (frequency * frequency * dt * dt)
304 * (frequency * dt
305 * (F[i] * std::cos(frequency * t[i])
306 - F[i - 1] * std::cos(frequency * t[i - 1]))
307 - (F[i] - F[i - 1]) * (std::sin(frequency * t[i]) - std::sin(frequency * t[i - 1])));
308}
309
310inline double RFCavity::getdB(
311 const int& i, const std::vector<double>& t, const double& dz, const double& frequency,
312 const std::vector<double>& F) const {
313 double dt = t[i] - t[i - 1];
314 return dz / (frequency * frequency * dt * dt)
315 * (frequency * dt
316 * (F[i] * std::sin(frequency * t[i])
317 - F[i - 1] * std::sin(frequency * t[i - 1]))
318 + (F[i] - F[i - 1]) * (std::cos(frequency * t[i]) - std::cos(frequency * t[i - 1])));
319}
320
321inline void RFCavity::setDesignEnergy(const double& ekin, bool) { designEnergy_m = ekin; }
322
323inline double RFCavity::getDesignEnergy() const { return designEnergy_m; }
324
325inline void RFCavity::dropFieldmaps() { fieldmap_m = nullptr; }
326
327inline void RFCavity::setFieldMapFN(const std::string& fn) { filename_m = fn; }
328
329inline void RFCavity::setAmplitudem(double vPeak) { scale_m = vPeak; }
330
331inline double RFCavity::getAmplitudem() const { return scale_m; }
332
333inline void RFCavity::setAmplitudeError(double vPeakError) { scaleError_m = vPeakError; }
334
335inline double RFCavity::getAmplitudeError() const { return scaleError_m; }
336
337inline void RFCavity::setFrequency(double freq) { frequency_m = freq; }
338
339inline void RFCavity::setFrequencym(double freq) { frequency_m = freq; }
340
341inline double RFCavity::getFrequencym() const { return frequency_m; }
342
343inline void RFCavity::setPhasem(double phase) { phase_m = phase; }
344
345inline double RFCavity::getPhasem() const { return phase_m; }
346
347inline double RFCavity::getPhasem(double t) const { return phase_m + t * frequency_m; }
348
349inline void RFCavity::setPhaseError(double phaseError) { phaseError_m = phaseError; }
350
351inline double RFCavity::getPhaseError() const { return phaseError_m; }
352
353inline CavityType RFCavity::getCavityType() const { return type_m; }
354
355inline void RFCavity::setFast(bool fast) { fast_m = fast; }
356
357inline bool RFCavity::getFast() const { return fast_m; }
358
359inline void RFCavity::setAutophaseVeto(bool veto) { autophaseVeto_m = veto; }
360
361inline bool RFCavity::getAutophaseVeto() const { return autophaseVeto_m; }
362
363inline void RFCavity::setAmplitudeModel(std::shared_ptr<AbstractTimeDependence> amplitudeTD) {
364 amplitudeTD_m = amplitudeTD;
365}
366
367inline void RFCavity::setAmplitudeModelName(std::string name) { amplitudeName_m = name; }
368
369inline std::string RFCavity::getAmplitudeModelName() { return amplitudeName_m; }
370
371inline void RFCavity::setPhaseModel(std::shared_ptr<AbstractTimeDependence> phaseTD) {
372 phaseTD_m = phaseTD;
373}
374
375inline void RFCavity::setPhaseModelName(std::string name) { phaseName_m = name; }
376
377inline std::string RFCavity::getPhaseModelName() { return phaseName_m; }
378
379inline void RFCavity::setFrequencyModel(std::shared_ptr<AbstractTimeDependence> frequencyTD) {
380 frequencyTD_m = frequencyTD;
381}
382
383inline void RFCavity::setFrequencyModelName(std::string name) { frequencyName_m = name; }
384
385inline std::string RFCavity::getFrequencyModelName() { return frequencyName_m; }
386
388 CoordinateSystemTrafo ret(Vector_t<double, 3>({0, 0, 0}), Quaternion(1, 0, 0, 0));
389 return ret;
390}
391
394 Vector_t<double, 3>({0, 0, getElementLength()}), Quaternion(1, 0, 0, 0));
395 return ret;
396}
397
398#endif // OPALX_RFCavity_HH
Defines the abstract interface for a single beamline component in the accelerator model.
ippl::Vector< T, Dim > Vector_t
ElementType
Definition ElementBase.h:94
CavityType
Definition RFCavity.h:32
Simple bidirectional map with lookup in both directions.
Definition BiMap.h:28
Rigid spatial transform between a parent frame and a local frame.
Abstract base class for all field maps. It acts as a factory for creating specific field map types ba...
Definition Fieldmap.h:62
Quaternion storage and rotation algebra used by OPALX geometry code.
Interface for standing wave cavities.
Definition RFCavity.h:34
void setFrequencyModel(std::shared_ptr< AbstractTimeDependence > time_dep)
Definition RFCavity.h:379
virtual double getPhasem() const
Definition RFCavity.h:345
virtual bool bends() const override
Definition RFCavity.cpp:277
bool fast_m
Definition RFCavity.h:214
std::string getPhaseModelName()
Definition RFCavity.h:377
virtual double getRmax() const
Definition RFCavity.cpp:305
double phi0_m
Definition RFCavity.h:235
void setPerpenDistance(double pdis)
Definition RFCavity.cpp:297
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:357
virtual double getAzimuth() const
Definition RFCavity.cpp:307
Fieldmap * fieldmap_m
Definition RFCavity.h:219
std::string getAmplitudeModelName()
Definition RFCavity.h:369
virtual void initialise(PartBunch_t *bunch, double &startField, double &endField) override
Definition RFCavity.cpp:195
virtual ElementType getType() const override
Get element type std::string.
Definition RFCavity.cpp:481
virtual void setAmplitudeError(double vPeakError)
Definition RFCavity.h:333
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:261
virtual void accept(BeamlineVisitor &) const override
Apply visitor to RFCavity.
Definition RFCavity.cpp:108
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:310
double designEnergy_m
Definition RFCavity.h:217
std::string filename_m
Definition RFCavity.h:206
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:375
virtual void finalise() override
Definition RFCavity.cpp:275
virtual ~RFCavity()
Definition RFCavity.cpp:106
void setRmin(double rmin)
Definition RFCavity.cpp:291
void operator=(const RFCavity &)
virtual bool apply(const std::shared_ptr< ParticleContainer_t > &pc) override
Applies the Standing Wave RF Cavity field to all particles inside the RF cavity.
Definition RFCavity.cpp:118
void setPhaseModel(std::shared_ptr< AbstractTimeDependence > time_dep)
Definition RFCavity.h:371
virtual double getFrequency() const =0
Get RF frequency.
void setFrequencyModelName(std::string name)
Definition RFCavity.h:383
virtual double getPhase() const =0
Get RF phase.
virtual void getElementDimensions(double &begin, double &end) const override
Return the nominal body extent of the element.
Definition RFCavity.cpp:718
virtual double getCosAzimuth() const
Definition RFCavity.cpp:311
virtual double getAmplitudem() const
Definition RFCavity.h:331
double rmin_m
Definition RFCavity.h:228
double scale_m
Definition RFCavity.h:208
void setFrequency(double freq)
Definition RFCavity.h:337
void setAmplitudeModelName(std::string name)
Definition RFCavity.h:367
virtual bool getAutophaseVeto() const
Definition RFCavity.h:361
double phaseError_m
Definition RFCavity.h:211
virtual void setAmplitudem(double vPeak)
Definition RFCavity.h:329
std::shared_ptr< AbstractTimeDependence > phaseTD_m
Definition RFCavity.h:199
virtual bool getFast() const
Definition RFCavity.h:357
double cosAngle_m
Definition RFCavity.h:232
std::string frequencyName_m
Definition RFCavity.h:204
virtual void setPhaseError(double phaseError)
Definition RFCavity.h:349
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:659
virtual CoordinateSystemTrafo getEdgeToBegin() const override
Definition RFCavity.h:387
std::unique_ptr< double[]> RNormal_m
Definition RFCavity.h:237
std::shared_ptr< AbstractTimeDependence > amplitudeTD_m
Definition RFCavity.h:201
virtual void getFieldExtend(double &zBegin, double &zEnd) const override
Return the field-support interval of the cavity.
Definition RFCavity.cpp:476
double gapwidth_m
Definition RFCavity.h:234
virtual void setPhasem(double phase)
Definition RFCavity.h:343
double sinAngle_m
Definition RFCavity.h:231
virtual double getSinAzimuth() const
Definition RFCavity.cpp:309
void setPhi0(double phi0)
Definition RFCavity.cpp:301
double spline(double z, double *za)
Definition RFCavity.cpp:417
std::shared_ptr< AbstractTimeDependence > frequencyTD_m
Definition RFCavity.h:203
double frequency_m
Definition RFCavity.h:212
virtual std::string getFieldMapFN() const
Definition RFCavity.cpp:330
virtual void setFrequencym(double freq)
Definition RFCavity.h:339
virtual double getFrequencym() const
Definition RFCavity.h:341
std::string phaseName_m
Definition RFCavity.h:200
virtual void setFieldMapFN(const std::string &fmapfn)
Set the name of the field map.
Definition RFCavity.h:327
void setAzimuth(double angle)
Definition RFCavity.cpp:295
std::unique_ptr< double[]> VrNormal_m
Definition RFCavity.h:238
virtual void goOnline(const double &kineticEnergy) override
Definition RFCavity.cpp:279
double pdis_m
Definition RFCavity.h:233
void setCavityType(const std::string &type)
Definition RFCavity.cpp:319
double startField_m
Definition RFCavity.h:220
void dropFieldmaps()
Definition RFCavity.h:325
virtual bool isInside(const Vector_t< double, 3 > &r) const override
Definition RFCavity.cpp:708
virtual CoordinateSystemTrafo getEdgeToEnd() const override
Definition RFCavity.h:392
virtual void setAutophaseVeto(bool veto=true)
Definition RFCavity.h:359
virtual double getCycFrequency() const
Definition RFCavity.cpp:345
virtual double getAmplitudeError() const
Definition RFCavity.h:335
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:299
virtual double getAmplitude() const =0
Get RF amplitude.
virtual double getGapWidth() const
Definition RFCavity.cpp:315
virtual double getAutoPhaseEstimate(const double &E0, const double &t0, const double &q, const double &m)
Definition RFCavity.cpp:524
double rmax_m
Definition RFCavity.h:229
virtual double getPhaseError() const
Definition RFCavity.h:351
double scaleError_m
Definition RFCavity.h:209
static const BiMap< CavityType, std::string > bmCavityTypeString_s
Definition RFCavity.h:32
std::string getFrequencyModelName()
Definition RFCavity.h:385
virtual double getPerpenDistance() const
Definition RFCavity.cpp:313
virtual double getDesignEnergy() const override
Definition RFCavity.h:323
std::string amplitudeName_m
Definition RFCavity.h:202
virtual void setDesignEnergy(const double &ekin, bool changeable=true) override
Definition RFCavity.h:321
void setGapWidth(double gapwidth)
Definition RFCavity.cpp:299
virtual void setFast(bool fast)
Definition RFCavity.h:355
CavityType getCavityType() const
Definition RFCavity.h:353
virtual double getElementLength() const override
Return the nominal body length of the cavity.
Definition RFCavity.cpp:716
double phase_m
Definition RFCavity.h:210
bool autophaseVeto_m
Definition RFCavity.h:215
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
Apply to reference particle with position R and momemtum P.
Definition RFCavity.cpp:180
virtual void goOffline() override
Definition RFCavity.cpp:285
double angle_m
Definition RFCavity.h:230
virtual double getPhi0() const
Definition RFCavity.cpp:317
virtual double getAutoPhaseEstimateFallback(double E0, double t0, double q, double m)
Definition RFCavity.cpp:483
std::string getCavityTypeString() const
Definition RFCavity.cpp:328
void setRmax(double rmax)
Definition RFCavity.cpp:293
void setAmplitudeModel(std::shared_ptr< AbstractTimeDependence > time_dep)
Definition RFCavity.h:363
virtual double getRmin() const
Definition RFCavity.cpp:303
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:273
constexpr double c
The velocity of light in m/s.
Definition Physics.h:60