❓ 需求分析

首先展示下我的问题,以便分析本篇博客中的哪些步骤适用于你的需要。

  • 已知条件:有某地区管网的.inp文件,并且有该地区水源节点历史两个月的余氯时间序列数据。
  • 求解结果:得到该管网结构中所有节点在历史两个月中的余氯值,更准确的结果如下表展示所示:
Time节点 01节点 02……节点 m
时刻 012.564.28……2.56
时刻 023.564.56……2.56
…………………………
时刻 n3.443.89……2.56

🫡 基础知识

什么是WNTR?

简单来说:WNTR(Water Network Tool for Resilience)是由美国国家标准与技术研究院(NIST)开发的一套用于分析水分配系统的开源工具,用于模拟和评估给水管网系统的性能和恢复力。主要作用包括:模拟水分配系统、恢复力分析、情景分析,以及优化调度等。简单来说,WNTR就是基于Python的高级版EPANET。

EPANET中的Patterns是干什么的?

在EPANET中,"Patterns"(模式)是用来表示随时间变化的水需求、压力或其他参数的变化模式。模式是一个数组或一系列因子,这些因子用于调整基础需求或其他输入参数,以模拟系统在不同时间段的行为。

应用场景

  • 水需求模式:模式通常用于表示水需求的日变化。例如,居民区的用水需求在早晨和傍晚会有高峰,而在夜间会较低。通过设置不同时间段的需求因子,可以精确模拟真实的用水情况。
  • 泵操作模式:模式还可以用于控制泵的操作。例如,可以设置泵在特定时间段的运行速度或开启/关闭状态,以模拟不同的运行策略。
  • 压力调节模式:在某些情况下,模式也可以用于调节系统中的压力,模拟压力管理策略。

举个例子:假设有一个居民区的用水模式,表示一天24小时内的需求变化:

时间步长(小时): 1
模式因子:
  [0.5, 0.6, 0.7, 0.8, 1.0, 1.2, 1.5, 1.8, 2.0, 1.8, 1.6, 1.4,
   1.2, 1.0, 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.3, 0.4, 0.5]

在这个模式中,0点到1点的需求因子是0.5,表示这段时间的需求是基础需求的50%。早晨6点到9点的需求因子是1.2到2.0,表示用水需求较高,为基础需求的120%到200%。

🕹️ 具体步骤

简要介绍

在开始细致讲解前,先对整体的操作步骤进行一个大致总结,以便各位观众按需研究:

  1. 以文本形式打开.inp文件,将管网水源节点的余氯时间序列添加为一个Pattern;
  2. 在EPANET中打开这个.inp文件,将该Pattern与水源节点相关联,并进行相关设置;
  3. 使用WNTR完成水力模拟并保存所有节点的水质数据。

管网数据文件格式的调整

.inp文件中,可以将管网数据以文本的形式进行编辑,非常方便。那么第一步需要进行的操作就是:如果你的管网文件是.net格式,需要将其调整为.inp格式。

这里有个注意点,将.net文件另存为.inp文件不能直接使用 FileSave As... 命令来操作,否则生成的文件会显示打开错误:

正确的操作步骤为:FileExportNetwork,这样导出的.inp文件才是完整并且可直接进行文本编辑的。

将时间序列设置为Pattern

完成上面的.inp文件格式转换后,就可以直接使用文本编辑工具(Notepad、VS Code等)打开并进行编辑了。

在文件中直接搜索[PATTERNS],定位到Pattern的存储位置,会有如下的字样:

[PATTERNS]
;ID                  Multipliers
;
 1                   0.781           0.752           0.738           0.706           0.704           0.73 

然后即可在后面进行Pattern的添加,例如:

[PATTERNS]
;ID                  Multipliers
;
 1                   0.781           0.752           0.738           0.706           0.704           0.73 
 ;
 demo               1               0.986378898     0.974703668     0.976000916     0.980541283     0.97340642

上面添加的Pattern名为demo,可以使用EPANET打开该文件进行查看:

这里有个小问题,如果我的水源节点历史时间序列长度为2个月(60天)、每5分钟一个数据,那么一共会有60*24*(60/5)=17280条数据,也就是说我设置的Pattern长度也必须为17280。同时,还需要进行对应的时间设置:

另外还需要将水源节点的余氯值与这个Pattern相关联:

关于节点的两个属性:

  • Initial Quality代表了水力模型起始运行那一刻的水质;
  • Source Quality代表了水力模拟过程中,水源水质的变化情况。

为什么要在EPANET中进行这些设置呢?就是因为我是用WNTR倒腾了几周还是会有各种各样的问题,一直没有解决,然后才采用了这种方法。在EPANET中设置的属性是会保存在.inp文件中的,但水力模拟的结果或者过程信息却是不会保存在文件中的。

在WNTR中进行水力模拟

其实,按照上面的步骤进行操作后,我们已经可以在EPANET中进行水力模拟,得到想要的结果了。

但是问题就在于:在 ReportTable 的导出选项中,每次仅可以选择一个节点或者管道的属性进行导出:

这如果一个网络拓扑结果中有成千上万个节点,那我得导出到猴年马月呢~😟

因此,在这里我们借助于WNTR进行水力模拟,其可以得到Numpy数据格式的文件,非常方便进行数据分析与处理。

使用WNTR进行水力模拟就非常简单了,直接上代码:

# 导入WNTR包
import wntr

# 加载EPANET模型
inp_file = r"C:\Users\myxc\Desktop\Anytown-2.inp"
wn = wntr.network.WaterNetworkModel(inp_file)

# 运行水力模拟(使用EPANET内核)
sim = wntr.sim.EpanetSimulator(wn)
results = sim.run_sim()

# 获取所有节点的余氯数据
cl_concentration = results.node['quality'] * 1000
cl_concentration

请注意:在WNTR中设置Pattern或者水源节点的一些具体属性会非常麻烦,但是应该也是可以进行的。本文作者折腾了很长时间,还是不能完美实现自己的需求。因此,才采用了在EPANET中进行属性设置、在WNTR中进行水力模拟的方法。

其中,cl_concentration返回结果便是管网中所有节点在任意时刻的余氯监测值(模拟):

但是目前还有个疑问我没有搞明白:可以看到我上面对返回的数据矩阵进行了 * 1000操作,WNTR返回的数据单位需要 * 1000才与EPANET的相等。😕暂时还没找到原因~