漂移节(Drift)
本模块介绍 PASS 中的漂移节元件 Drift ,用于模拟粒子在无场自由空间中的传输。漂移节是最基本的束线元件,粒子在其中不受任何电磁力作用,仅凭借初始动量做直线运动。
核心特征:
厚元件(
length > 0),改变粒子的位置和纵向坐标;使用精确的几何传输公式,考虑横向动量对纵向速度的投影;
支持孔径检查,与其它元件一致。
以下接口中的字段用于 PASS.para.schema.elements.DriftItem 配置类;
元件名称由 Sequence.add(name, item) 的序列键给出,不是配置类字段。
接口参数
Python 配置字段 |
JSON 键 |
类型 |
单位 |
默认值 |
说明 |
|---|---|---|---|---|---|
|
|
|
m |
|
元件出口或零长度作用点的纵向位置。 |
|
|
|
m |
|
元件长度 (必须 \(\ge 0\) ) |
|
|
|
— |
|
孔径类型 (默认 |
|
|
|
m / rad |
|
孔径参数值 (默认 |
使用示例
以下 JSON 片段展示了漂移节的配置方式:
基本用法 :
{
"Drift1": {
"S (m)": 10.0,
"Command": "Drift",
"Length (m)": 0.5,
"Aperture type": "off"
}
}
带圆形孔径检查 :
{
"Drift2": {
"S (m)": 10.5,
"Command": "Drift",
"Length (m)": 0.3,
"Aperture type": "circle",
"Aperture value": [0.05]
}
}
带矩形孔径检查 :
{
"Drift3": {
"S (m)": 11.0,
"Command": "Drift",
"Length (m)": 0.2,
"Aperture type": "rectangle",
"Aperture value": [0.06, 0.04]
}
}
物理推导
四极铁、六极铁、八极铁、一般多极铁、弯铁、快脉冲偏转磁铁及螺线管内部的直线漂移阶段, 在 CPU 和 GPU 上也使用下面的有理化纵向更新式。令 \(g=\gamma_0^{-2}\)、\(q_\perp=p_x^2+p_y^2\),以及 \(R=\sqrt{g+(1-g)(1+\delta)^2}\),则
这避免了高能下两个相近数相减,并使轴线上、动量无偏差的参考粒子得到严格为零的滑移。 螺线管精确映射使用同一表达式,其中横向机械动量为 \(p_x+k_s y/2\) 和 \(p_y-k_s x/2\)。 该公式不能消除增量写入粒子存储坐标时的舍入误差。
粒子在漂移节中不受力,以恒定动量做直线运动。设漂移节长度为 \(L\) ,粒子归一化横向动量为 \(p_x\) 、 \(p_y\) ,动量偏差为 \(\delta\) 。
粒子总动量
归一化总动量(以参考粒子动量 \(P_0\) 为单位)为:
纵向动量分量(考虑横向动量的投影)为:
向前传播要求 \(1+\delta>0\),且 \(p_z^2\) 有限并严格大于零。 不满足这些条件的存活粒子标记为丢失;已丢失粒子的坐标和首次损失记录保持不变。
粒子速度
粒子 \(\beta\) 值与参考粒子 \(\beta_0\) 、 \(\gamma_0\) 和动量偏差 \(\delta\) 的关系为:
坐标更新
漂移节中粒子坐标更新为:
上式是纵向更新的等价表达式,同时包含动量偏差造成的速度差, 以及横向运动造成的实际飞行路程增加。
从飞行时间推导纵向更新
这里 \(p_x=P_x/P_0\)、\(p_y=P_y/P_0\),
\(\delta=(P-P_0)/P_0\)。上面的 \(p_z\) 是归一化纵向动量,
而保存的 p.z 是连续的时间坐标:
推导假定粒子向前运动,满足 \(1+\delta>0\) 和 \(p_z>0\)。 无场漂移中,参考速度和各粒子的动量保持不变。参考粒子的飞行时间和实际粒子的 纵向速度分别为:
因此:
参考事件的时间推进 \(\Delta t_0\);正的 \(\Delta z\) 表示粒子相对于 参考粒子获得了到达时间上的提前量。
有理化形式
令 \(a=\gamma_0^{-2}\)、\(u=1+\delta\)、 \(q_\perp=p_x^2+p_y^2\)。利用 \(\beta_0^2=1-a\) 和相对论能量—动量关系:
其中 \(E_i\) 和 \(E_0\) 是静止质量相同的粒子的总能量。
当前 drift_factors 中的 energy 对应 \(A\)。
由 \(p_z^2=u^2-q_\perp\),将差值的分子有理化:
CPU 和 GPU 当前均计算:
这是代数恒等变换,没有对动量偏差或横向角度作截断展开,保留了原来的精确几何映射。 带内部空间电荷的 GPU 漂移分段也使用同一个内核。
数值稳定性与精度限制
滑移很小时,原表达式需要将两个接近 1 的数相减,容易损失有效数字。 FP32 在 1 右侧的相邻浮点数间隔约为 \(1.19\times10^{-7}\), 所以真实值为 \(10^{-8}\) 或 \(10^{-9}\) 量级的滑移因子,在直接计算时 可能产生很大的相对误差,甚至被舍入为零。
当前表达式直接构造小量分子。尤其是 dp * (2 + dp),即使 1 + dp
被舍入为 1,仍能保留很小的动量偏差;若写成 (1 + dp)**2 - 1,则会再次引入
相近数相减的问题。
仅为理解物理含义,保留动量偏差与横向运动的主导项可得:
因此,轴上粒子的正动量偏差使其提前到达;总动量不变时,横向运动使其推迟到达; 理想参考粒子的滑移为零。跟踪实际计算的是前面的完整有理化公式,而非这个主导项表达式。
例如 \(L=1\,\mathrm{m}\)、\(\gamma_0=2\)、\(\delta=10^{-8}\), 且 \(p_x=p_y=0\) 时,精确滑移约为 \(2.5\times10^{-9}\,\mathrm{m}\)。 初始 z 为零时,有理化公式在 FP32 中能够保留这一增量。六维粒子坐标仍统一使用所选的 FP32 或 FP64:若将同一增量加到已有的 FP32 \(z=1\,\mathrm{m}\) 上,结果仍会舍入为 1。 有理化形式保留了增量的小量信息,但不能消除反复累加中的舍入误差,也不能消除两个 物理贡献几乎抵消时的相消误差。
正向传播的有效粒子采用 \(p_z=\sqrt{p_z^2}\),不对正的纵向动量设置人为下限。 无效粒子不参与坐标更新,已记录的首次损失信息保持不变。
计算开销与计时
对 N 个粒子的计算量为 O(N)。实际耗时取决于粒子数、存储精度、切片数、 临时数组和内存访问,应使用目标硬件与实际输入进行测量。 GPU 计时需排除首次编译,并用同步或 CUDA 事件覆盖异步执行。 单个漂移内核的耗时不能代表包含空间电荷、监视器和数据传输的完整模拟。
纵向坐标连续性
连续保存 z,不折叠多圈累计滑移。物理到达时间为 \(t_i=T_b-z_i/(\beta_b c)\),必须使用当前参考事件;名义槽位偏移不参与时间重建。
应用场景
束线连接 :在各磁铁元件之间提供自由漂移空间,是最常用的束线元件
色散测量 :在偏转磁铁后设置漂移段,利用色散效应测量束流动量分散
束流传输 :在注入线和引出线中传输束流,不施加任何场
孔径检查 :在关键位置设置带孔径检查的漂移节,监控束流损失
元件内部空间电荷
正长度元件可设置 space_charge (JSON Space charge)为
ElementSpaceCharge 对象。Num slices 控制外场传输,
Space charge.Num kicks 控制 SC 积分。调度规则、共享资源、
支持的后端和示例见 元件切片与内部空间电荷。
num_slices (JSON Num slices)为正整数,默认 1。
不启用内部 SC 时,CPU 与 GPU 均使用该数量的本体切片。