Files
CelerisLab/research/repair-2026-10-10/TRON_HANDOFF.md
T

25 KiB
Raw Blame History

CelerisLab 修复交接:供 TRON 独立复核

2026-10-10。用户授权本轮修复现有错误、组织 subagents 并实际运行检查。没有实现壁面 jet、AMR/多层网格,也没有开展全面重构。保持当前模块边界和主要公共接口。

工作树与来源

基线为 main 的 6e3756c587ec08ab6a55c4a1a5f4671822d3f0a0,没有提交或推送。修复前已有用户改动,见 baseline-status.txt、baseline-hashes.json。四个生成配置头和 tests/postproc/experiment.ipynb 是原有改动,不是本轮补丁;修复后逐字节哈希与本轮开始时一致。原副本保存在 original-user-files/。

唯一运行来源为 /home/frank14f/CelerisLab/src,解释器为 /home/frank14f/anaconda3/envs/pycuda_3_10/bin/python(Python 3.10.13)。包、compiler 和 CUDA 源文件的实测路径见 provenance.json,永久 GPU 测试也断言源码来源。未修改 DynamisLab 下的副本、全局安装或环境配置。

运行采用 Tesla V100-SXM2-16GB;物理 GPU 限定0、1,进程内映射为 device 0。编译使用临时独立源码副本和配置头,Simulation 关闭时清理;测试没有覆盖仓库内生成头或 PTX。

分工与独立复核

  • numerical:CUDA 算子、边界、EsoPull 映射与 stepper;报告 repair-numerical.md。
  • state:对象、局部流场修补、传输、快照和检查点;报告 repair-state.md。
  • architecture:配置、隔离编译、上下文与资源、CPU 导入和包声明;报告 repair-architecture.md。
  • root:Simulation 集成、涡初始化修复、现有测试门槛、实际 GPU 验证和交接。仅就 close/constructor 异常清理授权 architecture 协助修改 Simulation 对应区域。

实施时共享任务说明明确物理与兼容约束(完成后已清理过程文件),接口变更先互通。state/numerical 相互核查同时间 EsoPull 映射与恢复阶段,并独立运行对方测试。architecture 对检查点进行交叉审查,发现定期保存时 obs 计数落后;root 修正为逐批累计,保存前等待对应 stream 完成。

实施的修复

范围 修复结果 核查重点
全局外力 TRT 按偶/奇松弛率修正源项;MRT 使用各矩对应的修正 除质量、动量外,D2 全分布与独立矩阵公式对照
稀疏 force_region 保留原来的步后独立冲量;用中点速度源项消除错误碰撞系数 单步 Δj=F;二次平衡下等价于局部平衡分布差,不声称与全局 Guo 在所有阶数等价
EsoPull 同一 completed count 的编码成为解码逆;同步不再隐含碰撞;壁面供体在原地写之前统一读取 首步、后续奇偶步、非均匀场、闭域与双缓冲同空间阶段比较
移动壁和入口 Bouzidi 反射修正符号及可压缩密度因子;shifted 入口密度常数修正 各方向、q 两分支和 fallback;不改既有入口方法
物体增删 Q-major 访问、精度/shift 编码与字节偏移一致;补丁外数据保持;立即删除也维持 dense IDs FP32/FP16S,奇偶步、cache、增删后继续运行
对象控制与叠加 控制不被其他对象刷新覆盖;sensor/force 标记不改变 solid occupancy;过滤无效采样点 多个 force_region 的实际流体 footprint 重叠提前拒绝,避免同 cell 并行写
快照与检查点 field-only 快照跨 EsoPull 奇偶恢复;v2 检查几何/投影并恢复控制、设备已应用 action、runtime params、obs 和缓存 保存 host 待上传目标与 device 已应用 action 的区别,保留 upload_act=False;相同 count 不代表同几何
CUDA 传输与资源 异步 host 缓冲使用 pinned memory 并保持生命周期;操作作用域绑定所属 context;多实例非逆序关闭 构造失败保留原始异常;关闭失败可重试;外部 stream 必须在对应实例 context 下创建
配置与构建 独立临时编译目录;浮点宏不再按展示精度截断;显式路径缺失报错;分配结构变化拒绝;重编译同步新黏性 omega 编译失败不读取旧隐式 PTX;CPU 工具可独立导入;Python 最低版本声明 3.10
涡初始化 复用标准可压缩平衡分布,补齐 rho;Oseen 中心使用解析极限及近中心稳定展开 rho≠1 的零强度不变;中心/近中心有限、远处保持原公式;没有时间信息的 EsoPull 初始化明确拒绝
检查本身 集成测试固定小网格、显式空对象配置;传感器数值比较成为 pytest assert 原来只返回结果的 validation 不能再静默通过

