WNTR的模拟器包含了一个重要功能,可以帮助我们完成在一次模拟中中断改变条件,然后继续模拟。通过这个功能,我们试着在一个月的模拟中,尝试每天换一个用水模式。
1.WNTR文档中内容。
下面的示例运行10个小时的液压模拟,然后重新启动模拟,再运行14个小时。前10小时和后14小时的结果可以合并分析或单独分析。此外,网络操作可以在模拟之间修改。
>>> wn.options.time.duration = 10*3600
>>> sim = wntr.sim.WNTRSimulator(wn)
>>> first_10_hours_results = sim.run_sim()
>>> wn.options.time.duration = 24*3600
>>> sim = wntr.sim.WNTRSimulator(wn)
>>> last_14_hours_results = sim.run_sim()
2.独立代码测试
我们的思路大致是利用模拟中断的功能,每天中断一次,然后改变用水的模式继续模拟,保证每一天都是我们之前生成的乘子,从而实现用水数据的随机波动,满足我们算法的要求。
import wntr
import pandas as pd
import numpy as np
inp_file = 'c:/Users/wen EX/Desktop/WNTR-master/examples/networks/STUDY1.inp'
wn = wntr.network.WaterNetworkModel(inp_file)
#首先调整一下我们的设置参数,主要是pattern_timestep设置成15min,因为我们的传感器是15min的,设置压力驱动,水力计算时间和报告时间步长
wn.options.hydraulic.demand_model = 'PDD'
wn.options.time.hydraulic_timestep = 15*60
wn.options.time.pattern_timestep = 15*60
wn.options.time.report_timestep = 15*60
#调整一下初始的水量,不然有时候乘子太大会导致需水量过高出现负压
for junction_names, junction in wn.junctions():
junction.demand_timeseries_list[0].base_value =junction.demand_timeseries_list[0].base_value*0.5
#创建一个字典,到时候键是天数,值是模拟的结果
result = {}
#传入数据,一共是365天的
data = pd.read_csv('patdata3.csv',index_col=0)
#因为要使用动态变量名,这里使用的是命名空间的方法
names = locals()
for i in range(1,366):
#添加用水模式,命名备用
wn.add_pattern('day'+str(i)+'pat',data.loc[i,:].to_list())
#循环迭代所有的junction,这里的junction.demand_timeseries_list不能直接改,我们添加另一个用水模式然后把原先的模式删除了
for junction_names, junction in wn.junctions():
junction.add_demand(base=junction.demand_timeseries_list[0].base_value, pattern_name='day'+str(i)+'pat')
#删除第一个 保留第二个,第二个的用水模式就是我们创建的乘子
del junction.demand_timeseries_list[0]
#使用wntr的模拟器,可以通过实践不同来断点模拟,我们每天都断点一次
wn.options.time.duration = i * 24 * 3600
sim = wntr.sim.WNTRSimulator(wn)
names['day'+str(i)+'result']=sim.run_sim()
#传入字典
result[i] = names['day'+str(i)+'result']
#我们打印一下看看是不是断点 是不是从第二天开始的
demand = result[2].node['demand']
print(demand.loc[:,'3'])
输出结果:
87300 0.006749
88200 0.006025
89100 0.005985
90000 0.006127
90900 0.005165
...
169200 0.007496
170100 0.007477
171000 0.007554
171900 0.007529
172800 0.007642
Name: 3, Length: 96, dtype: float64
确实需水量数据是从第二天开始,直到第三天零点的,这时候我们已经完成任务。
WNTR包的使用在中文互联网上少之又少,希望我的文章对你有所帮助。