admin
b584c4489c
refactor: merge wave/energy panels into 3 vertical subplots
...
- Plot 1: x/y/z displacements overlaid on one axes
- Plot 2: per-atom KE/PE/total energy overlaid on one axes
- Plot 3: system energy vs time (unchanged)
All three stacked vertically. Shared y-axis scale within each panel.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-13 08:32:41 +08:00
admin
2ab3436235
feat: redesign plot_wave with per-atom energy panels
...
New 4x2 layout: left col = x/y/z displacement waves, right col = per-atom KE/PE/total energy + system energy vs time.
PE split 50/50 for normal bonds; 100% to non-driven atom when bonded to driver; driven atom PE = E_SHO - KE.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-13 08:26:51 +08:00
admin
39ff650539
fix: show interactive window when plot_wave_save_gif/mp4 are both 0
...
Use Agg backend and show=False only when saving to file.
When neither gif nor mp4 is requested, show the animation window interactively.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-13 08:14:40 +08:00
admin
1cefe184d7
fix: plot_wave plt.show() crash when called non-interactively
...
Add show=False parameter to plot_wave(); when called from dynamics.py,
pass show=False and set matplotlib Agg backend to avoid NonGuiException.
Also print full traceback on failure for easier debugging.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-13 08:10:16 +08:00
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
e1ade53fff
docs: 综合三工具六版本分析,输出 workbuddy_v2.md
...
基于 workbuddy.md / claude.md / codex.md 三份原始分析
及 claude_v1.md / codex_v1.md / workbuddy_v1.md 三份综合
版本,输出最终优化方案。
核心改进:
- 三工具角色定位框架(QA/Perf/Architect)
- Bug 三级分类(真 Bug / 已修复 / 疑似误报)
- 三阶段方案(修正确性→做性能→做治理)
- 自我评价与修正(v1→v2 改进表)
- 10 场景工具选择速查表
2026-06-12 15:45:47 +08:00
admin
d930fb558c
docs: 综合三方工具分析,输出最终优化方案 workbuddy_v1.md
...
对比 WorkBuddy/Claude/Codex 三款 AI 工具对同一代码库的
优化建议,以表格形式评价各自优劣(Bug 发现/代码质量/战略
思维/代码示例),最终整合为 6 阶段实施计划(11 人天)。
2026-06-12 15:39:31 +08:00
admin
782422e800
docs: 添加优化建议文档 optimization/workbuddy.md
...
涵盖架构/性能/代码质量/配置/测试/引擎一致性/UX 等
9 个方面、26 条具体建议,标注实施优先级和工作量。
2026-06-12 15:15:10 +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
6298ed5b34
fix: 外部引擎路径 display.txt 未随 T_total 变更刷新
...
当 T_total 从 20→100 时,外部引擎写入的 trajectory.txt 是新的,
但 display.txt 缓存未刷新(检查是否存在而非检查是否过期),
导致总帧数仍为 200(NT=20000 时的数据)。
修复:外部引擎路径总是从 trajectory.txt 重新抽帧生成 display.txt。
2026-06-12 08:11:44 +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
b4fed4fbb8
fix: 运动相机时间交叠时所有段依次作用
...
之前只取了第一个活动段 active[0],时间交叠时后面的段被忽略。
改为遍历所有段,按文件顺序依次施加平移和旋转。
排在前面的段优先作用于相机位置(矩阵非对易性保证)。
2026-06-12 08:06:15 +08:00
admin
c454162d0b
feat: draw.py 直接读取 move_camera.txt,修改后重启即生效
...
draw.py 启动时优先读取 input/move_camera.txt(实时文件),
不存在或为空时回退到 display.txt header 中的缓存数据。
改动 move_camera.txt 后只需重启动画窗口(关掉旧窗口重新
run_dynamics.py),无需重新跑模拟。
2026-06-12 08:02:50 +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
466a301d34
fix: alpha numpy 数组格式化问题导致逗号丢失
...
trajectory.txt 中的 alpha 以 numpy 数组形式加载,
str() 后变成 "[0. 0. 0. 0. 0. 0.]"(无逗号),
draw.py parse 不成功回退为默认 0.2。
新增 _fmt_alpha() 统一格式化为逗号分隔字符串。
2026-06-12 07:28:05 +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
c3e50d265d
ui: 缩小 ball_info 字体 28 → 18,适配更多信息显示
2026-06-12 07:07:26 +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
c158c74609
perf: 降低 JSON 输出精度 15→8 位 + 添加 I/O 阶段提示
...
- C/C++/Fortran 引擎:%.15g/setprecision(15)/g0 → %.8g/g0.8
- 添加 "正在写入轨迹数据…" 提示,说明 100% 后的等待原因
- trajectory.txt 文件从 419MB → 407MB(仍有优化空间)
2026-06-12 05:53:27 +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
42c6776eff
chore: 添加 output_test 到 gitignore
2026-06-11 19:42:23 +08:00
admin
9d5997afec
fix(c): read_bonds 中 rewind 后未跳过表头行导致成键数据全为空
...
rewind(f) 将文件指针拉回开头(含表头 'n1 n2 bond_name'),
后续 fscanf 试图将 'n1' 解析为 %d 全部失败,导致:
- bond_pairs 直接用未初始化的栈垃圾 → 随机索引
- bond_stiffness/rest_lengths 保持默认值 1.0/2.0
- 弹簧力无法正确传播 → 第一个原子动后后面全不动
修复:rewind 后加 fgets(line, ...) 再次跳过表头。
2026-06-11 19:38:10 +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
1fd87cc33b
fix(fortran): 修复 JSON 输出缺少逗号导致解析失败
...
write_json 中 bond_rest_lengths 后面缺少逗号,
导致 JSON 解码器在 driving_force 前报错:
JSONDecodeError: Expecting ',' delimiter
将 has_next 从 .false. 改为 .true.,空数组版本也补上逗号。
2026-06-11 19:14:54 +08:00
admin
b783cbb981
fix(fortran): 修复 read_coord 中 line(0:0) 字符串越界导致崩溃
...
错误码 3221225785 (0xC0000005 = STATUS_ACCESS_VIOLATION) 由
read_coord 中列数统计的双重条件导致:
line(i:i) /= ' ' .and. (i == 1 .or. line(i-1:i-1) == ' ')
Fortran 不保证 .or. 短路求值,当 i=1 时 line(0:0) 触发
内存越界。拆分为嵌套 if 块,确保只有在 i>1 时才访问
line(i-1:i-1)。
2026-06-11 19:11:34 +08:00
admin
b9ec622808
fix: C/C++/Fortran 引擎补齐 wrap_position 和 t=0 驱动力
...
- 三引擎均新增 wrap_position 周期边界回绕(调用在 limit_in_box 后)
- 三引擎均新增 t=0 驱动力初始调用(在预热循环前)
- 至此三引擎算法与 Python 完全一致
2026-06-11 18:57:41 +08:00
admin
2ce8ded482
case06: 原子数 60→120,更新文档
2026-06-11 18:44:59 +08:00
admin
586d7c29b2
case06: 原子数 60→120,更新文档
2026-06-11 18:43:35 +08:00
admin
8261017879
docs: 添加 examples/Readme.md 总览(6个案例介绍)
2026-06-11 13:32:23 +08:00
admin
20bfdf2f18
feat: 新增 plot_wave_save_gif/plot_wave_save_mp4 开关
...
- 所有 input.txt 新增 plot_wave_save_gif / plot_wave_save_mp4 参数
- dynamics.py 将参数传入 plot_wave()
- plot_wave.py 根据 save_gif/save_mp4 标志条件保存文件
- 默认均为 0(不输出文件,只显示动画窗口)
2026-06-11 13:31:33 +08:00
admin
131f52fe19
docs: case05纵波 + case06横波一维原子链
...
- case05 Readme.md 更新为纵波模拟描述
- case05 run_dynamics.py 注释更新
- case06 创建为一维原子链横波模拟
- coord.txt: fix_x=1, fix_y=1, fix_z=0 (z方向自由)
- driver.txt: amp_z=0.5, freq_z=0.1, phi_z=90°
- input.txt: 横波配置 + step_plot_wave
- Readme.md + doc/index.html + run_dynamics.py
- 模拟验证通过 (50000步/30s)
2026-06-11 13:27:43 +08:00
admin
80520590d1
feat: 新增波形能量动画系统 plot_wave.py
...
- 创建 plot_wave.py: 从 display.txt 读取原子位移数据
绘制纵波(x) + 横波(y) + 横波(z) 波形随时间的动画
同时绘制系统动能/弹性势能/总能量/输入功率(dE/dt)时变曲线
输出 wave_animation.gif
- 所有 input.txt 新增 step_plot_wave: 0 开关
- case05 开启 step_plot_wave: 1
- dynamics.py disp_data 新增 bond_stiffness/bond_rest_lengths
- 更新案例文档
2026-06-11 12:39:46 +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
6da82de49b
docs: 更新 case05 Readme.md —— 驱动力描述、使用说明
2026-06-10 15:42: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
0f04630fc0
add NumericalMethods.py
2026-05-23 14:59:36 +08:00
admin
28fcbe22dc
new file: doc/manual.html
2026-05-20 20:07:31 +08:00