# 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 的工具、计划与效果评分。