geopro/docs/superpowers/plans/poc-results-B.md

105 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# POC-B 实测结果gpr_poc headless 度量)
工具:`tools/gpr_poc`CLI构建产物 `build/release/tools/gpr_poc/gpr_poc.exe`
执行机Windows 11MSVCVS18 Community+ NinjaRelease/O2
日期2026-06-23。
整条地基链路:
`assembleGprSurvey → buildGprVolume → ChunkedVolumeStore::write → buildPyramid → WholeVolumeSource(load)`
---
## 1. selftest合成极小数据—— PASS
命令:`gpr_poc selftest`
- 构造 2 通道合成 surveysamples=8traces=12写临时 `.iprb/.iprh/.ord`
走完整 `assembleGprSurvey → buildGprVolume → write(brick=4) → buildPyramid(1) → WholeVolumeSource`
- 断言ntraces/samples/channels、channelY 升序、GridSpec `2x2x8`、建体维度、
金字塔层数==2、整卷维度一致、(0,0,0) 非 blank。
- 结果:**PASS**(退出码 0
结论:除真实 `.iprb` 读入外,**整条地基管线在合成数据上端到端跑通**
(装配几何、建体量化、分块压缩落盘、金字塔降采样、整卷重组加载均正确)。
---
## 2. 真实数据D:\Downloads\明星路,线 001—— **BLOCKED前置 IO 层与真实数据契约不符)**
命令:
```
gpr_poc build "D:\Downloads\明星路" --line 001 --cellXY 0.2 --cellZ 0.05 --out %TEMP%\gpr_store_001 --levels 2
```
进度:
- 文件发现 **成功**:定位 14 通道 `明星路_001_A01..A14.iprb` + `明星路_001.ord`
- 装配 **失败**`assembleGprSurvey` → `readIprb`
`文件大小与 samples*traces*2 不符: ..._A01.iprb`
### 根因off-by-onelastTrace+1 vs 真实道数)
`readIprb`(前置 IO 层,`src/io/gpr/IprbReader.cpp:16`)硬编码
`traces = h.lastTrace + 1` 并对文件字节数做**严格相等**校验。
真实明星路每个通道文件恰好含 `lastTrace` 条道(少 1 道),逐通道实测:
| 通道 | 文件字节 | samples | LAST TRACE | 期望(=samples·(lastTrace+1)·2) | 实际道数(=bytes/(samples·2)) |
|------|----------|---------|------------|--------------------------------|------------------------------|
| A01 | 74390810 | 821 | 45305 | 74392452 | 45305 |
| A02 | 74394094 | 821 | 45307 | 74395736 | 45307 |
| A03 | 74390810 | 821 | 45305 | 74392452 | 45305 |
| A04 | 74394094 | 821 | 45307 | 74395736 | 45307 |
| A05 | 74390810 | 821 | 45305 | 74392452 | 45305 |
| A06 | 74394094 | 821 | 45307 | 74395736 | 45307 |
| A07 | 74390810 | 821 | 45305 | 74392452 | 45305 |
| A08 | 74394094 | 821 | 45307 | 74395736 | 45307 |
| A09 | 74390810 | 821 | 45305 | 74392452 | 45305 |
| A10 | 74394094 | 821 | 45307 | 74395736 | 45307 |
| A11 | 74390810 | 821 | 45305 | 74392452 | 45305 |
| A12 | 74392452 | 821 | 45306 | 74394094 | 45306 |
| A13 | 74390810 | 821 | 45305 | 74392452 | 45305 |
| A14 | 74394094 | 821 | 45307 | 74395736 | 45307 |
**规律一致**:所有通道「实际道数 == LAST TRACE」即真实文件道数 = `lastTrace`
`readIprb` 期望 `lastTrace + 1`,每通道恰差 1 道(`samples·2 = 1642` 字节)。
这是**前置 IO 层契约与真实数据约定的系统性不符**,不是 gpr_poc CLI 的问题。
现有单测(`tests/io/gpr/test_iprb_reader.cpp:30-31`)显式锁定
「字节数 != samples·(lastTrace+1)·2 → 抛异常」,故 `lastTrace+1` 是被测试钉死的契约。
### 处置(本任务未擅自改前置/测试)
按任务纪律(外科手术式改动、不动他人已测契约、严禁编造指标),
本会话**未修改** `readIprb` 或其单测,故真实数据的建体/维度/压缩比/加载/峰值内存
**暂无法实测**,如实记录为 BLOCKED。
不是 OOM、不是超时——是装配前的文件读入契约不符调粗 `--cellXY` 也无法绕过
(在到达建体之前就抛了)。
### 建议解法(需 POC/IO 层 owner 决策,任一)
1. **放宽 `readIprb`**:以「文件字节数 / (samples·2)」反推真实道数(容忍 ±N 道),
而非硬用 `lastTrace+1`;同步更新 `test_iprb_reader.cpp`。这与真实数据约定
(道数 = `lastTrace`)一致,最贴近现场。
2. **明确 LAST TRACE 语义**:若约定其为「道数」而非「末道索引」,则 `traces = lastTrace`
(去掉 +1同样需改实现 + 测试。
3. 任一方案落地后,重跑:
`gpr_poc build "D:\Downloads\明星路" --line 001 --cellXY 0.2 --cellZ 0.05 --out <store> --levels 2`
`gpr_poc load <store>`,本文件 §2 即可补齐真实指标。
---
## 3. 预估几何(供解法落地后核对,非实测)
基于真实头samples=821dx≈0.049084 m通道横偏 Y∈[-0.686, 0.686]跨度≈1.372 m
土速 100 m/s、时窗 160.352 ns ⇒ 深度跨度 `depthOfSample(820)≈8.0e-6 m`(量级极小)。
`--cellXY 0.2 --cellZ 0.05`、X 跨度≈`45305·0.049084≈2223 m`
- nx ≈ ceil(2223/0.2)+1 ≈ **11118**
- ny ≈ ceil(1.372/0.2)+1 ≈ **8**
- nz ≈ ceil(8.0e-6/0.05)+1 = **1**Z 物理跨度远小于 cellZ故仅 1 层)
**注意**:因 SOIL VELOCITY 存为 100 m/s头文件单位 m/µs ×1e6 后),深度尺度为微米级,
`--cellZ 0.05`5 cm会把整个深度压成 1 层。落地解法后,若要在 Z 方向有分辨率,
需把 `--cellZ` 调到与深度跨度匹配的量级(约 1e-8 m或复核土速/时窗单位约定。
此项一并提请 POC owner 确认(影响真实体维度与后续渲染基准 9c