OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
TravelingWave.h
Go to the documentation of this file.
1 #ifndef CLASSIC_TravelingWave_HH
2 #define CLASSIC_TravelingWave_HH
3 
4 // ------------------------------------------------------------------------
5 // $RCSfile: TravelingWave.h,v $
6 // ------------------------------------------------------------------------
7 // $Revision: 1.1.1.1 $
8 // ------------------------------------------------------------------------
9 // Copyright: see Copyright.readme
10 // ------------------------------------------------------------------------
11 //
12 // Class: TravelingWave
13 // Defines the abstract interface for an accelerating structure.
14 //
15 // ------------------------------------------------------------------------
16 // Class category: AbsBeamline
17 // ------------------------------------------------------------------------
18 //
19 // $Date: 2000/03/27 09:32:31 $
20 // $Author: fci $
21 //
22 // ------------------------------------------------------------------------
23 
24 
25 #include "AbsBeamline/RFCavity.h"
26 #include "Physics/Physics.h"
27 
28 class Fieldmap;
29 
30 
31 // Class TravelingWave
32 // ------------------------------------------------------------------------
34 // Class TravelingWave defines the abstract interface for RF cavities.
35 
36 
37 class TravelingWave: public RFCavity {
38 
39 public:
40 
41  enum CavityType { SW, TW };
43  explicit TravelingWave(const std::string &name);
44 
45  TravelingWave();
47  virtual ~TravelingWave();
48 
50  virtual void accept(BeamlineVisitor &) const override;
51 
53  virtual double getAmplitude() const override = 0;
54 
56  virtual double getFrequency() const override = 0;
57 
59  virtual double getPhase() const override = 0;
60 
61  virtual void setPhasem(double phase) override;
62 
63  void setNumCells(int NumCells);
64 
65  void setMode(double mode);
66 
67  virtual double getAutoPhaseEstimate(const double & E0, const double & t0, const double & q, const double & m) override;
68 
69  virtual std::pair<double, double> trackOnAxisParticle(const double & p0,
70  const double & t0,
71  const double & dt,
72  const double & q,
73  const double & mass,
74  std::ofstream *out = NULL) override;
75 
76  virtual void addKR(int i, double t, Vector_t &K) override;
77 
78  virtual void addKT(int i, double t, Vector_t &K) override;
79 
80  virtual bool apply(const size_t &i, const double &t, Vector_t &E, Vector_t &B) override;
81 
82  virtual bool apply(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B) override;
83 
84  virtual bool applyToReferenceParticle(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B) override;
85 
86  virtual void initialise(PartBunchBase<double, 3> *bunch, double &startField, double &endField) override;
87 
88  virtual void finalise() override;
89 
90  virtual bool bends() const override;
91 
92  virtual void goOnline(const double &kineticEnergy) override;
93 
94  virtual void goOffline() override;
95 
96  virtual ElementBase::ElementType getType() const override;
97 
98  virtual void getDimensions(double &zBegin, double &zEnd) const override;
99 
100  virtual bool isInside(const Vector_t &r) const override;
101 
102  virtual double getElementLength() const override;
103  virtual void getElementDimensions(double &begin,
104  double &end) const override;
105 
106  virtual CoordinateSystemTrafo getEdgeToBegin() const override;
107  virtual CoordinateSystemTrafo getEdgeToEnd() const override;
108 
109 private:
111  /* Fieldmap *EntryFringeField_m; */
112  /* Fieldmap *ExitFringeField_m; */
113 
114  double scaleCore_m;
116 
117  double phaseCore1_m;
118  double phaseCore2_m;
119  double phaseExit_m;
120 
121  double length_m;
125 
128  double CellLength_m;
129  double Mode_m;
130 
131  bool fast_m;
132 
135 
136  inline double getdE(const int & i,
137  const int & I,
138  const std::vector<double> & t,
139  const double & phi,
140  const std::vector<std::pair<double, double> > & F) const;
141 
142  inline double getdT(const int & i,
143  const int & I,
144  const std::vector<double> & E,
145  const std::vector<std::pair<double, double> > & F,
146  const double mass) const;
147 
148  inline double getdA(const int & i,
149  const int & I,
150  const std::vector<double> & t,
151  const double & phi,
152  const std::vector<std::pair<double, double> > & F) const;
153 
154  inline double getdB(const int & i,
155  const int & I,
156  const std::vector<double> & t,
157  const double & phi,
158  const std::vector<std::pair<double, double> > & F) const;
159  // Not implemented.
160  void operator=(const TravelingWave &);
161 };
162 
163 double TravelingWave::getdE(const int & i,
164  const int & I,
165  const std::vector<double> & t,
166  const double & phi,
167  const std::vector<std::pair<double, double> > & F) const {
168  return (F[I].first - F[I-1].first) / (frequency_m * frequency_m * (t[i] - t[i-1]) * (t[i] - t[i-1])) *
169  (frequency_m * (t[i] - t[i-1]) * (F[I].second * sin(frequency_m * t[i] + phi) - F[I-1].second * sin(frequency_m * t[i-1] + phi)) +
170  (F[I].second - F[I-1].second) * (cos(frequency_m * t[i] + phi) - cos(frequency_m * t[i-1] + phi)));
171 }
172 
173 double TravelingWave::getdT(const int & i,
174  const int & I,
175  const std::vector<double> & E,
176  const std::vector<std::pair<double, double> > & F,
177  const double mass) const {
178  double gamma1 = 1. + (19. * E[i-1] + 1. * E[i]) / (20. * mass);
179  double gamma2 = 1. + (17. * E[i-1] + 3. * E[i]) / (20. * mass);
180  double gamma3 = 1. + (15. * E[i-1] + 5. * E[i]) / (20. * mass);
181  double gamma4 = 1. + (13. * E[i-1] + 7. * E[i]) / (20. * mass);
182  double gamma5 = 1. + (11. * E[i-1] + 9. * E[i]) / (20. * mass);
183  double gamma6 = 1. + (9. * E[i-1] + 11. * E[i]) / (20. * mass);
184  double gamma7 = 1. + (7. * E[i-1] + 13. * E[i]) / (20. * mass);
185  double gamma8 = 1. + (5. * E[i-1] + 15. * E[i]) / (20. * mass);
186  double gamma9 = 1. + (3. * E[i-1] + 17. * E[i]) / (20. * mass);
187  double gamma10 = 1. + (1. * E[i-1] + 19. * E[i]) / (20. * mass);
188  return (F[I].first - F[I-1].first) *
189  (1. / sqrt(1. - 1. / (gamma1 * gamma1)) +
190  1. / sqrt(1. - 1. / (gamma2 * gamma2)) +
191  1. / sqrt(1. - 1. / (gamma3 * gamma3)) +
192  1. / sqrt(1. - 1. / (gamma4 * gamma4)) +
193  1. / sqrt(1. - 1. / (gamma5 * gamma5)) +
194  1. / sqrt(1. - 1. / (gamma6 * gamma6)) +
195  1. / sqrt(1. - 1. / (gamma7 * gamma7)) +
196  1. / sqrt(1. - 1. / (gamma8 * gamma8)) +
197  1. / sqrt(1. - 1. / (gamma9 * gamma9)) +
198  1. / sqrt(1. - 1. / (gamma10 * gamma10))) / (10. * Physics::c);
199 }
200 
201 double TravelingWave::getdA(const int & i,
202  const int & I,
203  const std::vector<double> & t,
204  const double & phi,
205  const std::vector<std::pair<double, double> > & F) const {
206  double dt = t[i] - t[i-1];
207  return (F[I].first - F[I-1].first) / (frequency_m * frequency_m * dt * dt) *
208  (frequency_m * dt * (F[I].second * cos(frequency_m * t[i] + phi) - F[I-1].second * cos(frequency_m * t[i-1] + phi)) -
209  (F[I].second - F[I-1].second) * (sin(frequency_m * t[i] + phi) - sin(frequency_m * t[i-1] + phi)));
210 }
211 
212 double TravelingWave::getdB(const int & i,
213  const int & I,
214  const std::vector<double> & t,
215  const double & phi,
216  const std::vector<std::pair<double, double> > & F) const {
217  double dt = t[i] - t[i-1];
218  return (F[I].first - F[I-1].first) / (frequency_m * frequency_m * dt * dt) *
219  (frequency_m * dt * (F[I].second * sin(frequency_m * t[i] + phi) - F[I-1].second * sin(frequency_m * t[i-1] + phi)) +
220  (F[I].second - F[I-1].second) * (cos(frequency_m * t[i] + phi) - cos(frequency_m * t[i-1] + phi)));
221 }
222 
223 inline
224 void TravelingWave::setPhasem(double phase) {
225  using Physics::pi;
226 
227  phase_m = phase;
228  phaseCore1_m = phase_m + pi * Mode_m / 2.0;
229  phaseCore2_m = phase_m + pi * Mode_m * 1.5;
230  phaseExit_m = phase_m - 2.0 * pi * ((NumCells_m - 1) * Mode_m - std::floor((NumCells_m - 1) * Mode_m));
231 }
232 
233 inline
234 void TravelingWave::setNumCells(int NumCells) {
235  NumCells_m = NumCells;
236 }
237 
238 inline
239 void TravelingWave::setMode(double mode) {
240  Mode_m = mode;
241 }
242 
243 inline
245 {
247  Quaternion(1, 0, 0, 0));
248 
249  return ret;
250 }
251 
252 inline
254 {
256  Quaternion(1, 0, 0, 0));
257 
258  return ret;
259 }
260 
261 #endif // CLASSIC_TravelingWave_HH
void operator=(const TravelingWave &)
virtual void setPhasem(double phase) override
virtual CoordinateSystemTrafo getEdgeToBegin() const override
CavityType
Definition: RFCavity.h:41
double scaleCoreError_m
virtual void accept(BeamlineVisitor &) const override
Apply visitor to TravelingWave.
virtual double getPhase() const override=0
Get RF phase.
Definition: TSVMeta.h:24
double getdE(const int &i, const int &I, const std::vector< double > &t, const double &phi, const std::vector< std::pair< double, double > > &F) const
double phaseCore1_m
virtual void goOffline() override
virtual double getAmplitude() const override=0
Get RF amplitude.
Tps< T > sin(const Tps< T > &x)
Sine.
Definition: TpsMath.h:111
virtual bool apply(const size_t &i, const double &t, Vector_t &E, Vector_t &B) override
virtual void addKR(int i, double t, Vector_t &K) override
double getdT(const int &i, const int &I, const std::vector< double > &E, const std::vector< std::pair< double, double > > &F, const double mass) const
virtual void finalise() override
double designEnergy_m
double phaseCore2_m
double getdB(const int &i, const int &I, const std::vector< double > &t, const double &phi, const std::vector< std::pair< double, double > > &F) const
virtual void getElementDimensions(double &begin, double &end) const override
double startExitField_m
virtual void goOnline(const double &kineticEnergy) override
virtual ElementBase::ElementType getType() const override
Get element type std::string.
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField) override
constexpr double pi
The value of .
Definition: Physics.h:31
virtual void getDimensions(double &zBegin, double &zEnd) const override
virtual bool isInside(const Vector_t &r) const override
Fieldmap * CoreFieldmap_m
virtual double getElementLength() const override
Get design length.
double scaleCore_m
const double pi
Definition: fftpack.cpp:894
constexpr double c
The velocity of light in m/s.
Definition: Physics.h:52
void setNumCells(int NumCells)
double PeriodLength_m
Interface for RF cavity.
Definition: TravelingWave.h:37
virtual CoordinateSystemTrafo getEdgeToEnd() const override
Vektor< double, 3 > Vector_t
Definition: Vektor.h:6
double phaseExit_m
Tps< T > sqrt(const Tps< T > &x)
Square root.
Definition: TpsMath.h:91
double frequency_m
Definition: RFCavity.h:225
double CellLength_m
virtual double getAutoPhaseEstimate(const double &E0, const double &t0, const double &q, const double &m) override
virtual void addKT(int i, double t, Vector_t &K) override
virtual std::pair< double, double > trackOnAxisParticle(const double &p0, const double &t0, const double &dt, const double &q, const double &mass, std::ofstream *out=NULL) override
Interface for RF cavity.
Definition: RFCavity.h:37
Tps< T > cos(const Tps< T > &x)
Cosine.
Definition: TpsMath.h:129
const std::string name
double phase_m
Definition: RFCavity.h:223
void setMode(double mode)
double mappedStartExitField_m
#define K
Definition: integrate.cpp:118
virtual bool bends() const override
Abstract algorithm.
virtual double getFrequency() const override=0
Get RF frequencey.
virtual ~TravelingWave()
double startCoreField_m
PETE_TUTree< FnFloor, typename T::PETE_Expr_t > floor(const PETE_Expr< T > &l)
Definition: PETE.h:816
double getdA(const int &i, const int &I, const std::vector< double > &t, const double &phi, const std::vector< std::pair< double, double > > &F) const
virtual bool applyToReferenceParticle(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B) override