经复核保留的设计

  1. snapshot()/restore() 只保存/恢复流场,不回退时钟和控制。EsoPull 保存 next-pull 物理分布,并按恢复时的 count 重编码。需要精确续跑用 checkpoint。
  2. run() 仍丢弃未 sync_bodies() 的暂存编辑;runtime sync 仍重编号。立即删除现也明确会压紧 IDs,调用者需重新取得剩余 ID。
  3. 公共 recompile() 仍禁止初始化后调用;运行中拓扑改变经 sync_bodies()。root 新测试曾误期望公开入口能越过此限制,修正了测试而没有改变 API。
  4. checkpoint 仍允许 collision/LES 等参数研究;改变黏性时使用新配置 omega。v1 内置 circle/sensor 的匹配几何可以安全读回;无法恢复真实控制的 v1 force_region 及未知自定义几何明确拒绝。
  5. force_region 仍是稀疏步后冲量;LES 原有模型选择、BFS 新流体填充策略没有替换。
  6. EsoPull get_ddf() 仍返回已解码精度/shift 的 backing 排列,不冒充物理节点分布。EsoPull 宏观诊断是当前 count 的 next-pull 阶段;双缓冲诊断是空间 postcollision 阶段。已移除文档中不适用于这些阶段的历史“bit-identical”断言。

复现检查

从 /home/frank14f/CelerisLab 执行:

env PYTHONPATH=/home/frank14f/CelerisLab/src PYTHONDONTWRITEBYTECODE=1 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 \
  /home/frank14f/anaconda3/envs/pycuda_3_10/bin/python -m pytest tests/unit -q -p no:cacheprovider

env PYTHONPATH=/home/frank14f/CelerisLab/src PYTHONDONTWRITEBYTECODE=1 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 \
  /home/frank14f/anaconda3/envs/pycuda_3_10/bin/python -m pytest tests/integration tests/validation/test_sensor_accuracy.py -q -p no:cacheprovider

数值 unit suite 包含真实头文件/辅助 kernel 的 CPU shim 和 12 个独立 nvcc 编译组合;状态 unit suite 用真实 Python 方法与 HDF5,driver double 检查地址边界和 pinned 约束。两者不能替代 GPU。GPU suite 使用真实编译入口与设备,覆盖守恒、奇偶步、双布局、FP16S 状态修补、bitwise checkpoint 续跑、多实例上下文,以及约 1000 步后的 sensor 与宏观采样直接对比。

最终结果以同目录 final-unit.log 和 final-gpu.log 为准,汇总在本文件尾部。

尚未证明或未实现的边界

  • D3Q19 完整求解器仍未实现。 全入口仍有维度不完整的 aux/sync 调用;Simulation 在分配/编译前明确拒绝。D3 局部 collision/shift 修复与测试不代表三维求解器可运行。
  • 未做长时间高 Re、生产工况、LES 全组合、曲壁力/力矩网格收敛验证。小算例有限值、守恒和续跑一致性不能证明这些性质。
  • EsoPull 入口/出口已在后续轮统一为预暂存 spatial postcollision 供体;原始失败与后续验证分开保留,见末节。仍不将有限回归扩大为所有边界组合的正确性证明。
  • 壁面正确性引入每步一次小规模 prepass 和 4*(6*nx+2*ny*nq) 字节 scratch(已合并入口/出口准备);没有进行性能基准,不能宣称绝无性能变化。可后续基于性能实测合并兼容的边界准备工作。
  • 编译成功后若发生设备 OOM/重绑定失败,runtime topology sync 尚不是通用事务回滚机制;不要将正常路径测试描述成所有设备故障下的原子恢复。
  • 动态拓扑仍使用现有 BFS/equilibrium 初始化,未新增严格守恒移动边界算法。jet/网格方向需以后单独设计与验证。

建议 TRON 顺序:检查本轮与基线的差异归属 → 同 count/空间阶段映射与移动壁符号 → 力源项全向量 → checkpoint host/device 控制时序与兼容性 → 独立复现 GPU 测试 → 原地入口/出口读写与性能复核。

最终实测结果

