wntr从零开始学习 day2


前言

day1已经学习将epanet中导出管网的.inp文件传入wntr并进行分析,本文主要分析wntr的各种方法,力求达到直接在wntr中进行建模

一、增加元素

水网络模型包含了添加连接、水箱、水库、管道、泵、阀门、模式、曲线、水源和控制的方法。当一个元素被添加到模型中时,它也被添加到模型的注册表中。在注册表中,连接点、水源、高位水池(junctions, tanks, and reservoirs)共享一个名称空间(这些元素不能共享名称),管道、泵和阀门共享一个名称空间。

可以理解为,连接点、水源、高位水池都是在模型中表示一个结点,而管道、泵、阀门表示为一个管道。

通过调用wn.add_junction()来对模型添加连接点,可以查看方法的描述来学习当中的参数。

    ### # 
    ### Add elements to the model
    def add_junction(self, name, base_demand=0.0, demand_pattern=None, 
                     elevation=0.0, coordinates=None, demand_category=None):
        """
        Adds a junction to the water network model

        Parameters
        -------------------
        name : string  #连接点名称
            Name of the junction.
        base_demand : float   #需水量 
            Base demand at the junction.
        demand_pattern : string or Pattern   #需水量模式,可以在浏览器中选择一个乘子改变需水量
            Name of the demand pattern or the actual Pattern object
        elevation : float  #连接点高度
            Elevation of the junction.
        coordinates : tuple of floats #坐标
            X-Y coordinates of the node location.
        demand_category  : string   #需水量类型 比如工业用水 居民用水等
            Name of the demand category
        """

增加管段同理,以下是一个例子,传入的.inp文件来源于epanet2.2,该文件无任何元素,纯空白

import wntr
import matplotlib.pyplot as plt
#生成一个空白的.inp文件
wn = wntr.network.WaterNetworkModel(r'..\networks\S2.inp')
#增加两个连接点和一个管段,并且把它们连接起来
wn.add_junction("N1",base_demand=10,coordinates=(0,0),demand_pattern=1,elevation=10)
wn.add_junction("N2",base_demand=10,coordinates=(10,10),demand_pattern=1,elevation=10)
wn.add_pipe("L1",start_node_name="N1",end_node_name="N2",diameter=80,length=10)
#画图
wntr.graphics.plot_network(wn, title=wn.name,node_labels=True,link_labels=True)
plt.show()

我们可以看见坐标(0,0)应该是在左下角,而且管段连接两点,管段长度与坐标无关,坐标只是指定画图的位置,真正的管段长度通过length参数来指定。
在这里插入图片描述

二、删减元素

水网络模型注册表跟踪模型中其他元素何时使用这些元素。只有当依赖于该元素的所有元素都被删除或修改后,才能删除该元素。例如,如果在一个控件中使用了一个阀门,则在删除或修改控件之前,不能删除该阀门。类似地,在删除连接到该节点的管道之前,不能删除该节点。下面的示例从模型中删除一个链接和节点。如果被删除的元素被另一个元素使用,则错误消息将打印到屏幕上,该元素不会被删除。

比如上述例子,如果删除N2就会报错,因为L1使用了N2作为endnode。

三、选项

水网络模型选项分为以下类别:时间、水力、质量、求解器、结果、图形和能源。在epanet中是在浏览器下面作为可设置部分,双击即可编辑:
在这里插入图片描述
在这里插入图片描述

print(wn.options)

和epanet中的设置基本一样,如果对参数不了解可以看同济的汉化手册,再对比epanet软件来查看wntr的使用

Options
(time=TimeOptions(duration=0.0, hydraulic_timestep=3600.0, quality_timestep=300.0, rule_timestep=360.0, pattern_timestep=3600.0, pattern_start=0.0, report_timestep=3600, report_start=0.0, start_clocktime=0.0, statistic='NONE'), 

hydraulic=HydraulicOptions(headloss='H-W', hydraulics=None, hydraulics_filename=None, viscosity=1.0,specific_gravity=1.0, pattern=None, demand_multiplier=1.0, demand_model='DDA', minimum_pressure=0.0, required_pressure=0.07, pressure_exponent=0.5, emitter_exponent=0.5, trials=40, accuracy=0.001, unbalanced='CONTINUE', unbalanced_value=10,checkfreq=2,maxcheck=10,damplimit=0.0,headerror=0.0, flowchange=0.0, inpfile_units='LPS', diffusivity=1.0),

report=ReportOptions(pagesize=0, report_filename=None, status='NO', summary='NO', energy='NO', nodes=False, links=False, report_params={'elevation': False, 'demand': True, 'head': True, 'pressure': True, 'quality': True, 'length': False, 'diameter': False, 'flow': True, 'velocity': True, 'headloss': True, 'position': False, 'setting': False, 'reaction': False, 'f-factor': False},
 param_opts={'elevation': {}, 'demand': {}, 'head': {}, 'pressure': {}, 'quality': {}, 'length': {}, 'diameter': {}, 'flow': {}, 'velocity': {}, 'headloss': {}, 'position': {}, 'setting': {}, 'reaction': {}, 'f-factor': {}}), quality=QualityOptions(parameter='NONE', trace_node=None, chemical_name='CHEMICAL', diffusivity=1.0, tolerance=0.01, inpfile_units='mg/L'),
    
reaction=ReactionOptions(bulk_order=1.0, wall_order=1.0, tank_order=1.0, bulk_coeff=0.0, wall_coeff=0.0, limiting_potential=0.0, roughness_correl=0.0),
     
energy=EnergyOptions(global_price=0.0, global_pattern=None, global_efficiency=75.0,demand_charge=0.0),graphics=GraphicsOptions(dimensions=['0.000', '0.000', '10000.000', '10000.000'], units='NONE', offset=['0.00', '0.00'], image_filename=None, map_filename=None), user=UserOptions())

