OPAL (Object Oriented Parallel Accelerator Library)  2024.1
OPAL
TravelingWave.h
Go to the documentation of this file.
1 //
2 // Class TravelingWave
3 // Defines the abstract interface for Traveling Wave.
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_TravelingWave_HH
19 #define CLASSIC_TravelingWave_HH
20 
21 #include "AbsBeamline/RFCavity.h"
22 #include "Physics/Physics.h"
23 #include "Fields/Definitions.h"
24 
25 #include <cmath>
26 
27 class TravelingWave: public RFCavity {
28 
29 public:
30 
32  explicit TravelingWave(const std::string& name);
33 
34  TravelingWave();
36  virtual ~TravelingWave();
37 
39  virtual void accept(BeamlineVisitor&) const override;
40 
42  virtual double getAmplitude() const override = 0;
43 
45  virtual double getFrequency() const override = 0;
46 
48  virtual double getPhase() const override = 0;
49 
50  virtual void setPhasem(double phase) override;
51 
52  void setNumCells(int NumCells);
53 
54  void setMode(double mode);
55 
56  virtual double getAutoPhaseEstimate(const double& E0, const double& t0, const double& q, const double& m) override;
57 
58  virtual bool apply(const size_t& i, const double& t, Vector_t& E, Vector_t& B) override;
59 
60  virtual bool apply(const Vector_t& R, const Vector_t& P, const double& t, Vector_t& E, Vector_t& B) override;
61 
62  virtual bool applyToReferenceParticle(const Vector_t& R, const Vector_t& P, const double& t, Vector_t& E, Vector_t& B) override;
63 
64  virtual void initialise(PartBunchBase<double, 3>* bunch, double& startField, double& endField) override;
65 
66  virtual void finalise() override;
67 
68  virtual bool bends() const override;
69 
70  virtual void goOnline(const double& kineticEnergy) override;
71 
72  virtual void goOffline() override;
73 
74  virtual ElementType getType() const override;
75 
76  virtual void getDimensions(double& zBegin, double& zEnd) const override;
77 
78  virtual bool isInside(const Vector_t& r) const override;
79 
80  virtual void getElementDimensions(double& begin,
81  double& end) const override;
82 
83  virtual CoordinateSystemTrafo getEdgeToBegin() const override;
84  virtual CoordinateSystemTrafo getEdgeToEnd() const override;
85 
86 private:
87  double scaleCore_m;
89 
90  double phaseCore1_m;
91  double phaseCore2_m;
92  double phaseExit_m;
93 
97 
100  double cellLength_m;
101  double mode_m;
102 
103  inline double getdE(const int& i,
104  const int& I,
105  const std::vector<double>& t,
106  const double& phi,
107  const std::vector<std::pair<double, double> >& F) const;
108 
109  inline double getdT(const int& i,
110  const int& I,
111  const std::vector<double>& E,
112  const std::vector<std::pair<double, double> >& F,
113  const double mass) const;
114 
115  inline double getdA(const int& i,
116  const int& I,
117  const std::vector<double>& t,
118  const double& phi,
119  const std::vector<std::pair<double, double> >& F) const;
120 
121  inline double getdB(const int& i,
122  const int& I,
123  const std::vector<double>& t,
124  const double& phi,
125  const std::vector<std::pair<double, double> >& F) const;
126  // Not implemented.
127  void operator=(const TravelingWave&);
128 };
129 
130 double TravelingWave::getdE(const int& i,
131  const int& I,
132  const std::vector<double>& t,
133  const double& phi,
134  const std::vector<std::pair<double, double> >& F) const {
135  return (F[I].first - F[I-1].first) / (frequency_m * frequency_m * (t[i] - t[i-1]) * (t[i] - t[i-1])) *
136  (frequency_m * (t[i] - t[i-1]) * (F[I].second * std::sin(frequency_m * t[i] + phi) - F[I-1].second * std::sin(frequency_m * t[i-1] + phi)) +
137  (F[I].second - F[I-1].second) * (std::cos(frequency_m * t[i] + phi) - std::cos(frequency_m * t[i-1] + phi)));
138 }
139 
140 double TravelingWave::getdT(const int& i,
141  const int& I,
142  const std::vector<double>& E,
143  const std::vector<std::pair<double, double> >& F,
144  const double mass) const {
145  double gamma1 = 1. + (19. * E[i-1] + 1. * E[i]) / (20. * mass);
146  double gamma2 = 1. + (17. * E[i-1] + 3. * E[i]) / (20. * mass);
147  double gamma3 = 1. + (15. * E[i-1] + 5. * E[i]) / (20. * mass);
148  double gamma4 = 1. + (13. * E[i-1] + 7. * E[i]) / (20. * mass);
149  double gamma5 = 1. + (11. * E[i-1] + 9. * E[i]) / (20. * mass);
150  double gamma6 = 1. + (9. * E[i-1] + 11. * E[i]) / (20. * mass);
151  double gamma7 = 1. + (7. * E[i-1] + 13. * E[i]) / (20. * mass);
152  double gamma8 = 1. + (5. * E[i-1] + 15. * E[i]) / (20. * mass);
153  double gamma9 = 1. + (3. * E[i-1] + 17. * E[i]) / (20. * mass);
154  double gamma10 = 1. + (1. * E[i-1] + 19. * E[i]) / (20. * mass);
155  return (F[I].first - F[I-1].first) *
156  (1. / std::sqrt(1. - 1. / (gamma1 * gamma1)) +
157  1. / std::sqrt(1. - 1. / (gamma2 * gamma2)) +
158  1. / std::sqrt(1. - 1. / (gamma3 * gamma3)) +
159  1. / std::sqrt(1. - 1. / (gamma4 * gamma4)) +
160  1. / std::sqrt(1. - 1. / (gamma5 * gamma5)) +
161  1. / std::sqrt(1. - 1. / (gamma6 * gamma6)) +
162  1. / std::sqrt(1. - 1. / (gamma7 * gamma7)) +
163  1. / std::sqrt(1. - 1. / (gamma8 * gamma8)) +
164  1. / std::sqrt(1. - 1. / (gamma9 * gamma9)) +
165  1. / std::sqrt(1. - 1. / (gamma10 * gamma10))) / (10. * Physics::c);
166 }
167 
168 double TravelingWave::getdA(const int& i,
169  const int& I,
170  const std::vector<double>& t,
171  const double& phi,
172  const std::vector<std::pair<double, double> >& F) const {
173  double dt = t[i] - t[i-1];
174  return (F[I].first - F[I-1].first) / (frequency_m * frequency_m * dt * dt) *
175  (frequency_m * dt * (F[I].second * std::cos(frequency_m * t[i] + phi) - F[I-1].second * std::cos(frequency_m * t[i-1] + phi)) -
176  (F[I].second - F[I-1].second) * (std::sin(frequency_m * t[i] + phi) - std::sin(frequency_m * t[i-1] + phi)));
177 }
178 
179 double TravelingWave::getdB(const int& i,
180  const int& I,
181  const std::vector<double>& t,
182  const double& phi,
183  const std::vector<std::pair<double, double> >& F) const {
184  double dt = t[i] - t[i-1];
185  return (F[I].first - F[I-1].first) / (frequency_m * frequency_m * dt * dt) *
186  (frequency_m * dt * (F[I].second * std::sin(frequency_m * t[i] + phi) - F[I-1].second * std::sin(frequency_m * t[i-1] + phi)) +
187  (F[I].second - F[I-1].second) * (std::cos(frequency_m * t[i] + phi) - std::cos(frequency_m * t[i-1] + phi)));
188 }
189 
190 inline
191 void TravelingWave::setPhasem(double phase) {
192  phase_m = phase;
196 }
197 
198 inline
199 void TravelingWave::setNumCells(int NumCells) {
200  numCells_m = NumCells;
201 }
202 
203 inline
205  mode_m = mode;
206 }
207 
208 inline
211  Quaternion(1, 0, 0, 0));
212  return ret;
213 }
214 
215 inline
218  Quaternion(1, 0, 0, 0));
219  return ret;
220 }
221 
222 #endif // CLASSIC_TravelingWave_HH
Tps< T > sqrt(const Tps< T > &x)
Square root.
Definition: TpsMath.h:91
constexpr double c
The velocity of light in m/s.
Definition: Physics.h:45
void setNumCells(int NumCells)
constexpr double two_pi
The value of .
Definition: Physics.h:33
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 void goOffline() override
Vektor< double, 3 > Vector_t
Definition: Vektor.h:6
virtual void goOnline(const double &kineticEnergy) override
virtual CoordinateSystemTrafo getEdgeToEnd() const override
virtual double getFrequency() const override=0
Get RF frequency.
virtual bool apply(const size_t &i, const double &t, Vector_t &E, Vector_t &B) override
virtual bool bends() const override
virtual ElementType getType() const override
Get element type std::string.
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
clearpage the user may choose between constant or variable radius This model includes fringe fields begin
Definition: multipole_t.tex:6
constexpr double pi
The value of .
Definition: Physics.h:30
double mappedStartExitField_m
Definition: TravelingWave.h:96
virtual double getAutoPhaseEstimate(const double &E0, const double &t0, const double &q, const double &m) override
double phaseCore1_m
Definition: TravelingWave.h:90
virtual CoordinateSystemTrafo getEdgeToBegin() const override
virtual bool isInside(const Vector_t &r) const override
virtual void getDimensions(double &zBegin, double &zEnd) const override
double startExitField_m
Definition: TravelingWave.h:95
double phaseCore2_m
Definition: TravelingWave.h:91
virtual double getPhase() const override=0
Get RF phase.
double cellLength_m
virtual double getAmplitude() const override=0
Get RF amplitude.
virtual void setPhasem(double phase) override
double scaleCore_m
Definition: TravelingWave.h:87
if write to the Free Software Temple MA USA Also add information on how to contact you by electronic and paper mail If the program is make it output a short notice like this when it starts in an interactive mode
Definition: LICENSE:307
double phaseExit_m
Definition: TravelingWave.h:92
double phase_m
Definition: RFCavity.h:208
virtual void finalise() override
ElementType
Definition: ElementBase.h:88
double frequency_m
Definition: RFCavity.h:210
virtual void accept(BeamlineVisitor &) const override
Apply visitor to TravelingWave.
double startCoreField_m
Definition: TravelingWave.h:94
Tps< T > cos(const Tps< T > &x)
Cosine.
Definition: TpsMath.h:129
const std::string name
virtual double getElementLength() const override
Get design length.
Definition: RFCavity.cpp:732
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField) override
virtual bool applyToReferenceParticle(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B) override
virtual void getElementDimensions(double &begin, double &end) const override
virtual ~TravelingWave()
Tps< T > sin(const Tps< T > &x)
Sine.
Definition: TpsMath.h:111
void setMode(double mode)
double periodLength_m
Definition: TravelingWave.h:98
double scaleCoreError_m
Definition: TravelingWave.h:88
PETE_TUTree< FnFloor, typename T::PETE_Expr_t > floor(const PETE_Expr< T > &l)
Definition: PETE.h:733
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
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
void operator=(const TravelingWave &)
end
Definition: multipole_t.tex:9