Space Charge Benchmark¶
Impact-Z only space charge benchmark from
C. Mayes, R. Ryne, D. Sagan 3D SPACE CHARGE IN BMAD https://epaper.kek.jp/ipac2018/papers/thpak085.pdf
In [1]:
Copied!
import impact.z as IZ
from impact.z import ImpactZ, ImpactZInput, WriteFull, Drift
from scipy.constants import c
from pmd_beamphysics.units import mec2
import numpy as np
import impact.z as IZ
from impact.z import ImpactZ, ImpactZInput, WriteFull, Drift
from scipy.constants import c
from pmd_beamphysics.units import mec2
import numpy as np
In [2]:
Copied!
energy0 = 10e6
gamma0 = energy0 / mec2
betagamma0 = np.sqrt(gamma0**2 - 1)
sigma_x0 = 1e-3
sigma_y0 = 1e-3
sigma_z0 = 0.1e-3
beta_x0 = 1000
beta_y0 = 100
n_particle = 100_000
energy0 = 10e6
gamma0 = energy0 / mec2
betagamma0 = np.sqrt(gamma0**2 - 1)
sigma_x0 = 1e-3
sigma_y0 = 1e-3
sigma_z0 = 0.1e-3
beta_x0 = 1000
beta_y0 = 100
n_particle = 100_000
In [3]:
Copied!
input = ImpactZInput(
    initial_particles=None,
    ncpu_y=1,
    ncpu_z=1,
    seed=-1,
    n_particle=n_particle,
    nx=32,
    ny=32,
    nz=32,
    distribution=IZ.DistributionType.gauss,
    twiss_beta_x=beta_x0,
    twiss_norm_emit_x=sigma_x0**2 * betagamma0 / beta_x0,
    twiss_beta_y=beta_y0,
    twiss_norm_emit_y=sigma_y0**2 * betagamma0 / beta_y0,
    average_current=0.13000000000000006,
    reference_kinetic_energy=9489001.04931,
    reference_particle_mass=510998.95069,
    reference_particle_charge=-1.0,
    reference_frequency=1300000000.0,
    lattice=[
        WriteFull(name="initial_particles", file_id=100),
        Drift(
            name="P1",
            metadata={"bmad_csr": False, "bmad_id": 1},
            length=1.0,
            steps=100,
            map_steps=100,
        ),
        WriteFull(name="final_particles", file_id=101),
    ],
)
input.set_twiss_z(0.1e-3 / c, 1)
input
input = ImpactZInput(
    initial_particles=None,
    ncpu_y=1,
    ncpu_z=1,
    seed=-1,
    n_particle=n_particle,
    nx=32,
    ny=32,
    nz=32,
    distribution=IZ.DistributionType.gauss,
    twiss_beta_x=beta_x0,
    twiss_norm_emit_x=sigma_x0**2 * betagamma0 / beta_x0,
    twiss_beta_y=beta_y0,
    twiss_norm_emit_y=sigma_y0**2 * betagamma0 / beta_y0,
    average_current=0.13000000000000006,
    reference_kinetic_energy=9489001.04931,
    reference_particle_mass=510998.95069,
    reference_particle_charge=-1.0,
    reference_frequency=1300000000.0,
    lattice=[
        WriteFull(name="initial_particles", file_id=100),
        Drift(
            name="P1",
            metadata={"bmad_csr": False, "bmad_id": 1},
            length=1.0,
            steps=100,
            map_steps=100,
        ),
        WriteFull(name="final_particles", file_id=101),
    ],
)
input.set_twiss_z(0.1e-3 / c, 1)
input
Out[3]:
ImpactZInput(
    seed=-1,
    n_particle=100000,
    nx=32,
    ny=32,
    nz=32,
    distribution=IZ.DistributionType.gauss,
    twiss_beta_x=1000.0,
    twiss_norm_emit_x=1.954394516081986e-08,
    twiss_beta_y=100.0,
    twiss_norm_emit_y=1.9543945160819862e-07,
    twiss_beta_z=156107.99655273516,
    twiss_norm_emit_z=1.5610799655273516e-07,
    average_current=0.13000000000000006,
    reference_kinetic_energy=9489001.04931,
    reference_particle_mass=510998.95069,
    reference_particle_charge=-1.0,
    reference_frequency=1300000000.0,
    lattice=[
        WriteFull(name='initial_particles', file_id=100),
        Drift(name='P1', metadata={'bmad_csr': False, 'bmad_id': 1}, length=1.0, steps=100, map_steps=100),
        WriteFull(name='final_particles', file_id=101)
    ]
)
Including defaults
ImpactZInput(
    initial_particles=None,
    ncpu_y=1,
    ncpu_z=1,
    gpu=IZ.GPUFlag.disabled,
    seed=-1,
    n_particle=100000,
    integrator_type=IZ.IntegratorType.linear_map,
    err=1,
    diagnostic_type=IZ.DiagnosticType.extended,
    nx=32,
    ny=32,
    nz=32,
    boundary_type=IZ.BoundaryType.trans_open_longi_open,
    radius_x=0.0,
    radius_y=0.0,
    z_period_size=0.0,
    distribution=IZ.DistributionType.gauss,
    restart=0,
    subcycle=0,
    nbunch=1,
    particle_list=[0],
    current_list=[0.0],
    charge_over_mass_list=[0.0],
    twiss_alpha_x=0.0,
    twiss_beta_x=1000.0,
    twiss_norm_emit_x=1.954394516081986e-08,
    twiss_mismatch_x=1.0,
    twiss_mismatch_px=1.0,
    twiss_offset_x=0.0,
    twiss_offset_px=0.0,
    twiss_alpha_y=0.0,
    twiss_beta_y=100.0,
    twiss_norm_emit_y=1.9543945160819862e-07,
    twiss_mismatch_y=1.0,
    twiss_mismatch_py=1.0,
    twiss_offset_y=0.0,
    twiss_offset_py=0.0,
    twiss_alpha_z=1e-09,
    twiss_beta_z=156107.99655273516,
    twiss_norm_emit_z=1.5610799655273516e-07,
    twiss_mismatch_z=1.0,
    twiss_mismatch_e_z=1.0,
    twiss_offset_phase_z=0.0,
    twiss_offset_energy_z=0.0,
    average_current=0.13000000000000006,
    reference_kinetic_energy=9489001.04931,
    reference_particle_mass=510998.95069,
    reference_particle_charge=-1.0,
    reference_frequency=1300000000.0,
    initial_phase_ref=0.0,
    lattice=[
        WriteFull(
            name='initial_particles',
            metadata={},
            length=0.0,
            steps=0,
            file_id=100,
            type_id=-2,
            unused_2=0.0,
            sample_frequency=0
        ),
        Drift(
            name='P1',
            metadata={'bmad_csr': False, 'bmad_id': 1},
            length=1.0,
            steps=100,
            map_steps=100,
            type_id=0,
            radius=1.0
        ),
        WriteFull(
            name='final_particles',
            metadata={},
            length=0.0,
            steps=0,
            file_id=101,
            type_id=-2,
            unused_2=0.0,
            sample_frequency=0
        )
    ],
    filename=None,
    verbose=False
)
In [4]:
Copied!
I = ImpactZ(input)
I.run()
P0 = I.output.particles["initial_particles"]
P1 = I.output.particles["final_particles"]
I = ImpactZ(input)
I.run()
P0 = I.output.particles["initial_particles"]
P1 = I.output.particles["final_particles"]
In [5]:
Copied!
P0 = I.output.particles["initial_particles"]
(
    P0["sigma_x"] / sigma_x0,
    P0["sigma_y"] / sigma_y0,
    P0["sigma_t"] * c / sigma_z0,
    P0["mean_energy"] / energy0,
)
P0 = I.output.particles["initial_particles"]
(
    P0["sigma_x"] / sigma_x0,
    P0["sigma_y"] / sigma_y0,
    P0["sigma_t"] * c / sigma_z0,
    P0["mean_energy"] / energy0,
)
Out[5]:
(np.float64(1.0001353400644952), np.float64(0.9969477451982962), np.float64(0.9984894952855285), np.float64(0.9999999992327986))
In [6]:
Copied!
P1.plot("delta_t", "energy")
P1.plot("delta_t", "energy")
Try again with particles¶
In [7]:
Copied!
I2 = ImpactZ(input, initial_particles=P0)
I2.run()
P3 = I2.output.particles["initial_particles"]
P4 = I2.output.particles["final_particles"]
I2 = ImpactZ(input, initial_particles=P0)
I2.run()
P3 = I2.output.particles["initial_particles"]
P4 = I2.output.particles["final_particles"]
In [8]:
Copied!
P4.plot("delta_t", "energy")
P4.plot("delta_t", "energy")