wntr从零开始学习 day3


前言

wntr包含了两个模拟器,包括EpanetSimulation和WNTRSimulation,以下是两个不同模拟器的介绍

一、EpanetSimulator

EpanetSimulator可以用来运行EPANET 2.00.12程序员工具包或EPANET 2.2.0程序员工具包。系统默认使用EPANET 2.2.0,并进行需求驱动和压力相关的水力分析。EPANET 2.00.12只进行需求驱动的水力分析。这两个版本还可以运行水质模拟。

通过设置wn.options.hydraulic.demand_model选项,用户可以在压力驱动型(PDD)或需求驱动型(DD)液压模拟之间进行切换。

在需求驱动(DD)的的仿真中,系统中的压力取决于节点的需求。在已知并满足节点需求的情况下,求解上述质量平衡和头部损失方程。这一假设在正常运行条件下是合理的,也适用于网络设计。这两种模拟器都可以使用需求驱动模拟来运行液压。

在导致低压条件的情况下(例如,消防、停电、管道泄漏),用户并不总是收到他们所要求的需求,因此建议采用压力驱动模型模拟。在压力驱动的模拟中,交付的需求取决于压力。上述的质量平衡和水头损失方程是通过同时确定需求和网络压力和流量来求解的。根据以下压力-需求关系,这两个模拟器都可以使用压力相关的需求模拟来运行液压。

有关压力驱动模型和需求驱动模型的关系,推荐阅读论文(基于压力驱动的管网漏损模型–同济大学 张俊),学术界认为在研究管网漏损方面压力驱动比需求驱动更加真实,模型更加优秀。
在这里插入图片描述

>>> import wntr 

>>> wn = wntr.network.WaterNetworkModel('networks/Net3.inp') 
>>> wn.options.hydraulic.demand_model = 'DD'
>>> wn.options.hydraulic.demand_model = 'PDD'

进行模拟输出结果,默认使用epanet2.2

>>> sim = wntr.sim.EpanetSimulator(wn)
>>> results = sim.run_sim()

可以转换版本

>>> results1 = sim.run_sim(version=2.0) # runs EPANET 2.00.12
>>> results2 = sim.run_sim(version=2.2) # runs EPANET 2.2.0

二、WNTRSimulator

WNTRSimulator是一款基于与EPANET相同方程的液压仿真引擎。WNTRSimulator不包括运行水质模拟的方程。WNTRSimulator包括模拟泄漏的选项,以及在需求驱动或压力依赖的需求模式下进行水力模拟。

>>> sim = wntr.sim.WNTRSimulator(wn)
>>> results = sim.run_sim()

关于模拟器的更多信息可以在API文档中找到,在EpanetSimulator和WNTRSimulator下,仿真器对液压方程组使用不同的求解器;因此,预期结果会有微小的差异。EpanetSimulator使用Todini的全局梯度算法来求解方程组,而WNTRSimulator使用的是Newton-Raphson算法。

所有模型的质量守恒方程都采用下图的方程:
在这里插入图片描述
WNTR只使用海曾威廉公式计算水头损失

在这里插入图片描述
压力驱动的公式如下:
在这里插入图片描述
我们可以看到,压力驱动和需求驱动的情况如下,当压力不满足节点所需最下压力时,节点的需水量会下降直至为零
在这里插入图片描述

所需的压力和最小压力在液压选项中有定义,并可以像下面的例子中所示的那样重置。

>>> wn.options.hydraulic.required_pressure = 21.097 # 30 psi = 21.097 m
>>> wn.options.hydraulic.minimum_pressure  = 3.516 # 5 psi = 3.516 m

所需压力和最小压力在液压选项中有定义,当使用WNTRSimultor时,所需压力和最小压力可以在整个网络中变化。默认情况下,每个节点的所需压力和最小压力设置为None,并使用液压选项中的全局值。如果用户定义了连接上的必需压力或最小压力,则该值将覆盖全局值。下面的示例定义了连接121所需的压力和最小压力。

>>> junction = wn.get_node('121')
>>> junction.required_pressure = 14.065 # 20 psi = 14.065 m
>>> junction.minimum_pressure = 0.352 # 0.5 psi = 0.352 m

三、WNTRSimulator特有的管网泄漏模型

1.模型简介

