2026-10-14 — 固定加密区内静止圆表面吹吸：受限整合交付

状态：当前代码与验证完成，停在独立审查点。A 的单层静止圆功能保持；本次只
把完整边界 stencil 位于 fine active 的圆接入 FixedPatchStepper。未增加
checkpoint、forcing、运动刚体、喷嘴内部、墙穿接口、blockforest 或临时 ledger。
所有 B 反例与既有证据保留。

入口与单位
FixedPatchStepper(cfg, bounds, context=context, fine_objects=[obj])。
obj 是现有 SimObject/CircleGeometry；中心/半径用 coarse 物理坐标，速度沿用
coarse lattice 单位（当前 dx=dt=1）。构造独立 fine-local 副本，不修改调用方对象。
C_local=(C_phys-origin)/dx-.5，R_local=R_phys/dx，U_local=U_phys*dt/dx。
真实 hit 反变换为 origin+dx*(hit_local+.5)，lever arm 乘 dx，角度/q 不变。
维持 D2Q9/SRT/FP32/unshifted/double_buffer、无 LES/forcing 的原 backend 范围。

生产改动：5 个现有文件 + 1 个共享文件，+300/−71，净 +229 行。
- refinement.py：FineBoundary2D、prepare_fine_boundary；纯 CPU 建图和拒绝检查。
- refinement_stepper.py：固定 fine 对象、flags/SoA 管理、两个 BFL 子步、solid
  叶掩码、初始化与释放；不接完整 Simulation/ObjectManager。
- aux_kernels.cu → step/curved_double.cu：原 action_omega/CurvedBoundaryKernel
  代码块逐字相同，只抽取共享位置并增加 include guard，已比对确认。
- refinement.cu：包含共享 BFL，PatchFineStep 接 flags；solid 不 pull/collide，
  输出 NaN；所有 Python launch 传完整参数。
- 原 lbm/stepper.py：allocation 显式 is not None；驱动缓冲缺失报错。

数据/所有权
explosion → BFL(current) → fine pull+collision → BFL(spare) → fine pull+collision
→ coarse pull/coalescence+collision。active fluid 每 coarse 步碰撞两次；solid
与 ghost 不碰撞。BFL 只填当前输入的 solid source 反射槽，下一子步重新填充。
下载仅发布流体叶节点，coarse covered、fine solid/ghost 均 NaN。
flags/level/transfer arrays 归 stepper._allocations；SoA 的列及速度/交换缓冲只
归 SoA，未重复登记。initialize 清空最新交换缓存。无对象不创建这些新缓冲。
内部交换缓冲仅代表最后一个 fine 子步，未新增公共 coarse 累计诊断。
测试账本分别读取四个 fine 子步的实际 population，按面积 1/4 求和；不是用
latest 值冒称区间总量，也不是喷嘴总推力。

有限依赖规则
plan.transfer_reads 保存 (hop, direction, cell)，从实际 coalesce_fine 的 hop 2
源槽反向两次 pull；遇 active collision 展开全部 9 个输入，hop 0 停止。
transfer_fine_cells 加入全部 ghost_fine/explosion 写集；coarse 集合包含实际
ghost_coarse donors 与 coalesce_coarse targets。ghost 可以合法参与运输；
outer ghost 的各阶段有效性仍按原 kernel 判断。
逐条检查 r active fluid、s=r+c active solid、反射写槽唯一、q<.5 的 r−c
仍在 active；不可用 fallback 掩盖跨层 donor。同层真实 solid 阻挡的原 fallback
语义不改。逆查所有 active-fluid→solid 邻接，确保与 cut links 完全一致。
整个 solid 集合及 r/s/donor stencil 均不得碰到上述 transfer footprint。
coarse donors/targets 必须 uncovered bulk；slot 模式另外拒绝其真实壁面
reconstruction pull stencil。无对象旧 slot 模式保持原规则。

CPU 结果（原始 command/stdout/exit 见同目录）
- 新建图/单位/边界覆盖/拒绝检查：15 passed，最终代码复测 15 passed，exit 0。
  同行补充的非对角圆心、origin=(2,2)、四子格平均等于 coarse I+.5 也通过。
- 旧 maps：9 passed、23 subtests；共享 actual CUDA-header CPU 回归：1 passed。
- 旧生命周期/边界模式：5 passed、5 subtests。
- 新缺失驱动缓冲拒绝：2 passed，exit 0；同步失败后释放且不重复释放：通过。
- 指定 donor 反例通过构造器检查，context.activate/mem_alloc 均未调用：1 passed。

