216 std::vector<double> line(101);
218 constexpr double length = 4.4;
219 constexpr double bendAngle = M_PI / 8.0;
220 constexpr double dipoleField = 1.0;
221 setBendAngle(bendAngle,
false);
222 setElementLength(length);
223 setAperture(3.5, 3.5);
224 setFringeField(length / 2, 0.3, 0.3);
226 setEntranceAngle(0.0);
229 setTransProfile({dipoleField});
230 grabTransverseDataLine(line, 0, 3.0, {0, 0, 0}, length, bendAngle);
231 for (
const double val : line) {
232 EXPECT_NEAR(val, dipoleField, 1e-2);
235 setTransProfile({dipoleField});
236 grabTransverseDataLine(line, -length / 2, 3.0, {0, 0, 0}, length, bendAngle);
237 for (
const double val : line) {
238 EXPECT_NEAR(val, dipoleField / 2, 1e-2);
244 constexpr unsigned int samplesPerSide = 50;
245 std::vector<double> line(2 * samplesPerSide + 1);
247 constexpr double length = 4.4;
248 constexpr double bendAngle = M_PI / 8.0;
249 constexpr double quadrupoleField = 1.0;
250 setBendAngle(bendAngle,
false);
251 setElementLength(length);
252 setAperture(3.5, 3.5);
253 setFringeField(length / 2, 0.3, 0.3);
255 setEntranceAngle(0.0);
258 setTransProfile({0, quadrupoleField});
259 grabTransverseDataLine(line, 0, 3.0, {0, 0, 0}, length, bendAngle);
261 double delta = line[samplesPerSide + 1] - line[samplesPerSide];
262 EXPECT_NEAR(delta, 0.03, 1e-5);
263 EXPECT_NEAR(line[samplesPerSide], expected, 1e-5);
264 for (
size_t i = 0; i < samplesPerSide; ++i) {
266 EXPECT_NEAR(line[samplesPerSide - i - 1], expected, 1e-2);
267 EXPECT_NEAR(line[samplesPerSide + i + 1], expected, 1e-2);
270 setTransProfile({0, quadrupoleField});
271 grabTransverseDataLine(line, -length / 2, 3.0, {0, 0, 0}, length, bendAngle);
273 delta = line[samplesPerSide + 1] - line[samplesPerSide];
274 EXPECT_NEAR(delta, 0.015, 1e-5);
275 EXPECT_NEAR(line[samplesPerSide], expected, 1e-5);
276 for (
size_t i = 0; i < samplesPerSide; ++i) {
278 EXPECT_NEAR(line[samplesPerSide - i - 1], expected, 1e-2);
279 EXPECT_NEAR(line[samplesPerSide + i + 1], expected, 1e-2);
285 constexpr unsigned int samplesPerSide = 50;
286 std::vector<double> line(2 * samplesPerSide + 1);
288 constexpr double length = 4.4;
289 constexpr double bendAngle = M_PI / 8.0;
290 constexpr double sextupoleField = 1.0;
291 setBendAngle(bendAngle,
false);
292 setElementLength(length);
293 setAperture(3.5, 3.5);
294 setFringeField(length / 2, 0.3, 0.3);
296 setEntranceAngle(0.0);
299 setTransProfile({0, 0, sextupoleField});
300 grabTransverseDataLine(line, 0, 3.0, {0, 0, 0}, length, bendAngle);
302 double delta = std::sqrt(line[samplesPerSide + 1] - line[samplesPerSide]);
303 EXPECT_NEAR(delta, 0.03, 1e-5);
304 EXPECT_NEAR(line[samplesPerSide], expected, 1e-5);
305 for (
size_t i = 0; i < samplesPerSide; ++i) {
306 expected = std::pow(
static_cast<double>(i + 1) * delta, 2);
307 EXPECT_NEAR(line[samplesPerSide - i - 1], expected, 1e-2);
308 EXPECT_NEAR(line[samplesPerSide + i + 1], expected, 1e-2);
311 setTransProfile({0, 0, sextupoleField});
312 grabTransverseDataLine(line, -length / 2, 3.0, {0, 0, 0}, length, bendAngle);
314 delta = std::sqrt(line[samplesPerSide + 1] - line[samplesPerSide]);
315 EXPECT_NEAR(delta, 0.02121, 1e-5);
316 EXPECT_NEAR(line[samplesPerSide], expected, 1e-5);
317 for (
size_t i = 0; i < samplesPerSide; ++i) {
318 expected = std::pow(
static_cast<double>(i + 1) * delta, 2);
319 EXPECT_NEAR(line[samplesPerSide - i - 1], expected, 1e-2);
320 EXPECT_NEAR(line[samplesPerSide + i + 1], expected, 1e-2);
326 constexpr unsigned int samplesPerSide = 50;
327 std::vector<double> line(2 * samplesPerSide + 1);
329 constexpr double length = 4.4;
330 constexpr double bendAngle = M_PI / 8.0;
331 constexpr double sextupoleField = 1.0;
332 setBendAngle(bendAngle,
false);
333 setElementLength(length);
334 setAperture(3.5, 3.5);
335 setFringeField(length / 2, 0.3, 0.3);
337 setEntranceAngle(0.0);
340 setTransProfile({0, 0, 0, sextupoleField});
341 grabTransverseDataLine(line, 0, 3.0, {0, 0, 0}, length, bendAngle);
343 double delta = std::cbrt(line[samplesPerSide + 1] - line[samplesPerSide]);
344 EXPECT_NEAR(delta, 0.03, 1e-5);
345 EXPECT_NEAR(line[samplesPerSide], expected, 1e-5);
346 for (
size_t i = 0; i < samplesPerSide; ++i) {
347 expected = std::pow(
static_cast<double>(i + 1) * delta, 3);
348 EXPECT_NEAR(line[samplesPerSide - i - 1], expected, 1e-2);
349 EXPECT_NEAR(line[samplesPerSide + i + 1], expected, 1e-2);
352 setTransProfile({0, 0, 0, sextupoleField});
353 grabTransverseDataLine(line, -length / 2, 3.0, {0, 0, 0}, length, bendAngle);
355 delta = std::cbrt(line[samplesPerSide + 1] - line[samplesPerSide]);
356 EXPECT_NEAR(delta, 0.023811, 1e-5);
357 EXPECT_NEAR(line[samplesPerSide], expected, 1e-5);
358 for (
size_t i = 0; i < samplesPerSide; ++i) {
359 expected = std::pow(
static_cast<double>(i + 1) * delta, 3);
360 EXPECT_NEAR(line[samplesPerSide - i - 1], expected, 1e-2);
361 EXPECT_NEAR(line[samplesPerSide + i + 1], expected, 1e-2);
367 constexpr unsigned int samplesPerSide = 50;
368 std::vector<double> line(2 * samplesPerSide + 1);
370 constexpr double length = 4.4;
371 constexpr double bendAngle = M_PI / 8.0;
372 constexpr double decapoleField = 1.0;
373 setBendAngle(bendAngle,
false);
374 setElementLength(length);
375 setAperture(3.5, 3.5);
376 setFringeField(length / 2, 0.3, 0.3);
378 setEntranceAngle(0.0);
381 setTransProfile({0, 0, 0, 0, decapoleField});
382 grabTransverseDataLine(line, 0, 3.0, {0, 0, 0}, length, bendAngle);
384 double delta = std::pow(line[samplesPerSide + 1] - line[samplesPerSide], 1.0 / 4.0);
385 EXPECT_NEAR(delta, 0.03, 1e-5);
386 EXPECT_NEAR(line[samplesPerSide], expected, 1e-5);
387 for (
size_t i = 0; i < samplesPerSide; ++i) {
388 expected = std::pow(
static_cast<double>(i + 1) * delta, 4);
389 EXPECT_NEAR(line[samplesPerSide - i - 1], expected, 1e-2);
390 EXPECT_NEAR(line[samplesPerSide + i + 1], expected, 1e-2);
393 setTransProfile({0, 0, 0, 0, decapoleField});
394 grabTransverseDataLine(line, -length / 2, 3.0, {0, 0, 0}, length, bendAngle);
396 delta = std::pow(line[samplesPerSide + 1] - line[samplesPerSide], 1.0 / 4.0);
397 EXPECT_NEAR(delta, 0.025227, 1e-5);
398 EXPECT_NEAR(line[samplesPerSide], expected, 1e-5);
399 for (
size_t i = 0; i < samplesPerSide; ++i) {
400 expected = std::pow(
static_cast<double>(i + 1) * delta, 4);
401 EXPECT_NEAR(line[samplesPerSide - i - 1], expected, 1e-2);
402 EXPECT_NEAR(line[samplesPerSide + i + 1], expected, 1e-2);
408 constexpr unsigned int samplesPerSide = 20;
409 std::vector<double> divLine(2 * samplesPerSide + 1);
410 std::vector<double> fieldLine(2 * samplesPerSide + 1);
411 std::vector<Vector_t<double, 3>> curlLine(2 * samplesPerSide + 1);
412 constexpr double dr = 0.001;
414 constexpr double length = 4.4;
415 constexpr double bendAngle = M_PI / 8.0;
416 setBendAngle(bendAngle,
false);
417 setElementLength(length);
418 setAperture(3.5, 3.5);
419 setFringeField(length / 2, 0.3, 0.3);
421 setEntranceAngle(0.0);
423 setTransProfile({1, 1, 1, 1, 1});
425 grabLongitudinalDivCurlLine(
426 fieldLine, divLine, curlLine, 0, length * 1.5, {}, length, bendAngle, 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 = M_PI / 8.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, bendAngle);
465 for (
const double val : line) {
469 grabTransverseDataLine(line, -2.9, 3.0, {0, 0, 0}, length, bendAngle);
470 for (
const double val : line) {
474 grabTransverseDataLine(line, 0.0, 3.0, {0, 0, 0}, length, bendAngle);
475 for (
const double val : line) {
479 grabTransverseDataLine(line, 2.9, 3.0, {0, 0, 0}, length, bendAngle);
480 for (
const double val : line) {
484 grabTransverseDataLine(line, 3.1, 3.0, {0, 0, 0}, length, bendAngle);
485 for (
const double val : line) {
492 std::vector<double> line(9);
494 constexpr double length = 4;
495 constexpr double bendAngle = M_PI / 8.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, bendAngle);
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, bendAngle);
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);
static Vector_t< double, 3 > curvilinearToGlobal(const Vector_t< double, 3 > &local, const Vector_t< double, 3 > &elementEntry, const double elementLength, const double bendAngle)
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 bendAngle, const double dr)
void grabTransverseDataLine(std::vector< double > &line, const double s, const double width, const Vector_t< double, 3 > &elementEntry, const double elementLength, const double bendAngle)
void grabVerticalDataLine(std::vector< double > &line, const double s, const double height, const Vector_t< double, 3 > &elementEntry, const double elementLength, const double bendAngle)