Skip to content

Commit

Permalink
Add tests for Transport
Browse files Browse the repository at this point in the history
  • Loading branch information
Robin Tesse committed Jan 9, 2024
1 parent a4bc83b commit 36a23d4
Showing 1 changed file with 105 additions and 116 deletions.
221 changes: 105 additions & 116 deletions tests/manzoni/test_transport_integration.py
Original file line number Diff line number Diff line change
@@ -1,157 +1,146 @@
import georges_core
from itertools import product

import numpy as np
import pytest
from georges_core import ureg

import georges.manzoni
import georges.manzoni.integrators
from georges.manzoni import Beam, Input
from georges.manzoni.elements import Quadrupole, SBend
from georges import ureg as _ureg
from georges.manzoni import Input
from georges.manzoni.beam import MadXBeam, TransportBeam
from georges.manzoni.integrators import (
TransportFirstOrderTaylorIntegrator,
TransportFirstOrderTaylorIntegratorExact,
TransportSecondOrderTaylorIntegrator,
TransportSecondOrderTaylorIntegratorExact,
)


@pytest.mark.parametrize(
"k1, k2, length, energy, x, px, y, py, dpp",
[
# Combined function with K1 (K2 = 0)
(1.0, 0.0, 1.0, 230, 0.0, 0.0, 0.0, 0.0, 0.0),
(-1.0, 0.0, 1.0, 230, 0.0, 0.0, 0.0, 0.0, 0.0),
(1.0, 0.0, 10.0, 230, 0.0, 0.0, 0.0, 0.0, 0.0),
(-1.0, 0.0, 10.0, 230, 0.0, 0.0, 0.0, 0.0, 0.0),
(1.0, 0.0, 1.0, 2300, 0.0, 0.0, 0.0, 0.0, 0.0),
(-1.0, 0.0, 1.0, 2300, 0.0, 0.0, 0.0, 0.0, 0.0),
(1.0, 0.0, 10.0, 2300, 0.0, 0.0, 0.0, 0.0, 0.0),
(-1.0, 0.0, 10.0, 2300, 0.0, 0.0, 0.0, 0.0, 0.0),
],
"k1, k2, length, angle, e1, e2, energy, x, px, y, py, dpp, integrator",
product(
[-1, 0, 1], # k1
[-0.1, 0, 0.1], # k2
[1, 10], # length
[-10, 0.0, 10], # angle
[-0.4346, 0.0, 0.4346], # e1
[-0.2889, 0.0, 0.2889], # e2
[230, 2300], # energy
[0.0], # x
[0.0], # px
[0.0], # y
[0.0], # py
[0], # dpp
[
TransportFirstOrderTaylorIntegrator,
TransportFirstOrderTaylorIntegratorExact,
TransportSecondOrderTaylorIntegrator,
TransportSecondOrderTaylorIntegratorExact,
], # Transport integrator
),
)
def test_transport_combined_dipole(k1, k2, length, energy, x, px, y, py, dpp):
kin = georges_core.Kinematics(energy * ureg.MeV)