合并所有修复后重新运行,两个进程均 exit 0:

  • tests/unit:124 passed,8 subtests passed,26.72 秒。日志 final-unit.log。
  • tests/integration + tests/validation/test_sensor_accuracy.py:66 passed,190.25 秒,真实 V100 GPU。日志 final-gpu.log。
  • git diff --check:通过。
  • 原有四个配置头和 notebook:最终哈希与修复开始时一致。见 provenance.json。

这些结果是本轮受测范围的证据;TRON 的独立复核仍有必要,尤其是上面列明的数值阶段、入口/出口并发与性能边界。

整理与精简(稳定性验证轮)

删除了 17 个由本轮研究/修复产生的旧复现脚本、调度记录、重复哈希和重复 baseline diff,共 3718875 字节。保留原始失败结果、正式研究、永久测试与当前交接。用户原文件未修改,original-user-files/ 备份与哈希保护链保留;没有清理 ref/、用户原有研究文档或实验结果。旧报告中的复现命令是历史记录,现行命令以本交接及永久测试为准。

生产代码消除了重复参数打包、独立构建目录内多余的临时文件写入,以及手写配置字段清单;没有新增插件、注册器或通用框架。经典验证复用原有圆柱脚本,补齐作用域 context 和临时目录清理;Poiseuille 只有一个独立验证脚本。

经典案例与稳定性:后续修复前的基线(2026-10-10)

本轮只用物理 GPU 0、1;进程内均为映射后的 device 0,固定前述独立源码和解释器。结果集中在 classic-results.json,可复算频率/受力的时序集中在 classic-signals.npz。不保存重复的整场快照与多套 CSV/报告。

案例与范围 实际运行 结果
Sah04 S2,MRT/双缓冲,Re_nom=200,β=.5,2402×62 120000 步,burn 45000 St=.3566902,对 .3513 误差 1.534%,通过原 5% 门槛;Re_real=204.881,ρ范围 .9820–1.0512
Kan99b K2,MRT/双缓冲,Re=100,α=1,1351×601 280000 步(burn 80000 + 200000) 五项均通过原有门槛:St=.169641(2.502%),mean Cl=−2.57953(3.675%),mean Cd=1.14603(3.807%),Cl振幅=.355069(2.212%),Cd振幅=.098919(.384%)
相同 K2,EsoPull 同样 280000 步,无 NaN/Inf 五项均未通过:St=.138851(16.102%),mean Cl=−2.32464,mean Cd=.823321;不应把“没发散”算作精度合格
解析 Poiseuille,SRT/TRT/MRT×两布局×H16/32/64,FP32+shift 共 18 个基准组合、299754 步,Re=4.8,Ma≤.052 16/18 通过预设误差/质量/稳态门槛;各碰撞模型的双布局剖面逐值一致。H64 弱力 MRT 两布局误差 .6977%,超过 .15% 门槛

Poiseuille 采用 x 周期、半程无滑移壁,解析式 u(s)=F*s*(H-s)/(2*rho*nu);参考 ref/lbmpy/src/lbmpy/analytical_solutions.py::poiseuille_flow 及 ref/lbmpy/tests/poiseuille.py。公开宏观读取阶段不同,本验证统一回到 spatial postcollision 分布并按该阶段减去半力动量;没有把两种阶段的速度直接比较。原门槛为 H16/32/64 相对 L2≤1%/.3%/.15%,质量漂移≤5e−4,稳态相对残差≤2e−5,横向速度≤1e−5。H64 MRT 将外力提高4倍、仍保持 Ma≈.052 后误差降到 .00776%;这是另一参数诊断,没有替换失败的原案例。它提示弱力/FP32敏感性,未证明具体误差机制;TRT 误差也非单调下降,不能概括为所有组合已验证二阶收敛。

Sah04 的现有提取器带目标频段筛选,因此另用全部非零频率中的全局主峰复算,得到完全相同 St=.3566902,排除了本次结果因目标加权挑峰而“通过”。K2 保留原文升力符号,没有取绝对值或翻转观测量来通过门槛。参考全文已在 tests/specs/sah04.md、tests/specs/kan99b.md,阈值来自既有对应 validation spec,没有事后放宽。历史记忆中的 K2 升力符号问题在当前双缓冲配置不再出现;不能据此替旧结果重新定性。

EsoPull 新发现的边界限制

