OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
VariableRFCavity.cpp
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//
21#include "PartBunch.h"
22#include "Physics/Units.h"
24
25VariableRFCavity::VariableRFCavity(const std::string& name) : Component(name) {
26 initNull(); // initialise everything to nullptr
27}
28
30 initNull(); // initialise everything to nullptr
31}
32
34 initNull(); // initialise everything to nullptr
35 *this = var;
36}
37
39 if (&rhs == this) {
40 return *this;
41 }
42 setName(rhs.getName());
43 setPhaseModel(nullptr);
44 setAmplitudeModel(nullptr);
45 setFrequencyModel(nullptr);
46 if (rhs.phaseTD_m != nullptr) {
47 setPhaseModel(std::shared_ptr<AbstractTimeDependence>(rhs.phaseTD_m->clone()));
48 }
49 if (rhs.amplitudeTD_m != nullptr) {
50 setAmplitudeModel(std::shared_ptr<AbstractTimeDependence>(rhs.amplitudeTD_m->clone()));
51 }
52 if (rhs.frequencyTD_m != nullptr) {
53 setFrequencyModel(std::shared_ptr<AbstractTimeDependence>(rhs.frequencyTD_m->clone()));
54 }
61 return *this;
62}
63
65 length_m = 0.;
66 phaseName_m = "";
67 amplitudeName_m = "";
68 frequencyName_m = "";
69 halfHeight_m = 0.;
70 halfWidth_m = 0;
71 RefPartBunch_m = nullptr;
72}
73
74std::shared_ptr<AbstractTimeDependence> VariableRFCavity::getAmplitudeModel() const {
75 return amplitudeTD_m;
76}
77
78std::shared_ptr<AbstractTimeDependence> VariableRFCavity::getPhaseModel() const {
79 return phaseTD_m;
80}
81
82std::shared_ptr<AbstractTimeDependence> VariableRFCavity::getFrequencyModel() const {
83 return frequencyTD_m;
84}
85
87 const std::shared_ptr<AbstractTimeDependence> amplitude_td) {
88 amplitudeTD_m = amplitude_td;
89}
90
91void VariableRFCavity::setPhaseModel(const std::shared_ptr<AbstractTimeDependence> phase_td) {
92 phaseTD_m = phase_td;
93}
94
96 const std::shared_ptr<AbstractTimeDependence> frequency_td) {
97 frequencyTD_m = frequency_td;
98}
99
101
103
105 throw GeneralOpalException("VariableRFCavity", "No field defined for VariableRFCavity");
106}
107
110 "VariableRFCavity::getField", "No field defined for VariableRFCavity");
111}
112
114 const size_t& i, const double& t, Vector_t<double, 3>& E, Vector_t<double, 3>& /*B*/) {
115 const auto pc = RefPartBunch_m->getParticleContainer();
117 Kokkos::deep_copy(
118 Kokkos::View<Vector_t<double, 3>, Kokkos::HostSpace>(&R),
119 Kokkos::subview(pc->R.getView(), i));
120 Kokkos::fence();
121 const double E0 = amplitudeTD_m->getValue(t) * Units::MVpm2Vpm;
122 const double integralF = frequencyTD_m->getIntegral(t) * Units::MHz2Hz;
123 const double phi = phaseTD_m->getValue(t);
124 return computeField(R, E, E0, integralF, phi, halfWidth_m, halfHeight_m, getElementLength());
125}
126
128 const Vector_t<double, 3>& R, const Vector_t<double, 3>& /*P*/, const double& t,
130 const double E0 = amplitudeTD_m->getValue(t) * Units::MVpm2Vpm;
131 const double integralF = frequencyTD_m->getIntegral(t) * Units::MHz2Hz;
132 const double phi = phaseTD_m->getValue(t);
133 return computeField(R, E, E0, integralF, phi, halfWidth_m, halfHeight_m, getElementLength());
134}
135
136bool VariableRFCavity::apply(const std::shared_ptr<ParticleContainer_t>& pc) {
137 const auto R = pc->R.getView();
138 const auto E = pc->E.getView();
139 const auto t = RefPartBunch_m->getT();
140 const double E0 = amplitudeTD_m->getValue(t) * Units::MVpm2Vpm;
141 const double integralF = frequencyTD_m->getIntegral(t) * Units::MHz2Hz;
142 const double phi = phaseTD_m->getValue(t);
143 const auto count = pc->getLocalNum();
144 const auto halfWidth = halfWidth_m;
145 const auto halfHeight = halfHeight_m;
146 const auto length = getElementLength();
147 // Kernel launch over all particles
148 Kokkos::parallel_for(
149 "VariableRFCavity::computeField()", count, KOKKOS_LAMBDA(const size_t i) {
150 computeField(R(i), E(i), E0, integralF, phi, halfWidth, halfHeight, length);
151 });
152
153 return false;
154}
155
157 const Vector_t<double, 3>& R, const Vector_t<double, 3>& P, const double& t,
159 return apply(R, P, t, E, B);
160}
161
163 PartBunch_t* bunch, double& /*startField*/, double& /*endField*/) {
164 RefPartBunch_m = bunch;
165}
166
168
170
175
177 const std::shared_ptr<AbstractTimeDependence> phaseTD =
179 phaseTD_m = std::shared_ptr<AbstractTimeDependence>(phaseTD->clone());
180 const std::shared_ptr<AbstractTimeDependence> frequencyTD =
182 frequencyTD_m = std::shared_ptr<AbstractTimeDependence>(frequencyTD->clone());
183 const std::shared_ptr<AbstractTimeDependence> amplitudeTD =
185 amplitudeTD_m = std::shared_ptr<AbstractTimeDependence>(amplitudeTD->clone());
186
187 if (halfHeight_m < 1e-9 || halfWidth_m < 1e-9)
189 "VariableRFCavity::initialise", "Height or width was not set on VariableRFCavity");
190}
191
192void VariableRFCavity::setLength(const double length) {
193 length_m = length;
195}
ippl::Vector< T, Dim > Vector_t
Template PIC bunch: IPPL PicManager, shared field mesh/solver, and multiple particle containers.
static std::shared_ptr< AbstractTimeDependence > getTimeDependence(const std::string &name)
virtual void visitVariableRFCavity(const VariableRFCavity &)=0
Apply the algorithm to a variable RF cavity.
PartBunch_t * RefPartBunch_m
Definition Component.h:225
Abstract base class for electromagnetic fields.
Definition EMField.h:171
virtual void setName(const std::string &name)
Set element name.
virtual const std::string & getName() const
Get element name.
virtual double getElementLength() const
Get design length.
double getT() const
Get the current simulation time.
Definition PartBunch.h:651
A geometry representing a straight line.
virtual void setElementLength(double length)
Set design length.
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
void finalise() override
std::string amplitudeName_m
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
virtual std::shared_ptr< AbstractTimeDependence > getFrequencyModel() 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 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)
StraightGeometry & getGeometry() override
virtual void setPhaseModel(std::shared_ptr< AbstractTimeDependence > phase_td)
VariableRFCavity & operator=(const VariableRFCavity &)
constexpr double MHz2Hz
Definition Units.h:113
constexpr double MVpm2Vpm
Definition Units.h:128