252 const double zb = 0.0, ze = 20.0;
253 const double rb = 0.0, re = 5.0;
254 const double freq = 100.0;
255 const int nz = 4,
nr = 2;
257 const double Ez_val = 1.0;
258 const double Er_val = 0.0;
259 const double Bt_val = 0.0;
261 std::string fname = writeXZFieldmap(
262 tmpFile(
"uni.map"), zb, ze, nz, rb, re,
nr, freq, Ez_val, Er_val, Bt_val);
264 Fieldmap* fm = Fieldmap::getFieldmap(fname);
265 ASSERT_NE(fm,
nullptr);
267 Fieldmap::readMap(fname);
276 EXPECT_FALSE(outside);
279 EXPECT_NEAR(E[0], 0.0, 1e-10);
280 EXPECT_NEAR(E[1], 0.0, 1e-10);
283 EXPECT_NEAR(E[2], Ez_val * 1e6, 1e-10);
286 EXPECT_NEAR(B[0], 0.0, 1e-10);
287 EXPECT_NEAR(B[1], 0.0, 1e-10);
288 EXPECT_NEAR(B[2], 0.0, 1e-10);
295 const double zb = 0.0, ze = 10.0;
296 const double rb = 0.0, re = 5.0;
297 const double freq = 100.0;
298 const int nz = 4,
nr = 2;
300 std::string fname = writeXZFieldmap(tmpFile(
"oz.map"), zb, ze, nz, rb, re,
nr, freq);
302 Fieldmap* fm = Fieldmap::getFieldmap(fname);
303 ASSERT_NE(fm,
nullptr);
305 Fieldmap::readMap(fname);
315 EXPECT_TRUE(outside);
318 EXPECT_NEAR(E[0], 0.0, 1e-15);
319 EXPECT_NEAR(E[1], 0.0, 1e-15);
320 EXPECT_NEAR(E[2], 0.0, 1e-15);
322 EXPECT_NEAR(B[0], 0.0, 1e-15);
323 EXPECT_NEAR(B[1], 0.0, 1e-15);
324 EXPECT_NEAR(B[2], 0.0, 1e-15);
335 EXPECT_TRUE(outside);
337 EXPECT_NEAR(E[0], 0.0, 1e-15);
338 EXPECT_NEAR(E[1], 0.0, 1e-15);
339 EXPECT_NEAR(E[2], 0.0, 1e-15);
341 EXPECT_NEAR(B[0], 0.0, 1e-15);
342 EXPECT_NEAR(B[1], 0.0, 1e-15);
343 EXPECT_NEAR(B[2], 0.0, 1e-15);
351 const double zb = 0.0, ze = 10.0;
352 const double rb = 0.0, re = 2.0;
353 const double freq = 100.0;
354 const int nz = 4,
nr = 2;
356 std::string fname = writeXZFieldmap(tmpFile(
"or.map"), zb, ze, nz, rb, re,
nr, freq);
358 Fieldmap* fm = Fieldmap::getFieldmap(fname);
359 ASSERT_NE(fm,
nullptr);
361 Fieldmap::readMap(fname);
370 EXPECT_TRUE(outside);
372 EXPECT_NEAR(E[0], 0.0, 1e-15);
373 EXPECT_NEAR(E[1], 0.0, 1e-15);
374 EXPECT_NEAR(E[2], 0.0, 1e-15);
376 EXPECT_NEAR(B[0], 0.0, 1e-15);
377 EXPECT_NEAR(B[1], 0.0, 1e-15);
378 EXPECT_NEAR(B[2], 0.0, 1e-15);
385 const double zb = 0.0, ze = 10.0;
386 const double rb = 0.0, re = 5.0;
387 const double freq = 100.0;
388 const int nz = 4,
nr = 2;
390 std::string fname = writeXZFieldmap(tmpFile(
"ins.map"), zb, ze, nz, rb, re,
nr, freq);
392 auto* fm =
dynamic_cast<FM2DDynamic*
>(Fieldmap::getFieldmap(fname));
393 ASSERT_NE(fm,
nullptr);
396 EXPECT_TRUE(fm->isInside({0.0, 0.0, 0.05}));
399 EXPECT_TRUE(fm->isInside({0.0, 0.0, 0.0}));
402 EXPECT_TRUE(fm->isInside({0.0, 0.0, 0.099}));
405 EXPECT_FALSE(fm->isInside({0.0, 0.0, 0.10}));
408 EXPECT_FALSE(fm->isInside({0.0, 0.0, -0.01}));
411 EXPECT_FALSE(fm->isInside({0.10, 0.0, 0.05}));
483 const double zb = 0.0, ze = 10.0;
484 const double rb = 0.0, re = 5.0;
485 const double freq = 100.0;
486 const int nz = 4,
nr = 4;
489 const double Ezmax = zend_m;
491 std::string fname = writeVaryingXZFieldmap(tmpFile(
"var.map"), zb, ze, nz, rb, re,
nr, freq);
493 Fieldmap* fm = Fieldmap::getFieldmap(fname);
494 Fieldmap::readMap(fname);
496 const double scaleE = 1e6 / Ezmax;
508 EXPECT_NEAR(E[2], 0.05 * scaleE, 1e-6);
509 EXPECT_NEAR(E[0], 0.0, 1e-10);
510 EXPECT_NEAR(E[1], 0.0, 1e-10);
524 EXPECT_NEAR(E[2], 0.05 * scaleE, 1e-6);
527 EXPECT_NEAR(E[0], r_m * scaleE, 1e-6);
528 EXPECT_NEAR(E[1], 0.0, 1e-10);
545 EXPECT_NEAR(E[2], 0.05 * scaleE, 1e-6);
547 EXPECT_NEAR(E[0], 0.0, 1e-10);
548 EXPECT_NEAR(E[1], r_m * scaleE, 1e-6);
563 EXPECT_NEAR(E[2], 0.03 * scaleE, 1e-6);
574 const int npz = 3, npr = 2;
575 const double hz = 0.05, hr = 0.025;
576 const double zbegin = 0.0;
578 Kokkos::View<double*, Kokkos::HostSpace> Ez(
"Ez", npz * npr);
579 Kokkos::View<double*, Kokkos::HostSpace> Er(
"Er", npz * npr);
580 Kokkos::View<double*, Kokkos::HostSpace> Bt(
"Bt", npz * npr);
582 for (
int j = 0; j < npr; ++j)
583 for (
int i = 0; i < npz; ++i) {
584 Ez(j * npz + i) = 1.0;
585 Er(j * npz + i) = 0.5;
586 Bt(j * npz + i) = 0.25;
597 FM2DDynamic::computeField(R, E, B, Ez, Er, Bt, hr, hz, zbegin, npr, npz);
599 EXPECT_NEAR(E[2], 1.0, 1e-10);
602 EXPECT_NEAR(E[0], 0.0, 1e-10);
603 EXPECT_NEAR(E[1], 0.0, 1e-10);
604 EXPECT_NEAR(B[0], 0.0, 1e-10);
605 EXPECT_NEAR(B[1], 0.0, 1e-10);
616 FM2DDynamic::computeField(R, E, B, Ez, Er, Bt, hr, hz, zbegin, npr, npz);
618 EXPECT_NEAR(E[2], 1.0, 1e-10);
621 EXPECT_NEAR(E[0], 0.5, 1e-10);
622 EXPECT_NEAR(E[1], 0.0, 1e-10);
625 EXPECT_NEAR(B[1], 0.25, 1e-10);
626 EXPECT_NEAR(B[0], 0.0, 1e-10);
637 FM2DDynamic::computeField(R, E, B, Ez, Er, Bt, hr, hz, zbegin, npr, npz);
639 EXPECT_NEAR(E[2], 0.0, 1e-15);
640 EXPECT_NEAR(B[0], 0.0, 1e-15);
651 FM2DDynamic::computeField(R, E, B, Ez, Er, Bt, hr, hz, zbegin, npr, npz);
653 EXPECT_NEAR(E[0], 0.0, 1e-15);
654 EXPECT_NEAR(E[1], 0.0, 1e-15);
655 EXPECT_NEAR(E[2], 0.0, 1e-15);
656 EXPECT_NEAR(B[0], 0.0, 1e-15);
657 EXPECT_NEAR(B[1], 0.0, 1e-15);
788 const double zb = 0.0, ze = 10.0;
789 const double rb = 0.0, re = 5.0;
790 const double freq = 100.0;
791 const int nz = 10,
nr = 5;
797 std::string fname = writeVaryingXZFieldmap(tmpFile(
"grid.map"), zb, ze, nz, rb, re,
nr, freq);
799 Fieldmap* fm = Fieldmap::getFieldmap(fname);
800 ASSERT_NE(fm,
nullptr);
802 Fieldmap::readMap(fname);
804 const double hz_m = (ze_m - zb_m) / nz;
807 double scaleE = 1e6 / Ezmax;
809 for (
int iz = 0; iz < nz; ++iz) {
810 double z = zb_m + iz * hz_m;
819 EXPECT_NEAR(E[2], (z / ze_m) * scaleE, 1e-9) <<
"Mismatch at iz=" << iz <<
" z=" << z;
822 EXPECT_NEAR(E[0], 0.0, 1e-12);
823 EXPECT_NEAR(E[1], 0.0, 1e-12);
824 EXPECT_NEAR(B[0], 0.0, 1e-12);
825 EXPECT_NEAR(B[1], 0.0, 1e-12);
833 const double zb = 0.0, ze = 10.0;
834 const double rb = 0.0, re = 5.0;
835 const double freq = 100.0;
836 const int nz = 4,
nr = 2;
837 const double Ez_val = 2.0;
839 std::string fnameXZ = writeXZFieldmap(tmpFile(
"xz2.map"), zb, ze, nz, rb, re,
nr, freq, Ez_val);
840 std::string fnameZX = writeZXFieldmap(tmpFile(
"zx2.map"), zb, ze, nz, rb, re,
nr, freq, Ez_val);
842 Fieldmap* fmXZ = Fieldmap::getFieldmap(fnameXZ);
843 Fieldmap* fmZX = Fieldmap::getFieldmap(fnameZX);
844 Fieldmap::readMap(fnameXZ);
845 Fieldmap::readMap(fnameZX);
847 ASSERT_NE(fmXZ,
nullptr);
848 ASSERT_NE(fmZX,
nullptr);
859 EXPECT_NEAR(E_xz[0], E_zx[0], 1e-10);
860 EXPECT_NEAR(E_xz[1], E_zx[1], 1e-10);
861 EXPECT_NEAR(E_xz[2], E_zx[2], 1e-10);
863 EXPECT_NEAR(B_xz[0], B_zx[0], 1e-10);
864 EXPECT_NEAR(B_xz[1], B_zx[1], 1e-10);
865 EXPECT_NEAR(B_xz[2], B_zx[2], 1e-10);
872 const double zb = 0.0, ze = 10.0;
873 const double rb = 0.0, re = 5.0;
874 const double freq = 100.0;
875 const int nz = 4,
nr = 2;
878 const double Ez_val = 1.0;
879 const double Er_val = 1.0;
880 const double Bt_val = 1.0;
882 std::string fname = writeXZFieldmap(
883 tmpFile(
"proj_dyn.map"), zb, ze, nz, rb, re,
nr, freq, Ez_val, Er_val, Bt_val);
886 ASSERT_NE(fm,
nullptr);
888 Fieldmap::readMap(fname);
892 double x = r / std::sqrt(2.0);
893 double y = r / std::sqrt(2.0);
901 double Ezmax = Ez_val;
902 double scaleE = 1e6 / Ezmax;
905 double expected_Er = (Er_val / std::sqrt(2.0)) * scaleE;
906 double expected_Ez = Ez_val * scaleE;
907 double expected_Bt = (Bt_val / std::sqrt(2.0)) * scaleB;
910 EXPECT_NEAR(E[0], expected_Er, 1e-10);
911 EXPECT_NEAR(E[1], expected_Er, 1e-10);
914 EXPECT_NEAR(E[2], expected_Ez, 1e-10);
918 EXPECT_NEAR(B[0], -expected_Bt, 1e-10);
919 EXPECT_NEAR(B[1], expected_Bt, 1e-10);
922 EXPECT_NEAR(B[2], 0.0, 1e-10);
929 const double zb = 0.0, ze = 10.0;
930 const double rb = 0.0, re = 5.0;
931 const double freq = 100.0;
932 const int nz = 4,
nr = 2;
935 const double Ez_val = 1.0;
936 const double Er_val = 0.0;
937 const double Bt_val = 0.0;
939 std::string fname = writeXZFieldmap(
940 tmpFile(
"accum_dyn.map"), zb, ze, nz, rb, re,
nr, freq, Ez_val, Er_val, Bt_val);
943 ASSERT_NE(fm,
nullptr);
945 Fieldmap::readMap(fname);
954 double Ezmax = Ez_val;
955 double scaleE = 1e6 / Ezmax;
958 double expected_added_Ez = Ez_val * scaleE;
961 EXPECT_NEAR(E[0], 0.0, 1e-10);
962 EXPECT_NEAR(E[1], 0.0, 1e-10);
963 EXPECT_NEAR(E[2], 5.0 + expected_added_Ez, 1e-10);
966 EXPECT_NEAR(B[0], 0.0, 1e-10);
967 EXPECT_NEAR(B[1], 0.0, 1e-10);
968 EXPECT_NEAR(B[2], 3.0, 1e-10);
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 bool getFieldDerivative(const Vector_t< double, 3 > &R, Vector_t< double, 3 > &E, Vector_t< double, 3 > &B, const DiffDirection &dir) const =0
Get the field derivative with respect to a direction.