【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的软件中无法导出单向供水的数据,故此处也是一个难点。

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

posted @ 2022-03-09 19:11  _Lisx  阅读(125)  评论(0)    收藏  举报  来源