弯转磁铁(Dipole / SBend)

本模块介绍 PASS 中的弯转磁铁元件 SBend ,用于模拟带电粒子在扇形弯转磁铁中的运动。弯转磁铁是加速器中最基本的弯转元件,通过均匀磁场使粒子轨道偏转。

PASS 中的弯转磁铁为 厚元件 ( length > 0 ),支持完整的非线性跟踪,包括边缘角效应、边缘场效应、以及多种辛积分方案。

Fint 指定入口边缘场积分。正的 Fintx 指定出口积分; Fintx <= 0 时继承 Fint。特别是,当 Fint > 0 时, 设置 Fintx = 0 并不会关闭出口的有限气隙项。

  • 核心特征:

    • 支持 rot-kick-rot (RKR) 和 drift-kick-drift-exact (DKD-exact) 两种主体模型,默认 rot-kick-rot

    • 支持 uniform (2阶) 和 yoshida4 (4阶) 两种辛积分器

    • 支持非线性边缘角 (wedge) 效应

    • 支持非线性边缘场 (fringe field) 效应

    • 支持孔径检查

以下接口中的字段用于 PASS.para.schema.elements.SBendItem 配置类; 元件名称由 Sequence.add(name, item) 的序列键给出,不是配置类字段。

参数列表

通用参数

Python 配置字段

JSON 键

类型

单位

默认值

说明

s

S (m)

float

m

必填

元件出口或零长度作用点的纵向位置。

length

Length (m)

float

m

0.0

元件长度( \(L\) )

k0l

K0L

float

0.0

归一化二极场积分( \(K_{0L}\) )

e1

E1 (rad)

float

rad

0.0

入口边缘角( \(e_1\) ),默认 0

e2

E2 (rad)

float

rad

0.0

出口边缘角( \(e_2\) ),默认 0

hgap

Hgap (m)

float

m

0.0

磁铁半气隙( \(g_{\text{half}}\) ),默认 0

fint

Fint

float

0.0

入口边缘场积分( \(F\) ),默认 0

fintx

Fintx

float

0.0

出口边缘场积分,默认 0( \(\leq 0\) 时自动设为 fint )

num_slices

Num slices

int

1

1

切片数,默认 1

model

Model

str

'adaptive'

物理模型,可选: adaptive (默认,自动选 rot-kick-rot )、 rot-kick-rot 、 drift-kick-drift-exact

integrator

Integrator

str

'adaptive'

积分器,可选: adaptive (默认 uniform )、 uniform 、 yoshida4

aperture_type

Aperture type

str

—

'off'

孔径类型,默认 off

aperture_value

Aperture value

list

m / rad

[]

孔径参数值,默认 []

绝对正、斜多极场误差与静态 DX/DY/DPSI 准直误差使用公共 元件误差 接口。 准直只移动磁场,孔径和 SC 边界保持在设计坐标系。

扩展参数(预留)

Python 配置字段

JSON 键

类型

单位

默认值

说明

is_ramping

Is ramping

bool

False

预留配置字段;当前跟踪不执行磁场时间表。

k0l_ramping_file

K0L ramping file

str

''

预留配置字段;当前跟踪不执行磁场时间表。

使用示例

扇形弯铁

{
    "BEND1": {
        "S (m)": 10.0,
        "Command": "SBend",
        "Length (m)": 1.5,
        "K0L": 0.05,
        "Num slices": 5,
        "Integrator": "yoshida4",
        "Aperture type": "off"
    }
}

扇形弯铁,端面垂直于参考轨道,无边缘效应。

矩形弯铁

{
    "BEND2": {
        "S (m)": 20.0,
        "Command": "SBend",
        "Length (m)": 2.0,
        "K0L": 0.1,
        "E1 (rad)": 0.05,
        "E2 (rad)": 0.05,
        "Hgap (m)": 0.02,
        "Fint": 0.5,
        "Num slices": 10,
        "Integrator": "yoshida4",
        "Aperture type": "off"
    }
}

矩形弯铁,含边缘角和边缘场效应。弯转角 \(\alpha = K_{0L} = 0.1\) rad,边缘角 \(e_1 = e_2 = \alpha/2 = 0.05\) rad。

薄透镜弯转

{
    "BEND3": {
        "S (m)": 30.0,
        "Command": "SBend",
        "Length (m)": 0.0,
        "K0L": 0.02,
        "Aperture type": "off"
    }
}

零长度弯转磁铁,仅施加 \(K_{0L}\) 薄透镜动量更新,无 body 跟踪,无边缘效应。

小角度数值稳定性

极坐标漂移包含水平曲率项 \(\rho(1-\cos\theta)\)。 CPU 和 GPU 统一使用半角恒等式 \(1-\cos\theta=2\sin^2(\theta/2)\),无需按角度分支判断。 融合 GPU 内核将半角正弦与既有的全角正弦、余弦一起预计算,供各切片复用, 内部切片路径也采用同一公式。这样可避免小角度消去误差, 也无需除以 \(1+\cos\theta\)。粒子存储精度、积分设置和物理映射 保持不变。其他 FP32 舍入误差仍然存在,跟踪精度仍需通过精度和 切片收敛检查确认。

对于没有内部空间电荷节点的静态 rot-kick-rot 映射,FP32 粒子数组在 CPU 上使用 FP64 工作坐标,在融合 GPU 内核中使用 FP64 寄存器和标量参数。 内部旋转与二极场动量更新需要抵消参考弯转量;若每个子步都舍入到 FP32,可能掩盖很小的 横向振荡位移。完整元件映射结束后再写回原粒子存储精度,积分方法和物理映射保持不变。

