Tutorial¶
The solver of Kapchinsky-Vladimirsky envelope equation for electron beam with space charge.
Including libraries¶
First connect the necessary libraries and configure the graphics parameters.
[1]:
import numpy as np
import holoviews as hv
hv.extension('matplotlib')
import warnings
warnings.filterwarnings('ignore')
Some plotting options:
[2]:
%output size=200 backend='matplotlib' fig='png' dpi=100
%opts Curve Spread [aspect=3 show_grid=True] (linewidth=2 alpha=0.7)
%opts Spread (linewidth=1 alpha=0.4)
[3]:
import kenv as kv
kv.__version__
[3]:
'0.3.0.0'
Define accelerator beamline parameters¶
[4]:
acc = kv.Accelerator(z_start=0, z_stop=5, dz=0.01)
Define the accelerating field profile \(E_z(z)\):
[5]:
# Unique name, z-position [m], Ez [MV/m], Ez(z) profile
acc.add_accel('Acc. 1', 1.5, -1, 'Ez.dat')
acc.add_accel('Acc. 2', 3.5, -1, 'Ez.dat')
[6]:
acc.compile()
Let’s plot \(E_z(z):\)
[7]:
dim_z = hv.Dimension('z', unit='m')
dim_Ez = hv.Dimension('Ez', unit='MV/m', label='$E_z$')
[8]:
z = acc.z
hv.Curve((z, acc.Ez(z)), kdims=dim_z, vdims=dim_Ez)
[8]:
The same procedure is required to define the magnetic field profile \(B_z(z)\):
[9]:
# Unique name, z-position [m], Bz [T], Bz(z) profile
acc.add_solenoid('Sol. 1', 1.0, 0.05, 'Bz.dat')
acc.add_solenoid('Sol. 2', 2.0, 0.06, 'Bz.dat')
acc.add_solenoid('Sol. 3', 3.0, 0.07, 'Bz.dat')
acc.add_solenoid('Sol. 4', 4.0, 0.08, 'Bz.dat')
[10]:
acc.compile()
[11]:
dim_Bz = hv.Dimension('Bz', unit='Gs', label='$B_z$')
[12]:
z_Bz = hv.Curve((z, acc.Bz(z)*1e4), kdims=dim_z, vdims=dim_Bz)
[13]:
z_Bz
[13]:
Define the electron beam parameters¶
[14]:
beam = kv.Beam(
energy = 2, # MeV
current = 2e3, # A
radius_x = 50e-3, # initial r (m)
radius_y = 50e-3, # initial r (m)
radius_xp = 10e-3, # initial r' (rad)
radius_yp = 10e-3, # initial r' (rad)
#x = 2.5e-2, # horizontal centroid position (m)
xp = 10e-3, # horizontal centroid angle (rad)
y = 0, # vertical centroid position (m)
normalized_emittance = 1000e-6 # m*rad
)
Run the simulation¶
Now we can run the simulation in order to find the beam envelope:
[15]:
sim = kv.Simulation(beam, acc)
[16]:
sim.track(centroid=True)
Plot the simulation results¶
[17]:
dim_E = hv.Dimension('E', unit='MeV', label='Electron energy',
range=(0,None))
[18]:
hv.Curve((z, sim.gamma(z)*0.511), kdims=dim_z, vdims=dim_E)
[18]:
[19]:
dim_x = hv.Dimension('x', unit='cm', range=(-15,+15))
dim_y = hv.Dimension('y', unit='cm', range=(-15,+15))
Beam centroid:
[20]:
x = sim.centroid_x # m
z_x = hv.Curve((z, x(z)*100), kdims=dim_z, vdims=dim_x)#.opts(linestyle='--')
[21]:
z_x
[21]:
[22]:
y = sim.centroid_y # m
z_y = hv.Curve((z, y(z)), kdims=dim_z, vdims=dim_y)#.opts(linestyle='--')
[23]:
z_y
[23]:
Beam envelope:
[24]:
x_size = sim.envelope_x # m
z_x * hv.Spread((z, 0, x_size(z)*100))
[24]:
[25]:
print(acc)
Accelerator structure.
Solenoids:
[ 1.0 m, 0.05 T, Bz.dat, Sol. 1, 0.0 m, 0.0 rad, 0.0 m, 0.0 rad]
[ 2.0 m, 0.06 T, Bz.dat, Sol. 2, 0.0 m, 0.0 rad, 0.0 m, 0.0 rad]
[ 3.0 m, 0.07 T, Bz.dat, Sol. 3, 0.0 m, 0.0 rad, 0.0 m, 0.0 rad]
[ 4.0 m, 0.08 T, Bz.dat, Sol. 4, 0.0 m, 0.0 rad, 0.0 m, 0.0 rad]
Accelerating modules:
[ 1.5 m, -1 T, Ez.dat, Acc. 1, 0.0 m, 0.0 rad, 0.0 m, 0.0 rad]
[ 3.5 m, -1 T, Ez.dat, Acc. 2, 0.0 m, 0.0 rad, 0.0 m, 0.0 rad]
Quadrupoles:
Correctors x:
Correctors y:
[26]:
print(beam)
Beam parameters:
Current 2000.0 A
Energy 2 MeV
Total momentum 2.4584539418911224 MeV/c
Rel. factor 4.913902396989699
Radius x 50.0 mm
Radius y 50.0 mm
Radius x prime 10.0 mrad
Radius y prime 10.0 mrad
Horizontal centroid position 0.0 mm
Vertical centroid position 0.0 mm
Horizontal centroid angle 10.0 mrad
Vertical centroid angle 0.0 mrad
Larmor angle 0.0 rad
Norm. emitt x 1000.0 mm*mrad