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

12 KiB
Raw Blame History

tjwater2_v2 爆管模拟校准设计

状态(2026-11-07):本文记录早期强信号管段的校准过程。后续已完成多距离管段校准、4 个演示方案保存,以及压力、流量和正常水质 SCADA 数据生成。正式 Agent benchmark Runner、评分和端到端验收尚未执行。目标项目为 tjwater2_v2(演示项目 2(新版))。

当前可执行数据集、4 个演示 case、流量响应、水质数据和 benchmark 边界见多距离、弱信号与动态阈值设计。本文保留为较早的强信号校准记录,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 爆管用例,不继续扩大破口。

模拟调用链为:

只读源数据快照 -> 隔离 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 系数为:

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;它不创建运行上下文,也不调用模拟工具:

conda run -n server python scripts/check_burst_simulation_design.py

隔离评测数据库准备完成后,runner 先按清单调用非持久 run_burst_simulation 校准。面积冻结后,通过 save_simulation_scenario 在评测数据库保存全量节点和管段结果,生成固定的运行 ID 和数据摘要。模型分析结果与模拟 SCADA 保留明确来源,不标记为实测数据。

自动校准入口与本次结果

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