18#ifndef OPALX_TravelingWave_HH
19#define OPALX_TravelingWave_HH
49 virtual void setPhasem(
double phase)
override;
56 const double& E0,
const double& t0,
const double& q,
const double& m)
override;
58 virtual bool apply(
const std::shared_ptr<ParticleContainer_t>& pc)
override;
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;
81 virtual bool bends()
const override;
83 virtual void goOnline(
const double& kineticEnergy)
override;
96 virtual void getFieldExtend(
double& zBegin,
double& zEnd)
const override;
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;
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;
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;
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;
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)
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)
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)))
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];
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)
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];
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)
ippl::Vector< T, Dim > Vector_t
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...
Quaternion storage and rotation algebra used by OPALX geometry code.
Interface for standing wave cavities.
virtual double getElementLength() const override
Return the nominal body length of the cavity.
Interface for traveling wave cavities.
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
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
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
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.
constexpr double c
The velocity of light in m/s.
constexpr double pi
The value of.