0 8 (执行 (全) (0 1))  (0 0)

管网平差v0.91
Jacky 2025.3.25
哈代－克罗斯（Hardt-Cross）法
解环方程



8 82 (执行 (1 68 -1 (@87~88?请输入管道的总数)) (1 71 -1 (@90~91?请输入环的总数)) (1 25 -1 26) (1) (0 1)) (0 0)
 
原理梳理
一、计算管道水力损失
水力损失海澄－威廉公式：
h=
10.67*q^1.852*l/(Ch^1.852*dj^4.87)
=
10.67*(流量)^1.852*(管长)/((系数)^1.852*(管径)^4.87)
=
a*l*q^n
=
(10.67/((海威系数)^1.852*(管径)^4.87))*(管长)*(流量)^1.852
=

 mH2O


海澄－威廉系数Ch:
水泥砂浆内衬钢管、铸铁管 120~130
涂料内衬钢管、铸铁管     130~140
未内衬钢管、铸铁管       90～100
预应力混凝土管（PCP）    110~130
预应力钢筒混凝土管（PCCP） 120~140

旧钢管海澄－威廉系数，简称海威系数取：
95



二、计算水管比阻系数
水管比阻系数a=
(10.67/((海威系数)^1.852*(管径)^4.87))
=
(10.67/(95^1.852*(管径)^4.87))
=




三、计算水管摩阻系数
摩阻系数：
s=
a*l
=
(比阻系数)*(管长)
=



摩阻系数s=
(10.67/((海威系数)^1.852*(管径)^4.87))*(管长)



四、流量与水损的变化关系
对h=s*q^n求微
dh = n*s*q^(n-1)*dq
dq = dh/(n*∑s*q^(n-1))
流量差
=
(环水力损失差)/(1.852*(摩阻系数)*(流量)^(1.852-1))
=
(环水力损失差)/(1.852*(摩阻系数)*(流量)^(0.852))

这样可以通过求出各环的水力损失差、假定流量，以及各节点的流量连续性，即各节点进出水量相等
来求出相应的补偿流量差（假设顺时针方向的流量为正，逆时针为负）

管总数为：
12

环总数为：
5


计算小环最大闭合水损差<0.5 mH2O
计算大环最大闭合水损差<1.0 mH2O
两者同时满足时，计算完成



 (1 16 -1 17) (1) (1 19 -1 20) (1)

82 44 (执行 (2) (1 3 -1 4) (5) (1 7 -1 8) (6) (1 10 -1 11) (6) (1 13 -1 14) (6) (1 22 -1 23) (6) (1 25 -1 26) (6) (1 28 -1 29) (6) (1 31 -1 32) (6) (1 34 -1 35) (6) ([) (37) (38) (39) (]) (0 1))     (0 0 151)
循环分为最外层的平差循环，中间层的环间循环，最内层的环内循环、管间循环。
假定平差循环的各变量初值。
环水力损失为：
0.00
 mH2O
 
环累计微积水损为：
0.00

运行初环行号值为：
14

环列号值为：
1

管总数为：
12

环总数为：
5

管初行号值为：
1

最大闭合水损差终止值
0.5

小环最大闭合水损差
1.1

平差循环数
2

平差总计数：
0

管号  始  终    管长     流量   内环 外环 管径 水力坡度 水损 |s*q^0.852|
            m    m3/s          mm   1000i  mH2O  
————————————————————————————————————————————————



 (1 4 -1 (@4~6?读入管道数据))  #20250322 (1 18 0 19 -3) (#平差循环数 (平差循环数)-1)