pt = Beam.compute_pt(
dpp=dpp,
beta=kin.beta,
def test_transport_combined_dipole(k1, k2, length, angle, e1, e2, energy, x, px, y, py, dpp, integrator):
kin = georges.Kinematics(energy * _ureg.MeV)
sbend = georges.Element.SBend(
NAME="SB1",
L=length * _ureg.m,
ANGLE=angle * _ureg.degrees,
K1=k1 * _ureg.m**-2,
K2=k2 * _ureg.m**-3,
E1=e1 * _ureg.radians,
E2=e2 * _ureg.radians,
)

# MAD-X
obs_madx = georges.manzoni.BeamObserver()
input_madx = Input(
sequence=[
SBend(
NAME="D1",
L=length * ureg.meter,
ANGLE=30 * ureg.rad,
K1=k1 / ureg.m**2,
integrator=georges.manzoni.integrators.MadXIntegrator,
),
],
)
beam_madx = Beam(
sequence = georges.PlacementSequence(name="Sequence")
sequence.place(sbend, at_entry=0 * _ureg.m)

input_manzoni = Input.from_sequence(sequence=sequence)
input_manzoni.freeze()

# MADX Tracking
beam_madx = MadXBeam(
kinematics=kin,
distribution=np.array([[x, px, y, py, dpp, pt]]),
distribution=np.array([[x, px, y, py, dpp]]),
)
input_madx.track(
mean_obs_madx = input_manzoni.track(
beam=beam_madx,
observers=obs_madx,
observers=georges.manzoni.BeamObserver(),
)
res_madx = obs_madx.to_df().at["D1", "BEAM_OUT"]
res_madx = mean_obs_madx.to_df().at["SB1", "BEAM_OUT"]

# Transport
obs_transport = georges.manzoni.BeamObserver()
input_transport = Input(
sequence=[
SBend(
NAME="D1",
L=length * ureg.meter,
ANGLE=30 * ureg.rad,
K1=k1 / ureg.m**2,
integrator=georges.manzoni.integrators.TransportSecondOrderTaylorIntegrator,
),
],
)
beam_transport = Beam(
beam_transport = TransportBeam(
kinematics=kin,
distribution=np.array([[x, px, y, py, 0, dpp]]),
distribution=np.array([[x, px, y, py, dpp]]),
)
input_transport.track(

input_manzoni.set_integrator(integrator=integrator)

mean_obs_transport = input_manzoni.track(
beam=beam_transport,
observers=obs_transport,
observers=georges.manzoni.BeamObserver(),
)
res_transport = obs_transport.to_df().at["D1", "BEAM_OUT"]
res_transport = mean_obs_transport.to_df().at["SB1", "BEAM_OUT"]

assert np.all(np.isclose(res_madx[0][0:4], res_transport[0][0:4]))


@pytest.mark.parametrize(
"k1, length, energy, x, px, y, py, dpp",
[
# Pure quadrupole
(1.0, 1.0, 230, 0.0, 0.0, 0.0, 0.0, 0.0),
(1.0, 1.0, 230, 0.01, 0.0, 0.0, 0.0, 0.0),
(1.0, 10.0, 230, 0.0, 0.0, 0.0, 0.0, 0.0),
(1.0, 10.0, 230, 0.01, 0.0, 0.0, 0.0, 0.0),
(1.0, 1.0, 2300, 0.0, 0.0, 0.0, 0.0, 0.0),
(1.0, 1.0, 2300, 0.01, 0.0, 0.0, 0.0, 0.0),
(1.0, 10.0, 2300, 0.0, 0.0, 0.0, 0.0, 0.0),
(1.0, 10.0, 2300, 0.01, 0.0, 0.0, 0.0, 0.0),
(-1.0, 1.0, 230, 0.0, 0.0, 0.0, 0.0, 0.0),
(-1.0, 1.0, 230, 0.01, 0.0, 0.0, 0.0, 0.0),
(-1.0, 10.0, 230, 0.0, 0.0, 0.0, 0.0, 0.0),
(-1.0, 10.0, 230, 0.01, 0.0, 0.0, 0.0, 0.0),
(-1.0, 1.0, 2300, 0.0, 0.0, 0.0, 0.0, 0.0),
(-1.0, 1.0, 2300, 0.01, 0.0, 0.0, 0.0, 0.0),
(-1.0, 10.0, 2300, 0.0, 0.0, 0.0, 0.0, 0.0),
(-1.0, 10.0, 2300, 0.01, 0.0, 0.0, 0.0, 0.0),
],
"k1, length, energy, x, px, y, py, dpp, integrator",
product(
[-1, 0, 1], # k1
[1, 10], # length
[230, 2300], # energy
[-0.001, 0.0, 0.001], # x
[-0.001, 0.0, 0.001], # px
[-0.001, 0.0, 0.001], # y
[-0.001, 0.0, 0.001], # py
[0], # dpp
[
TransportFirstOrderTaylorIntegrator,
TransportFirstOrderTaylorIntegratorExact,
TransportSecondOrderTaylorIntegrator,
TransportSecondOrderTaylorIntegratorExact,
], # Transport integrator
),
)
def test_transport_quadrupole(k1, length, energy, x, px, y, py, dpp):
kin = georges_core.Kinematics(energy * ureg.MeV)

pt = Beam.compute_pt(
dpp=dpp,
beta=kin.beta,
def test_transport_quadrupole(k1, length, energy, x, px, y, py, dpp, integrator):
kin = georges.Kinematics(energy * _ureg.MeV)
quad = georges.Element.Quadrupole(
NAME="Q1",
L=length * _ureg.m,
K1=k1 * _ureg.m**-2,
)

# MAD-X
obs_madx = georges.manzoni.BeamObserver()
input_madx = Input(
sequence=[
Quadrupole(
NAME="Q1",
L=length * ureg.meter,
K1=k1 / ureg.meter**2,
integrator=georges.manzoni.integrators.MadXIntegrator,
),
],
)
beam_madx = Beam(
sequence = georges.PlacementSequence(name="Sequence")
sequence.place(quad, at_entry=0 * _ureg.m)

input_manzoni = Input.from_sequence(sequence=sequence)
input_manzoni.freeze()

# MADX Tracking
beam_madx = MadXBeam(
kinematics=kin,
distribution=np.array([[x, px, y, py, dpp, pt]]),
distribution=np.array([[x, px, y, py, dpp]]),
)
input_madx.track(
mean_obs_madx = input_manzoni.track(
beam=beam_madx,
observers=obs_madx,
observers=georges.manzoni.BeamObserver(),
)
res_madx = obs_madx.to_df().at["Q1", "BEAM_OUT"]
res_madx = mean_obs_madx.to_df().at["Q1", "BEAM_OUT"]

# Transport
obs_transport = georges.manzoni.BeamObserver()
input_transport = Input(
sequence=[
Quadrupole(
NAME="Q1",
L=length * ureg.meter,
K1=k1 / ureg.meter**2,
integrator=georges.manzoni.integrators.TransportSecondOrderTaylorIntegrator,
),
],
)
beam_transport = Beam(
beam_transport = TransportBeam(
kinematics=kin,
distribution=np.array([[x, px, y, py, 0, dpp]]),
distribution=np.array([[x, px, y, py, dpp]]),
)
input_transport.track(

input_manzoni.set_integrator(integrator=integrator)

mean_obs_transport = input_manzoni.track(
beam=beam_transport,
observers=obs_transport,
observers=georges.manzoni.BeamObserver(),
)
res_transport = obs_transport.to_df().at["Q1", "BEAM_OUT"]
res_transport = mean_obs_transport.to_df().at["Q1", "BEAM_OUT"]

assert np.all(np.isclose(res_madx[0][0:4], res_transport[0][0:4]))

0 comments on commit 36a23d4

Please sign in to comment.