64×32 小域、共同 spatial count=1 初态、圆柱 omega=0/.002,运行20步:x 周期时两布局分布逐值相同(力仅有原子归约舍入差);regularized/uniform/free-slip 开放边界时,首步误差出现在入口/出口(约6.8e−5),20步最大约 .0068,初期圆柱附近无差异。额外只读 CPU 检查在没有并发的情况下也产生边界输出差异。

源码原因:boundary/inlet_outlet.cuh 的 EsoPull regularized/channel/outlet 从邻居读 load_f_esopull(...,t) 的 next-pull 状态,双缓冲却读 spatial postcollision 供体。阶段不一致已经复现;原地核同时读取邻居多方向值还存在并发风险,但本次实验没有单独测定其贡献。这是两个实现尚未统一离散边界语义的证据,不能简单把不同公式都归为存储差别。

在已有 tests/integration/test_numerical_gpu.py 增加了周期曲壁的2项通过回归,以及开放边界的2项 strict xfail(已知未修,不能算通过);root 在 GPU0 独立复跑得到 2 passed, 2 xfailed。后续修复应在原地推进前取同一明确阶段的供体,并统一入口、出口和自由滑移交角读取;优先考虑复用现有边界准备过程。仅换一个 load helper 不能解决读写时序。上述为修复前基线;后续实施与结果见末节。

D3 支持边界的准确解释

当前绕过 runtime 检查、对无对象 D3Q19/SRT/双缓冲进行隔离 nvcc 编译,仍有 18 个错误,来自 aux_kernels.cu 和 esopull_sync.cu 的二维 coordinates/compute_neighbors 调用;统一入口无条件 include 这些文件,所以即使不使用 EsoPull 或对象也被阻断。原审计为20个错误;提前报错没有撤掉原本能运行的三维功能。

已有 D3 descriptors、局部碰撞、双缓冲主步、部分初始化和双缓冲 host 宏观诊断。缺的是完整链:对象 mask/links/sensor 仍按 nx×ny 构建(16×8×4 的 CPU 实测产生512/128长度错误);D3 EsoPull 初始化布局、墙面处理和宏观诊断未闭合;对象控制及局部补值仍偏二维。最小扩展可先做“无对象、双缓冲、明确 z 周期边界”的受限 D3,再验证均匀态、剪切波、平行板流与重启;不必以一次实现所有三维功能为前提,也没有在本轮开启这项实现。

精简后的复查与复现

本轮生产逻辑共去掉约37行重复;相对最初 HEAD、扣除原有用户修改后,生产代码/元数据净增约384行,主要用于已复现的恢复、所有权和配置缺陷。不能把新增测试与生产路径混算,也不能用净行数代替可读性审查。没有新增生产模块、注册器或抽象层。

精简后的检查:tests/unit 加状态/配置 GPU 回归,141 passed,8 subtests passed;日志 simplification-checks.log。经典 runner 使用作用域 context 和 TemporaryDirectory;其原本不论验收结果都返回0的行为也已修正:非 smoke 模式验收失败返回非零。利用本次已保存的真实结果重放 CLI 报告路径,验证好/坏结果分别返回0/1;这是报告层检查,没有伪称重跑物理。

经典运行命令(同样设置固定 PYTHONPATH 与 PYTHONDONTWRITEBYTECODE):

CUDA_VISIBLE_DEVICES=0 /home/frank14f/anaconda3/envs/pycuda_3_10/bin/python tests/validation/run_sah04_st_matrix.py --case S2 --json-out /tmp/sah04.json --dump-npz-dir /tmp/sah04
CUDA_VISIBLE_DEVICES=0 /home/frank14f/anaconda3/envs/pycuda_3_10/bin/python tests/validation/run_kan99b_rotating_cylinder.py --case K2 --no-k2-control --domain M --out-dir /tmp/k2-double
CUDA_VISIBLE_DEVICES=1 /home/frank14f/anaconda3/envs/pycuda_3_10/bin/python tests/validation/run_kan99b_rotating_cylinder.py --case K2 --no-k2-control --domain M --streaming esopull --out-dir /tmp/k2-esopull
CUDA_VISIBLE_DEVICES=1 /home/frank14f/anaconda3/envs/pycuda_3_10/bin/python tests/validation/run_poiseuille.py --output /tmp/poiseuille.json

上述基线中的 EsoPull 开放边界与弱力 MRT 问题已进入后续修复;最新状态见末节。任何有限案例均不能扩展成全部模型、全部入口和整个稳定性范围已通过。

二维后续修复:MRT 精度与开放边界(2026-10-10)

