【EPANET】自动分配水量

灵感引用自王永等人研究论文:

王永,信昆仑,吕存阵,陶涛.应用EXCEL的VBA宏功能实现EPANET中的用水量自动分配[J].给水排水,2009,45(S1):466-469.DOI:10.13789/j.cnki.wwe1964.2009.s1.081.

以下是论文中通过软件EPANET导出的其节点数据和管段数据:

 

以下是论文代码:

Public sub demand()
const totalq As Double =2812.16 '2812.16为总流量
const nodei AS Integer =6
const nodej AS Integer =1292
const pipei AS Integer =1304
const pipej AS Integer =2167 '节点和管段的范围

Dim i, j As Integer
Dim sumq,suml As Double
Dim strNode As String
Dim strNode1,strNode2 As String
sumq=0
suml=0

For i=nodei to nodej
	sumq=sumq+Cells(i,3)
Next i
' 计算节点的集中流量demand
' Cells(m,n) 表示第m行第n列的数据
For j=pipei To pipej
	suml=suml+Cells(j,4)
Next j
' 计算管段的总长度length
For i=nodei To nodej
	'对节点进行流量分配
	strNode = Cells(i,1) '节点ID
	strNode = Trim(strNode) '去除头部和尾部空格
	For j =pipei To pipej
		strNode1 = Cells(j,2)'管段连接的头结点
		strNode2 = Cells(j,3)'管段连接的尾结点
		strNode1 = Trim(strNode1)
		strNode2 = Trim(strNode2)
		If strNode =strNode1 or strNode=strNode2 
		Then Cells(i,3)=Cells(i,3)+(totalq-sumq)*Cells(j,4)/suml/2
		'比流量=(总流量-集中流量)/总长度 即(totalq-sumq)/suml
		'需要的流量=比流量*配水长度/2 即sumq/2
		End If
	Next j
Next i
End Sub

代码分析:

时间复杂度为:O(m+n+m*n),即O(n^2)

空间复杂度为:O(1)

总结:

其实代码内核很简单,就是通过遍历节点流量和管段长度,来计算比流量,最后通过计算比流量和配水长度来计算各节点的节点流量。

代码是在EXCEL中调用VBA宏来实现。

本人在论文源代码的基础上进行了注释说明,同时进行了两处修改:

① 把原先for循环的起始点和终止点改为了常量,这样便于维护;

② 同时此代码还有一个问题,那就是不能判断配水长度,即 第34行代码suml/2 中默认管网全部为双向配水,个人认为可以在之后在双循环内部添加一个判断语句,即判断是否是单向供水,若是,则在原有基础上减去即可一份比流量即可,但是在EPANET的软件中无法导出单向供水的数据,故此处也是一个难点。

此论文为本人学习过程的一个记录,希望在之后的学习过程中能在此代码基础上进行修正,若有侵权,请联系我立马删。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值