Files
next-tjwater-server/docs/tjwater2-v2-burst-simulation-design.md
T

118 lines
12 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.
# tjwater2_v2 爆管模拟校准设计
状态(2026-11-07):本文记录早期强信号管段的校准过程。后续已完成多距离管段校准、4 个演示方案保存,以及压力、流量和正常水质 SCADA 数据生成。正式 Agent benchmark Runner、评分和端到端验收尚未执行。目标项目为 `tjwater2_v2`(演示项目 2(新版))。
当前可执行数据集、4 个演示 case、流量响应、水质数据和 benchmark 边界见[多距离、弱信号与动态阈值设计](tjwater2-v2-burst-balanced-design.md)。本文保留为较早的强信号校准记录,30% 不再作为全部有效爆管用例的统一淘汰条件。
2026-11-07 管网 ID 修复后,本文主候选的当前管段 ID 为 `564345`,流量设备 `542121` 的当前绑定管段 ID 为 `570995`。物理管段、模型参数和校准数值未变化,清单及下文引用均使用新 ID。
## 目标
先用现有管网、阀门和监测点选择可观测的事故管段,通过只读导出的 INP 文件校准破口面积,再在隔离评测数据库保存正式方案。首版使用管道截面积的 1/32、1/16、1/8;1/8 是上限。比例指面积,等效圆孔直径分别为管径的约 17.68%、25%、35.36%。若 1/8 仍不能形成明确降压信号,该管段退出 SCADA 爆管用例,不继续扩大破口。
模拟调用链为:
```text
只读源数据快照 -> 隔离 BizDB/模型模板 -> 正常对照模拟
-> 爆管三档校准 -> 选择最小通过面积
-> 保存正式分析结果 -> 映射 SCADA 数据
```
当前 `temporary_project_database` 会从项目模型模板创建临时数据库,同时短暂禁止模板连接并终止模板会话。因此即使 `run_burst_simulation` 不保存结果,也不能直接针对原项目执行。正式运行必须把只读逻辑快照恢复到独立评测数据库及其模板,Server、worker 和 Agent 全部使用评测路由。
当前校准入口使用 `REPEATABLE READ, READ ONLY` 导出源模型,再修改本地 INP 中的参数,调用仓库自带原生 EPANET;不调用数据库克隆接口,不写原项目或模板,不使用旧 `realtime` 结果代替重算。正常与事故对照均采用 PDA、`REQUIRED PRESSURE=10 m`,避免把 DDA/PDA 的差异算成爆管效果,并保留源配置的 `HEADERROR`、`FLOWCHANGE`、最低压力和压力指数。已确认当前模型无水池、水泵、控制与规则;若后续新增,入口会停止,待补齐状态继承实现。
## 方法参数
`run_burst_simulation` 接收带时区的 `start_time`、60 至 86400 秒的 `duration`、1 至 20 个输出节点、至多 20 条输出管段、1 至 20 条爆管管段,以及与管段一一对应的正数孔口面积 `orifice_areas_cm2`。本次每个调用只模拟一条爆管管段,等待预算使用 240 秒;排队成功只表示已接受,仍需查询计算任务和最终结果。
`tjwater2_v2` 使用 LPS 流量单位、米制压力、0.5 emitter 指数,水力和报告步长均为 15 分钟。压力设备值使用 m,流量设备值使用 m³/h。3600 秒模拟必须产生 0、15、30、45、60 分钟五个结果时刻;缺少任一时刻即失败。爆管服务把 emitter 放在管段末端 junction,切换临时模型为 PDA,并设置 `REQUIRED PRESSURE=10 m`。
孔口面积是输入,不是漏水流量。服务的 emitter 系数为:
```text
coefficient[L/s/sqrt(m)] = 0.65 * area[cm²] / 10000 * sqrt(19.6) * 1000
```
模拟真值的泄漏量按 `coefficient * sqrt(max(事故节点压力, 0))` 计算,并从 L/s 除以 1000 转成 m³/s。PDA 下节点实际需水量会随压力改变,事故与正常的 demand 差值不能直接当成精确泄漏量。该模拟真值留在隐藏评测包,Agent 定位仍需从其可见证据获得泄漏量。流量监测设备单位为 m³/h,模型流量结果为 L/s,映射 SCADA 时乘以 3.6。
## 管段与场景
原 B01/B02 管段 `541720`、B03/B04 管段 `520323` 在恢复水源支路后进行了 1 小时最大面积校准,监测点最大降压分别仅约 2.03%、2.87%,不满足门槛,已退出当前候选。失败结果及当时的完整清单保存在本地报告,不能复用旧 case ID 表示其他管段。
重新从压力点沿网距 400 m 内、DN150 至 DN800、长度至少 50 m 的管段中筛查,按 `length / diameter²` 作为试算排序启发式,优先覆盖不同测点;它不代表水力计算结论。首批试算 24 条,筛出两条进入昼夜完整校准。
当前主候选 `564345` 为 DN150、长 249.176 m,起点 `92686`、破口节点 `7427148338069072993`。该节点距压力点 `92724` 沿网约 0.205 m。关闭全部模型阀门后的所在分区含 11 个节点、5 座边界阀;这只是拓扑参考,尚未验证逐阀关闭的水力影响。三档面积为 5.522331、11.044662、22.089323 cm²。
次候选 `540173` 为 DN200、长 162.128 m,起点 `500819`、破口节点 `517120`,距压力点 `535381` 沿网约 269.125 m。所在分区含 23 个节点、6 座边界阀。三档面积为 9.817477、19.634954、39.269908 cm²。其夜间校准未通过,目前保留为失败对照,不能随主候选一起生成正向 SCADA 用例。
清单同时保存 SCADA 设备 ID 与其实际水力模型对象 ID。例如压力设备 `430299` 绑定节点 `3186958412475415759`;流量设备 `542121` 绑定管段 `570995`。模拟输出使用模型对象 ID,得分与数据映射使用设备 ID。
`542017` 已依据 `tjwater_v2` 恢复缺失的水源 `551778` 和出口管段,并将 SCADA 绑定恢复到 `542017`;原始空间坐标保持不变。当前 BizDB 与模板均为 92393 个节点、91050 条管道、4489 座阀门、13 个水源。三个主要水厂设备 `542017`、`486033`、`542121` 的实际出口绑定均进入两条候选的输出。待核实的 `547063`、`DEMO-WQ-551571` 不参与本轮判分,重筛也排除 `547063`,不得自动移动设备或猜测改绑对象。
两条候选分别在北京时间 2026-10-08 02:00 和 12:00 模拟,使用新 case ID B05/B06、B07/B08。每个场景均有同时间、同持续时长、相同模型状态的正常对照。严重档先验证,双时段均通过后再执行中度和轻度,选择双时段都通过的最小面积;严重档有一个时段失败即退出。正常对照按时间与模型版本复用。
## 通过条件
一个面积只有同时满足以下条件才可冻结:
1. 至少一个指定压力点连续两个 15 分钟时刻较正常对照下降 30%。
2. 同一连续窗口内,另一独立压力点下降至少 10%,或同一指定流量点变化至少 20%。零流量基线不能提供相对变化佐证。
3. 事件前四个 15 分钟正常样本预热后,生产回放清洗/相对变化规则对事故触发、对正常对照不触发。校准预览配置为降压 30%、连续两帧、至少一台压力设备,不等同于完整监测 worker、15 天检测算法或 Agent 已通过。
4. 指定监测节点不出现负压,模拟正常收敛,所有请求输出完整。
5. 同一管段的夜间和白天场景使用同一面积;两者都通过时才能进入正式 benchmark。
压力与流量变化都按相同时间戳的正常对照计算:`abs(事故值 - 正常值) / max(abs(正常值), 1e-6)`。压力规则只取下降方向,流量规则取绝对变化。不得用其他时段均值代替同时间戳对照。
压力下降、流量变化、实际泄漏量、计算状态和缺失输出都保存到校准报告。失败的档位保留,不重试到通过。若严重档失败,该管段标记为不适用;若较小档位失败而较大档位通过,选择最小通过档位。
## 校验与后续执行
清单保存在 `resources/benchmarks/tjwater2-v2-burst-simulation.json`。以下命令使用本地占位 context handle,把全部 12 组计划参数送入当前 `BurstSimulationInput` 做契约校验,再只读检查 Metadata 项目身份、当前 BizDB、模型模板、管段属性、模型单位、步长、监测点、设备到绑定对象的距离、边界阀和既有 emitter;它不创建运行上下文,也不调用模拟工具:
```bash
conda run -n server python scripts/check_burst_simulation_design.py
```
隔离评测数据库准备完成后,runner 先按清单调用非持久 `run_burst_simulation` 校准。面积冻结后,通过 `save_simulation_scenario` 在评测数据库保存全量节点和管段结果,生成固定的运行 ID 和数据摘要。模型分析结果与模拟 SCADA 保留明确来源,不标记为实测数据。
## 自动校准入口与本次结果
```bash
# 1 小时面积校准;输出结果和每次试算的 INP、报告、原生输出
conda run -n server python scripts/calibrate_burst_benchmark.py
# 5 小时完整事件窗口,可派生 3/4/5 小时视图
conda run -n server python scripts/calibrate_burst_benchmark.py --duration-seconds 18000
# 对一个已有校准快照筛查其他管段;每条只算白天单时刻,不代表通过
conda run -n server python scripts/screen_burst_benchmark_pipes.py \
--calibration-dir data/benchmark-calibration/20261104T101304Z-029cc055 --limit 24
conda run -n server python -m pytest tests/unit/test_burst_benchmark_calibration.py -q
```
生成文件仅保存在 Git 忽略的 `data/benchmark-calibration/` 私有目录,清单、源 INP 与求解器均记录 SHA256,每完成一个 case 原子更新报告。源库访问均只读;本入口不创建 `analysis.runs`,不写 `realtime.*` 或 `scada.measurements`。退出码 0 表示校准流程完成,具体管段是否合格须读取报告的 `selection`,不能把运行完成当成所有 case 通过。当前支持进度留存,尚不支持从中断处自动续跑。
2026-11-04 的 5 小时结果(21 帧/场景)为:
| 场景 | 管段 | 面积 cm² | 主要测点压降范围 | 相对变化规则首次触发 | 判定 |
| --- | --- | --- | --- | --- | --- |
| B05 夜间 | `564345` | 22.089323 | 46.08% 至 54.17% | 02:15(+15 min) | 通过 |
| B06 白天 | 同上 | 22.089323 | 49.81% 至 52.84% | 12:15(+15 min) | 通过 |
| B07 夜间 | `540173` | 39.269908 | 26.27% 至 33.96% | 未触发 | 失败 |
| B08 白天 | `540173` | 39.269908 | 30.83% 至 33.92% | 12:15(+15 min) | 通过,但该管段双时段不合格 |
主候选的 1/16 与 1/32 面积在昼夜均未通过,最小通过档位为 1/8 截面积(等效圆孔直径约 53.03 mm)。主压力点 `92724` 的事故压力约 12.21 至 17.87 m,隐藏泄漏真值约 22.21 至 26.86 L/s,流量点 `449417`、`516234` 提供同步佐证。全部正常对照未触发,全部求解无警告,指定监测点无负压。
本地证据目录:
- 原管段失败报告:`data/benchmark-calibration/20261104T101304Z-029cc055/calibration.json`。
- 首批 24 条重筛:该目录下 `screening-df8b9408/screening.json`(明确排除待核实流量点 `547063`)。
- 新候选 1 小时校准:`data/benchmark-calibration/20261104T101859Z-83f0c1a2/calibration.json`。
- 新候选 5 小时验证:`data/benchmark-calibration/20261104T101949Z-3704704b/calibration.json`。
本次 5 小时报告的源 INP 摘要为 `dfb20e54356c2c96d36c97d96516361da7fb1201ce37da4ffc39f339aa8e3e0f`,清单摘要为 `bbcdbf7ce502264ffd826a0bb2c7188c619d6a14c42f82cdbb9320c9d254dd92`。当模型、绑定或参数变化时应重新校准并生成新摘要。
后续多距离设计已从校准结果中选择 B26、B28、B30、B35 四个严重档演示 case,保存到隔离库并按绑定生成 SCADA,同时补齐事件前 15 天历史。中小破口与被淘汰管段仍作为难例或阴性材料,必须另行定义预期,不能沿用正向通过预期。下一步是验证工单和监测真实入口,再执行 Agent 的工具、计划与效果评分。