feat: display.txt 传递原子半径数组,draw.py 读取 per-atom 半径

之前所有原子使用统一的 ball_radius(来自 input.txt),
现在 display.txt header 包含 atom_radii 字段(逗号分隔
的半径数组),draw.py 据此为每个原子设置独立半径。
fallback:若没有 atom_radii 字段,仍使用 ball_radius。
This commit is contained in:
2026-06-12 07:46:28 +08:00
parent 466a301d34
commit 757a891a43
3 changed files with 10 additions and 3 deletions
+2 -1
View File
@@ -1460,7 +1460,8 @@ def run_simulation(save_trajectory=0):
"gravity_strength": str(GRAVITY_STRENGTH),
"driving_force": str(DRIVING_FORCE),
"use_marker": str(use_marker),
"alpha": ",".join(str(a) for a in (alpha if isinstance(alpha, list) else [alpha]))}
"alpha": ",".join(str(a) for a in (alpha if isinstance(alpha, list) else [alpha])),
"atom_radii": ",".join(str(r) for r in ATOM_RADII)}
)
print(f"[compute] display.txt 已保存至: {disp_path} ({n_frames_actual} 帧)")
+6 -1
View File
@@ -67,7 +67,12 @@ DISP_T = DISP_STEP * DT
# 原子信息
ATOM_IDS = disp_data["atom_ids"]
ATOM_RADII = np.full(N_ATOMS, float(h.get("ball_radius", 0.5)))
# 优先使用 per-atom 半径,否则用统一的 ball_radius
_raw_radii = h.get("atom_radii", "")
if _raw_radii.strip():
ATOM_RADII = np.array([float(x) for x in _raw_radii.split(",")])
else:
ATOM_RADII = np.full(N_ATOMS, float(h.get("ball_radius", 0.5)))
PLOT_ATOM_ROW = 0
PLOT_ATOM_ID = int(ATOM_IDS[0])
BOND_PAIRS = [] # display 格式不含成键信息,从原始数据加载
+2 -1
View File
@@ -253,7 +253,8 @@ def run_case(config_path, runtime_base, input_dir="input", output_dir="output",
"gravity_strength": str(data.get("gravity_strength", 1.0)),
"driving_force": str(data.get("driving_force", 0)),
"use_marker": str(config.get("use_marker", 0)),
"alpha": _fmt_alpha(data.get("alpha", 0.2))}
"alpha": _fmt_alpha(data.get("alpha", 0.2)),
"atom_radii": _fmt_alpha(data.get("atom_radii", []))}
n_frames = len(indices)
compute.save_display_txt(