「EPANET+WNTR」管网水质模拟
❓ 需求分析
首先展示下我的问题,以便分析本篇博客中的哪些步骤适用于你的需要。
- 已知条件:有某地区管网的
.inp
文件,并且有该地区水源节点历史两个月的余氯时间序列数据。 - 求解结果:得到该管网结构中所有节点在历史两个月中的余氯值,更准确的结果如下表展示所示:
Time | 节点 01 | 节点 02 | …… | 节点 m |
---|---|---|---|---|
时刻 01 | 2.56 | 4.28 | …… | 2.56 |
时刻 02 | 3.56 | 4.56 | …… | 2.56 |
…… | …… | …… | …… | …… |
时刻 n | 3.44 | 3.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%。
🕹️ 具体步骤
简要介绍
在开始细致讲解前,先对整体的操作步骤进行一个大致总结,以便各位观众按需研究:
- 以文本形式打开
.inp
文件,将管网水源节点的余氯时间序列添加为一个Pattern; - 在EPANET中打开这个
.inp
文件,将该Pattern与水源节点相关联,并进行相关设置; - 使用WNTR完成水力模拟并保存所有节点的水质数据。
管网数据文件格式的调整
在.inp
文件中,可以将管网数据以文本的形式进行编辑,非常方便。那么第一步需要进行的操作就是:如果你的管网文件是.net
格式,需要将其调整为.inp
格式。
这里有个注意点,将.net
文件另存为.inp
文件不能直接使用 File → Save As... 命令来操作,否则生成的文件会显示打开错误:
[photos]
[/photos]
正确的操作步骤为:File → Export → Network,这样导出的.inp
文件才是完整并且可直接进行文本编辑的。
[photos]
[/photos]
将时间序列设置为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中进行水力模拟,得到想要的结果了。
但是问题就在于:在 Report → Table 的导出选项中,每次仅可以选择一个节点或者管道的属性进行导出:
[photos]
[/photos]
这如果一个网络拓扑结果中有成千上万个节点,那我得导出到猴年马月呢~😟
因此,在这里我们借助于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的相等。😕暂时还没找到原因~