四、元素属性操作

要修改元素属性,首先使用get_node或get_link方法获得元素对象。下面的例子改变了连接标高,管道直径,和尺寸为一个等直径的水箱。

>>> junction = wn.get_node('121')
>>> junction.elevation = 5
>>> pipe = wn.get_link('122')
>>> pipe.diameter = pipe.diameter*0.5
>>> tank = wn.get_node('1')
>>> tank.diameter = tank.diameter*1.1

下面演示如何向连接121添加额外的需水量。

>>> print(junction.demand_timeseries_list)  
<Demands: [<TimeSeries: base=0.002626444876132, pattern='1', category='None'>]>

>>> junction.add_demand(base=1.0, pattern_name='1')
>>> print(junction.demand_timeseries_list)  
<Demands: [<TimeSeries: base=0.002626444876132, pattern='1', category='None'>, <TimeSeries: base=1.0, pattern='1', category='None'>]>

删除需水量

>>> del junction.demand_timeseries_list[1]
>>> print(junction.demand_timeseries_list)
<Demands: [<TimeSeries: base=0.002626444876132, pattern='1', category='None'>]>

改变基本需水量

>>> reservoir = wn.get_node('River')
>>> reservoir.head_timeseries.base_value = reservoir.head_timeseries.base_value*0.9
>>> junction = wn.get_node('121')
>>> junction.demand_timeseries_list[0].base_value = 0.005

增加需水量模式

>>> pat = wn.get_pattern('3')
>>> junction.demand_timeseries_list.append((0.001, pat))

改变材质

>>> pipe = wn.get_link('122')
>>> pipe.material = 'PVC'

利用迭代器改变管材属性

>>> for pipe_name, pipe in wn.pipes():
...     pipe.diameter = pipe.diameter*0.9

获得node的名称和数量

>>> node_names = wn.node_name_list
>>> num_nodes = wn.num_nodes
>>> wn.describe(level=0) 
{'Nodes': 97, 'Links': 119, 'Patterns': 5, 'Curves': 2, 'Sources': 0, 'Controls': 18}

查询元素属性

>>> import numpy as np

>>> node_elevation = wn.query_node_attribute('elevation')
>>> junction_elevation = wn.query_node_attribute('elevation',
...     node_type=wntr.network.model.Junction)
>>> junction_elevation_10 = wn.query_node_attribute('elevation', np.greater_equal,
...     10, node_type=wntr.network.model.Junction)

当使用同一个水网络模型使用WNTRSimulator进行多个模拟时,需要在模拟之间重置初始条件。初始条件包括模拟时间、油罐压头、储液罐压头、管道状态、泵状态和阀门状态。当使用EpanetSimualtor时,不需要这个步骤,因为EPANET每次运行时都以初始条件启动。

>>> wn.reset_initial_values()

输出文件可以在epanet打开查看

>>> wn.write_inpfile('filename.inp', version=2.2)

从零开始新建一个模型

>>> wn = wntr.network.WaterNetworkModel()
>>> wn.add_pattern('pat1', [1])
>>> wn.add_pattern('pat2', [1,2,3,4,5,6,7,8,9,10])
>>> wn.add_junction('node1', base_demand=0.01, demand_pattern='pat1', elevation=100,
...     coordinates=(1,2))
>>> wn.add_junction('node2', base_demand=0.02, demand_pattern='pat2', elevation=50,
...     coordinates=(1,3))
>>> wn.add_pipe('pipe1', 'node1', 'node2', length=304.8, diameter=0.3048,
...    roughness=100, minor_loss=0.0, status='OPEN')
>>> wn.add_reservoir('res', base_head=125, head_pattern='pat1', coordinates=(0,2))
>>> wn.add_pipe('pipe2', 'node1', 'res', length=100, diameter=0.3048, roughness=100,
...     minor_loss=0.0, status='OPEN')
>>> nodes, edges = wntr.graphics.plot_network(wn)
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值