18#ifndef OPALX_RFCavity_HH
19#define OPALX_RFCavity_HH
37 explicit RFCavity(
const std::string& name);
82 virtual void setFast(
bool fast);
89 const double& E0,
const double& t0,
const double& q,
const double& m);
93 const double& p0,
const double& t0,
const double& dt,
const double& q,
94 const double& mass, std::ofstream* out =
nullptr);
96 virtual bool apply(
const std::shared_ptr<ParticleContainer_t>& pc)
override;
113 PartBunch_t* bunch, std::shared_ptr<AbstractTimeDependence> freq_atd,
114 std::shared_ptr<AbstractTimeDependence> ampl_atd,
115 std::shared_ptr<AbstractTimeDependence> phase_atd);
119 virtual bool bends()
const override;
121 virtual void goOnline(
const double& kineticEnergy)
override;
125 virtual void setDesignEnergy(
const double& ekin,
bool changeable =
true)
override;
129 virtual double getRmin()
const;
132 virtual double getRmax()
const;
144 virtual double getPhi0()
const;
153 const double normalRadius,
double momentum[],
const double t,
const double dtCorrt,
154 const int PID,
const double restMass,
const int chargenumber);
156 double spline(
double z,
double* za);
169 virtual void getFieldExtend(
double& zBegin,
double& zEnd)
const override;
177 void setPhaseModel(std::shared_ptr<AbstractTimeDependence> time_dep);
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;
247 const int& i,
const std::vector<double>& E,
const double& dz,
const double mass)
const;
250 const int& i,
const std::vector<double>& t,
const double& dz,
const double& frequency,
251 const std::vector<double>& F)
const;
254 const int& i,
const std::vector<double>& t,
const double& dz,
const double& frequency,
255 const std::vector<double>& F)
const;
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))
269 * (std::cos(frequency * t[i] + phi)
270 - std::cos(frequency * t[i - 1] + phi)));
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);
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)))
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)
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])));
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)
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])));
Defines the abstract interface for a single beamline component in the accelerator model.
ippl::Vector< T, Dim > Vector_t
Simple bidirectional map with lookup in both directions.
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.
void setFrequencyModel(std::shared_ptr< AbstractTimeDependence > time_dep)
virtual double getPhasem() const
virtual bool bends() const override
std::string getPhaseModelName()
virtual double getRmax() const
void setPerpenDistance(double pdis)
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
virtual double getAzimuth() const
std::string getAmplitudeModelName()
virtual void initialise(PartBunch_t *bunch, double &startField, double &endField) override
virtual ElementType getType() const override
Get element type std::string.
virtual void setAmplitudeError(double vPeakError)
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
virtual void accept(BeamlineVisitor &) const override
Apply visitor to RFCavity.
double getdB(const int &i, const std::vector< double > &t, const double &dz, const double &frequency, const std::vector< double > &F) const
std::unique_ptr< double[]> DvDr_m
void setPhaseModelName(std::string name)
virtual void finalise() override
void setRmin(double rmin)
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.
void setPhaseModel(std::shared_ptr< AbstractTimeDependence > time_dep)
virtual double getFrequency() const =0
Get RF frequency.
void setFrequencyModelName(std::string name)
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.
virtual double getCosAzimuth() const
virtual double getAmplitudem() const
void setFrequency(double freq)
void setAmplitudeModelName(std::string name)
virtual bool getAutophaseVeto() const
virtual void setAmplitudem(double vPeak)
std::shared_ptr< AbstractTimeDependence > phaseTD_m
virtual bool getFast() const
std::string frequencyName_m
virtual void setPhaseError(double phaseError)
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)
virtual CoordinateSystemTrafo getEdgeToBegin() const override
std::unique_ptr< double[]> RNormal_m
std::shared_ptr< AbstractTimeDependence > amplitudeTD_m
virtual void getFieldExtend(double &zBegin, double &zEnd) const override
Return the field-support interval of the cavity.
virtual void setPhasem(double phase)
virtual double getSinAzimuth() const
void setPhi0(double phi0)
double spline(double z, double *za)
std::shared_ptr< AbstractTimeDependence > frequencyTD_m
virtual std::string getFieldMapFN() const
virtual void setFrequencym(double freq)
virtual double getFrequencym() const
virtual void setFieldMapFN(const std::string &fmapfn)
Set the name of the field map.
void setAzimuth(double angle)
std::unique_ptr< double[]> VrNormal_m
virtual void goOnline(const double &kineticEnergy) override
void setCavityType(const std::string &type)
virtual bool isInside(const Vector_t< double, 3 > &r) const override
virtual CoordinateSystemTrafo getEdgeToEnd() const override
virtual void setAutophaseVeto(bool veto=true)
virtual double getCycFrequency() const
virtual double getAmplitudeError() const
double getdA(const int &i, const std::vector< double > &t, const double &dz, const double &frequency, const std::vector< double > &F) const
virtual double getAmplitude() const =0
Get RF amplitude.
virtual double getGapWidth() const
virtual double getAutoPhaseEstimate(const double &E0, const double &t0, const double &q, const double &m)
virtual double getPhaseError() const
static const BiMap< CavityType, std::string > bmCavityTypeString_s
std::string getFrequencyModelName()
virtual double getPerpenDistance() const
virtual double getDesignEnergy() const override
std::string amplitudeName_m
virtual void setDesignEnergy(const double &ekin, bool changeable=true) override
void setGapWidth(double gapwidth)
virtual void setFast(bool fast)
CavityType getCavityType() const
virtual double getElementLength() const override
Return the nominal body length of the cavity.
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 goOffline() override
virtual double getPhi0() const
virtual double getAutoPhaseEstimateFallback(double E0, double t0, double q, double m)
std::string getCavityTypeString() const
void setRmax(double rmax)
void setAmplitudeModel(std::shared_ptr< AbstractTimeDependence > time_dep)
virtual double getRmin() const
double getdT(const int &i, const std::vector< double > &E, const double &dz, const double mass) const
constexpr double c
The velocity of light in m/s.