OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
VariableRFCavity.h
Go to the documentation of this file.
1//
2// Class VariableRFCavity
3// Defines the abstract interface for a RF Cavity
4// with Time Dependent Parameters.
5//
6// Copyright (c) 2014 - 2023, Chris Rogers, STFC Rutherford Appleton Laboratory, Didcot, UK
7// All rights reserved
8//
9// This file is part of OPAL.
10//
11// OPAL is free software: you can redistribute it and/or modify
12// it under the terms of the GNU General Public License as published by
13// the Free Software Foundation, either version 3 of the License, or
14// (at your option) any later version.
15//
16// You should have received a copy of the GNU General Public License
17// along with OPAL. If not, see <https://www.gnu.org/licenses/>.
18//
19#ifndef ABSBEAMLINE_VARIABLERFCAVITY_HH
20#define ABSBEAMLINE_VARIABLERFCAVITY_HH
21
25#include "Fields/EMField.h"
26#include "Physics/Physics.h"
27
40public:
42 explicit VariableRFCavity(const std::string& name);
53 ~VariableRFCavity() override = default;
54
60 void accept(BeamlineVisitor&) const override;
61
63 ElementBase* clone() const override;
64
66 bool apply(const std::shared_ptr<ParticleContainer_t>& pc) override;
67
77 bool apply(const size_t& i, const double& t, Vector_t<double, 3>& E, Vector_t<double, 3>& B)
78 override;
79
90 bool apply(
91 const Vector_t<double, 3>& R, const Vector_t<double, 3>& P, const double& t,
93
105 const Vector_t<double, 3>& R, const Vector_t<double, 3>& P, const double& t,
107
112 void initialise(PartBunch_t* bunch, double& startField, double& endField) override;
113
118 void finalise() override;
119
121 bool bends() const override { return false; }
122
129 void getFieldExtend(double& zBegin, double& zEnd) const override {
130 zBegin = 0.0;
131 zEnd = getElementLength();
132 }
133
140 virtual double getAmplitude(const double time) const { return amplitudeTD_m->getValue(time); }
141
148 virtual double getFrequency(const double time) const { return frequencyTD_m->getValue(time); }
149
156 virtual double getPhase(const double time) const { return phaseTD_m->getValue(time); }
157
159 virtual double getHeight() const { return halfHeight_m * 2; }
161 virtual double getWidth() const { return halfWidth_m * 2; }
163 virtual double getLength() const { return length_m; }
165 virtual void setHeight(const double fullHeight) { halfHeight_m = fullHeight / 2; }
167 virtual void setWidth(const double fullWidth) { halfWidth_m = fullWidth / 2; }
169 virtual void setLength(double length);
170
172 virtual std::shared_ptr<AbstractTimeDependence> getAmplitudeModel() const;
174 virtual std::shared_ptr<AbstractTimeDependence> getPhaseModel() const;
176 virtual std::shared_ptr<AbstractTimeDependence> getFrequencyModel() const;
177
179 virtual void setAmplitudeModel(std::shared_ptr<AbstractTimeDependence> amplitude_td);
181 virtual void setPhaseModel(std::shared_ptr<AbstractTimeDependence> phase_td);
183 virtual void setFrequencyModel(std::shared_ptr<AbstractTimeDependence> frequency_td);
184
189 virtual void setAmplitudeName(const std::string& amplitude) { amplitudeName_m = amplitude; }
190
195 virtual void setPhaseName(const std::string& phase) { phaseName_m = phase; }
196
201 virtual void setFrequencyName(const std::string& frequency) { frequencyName_m = frequency; }
202
204 StraightGeometry& getGeometry() override;
206 const StraightGeometry& getGeometry() const override;
207
213 void initialiseTimeDependencies() const;
214
216 EMField& getField() override;
218 const EMField& getField() const override;
219
220protected:
221 void initNull();
222 mutable std::shared_ptr<AbstractTimeDependence> phaseTD_m;
223 mutable std::shared_ptr<AbstractTimeDependence> amplitudeTD_m;
224 mutable std::shared_ptr<AbstractTimeDependence> frequencyTD_m;
225 std::string phaseName_m;
226 std::string amplitudeName_m;
227 std::string frequencyName_m;
230 double length_m;
231
234
235 /* The host/device compute function */
236 static KOKKOS_INLINE_FUNCTION bool computeField(
237 const Vector_t<double, 3>& R, Vector_t<double, 3>& E, double E0, double integralF,
238 double phi, double halfWidth, double halfHeight, double length);
239};
240
241KOKKOS_INLINE_FUNCTION bool VariableRFCavity::computeField(
242 const Vector_t<double, 3>& R, Vector_t<double, 3>& E, const double E0,
243 const double integralF, const double phi, const double halfWidth, const double halfHeight,
244 const double length) {
245 if (R[2] < 0.0 || R[2] >= length) {
246 return false;
247 }
248 E[2] += E0 * Kokkos::sin(Physics::two_pi * integralF + phi);
249 const bool outsideAperture = Kokkos::abs(R[0]) > halfWidth || Kokkos::abs(R[1]) > halfHeight;
250 return outsideAperture;
251}
252
253#endif // ABSBEAMLINE_VARIABLERFCAVITY_HH
Defines the abstract interface for a single beamline component in the accelerator model.
ippl::Vector< T, Dim > Vector_t
Abstract base class for electromagnetic fields.
Definition EMField.h:171
virtual double getElementLength() const
Get design length.
A geometry representing a straight line.
virtual void setFrequencyModel(std::shared_ptr< AbstractTimeDependence > frequency_td)
bool apply(const std::shared_ptr< ParticleContainer_t > &pc) override
std::shared_ptr< AbstractTimeDependence > frequencyTD_m
StraightGeometry geometry
The cavity's geometry.
void initialiseTimeDependencies() const
virtual double getFrequency(const double time) const
virtual double getAmplitude(const double time) const
~VariableRFCavity() override=default
void finalise() override
virtual double getHeight() const
std::string amplitudeName_m
virtual void setPhaseName(const std::string &phase)
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
std::string phaseName_m
std::string frequencyName_m
void getFieldExtend(double &zBegin, double &zEnd) const override
virtual void setWidth(const double fullWidth)
bool bends() const override
virtual std::shared_ptr< AbstractTimeDependence > getFrequencyModel() const
virtual void setAmplitudeName(const std::string &amplitude)
virtual double getLength() const
static KOKKOS_INLINE_FUNCTION bool computeField(const Vector_t< double, 3 > &R, Vector_t< double, 3 > &E, double E0, double integralF, double phi, double halfWidth, double halfHeight, double length)
virtual std::shared_ptr< AbstractTimeDependence > getAmplitudeModel() const
virtual void setLength(double length)
std::shared_ptr< AbstractTimeDependence > amplitudeTD_m
void accept(BeamlineVisitor &) const override
virtual double getPhase(const double time) const
virtual void setFrequencyName(const std::string &frequency)
virtual std::shared_ptr< AbstractTimeDependence > getPhaseModel() const
void initialise(PartBunch_t *bunch, double &startField, double &endField) override
ElementBase * clone() const override
EMField & getField() override
Not implemented.
std::shared_ptr< AbstractTimeDependence > phaseTD_m
virtual void setAmplitudeModel(std::shared_ptr< AbstractTimeDependence > amplitude_td)
virtual void setHeight(const double fullHeight)
StraightGeometry & getGeometry() override
virtual void setPhaseModel(std::shared_ptr< AbstractTimeDependence > phase_td)
virtual double getWidth() const
VariableRFCavity & operator=(const VariableRFCavity &)
constexpr double two_pi
The value of.
Definition Physics.h:40