逐束团横向反馈
TransversePickup 测量每个束团分组槽内活粒子的质心。
配对的 TransverseFeedback 在另一跟踪截面执行带延迟的有限冲激响应(FIR)滤波,
并对束团施加均匀、零长度横向踢。该模型用于研究相干振荡阻尼及横向不稳定性的抑制,
包括 尾场(WakeField) 引起的不稳定性。
同一束流序列中,每个拾取器必须恰好对应一个反馈节点。
反馈的 Pickup 字段直接引用拾取器的序列名称,不需要独立控制器命令或顶层配置块。
Enable=false 关闭这一对节点;独立质心输出请使用 监视器与输出。
模型与约定
第 \(n\) 圈、分组槽 \(b\) 的拾取信号为
只有 tag > 0 的粒子参与计算;当前束流模型中宏粒子权重相同。
固定参考位置的单位为米,拾取器不改变粒子,也不自动估计闭轨。
垂直方向使用相同公式,将 \(x\) 替换为 \(y\)。
反馈计算
其中 Delay turns 为 \(d\geq1\),系数按最新延迟采样在前排列,
增益 \(G_x\) 的单位为 \(\mathrm{m}^{-1}\),可选限幅 \(K_x\) 无量纲。
Max kick x=null 表示不限幅。选定分组槽的所有活粒子接受相同踢。
Harmonic IDs 选择分组槽,不代表粒子身份或 RF 谐波。
PASS 存储 \(p_x=P_x/P_0\)、\(p_y=P_y/P_0\);这里施加的是归一化横向动量增量, 不能对所有偏动量粒子都直接解释为同样的几何斜率增量。 这是理想薄横向踢模型,暂不包含电压标定、踢器带宽、束内波形、ADC 噪声、量化或饱和恢复动力学。
刚性束团质心反馈不需要 纵向切片(Slicer)。
拾取器与反馈必须放在真实跟踪截面;如需放入 Twiss 映射或厚元件内部,必须先拆分传输。
同一 S (m) 处需要指定物理先后时使用 Order;该位置全部命令均需提供互不重复的值。
节点必须在把粒子传输到该截面的命令之后执行。
时序、预热与分组
延迟按序列圈号定义:第 \(n\) 圈反馈使用第 \(n-d\) 圈拾取结果。
本实现只保存圈号,不保存硬件时间戳,也不模拟以秒为单位的固定硬件延迟。
实际物理时间间隔还包含两个跟踪位置之间的传播时间,升能时不能简单视为固定的
\(dT_{\mathrm{rev}}\)。
粒子通过时间仍遵循 \(t_i=t_0-z_i/(\beta c)\);
z_center 仅为分组元数据。拾取与反馈不折叠或修改纵向坐标。
两个方向共用较长 FIR 的历史长度 \(L\),较短系数列在末尾补零。
初始化或某槽重置后,必须获得 \(L\) 次连续有效采样才能输出。
若从第零圈起每圈均有有效采样,最早踢圈为 \(L-1+d\),同时受 Start turn 限制。
即使反馈踢晚于第零圈启用,拾取历史仍从第零圈开始预热。
空槽及无效采样会禁止输出并要求重新预热。
任何新注入批次,包括向已占用槽追加粒子,都会重置受影响槽的反馈历史,避免施加过时输出。
SortBunch 保留每个分组槽的历史;它替换粒子 tag 数组后,反馈缓存的粒子范围会失效,
在下一次拾取或反馈执行时重建。数组未变时仅比较对象身份,不逐圈扫描全部束团。
启用反馈的预热及活动区间从第零圈延伸到独占的反馈结束圈,期间不允许 ReorganizeBunch。
第一版要求固定分组;粒子跨槽迁移时,反馈历史不会跟随单个粒子。
FIR 相位与增益选择
产生阻尼的是传输、FIR 滤波和延迟的总相位。 滤波器能够补相时,拾取器到踢器的几何相移不必固定为 \(\pi/2\)。 在扣除闭轨后的归一化 betatron 坐标中,阻尼应反向作用于相干动量 \(P=(\alpha x+\beta x')/\sqrt{\beta}\)。 位置反馈相位不合适时,可能改变 tune 或激发增长。
design_feedback_fir(tune, phase_advance, delay_turns=1, tap_count=5, *, method="minimum_norm")
返回实数系数。这是可选的输入生成辅助函数;跟踪始终使用显式系数列表,
JSON 命令没有 method 字段。phase_advance 是 同一序列圈号下 的
\(\mu_{\mathrm{feedback}}-\mu_{\mathrm{pickup}}\),单位 rad。
反馈节点位于拾取器上游时,该值可以为负;不要重复加入已由 delay_turns 表示的整圈相位。
对于 \(x_n=\cos(\omega n+\phi)\) 和设计频率 \(\omega_0=2\pi Q\),两种方法均要求
结合命令踢公式中的负号,正增益在目标 tune 处反向作用于相干动量。 系数和为零使滤波器在预热后抑制固定拾取偏置。 两种系数设计如下:
|
最少系数数目 |
约束和目标 |
|---|---|---|
|
3 |
满足去直流和指定复响应三个实数约束,再使系数欧氏范数最小。 原有调用保持此设计。 |
|
5 |
除上述约束外,要求目标 tune 处包含延迟的复响应导数为零。 系数多于五个时,在满足全部五个实数约束的解中选择最小范数解。 |
平坦响应方法增加条件
在线性系统中增加 \((d+k)\cos(k\omega_0)\) 和 \((d+k)\sin(k\omega_0)\) 两行,目标值均为零。 这里必须包含完整延迟 \(d+k\),不能只对系数下标求导。 在拾取器到踢器的几何相移固定时,目标 tune 处的幅值和相位一阶导数均为零, 残余响应变化从二阶开始。这是局部平坦性,不保证某个有限带宽内的性能。
函数独立求解这些约束,不使用跟踪数据。若设计矩阵秩不足或病态,包括整数及 半整数 tune 附近的情况,则拒绝设计;条件数上限为 \(10^8\)。 对于平坦响应方法,求解和条件数检查前,前三行除以 \(\sqrt L\), 导数两行除以 \(\sqrt{\sum_k(d+k)^2}\)。正弦/余弦行使用相同尺度, 避免放大奇异 tune 附近的微小行。未缩放约束的残差还必须不超过 \(5\times10^{-10}\)。
函数仅将一个目标 tune 处的响应幅度归一化,不保证闭环稳定性、不自动选增益、 不补偿光学幅度比,也不保证某个阻尼时间。 更平坦的响应可能需要更大的系数,也可能有更小的稳定增益范围。 设计频率应参考预计的相干质心振荡谱;尾场及其他集体作用可能使它偏离裸晶格 tune。 平坦性是在几何相移固定的条件下计算的;如果机器设置改变时该相移也改变, 扫描中应同时考虑这种变化。 应先用小增益在完整晶格与延迟下验证,再扫描增益、tune 与相位。 用户直接输入的 FIR 系数不强制和为零,因此可能对静态轨道偏置产生踢。
Python 输入
把以下两个节点加入已在目标位置设置传输边界的序列;示例相移仅作演示,实际模拟应使用晶格值:
import math
from PASS.para.api import (
TransversePickupItem, TransverseFeedbackItem, design_feedback_fir,
)
taps = design_feedback_fir(
tune=0.23, phase_advance=math.pi / 3, delay_turns=1, tap_count=5, method="flat",
)
seq.add("pickup_x", TransversePickupItem(s=0.0, plane="x"))
seq.add("feedback_x", TransverseFeedbackItem(
s=10.0, pickup="pickup_x", coefficients_x=taps,
gain_x=0.01, delay_turns=1, max_kick_x=1e-4,
diagnostics_interval=10,
))
仍使用 generate_input(main, seq, output_path) 导出,不增加生成器参数。
GUI 的横向反馈组件区提供两类节点;新反馈草稿的增益及系数均为零,必须配置后才会产生阻尼。
反馈面板中的 生成 FIR 系数… 使用同一个辅助函数。
引用的拾取器决定生成 x、y 或两个方向的系数;各方向独立填写 tune 和同一圈号下的
有符号相移,单位 rad。GUI 不从节点位置或机器配置推断这些数值。
两个方向共用方法(默认 minimum_norm)、延迟及系数数量。
GUI 允许 3–256 个系数,其中 flat 至少需要五个;辅助函数本身没有 256 个系数的上限。
先 计算并预览,再 填入草稿,替换测量方向的系数、清空未测量方向的系数并同步延迟。 增益保持原值,因此初始零增益仍需在跟踪前自行设置。 系数数组可继续手动编辑;点击 应用 或 插入 才保存草稿。 tune、相移和设计方法不会成为 JSON 字段。完整操作见 图形界面。
接口
两个节点都接受 s / S (m)``(非负有限数,单位米)及可选严格整数 ``order / Order。
序列键提供节点名称。
Python 参数 |
JSON 别名 |
默认值 |
含义 |
|---|---|---|---|
|
|
|
|
|
|
|
固定拾取参考位置,单位米。 |
Python 参数 |
JSON 别名 |
默认值 |
含义 |
|---|---|---|---|
|
|
必填 |
本束流拾取器的精确序列名称。 |
|
|
|
严格布尔值;false 时关闭这一对节点。 |
|
|
|
踢的圈数窗口;非负严格整数,结束圈不包含在内;null 表示运行末尾。 |
|
|
|
至少为 1 的严格整数。 |
|
|
|
每个测量方向必须提供非空有限数列;未测量方向必须为 null。 |
|
|
|
有符号增益,单位 1/m;未测量方向必须为零。 |
|
|
|
归一化动量踢绝对值的非负上限;null 表示不限幅。 |
|
|
|
不重复的非负严格整数;null 选择所有分组槽。 |
|
|
|
非负严格整数;零表示不输出反馈诊断。 |
状态与数值范围
两个命令在构造时自行登记反馈对,双方就绪后直接关联,不依赖构造或跟踪先后顺序。 任一节点首次执行时初始化反馈缓冲,不需要执行器准备钩子。 注入命令在新批次进入某槽时通知反馈对,因此即使踢器位于拾取器上游,也会及时重置受影响槽的历史。 CPU 与 GPU 实现在同一跟踪模块内;GPU 路径的质心归约、FIR 历史、延迟输出及粒子踢均保留在设备端, 诊断输出按独立的可选采样周期传输。
束团粒子范围必须完整覆盖粒子且互不重叠。GPU 粒子数组必须是一维连续数组, 并满足声明的精度、长度和设备要求;这些检查不传输粒子数据。 质心或减去参考位置后的信号若为非有限数,该次采样无效,并需要重新完成滤波预热; 无效采样不会写入保存的历史。
Diagnostics interval (turns) 为正时,在本次运行输出目录下写入
feedback/beam<beam_id>_<safe_command_name>_<hash>.csv。
每行含分组槽 ID、拾取质心、活粒子数、滤波位置、实际踢及限幅标记。
sample_turn 是最新拾取采样圈;filter_target_turn=sample_turn+d
是该滤波位置排队等待的目标圈。
kick_turn 是实际施踢圈,requested_source_turn=kick_turn-d 是请求的延迟信号源圈;
预热或重置后,该圈可能没有可用采样。
因此,同一行的滤波位置通常不直接产生这一行记录的踢。
输出每 128 个采样圈批量写入,结束时写入剩余缓冲,不覆盖已有文件。
state_dict() 与 load_state_dict() 只保存和恢复反馈控制器状态。
匹配的粒子、束团参考事件、时钟及圈号状态仍需由调用者负责。
这些 API 不提供完整模拟重启;跟踪入口从第 0 圈开始新运行。