此节是最新实现状态;上方经典表格保留修复前结果。继续采用相同模型、Re/Ma、网格、采样长度与门槛。numerical 负责边界和初始化,state 负责 MRT,architecture 独立核对,root 负责公共入口、整体验证和结果整理。

  • EsoPull 开放边界:原 PrepareEsoPullWalls 扩为 PrepareEsoPullBoundaries,同时读取 y 壁和 x 入口/出口的供体,仍只有原来的一次准备启动。scratch 为 [6*nx][2*ny*nq] 个 float;在曲壁及原地写入前暂存同阶段 spatial postcollision,首步保留初始化语义。入口/出口和 free-slip 已知方向修补均改读这份供体,移除 live-fi、t 参数和重复邻居计算。原两项 strict xfail 已改为正常断言并通过,覆盖静止/旋转圆柱、开放/周期 x 边界;额外覆盖 ny>nx、首步和后续奇偶步、实际边界头文件检查。
  • D2 shifted MRT:直接变换 g=f-w,以 M*w=(1,-2,1,0,0,0,0,0,0) 移除平衡矩背景。保留 LL 矩阵、固定 1.2 松弛率、shear omega、Guo 半前半后源项。旧式在 rho=1、u=F=0 单次碰撞就产生约1e−8的分布漂移;新式精确保持静止。独立 FP64 全九分量 oracle 覆盖54种弱力/密度/非平衡组合。原18项 Poiseuille 全通过,H64 MRT L2 从 .6977% 降为 .02085%,质量漂移从4.927e−4降至3.896e−7;SRT/TRT原数值不变,9对双布局剖面逐值一致。这是精度修复,不是最优 MRT 或所有参数收敛性证明。
  • 初始化与入口契约:初始化复用 compute_feq 和现有同时间 EsoPull 编码,删去重复公式;shifted u=1e−9不再归零。成功重新初始化后 step_count 归0,再以0解码;不新增重复 obs 清零(既有流程已完成)。两布局各先跑3/4步后重初始化,与新实例的初态及下一步逐值一致,host/device obs与累计窗口均清零。run 在修改状态前拒绝负数/非整数步数及 checkpoint_interval,保留 run(0) 与整数协议。runtime 拒绝 nx<3、ny<4:否则供体越界或上下壁相邻行重合;局部算子配置仍可独立研究。

参考与复核:ref/lbmpy/src/lbmpy/moment_transforms/ 的 background_distribution 变换与 forcemodels.py::Guo 支持背景矩、松弛和源项推导;ref/FluidX3D/src/kernel.cpp 的 paired EsoPull load/store 支持布局映射。边界阶段以本项目双缓冲 ghost scheme 和 load_physical_dir_pre_streaming 契约为准,不照搬其他库的入口模型。初始化使用同一标准二次平衡分布。两位非作者独立核对了代数/映射;没有新增生产模块、注册器或通用框架。

最终源码的经典长跑(仅GPU0/1):

案例 步数 原门槛结果
Kan99b K2,MRT、regularized/uniform/free-slip,双缓冲 280000 五项全过
相同 K2,EsoPull 280000 五项全过,修复前五项全败
Sah04 S2,MRT、channel_stabilized/parabolic,双缓冲 120000 St=.356690202,误差1.53436%,通过5%门槛
Poiseuille,3碰撞×2布局×3网格,shifted FP32 18组合 18/18通过;保留修复前16/18结果

K2 最终指标(不改升力符号、不放宽阈值):

指标 双缓冲 EsoPull
St 0.169640991 0.169640966
mean_cl -2.57953058 -2.57953222
mean_cd 1.146032 1.14603163
amp_cl 0.355069886 0.355078089
amp_cd 0.0989277137 0.0989264594

Sah04 另用无目标加权的全局 FFT 主峰复算,St完全一致;St归一化沿用原spec的标称 Umax=.1,同时单独报告实际 Re。K2 两布局长期统计接近,但由于原子归约和诊断阶段,不声称所有时序/宏观字段逐位一致。

后续原始结果已合入 classic-results.json::d2_followup;长跑受力/升力时序合入 classic-signals.npz 的 repaired_* 项。原始失败数据仍保留。没有遍历所有入口/出口模式,未验证 FP16 长期稳定性、全部LES组合或高Re极限,也没有新增性能基准。修复后相对原HEAD生产/元数据为+1008/−685、净+323行(剔除用户原有生成头改动);比此前净增约384行减少约61行。测试和证据文件不计入生产行数。