WNTRSimulator包含使用泄漏模型向网络添加泄漏的功能。因此,WNTRSimulator没有使用在水网络模型选项中定义的发射器(emitter)系数。对使用EpanetSimulator建模泄漏感兴趣的用户仍然可以通过定义发射器系数来实现这一点。

当使用WNTRSimulator时,泄漏模拟采用Crowl和Louvar [CrLo02]提出的方程的一般形式,其中流体通过孔的质量流量表示为:
在这里插入图片描述
默认流量系数为0.75(假设湍流)[Lamb01],但用户可以根据需要指定其他值。α的值被设置为0.5(假设钢管泄漏较大)[Lamb01],目前用户不能更改。

泄漏可以增加到连接处(junctions)和储罐(tanks)。管道破裂模型使用一个足够大的泄漏区域来排空管道。WNTR包含了一些方法,可以将管道分成两个部分并添加一个节点,从而将泄漏添加到管道沿线的任何位置。
在这里插入图片描述
The following example adds a leak to the water network model.

>>> node = wn.get_node('123')
>>> node.add_leak(wn, area=0.05, start_time=2*3600, end_time=12*3600)

2.暂停和重新开始

WNTRSimulator包括以下功能
1.重置初始值并使用相同的水网络模型重新模拟。初始值包括模拟时间、油罐压头、储液罐压头、管道状态、泵状态和阀门状态。(simulation time, tank head, reservoir head, pipe status, pump status, and valve status.)
2.暂停水力模拟,改变网络操作,然后重新启动模拟
3.将水网络模型和结果保存到文件中,并重新加载,以便日后分析

下面的例子进行了10小时的水力模拟,然后再重启模拟14小时。前10小时和后14小时的结果可以合并分析或单独分析。此外,network operations可以在模拟之间修改。

>>> 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()

要从零时重新开始模拟,用户有几个选项。
1.利用现有的水网模型,重置初始条件。初始条件包括模拟时间、油罐压头、储液罐压头、管道状态、泵状态和阀门状态。当在两次模拟之间只有初始条件发生变化时,此选项非常有用。

>>> wn.reset_initial_values()

2.将水网络模型保存到一个文件中,并在每次运行模拟时重新加载该文件。pickle文件通常用于此目的。pickle文件是用于序列化和反序列化Python对象的二进制文件。更多关于pickle文件使用的信息可以在https://docs.python.org/3/library/pickle.html上找到。当水网络模型包含不能使用选项1重置的自定义控件时,或者当用户想在模拟之间改变操作时,这个选项非常有用。
下面的示例在模拟中使用之前将水网络模型保存到一个文件中。

>>> import pickle

>>> f=open('wn.pickle','wb')
>>> pickle.dump(wn,f)
>>> f.close()
>>> sim = wntr.sim.WNTRSimulator(wn)
>>> results = sim.run_sim()

如果这些选项不包括用户特定的需求,那么就需要在模拟之间重新创建水网络模型,或者通过将单个属性更改为所需值来手动重置。注意,当使用EpanetSimulator时,模型每次在模拟中使用时都会被重置。

3.WNTR的建模语言

WNTR有一个定制的代数建模语言(AML),用于WNTR的水力模型(在WNTRSimulator中使用)。这个AML主要用于有效地求约束残差和导数。WNTR的AML大大简化了液压模型的实现、维护、修改和定制。AML允许以一种自然的方式定义变量和约束。例如,假设用户想要解下列非线性方程组。
在这里插入图片描述

>>> from wntr.sim import aml

>>> m = aml.Model()
>>> m.x = aml.Var(1.0)
>>> m.y = aml.Var(1.0)
>>> m.c1 = aml.Constraint(m.y - m.x**2)
>>> m.c2 = aml.Constraint(m.y - m.x - 1)

在计算约束残差或雅可比矩阵之前,必须调用set_structure():

>>> m.set_structure()
>>> m.evaluate_residuals() 
array([ 0., -1.])
>>> m.evaluate_jacobian()  
<2x2 sparse matrix of type '<class 'numpy.float64'>'
     with 4 stored elements in Compressed Sparse Row format>
>>> m.evaluate_jacobian().toarray() 
array([[-2.,  1.],
    [-1.,  1.]])

该部分不是很懂,之后实际建模再进行分析

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值