OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
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 OPALX_TravelingWave_HH
19#define OPALX_TravelingWave_HH
20
22#include "Physics/Physics.h"
23
24#include <cmath>
25
26class Fieldmap;
27
28class TravelingWave : public RFCavity {
29public:
31 explicit TravelingWave(const std::string& name);
32
35 virtual ~TravelingWave();
36
38 virtual void accept(BeamlineVisitor&) const override;
39
41 virtual double getAmplitude() const override = 0;
42
44 virtual double getFrequency() const override = 0;
45
47 virtual double getPhase() const override = 0;
48
49 virtual void setPhasem(double phase) override;
50
51 void setNumCells(int NumCells);
52
53 void setMode(double mode);
54
55 virtual double getAutoPhaseEstimate(
56 const double& E0, const double& t0, const double& q, const double& m) override;
57
58 virtual bool apply(const std::shared_ptr<ParticleContainer_t>& pc) override;
59
60 virtual bool apply(
61 const size_t& i, const double& t, Vector_t<double, 3>& E,
62 Vector_t<double, 3>& B) override;
63
64 virtual bool apply(
65 const Vector_t<double, 3>& R, const Vector_t<double, 3>& P, const double& t,
67
68 virtual bool applyToReferenceParticle(
69 const Vector_t<double, 3>& R, const Vector_t<double, 3>& P, const double& t,
71
72 virtual void initialise(PartBunch_t* bunch, double& startField, double& endField) override;
73
74 virtual void initialise(
75 PartBunch_t* bunch, std::shared_ptr<AbstractTimeDependence> freq_atd,
76 std::shared_ptr<AbstractTimeDependence> ampl_atd,
77 std::shared_ptr<AbstractTimeDependence> phase_atd) override;
78
79 virtual void finalise() override;
80
81 virtual bool bends() const override;
82
83 virtual void goOnline(const double& kineticEnergy) override;
84
85 virtual void goOffline() override;
86
87 virtual ElementType getType() const override;
88
96 virtual void getFieldExtend(double& zBegin, double& zEnd) const override;
97
98 virtual bool isInside(const Vector_t<double, 3>& r) const override;
99
100 virtual void getElementDimensions(double& begin, double& end) const override;
101
102 virtual CoordinateSystemTrafo getEdgeToBegin() const override;
103 virtual CoordinateSystemTrafo getEdgeToEnd() const override;
104
105private:
108
112
116
120 double mode_m;
121
122 inline double getdE(
123 const int& i, const int& I, const std::vector<double>& t, const double& phi,
124 const std::vector<std::pair<double, double> >& F) const;
125
126 inline double getdT(
127 const int& i, const int& I, const std::vector<double>& E,
128 const std::vector<std::pair<double, double> >& F, const double mass) const;
129
130 inline double getdA(
131 const int& i, const int& I, const std::vector<double>& t, const double& phi,
132 const std::vector<std::pair<double, double> >& F) const;
133
134 inline double getdB(
135 const int& i, const int& I, const std::vector<double>& t, const double& phi,
136 const std::vector<std::pair<double, double> >& F) const;
137 // Not implemented.
139};
140
142 const int& i, const int& I, const std::vector<double>& t, const double& phi,
143 const std::vector<std::pair<double, double> >& F) const {
144 return (F[I].first - F[I - 1].first)
145 / (frequency_m * frequency_m * (t[i] - t[i - 1]) * (t[i] - t[i - 1]))
146 * (frequency_m * (t[i] - t[i - 1])
147 * (F[I].second * std::sin(frequency_m * t[i] + phi)
148 - F[I - 1].second * std::sin(frequency_m * t[i - 1] + phi))
149 + (F[I].second - F[I - 1].second)
150 * (std::cos(frequency_m * t[i] + phi)
151 - std::cos(frequency_m * t[i - 1] + phi)));
152}
153
155 const int& i, const int& I, const std::vector<double>& E,
156 const std::vector<std::pair<double, double> >& F, const double mass) const {
157 double gamma1 = 1. + (19. * E[i - 1] + 1. * E[i]) / (20. * mass);
158 double gamma2 = 1. + (17. * E[i - 1] + 3. * E[i]) / (20. * mass);
159 double gamma3 = 1. + (15. * E[i - 1] + 5. * E[i]) / (20. * mass);
160 double gamma4 = 1. + (13. * E[i - 1] + 7. * E[i]) / (20. * mass);
161 double gamma5 = 1. + (11. * E[i - 1] + 9. * E[i]) / (20. * mass);
162 double gamma6 = 1. + (9. * E[i - 1] + 11. * E[i]) / (20. * mass);
163 double gamma7 = 1. + (7. * E[i - 1] + 13. * E[i]) / (20. * mass);
164 double gamma8 = 1. + (5. * E[i - 1] + 15. * E[i]) / (20. * mass);
165 double gamma9 = 1. + (3. * E[i - 1] + 17. * E[i]) / (20. * mass);
166 double gamma10 = 1. + (1. * E[i - 1] + 19. * E[i]) / (20. * mass);
167 return (F[I].first - F[I - 1].first)
168 * (1. / std::sqrt(1. - 1. / (gamma1 * gamma1))
169 + 1. / std::sqrt(1. - 1. / (gamma2 * gamma2))
170 + 1. / std::sqrt(1. - 1. / (gamma3 * gamma3))
171 + 1. / std::sqrt(1. - 1. / (gamma4 * gamma4))
172 + 1. / std::sqrt(1. - 1. / (gamma5 * gamma5))
173 + 1. / std::sqrt(1. - 1. / (gamma6 * gamma6))
174 + 1. / std::sqrt(1. - 1. / (gamma7 * gamma7))
175 + 1. / std::sqrt(1. - 1. / (gamma8 * gamma8))
176 + 1. / std::sqrt(1. - 1. / (gamma9 * gamma9))
177 + 1. / std::sqrt(1. - 1. / (gamma10 * gamma10)))
178 / (10. * Physics::c);
179}
180
182 const int& i, const int& I, const std::vector<double>& t, 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
187 * (F[I].second * std::cos(frequency_m * t[i] + phi)
188 - F[I - 1].second * std::cos(frequency_m * t[i - 1] + phi))
189 - (F[I].second - F[I - 1].second)
190 * (std::sin(frequency_m * t[i] + phi)
191 - std::sin(frequency_m * t[i - 1] + phi)));
192}
193
195 const int& i, const int& I, const std::vector<double>& t, const double& phi,
196 const std::vector<std::pair<double, double> >& F) const {
197 double dt = t[i] - t[i - 1];
198 return (F[I].first - F[I - 1].first) / (frequency_m * frequency_m * dt * dt)
199 * (frequency_m * dt
200 * (F[I].second * std::sin(frequency_m * t[i] + phi)
201 - F[I - 1].second * std::sin(frequency_m * t[i - 1] + phi))
202 + (F[I].second - F[I - 1].second)
203 * (std::cos(frequency_m * t[i] + phi)
204 - std::cos(frequency_m * t[i - 1] + phi)));
205}
206
207inline void TravelingWave::setPhasem(double phase) {
208 phase_m = phase;
212 phase_m
213 - Physics::two_pi * ((numCells_m - 1) * mode_m - std::floor((numCells_m - 1) * mode_m));
214}
215
216inline void TravelingWave::setNumCells(int NumCells) { numCells_m = NumCells; }
217
218inline void TravelingWave::setMode(double mode) { mode_m = mode; }
219
221 CoordinateSystemTrafo ret(Vector_t<double, 3>({0, 0, 0}), Quaternion(1, 0, 0, 0));
222 return ret;
223}
224
227 Vector_t<double, 3>({0, 0, getElementLength()}), Quaternion(1, 0, 0, 0));
228 return ret;
229}
230
231#endif // OPALX_TravelingWave_HH
ippl::Vector< T, Dim > Vector_t
ElementType
Definition ElementBase.h:94
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
double frequency_m
Definition RFCavity.h:212
virtual double getElementLength() const override
Return the nominal body length of the cavity.
Definition RFCavity.cpp:716
double phase_m
Definition RFCavity.h:210
Interface for traveling wave cavities.
double periodLength_m
double mappedStartExitField_m
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 double getAmplitude() const override=0
Get RF amplitude.
virtual ElementType getType() const override
Get element type std::string.
virtual double getPhase() const override=0
Get RF phase.
virtual bool bends() const override
virtual void accept(BeamlineVisitor &) const override
Apply visitor to TravelingWave.
virtual double getFrequency() const override=0
Get RF frequency.
virtual void getFieldExtend(double &zBegin, double &zEnd) const override
Return the field-support interval of the traveling-wave structure.
void setNumCells(int NumCells)
void setMode(double mode)
void operator=(const TravelingWave &)
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 setPhasem(double phase) override
virtual double getAutoPhaseEstimate(const double &E0, const double &t0, const double &q, const double &m) override
double startExitField_m
virtual void goOffline() override
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
virtual void initialise(PartBunch_t *bunch, double &startField, double &endField) override
virtual CoordinateSystemTrafo getEdgeToEnd() const override
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.
virtual void finalise() override
virtual bool isInside(const Vector_t< double, 3 > &r) const override
double scaleCoreError_m
virtual ~TravelingWave()
virtual CoordinateSystemTrafo getEdgeToBegin() const override
virtual void getElementDimensions(double &begin, double &end) const override
Return the nominal body extent of the element.
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
double startCoreField_m
virtual void goOnline(const double &kineticEnergy) override
virtual bool apply(const std::shared_ptr< ParticleContainer_t > &pc) override
Applies the Traveling Wave RF Cavity field to all particles inside the RF cavity Note: The field is a...
constexpr double two_pi
The value of.
Definition Physics.h:40
constexpr double c
The velocity of light in m/s.
Definition Physics.h:60
constexpr double pi
The value of.
Definition Physics.h:36