Drift Example¶
Simple 1 m drift.
In [1]:
Copied!
from pmd_beamphysics import single_particle
from pmd_beamphysics.units import mec2
import impact.z as IZ
from pmd_beamphysics import single_particle
from pmd_beamphysics.units import mec2
import impact.z as IZ
In [2]:
Copied!
reference_particle_mass = mec2
energy = 10e6
gamma = energy / mec2
sigma_x0 = 0.001
norm_emit_x = 1e-12
norm_emit_y = 1e-12
beta_x = sigma_x0**2 * gamma / norm_emit_x
beta_y = beta_x
initial_particles = single_particle(pz=energy, px=0.01 * energy)
reference_particle_mass = mec2
energy = 10e6
gamma = energy / mec2
sigma_x0 = 0.001
norm_emit_x = 1e-12
norm_emit_y = 1e-12
beta_x = sigma_x0**2 * gamma / norm_emit_x
beta_y = beta_x
initial_particles = single_particle(pz=energy, px=0.01 * energy)
In [3]:
Copied!
input = IZ.ImpactZInput(
# line 1
ncpu_y=1,
ncpu_z=1,
# line 2
seed=6,
n_particle=100_000,
integrator_type="linear_map",
err=1,
diagnostic_type="extended",
# line 3
nx=32,
ny=32,
nz=32,
boundary_type="trans_open_longi_open",
radius_x=0.15, # particles die after this point
radius_y=0.15,
z_period_size=0.0, # TODO we think this is unused based on fortran code reading
# line 4
distribution="read",
restart=0,
subcycle=0, # TODO what is this?
nbunch=1,
# line 5
# line 6
# line 7
# line 8
twiss_alpha_x=0.0,
twiss_beta_x=beta_x,
twiss_norm_emit_x=norm_emit_x,
twiss_mismatch_x=1.0,
twiss_mismatch_px=1.0,
twiss_offset_x=0.0,
twiss_offset_px=0.0,
# line 9
twiss_alpha_y=0.0,
twiss_beta_y=beta_y,
twiss_norm_emit_y=norm_emit_y,
twiss_mismatch_y=1.0,
twiss_mismatch_py=1.0,
twiss_offset_y=0.0,
twiss_offset_py=0.0,
# line 10
twiss_alpha_z=1e-9,
twiss_beta_z=5e9, # 1.0,
twiss_norm_emit_z=1e-9, # 1e-6,
twiss_mismatch_z=1.0,
twiss_mismatch_e_z=1.0,
twiss_offset_phase_z=0.0,
twiss_offset_energy_z=0.0,
# line 11
# average_current=1.0, # space charge on
average_current=0.0, # space charge off
reference_kinetic_energy=energy - mec2, # eV -> 10MeV total energy
reference_particle_mass=reference_particle_mass,
reference_particle_charge=-1.0,
reference_frequency=1e9, # arbitrarily set to 1GHz here
initial_phase_ref=0.0,
lattice=[
IZ.WriteFull(file_id=1999),
# Drift(length=1e-9, steps=10, map_steps=10), # <- to get initial particles, set this and set average_current to 0.0
IZ.Drift(length=1.0, radius=1.0, steps=10, map_steps=10, name="drift1"),
IZ.WriteFull(file_id=2000, name="final_particles"),
],
)
input = IZ.ImpactZInput(
# line 1
ncpu_y=1,
ncpu_z=1,
# line 2
seed=6,
n_particle=100_000,
integrator_type="linear_map",
err=1,
diagnostic_type="extended",
# line 3
nx=32,
ny=32,
nz=32,
boundary_type="trans_open_longi_open",
radius_x=0.15, # particles die after this point
radius_y=0.15,
z_period_size=0.0, # TODO we think this is unused based on fortran code reading
# line 4
distribution="read",
restart=0,
subcycle=0, # TODO what is this?
nbunch=1,
# line 5
# line 6
# line 7
# line 8
twiss_alpha_x=0.0,
twiss_beta_x=beta_x,
twiss_norm_emit_x=norm_emit_x,
twiss_mismatch_x=1.0,
twiss_mismatch_px=1.0,
twiss_offset_x=0.0,
twiss_offset_px=0.0,
# line 9
twiss_alpha_y=0.0,
twiss_beta_y=beta_y,
twiss_norm_emit_y=norm_emit_y,
twiss_mismatch_y=1.0,
twiss_mismatch_py=1.0,
twiss_offset_y=0.0,
twiss_offset_py=0.0,
# line 10
twiss_alpha_z=1e-9,
twiss_beta_z=5e9, # 1.0,
twiss_norm_emit_z=1e-9, # 1e-6,
twiss_mismatch_z=1.0,
twiss_mismatch_e_z=1.0,
twiss_offset_phase_z=0.0,
twiss_offset_energy_z=0.0,
# line 11
# average_current=1.0, # space charge on
average_current=0.0, # space charge off
reference_kinetic_energy=energy - mec2, # eV -> 10MeV total energy
reference_particle_mass=reference_particle_mass,
reference_particle_charge=-1.0,
reference_frequency=1e9, # arbitrarily set to 1GHz here
initial_phase_ref=0.0,
lattice=[
IZ.WriteFull(file_id=1999),
# Drift(length=1e-9, steps=10, map_steps=10), # <- to get initial particles, set this and set average_current to 0.0
IZ.Drift(length=1.0, radius=1.0, steps=10, map_steps=10, name="drift1"),
IZ.WriteFull(file_id=2000, name="final_particles"),
],
)
In [4]:
Copied!
input.space_charge_off()
# input.space_charge_on(current=1.0)
input.space_charge_off()
# input.space_charge_on(current=1.0)
In [5]:
Copied!
I = IZ.ImpactZ(input, initial_particles=initial_particles)
output = I.run(verbose=True)
I = IZ.ImpactZ(input, initial_particles=initial_particles)
output = I.run(verbose=True)
Configured to run in: /tmp/tmpkz0f8h8a Running Impact-Z in /tmp/tmpkz0f8h8a /home/runner/miniconda3/envs/lume-impact-dev/bin/ImpactZexe
Read input data from file - ImpactZ.in: !----------------------------------------------------------- ! IMPACT-Z: Integrated Map and PArticle Tracking Code: Version 2.7 ! Copyright of The Regents of the University of California !----------------------------------------------------------- check random: 0 0.320923269 pass generating initial distribution... pass setting up lattice... enter elment (type code): 1 -2 zedge: 0.0000000000000000 enter elment (type code): 2 0 zedge: 0.0000000000000000 j, nstep, z 1 1 0.10000000000000001 j, nstep, z 2 2 0.20000000000000001 j, nstep, z 3 3 0.29999999999999999 j, nstep, z 4 4 0.39999999999999997 j, nstep, z 5 5 0.49999999999999994 j, nstep, z 6 6 0.59999999999999998 j, nstep, z 7 7 0.70000000000000007 j, nstep, z 8 8 0.80000000000000016 j, nstep, z 9 9 0.90000000000000024 j, nstep, z 10 10 1.0000000000000002 enter elment (type code): 3 -2 zedge: 1.0000000000000002 kvdist 0.00000 seconds gaussn 0.00000 seconds normdv 0.00000 seconds correct 0.00000 seconds integ 0.00000 seconds map1 0.00000 seconds map2 0.00000 seconds spch2d 0.00000 seconds boundgeom 0.00000 seconds greenf 0.00000 seconds rhofas 0.00000 seconds ntrslo 0.00000 seconds fft2dhpf 0.00000 seconds mfft_local1 0.00000 seconds diag 0.00000 seconds ufield 0.00000 seconds force 0.00000 seconds charge 0.00000 seconds ubeamln 0.00000 seconds ptsmv 0.00000 seconds init 0.00000 seconds transp 0.00000 seconds enlarge 0.00000 seconds shrink 0.00000 seconds guardsum 0.00000 seconds boundint 0.00000 seconds guardexch 0.00000 seconds time: 0.0000000000000000 Success - execution took 0.05s.
In [6]:
Copied!
I.output
I.output
Out[6]:
ImpactZOutput(
run=RunInfo(
error_reason='',
run_script='/home/runner/miniconda3/envs/lume-impact-dev/bin/ImpactZexe',
run_time=0.05455274900009499
),
stats=OutputStats(
beta_ref=array([0.99869355, 0.99869355, 0.99869355, 0.99869355, 0.99869355,
0.99869355, 0.99869355, 0.99869355, 0.99869355, 0.99869355,
0.99869355]),
charge_state_n_particle=array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]),
gamma_ref=array([19.56951181, 19.56951181, 19.56951181, 19.56951181, 19.56951181,
19.56951181, 19.56951181, 19.56951181, 19.56951181, 19.56951181,
19.56951181]),
kinetic_energy_ref=array([9489001.04931, 9489001.04931, 9489001.04931, 9489001.04931,
9489001.04931, 9489001.04931, 9489001.04931, 9489001.04931,
9489001.04931, 9489001.04931, 9489001.04931]),
loadbalance_max_n_particle=array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]),
loadbalance_min_n_particle=array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]),
max_amplitude_energy_dev=array([], dtype=float64),
max_amplitude_gammabeta_x=array([], dtype=float64),
max_amplitude_gammabeta_y=array([], dtype=float64),
max_amplitude_phase=array([], dtype=float64),
max_amplitude_x=array([], dtype=float64),
max_amplitude_y=array([], dtype=float64),
max_r=array([0. , 0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008,
0.009, 0.01 ]),
mean_phase_deg=array([0. , 0.00558626, 0.01117252, 0.01675878, 0.02234504,
0.0279313 , 0.03351756, 0.03910382, 0.04469007, 0.05027633,
0.05586259]),
mean_px_over_p0=array([0.01001308, 0.01001308, 0.01001308, 0.01001308, 0.01001308,
0.01001308, 0.01001308, 0.01001308, 0.01001308, 0.01001308,
0.01001308]),
mean_py_over_p0=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
mean_x=array([0. , 0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008,
0.009, 0.01 ]),
mean_y=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
moment3_energy=array([], dtype=float64),
moment3_phase=array([], dtype=float64),
moment3_px_over_p0=array([], dtype=float64),
moment3_py_over_p0=array([], dtype=float64),
moment3_x=array([], dtype=float64),
moment3_y=array([], dtype=float64),
moment4_energy=array([], dtype=float64),
moment4_phase=array([], dtype=float64),
moment4_px_over_p0=array([], dtype=float64),
moment4_py_over_p0=array([], dtype=float64),
moment4_x=array([], dtype=float64),
moment4_y=array([], dtype=float64),
n_particle=array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]),
norm_emit_x=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
norm_emit_y=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
norm_emit_z=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
phase_ref=array([ 0. , 2.09858673, 4.19717345, 6.29576018, 8.39434691,
10.49293363, 12.59152036, 14.69010709, 16.78869382, 18.88728054,
20.98586727]),
sigma_energy=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
sigma_phase_deg=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
sigma_px_over_p0=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
sigma_py_over_p0=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
sigma_x=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
sigma_y=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
twiss_alpha_x=array([nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]),
twiss_alpha_y=array([nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]),
twiss_alpha_z=array([nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]),
z=array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ]),
max_abs_x=array([0. , 0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008,
0.009, 0.01 ]),
max_abs_px_over_p0=array([], dtype=float64),
max_abs_y=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
max_abs_py_over_p0=array([], dtype=float64),
max_phase=array([0. , 0.00558626, 0.01117252, 0.01675878, 0.02234504,
0.0279313 , 0.03351756, 0.03910382, 0.04469007, 0.05027633,
0.05586259]),
max_energy_dev=array([], dtype=float64),
mean_r=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
sigma_r=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
mean_r_90percent=array([2.14710531e-12, 2.38568345e-12, 2.38568345e-12, 2.38568345e-12,
2.38568345e-12, 2.38568345e-12, 2.38568345e-12, 2.38568345e-12,
2.38568345e-12, 2.38568345e-12, 2.38568345e-12]),
mean_r_95percent=array([2.26638894e-12, 2.38567801e-12, 2.38567801e-12, 2.38567801e-12,
2.38567801e-12, 2.38567801e-12, 2.38567801e-12, 2.38567801e-12,
2.38567801e-12, 2.38567801e-12, 2.38567801e-12]),
mean_r_99percent=array([2.36181584e-12, 2.38567365e-12, 2.38567365e-12, 2.38567365e-12,
2.38567365e-12, 2.38567365e-12, 2.38567365e-12, 2.38567365e-12,
2.38567365e-12, 2.38567365e-12, 2.38567365e-12]),
max_r_rel=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
max_abs_gammabeta_x=array([0.19569512, 0.19569512, 0.19569512, 0.19569512, 0.19569512,
0.19569512, 0.19569512, 0.19569512, 0.19569512, 0.19569512,
0.19569512]),
max_abs_gammabeta_y=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
max_gamma_rel=array([0.02651047, 0.02651047, 0.02651047, 0.02651047, 0.02651047,
0.02651047, 0.02651047, 0.02651047, 0.02651047, 0.02651047,
0.02651047]),
norm_emit_x_90percent=array([nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]),
norm_emit_x_95percent=array([nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]),
norm_emit_x_99percent=array([nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]),
norm_emit_y_90percent=array([nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]),
norm_emit_y_95percent=array([nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]),
norm_emit_y_99percent=array([nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]),
norm_emit_z_90percent=array([nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]),
norm_emit_z_95percent=array([nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]),
norm_emit_z_99percent=array([nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]),
energy_ref=array([10000000., 10000000., 10000000., 10000000., 10000000., 10000000.,
10000000., 10000000., 10000000., 10000000., 10000000.]),
mean_energy=array([10013546.82056295, 10013546.82056295, 10013546.82056295,
10013546.82056295, 10013546.82056295, 10013546.82056295,
10013546.82056295, 10013546.82056295, 10013546.82056295,
10013546.82056295, 10013546.82056295]),
mean_gamma=array([19.59602228, 19.59602228, 19.59602228, 19.59602228, 19.59602228,
19.59602228, 19.59602228, 19.59602228, 19.59602228, 19.59602228,
19.59602228]),
mean_px=array([100000., 100000., 100000., 100000., 100000., 100000., 100000.,
100000., 100000., 100000., 100000.]),
mean_py=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
mean_t=array([0.00000000e+00, 3.34015968e-10, 6.68031937e-10, 1.00204791e-09,
1.33606387e-09, 1.67007984e-09, 2.00409581e-09, 2.33811178e-09,
2.67212775e-09, 3.00614372e-09, 3.34015968e-09]),
mean_t_rel=array([0.00000000e+00, 1.55173871e-14, 3.10347741e-14, 4.65521612e-14,
6.20695483e-14, 7.75869354e-14, 9.31043224e-14, 1.08621709e-13,
1.24139097e-13, 1.39656484e-13, 1.55173871e-13]),
p0c=array([9986935.46952186, 9986935.46952186, 9986935.46952186,
9986935.46952186, 9986935.46952186, 9986935.46952186,
9986935.46952186, 9986935.46952186, 9986935.46952186,
9986935.46952186, 9986935.46952186]),
sigma_px=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
sigma_py=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
sigma_t=array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]),
t_ref=array([0.00000000e+00, 3.34000451e-10, 6.68000902e-10, 1.00200135e-09,
1.33600180e-09, 1.67000226e-09, 2.00400271e-09, 2.33800316e-09,
2.67200361e-09, 3.00600406e-09, 3.34000451e-09]),
twiss_beta_x=array([], dtype=float64),
twiss_beta_y=array([], dtype=float64),
extra={}
),
reference_frequency=1000000000.0,
reference_species='electron'
)
In [7]:
Copied!
I.plot("mean_x")
I.plot("mean_x")