对于没有内部空间电荷节点的静磁弯铁,CPU 和 GPU 将纵向增量与入口坐标分开累加, 在出口一次执行 \(z_{\mathrm{out}}=z_{\mathrm{in}}+\sum_j\Delta z_j\)。 这样可避免微小切片增量反复与较大的 FP32 \(z_{\mathrm{in}}\) 相加所产生的舍入损失。 这只是增量的累加方式,不是坐标折叠;保存的纵向坐标仍然连续。 增量累加器采用所选映射的工作精度,其中静态 RKR 使用 FP64。 内部空间电荷路径仍在每个节点提供实时纵向坐标。 元件边界的存储舍入及其他有限精度误差仍然存在。

极坐标漂移还将微小的速度修正与几何路程差分开计算。令 \(g=\gamma_0^{-2}\)、\(r=-g\delta(2+\delta)/(1+\delta)^2\),则计算 \(\beta_0/\beta-1=r/(\sqrt{1+r}+1)\)。 粒子的实际路程为 \(\ell\) 时,CPU 和 GPU 均使用 \(\Delta z=(L-\ell)-\ell r/(\sqrt{1+r}+1)\)。 这样可避免先将接近一的速度比在 FP32 中舍入为一。

坐标约定

采用 纵向坐标与参考到达时间 的连续纵向坐标。 \(T_b\) 是理想参考粒子在当前位置的实际通过时刻,不是束团质心时刻; 局部映射中的 \(\beta_0\) 和 \(P_0\) 表示当前束团参考量。 \(p_x=P_x/P_0\) 是归一化动量,不是轨迹斜率。

PASS 采用归一化曲线坐标,六维相空间变量为 \((x, p_x, y, p_y, z, \delta)\) :

变量

符号

定义

x

\(x\)

水平偏移(相对于参考轨道)

px

\(p_x\)

归一化水平动量, \(p_x = P_x / P_0\)

y

\(y\)

垂直偏移

py

\(p_y\)

归一化垂直动量, \(p_y = P_y / P_0\)

z

\(\zeta\)

纵向坐标, \(z=\zeta=\beta_b c(T_b-t_i)\)

dp

\(\delta\)

相对动量偏差, \(\delta = P / P_0 - 1\)

其中 \(P_0\) 为参考粒子动量, \(\beta_0 = v_0 / c\) 为参考粒子归一化速度, \(s\) 为沿参考轨道的弧长, \(t\) 为时间。

纵向动量分量定义为:

\[p_z = \sqrt{(1+\delta)^2 - p_x^2 - p_y^2}\]

其他常用物理量:

\[h = \frac{1}{\rho} = \frac{K_0 L}{L} = \frac{K_{0L}}{L}\]
\[K_0 = \frac{q_0 B_0}{P_0} = \frac{K_{0L}}{L}\]
\[\chi = \frac{q}{q_0} \cdot \frac{m_0}{m}\]

其中 \(h\) 为参考轨道曲率, \(\rho\) 为弯转半径, \(K_0\) 为归一化二极场强, \(\chi\) 为荷质比因子(同种粒子束 \(\chi = 1\) )。对于扇形弯铁 \(h = K_0\) 。

整体跟踪流程

一个完整的弯转磁铁由 入口边缘 、 主体 和 出口边缘 三部分组成,跟踪顺序为:

====== 入口边缘 (B=0 → B=B0) ======

YRotation(-e1)  →  Fringe Field  →  Wedge(-e1, K0)
[纯几何旋转]       [非线性边缘场]     [旋转+聚焦动量更新]
[B=0]             [B: 0→B0]         [B=B0]

       ↓

====== 主体 Body (B=B0) ======

切片1 → 切片2 → ... → 切片N
(参考轨迹坐标系, 辛积分器)

       ↓

====== 出口边缘 (B=B0 → B=0) ======

Wedge(-e2, K0)   →  Fringe Field  →  YRotation(-e2)
[旋转+聚焦动量更新]     [非线性边缘场]     [纯几何旋转]
[B=B0]             [B: B0→0]         [B=0]

入口净旋转: (-e1) + (+e1) = 0
出口净旋转: (+e2) + (-e2) = 0
→ Body 在参考轨迹坐标系中运行

完整映射为:

\[\mathcal{M}_{\text{bend}} = \mathcal{M}_{\text{exit}} \circ \mathcal{M}_{\text{body}} \circ \mathcal{M}_{\text{entry}}\]

本体内部划分为 \(N\) 个切片时,上式展开为:

\[\mathcal{M}_{\text{bend}} = \mathcal{M}_{\text{exit}} \circ \mathcal{B}_N \circ \cdots \circ \mathcal{B}_1 \circ \mathcal{M}_{\text{entry}}\]

即 一个真实入口、N 个本体切片、一个真实出口。CPU 和 GPU 跟踪都在 本体循环之外施加入出口映射。内部空间电荷动量更新也只分割本体传输,不产生额外的 边缘映射。因此,增大 Num slices 不需要额外的出口积分参数。 将一块磁铁表示为多个独立 SBend 元件是另一种操作:每个元件都会执行 自己的入口和出口映射。

入口边缘 :

\[\mathcal{M}_{\text{entry}} = \text{Wedge}(-e_1, K_0) \circ \text{Fringe}(e_1) \circ \text{YRotation}(-e_1)\]

出口边缘 (与入口镜像对称):

\[\mathcal{M}_{\text{exit}} = \text{YRotation}(-e_2) \circ \text{Fringe}(e_2) \circ \text{Wedge}(-e_2, K_0)\]

Note

  • 当 \(e_1 = 0\) 时,YRotation 和 Wedge 均跳过(无边缘角效应)

  • 当 fint = 0 或 hgap = 0 时,有限间隙项消失;只要 \(K_0 \ne 0\),仍执行几何非线性边缘映射。

  • 当 \(K_0 = 0\) 时,Fringe 和 Wedge 均跳过

  • 入口和出口的执行顺序互为镜像

  • 出口处,边缘场由上升变为下降,因此 Fringe 使用 \(-K_0\);Wedge 仍在同一均匀磁场中旋转,保留 \(K_0\)。

