Skip to content

Commit

Permalink
Add refs for appendices
Browse files Browse the repository at this point in the history
  • Loading branch information
fuodorov committed Feb 5, 2024
1 parent b771fd7 commit b94c99d
Show file tree
Hide file tree
Showing 6 changed files with 117 additions and 121 deletions.
5 changes: 4 additions & 1 deletion nsu.cls
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,10 @@
\renewcommand{\thetable}{\Asbuk{appendix}.\arabic{table}}
\setcounter{figure}{0}
\renewcommand{\thefigure}{\Asbuk{appendix}.\arabic{figure}}

\setcounter{equation}{0}
\renewcommand{\theequation}{\Asbuk{appendix}.\arabic{equation}}
\setcounter{lstlisting}{0}
\renewcommand{\thelstlisting}{\Asbuk{appendix}.\arabic{lstlisting}}
}%заголовок Приложение с добавлением в оглавление без номера, с увеличением счётчика


Expand Down
2 changes: 1 addition & 1 deletion src/texts/envelope_equations.tex
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
\section{Уравнения огибающей для пучка}\label{sec:envelope_equation}
В ускорительных комплексах используются соленоидальные и квадрупольные линзы, при этом преимущественно соленоидальные линзы расположены вместе с ускоряющими модулями, а квадрупольные линзы только в каналах разводки.
Рассмотрим два случая: уравнение огибающей для аксиально-симметричного пучка в канале с соленоидальными линзами и уравнения огибающей для эллиптического пучка с фокусировкой квадрупольными линзами.
Подробный вывод уравнений Капчинского-Владимирского приведен в приложении~А.
Подробный вывод уравнений Капчинского-Владимирского приведен в приложении~\ref{eq:first_appendix_kenv}-\ref{eq:last_appendix_kenv}.

\subsection{Уравнение огибающей для аксиально симметричного пучка в канале с соленоидальными линзами}\label{subsec:envelope_equation_solenoid}
Движение аксиально-симметричного пучка в транспортном канале при наличии соленоидов может быть описано следующим уравнением~\ref{eq:envelope_axial}~\cite{Louson}:
Expand Down
74 changes: 31 additions & 43 deletions src/texts/kenv_listing.tex
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
\end{center}

Сначала подключим необходимые библиотеки и настроим параметры графики
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Подключение необходимых библиотек}, label={lst:first_appendix_kenv}]
import numpy as np
import holoviews as hv
hv.extension('matplotlib')
Expand All @@ -22,7 +22,7 @@
\[
f(x) = \frac{1}{L}\frac{1}{1+\exp(\frac{2}{rt}(2*|x|-L))}, rt < \frac{L}{2}
\]
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Настройка параметров изображения}]
dx = 0.001
x_min = -1
x_max = 1
Expand All @@ -33,7 +33,7 @@
\end{lstlisting}

Соленоид 0.25 м.
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Построение профиля поля соленоида}]
L = 0.25
rt = 0.05
f_sol = 1/(1+np.exp(2/rt*(2*abs(x)-L)))
Expand All @@ -42,7 +42,7 @@
\end{lstlisting}

Ускоряющий зазор 0.25 м.
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Построение профиля поля ускоряющего зазора}]
L = 0.25
rt = 0.05
f_sol = 1/(1+np.exp(2/rt*(2*abs(x)-L)))
Expand All @@ -51,7 +51,7 @@
\end{lstlisting}

Квадруполи 0.1, 0.2, 0.4 м.
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Построение профилей поля квадруполей}]
L = 0.1
rt = 0.05
f_quad_0_10 = 1/(1+np.exp(2/rt*(2*abs(x)-L)))
Expand All @@ -71,7 +71,7 @@
\end{lstlisting}

Поворотные магниты 0.5 м
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Построение профилей поля поворотных магнитов}]
L = 0.5
rt = 0.05
f_bend_0_50 = 1/(1+np.exp(2/rt*(2*abs(x)-L)))
Expand All @@ -81,7 +81,7 @@
\end{lstlisting}

Настроим область и шаг счета
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Настройка параметров счета}]
dz = 0.001 # m
z_min = 0.707
z_max = 10.707
Expand All @@ -90,7 +90,7 @@

Определим элемент ускорителя (напр. соленоид, или ускоряющий зазор).
Ускоритель будем представлять в виде последовательности таких элементов.
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Определение класса элемента ускорителя}]
class Element:
def __init__(self, z0, MaxField, filename, name):
self.z0 = z0
Expand All @@ -100,7 +100,7 @@
\end{lstlisting}

