18#ifndef CLASSIC_RFCavity_HH
19#define CLASSIC_RFCavity_HH
85 virtual
void setFast(
bool fast);
91 virtual
double getAutoPhaseEstimate(const
double& E0, const
double& t0, const
double& q, const
double& m);
99 std::ofstream *out =
nullptr);
101 virtual
bool apply(const
size_t& i,
127 virtual
bool bends() const override;
129 virtual
void goOnline(const
double& kineticEnergy) override;
133 virtual
void setDesignEnergy(const
double& ekin,
bool changeable = true) override;
137 virtual
double getRmin() const;
140 virtual
double getRmax() const;
152 virtual
double getPhi0() const;
163 const
double dtCorrt,
165 const
double restMass,
166 const
int chargenumber);
168 double spline(
double z,
double* za);
172 virtual
void getDimensions(
double& zBegin,
double& zEnd) const override;
190 double&
end) const override;
238 double getdE(const
int& i,
239 const
std::vector<
double>& t,
242 const
double& frequency,
243 const
std::vector<
double>& F) const;
245 double getdT(const
int& i,
246 const
std::vector<
double>& E,
248 const
double mass) const;
250 double getdA(const
int& i,
251 const
std::vector<
double>& t,
253 const
double& frequency,
254 const
std::vector<
double>& F) const;
256 double getdB(const
int& i,
257 const
std::vector<
double>& t,
259 const
double& frequency,
260 const
std::vector<
double>& F) const;
268 const
std::vector<
double>& t,
271 const
double& frequency,
272 const
std::vector<
double>& F)
const {
273 return dz / (frequency * frequency * (t[i] - t[i-1]) * (t[i] - t[i-1])) *
274 (frequency * (t[i] - t[i-1]) * (F[i] * std::sin(frequency * t[i] + phi) - F[i-1] * std::sin(frequency * t[i-1] + phi)) +
275 (F[i] - F[i-1]) * (std::cos(frequency * t[i] + phi) - std::cos(frequency * t[i-1] + phi)));
280 const std::vector<double>& E,
282 const double mass)
const {
283 double gamma1 = 1. + (19. * E[i-1] + 1. * E[i]) / (20. * mass);
284 double gamma2 = 1. + (17. * E[i-1] + 3. * E[i]) / (20. * mass);
285 double gamma3 = 1. + (15. * E[i-1] + 5. * E[i]) / (20. * mass);
286 double gamma4 = 1. + (13. * E[i-1] + 7. * E[i]) / (20. * mass);
287 double gamma5 = 1. + (11. * E[i-1] + 9. * E[i]) / (20. * mass);
288 double gamma6 = 1. + (9. * E[i-1] + 11. * E[i]) / (20. * mass);
289 double gamma7 = 1. + (7. * E[i-1] + 13. * E[i]) / (20. * mass);
290 double gamma8 = 1. + (5. * E[i-1] + 15. * E[i]) / (20. * mass);
291 double gamma9 = 1. + (3. * E[i-1] + 17. * E[i]) / (20. * mass);
292 double gamma10 = 1. + (1. * E[i-1] + 19. * E[i]) / (20. * mass);
294 (1. / std::sqrt(1. - 1. / (gamma1 * gamma1)) +
295 1. / std::sqrt(1. - 1. / (gamma2 * gamma2)) +
296 1. / std::sqrt(1. - 1. / (gamma3 * gamma3)) +
297 1. / std::sqrt(1. - 1. / (gamma4 * gamma4)) +
298 1. / std::sqrt(1. - 1. / (gamma5 * gamma5)) +
299 1. / std::sqrt(1. - 1. / (gamma6 * gamma6)) +
300 1. / std::sqrt(1. - 1. / (gamma7 * gamma7)) +
301 1. / std::sqrt(1. - 1. / (gamma8 * gamma8)) +
302 1. / std::sqrt(1. - 1. / (gamma9 * gamma9)) +
303 1. / std::sqrt(1. - 1. / (gamma10 * gamma10))) / (10. *
Physics::c);
308 const std::vector<double>& t,
310 const double& frequency,
311 const std::vector<double>& F)
const {
312 double dt = t[i] - t[i-1];
313 return dz / (frequency * frequency * dt * dt) *
314 (frequency * dt * (F[i] * std::cos(frequency * t[i]) - F[i-1] * std::cos(frequency * t[i-1])) -
315 (F[i] - F[i-1]) * (std::sin(frequency * t[i]) - std::sin(frequency * t[i-1])));
320 const std::vector<double>& t,
322 const double& frequency,
323 const std::vector<double>& F)
const {
324 double dt = t[i] - t[i-1];
325 return dz / (frequency * frequency * dt * dt) *
326 (frequency * dt * (F[i] * std::sin(frequency * t[i]) - F[i-1] * std::sin(frequency * t[i-1])) +
327 (F[i] - F[i-1]) * (std::cos(frequency * t[i]) - std::cos(frequency * t[i-1])));
PartBunchBase< T, Dim >::ConstIterator end(PartBunchBase< T, Dim > const &bunch)
PartBunchBase< T, Dim >::ConstIterator begin(PartBunchBase< T, Dim > const &bunch)
std::shared_ptr< _Fieldmap > Fieldmap
constexpr double c
The velocity of light in m/s.
Interface for a single beam element.
void setFrequencyModel(std::shared_ptr< AbstractTimeDependence > time_dep)
virtual bool isInside(const Vector_t &r) const override
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 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
void setCavityType(std::string_view type) noexcept
std::unique_ptr< double[]> DvDr_m
CavityType getCavityType() const noexcept
void setPhaseModelName(std::string name)
virtual void finalise() override
void setRmin(double rmin)
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
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
virtual void initialise(PartBunchBase< double, 3 > *bunch, double &startField, double &endField) override
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::string getCavityTypeString() const noexcept
std::unique_ptr< double[]> RNormal_m
std::shared_ptr< AbstractTimeDependence > amplitudeTD_m
virtual void setPhasem(double phase)
virtual double getSinAzimuth() const
void setPhi0(double phi0)
virtual bool applyToReferenceParticle(const Vector_t &R, const Vector_t &P, const double &t, Vector_t &E, Vector_t &B) override
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
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 void getDimensions(double &zBegin, double &zEnd) const override
virtual double getPhaseError() const
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)
virtual double getElementLength() const override
Get design length.
virtual bool apply(const size_t &i, const double &t, Vector_t &E, Vector_t &B) override
virtual void goOffline() override
virtual double getPhi0() const
virtual double getAutoPhaseEstimateFallback(double E0, double t0, double q, double m)
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
Vektor< double, 3 > Vector_t