116 lines
8.2 KiB
Plaintext
116 lines
8.2 KiB
Plaintext
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限制,不保证完整释放或重试;上下文激活失败可保留资源重试。
|