Фокусирующие соленоиды:
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Список соленоидов}]
Bz_beamline = {}
for z0, B0, filename, name in [
# m T Unique name
Expand All @@ -126,7 +126,7 @@
\end{lstlisting}

Квадруполи:
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Список квадруполей}]
Gz_beamline = {}
for z0, G0, filename, name in [
# m T/m Unique name
Expand All @@ -143,17 +143,15 @@
\end{lstlisting}

Диполи:
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Список поворотных магнитов}]
Kz_beamline = {} ### Curvature
for z0, K0, filename, name in [
# m 1/m Unique name
#[ 11.000, 0.78, 'Bend_0_50.txt', 'Bend. 1'],
[ 120.000, 0.78, 'Bend_0_50.txt', 'Bend. 2'],
]:
Kz_beamline[name] = Element(z0, K0, filename, name)
\end{lstlisting}

\begin{lstlisting}[language=python]
Nz_beamline = {} ### The indicator of the decline of the magnetic field
for z0, N0, filename, name in [
# m Unique name
Expand All @@ -164,7 +162,7 @@
\end{lstlisting}

Ускоряющие элементы:
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Список ускоряющих зазоров}]
Ez_beamline = {}
for z0, E0, filename, name in [
# m MV/m Unique name
Expand All @@ -182,10 +180,10 @@
Ez_beamline[name] = Element(z0, E0, filename, name)
\end{lstlisting}

Считывание профилей фокусирующего и ускоряющего поля
Считывание профилей фокусирующего и ускоряющего поля.

Сперва мы просто считываем поля из файлов и сшиваем их в один массив:
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Функция считывания профилей поля}]
from scipy import interpolate

FieldFiles = {} # buffer for field files
Expand All @@ -207,22 +205,22 @@
return F
\end{lstlisting}

\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Считывание профилей фокусирующего поля}]
Bz = read_field(Bz_beamline, z)
\end{lstlisting}

Для интегрирования уравнения на огибающую необходимо сконвертировать массив Bz в функцию Bz(z)
\begin{lstlisting}[language=python]
Для интегрирования уравнения на огибающую необходимо сконвертировать массив $B_z$ в функцию $B_z(z)$
\begin{lstlisting}[language=python, caption={Конвертация массива $B_z$ в функцию $B_z(z)$}]
Bz = interpolate.interp1d(z, Bz, fill_value=(0, 0), bounds_error=False)
\end{lstlisting}

Теперь Bz уже функция, которая быстро может вывести поле в любых точках вдоль ускорителя.
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Расчет значения поля в заданной точке}]
Bz(2.11111)
\end{lstlisting}

Построим поле $Bz(z)$
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Построение профиля поля соленоидов}]
dim_z = hv.Dimension('z', unit='m', range=(0,z_max))
dim_Bz = hv.Dimension('Bz', unit='T', label='$B_z$')

Expand All @@ -231,7 +229,7 @@
\end{lstlisting}

Аналогично для квадрупольных полей:
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Построение профиля поля квадруполей}]
Gz = read_field(Gz_beamline, z)
Gz = interpolate.interp1d(z, Gz, fill_value=(0, 0), bounds_error=False)
dim_Gz = hv.Dimension('Gz', unit='T/m', label='$G_z$')
Expand All @@ -240,15 +238,13 @@
\end{lstlisting}

Аналогично для диполей:
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Построение профиля поля диполей}]
Kz = read_field(Kz_beamline, z)
Kz = interpolate.interp1d(z, Kz, fill_value=(0, 0), bounds_error=False)
dim_Kz = hv.Dimension('Kz', unit='1/m', label='$K_z$')
z_Kz = hv.Area((z,Kz(z)), kdims=dim_z, vdims=dim_Kz)
z_Kz
\end{lstlisting}

\begin{lstlisting}[language=python]
Nz = read_field(Nz_beamline, z)
Nz = interpolate.interp1d(z, Nz, fill_value=(0, 0), bounds_error=False)
dim_Nz = hv.Dimension('Nz', label='$N_z$')
Expand All @@ -257,7 +253,7 @@
\end{lstlisting}

