分布监视器(DistMonitor)
DistMonitor 在指定位置、指定圈数保存完整的束团粒子分布,包含尚未丢失和已经丢失的所有粒子。
圈数选择
Save turns 是由一个元素或三个元素组成的列表。单元素列表选择一个
从 0 开始的圈数;三元素列表 [start, end, step] 选择
start, start + step, ...,其中 end 为包含端点。可以给出多个
列表,重叠的选择会自动合并。
例如:
"distribution_1": {
"S (m)": 12.5,
"Command": "DistMonitor",
"Save turns": [[0], [100, 200, 10], [500, 1000, 100]]
}
"Save turns": [] 表示关闭保存,step 必须为正数。如果范围超出
模拟圈数,超过最后一圈的 end 会裁剪为 num_turns - 1 并给出 warning;
start >= num_turns 的范围会给出 warning 后忽略;负的 start 会裁剪为
0。范围格式错误、step 非正数以及 end < start 仍视为配置错误。监视器
在初始化时将选择编译为字节表,运行时判断当前圈数只需一次边界检查和数组查找。
接口参数
Python 字段 |
JSON key |
类型 |
默认值 |
说明 |
|---|---|---|---|---|
|
|
float |
必填 |
监视器在束线中的纵向位置。 |
|
|
str |
|
使用 |
|
|
list[list[int]] |
|
单圈 |
|
|
bool |
|
追加 |
|
|
str |
|
可选 |
序列键名会作为监视器名称。通过高层 API 可以直接使用 schema 对象:
from PASS.para.schema.monitors import DistMonitorItem
monitor = DistMonitorItem(s=12.5, save_turns=[[0], [100, 200, 10]])
保存带注入信息的 HDF5 快照:
from PASS.para.schema.monitors import DistMonitorItem
injection_monitor = DistMonitorItem(
s=0.0,
save_turns=[[0], [10, 100, 10]],
include_injection_metadata=True,
output_format="hdf5-gzip1",
)
这两个选项在生成的 JSON 中分别为 "Include injection metadata": true
和 "Output format": "hdf5-gzip1"。
输出内容
每个选中的圈数、每个束团生成一个 HDF5 文件(或指定的 TFS 文件)。文件名
包含运行时间、束流和束团编号、监视器位置、名称及圈数。全部已注入粒子都会
写出,包括损失粒子;尚未注入的 tag=0 预留位置不写出。
文件名标签遵循 表格输出格式 的规则:省略导入实例编号和重复的位置标签,
当前位置只出现一次。Monitor 元数据保留完整命令名。
默认的九个数据列如下:
列名 |
单位 |
说明 |
|---|---|---|
|
m 或归一化动量 |
横向相空间坐标。 |
|
m |
跟踪使用的束团相对坐标 |
|
相对动量偏差。 |
|
|
粒子标识;正值表示存活,负值表示丢失。 |
|
|
粒子丢失圈数(未丢失为 |
|
|
m |
丢失位置(未丢失为 |
HDF5 属性或 TFS 文件头包含 S、command 和监视器名称、束流/束团编号、Turn、
粒子计数、后端和精度、PASS 版本、时间,以及 ZCoordinate、ZCenter、
Circumference 等信息。保存时不会折叠或平移 z;存活粒子的通过时刻由
t = ReferenceArrivalTime - z / (ReferenceBeta*c) 恢复。
ZCenter 仅为分组元数据,不用于恢复物理通过时刻。
注入快照
Include injection metadata 默认 false。开启后追加三个整数列,
两种输出格式均包含十二列:
列名 |
说明 |
|---|---|
|
束流内的粒子身份,等于 |
|
粒子实际注入时的模拟圈数,从 0 开始。 |
|
原始注入源束团内的批次编号,从 0 开始;重新分组不会重新编号。 |
主机端根据 abs(tag) 和束流的 Injection 批次记录生成这些列,
ParticlePool 不保存对应数组。若缺少 Injection 状态,开启该选项保存时
会抛出 ValueError。若状态存在,但粒子 ID 没有匹配的批次记录,
injection_turn 和 injection_batch 为 -1,表示未知。
排序或损失不改变已出生粒子的身份和注入事件。不输出 tag=0 的预留位置,
其数量记录为 NumPending。
Output format 支持 "hdf5-gzip1"``(默认,gzip-1 + shuffle)、
``"hdf5"``(不压缩)和 ``"tfs"。两种 HDF5 均用数据集保存相同数据列,
用文件属性保存头信息。可选注入列不需要额外复制
设备上的逐粒子数组。
output_format``(JSON ``"Output format")默认为 "hdf5-gzip1";
设置为 "hdf5" 使用不压缩的 HDF5,或设置为 "tfs" 使用文本输出。HDF5 结构、压缩与统一读取方式见
表格输出格式。
CPU 与 GPU
CPU 直接从 NumPy 粒子数组写出。GPU 在选中圈数将九个跟踪字段 复制到主机内存,再由指定格式的写入器输出。监视器不会跨圈保留历史 buffer,因此 内存开销与单个粒子快照成正比,而不是与总圈数快照成正比。
坐标及参考量定义见 纵向坐标与参考到达时间;损失记录保留粒子损失事件的坐标。