admin
d371b28acc
feat: add display_amp parameter for visual displacement amplification
...
Supports display_amp: [ax, ay, az] in input.txt. On rendering, each atom's
displacement from its frame-0 equilibrium is multiplied by the corresponding
factor. Physics is unchanged; only the rendered positions are scaled.
Useful for visualizing small-amplitude waves that would otherwise be invisible.
Example: display_amp: [1.0, 1.0, 5.0] exaggerates z-direction motion 5x.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-13 07:28:56 +08:00
admin
d489222eaf
fix: driven atoms now oscillate around their initial equilibrium position
...
Previously, apply_driving_force set absolute position to A*cos(2π f t + φ),
ignoring the atom's initial coordinates. For atoms not at the origin (e.g.,
atom 120 at x=119), this incorrectly forced them back toward the origin each
step, causing severe distortion and numerical explosion.
Fix: store each driven atom's initial position as eq_pos/eq_x/eq_y/eq_z at
load time; position is now eq + A*cos(2π f t + φ) in all four engines
(Python, C, C++, Fortran).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-13 07:23:25 +08:00
admin
e62e536cee
feat: 真蛙跳法重构(Python/C/C++/Fortran 四引擎统一)
...
- 新增 compute_accel_conservative / accel_conservative:
保守力加速度(弹簧+重力+原子间引力),不含阻尼,供蛙跳专用
- 重写 leapfrog_step / leapfrog_full:
- 无阻尼:纯辛积分器,每步 1 次力计算(原 Velocity-Verlet 需 2 次)
- 有阻尼:半隐式处理 v(t+dt/2)=[v(t-dt/2)*(1-α)+a_c*dt]/(1+α),无条件稳定
- 主循环加初始化反向半步 v(-dt/2)=v(0)-0.5*a_c(0)*dt
- 修复 C/C++ number of frames 字段写采样帧数而非总积分步数的 bug
- Python 引擎:新增 display.npz 二进制格式,draw.py/plot_wave.py 优先读取
- 编译参数统一为 -O3 -march=native -ffast-math
2026-06-12 18:36:37 +08:00
admin
e40393d793
fix: display.txt 缺少渲染参数导致盒子不透明
...
外部引擎(C/C++)直接写 display.txt 时只输出基础物理参数
(DT/NSTEP/method 等),缺少 alpha/ball_color/box_color
等渲染参数,draw.py 读取不到 alpha 回退默认 0.2。
修复:
1. param.json 新增渲染参数(alpha/ball_color/box_color/...)
2. C/C++ 引擎 SimParams 新增对应字段 & JSON 读取
3. C/C++ write_display_txt 写入所有渲染参数 header
4. param.json ball_color/box_color 用数组统一存储
2026-06-12 15:05:46 +08:00
admin
dc7bc00616
feat: C/C++ 引擎支持 save_trajectory=0 时直接写 display.txt
...
所有引擎(Python/C/C++)在 save_trajectory=0 时行为一致:
- 计算时按 NSTEP 抽帧,只存 sampled 缓冲区
- 直接写入 display.txt(新文本格式)
- 不生成 trajectory.txt
Python 引擎:run_simulation 已支持 ✅
C 引擎:采样缓冲区 + write_display_txt ✅
C++ 引擎:采样缓冲区 + write_display_txt ✅
Fortran 引擎:待完成
compute.py run_engine:save_trajectory=0 时跳过 trajectory.txt 加载
dynamics.py:引擎直接输出 display.txt 时跳过抽帧步骤
2026-06-12 08:25:27 +08:00
admin
41790a782a
fix: save_trajectory=0 时删除 trajectory.txt,所有引擎保持一致
...
Python 引擎:run_simulation 已正确支持 save_trajectory ✅
外部引擎(C/C++/Fortran):save_trajectory_txt 仅在
save_trajectory=1 时调用;display.txt 生成后删除 trajectory.txt
补充:移除 compute.py 中重复的 'global use_marker' 和占位符
2026-06-12 08:18:07 +08:00
admin
b95a3579fc
feat: move_camera.txt 支持 all 关键词表示全程执行
...
在帧位置写 all 表示该段对所有帧生效:
all vx=0.1 ry=0.5 # 全程缓慢平移 + 旋转
等同于 start=0, end=INF,与普通区间段一样支持时间交叠。
2026-06-12 08:08:36 +08:00
admin
e40f7a49e4
feat: move_camera.txt 改为速度段格式驱动相机运动
...
格式:
1-60 vx=1.0 rx=10 # 1-60帧:x平移1/帧 + 绕x转10°/帧
30-90 vy=2.0 ry=20 rz=10 # 30-90帧:y平移2/帧 + 绕y转20°/帧 + 绕z转10°/帧
draw.py 每帧累加平移速度修改center,累加旋转速度修改
elevation/azimuth,实现连续平滑的相机运动。
2026-06-12 07:58:08 +08:00
admin
22b94011ee
feat: 运动相机支持 + move_camera.txt 关键帧驱动
...
input.txt 新增:
move_camera: 0 # 0=固定视角, 1=按 move_camera.txt 运动
move_camera.txt 格式(4列:帧号 距离 俯仰角 方位角):
0 40.0 0 0
100 80.0 -30 180
200 40.0 0 360
display.txt header 传递 camera_keyframes JSON 数组,
draw.py 按帧时间线性插值驱动相机运动(循环播放)。
2026-06-12 07:52:06 +08:00
admin
f1afb7c479
feat: 摄像机初始位置可在 input.txt 配置
...
新增 input.txt 字段:
camera_distance: 40.0 # 到场景中心的距离
camera_elevation: 0 # 俯仰角
camera_azimuth: 0 # 方位角
通过 display.txt header 传递到 draw.py,
不再硬编码在 draw.py 中。
2026-06-12 07:48:37 +08:00
admin
757a891a43
feat: display.txt 传递原子半径数组,draw.py 读取 per-atom 半径
...
之前所有原子使用统一的 ball_radius(来自 input.txt),
现在 display.txt header 包含 atom_radii 字段(逗号分隔
的半径数组),draw.py 据此为每个原子设置独立半径。
fallback:若没有 atom_radii 字段,仍使用 ball_radius。
2026-06-12 07:46:28 +08:00
admin
54aa20d7c5
fix: display.txt 缺失 alpha 透明度参数,draw.py 读取不到
...
alpha(盒子透明度)未写入 display.txt header,
draw.py 回退到默认 0.2 而非 input.txt 配置值。
现在 alpha 通过 header 字段正确传递。
Python 引擎:alpha 支持单值或数组 → 逗号分隔字符串
外部引擎:从 trajectory.txt 读取 alpha 值
2026-06-12 07:24:38 +08:00
admin
6b5e12da46
fix: display.txt 丢失 use_marker 导致强制使用 Sphere 渲染模式
...
新格式 display.txt 未包含 use_marker 字段,draw.py 中
USE_MARKER 被硬编码为 0(Sphere 模式),对 120 个原子
每帧更新 120 次 STTransform 极慢。
修复:将 use_marker 加入 display.txt header,draw.py 从
header 读取而非硬编码。case06 配置 use_marker: 1 会
自动启用 Marker(GPU 实例化)模式,动画流畅。
2026-06-12 07:04:29 +08:00
admin
7417d47658
perf: 重写 load_display_txt 使用 np.genfromtxt 批量解析
...
旧实现逐行 split()+float() 解析数据行要几十秒,
新实现将数据行收集后用 np.genfromtxt 一次性批量解析,
加载 200帧×120原子 仅需 0.087s(比之前快 100x+)。
2026-06-12 07:01:52 +08:00
admin
a3fa8b90f6
feat: display.txt 新增 T_total 头字段(总模拟时间=NT×DT)
2026-06-12 06:55:38 +08:00
admin
ab3a847483
fix: display.txt 的 number of frames 改为实际抽帧数而非总步数
...
之前 number of frames 错误地填入了 record_steps(=NT),
实际应该填入 n_frames_actual(=NT/NSTEP)。如 NT=20000,
NSTEP=100 时抽得 200 帧,现在正确显示为 200。
总步数仍在 dynamic_steps 中记录。
2026-06-12 06:51:59 +08:00
admin
0c332b7dfc
feat: display.txt 新增 dynamic_steps 头字段记录实际计算步数
2026-06-12 06:47:17 +08:00
admin
9d1f84d2bf
refactor: 引擎直接抽帧 + 新 display.txt 纯文本格式 + save_trajectory 开关
...
核心变更:
1. compute.py: run_simulation 直接按 NSTEP 抽帧写 display.txt(新格式)
- 新格式:纯文本,帧 1→n 分块,每行: n x y z vx vy vz
- 新函数 save_display_txt() / load_display_txt()
- save_trajectory 参数(默认0=不保留 trajectory.txt)
2. dynamics.py: 移除旧 JSON 采样逻辑,自动检测 display.txt
- Python 引擎直接读取引擎输出的 display.txt
- 外部引擎仍写 trajectory.txt,自动抽帧转 display.txt
3. draw.py: 适配 load_display_txt() 新格式
4. case06/input.txt: 添加 save_trajectory: 0, step_sample: 0
TODO: 外部引擎(C/C++/Fortran)内部抽帧写 display.txt
TODO: plot_wave.py 适配新格式
TODO: 其他案例 input.txt 更新默认值
2026-06-12 06:36:50 +08:00
admin
52505e9aff
fix(compute): 修复进度条跳变(20%→100%)
...
原因:外部引擎 stdout 管道缓存,Python 每 0.2s 读一行,
引擎结束时管道中大量库存进度消息没被用于更新进度条。
修复:
1. 子进程退出时扫描残留 stdout 中的 progress 消息并更新 pbar
2. sleep 从 0.2s 降到 0.05s,提高读取频率
2026-06-11 22:48:34 +08:00
admin
db50ac6d4d
feat: 外部引擎实时进度条 + C引擎read_bonds rewind修复
...
1. 引擎端:C/C++/Fortran 主循环每 1% 输出 progress 到 stdout
2. compute.py:读取 "[xxx] progress: N/total" 行更新 tqdm
3. 移除不准的时间估算逻辑,改用真实引擎进度
4. C引擎 read_bonds:rewind 后补 fgets 跳表头
5. gitignore 添加 output_test/
2026-06-11 21:36:30 +08:00
admin
e353e04133
fix(compute): 校准测速使用真实临时目录替代 os.devnull
...
os.devnull 在 Windows 上为 NUL,外部引擎(C/C++/Fortran)
试图写入 NUL/trajectory.txt 会失败退出,导致校准时间
完全无效,进度条按错误估计跑(例如卡在 59% 不动)。
改为创建 _calib_out 临时目录,校准后清理。
现在进度条显示正确的剩余时间估计(如 [00:00<00:11])。
2026-06-11 19:25:26 +08:00
admin
685234c84f
feat: 为 C/C++/Fortran 引擎增加驱动力(driving_force)支持
...
- param.json 新增 driving_force 开关
- C 引擎: 新增 DriverData 结构体、read_driver()、apply_driving_force()
- C++ 引擎: 同上(C++ 风格实现)
- Fortran 引擎: 同上(Fortran 90 风格实现)
- 修复 JSON 输出末尾逗号导致加载失败的问题
- 编译通过并验证 C 引擎运行正常(100000步/6.6s)
2026-06-11 09:19:34 +08:00
admin
854f00ae44
feat: 增加驱动力系统、Marker渲染模式、动画防闪退、案例文档
...
- 新增 driving_force 驱动力系统(driver.txt 定义,支持周期控制)
- 新增 use_marker 渲染开关(GPU实例化点精灵,提升大量原子性能)
- 修复动画闪退:独立控制台、错误日志、启动存活检测
- 重绘 draw.py 架构:双渲染模式 + 预分配键线缓冲区
- 修复 raw trajectory 采样时间变量遮蔽 bug
- 重构 case05: 60原子一维链 + 驱动力 + 完整案例文档
- 修复所有案例 Readme.md 编码(GBK → UTF-8)
- 所有 input.txt 新增 driver_file / driving_force / use_marker 参数
2026-06-10 15:34:53 +08:00
admin
5de80d4f7e
modified: CMakeLists.txt
...
modified: INSTALL.md
modified: README.md
modified: build_release_zip.py
modified: compute.py
new file: doc/index.html
modified: dynamics.py
modified: engines/c/main.c
modified: engines/cpp/main.cpp
modified: engines/fortran/main.f90
modified: examples/case01/input/coord.txt
renamed: examples/case01/input/parameters.yaml -> examples/case01/input/input.txt
modified: examples/case01/run_dynamics.py
new file: examples/case02/input/bond.txt
new file: examples/case02/input/connection.txt
new file: examples/case02/input/coord.txt
new file: examples/case02/input/input.txt
new file: examples/case02/run_dynamics.py
2026-05-20 16:03:59 +08:00
admin
45513fe334
init
2026-05-17 08:47:25 +08:00