Аналогично для ускоряющего электрического поля:
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Построение профиля поля ускоряющих зазоров}]
Ez = -1*read_field(Ez_beamline, z)
Ez = interpolate.interp1d(z, Ez, fill_value=(0, 0), bounds_error=False)
dim_Ez = hv.Dimension('Ez', unit='MV/m', label=r'$-E_z$')
Expand All @@ -273,15 +269,15 @@
\frac{d\gamma}{dz} \approx \frac{eE_z}{mc^2},
\]
Тогда достаточно один раз проинтегрировать функцию $E_z(z)$:
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Задание начальных параметров пучка}]
mc = 0.511 # MeV/c
#p_z = 2.459 # MeV/c
E_0 = 2.000 # MeV
gamma_0 = E_0/mc + 1
#gamma_0 = p_z/mc
\end{lstlisting}

\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Расчет продольной динамики пучка}]
from scipy import integrate
gamma = gamma_0 + integrate.cumtrapz(-Ez(z)/mc, z)
dim_gamma = hv.Dimension('gamma', label=r'$\gamma$', range=(0,None))
Expand All @@ -290,7 +286,7 @@
\end{lstlisting}

Для дальнейшего использования в решении уравнения на огибающую преобразуем массив gamma в функцию:
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Преобразование массива в функцию}]
gamma = interpolate.interp1d(z[1:], gamma, fill_value=(gamma[0], gamma[-1]), bounds_error=False)
hv.Curve((z,gamma(z)), kdims=dim_z, vdims=dim_gamma)
\end{lstlisting}
Expand Down Expand Up @@ -326,7 +322,7 @@
\), теперь можем составить дифференциальное уравнение \(X' = F(X).\)

Зададим начальные условия и константы
\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Начальные условия и константы}]
c = 299792458 # (m/s)
dpp = 0.0
I = 2000.000 # A
Expand All @@ -336,7 +332,7 @@
dadz, dbdz = 0.0e-3, 0.0e-3 # dr_rms/dz beam
\end{lstlisting}

\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Уравнения на характеристики Капчинского-Владимирского}]
from scipy.integrate import solve_ivp
from scipy.misc import derivative

Expand Down Expand Up @@ -374,17 +370,15 @@
return [dxdz, dsigma_xdz, dydz, dsigma_ydz]
\end{lstlisting}

\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Решение уравнений Капчинского-Владимирского}]
def find_sigma_x(z):
X0 = np.array([dadz, a, dbdz, b])

sol = solve_ivp(dXdz, t_span=[z[0],z[-1]], y0=X0, t_eval=z)
sigma_x = sol.y[1, :]

return sigma_x # m
\end{lstlisting}

\begin{lstlisting}[language=python]
def find_sigma_y(z):
X0 = np.array([dadz, a, dbdz, b])

Expand All @@ -394,26 +388,20 @@
return sigma_y # m
\end{lstlisting}

\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Построение огибающей пучка}]
sigma_x = find_sigma_x(z)
sigma_y = find_sigma_y(z)
\end{lstlisting}

\begin{lstlisting}[language=python]
dim_sig_x = hv.Dimension('x', label="$2sigma$", unit='mm', range=(0,100))
dim_sig_y = hv.Dimension('y', label="$2sigma$", unit='mm', range=(0,100))
\end{lstlisting}

\begin{lstlisting}[language=python]
sigma_x_img = hv.Area((z,sigma_x*1e3), label = '2sigma_x', kdims=[dim_z], vdims=[dim_sig_x], group='Beam_x')
sigma_y_img = hv.Area((z,sigma_y*1e3), label = '2sigma_y', kdims=[dim_z], vdims=[dim_sig_y], group='Beam_y')
\end{lstlisting}

\begin{lstlisting}[language=python]
sigma_x_img*sigma_y_img
\end{lstlisting}

\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Настройка динамического изображения огибающей}]
dim_Sol1_B = hv.Dimension(
'Sol1_B', unit='T', label='Sol. 1 B', range=(0,1.0), default=Bz_beamline['Sol. 1'].MaxField)
dim_Sol2_B = hv.Dimension(
Expand Down Expand Up @@ -456,7 +444,7 @@
return sigma_x_img*sigma_y_img
\end{lstlisting}

\begin{lstlisting}[language=python]
\begin{lstlisting}[language=python, caption={Вывод динамического изображения огибающей}, label={lst:last_appendix_kenv}]
dmap = hv.DynamicMap(sigma_plot, kdims=[dim_I, dim_Sol1_B, dim_Sol2_B,
dim_Sol3_B, dim_Sol4_B])
dmap.redim.range()
Expand Down
Loading

0 comments on commit b94c99d

Please sign in to comment.