39#include <gtest/gtest.h>
56 constexpr const char* kAstra1DMagnetoStaticType =
"AstraMagnetoStatic";
58 std::string writeAstra1DMagnetoStaticFieldmap(
59 const std::string& path,
const std::vector<double>& z_m,
const std::vector<double>& bz,
60 int accuracy = 8,
bool normalize =
true) {
61 EXPECT_EQ(z_m.size(), bz.size());
63 std::ofstream f(path);
65 f << kAstra1DMagnetoStaticType <<
" " << accuracy <<
" " << (normalize ?
"TRUE" :
"FALSE")
68 for (std::size_t i = 0; i < z_m.size(); ++i) {
69 f << std::setprecision(16) << z_m[i] <<
" " << bz[i] <<
"\n";
75 std::string writeConstantAstra1DMagnetoStaticFieldmap(
76 const std::string& path,
double zbegin_m,
double zend_m,
int nz,
double bz,
77 int accuracy = 8,
bool normalize =
true) {
78 std::vector<double> z(nz);
79 std::vector<double> b(nz, bz);
81 const double dz = (zend_m - zbegin_m) /
double(nz - 1);
83 for (
int i = 0; i < nz; ++i) {
84 z[i] = zbegin_m + i * dz;
87 return writeAstra1DMagnetoStaticFieldmap(path, z, b, accuracy, normalize);
90 std::string writeRampAstra1DMagnetoStaticFieldmap(
91 const std::string& path,
double zbegin_m,
double zend_m,
int nz,
int accuracy = 8,
92 bool normalize =
false) {
93 std::vector<double> z(nz);
94 std::vector<double> b(nz);
96 const double dz = (zend_m - zbegin_m) /
double(nz - 1);
98 for (
int i = 0; i < nz; ++i) {
99 z[i] = zbegin_m + i * dz;
100 b[i] = 1.0 + z[i] / zend_m;
103 return writeAstra1DMagnetoStaticFieldmap(path, z, b, accuracy, normalize);
112 char** argv =
nullptr;
113 ippl::initialize(argc, argv);
117 Fieldmap::clearDictionary();
122 tmpDir_ = std::filesystem::temp_directory_path() /
"opalx_astra1dmagnetostatic_test";
124 std::filesystem::create_directories(
tmpDir_);
128 Fieldmap::clearDictionary();
129 std::filesystem::remove_all(
tmpDir_);
132 std::string
tmpFile(
const std::string& name)
const {
return (
tmpDir_ / name).string(); }
141 const double zb = 0.0;
142 const double ze = 0.10;
146 writeConstantAstra1DMagnetoStaticFieldmap(tmpFile(
"parse.map"), zb, ze, nz, 1.0);
148 Fieldmap* fm = Fieldmap::getFieldmap(fname);
150 ASSERT_NE(fm,
nullptr);
153 Fieldmap::readMap(fname);
160 EXPECT_NEAR(zBegin, zb, 1e-12);
161 EXPECT_NEAR(zEnd, ze, 1e-12);
169 writeConstantAstra1DMagnetoStaticFieldmap(tmpFile(
"inside.map"), 0.0, 0.10, 5, 1.0);
173 ASSERT_NE(fm,
nullptr);
175 EXPECT_TRUE(fm->isInside({0.0, 0.0, 0.00}));
176 EXPECT_TRUE(fm->isInside({0.0, 0.0, 0.05}));
177 EXPECT_FALSE(fm->isInside({0.0, 0.0, 0.10}));
178 EXPECT_FALSE(fm->isInside({0.0, 0.0, -0.01}));
187 std::string fname = writeConstantAstra1DMagnetoStaticFieldmap(
188 tmpFile(
"uniform.map"), 0.0, 0.10, nz, 3.0, 8,
true);
190 Fieldmap* fm = Fieldmap::getFieldmap(fname);
192 ASSERT_NE(fm,
nullptr);
194 Fieldmap::readMap(fname);
202 EXPECT_FALSE(outside);
204 EXPECT_NEAR(E[0], 1.0, 1e-15);
205 EXPECT_NEAR(E[1], 2.0, 1e-15);
206 EXPECT_NEAR(E[2], 3.0, 1e-15);
208 EXPECT_NEAR(B[0], 0.0, 1e-10);
209 EXPECT_NEAR(B[1], 0.0, 1e-10);
210 EXPECT_NEAR(B[2], 1.0, 1e-10);
219 std::string fname = writeConstantAstra1DMagnetoStaticFieldmap(
220 tmpFile(
"nonorm.map"), 0.0, 0.10, nz, 3.0, 8,
false);
222 Fieldmap* fm = Fieldmap::getFieldmap(fname);
224 ASSERT_NE(fm,
nullptr);
226 Fieldmap::readMap(fname);
234 EXPECT_FALSE(outside);
236 EXPECT_NEAR(B[0], 0.0, 1e-10);
237 EXPECT_NEAR(B[1], 0.0, 1e-10);
238 EXPECT_NEAR(B[2], 3.0, 1e-10);
246 writeConstantAstra1DMagnetoStaticFieldmap(tmpFile(
"outside.map"), 0.0, 0.10, 9, 1.0);
248 Fieldmap* fm = Fieldmap::getFieldmap(fname);
250 ASSERT_NE(fm,
nullptr);
252 Fieldmap::readMap(fname);
261 EXPECT_TRUE(outside);
263 EXPECT_NEAR(E[0], 1.0, 1e-15);
264 EXPECT_NEAR(E[1], 2.0, 1e-15);
265 EXPECT_NEAR(E[2], 3.0, 1e-15);
267 EXPECT_NEAR(B[0], 4.0, 1e-15);
268 EXPECT_NEAR(B[1], 5.0, 1e-15);
269 EXPECT_NEAR(B[2], 6.0, 1e-15);
279 EXPECT_TRUE(outside);
281 EXPECT_NEAR(E[0], 1.0, 1e-15);
282 EXPECT_NEAR(E[1], 2.0, 1e-15);
283 EXPECT_NEAR(E[2], 3.0, 1e-15);
285 EXPECT_NEAR(B[0], 4.0, 1e-15);
286 EXPECT_NEAR(B[1], 5.0, 1e-15);
287 EXPECT_NEAR(B[2], 6.0, 1e-15);
296 writeConstantAstra1DMagnetoStaticFieldmap(tmpFile(
"accum.map"), 0.0, 0.10, 9, 1.0);
298 Fieldmap* fm = Fieldmap::getFieldmap(fname);
300 ASSERT_NE(fm,
nullptr);
302 Fieldmap::readMap(fname);
310 EXPECT_NEAR(B[0], 4.0, 1e-10);
311 EXPECT_NEAR(B[1], 5.0, 1e-10);
312 EXPECT_NEAR(B[2], 7.0, 1e-10);
319 Kokkos::View<double*, Kokkos::HostSpace> coefs(
"coefs", 3);
329 Astra1DMagnetoStatic::computeField(R, E, B, coefs, 0.0, 0.20, 2);
331 EXPECT_NEAR(E[0], 0.0, 1e-12);
332 EXPECT_NEAR(E[1], 0.0, 1e-12);
333 EXPECT_NEAR(E[2], 0.0, 1e-12);
335 EXPECT_NEAR(B[0], 0.0, 1e-12);
336 EXPECT_NEAR(B[1], 0.0, 1e-12);
337 EXPECT_NEAR(B[2], 1.0, 1e-12);
344 Kokkos::View<double*, Kokkos::HostSpace> coefs(
"coefs", 3);
354 Astra1DMagnetoStatic::computeField(R, E, B, coefs, 0.0, 0.20, 2);
356 EXPECT_NEAR(B[0], 0.0, 1e-12);
357 EXPECT_NEAR(B[1], 0.0, 1e-12);
358 EXPECT_NEAR(B[2], 2.0, 1e-12);
365 Kokkos::View<double*, Kokkos::HostSpace> coefs(
"coefs", 3);
371 const double zbegin = 0.0;
372 const double length = 0.20;
373 const int accuracy = 2;
380 Astra1DMagnetoStatic::computeField(R, E, B, coefs, zbegin, length, accuracy);
382 const double rr2 = R(0) * R(0) + R(1) * R(1);
383 const double bzp = base;
384 const double bzpp = 0.0;
385 const double bzppp = -base * base * base;
387 const double expectedBfieldR = -bzp / 2.0 + bzppp * rr2 / 16.0;
389 EXPECT_NEAR(B[0], expectedBfieldR * R(0), 1e-12);
390 EXPECT_NEAR(B[1], 0.0, 1e-12);
391 EXPECT_NEAR(B[2], 0.0 - bzpp * rr2 / 4.0, 1e-12);
399 writeRampAstra1DMagnetoStaticFieldmap(tmpFile(
"ramp.map"), 0.0, 0.10, 17, 12,
false);
401 Fieldmap* fm = Fieldmap::getFieldmap(fname);
403 ASSERT_NE(fm,
nullptr);
405 Fieldmap::readMap(fname);
415 EXPECT_NE(B1[2], B2[2]);
423 writeConstantAstra1DMagnetoStaticFieldmap(tmpFile(
"deriv.map"), 0.0, 0.10, 9, 2.0);
427 ASSERT_NE(fm,
nullptr);
429 Fieldmap::readMap(fname);
435 bool outside = fm->getFieldDerivative(R, E, B,
DZ);
437 EXPECT_FALSE(outside);
439 EXPECT_NEAR(E[0], 1.0, 1e-15);
440 EXPECT_NEAR(E[1], 2.0, 1e-15);
441 EXPECT_NEAR(E[2], 3.0, 1e-15);
443 EXPECT_NEAR(B[0], 4.0, 1e-15);
444 EXPECT_NEAR(B[1], 5.0, 1e-15);
445 EXPECT_NEAR(B[2], 6.0, 1e-15);
453 writeConstantAstra1DMagnetoStaticFieldmap(tmpFile(
"freq.map"), 0.0, 0.10, 5, 1.0);
455 Fieldmap* fm = Fieldmap::getFieldmap(fname);
457 ASSERT_NE(fm,
nullptr);
468 writeConstantAstra1DMagnetoStaticFieldmap(tmpFile(
"dim6.map"), 0.0, 0.10, 5, 1.0);
470 Fieldmap* fm = Fieldmap::getFieldmap(fname);
472 ASSERT_NE(fm,
nullptr);
490 writeConstantAstra1DMagnetoStaticFieldmap(tmpFile(
"swap.map"), 0.0, 0.10, 5, 1.0);
494 ASSERT_NE(fm,
nullptr);
496 EXPECT_NO_THROW(fm->swap());
504 writeConstantAstra1DMagnetoStaticFieldmap(tmpFile(
"info.map"), 0.0, 0.10, 5, 1.0);
506 Fieldmap* fm = Fieldmap::getFieldmap(fname);
508 ASSERT_NE(fm,
nullptr);
512 EXPECT_NO_THROW(fm->
getInfo(&msg));
519 std::string fname = tmpFile(
"nonexistent.map");
529 writeConstantAstra1DMagnetoStaticFieldmap(tmpFile(
"cache.map"), 0.0, 0.10, 5, 1.0);
531 Fieldmap* fm1 = Fieldmap::getFieldmap(fname);
532 Fieldmap* fm2 = Fieldmap::getFieldmap(fname);
542 writeConstantAstra1DMagnetoStaticFieldmap(tmpFile(
"cycle.map"), 0.0, 0.10, 9, 1.0);
544 Fieldmap* fm = Fieldmap::getFieldmap(fname);
546 ASSERT_NE(fm,
nullptr);
556 EXPECT_NEAR(B[2], 1.0, 1e-10);
565 EXPECT_NEAR(B[2], 1.0, 1e-10);
572 const std::string fname = tmpFile(
"too_few.map");
575 std::ofstream f(fname);
576 f << kAstra1DMagnetoStaticType <<
" 8 TRUE\n";
588 writeConstantAstra1DMagnetoStaticFieldmap(tmpFile(
"zero.map"), 0.0, 0.10, 5, 0.0);
590 Fieldmap* fm = Fieldmap::getFieldmap(fname);
592 ASSERT_NE(fm,
nullptr);
ippl::Vector< T, Dim > Vector_t
TEST_F(Astra1DMagnetoStaticTest, ParseAndDimensions)
static void TearDownTestSuite()
std::filesystem::path tmpDir_
static void SetUpTestSuite()
std::string tmpFile(const std::string &name) const
Abstract base class for all field maps. It acts as a factory for creating specific field map types ba...
virtual bool getFieldstrength(const Vector_t< double, 3 > &R, Vector_t< double, 3 > &E, Vector_t< double, 3 > &B) const =0
Get the field strength at a given point.
virtual void getInfo(Inform *msg)=0
Print info about the field map.
virtual void getFieldDimensions(double &zBegin, double &zEnd) const =0
Get the longitudinal dimensions of the field.
virtual void setFrequency(double freq)=0
Set the frequency.
virtual double getFrequency() const =0
Get the frequency.
static void freeMap(std::string Filename)
Decrease reference count or delete field map if unused.
static void readMap(std::string Filename)
Trigger the actual reading of the field map data.
constexpr double two_pi
The value of.