为什么是这个顺序

YRotation 的作用 :纯几何坐标旋转,将粒子坐标从参考轨迹坐标系变换到磁铁端面坐标系。不施加任何力,仅改变观察参考系。

Fringe Field 的作用 :在端面参考系中计算非线性边缘场效应。Fringe 公式中的粒子斜率 \(x' = p_x / p_z\) 必须是相对于磁铁端面的斜率,因此必须先做 YRotation。

Wedge 的作用 :在均匀磁场 \(B_0\) 中旋转观测平面,同时施加边缘角聚焦动量更新。Wedge 包含几何旋转(将坐标系转回参考轨迹系)和磁场动量更新两部分。

YRotation 和 Wedge 的几何旋转方向相反,净旋转为零:

\[\text{YRotation}(-e_1) \text{ 的旋转} + \text{Wedge}(-e_1) \text{ 的几何旋转} = (-e_1) + (+e_1) = 0\]

因此 body 在参考轨迹坐标系中运行,不需要任何额外旋转。

主体:DKD-exact 模型

哈密顿量

在曲线坐标系中,弯转磁铁的完整哈密顿量为:

\[H_{\text{bend}} = \frac{p_\tau}{\beta_0} - (1+hx)\sqrt{(1+\delta)^2 - p_x^2 - p_y^2} + \chi K_0\!\left(x + \frac{h x^2}{2}\right)\]

将其拆分为传播部分(精确直漂移 \(H_D\) )和动量更新部分( \(H_h\) , \(H_{K_0}\) , \(H_{K_0 h}\) ):

\[H_D = \frac{p_\tau}{\beta_0} - \sqrt{(1+\delta)^2 - p_x^2 - p_y^2}\]
\[H_h = -h x (1+\delta)\]
\[H_{K_0} = \chi K_0 x\]
\[H_{K_0 h} = \frac{\chi K_0 h x^2}{2}\]

其中 \(H_D\) 是精确直漂移哈密顿量(保留 \(p_z\) 的根号,不做小动量展开),后三项是薄透镜动量更新。

精确漂移映射 D

传播部分的哈密顿方程给出精确直漂移:

\[p_z = \sqrt{(1+\delta)^2 - p_x^2 - p_y^2}\]
\[x \leftarrow x + \frac{p_x}{p_z} \cdot L_D\]
\[y \leftarrow y + \frac{p_y}{p_z} \cdot L_D\]
\[\zeta \leftarrow \zeta + L_D \cdot \left(1 - \frac{\beta_0}{\beta} \cdot \frac{1+\delta}{p_z}\right)\]

其中 \(L_D\) 为漂移长度, \(\beta\) 为粒子实际归一化速度:

\[\beta = \frac{(1+\delta) \beta_0 \gamma_0}{\sqrt{1 + \left[(1+\delta) \beta_0 \gamma_0\right]^2}}\]

Note

“exact” 的含义:漂移部分保留精确根号 \(p_z = \sqrt{(1+\delta)^2 - p_x^2 - p_y^2}\) ,不做 \(p_x \ll 1\) 的小动量展开。近似仅在于将传播部分与动量更新部分分离(分裂算符法)。

二极动量更新映射 K

动量更新部分合并为单个薄透镜 动量更新(位置不变,仅动量跳变):

\[p_x \leftarrow p_x + L_K \cdot \left[h(1+\delta) - \chi K_0 - \chi K_0 h x\right]\]
\[\zeta \leftarrow \zeta - \frac{\beta_0}{\beta} \cdot h x L_K\]

各项物理含义:

项

来源

物理含义

\(h(1+\delta) L_K\)

\(H_h\)

曲率动量更新(参考轨道弯转)

\(-\chi K_0 L_K\)

\(H_{K_0}\)

主二极弯转

\(-\chi K_0 h x L_K\)

\(H_{K_0 h}\)

弱聚焦(曲率与二极场耦合)

\(-(\beta_0/\beta) \cdot h x L_K\)

\(H_h\)

路径长度效应(纵向)

Note

对于扇形弯铁 \(h = K_0\) ,参考粒子( \(x=0, \delta=0, \chi=1\) )的净动量更新为 \(h L_K - K_0 L_K = 0\) 。这是正确的:在曲线坐标系中,参考粒子沿参考轨道运动, \(p_x\) 始终为 0。弯转效应已编码在曲线坐标系本身中。

uniform 积分器(2阶辛)

每个切片采用漂移-动量更新-漂移(DKD)结构,即二阶蛙跳(leapfrog):

\[S_2(\Delta s) = D\!\left(\frac{\Delta s}{2}\right) \circ K(\Delta s) \circ D\!\left(\frac{\Delta s}{2}\right)\]

每个切片误差为 \(O(\Delta s^3)\) ,全局误差为 \(O(\Delta s^2)\) 。二阶辛积分器,每步都是正则变换。

yoshida4 积分器(4阶辛)

通过组合三个二阶 DKD 步构造四阶辛映射 [Yoshida 1990]:

\[S_4(\Delta s) = S_2(z_1 \Delta s) \circ S_2(z_0 \Delta s) \circ S_2(z_1 \Delta s)\]

其中 Yoshida 系数为:

\[z_1 = \frac{1}{2 - 2^{1/3}} \approx 1.3512\]
\[z_0 = 1 - 2 z_1 \approx -1.7024\]

Note

\(z_0 < 0\) 意味着中间一步是反向跟踪(漂移和动量更新的 “长度” 为负)。这是 Yoshida 组合方法的数学要求,在辛映射群中完全自洽。每个切片误差为 \(O(\Delta s^5)\) ,全局误差为 \(O(\Delta s^4)\) 。

积分器选择建议:

场景

推荐积分器

原因

快速模拟

uniform

每切片 2 次漂移 + 1 次动量更新,计算量小

高精度模拟

yoshida4

4 阶精度,但每切片 6 次漂移 + 3 次动量更新

含空间电荷

uniform + 更多切片

空间电荷作用次数由 Space charge.Num kicks 独立决定;外场 Yoshida 子步不增加 PIC 次数

主体模型选择

model 可选 rot-kick-rot、drift-kick-drift-exact 或 adaptive; adaptive 当前选择 rot-kick-rot。

  • RKR:极坐标输运包含参考轨道曲率,配合偶极场的动量更新。

  • DKD-exact:将直线精确漂移与曲率、磁场的动量更新分裂组合。

两种模型的子映射与分裂方式不同。应针对偏转角、束流振幅、动量范围及目标观测量, 增加切片数并检查轨迹、工作点和纵向输运是否收敛;不能由单个子映射的解析精确性 推断一个切片适合所有参数。integrator="adaptive" 当前采用 uniform, 不是自动误差控制。四阶积分在光滑外场中的优势不消除浮点舍入和孔径取样误差。 内部空间电荷次数由独立的 Space charge.Num kicks 决定。

入口边缘:YRotation

物理目的

YRotation 是纯几何坐标旋转,不涉及任何磁场。其目的是将粒子坐标从参考轨迹坐标系变换到磁铁端面坐标系,使后续的边缘场计算能在正确的参考系中进行。

当磁铁端面与参考轨迹法线有夹角 \(e_1\) 时,粒子相对于端面的入射斜率不等于 \(p_x / p_z\) 。YRotation 将坐标系旋转 \(-e_1\) ,使得旋转后的 \(p_x / p_z\) 成为相对于端面的斜率。

完整推导

YRotation(-e1)                    Wedge(-e1, K0)
─────────────────                 ──────────────────
坐标系: 轨迹系 → 端面系            坐标系: 端面系 → 轨迹系
磁场: B = 0 (无场区)              磁场: B = B0 (有场区)
旋转: -e1                         旋转: +e1 (与 YRotation 反向)
动量更新: 无                          动量更新: Δpx = K0·x·sin(e1) (聚焦)
─────────────────                 ──────────────────

净旋转: (-e1) + (+e1) = 0
净效果: 边缘场效应 + 聚焦动量更新

第一步:动量旋转

参考系绕 \(y\) 轴旋转角度 \(\theta\) 。这个旋转在三维空间的 \((x, z)\) 平面内进行, \(y\) 方向不受影响。因此被混合的是动量的 \(x\) 分量 \(p_x\) 和 \(z\) 分量 \(p_z\) ,而 \(p_y\) 不变。动量的标准旋转变换为:

\[\begin{split}\begin{pmatrix} p_x' \\ p_z' \end{pmatrix} = \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{pmatrix} \begin{pmatrix} p_x \\ p_z \end{pmatrix}\end{split}\]

因此:

\[p_x' = \cos\theta \cdot p_x - \sin\theta \cdot p_z\]
\[p_z' = \sin\theta \cdot p_x + \cos\theta \cdot p_z\]

这是纯动量旋转,不涉及力。

第二步:位置投影

关键在于曲线坐标系中 \(x\) 的定义: x 是在参考位置 \(s\) 处的横向平面上测量的横向偏移 。当参考系旋转 \(\theta\) 后,”横向平面” 的方向变了,同一物理位置在新坐标系中的 \(x'\) 值不同。

粒子在旧参考系中的轨迹为 \(\vec{r}(\lambda) = (x + \lambda p_x/p_z,\; 0,\; \lambda)\) 。新参考系的 \(z'\) 轴方向为 \(\hat{z}' = (\sin\theta, 0, \cos\theta)\) ,横向方向为 \(\hat{x}' = (\cos\theta, 0, -\sin\theta)\) 。

在新参考系中,纵向位置为零意味着:

\[\vec{r} \cdot \hat{z}' = (x + \lambda p_x/p_z)\sin\theta + \lambda\cos\theta = 0\]

解出 \(\lambda\) :

\[\lambda = -\frac{x \sin\theta \cdot p_z}{p_x \sin\theta + p_z \cos\theta} = -\frac{x \sin\theta \cdot p_z}{p_z'}\]

新横向位置为:

\[x' = \vec{r} \cdot \hat{x}' = (x + \lambda p_x/p_z)\cos\theta - \lambda\sin\theta\]

代入 \(\lambda\) 并化简,利用旋转的正交性 \(p_z'\cos\theta - p_x'\sin\theta = p_z\) ,最终得到:

\[x' = \frac{x \cdot p_z}{p_z'} = \frac{x \cdot p_z}{p_x \sin\theta + p_z \cos\theta}\]

等价实现形式 :

实现中写作 x_hat = x / (cos_angle * ptt) ,其中 ptt = 1 + tan_angle * px / pz :

\[\cos\theta \cdot p_{tt} = \cos\theta + \sin\theta \cdot \frac{p_x}{p_z} = \frac{p_z'}{p_z}\]

因此 \(x' = x / (\cos\theta \cdot p_{tt}) = x \cdot p_z / p_z'\) ,与推导一致。

第三步: y 方向

\(y\) 方向不直接参与旋转,但由于横向平面倾斜,粒子在走到新横向平面期间, \(y\) 方向因轨迹斜率产生额外偏移:

\[y' = y - \sin\theta \cdot \frac{x \cdot p_y}{p_z'} = y - \tan\theta \cdot \frac{x \cdot p_y}{p_z \cdot p_{tt}}\]

第四步: \(\zeta\) 方向

纵向坐标 \(z=\zeta=\beta_b c(T_b-t_i)\) 。旋转参考系后, \(\sin\theta \cdot x\) 是横向位置在新纵向方向上的投影(因参考系旋转导致的额外路径长度),需转换为时间增量:

\[\Delta\zeta = \beta_0 \cdot \tan\theta \cdot \frac{x \cdot \text{time\_fac}}{p_z \cdot p_{tt}}\]

其中 \(\text{time\_fac} = 1/\beta_0 + p_\tau\) 是时间-路径转换因子(见变量转换说明)。

最终公式

定义:

\[p_z = \sqrt{(1+\delta)^2 - p_x^2 - p_y^2}\]
\[p_{tt} = 1 + \tan(\theta) \cdot \frac{p_x}{p_z}\]

其中 \(\theta\) 为旋转角度(入口 \(\theta = -e_1\) ,出口 \(\theta = -e_2\) )。

时间因子:

\[\text{time\_fac} = \frac{1}{\beta_0} + p_\tau = \sqrt{(1+\delta)^2 + \frac{1}{\beta_0^2 \gamma_0^2}}\]

六维映射:

\[x \leftarrow \frac{x}{\cos\theta \cdot p_{tt}}\]
\[p_x \leftarrow \cos\theta \cdot p_x - \sin\theta \cdot p_z\]
\[y \leftarrow y - \tan\theta \cdot \frac{x \cdot p_y}{p_z \cdot p_{tt}}\]
\[\zeta \leftarrow \zeta + \beta_0 \cdot \tan\theta \cdot \frac{x \cdot \text{time\_fac}}{p_z \cdot p_{tt}}\]
\[p_y, \delta \text{ 不变}\]

变量转换说明

归一化能量偏差 \(p_\tau\) 与存储的归一化动量偏差 \(\delta\) 满足:

\[(1+\delta)^2 = \left(\frac{1}{\beta_0} + p_\tau\right)^2 - \frac{1}{\beta_0^2 \gamma_0^2}\]

因此:

\[\frac{1}{\beta_0} + p_\tau = \sqrt{(1+\delta)^2 + \frac{1}{\beta_0^2 \gamma_0^2}}\]

推导 :粒子总能量 \(E = E_0(1 + p_\tau)\) ,由 \(E^2 - E_0^2 = (Pc)^2 - (P_0 c)^2\) 得:

\[(1+\delta)^2 = (P/P_0)^2 = \frac{(1+p_\tau)^2 - 1/\gamma_0^2}{\beta_0^2}\]

展开并利用 \(1 - 1/\gamma_0^2 = \beta_0^2\) :

\[(1+\delta)^2 = 1 + \frac{2 p_\tau}{\beta_0^2} + \frac{p_\tau^2}{\beta_0^2}\]

用能量偏差表示时,\(p_z\) 的表达式为 sqrt(1 + 2*pt/beta0 + pt*pt - px*px - py*py) ,代入上述关系后恰好等于 \(\sqrt{(1+\delta)^2 - p_x^2 - p_y^2}\) 。

入口边缘:边缘场(Fringe Field)

物理目的

真实磁铁的磁场在端面处不是阶跃函数,而是有一个渐变区域。这个渐变区域产生额外的非线性效应,主要是垂直方向的聚焦。

物理推导

B_y                                          B_y = B0
↑                              ┌──────────────
│                             /
│         Fringe             /  end face
│         Field             /
│       (B: 0→B0)          /
│                        /
│  B = 0               /
└────────────┬────────┘──────────────────────── → s
             ↑        ↑
             YRotation Fringe    Wedge / Body
             (B=0)    (0→B0)     (B=B0)

hgap = 半气隙
Δp_y = 垂直聚焦动量更新

边缘场分布

真实磁铁端面处的磁场渐变为:

\[B_y(s) = B_0 \cdot b(s), \quad b(s): 0 \to 1\]

其中 \(b(s)\) 是归一化边缘场分布函数。这个渐变场对粒子产生非线性效应,主要是垂直方向的聚焦。

边缘场积分

Forest 定义边缘场积分:

\[F = \int \frac{b(s)\bigl(K_0 - b(s)K_0\bigr)}{g_{\text{full}} \cdot K_0^2} \, ds\]

其中 \(g_{\text{full}}\) 为磁铁全气隙( \(g_{\text{full}} = 2 \times \text{hgap}\) )。 \(F\) 描述边缘场的”强度”: \(F=0\) 对应硬边缘, \(F\) 越大边缘场效应越强。

Warning

hgap 与 g 的命名关系

hgap 参数是磁铁的 半气隙 (half gap),即上下极板间距的一半。

  • hgap = 半气隙 = \(g_{\text{half}}\)

  • 磁铁全气隙 \(g_{\text{full}} = 2 \times \text{hgap}\)

在边缘场代码中,辅助量 \(f_h\) 直接使用 hgap (半气隙):

\[f_h = \text{hgap} \times \text{fint}\]

因此 \(f_h\) 是半气隙与边缘场积分的乘积。

使用全气隙定义的公式需要相应转换系数。PASS 在下面的生成函数中使用半气隙约定。

边缘场角与特征系数

边缘场映射使用下面的角度 \(\Phi_0\) 和特征系数 \(\psi=b_0\tan\Phi_0\),其中 \(b_0=K_0\chi\):

\[\Phi_0 = \arctan\!\left(\frac{x'}{1+y'^2}\right) - c_2 \left(1 + x'^2(2+y'^2)\right) p_z\]

其中 \(x' = p_x/p_z\) , \(y' = p_y/p_z\) 是粒子斜率, \(c_2 = 2 K_0 \chi \cdot f_h\) 是线性边缘场强度参数。

代码中 yp2 = 1 + y'^2,所以 1 + yp2 = 2 + y'^2。 因此有限气隙因子为 \(1+x'^2(2+y'^2)\)。反正切项的分母仍为 \(1+y'^2\); 这里使用的是 yp2 本身。

Note

有限气隙项使用 \(p_z\),而非其倒数;偏导数也采用相同生成函数。 将 fint*hgap 设为零会去掉该项,因此不能据此验证有限气隙效应。

公式参考:边缘场实现 和 物理手册。 这些参考资料的有限气隙约定存在差异,PASS 的约定以上式为准。

  • 第一项 \(\arctan(x'/(1+y'^2))\) :粒子在端面处的入射角修正。 \(x'\) 是水平斜率, \(1+y'^2\) 反映垂直运动对水平入射角的几何修正(三维方向余弦)。

  • 第二项 \(-c_2(1 + x'^2(2+y'^2))p_z\) :边缘场积分效应。 \(c_2\) 是边缘场强度, \((1 + x'^2(2+y'^2))\) 是斜率的高阶修正。

偏导数与力

先对 \(\psi=b_0\tan\Phi_0\) 关于独立变量 \((x', y', p_z)\) 求偏导,再用链式法则得到力的分量。对正切函数求导产生 \(b_0/\cos^2\Phi_0\) 因子;下面的量是 \(\psi\) 的偏导数。

引入中间变量 \(c_{o2} = b_0 / \cos^2\Phi_0\) , \(c_{o1}\), \(c_{o3}\) (详见公式部分),偏导数为:

\[\phi_1 = \frac{\partial \psi}{\partial x'}, \quad \phi_2 = \frac{\partial \psi}{\partial y'}, \quad \phi_3 = \frac{\partial \psi}{\partial p_z}\]

力的分量(链式法则 \(k_i = \phi_1 \partial x'/\partial p_i + \phi_2 \partial y'/\partial p_i + \phi_3 \partial p_z/\partial p_i\) ):

\[k_x = \phi_1 \frac{1+x'^2}{p_z} + \phi_2 \frac{x'y'}{p_z} - \phi_3 x'\]
\[k_y = \phi_1 \frac{x'y'}{p_z} + \phi_2 \frac{1+y'^2}{p_z} - \phi_3 y'\]
\[k_z = \phi_1 \frac{\text{tfac} \cdot x'}{p_z^2} + \phi_2 \frac{\text{tfac} \cdot y'}{p_z^2} - \phi_3 \frac{\text{tfac}}{p_z}\]

其中 \(\text{tfac} = -(1/\beta_0 + p_\tau)\) 来自 \(z=\zeta=\beta_b c(T_b-t_i)\) 中 \(t\) 对 \(p_z\) 的依赖。

隐式方程

边缘场映射不是简单的 动量更新(位置不变、动量跳变),而是一个 隐式映射 。原因是边缘场效应与粒子的 \(y\) 坐标非线性耦合:粒子在穿过边缘场时, \(y\) 坐标本身也在变化,因此力(依赖 \(y\) )和位移(依赖力)相互耦合。

隐式解来自生成函数展开到二阶:

\[y_f = \frac{2y}{1 + \sqrt{1 - 2 k_y y}}\]

这个形式保证了正则性(保辛):当 \(k_y y\) 很小时, \(y_f \approx y + k_y y^2/2\) ,即二阶展开。

参数

参数

符号

说明

fint

\(F\)

边缘场积分(fringe field integral), \(F=0\) 为硬边缘

hgap

\(g_{\text{half}}\)

磁铁 半气隙 (half gap),全气隙 \(g_{\text{full}} = 2 \cdot \text{hgap}\)

k0

\(K_0\)

归一化二极场强

完整公式

定义辅助量:

\[f_h = \text{hgap} \cdot F\]
\[f_{\text{sad}} = \frac{1}{72 \cdot f_h} \quad (f_h > 0 \text{ 时,否则为 } 0)\]
\[b_0 = K_0 \cdot \chi\]
\[\text{relp} = \frac{1}{\sqrt{(1+\delta)^2}}\]
\[\text{tfac} = -\left(\frac{1}{\beta_0} + p_\tau\right) = -\sqrt{(1+\delta)^2 + \frac{1}{\beta_0^2 \gamma_0^2}}\]
\[c_2 = b_0 \cdot f_h \cdot 2\]
\[c_3 = b_0^2 \cdot f_{\text{sad}} \cdot \text{relp}\]

其中 \(c_2\) 是线性边缘场强度, \(c_3\) 是六阶非线性修正(来自 \(f_{\text{sad}} = 1/(72 f_h)\) ,称为 “sixth-order achromatic detuning” 项)。

粒子斜率:

\[x' = \frac{p_x}{p_z}, \quad y' = \frac{p_y}{p_z}\]

特征函数及偏导数:

这里 \(\phi_0=\Phi_0\),而 \(\phi_1,\phi_2,\phi_3\) 分别是 \(\psi=b_0\tan\phi_0\) 关于 \(x',y',p_z\) 的偏导数。

\[\phi_0 = \arctan\!\left(\frac{x'}{1 + y'^2}\right) - c_2 \left(1 + x'^2(2+y'^2)\right) p_z\]
\[c_{o2} = \frac{b_0}{\cos^2\phi_0}\]
\[c_{o1} = \frac{c_{o2}}{1 + \left(\frac{x'}{1+y'^2}\right)^2} \cdot \frac{1}{1+y'^2}\]
\[c_{o3} = c_{o2} \cdot c_2\]
\[\phi_1 = c_{o1} - c_{o3} \cdot 2 x'(2+y'^2) p_z\]
\[\phi_2 = -2 c_{o1} \cdot x' y' \cdot \frac{1}{1+y'^2} - c_{o3} \cdot 2 x'^2 y' \cdot p_z\]
\[\phi_3 = -c_{o3} \left(1 + x'^2(2+y'^2)\right)\]

力的分量:

\[k_x = \phi_1 \frac{1+x'^2}{p_z} + \phi_2 \frac{x' y'}{p_z} - \phi_3 x'\]
\[k_y = \phi_1 \frac{x' y'}{p_z} + \phi_2 \frac{1+y'^2}{p_z} - \phi_3 y'\]
\[k_z = \phi_1 \frac{\text{tfac} \cdot x'}{p_z^2} + \phi_2 \frac{\text{tfac} \cdot y'}{p_z^2} - \phi_3 \frac{\text{tfac}}{p_z}\]

六维映射:

\[y_f = \frac{2y}{1 + \sqrt{1 - 2 k_y y}}\]
\[x \leftarrow x + \frac{1}{2} k_x y_f^2\]
\[p_y \leftarrow p_y - 4 c_3 y_f^3 - b_0 \tan(\phi_0) \cdot y_f\]
\[\zeta \leftarrow \zeta + \beta_0 \left(\frac{1}{2} k_z y_f^2 + c_3 y_f^4 \cdot \text{relp}^2 \cdot \text{tfac}\right)\]
\[p_x, \delta \text{ 不变}\]

Note

  • \(p_x\) 和 \(\delta\) 不变:边缘场是静磁场,不做功

  • \(p_y\) 的变化中的 \(-b_0 \tan(\phi_0) y_f\) 项是主要的垂直聚焦

  • \(-4 c_3 y_f^3\) 是六阶非线性修正

  • \(y_f\) 通过隐式方程求解,保证了非线性效应的精确处理和保辛性

  • \(x\) 的变化是 \(O(y^2)\) 量级的水平-垂直耦合

入口边缘:Wedge(边缘角)

物理目的

Wedge 描述粒子在均匀磁场 \(B_0\) 中穿过倾斜端面时的坐标变换。它同时完成两件事:

  1. 几何旋转 :将坐标系从端面参考系转回参考轨迹参考系(与 YRotation 的旋转方向相反,互相抵消)

  2. 磁场动量更新 :施加边缘角聚焦效应 \(\Delta p_x \propto -x\)

当 \(K_0 = 0\) (无磁场)时,Wedge 退化为纯 YRotation(证明见下文)。

计算公式

参数: \(\theta\) (楔形角度,入口 \(\theta = -e_1\) ), \(K_0\) , \(\chi\)

定义:

\[b_1 = K_0 \cdot \chi\]
\[p_z = \sqrt{(1+\delta)^2 - p_x^2 - p_y^2}\]
\[A = \frac{1}{\sqrt{(1+\delta)^2 - p_y^2}}\]
\[\text{rvv} = \frac{\beta}{\beta_0}\]

其中 \(\beta\) 为粒子实际归一化速度(见漂移映射中的公式)。

六维映射:

\[p_x' = p_x \cos\theta + (p_z - b_1 x) \sin\theta\]
\[p_z' = \sqrt{(1+\delta)^2 - p_x'^2 - p_y^2}\]
\[x' = x \cos\theta + \frac{x p_x \sin(2\theta) + \sin^2\theta \cdot (2 x p_z - b_1 x^2)}{p_z' + p_z \cos\theta - p_x \sin\theta}\]
\[D = \arcsin(A \cdot p_x) - \arcsin(A \cdot p_x')\]
\[\Delta y = \frac{p_y (\theta + D)}{b_1}\]
\[\Delta \ell = \frac{(1+\delta) (\theta + D)}{b_1}\]

最终更新:

\[x \leftarrow x'\]
\[p_x \leftarrow p_x'\]
\[y \leftarrow y + \Delta y\]
\[\zeta \leftarrow \zeta - \frac{\Delta \ell}{\text{rvv}}\]
\[p_y, \delta \text{ 不变}\]

动量更新项的物理含义

将 \(p_x'\) 的公式展开:

\[p_x' = \underbrace{p_x \cos\theta + p_z \sin\theta}_{\text{几何旋转}} \;\underbrace{-\; b_1 x \sin\theta}_{\text{磁场动量更新}}\]
  • 几何旋转部分 : \(p_x \cos\theta + p_z \sin\theta\) ,与 YRotation 的 \(\cos\theta \cdot p_x - \sin\theta \cdot p_z\) 方向相反,互相抵消

  • 磁场动量更新部分 : \(-b_1 x \sin\theta = -K_0 \chi x \sin\theta\) ,正比于 \(-x\) ,即边缘角聚焦

对于入口( \(\theta = -e_1\) ),动量更新为:

\[\Delta p_x = -K_0 \chi x \sin(-e_1) = K_0 \chi x \sin(e_1) > 0 \quad (x > 0 \text{ 时})\]

这使轨道外侧( \(x > 0\) )的粒子获得向内的动量,即聚焦效应。等效焦距为 \(f = \rho / \sin(e_1)\) 。

Delta-ell 与 zeta 的关系

公式 Eq. 1.201 给出的是 路径长度 \(\Delta\ell\) ,而代码更新的是 纵向坐标 \(\zeta\) 。两者不同:

\[\Delta\ell = \frac{(1+\delta)(\theta + D)}{b_1} \quad \text{(路径长度)}\]
\[\Delta\zeta = -\frac{\Delta\ell}{\text{rvv}} \quad (\zeta \text{ 坐标更新})\]

物理原因 :

  1. \(\Delta\ell\) 是粒子在 wedge 中走过的路径长度

  2. \(z=\zeta=\beta_b c(T_b-t_i)\) ,更新 \(\zeta\) 需要时间: \(\Delta t = \Delta\ell / v = \Delta\ell / (\text{rvv} \cdot \beta_0 c)\)

  3. \(\Delta s\) 已在 \(x'\) 和 \(\Delta y\) 的几何变换中处理了,所以 \(\zeta\) 只需要 时间修正 部分:

\[\Delta\zeta = -\beta_0 c \cdot \Delta t = -\beta_0 c \cdot \frac{\Delta\ell}{\text{rvv} \cdot \beta_0 c} = -\frac{\Delta\ell}{\text{rvv}}\]
  • 负号 : \(z=\zeta=\beta_b c(T_b-t_i)\) ,时间增加导致 \(\zeta\) 减小

  • 除以 rvv : \(\text{rvv} = v/v_0 = \beta/\beta_0\) ,将路径长度转换为时间时需要除以粒子实际速度

\[\zeta \leftarrow \zeta - \frac{\Delta \ell}{\text{rvv}}\]

Warning

不要将 \(\Delta\ell\) 直接加到 \(\zeta\) 上。 \(\Delta\ell\) 是路径长度, \(\zeta\) 是时间相关坐标,两者通过 \(-\Delta\ell/\text{rvv}\) 联系。

arcsin 的 clip 处理

Wedge 中 \(D\) 的计算用到 \(\arcsin\) :

\[D = \arcsin(A \cdot p_x) - \arcsin(A \cdot p_x')\]

其中 \(A = 1/\sqrt{(1+\delta)^2 - p_y^2}\) 。理论上 \(|A \cdot p_x| \leq 1\) (因为 \(|p_x| \leq \sqrt{(1+\delta)^2 - p_y^2}\) ),但 浮点误差 可能导致 \(A \cdot p_x = 1.0000000001\) ,此时 Python 的 np.arcsin 返回 NaN 并触发 RuntimeWarning。

代码中使用 np.clip 将参数限制在 \([-1, 1]\) 范围内:

arg_px = np.clip(arg_px, -1.0, 1.0)
arg_new_px = np.clip(arg_new_px, -1.0, 1.0)

裁剪用于避免边界附近的浮点舍入使反正弦参数超出定义域。

K0=0 时 Wedge 退化为 YRotation 的证明

Wedge 的 \(p_x'\) 公式 :

\[p_x' = p_x \cos\theta + (p_z - b_1 x) \sin\theta\]

令 \(b_1 = K_0 \chi \to 0\) :

\[p_x' = p_x \cos\theta + p_z \sin\theta\]

YRotation 的 \(p_x'\) 公式为 \(p_x' = \cos\alpha \cdot p_x - \sin\alpha \cdot p_z\) 。令 \(\alpha = -\theta\) :

\[p_x' = \cos\theta \cdot p_x + \sin\theta \cdot p_z\]

动量公式一致。

位置 \(x'\) :

令 \(b_1 = 0\) , Wedge 的 \(x'\) 化简为:

\[x' = x \cos\theta + \frac{2 x \sin\theta \cdot p_x'}{p_z' + p_z \cos\theta - p_x \sin\theta}\]

利用旋转正交性 \(p_z' = p_x \sin\theta + p_z \cos\theta\) ,分母变为 \(2 p_z \cos\theta\) ,最终得到:

\[x' = \frac{x \cdot p_z}{p_z'} = \frac{x \cdot p_z}{p_x \sin\theta + p_z \cos\theta}\]

与 YRotation 的位置公式一致。

y 和 \(\zeta\) :

当 \(b_1 \to 0\) 时, \(D \to 0\) , \(\theta + D \to \theta\) ,所以 \(\Delta y = p_y \theta / b_1 \to \infty\) 。

这意味着 \(y\) 和 \(\zeta\) 的公式在 \(b_1 \to 0\) 时发散。因此 Wedge 的 \(b_1 = 0\) 极限不是连续的——当 \(|b_1| < \epsilon\) 时,代码直接跳转到 YRotation 分支:

if abs(b1) < const.eps:
    # 直接调用 YRotation,跳过含 1/b1 的计算
    self._y_rotation_cpu(x, px, y, py, z, dp, tag, mask, theta, beta0)
    return

Note

Wedge 在 \(b_1 = 0\) 时通过 代码分支结构 退化为 YRotation。动量和位置的公式在 \(b_1 \to 0\) 极限下一致,但 \(y\) 和 \(\zeta\) 含有 \(1/b_1\) 因子,极限不连续,必须用分支处理。

边缘角正负号定义

e1 > 0 (聚焦):

                  端面法线
                    ↗  e1
轨迹法线  ↑        ↗
          |      ╱  端面
          |    ╱
──────────┼──╱──────────→ s (参考轨迹)
          |  ╱
          |╱

端面法线相对于轨迹法线向弯转外侧倾斜


e1 < 0 (散焦):

          |╲
          |  ╲
──────────┼──╲──────────→ s (参考轨迹)
          |    ╲  端面
          |      ╲
轨迹法线  ↓        ╲  e1
                   ╲ 端面法线

端面法线相对于轨迹法线向弯转内侧倾斜

边缘角 \(e_1\) , \(e_2\) 的正负号采用 MAD-X 约定:

  • \(e_1 > 0\) :入口端面法线相对于参考轨迹法线向弯转外侧倾斜

  • \(e_2 > 0\) :出口端面法线相对于参考轨迹法线向弯转外侧倾斜

常见磁铁类型:

磁铁类型

\(e_1\)

\(e_2\)

说明

扇形弯铁

0

0

端面垂直于参考轨迹

矩形弯铁

\(\alpha/2\)

\(\alpha/2\)

\(\alpha\) 为弯转角

通用

任意

任意

用户指定

参考文献

  • Xsuite Physics Guide, Sec 1.10.3 (精确弯铁), Sec 1.10.9 (边缘场), Sec 1.10.10 (楔形), Sec 1.10.12 (四极楔形修正)

  • Forest, E. et al., “Edge Focusing Effects in Sector Bending Magnets”

  • Yoshida, H., “Construction of higher order symplectic integrators”, Phys. Lett. A 150 (1990)

  • MAD-NG fringe field implementation: https://github.com/MethodicalAcceleratorDesign/MAD

元件内部空间电荷

正长度元件可设置 space_charge (JSON Space charge)为 ElementSpaceCharge 对象。Num slices 控制外场传输, Space charge.Num kicks 控制 SC 积分。调度规则、共享资源、 支持的后端和示例见 元件切片与内部空间电荷。