WNTR是基于EPANET2水力水质模拟的一个Python库. 使用WNTR, 我们不必再使用EPANET软件进行模拟, WNTR提供的功能也比原生的EPANET功能要强大许多.
导入
import wntr
加载管网模型
inp_file = "Net3.inp"
wn = wntr.network.WaterNetworkModel(inp_file)
加载inp之后的相关函数
print(wn.junction_name_list) #获得junciton的list
print(wn.node_name_list) # node
print(wn.link_name_list) # link 仅仅获取管网名称 不包含前后节点
画出模型图
wntr.graphics.plot_network(wn, title=wn.name)
水力模拟
sim = wntr.sim.EpanetSimulator(wn)
results = sim.run_sim()
结果显示
results.node['quality'].loc[ : 3*3600]
具体显示
print(epanet_sim_results.node.keys()) # node有什么属性
print(epanet_sim_results.link.keys())
print(epanet_sim_results.node['pressure'].loc[: 3*3600]) # 限定显示水力时间
print(epanet_sim_results.link['flowrate'].loc[: 3*3600])
node后demand pressure quality 可选择节点的属性, loc后加限定时间, 一般3600s为一个间隔
results.node与results.link都是下的属性都是DataFrame属性
转换为图
G = wn.get_graph()
print(G.nodes())
print(G.node)
print(G.edges())
获取首尾节点
for i in wn.link_name_list: # 获取管线的名称
s = wn.links._data[i]._start_node # 获取管线首尾节点
e = wn.links._data[i]._end_node
print(i, s, e)
设置node的初始水质
for i in wn.node_name_list: # 获取node的名称
wn.nodes._data[i]._initial_quality = 0 # 设置初始节点的水质都为0
除去源注入(某些模型可能会有初始的源注入)
for i in wn.source_name_list:
wn.remove_source(i)
设置报告间隔
wn.options.time.report_timestep = 600
其他的如水力模拟时间, 水质模拟时间等都可以在options中设置
源注入的一个例子
import wntr
# Create a water network model
inp_file = "ky8.inp"
wn = wntr.network.WaterNetworkModel(inp_file)
wn.options.quality.mode = 'CHEMICAL' #设定为化学物质
#要跳过水质模拟,请按如下方式设置“质量”选项:
#wn.options.quality.mode = 'NONE'
# 水质模拟
wn.options.time.duration = 12*3600
wn.options.time.report_timestep = 600
source_pattern = wntr.network.elements.Pattern.binary_pattern('SourcePattern',
start_time=3*3600,
end_time=24*3600,
duration=wn.options.time.duration,
step_size=wn.options.time.pattern_timestep)
wn.add_pattern('SourcePattern', source_pattern)
wn.add_source('Source1', 'J-10', 'SETPOINT', 100000, 'SourcePattern') #name, node_name, source_type, quality, pattern=None
epanet_sim = wntr.sim.EpanetSimulator(wn)
epanet_sim_results = epanet_sim.run_sim()
print(epanet_sim_results.node['quality'].loc[:12*3600])