58#include <gtest/gtest.h>
89 double& zBegin,
double& zEnd,
double&,
double&,
double&,
double&)
const override {
97 void applyField(std::shared_ptr<ParticleContainer_t>,
double = 1.0)
override {}
186 cav_ = std::make_unique<TestRFCavity>();
187 fmap_ = std::make_unique<FakeFieldmap>();
191 cav_->setStartField(0.0);
192 cav_->setEndField(1.0);
193 cav_->setElementLength(1.0);
197 cav_->setFrequencyInternal(1.0);
198 cav_->setPhaseInternal(0.0);
200 std::unique_ptr<TestRFCavity>
cav_;
201 std::unique_ptr<FakeFieldmap>
fmap_;
212 cav_->setAmplitude(5.0);
213 cav_->setFrequency(2.0);
216 EXPECT_DOUBLE_EQ(cav_->getAmplitude(), 5.0);
217 EXPECT_DOUBLE_EQ(cav_->getFrequency(), 2.0);
218 EXPECT_DOUBLE_EQ(cav_->getPhase(), 0.5);
225 double zBegin = -1.0, zEnd = -1.0;
227 cav_->getFieldExtend(zBegin, zEnd);
229 EXPECT_EQ(zBegin, 0.0);
230 EXPECT_EQ(zEnd, 1.0);
234 cav_->setStartField(0.2);
235 cav_->setEndField(0.8);
236 cav_->setElementLength(1.0);
238 double bodyBegin = -1.0, bodyEnd = -1.0;
239 cav_->getElementDimensions(bodyBegin, bodyEnd);
240 EXPECT_EQ(bodyBegin, 0.0);
241 EXPECT_EQ(bodyEnd, 1.0);
243 const auto entry = cav_->getEdgeToBegin();
244 const auto exit = cav_->getEdgeToEnd();
245 EXPECT_EQ(entry.getOrigin()(2), 0.0);
246 EXPECT_EQ(exit.getOrigin()(2), 1.0);
250 EXPECT_FALSE(cav_->apply({0.0, 0.0, 0.1}, {0.0, 0.0, 1.0}, 0.0, E, B));
251 EXPECT_DOUBLE_EQ(E(0), 0.0);
253 EXPECT_FALSE(cav_->apply({0.0, 0.0, 0.5}, {0.0, 0.0, 1.0}, 0.0, E, B));
254 EXPECT_DOUBLE_EQ(E(0), 1.0);
258 cav_->setElementLength(0.0);
260 EXPECT_DOUBLE_EQ(cav_->getElementLength(), 0.0);
262 double bodyBegin = -1.0, bodyEnd = -1.0;
263 cav_->getElementDimensions(bodyBegin, bodyEnd);
264 EXPECT_DOUBLE_EQ(bodyBegin, 0.0);
265 EXPECT_DOUBLE_EQ(bodyEnd, 0.0);
267 double fieldBegin = -1.0, fieldEnd = -1.0;
268 cav_->getFieldExtend(fieldBegin, fieldEnd);
269 EXPECT_DOUBLE_EQ(fieldBegin, 0.0);
270 EXPECT_DOUBLE_EQ(fieldEnd, 1.0);
282 cav_->apply(R, P, 0.0, E, B);
285 EXPECT_DOUBLE_EQ(E(0), 1.0 + 1.0);
286 EXPECT_DOUBLE_EQ(E(1), 2.0);
287 EXPECT_DOUBLE_EQ(E(2), 3.0);
290 EXPECT_DOUBLE_EQ(B(0), 1.0);
291 EXPECT_DOUBLE_EQ(B(1), 2.0);
292 EXPECT_DOUBLE_EQ(B(2), 3.0);
301 cav_->apply(R, P, 0.0, E, B);
304 EXPECT_DOUBLE_EQ(E(0), 1.0);
305 EXPECT_DOUBLE_EQ(E(1), 2.0);
306 EXPECT_DOUBLE_EQ(E(2), 3.0);
308 EXPECT_DOUBLE_EQ(B(0), 1.0);
309 EXPECT_DOUBLE_EQ(B(1), 2.0);
310 EXPECT_DOUBLE_EQ(B(2), 3.0);
319 cav_->apply(R, P, 0.0, E, B);
322 EXPECT_DOUBLE_EQ(E(0), 1.0);
323 EXPECT_DOUBLE_EQ(E(1), 2.0);
324 EXPECT_DOUBLE_EQ(E(2), 3.0);
326 EXPECT_DOUBLE_EQ(B(0), 1.0);
327 EXPECT_DOUBLE_EQ(B(1), 2.0);
328 EXPECT_DOUBLE_EQ(B(2), 3.0);
338 cav_->setPhasem(0.0);
339 cav_->setFrequencym(1.0);
346 cav_->apply(R, P, 0.0, E, B);
348 EXPECT_NE(E(0), 0.0);
349 EXPECT_DOUBLE_EQ(E(1), 0.0);
350 EXPECT_DOUBLE_EQ(E(2), 0.0);
353 EXPECT_DOUBLE_EQ(B(0), 0.0);
354 EXPECT_DOUBLE_EQ(B(1), 0.0);
355 EXPECT_DOUBLE_EQ(B(2), 0.0);
360 cav_->setPhasem(M_PI / 2.0);
367 cav_->apply(R, P, 0.0, E, B);
370 EXPECT_NEAR(E(0), 0.0, 1e-12);
373 EXPECT_DOUBLE_EQ(B(1), -1.0);
378 cav_->setPhasem(M_PI);
379 cav_->setFrequencym(1.0);
386 cav_->apply(R, P, 0.0, E, B);
389 EXPECT_NEAR(E(0), -1.0, 1e-12);
390 EXPECT_DOUBLE_EQ(E(1), 0.0);
391 EXPECT_DOUBLE_EQ(E(2), 0.0);
394 EXPECT_DOUBLE_EQ(B(0), 0.0);
395 EXPECT_NEAR(B(1), 0.0, 1e-12);
396 EXPECT_DOUBLE_EQ(B(2), 0.0);
400 cav_->setPhasem(M_PI / 2.0);
408 cav_->setFrequencym(1.0);
409 cav_->apply(R, P, 0.0, E1, B1);
414 cav_->setFrequencym(10.0);
415 cav_->apply(R, P, 0.0, E2, B2);
417 EXPECT_NEAR(E1(0), 0.0, 1e-12);
418 EXPECT_NEAR(E2(0), 0.0, 1e-12);
420 EXPECT_NEAR(B1(1), -1.0, 1e-12);
421 EXPECT_NEAR(B2(1), -1.0, 1e-12);
433 cav_->apply(R, P, 0.0, E1, B1);
438 cav_->apply(R, P, 0.0, E2, B2);
441 EXPECT_NEAR(E2(0), 2.0 * E1(0), 1e-12);
442 EXPECT_NEAR(E2(1), 2.0 * E1(1), 1e-12);
443 EXPECT_NEAR(E2(2), 2.0 * E1(2), 1e-12);
450 cav_->setPhasem(0.0);
451 cav_->setFrequencym(1.0);
459 cav_->apply(R, P, 0.0, E0, B0);
464 cav_->apply(R, P, M_PI / 2.0, E1, B1);
466 EXPECT_NEAR(E0(0), 1.0, 1e-12);
467 EXPECT_NEAR(E1(0), 0.0, 1e-12);
480 cav_->applyToReferenceParticle(R, P, 0.0, E, B);
482 EXPECT_DOUBLE_EQ(E(0), 1.0);
487 fmap_->setOutOfBounds(
true);
494 bool out = cav_->apply(R, P, 0.0, E, B);
ippl::Vector< T, Dim > Vector_t
TEST_F(RFCavityTest, GetType)
Abstract base class for accelerator geometry classes.
void scale(double) override
Scale the field.
Euclid3D getTransform(double, double) const override
Get transform.
double getElementLength() const override
Get geometry length.
void setElementLength(double length) override
Set geometry length.
double getArcLength() const override
Get arc length.
Abstract base class for electromagnetic fields.
Displacement and rotation in space.
void getFieldDimensions(double &zBegin, double &zEnd) const override
Get the longitudinal dimensions of the field.
bool getFieldDerivative(const Vector_t< double, 3 > &, Vector_t< double, 3 > &, Vector_t< double, 3 > &, const DiffDirection &) const override
Get the field derivative with respect to a direction.
void setFrequency(double) override
Set the frequency.
double getFrequency() const override
Get the frequency.
bool isInside(const Vector_t< double, 3 > &) const override
Check if a point is inside the field map.
void getInfo(Inform *) override
Print info about the field map.
bool getFieldstrength(const Vector_t< double, 3 > &, Vector_t< double, 3 > &E, Vector_t< double, 3 > &B) const override
Get the field strength at a given point.
void applyField(std::shared_ptr< ParticleContainer_t >, double=1.0) override
Apply the FM to all the particles.
void readMap() override
Pure virtual method to read the map data. Called by the public static readMap().
void getFieldDimensions(double &zBegin, double &zEnd, double &, double &, double &, double &) const override
Get the full 3D bounding box of the field.
void swap() override
Swap coordinates (implementation dependent).
void freeMap() override
Pure virtual method to free the map data.
void setOutOfBounds(bool v)
Abstract base class for all field maps. It acts as a factory for creating specific field map types ba...
std::unique_ptr< FakeFieldmap > fmap_
std::unique_ptr< TestRFCavity > cav_
Interface for standing wave cavities.
double getFrequency() const override
Get RF frequency.
const BGeometryBase & getGeometry() const override
Get geometry.
void setFrequencyInternal(double v)
void setFieldmap(Fieldmap *fmap)
void setStartField(double val)
void setEndField(double val)
const EMField & getField() const override
Return field.
void setFrequency(double v)
BGeometryBase & getGeometry() override
Get geometry.
double getPhase() const override
Get RF phase.
void setPhaseInternal(double v)
ElementBase * clone() const override
Return clone.
double getAmplitude() const override
Get RF amplitude.
void setAmplitude(double v)
EMField & getField() override
Return field.