A. Petrenko (CERN, 2018)
Consider longitudinal dynamics of electron injection into a linear accelerator (e.g. plasma wakefield) with electric field
Ez(z,t)=Eacos(kz−ωt),
where wavevector k=ω/c=2π/λ. Defining ξ=z−ct,
Ez(ξ,t)=Eacoskξ.
Assuming only longitudinal movement of electron the equation of its motion then can be written as
{dpzdt=−eEacoskξdξdt=vz−cpz=γmvz
(e>0 is assumed here). Since v2zc2=(1+m2c2p2z)−1 therefore
{dpzcdt=−eEaccoskξdξcdt=(1+m2c2p2z)−1/2−1.
The dependence of ξ(pz), i.e. velosity bunching, can be found if we divide one equation by another:
eEaccoskξdξ=dpz−(1+m2c2p2z)−1/2dpz.
Both sides are easy to integrate:
eEakcd(sinkξ)=dpz−mcd√1+p2zm2c2.
And the solution (exact!) is
eEakmc2(sinkξ−sinkξ0)=pz−p0mc−√1+p2zm2c2+√1+p20m2c2.
Let's plot this solution for different initial conditions (ξ0,p0) and Ea:
import numpy as np
import holoviews as hv
hv.extension('bokeh')
Define some useful constants first
wavelength = 1.26 # mm
k = 2*np.pi/wavelength # 1/mm
mc = 0.511 # MeV/c
sinkξ=sinkξ0+kmc2eEa(pz−p0mc−√1+p2zm2c2+√1+p20m2c2).
dim_xi = hv.Dimension('xi', label="ξ", unit='mm', range=(-0.5,+0.8))
dim_E = hv.Dimension('E', unit='MV/m', label='-E', range=(-950,+950))
xi_range = np.linspace(dim_xi.range[0],dim_xi.range[1], 30) # mm
%opts Curve [width=500 height=150 show_grid=True]
%opts HLine (color='black', line_width=0.5)
def xi_E_plot(Ea):
E = -Ea*np.cos(xi_range*k) # MV/m
xi_E = hv.Curve((xi_range,E), kdims=dim_xi, vdims=dim_E)*hv.HLine(0)
return xi_E
xi_E_plot(700)
pz_max = 50 # MeV/c
pz = np.linspace(0,pz_max,100) # MeV/c
def f_sin_kxi(pz,xi0,p0,Ea):
return np.sin(k*xi0) + (mc*k/(Ea*1e-3))*((pz-p0)/mc - np.sqrt(1 + pz*pz/mc/mc) + np.sqrt(1+p0*p0/mc/mc))
%opts Scatter [width=500 height=300 show_grid=True]
dim_pz = hv.Dimension('pz', unit='MeV/c', range=(0, pz_max))
dim_sin_kxi = hv.Dimension('sin_kxi', label="sin(kξ)", range=(-1.2,+1.2))
p0 = 20 # MeV/c
xi0 = 0.0 # mm
Ea = -800.0 # MV/m
hv.Scatter((f_sin_kxi(pz,xi0,p0,Ea),pz), kdims=[dim_sin_kxi, dim_pz])
Now define the function producing the plot for a given set of parameters.
def plot_xi_pz(pz,xi0,p0,Ea):
sin_kxi = f_sin_kxi(pz,xi0,p0,Ea)
pz = pz[np.abs(sin_kxi)<=1]
sin_kxi = sin_kxi[np.abs(sin_kxi)<=1]
xi = np.arcsin(sin_kxi)/k
xi_pz = hv.Scatter((xi,pz), kdims=[dim_xi, dim_pz])
xi0_p0 = hv.Scatter(([xi0],[p0]), kdims=[dim_xi, dim_pz]).options(size=7)
xi_E = xi_E_plot(Ea)
return (xi_E + xi_pz*xi0_p0).cols(1)
#plot_xi_pz(pz,xi0,p0,Ea)
Interactive version:
#xi0_points = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6] # mm
#items = [(xi0, plot_xi_pz(pz,xi0,p0,Ea)) for xi0 in xi0_points]
#m = hv.HoloMap(items, kdims = ['ξ0']).collate()
#m
xi0_points = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6] # mm
p0_points = [3,5,10,20] # MeV/c
Ea_points = [200,500,800] # MeV/c
dim_p0 = dim_pz.clone()
dim_p0.label = 'p0'
items = [( (xi0,p0,Ea), plot_xi_pz(pz,xi0,p0,-Ea) ) for xi0 in xi0_points for p0 in p0_points for Ea in Ea_points]
m = hv.HoloMap(items, kdims = [dim_xi, dim_p0, dim_E]).collate()
m
As we can see for a high-amplitude wakefield velocity bunching can be used only starting with a very low-energy e-beam (few MeV).
The effect of velocity bunching is defined by the dependense of ξ(ξ0,pz≫p0). Since x−√x2+1→0, if x→∞,
sinkξpz→∞=sinkξ0+kmc2eEa(√1+p20m2c2−p0mc)≈sinkξ0+kmc2eEa⋅mc2p0.
Increasing accelerating field and initial electron momentum has the same effect on velocity bunching.
Now let's plot ξpz→∞ vs ξ0 for different p0.
xi0 = np.linspace(0, wavelength/2, 100) # region of focusing plasma wakefield
# We can use the same function f_sin_kxi,
# but now xi0 is a vector instead of pz which is set to some large value:
pz = 1000 # MeV/c
hv.Scatter((xi0,f_sin_kxi(pz,xi0,p0,Ea)), kdims=[dim_xi, dim_sin_kxi])
dim_xi_final = hv.Dimension('xi_f', label="ξ(high energy)", unit='mm', range=(-0.32,+0.32))
def plot_xi0_xi(pz,xi0,p0,Ea):
sin_kxi = f_sin_kxi(pz,xi0,p0,Ea)
xi0 = xi0[np.abs(sin_kxi)<=1.0]
sin_kxi = sin_kxi[np.abs(sin_kxi)<=1.0]
xi = np.arcsin(sin_kxi)/k
xi0_xi = hv.Scatter((xi0,xi), kdims=[dim_xi, dim_xi_final])
xi_E = xi_E_plot(Ea)
return (xi_E + xi0_xi*hv.HLine(0)).cols(1)
#plot_xi0_xi(pz,xi0,p0,Ea)
p0_points = [0.5,1,2,3,4,5,10,20,50] # MeV/c
Ea_points = [200,500,800] # MeV/c
items = [( (p0,Ea), plot_xi0_xi(pz,xi0,p0,-Ea) ) for p0 in p0_points for Ea in Ea_points]
m = hv.HoloMap(items, kdims = [dim_p0, dim_E]).collate()
m