最终整体验证:130 unit passed、13 subtests passed;74 GPU integration/sensor passed,无 xfail/skip。日志为已更新的 final-unit.log(33.12s)和 final-gpu.log(242.15s,物理GPU0)。root重新验证当前生产源码哈希与记录一致、git diff --check通过、原有四个配置头与实验notebook哈希未变。临时经典报告、重复CSV与整场快照已清除,仅保留上述合并结果和必要时序;没有提交或推送。

2026-10-12 小步修复:x 周期 Poiseuille checkpoint

依据用户指定的 TRON 独立审查 中 checkpoint 覆盖缺口;此轮仅修复该问题,不推进 Jet/AMR。起点是10月10日修复后的脏工作树,不是HEAD;本次增量见 checkpoint-domain-2026-10-12.diff。生产仅改 src/CelerisLab/common/checkpoint.py(+42/−8,净+34行),补充两份既有状态测试(unit +116/−2,GPU +39/−1)。其余既有src/tests/research文件在整理本节前逐文件哈希未变。未改DynamisLab、安装依赖、提交或推送。

复现:新增默认/周期域×有/无对象4个CPU用例,旧实现默认2项通过、周期2项因flags与默认channel不符而拒绝。保存读实际GPU flags;几何计算/加载却重建默认入口出口,是根因。参考 ref/lbmpy/src/lbmpy/scenarios.py::create_channel 区分force-driven x周期与velocity-driven入口;本项目 merge_flag_masks 与curved donor的domain_flags约定要求几何投影使用真实域。

修复:checkpoint升为v3,保存独立 domain_flag。从实际GPU flags去除注册对象overlay,固体覆盖下不可辨识的底域规范为FLUID;重叠加当前对象必须严格等于实际flags,且compact ownership有效,校验完成后才打开目标文件。加载以所存域重建geometry/projection,仍严格比较对象类型、角色、mask/hash及完整flags,另校验domain_flag形状/类型和规范化往返;全部在host/device恢复写入前完成。独立agent只读复核接受。

兼容范围:v3提供固定几何恢复,不是通用base-domain所有权系统。load之后再调用initialize(重新初始化)或sync_bodies,仍可能重建默认域;本补丁不承诺这类后续操作保留周期域。旧v1/v2仍限default-channel并按原规则严格验证,不猜测旧周期文件缺失的base-domain。隐藏underlay规范为FLUID仅是固定几何restart约定,不代表恢复或猜测被遮住的真实墙面。

验证:现有pycuda_3_10环境,固定 PYTHONPATH=/home/frank14f/CelerisLab/src、PYTHONDONTWRITEBYTECODE=1、PYTEST_DISABLE_PLUGIN_AUTOLOAD=1。单元测试 tests/unit/test_state_regressions.py 43 passed / 0.87s。实际GPU测试前两次查询GPU0/1:均0%利用率、5MiB显存、无计算进程;仅使用物理GPU0。tests/integration/test_state_gpu.py -k checkpoint 10 passed、8 deselected / 33.41s。新GPU案例D2Q9 MRT、FP32 shifted、16×18、nu=.1、Umax=.03(周期Poiseuille Re=4.8、Ma约.052),只推进3+4步:同实例/新实例恢复后,默认和周期域在两布局下与未中断续跑逐值相同。保留几何不匹配前写入拒绝、controls及obs恢复回归。CPU另覆盖旧版本、异常domain元数据、额外对象标记、无OBSTACLE的自定义SOLID掩码,以及保存失败不覆盖旧文件。没有重复经典长跑或宣称重新验证整个工程。

复现命令(仓库根目录;GPU命令前须重新确认设备空闲):

env PYTHONPATH=/home/frank14f/CelerisLab/src PYTHONDONTWRITEBYTECODE=1 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 /home/frank14f/anaconda3/envs/pycuda_3_10/bin/python -m pytest tests/unit/test_state_regressions.py -q -p no:cacheprovider
env CUDA_VISIBLE_DEVICES=0 PYTHONPATH=/home/frank14f/CelerisLab/src PYTHONDONTWRITEBYTECODE=1 PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 /home/frank14f/anaconda3/envs/pycuda_3_10/bin/python -m pytest tests/integration/test_state_gpu.py -k checkpoint -q -p no:cacheprovider

本轮验收后停在checkpoint修复,最小平壁Jet留待下一步讨论。