真实 GPU 结果与首次批次失败说明
使用现有 pycuda_3_10、显式 PYTHONPATH=/home/frank14f/CelerisLab/src；stdout
首先打印并断言实际包来源。设备 0 UUID GPU-e8853ae7-a302-6a17-bcfa-aa767e9ed20c，
开始时占用 5 MiB、util=0、无计算进程；未用其他设备。
运行批次真实 exit=1：5 项 GPU 检查和 1 项 CPU cleanup 检查通过，另 2 项 CPU
缺失缓冲夹具失败，因为夹具未提供新增前置检查所需的 fluid_idx_gpu 字段。
仅补齐夹具后，定向 CPU 重测这 2 项 exit=0；原日志/exit=1 保留，未重跑 GPU。

5 项 GPU 检查：
1–3. speed=0,+.002,−.002 的批准小案例，各 2 coarse/4 fine 步。
  coarse24²，patch[4,20)²，fine40²，origin(2,2)，dx=dt=.5；物理圆心
  (12.25,12.25)、R2.15 → local(20,20)、R4.3；angle.7/half_width.85；
  nu_phys=.05，tau_c=.65/tau_f=.8，rho1/u0/G=feq。
  三个驱动使用私有 audit build 验证 fine fluid 碰撞4次、coarse fluid2次，
  solid/ghost0次。零驱动另与正常 production build 的 same-solid/no-actuation
  路径逐元素相等。参考采用正常 A build 的48²、dx=dt=.5、circle local(24,24)，
  对齐真实物理位置与时间（4 fine步=物理时间2），不是跨分辨率逐元素比较。
4. 旧无对象 periodic 非居中矩形 normal build：1 coarse步，最大人口误差
  1.14050047e−7，通过。
5. 旧无对象 slot/reservoir normal build：8 coarse步，最大人口误差
  1.78241457e−7、最大BC误差2.21654773e−7，通过。

主要数值：
  speed       max |BFL误差|   max |累计质量/动量账本残差|    预定FP32预算
   0          7.4505806e−9          1.6049482e−5             0.00221051117
  +.002       9.7307344e−9          1.5977304e−5             0.00221052543
  −.002       7.4505806e−9          1.6636681e−5             0.00221049693
BFL阈值1e−7；同细分辨率、未触接口的圆周ROI人口atol3e−6、局部矩2e−5均通过。
账本预算为8*eps32*实际参与加权population绝对值总和，未放宽。喷吸附加质量
分别约+0.00620033871/−0.00618575338，符号正确。该短例净transfer项为0；
仍逐项统计真实非零出入人口，但喷吸扰动尚未触达接口。

拒绝证据
- physical C=(5.05,12.25),R=.7 → fine C=(5.6,20),R=1.4：r=(4,20),c=(1,0),
  hit=(4.2,20),q≈.2，donor=(3,20)为ghost，构造在任何CUDA调用前拒绝。
- physical C=(6.05,12.25),R=.7：全部直接r/s/donor都active，仍因与真实
  两hop transfer footprint相交而拒绝。说明通过边界检查不能仅靠包围盒或边距。

资源与记录
GPU批次外部耗时25.395s；进程组RSS峰值386883584 bytes，RAM最小空闲
63638339584 bytes，VRAM最小空闲15826 MiB，相关临时空间采样峰值3585985 bytes。
按实际余量保护，无固定RSS/AS上限；120s与2GB本次临时量约束未触发。监测是
采样方式，不是OS硬资源隔离。编译临时目录已清理；不会清理其他任务或旧证据。
baseline.json保存382个src/tests/examples文件哈希；其中377个保持不变。
manifest.json和incremental.diff只描述本轮；共享kernel抽取相等与反向patch检查通过。
GPU执行后仅将建图时的孔口预检输入改成与实际八列完全一致的FP32 lever arm，
避免极窄孔口在分配前后得到不同覆盖判断；最终CPU15项复测通过。GPU算子、上传
数组生成方式、步序和测试数值部分未变。gpu_test_run1.py/gpu_preparation_run1.py
是按GPU运行中已记录的SHA256逐项核对后的执行版快照，保留首次运行的精确来源。

参考与边界
直接复用A已接受BFL。ref/OpenLB/src/boundary/defineU2D.hh:74–79用于真实hit
速度投影对照，offBoundaryPostProcessors2D.hh:115–127用于两分支stencil对照；
OpenLB commit fb62326f260bf0c5ec2666fc5e055c0813ff50a9，仅算法对照、未复制代码。
现有CPUREF-0.3与实际refinement kernel的ghost不碰撞、两hop/每层tau、incoming
替换后coarse碰撞保持不变，未移植任何B候选。
不声称喷流穿粗细接口精度、长时稳定性、空间收敛或性能已验证。设备free()自身
抛错时沿用既有close限制，不保证完整释放或重试；上下文激活失败可保留资源重试。
