27#include "gtest/gtest.h"
35 char** argv =
nullptr;
36 ippl::initialize(argc, argv);
41 gmsg =
new Inform(
nullptr, -1);
97 std::shared_ptr<PartBunch_t>
makeBunch(
const size_t numParticles) {
99 const auto fsCmd = std::make_shared<TestableFieldSolverCmd>();
101 fsCmd->setType(
"NONE");
105 fsCmd->setBCX(
"PERIODIC");
106 fsCmd->setBCY(
"PERIODIC");
107 fsCmd->setBCZ(
"PERIODIC");
108 auto beam = std::make_shared<Beam>();
110 auto bunch = std::make_shared<PartBunch_t>(
111 std::vector{1.0}, std::vector{1.0},
112 std::vector<Beam*>{opBeam},
113 std::vector<size_t>{numParticles},
115 bunch->getParticleContainer()->createParticles(numParticles);
123 std::shared_ptr<AbstractTimeDependence> (
VariableRFCavity::*getMethod)() const,
125 const std::shared_ptr<AbstractTimeDependence> poly_1(
126 std::make_shared<PolynomialTimeDependence>(std::vector(1, 1.)));
127 const std::shared_ptr<AbstractTimeDependence> poly_2(
128 std::make_shared<PolynomialTimeDependence>(std::vector(2, 2.)));
130 (cav1.*setMethod)(poly_1);
131 EXPECT_EQ((cav1.*getMethod)(), poly_1);
132 (cav1.*setMethod)(poly_2);
133 EXPECT_EQ((cav1.*getMethod)(), poly_2);
134 (cav1.*setMethod)(poly_2);
135 EXPECT_EQ((cav1.*getMethod)(), poly_2);
136 (cav1.*setMethod)(
nullptr);
140 const std::shared_ptr<AbstractTimeDependence> null_poly(
nullptr);
153 EXPECT_EQ(cav2.
getName(),
"a_name");
168 EXPECT_DOUBLE_EQ(cav1.
getHeight(), 100.);
170 EXPECT_DOUBLE_EQ(cav1.
getWidth(), 101.);
174 const auto amplPoly = std::make_shared<PolynomialTimeDependence>(std::vector{1.0});
175 const auto freqPoly = std::make_shared<PolynomialTimeDependence>(std::vector{2.0});
176 const auto phasePoly = std::make_shared<PolynomialTimeDependence>(std::vector{3.0});
179 cav1.setFrequencyModel(freqPoly);
180 cav1.setPhaseModel(phasePoly);
181 EXPECT_DOUBLE_EQ(cav1.getAmplitude(0), 1.0);
182 EXPECT_DOUBLE_EQ(cav1.getFrequency(0), 2.0);
183 EXPECT_DOUBLE_EQ(cav1.getPhase(0), 3.0);
187 const auto amplPoly = std::make_shared<PolynomialTimeDependence>(std::vector{1.0});
188 const auto freqPoly = std::make_shared<PolynomialTimeDependence>(std::vector{2.0});
189 const auto phasePoly = std::make_shared<PolynomialTimeDependence>(std::vector{3.0});
199 EXPECT_NO_THROW(cav1.
accept(*
this));
202 EXPECT_DOUBLE_EQ(cav1.
getPhase(0), 3.0);
205 EXPECT_ANY_THROW(cav1.
accept(*
this));
208 EXPECT_ANY_THROW(cav1.
accept(*
this));
222 const std::shared_ptr<AbstractTimeDependence> poly1(
224 const std::shared_ptr<AbstractTimeDependence> poly2(
226 const std::shared_ptr<AbstractTimeDependence> poly3(
244 EXPECT_DOUBLE_EQ(cav1.
getLength(), cav2->getLength());
272 for (
double t = 0.0; t < 10.0e-9; t += 1.0e-9) {
275 const double phase = poly3->getValue(t);
276 const double amplitude = poly1->getValue(t);
277 const double integralF = poly2->getIntegral(t) *
Units::MHz2Hz;
278 const double e_test =
281 EXPECT_NEAR(0., E[0], 1.e-6);
282 EXPECT_NEAR(0., E[1], 1.e-6);
283 EXPECT_NEAR(e_test, E[2], 1.e-6);
284 EXPECT_NEAR(0., B[0], 1.e-6);
285 EXPECT_NEAR(0., B[1], 1.e-6);
286 EXPECT_NEAR(0., B[2], 1.e-6);
331 const auto amplPoly = std::make_shared<PolynomialTimeDependence>(std::vector{1.0});
332 const auto freqPoly = std::make_shared<PolynomialTimeDependence>(std::vector{1.0});
333 const auto phasePoly =
334 std::make_shared<PolynomialTimeDependence>(std::vector{
Physics::pi / 2.0});
335 setAmplitudeModel(amplPoly);
336 setFrequencyModel(freqPoly);
337 setPhaseModel(phasePoly);
338 constexpr double width = 1.0;
339 constexpr double length = 1.0;
341 setHeight(2 * width);
344 std::vector<double> line(11);
345 const auto bunch = makeBunch(line.size());
346 const auto pc = bunch->getParticleContainer();
348 std::vector<Vector_t<double, 3>> localR(line.size());
349 const auto hostR = Kokkos::create_mirror_view(pc->R.getView());
350 const auto hostE = Kokkos::create_mirror_view(pc->E.getView());
352 const double stepSize = width /
static_cast<double>(line.size() - 1);
353 for (
size_t i = 0; i < line.size(); ++i) {
354 localR[i] = {
static_cast<double>(i) * stepSize - width / 2.0, 0.0, length / 2.0};
355 hostR(i) = localR[i];
357 Kokkos::deep_copy(pc->R.getView(), hostR);
358 pc->setQ(pc->getChargePerParticle());
359 ippl::Comm->barrier();
363 double startField, endField;
364 initialise(bunch.get(), startField, endField);
365 EXPECT_NE(RefPartBunch_m,
nullptr);
369 Kokkos::deep_copy(hostE, pc->E.getView());
371 for (
size_t i = 0; i < line.size(); ++i) {
372 line[i] = std::hypot(hostE(i)[0], hostE(i)[1], hostE(i)[2]);
374 for (
size_t i = 0; i < line.size(); ++i) {
379 EXPECT_FALSE(apply(0, 0.0, singleE, singleB));
383 EXPECT_EQ(RefPartBunch_m,
nullptr);
388 const auto amplPoly = std::make_shared<PolynomialTimeDependence>(std::vector{1.0});
389 const auto freqPoly = std::make_shared<PolynomialTimeDependence>(std::vector{1.0});
390 const auto phasePoly =
391 std::make_shared<PolynomialTimeDependence>(std::vector{
Physics::pi / 2.0});
392 setAmplitudeModel(amplPoly);
393 setFrequencyModel(freqPoly);
394 setPhaseModel(phasePoly);
401 EXPECT_FALSE(applyToReferenceParticle(R, {}, 0.0, E, B));
410 EXPECT_DOUBLE_EQ(a, 0.0);
411 EXPECT_DOUBLE_EQ(b, 0.0);
415 EXPECT_DOUBLE_EQ(a, 0.0);
416 EXPECT_DOUBLE_EQ(b, 3.0);
418 EXPECT_FALSE(cav1.
bends());
424 EXPECT_NO_THROW(cav2 = cav2);
432 const auto amplPoly = std::make_shared<PolynomialTimeDependence>(std::vector{1.0});
433 const auto freqPoly = std::make_shared<PolynomialTimeDependence>(std::vector{1.0});
434 const auto phasePoly =
435 std::make_shared<PolynomialTimeDependence>(std::vector{
Physics::pi / 2.0});
436 setAmplitudeModel(amplPoly);
437 setFrequencyModel(freqPoly);
438 setPhaseModel(phasePoly);
443 double zBegin = -1.0;
445 getFieldExtend(zBegin, zEnd);
446 EXPECT_DOUBLE_EQ(zBegin, 0.0);
447 EXPECT_DOUBLE_EQ(zEnd, 10.0);
450 EXPECT_FALSE(apply({0.0, 0.0, -0.1}, {}, 0.0, E, B));
451 EXPECT_DOUBLE_EQ(E[2], 0.0);
452 EXPECT_FALSE(apply({0.0, 0.0, 5.0}, {}, 0.0, E, B));
ippl::Vector< T, Dim > Vector_t
TEST_F(TestVariableRFCavity, TestConstructorEtc)
static void setTimeDependence(const std::string &name, std::shared_ptr< AbstractTimeDependence > time_dep)
static Beam * find(const std::string &name)
Find named BEAM.
An abstract sequence of beam line components.
Component applying a constant accelerating electric field (Ex,Ey,Ez).
Interface for drift space.
virtual const std::string & getName() const
Get element name.
A section of a beam line.
Passive OPALX laser element.
Interface for general multipole.
std::vector< Attribute > itsAttr
The object attributes.
void storeInputFn(const std::string &fn)
store opals input filename
static OpalData * getInstance()
Abstract rectangular bend with straight body and curved reference path.
Interface for standing wave cavities.
Ring describes a ring type geometry for tracking.
Abstract sector bend with planar-arc body geometry.
Abstract class for a solenoid magnet.
virtual double getElementLength() const
Get design length.
void setBCX(const std::string &bc)
void setBCZ(const std::string &bc)
void setBCY(const std::string &bc)
void setType(const std::string &t)
std::shared_ptr< FieldSolverCmd > fsCmdBase_m
void visitMonitor(const Monitor &) override
Apply the algorithm to a beam position monitor.
void visitRFCavity(const RFCavity &) override
Apply the algorithm to a RF cavity.
void visitSolenoid(const Solenoid &) override
Apply the algorithm to a Solenoid element.
void visitBeamline(const Beamline &) override
Apply the algorithm to a beam line.
static void SetUpTestSuite()
void visitComponent(const Component &) override
Apply the algorithm to an arbitrary component.
static void TearDownTestSuite()
void visitFlaggedElmPtr(const FlaggedElmPtr &) override
Apply the algorithm to a FlaggedElmPtr.
static void testNull(const VariableRFCavity &cav1)
void visitLaser(const Laser &) override
Apply the algorithm to a laser element.
void visitConstantEFieldCavity(const ConstantEFieldCavity &) override
Apply the algorithm to a constant E-field cavity element.
static void testGetSet(VariableRFCavity &cav1, std::shared_ptr< AbstractTimeDependence >(VariableRFCavity::*getMethod)() const, void(VariableRFCavity::*setMethod)(std::shared_ptr< AbstractTimeDependence >))
void visitProbe(const Probe &) override
Apply the algorithm to a Probe.
void visitRing(const Ring &) override
Apply the algorithm to a Ring element.
void visitDrift(const Drift &) override
Apply the algorithm to a drift space.
void visitMultipoleT(const MultipoleT &) override
Apply the algorithm to an arbitrary multipole.
void visitSBend(const SBend &) override
Apply the algorithm to a sector bend.
void visitMarker(const Marker &) override
Apply the algorithm to a marker.
void visitRBend(const RBend &) override
Apply the algorithm to a rectangular bend.
std::shared_ptr< DataSink > dataSink_m
void visitTravelingWave(const TravelingWave &) override
Apply the algorithm to a traveling wave.
std::shared_ptr< PartBunch_t > makeBunch(const size_t numParticles)
void visitScalingFFAMagnet(const ScalingFFAMagnet &) override
void visitVerticalFFAMagnet(const VerticalFFAMagnet &) override
Apply the algorithm to a vertical FFA magnet.
void visitMultipole(const Multipole &) override
Apply the algorithm to a multipole.
void visitVariableRFCavity(const VariableRFCavity &) override
Apply the algorithm to a variable RF cavity.
void execute() override
Execute the algorithm on the attached beam line.
Interface for traveling wave cavities.
virtual void setFrequencyModel(std::shared_ptr< AbstractTimeDependence > frequency_td)
bool apply(const std::shared_ptr< ParticleContainer_t > &pc) override
virtual double getFrequency(const double time) const
virtual double getAmplitude(const double time) const
virtual double getHeight() const
virtual void setPhaseName(const std::string &phase)
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 &litude)
virtual double getLength() const
virtual std::shared_ptr< AbstractTimeDependence > getAmplitudeModel() const
virtual void setLength(double length)
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
ElementBase * clone() const override
EMField & getField() override
Not implemented.
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
void setPredefinedString(Attribute &attr, const std::string &val)
Set predefined string value.
bool enableHDF5
If true HDF5 files are written.
constexpr double two_pi
The value of.
constexpr double pi
The value of.
constexpr double MVpm2Vpm