44 37 (执行 (#平差终止判断 ((小环最大闭合水损差)-0.5)) (1) (3 4 0) (环间循环数 (环总数)) (1 6 0 7 0) (1 9 0 10 0) (1 12 0 13 0) (1 15 0 16 -2) (1 18 0 19 -3) (0 1))     (0 0 277)
 
（一）进入最外层的平差循环
开始管网平差循环
以‘环总数’赋值作为中层的‘环间循环数’；

运行环行号：
(运行初环行号)

平差总计数：
(平差总计数)+1

环序号增量：
(?(平差总计数)>1:1:0)

小环最大闭合水损差：
0

数据表操作符：
(?(平差总计数)>1:-1:+1)

已读入管道数据 
#管编号  起点编号 终点  管长     流量m3/s   内环号 外环号      管径   水力坡度1000i 管水力损失   |s*q^0.852|
   1       2     1   760    0.012      1      0    150      6.61        -5.02      418.63
   2       3     2   250    0.0396     2      0    250      5.02        -4.27      107.75
   3       4     1   400    0.0040     1      0    150      0.86         0.34      85.00
   4       5     2   400    0.0040     1      0    150      0.86        -0.34      85.00
   5       6     3   400    0.0596     2      0    300      4.40        -1.76      29.54
   6       5     4   700    0.0316     1      3    250      3.30        -2.31      73.17
   7       6     5   850    0.0764     2      4    300      6.97         5.93      77.58
   8       4     7   350    0.0040     3      0    150      0.86        -0.30      75.67
   9       5     8   350    0.0040     3      4    150      0.86         0.30      75.67
  10       6     9   350    0.0582     4      0    300      4.21         1.47      25.33
  11       8     7   700    0.0128     3      0    150      7.46         5.22     407.72
  12       9     8   850    0.0390     4      0    250      4.88         4.15      106.3



37 15 (执行 (#环间循环数 (环间循环数)-1) (环间循环数) (1) (1 5 0 6 0) (环内循环数) (0 1))      (0 0 6 107)
（二）进入中间层的环间循环
显示环间循环数
为下一层循环赋值：以循环所在行的数据项，作为‘环内循环数’
显示‘环内循环数’，下面「[](运行环行号)，」表示求取运行环行号的项数
环内循环数
([](运行环行号)，)-1-(环序号增量)
已读入环号数据
#环号  管号
  1   -1 3 -4 6
  2   2 4 5 7
  3   6 8 9 11
  4   7 9 10 12
  5   1 2 3 5 8 10 11 12


15 5 (执行 (0 1)) (0 0)





5  31 "环行号、环列号、管行号、管列号见数据文件"   (执行 (#环内循环数 (环内循环数)-1) (环内循环数) (管号 [](运行环行号)，(环列号))  (1 8 1 9 0) (1) (1 11 1 12 0) (1) (1 13 1 14 0) (16) (1 19 1 20 0) (22) (1 25 1 26 -4) (28)  (0 1)) (0 0 0)
 
环内管号循环
从环号中选中第一列管号数据：
(abs((运行环行号),(环列号))+3)



水损正负由管序号值取为：
(abs(管号))/(管号)

管行号
(管初行号)+abs(管号)
取管径为管道第7列数据：
([](管行号)，7)
150
 mm


取管长为管道第3列数据：
([](管行号)，3)
760
 m


取流量为管道第4列数据：
([](管行号)，4)
0.012
 m3/s


 (0 0)
31 58  (执行 (2 3 0) (1 2 1 3) (1) (1 2 0 3 -3) (2 11 0) (1 10 1 11) (1) (1 10 0 11 -3) (2 19 0) (1 18 1 19) (1) (1 18 0 19 -3) (([](管行号)，8) (千米水阻)) (2 27 0) (1 26 1 27) (1) (1 26 1 27 -3) (31) (([](管行号)，9) (管段水力损失)) (2 36 0) (1 35 1 36) (1) (1 35 1 36 -3) (31) (2 41 0) (1 40 1 41) (1) (1 40 0 41 -3) (([](管行号)，10) (管段微水损)) (2 49 0) (1 48 1 49) (1) (1 48 0 49 -3) (1)     ([) (1 1 1 ([](管行号)，0)) (1 1 1 ([](管行号)，1)) (1 1 1 ([](管行号)，2)) (1 1 1 ([](管行号)，3)) (1 1 1 ([](管行号)，4) 5) (1 1 1 ([](管行号)，5)) (1 1 1 ([](管行号)，6)) (1 1 1 ([](管行号)，7)) (1 1 1 ([](管行号)，8)) (1 1 1 ([](管行号)，9)) (1 1 0 ([](管行号)，10)) (])      (1 53 0 54 0) (0 1)) (0 0)
  
计算管段比阻a=
10.67/((海威系数)^1.852*((管径)/1000)^4.87)
=
10.67/(95^1.852*(0.150)^4.87)
=23.870

 

计算管段摩阻s=
(比阻)*(管长)
=
23.870*760
=18141.200



千米水阻1000i=
(比阻)*(abs(流量))^1.852*1000
=
23.870*0.012^1.852*1000
=6.614



计算管段水力损失h=
(摩阻)*(abs(流量))^1.852
=
18141.2*0.012^1.852
=5.027
 mH2O



环水力损失为：
(环水力损失)+(计算管段水力损失)*(正负)



计算管段微水损=
(摩阻)*(abs(流量))^0.852
=
18141.2*0.012^0.852
=418.917



环累计微积水损为：
(环累计微积水损)+(计算管段微水损)



环列号值为：
((环列号值)+1)




58 9 (执行 (1) (3) (0 0) (0 1))            (32 0)
 

继续环内循环，出循环后下一步将进行校正流量计算




#20250322 ([](运行环行号)，+1)修改([](运行环行号)，(数据表操作符))

9 31 (执行 (1) (3 4 0) (1 3 -1 4) (1) (1 3 0 4 -5) (5) (1 7 0 8 -5)      ([) (1 1 1 ((运行环行号)-(运行初环行号)+1) 0) (1 22 1 (环水力损失)) (1 1 1 9) (1 24 0 (环累计微积水损)) (1 3 1 4) (1 6 1 (校正流量)) (5) (])     (([](运行环行号)，(数据表操作符)) (校正流量)) ([](运行环行号)，-1) (10) (1) (1 11 1 12 0) (1) (环内循环数 (([](运行环行号)，)-1)) (1) (1 13 -1 14) (1) (1 16 -1 17) (1) (1 19 -1 20) (1) (0 0) (0 1))     (113 0)
 
在环内循环完成后，在环间循环，计算校正流量
校正流量=
-1*(环水力损失)/1.852/(环累计微积水损)
 m3
=
小环最大闭合水损差=
(?(abs(环水力损失))>(abs(小环最大闭合水损差)):(abs(环水力损失)):(abs(小环最大闭合水损差)))
mH2O
准备下一轮环间循环，如小环最大闭合水损差<1 mH2O时，退出循环
运行环行号增为：
(运行环行号)+1
赋值环列号值为：
1

重赋值环累计微积水损为：
0.0

环水力损失为：
0.0

 环闭合差∑水损：
 
 ∑微积水损：
 
  

 
 
 

31 18 (执行 (4 4 0) (1 5 -1 6) (1) (1 8 0 9 0) (1) ([) (1 1 1 (平差总计数)) (1 11 1 (小环最大闭合水损差) 3) (12) (1 1 0 13) (]) ([]) (0 1)) (0 0)
 
上面计算完各环的平差流量，保存于环数组最后一项，
下用之校正原有的管段流量，从管号循环入手
以‘管总数’赋值作为内层‘管间循环数’
重设管行循环数为：
(管总数)

管行号：
(管初行号值)+1

次平差各环最大闭合差：
 mH2O
————————————————————————————————————————————————



(0 0) (0 1)

18 59  (执行 (#管行循环数 (管行循环数)-1) (2) (1 4 0 5 0) (1) (1 7 0 8 0) (1) (1 10 0 11 0) (1) (1 13 0 14 -8) (1) (1 17 0 18 -8) (1) (3 22 0) (1 21 -1 22) (1) (1 21 0 22 -5) (1) (1 24 -1 25) (1) (1 24 0 25 0) (1) (1 27 -1 28) (1) (1 27 0 28 -5) (1) (1 30 -1 31) (1 30 0 31 -5) (1) (1 33 -1 34) (1) (1 33 0 34 -5) (37) (39) (([](管行号)，4) (校正后流量)) (1) (1 51 1 52 -5) (1 54 1 55 0)    (1 43 0 44 -5) (1) (1 46 0 47 0) (0 (目标行号)) (0 1)) (0 30)
 
启动管间循环

内环号=
[](管行号)，5

内环正负号=
(?(内环号)=0:0:(abs(内环号))/(内环号))

内环行号=
(运行初环行号值)+(abs(内环号))-1

内环号对应校正流量=
[](内环行号)，-1


外环号=
[](管行号)，6

#当外环号等于0时，值为0；否则取其正负
外环正负号=
?(外环号)=0:0:(abs(外环号))/(外环号)

外环行号=
(运行初环行号值)+(abs(外环号))-1

外环号对应校正流量=
?(外环号)=0:0:([](外环行号)，-1)

原管段的流量=
(内环正负号)*([](管行号)，4)

校正后流量=
(原管段的流量)+(内环号对应校正流量)-(外环号对应校正流量)
=
(内环正负号)*([](管行号)，4)-(内环正负号)*(内环号对应校正流量)-(外环正负号)*(外环号对应校正流量)
=

 m3

将校正后流量写入文件表

置换原管段的流量=
(校正后流量)

管行号=
(管行号)+1


#流向变换由(校正后流量)*(原管段的流量)是否<0来判断，如变换则需要调环号正负、及环内的管号正负，还管的始、终节点号
流向变换值：
(校正后流量)*(原管段的流量)

目标行号：
?(流向变换值)<0:1:0




59 29 (执行 (2) (1 4 0 5 0) (1) (1 7 0 8 0) (1) (1 10 0 11 0) (1) (1 13 0 14 0) (1) (([](管行号)，6) (内环号)) (1) (([](管行号)，7) (外环号)) (1) (1 20 0 21 0) (1) (1 23 0 24 0) (1) (([](校正内环的行号)，(管序号)) (内环正负号)*(abs(内环号))) (外环号)) (1) (0 1)) (0 0)
 
变换流向操作

管起点编号：
([](管行号)，1)

管终点编号：
([](管行号)，2)

内校环号：
(内环号)*(-1)

外校环号：
(外环号)*(-1)

(([](管行号)，6) (内校环号))

(([](管行号)，7) (外校环号))

校正内环的行号为：
(运行初环行号)-1+(abs(内校环号))

校正内环的管序号为：
[](校正内环的行号)，=(管号)





29 12  (执行 (2 3 0) (0 0) (0 1)) (60 0)

继续管间循环，检测管间循环结束后，完成第一次平差及流量校正
衔接准备重启外层的平差循环







 (1 14 -1 15) (1) #20250322增加下页命令4 ([])

12 20 (执行 (1) (3 3 0) ([]) (1 5 0 6 0) (1 8 0 9 0) (1 11 -1 12) (1) (管间循环数 (管总数)) (环间循环数 (环总数)) (0 0) (0 1))       (302 0)
 
已经用平差流量校正原有流量以后
重启最外层的平差循环

运行环行号为：
(运行初环行号值)

重赋值环内循环数：
(([](运行初环行号值)，)-1)

赋值环列号值为：
1

小环最大闭合水损差
0



 (1 4 0 (@4~5?请输入水源节点号))

20 10 (执行 (2) (1 4 0 ([]19) 0)  (1 7 0 8 -1)   ([) (1 4 11 (流自管节点号)) (])   (0 1)) (0 0)
 
环网平差完成后，按节点累计总水力损失，启动节点循环

水源流自管节点号
6

水损累计值：
0.0


10 14 (执行 (2) (1 4 -1 5) (1 7 0 8 0) (0 0) (0 1)) (0 0)
 
启动管间循环，搜索管道第1项，找到等于水源始节点号的管道，读取其第2项，设为新的始节点

重设管行循环数为：
(管总数)

 管行号：
(管初行号值)+1






14 32      (执行 (#管行循环数 (管行循环数)-1) (2) (1 4 0 5 0) (1 7 0 8 0) (1 10 0 11 0) (1 13 0 14 0) (1 16 0 17 -2) (1 19 0 20 -2) (1 22 0 23 0) (1 25 0 26 0) (0 (目标行号)) (0 1)) (0 0 7)
 
管间循环

管起点号：
[](管行号)，1

管终点号：
[](管行号)，2

流向管节点号
(?(管起点号)=(流自管节点号):(管终点号):(流自管节点号))

目标行号：
(?(管起点号)=(流自管节点号):2:1)

本管水损：
(?(管起点号)=(流自管节点号):([](管行号)，9):0)

水损累计：
(?(管起点号)=(流自管节点号):(水损累计)+(abs(本管水损)):(水损累计))

流自管节点号重设为：
(流向管节点号)

管行号：
(管行号)+1






32 6  (执行  (2) (0 0) (0 1)) (0 16)

继续管间循环，直至找到跟流入节点相连的管段




6 15     (执行 (1 2 0 (水损累计))   ([) (1 1 11 (流向管节点号)) (])   (4) (1 6 0 7 0) (1 9 0 10 0) (0 0) (0 1)) (33 0)
 
找到连管后的累计水损：

重新开始管间循环

重设管行循环数为：
(管总数)

管行号：
(管初行号值)+1





15 8 (执行 (1 2 0 (水损累计))    ([)  (1 2 1 (水损累计)) (3) (])   (4) )
 
 总计水损：
 mH2O
统计水损完成！




8 0
