# POC-B 实测结果(gpr_poc headless 度量) 工具:`tools/gpr_poc`(CLI),构建产物 `build/release/tools/gpr_poc/gpr_poc.exe`。 执行机:Windows 11,MSVC(VS18 Community)+ Ninja,Release(/O2)。 日期:2026-06-23。 整条地基链路: `assembleGprSurvey → buildGprVolume → ChunkedVolumeStore::write → buildPyramid → WholeVolumeSource(load)`。 --- ## 1. selftest(合成极小数据)—— PASS 命令:`gpr_poc selftest` - 构造 2 通道合成 survey(samples=8,traces=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-one:lastTrace+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 --levels 2` 再 `gpr_poc load `,本文件 §2 即可补齐真实指标。 --- ## 3. 预估几何(供解法落地后核对,非实测) 基于真实头:samples=821,dx≈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)。