217 std::vector<double> line(101);
219 constexpr double length = 4.4;
220 constexpr double bendAngle = 0.0;
221 constexpr double dipoleField = 1.0;
222 setBendAngle(bendAngle,
false);
223 setElementLength(length);
224 setAperture(3.5, 3.5);
225 setFringeField(length / 2, 0.3, 0.3);
227 setEntranceAngle(0.0);
230 setTransProfile({dipoleField});
231 grabTransverseDataLine(line, 0, 3.0, {0, 0, 0}, length);
232 for (
const double val : line) {
233 EXPECT_NEAR(val, dipoleField, 1e-2);
236 setTransProfile({dipoleField});
237 grabTransverseDataLine(line, -length / 2, 3.0, {0, 0, 0}, length);
238 for (
const double val : line) {
239 EXPECT_NEAR(val, dipoleField / 2, 1e-2);
245 constexpr unsigned int samplesPerSide = 50;
246 std::vector<double> line(2 * samplesPerSide + 1);
248 constexpr double length = 4.4;
249 constexpr double bendAngle = 0.0;
250 constexpr double quadrupoleField = 1.0;
251 setBendAngle(bendAngle,
false);
252 setElementLength(length);
253 setAperture(3.5, 3.5);
254 setFringeField(length / 2, 0.3, 0.3);
256 setEntranceAngle(0.0);
259 setTransProfile({0, quadrupoleField});
260 grabTransverseDataLine(line, 0, 3.0, {0, 0, 0}, length);
262 double delta = line[samplesPerSide + 1] - line[samplesPerSide];
263 EXPECT_NEAR(delta, 0.03, 1e-5);
264 EXPECT_NEAR(line[samplesPerSide], expected, 1e-5);
265 for (
size_t i = 0; i < samplesPerSide; ++i) {
267 EXPECT_NEAR(line[samplesPerSide - i - 1], expected, 1e-2);
268 EXPECT_NEAR(line[samplesPerSide + i + 1], expected, 1e-2);
271 setTransProfile({0, quadrupoleField});
272 grabTransverseDataLine(line, -length / 2, 3.0, {0, 0, 0}, length);
274 delta = line[samplesPerSide + 1] - line[samplesPerSide];
275 EXPECT_NEAR(delta, 0.015, 1e-5);
276 EXPECT_NEAR(line[samplesPerSide], expected, 1e-5);
277 for (
size_t i = 0; i < samplesPerSide; ++i) {
279 EXPECT_NEAR(line[samplesPerSide - i - 1], expected, 1e-2);
280 EXPECT_NEAR(line[samplesPerSide + i + 1], expected, 1e-2);
286 constexpr unsigned int samplesPerSide = 50;
287 std::vector<double> line(2 * samplesPerSide + 1);
289 constexpr double length = 4.4;
290 constexpr double bendAngle = 0.0;
291 constexpr double sextupoleField = 1.0;
292 setBendAngle(bendAngle,
false);
293 setElementLength(length);
294 setAperture(3.5, 3.5);
295 setFringeField(length / 2, 0.3, 0.3);
297 setEntranceAngle(0.0);
300 setTransProfile({0, 0, sextupoleField});
301 grabTransverseDataLine(line, 0, 3.0, {0, 0, 0}, length);
303 double delta = std::sqrt(line[samplesPerSide + 1] - line[samplesPerSide]);
304 EXPECT_NEAR(delta, 0.03, 1e-5);
305 EXPECT_NEAR(line[samplesPerSide], expected, 1e-5);
306 for (
size_t i = 0; i < samplesPerSide; ++i) {
307 expected = std::pow(
static_cast<double>(i + 1) * delta, 2);
308 EXPECT_NEAR(line[samplesPerSide - i - 1], expected, 1e-2);
309 EXPECT_NEAR(line[samplesPerSide + i + 1], expected, 1e-2);
312 setTransProfile({0, 0, sextupoleField});
313 grabTransverseDataLine(line, -length / 2, 3.0, {0, 0, 0}, length);
315 delta = std::sqrt(line[samplesPerSide + 1] - line[samplesPerSide]);
316 EXPECT_NEAR(delta, 0.02121, 1e-5);
317 EXPECT_NEAR(line[samplesPerSide], expected, 1e-5);
318 for (
size_t i = 0; i < samplesPerSide; ++i) {
319 expected = std::pow(
static_cast<double>(i + 1) * delta, 2);
320 EXPECT_NEAR(line[samplesPerSide - i - 1], expected, 1e-2);
321 EXPECT_NEAR(line[samplesPerSide + i + 1], expected, 1e-2);
327 constexpr unsigned int samplesPerSide = 50;
328 std::vector<double> line(2 * samplesPerSide + 1);
330 constexpr double length = 4.4;
331 constexpr double bendAngle = 0.0;
332 constexpr double octupoleField = 1.0;
333 setBendAngle(bendAngle,
false);
334 setElementLength(length);
335 setAperture(3.5, 3.5);
336 setFringeField(length / 2, 0.3, 0.3);
338 setEntranceAngle(0.0);
341 setTransProfile({0, 0, 0, octupoleField});
342 grabTransverseDataLine(line, 0, 3.0, {0, 0, 0}, length);
344 double delta = std::cbrt(line[samplesPerSide + 1] - line[samplesPerSide]);
345 EXPECT_NEAR(delta, 0.03, 1e-5);
346 EXPECT_NEAR(line[samplesPerSide], expected, 1e-5);
347 for (
size_t i = 0; i < samplesPerSide; ++i) {
348 expected = std::pow(
static_cast<double>(i + 1) * delta, 3);
349 EXPECT_NEAR(line[samplesPerSide - i - 1], expected, 1e-2);
350 EXPECT_NEAR(line[samplesPerSide + i + 1], expected, 1e-2);
353 setTransProfile({0, 0, 0, octupoleField});
354 grabTransverseDataLine(line, -length / 2, 3.0, {0, 0, 0}, length);
356 delta = std::cbrt(line[samplesPerSide + 1] - line[samplesPerSide]);
357 EXPECT_NEAR(delta, 0.023811, 1e-5);
358 EXPECT_NEAR(line[samplesPerSide], expected, 1e-5);
359 for (
size_t i = 0; i < samplesPerSide; ++i) {
360 expected = std::pow(
static_cast<double>(i + 1) * delta, 3);
361 EXPECT_NEAR(line[samplesPerSide - i - 1], expected, 1e-2);
362 EXPECT_NEAR(line[samplesPerSide + i + 1], expected, 1e-2);
368 constexpr unsigned int samplesPerSide = 50;
369 std::vector<double> line(2 * samplesPerSide + 1);
371 constexpr double length = 4.4;
372 constexpr double bendAngle = 0.0;
373 constexpr double decapoleField = 1.0;
374 setBendAngle(bendAngle,
false);
375 setElementLength(length);
376 setAperture(3.5, 3.5);
377 setFringeField(length / 2, 0.3, 0.3);
379 setEntranceAngle(0.0);
382 setTransProfile({0, 0, 0, 0, decapoleField});
383 grabTransverseDataLine(line, 0, 3.0, {0, 0, 0}, length);
385 double delta = std::pow(line[samplesPerSide + 1] - line[samplesPerSide], 1.0 / 4.0);
386 EXPECT_NEAR(delta, 0.03, 1e-5);
387 EXPECT_NEAR(line[samplesPerSide], expected, 1e-5);
388 for (
size_t i = 0; i < samplesPerSide; ++i) {
389 expected = std::pow(
static_cast<double>(i + 1) * delta, 4);
390 EXPECT_NEAR(line[samplesPerSide - i - 1], expected, 1e-2);
391 EXPECT_NEAR(line[samplesPerSide + i + 1], expected, 1e-2);
394 setTransProfile({0, 0, 0, 0, decapoleField});
395 grabTransverseDataLine(line, -length / 2, 3.0, {0, 0, 0}, length);
397 delta = std::pow(line[samplesPerSide + 1] - line[samplesPerSide], 1.0 / 4.0);
398 EXPECT_NEAR(delta, 0.025227, 1e-5);
399 EXPECT_NEAR(line[samplesPerSide], expected, 1e-5);
400 for (
size_t i = 0; i < samplesPerSide; ++i) {
401 expected = std::pow(
static_cast<double>(i + 1) * delta, 4);
402 EXPECT_NEAR(line[samplesPerSide - i - 1], expected, 1e-2);
403 EXPECT_NEAR(line[samplesPerSide + i + 1], expected, 1e-2);
409 constexpr unsigned int samplesPerSide = 20;
410 std::vector<double> divLine(2 * samplesPerSide + 1);
411 std::vector<double> fieldLine(2 * samplesPerSide + 1);
412 std::vector<Vector_t<double, 3>> curlLine(2 * samplesPerSide + 1);
413 constexpr double dr = 0.001;
415 constexpr double length = 4.4;
416 constexpr double bendAngle = 0.0;
417 setBendAngle(bendAngle,
false);
418 setElementLength(length);
419 setAperture(3.5, 3.5);
420 setFringeField(length / 2, 0.3, 0.3);
422 setEntranceAngle(0.0);
424 setTransProfile({1, 1, 1, 1, 1});
426 grabLongitudinalDivCurlLine(fieldLine, divLine, curlLine, 0, length * 1.5, {}, length, dr);
428 for (
size_t i = 0; i < divLine.size(); ++i) {
429 const double divError = std::abs(divLine[i]) * dr / fieldLine[i];
430 const double curlError =
431 std::hypot(curlLine[i][0], curlLine[i][1], curlLine[i][2]) * dr / fieldLine[i];
432 EXPECT_NEAR(divError, 0, 1e-5);
433 EXPECT_NEAR(curlError, 0, 1e-2);
449 std::vector<double> line(3);
451 constexpr double length = 4;
452 constexpr double bendAngle = 0.0;
453 constexpr double dipoleField = 1.0;
454 setBendAngle(bendAngle,
false);
455 setElementLength(length);
456 setAperture(3.5, 3.5);
457 setFringeField(length / 2, 3, 3);
459 setEntranceAngle(0.0);
461 setBoundingBoxLength(6);
462 setTransProfile({dipoleField});
464 grabTransverseDataLine(line, -3.1, 3.0, {0, 0, 0}, length);
465 for (
const double val : line) {
469 grabTransverseDataLine(line, -2.9, 3.0, {0, 0, 0}, length);
470 for (
const double val : line) {
474 grabTransverseDataLine(line, 0.0, 3.0, {0, 0, 0}, length);
475 for (
const double val : line) {
479 grabTransverseDataLine(line, 2.9, 3.0, {0, 0, 0}, length);
480 for (
const double val : line) {
484 grabTransverseDataLine(line, 3.1, 3.0, {0, 0, 0}, length);
485 for (
const double val : line) {
492 std::vector<double> line(9);
494 constexpr double length = 4;
495 constexpr double bendAngle = 0.0;
496 constexpr double dipoleField = 1.0;
497 setBendAngle(bendAngle,
false);
498 setElementLength(length);
499 setAperture(3.5, 3.5);
500 setFringeField(length / 2, 3, 3);
502 setEntranceAngle(0.0);
504 setTransProfile({dipoleField});
506 grabTransverseDataLine(line, 0, 4.0, {0, 0, 0}, length);
507 EXPECT_EQ(line[0], 0.0);
508 EXPECT_NE(line[1], 0.0);
509 EXPECT_NE(line[2], 0.0);
510 EXPECT_NE(line[3], 0.0);
511 EXPECT_NE(line[4], 0.0);
512 EXPECT_NE(line[5], 0.0);
513 EXPECT_NE(line[6], 0.0);
514 EXPECT_NE(line[7], 0.0);
515 EXPECT_EQ(line[8], 0.0);
520 std::vector<double> line(9);
522 constexpr double length = 4;
523 constexpr double bendAngle = M_PI / 8.0;
524 constexpr double dipoleField = 1.0;
525 setBendAngle(bendAngle,
false);
526 setElementLength(length);
527 setAperture(3.5, 3.5);
528 setFringeField(length / 2, 3, 3);
530 setEntranceAngle(0.0);
532 setTransProfile({dipoleField});
534 grabVerticalDataLine(line, 0, 4.0, {0, 0, 0}, length);
535 EXPECT_EQ(line[0], 0.0);
536 EXPECT_NE(line[1], 0.0);
537 EXPECT_NE(line[2], 0.0);
538 EXPECT_NE(line[3], 0.0);
539 EXPECT_NE(line[4], 0.0);
540 EXPECT_NE(line[5], 0.0);
541 EXPECT_NE(line[6], 0.0);
542 EXPECT_NE(line[7], 0.0);
543 EXPECT_EQ(line[8], 0.0);
549 constexpr double length = 4.4;
550 constexpr double bendAngle = 0.0;
551 constexpr double dipoleField = 1.0;
552 setBendAngle(bendAngle,
false);
553 setElementLength(length);
554 setAperture(3.5, 3.5);
555 setFringeField(length / 2, 0.3, 0.3);
557 setEntranceAngle(0.0);
559 setTransProfile({dipoleField});
561 const auto bunch = makeBunch(1);
562 const auto pc = bunch->getParticleContainer();
564 std::vector<Vector_t<double, 3>> localR(1);
565 const auto hostR = Kokkos::create_mirror_view(pc->R.getView());
566 const auto hostB = Kokkos::create_mirror_view(pc->B.getView());
568 localR[0] = {0, 0, 0};
569 hostR(0) = curvilinearToGlobal(localR[0], {0, 0, 0}, length);
570 Kokkos::deep_copy(pc->R.getView(), hostR);
571 pc->setQ(pc->getChargePerParticle());
572 ippl::Comm->barrier();
576 double startField, endField;
577 initialise(bunch.get(), startField, endField);
582 const auto val = std::hypot(B[0], B[1], B[2]);
583 EXPECT_NEAR(val, dipoleField, 1e-2);
584 EXPECT_EQ(E[0], 0.0);
585 EXPECT_EQ(E[1], 0.0);
586 EXPECT_EQ(E[2], 0.0);
void grabLongitudinalDivCurlLine(std::vector< double > &fieldLine, std::vector< double > &divLine, std::vector< Vector_t< double, 3 > > &curlLine, const double x, const double length, const Vector_t< double, 3 > &elementEntry, const double elementLength, const double dr)