北海河海水利水电设计院广西北海536000
摘要:涵洞排水入库调洪演算是水利计算的一大难题,最大的难点在于涵洞上下游水位变化与涵洞下泄能力的相互影响,这一影响存在浮动变化过程,一般的Excel表格计算无法解决浮动变化过程,通过VBA构建函数、判断逻辑、循环过程可以很好解决这一难题。
关键词:涵洞;调洪演算;VBA;Excel;函数;逻辑;循环计算;线性插值
在水利、市政、交通等工程中常常会遇到需要在跨越低凹地带或是河沟的地方设置排水涵洞,涵洞分为圆管涵、拱涵、盖板涵、箱涵等类型。为保障建筑和上下游的安全,设计工作者需要对涵洞的排水流量、涵洞前后水位等进行计算。在实际应用中发现穿越下游库容或是下泄能力较小的地段以及水库,下游水位对上游水位的影响较大,这样计算过程按照单一的涵洞下泄曲线计算得到的调洪过程最高水位偏小,且计算过程随下游水位同步上涨而存在浮动变化,上下游水位变化过程是相互关联、相互影响的。因此为解决调洪演算这一浮动变化过程,笔者利用VBA构建相关函数解决这一难题。
1、计算原理及过程拓扑
构建函数之前我们需要先了解普通Excel计算方式与利用VBA的Excel计算方式的区别。普通Excel计算逻辑仅限于利用自带的判断式进行一次性计算,计算方式为全表整体计算,不能进行逐行或是逐单元格计算,且自带的迭代计算受限于迭代次数的限制。通常我们在计算需要试算、浮动式运算的情况下就非常麻烦,需要人工干预,这样往往会造成效率低下的情况。利用VBA的Excel计算也就是Excel中的宏,计算机科学里的宏(Macro),是一种批量处理的称谓,利用VBA的批量处理功能进行试算、浮动式计算等常常能够事半功倍。
为解决涵洞调洪演算的难点,下面介绍笔者利用VBA的Excel计算的原理和过程。
涵洞调洪演算的难点在于上下游水位影响涵洞的下泄能力,涵洞的下泄能力又会影响到上下游水位,而这个影响又是同步的。为解决这个问题,我们需要把泄流过程梳理清楚。首先,降雨过程中涵洞上游的集雨范围的雨水汇集首先到达的是涵洞,因此可以明确计算的第一步应该在涵洞上游,此时的下游水位是确定的,即此时刻的下游水位为起调水位(这里要明确一点,若是下游水位还没有淹至下游涵洞底高程,此时的下游水位可按照明渠均匀流计算水面线的方式计算,计算方法参见《水力学计算手册》),根据下游起调水位,可按照涵洞的泄流公式计算出上游不同水位情况下的下泄流量,并形成一条涵洞水位流量曲线。然后,根据集雨面积计算至涵洞位置的洪水过程曲线,下游需计算至有控制功能的位置,例如闸门、大坝、溢流堰等,注意集雨面积不要重复计算,需扣除至涵洞位置的集雨面积。根据集雨面积求得涵洞上游及涵洞下游的洪水过程曲线。最后,根据涵洞上下游水位库容曲线、水位流量曲线、洪水过程按照求得第一时刻末上游水位、下泄量,第一时刻末下游水位、下泄量,按照下游水位求得下一时刻涵洞水位流量曲线……然后重复以上过程,最终求得上下游调洪过程,过程拓扑图见下图。
2、函数构建及逻辑应用
按照以上拓扑仅仅解决了过程问题,由于涵洞水位流量计算过程存在较多的判断逻辑,单纯依靠Excel尚不能完全解决涵洞调洪的问题,因此,笔者采用了VBA编辑代码,使计算过程简单化、快捷化。
根据拓扑图,需要解决的主要问题是函数构建、逻辑判断、循环计算。VBA建立函数可通过自定义函数功能Function构建,其原理是定义公式中的参数,使参数进入公式内自动运算。以下以构建线性插值公式为例进行解释。
示例代码过程如下:
PrivateFunction线性插值(iAsDouble,kAsDouble,jAsDouble,LAsDouble,eAsDouble)AsDouble'i、k为结果行、列,j、l为查询值行、列e为查询值,不能查询过大或过小,结果将为0
DimAAsDouble,BAsDouble,CAsDouble,DAsDouble’定义A、B、C、D类型为双精度
C=Cells(j,L)’查询序列所含的的值
DoUntily=1’建立查询循环
Ife<CThen’建立判断逻辑
y=1
GoTo50
EndIf
i=i+1’建立逐行查询循环
j=j+1’建立逐行查询循环
A=Cells(i,k)’返回第i行、k列结果
B=Cells(i-1,k)’返回第i-1行、k列结果
C=Cells(j,L)’返回第j行、l列查询值
D=Cells(j-1,L)’返回第j-行、l列查询值
f=(B-A)/(D-C)*(e-C)+A’按照线性插值公式构建函数
50Loop结束循环
Ife=CThen线性插值=A’补充判断不在区间内的查询值
Else
线性插值=f’返回最终结果值
EndFunction’结束函数
如上示例,利用VBAFunction功能可构建涵洞的所有公式,简化Excel公式编辑,并建立查询循环、判断逻辑使计算逻辑完全按照拓扑过程进行,解决涵洞水位流量曲线随上下游水位变化浮动的难题,使计算结果更准确。
根据构建的函数,笔者对某水库上游设置的涵洞进行了调洪计算,计算48小时调洪,整个计算过程仅仅花费3秒钟。为清楚展示成果,截取15个小时的计算数据示例,可见在第9个小时,涵洞上游与水库侧均达到了最高水位,比较符合实际,计算成果见下表格1:
3、结语
笔者采用单纯excel编辑公式的方式和采用VBA编辑公式的方式进行了计算比较,单纯Excel计算过程只能利用一条上游泄流曲线,计算过程存在较多的人工操作,自动化程度不高,编辑完成后的表使用时需要一一查询结果,花费几个小时才能算出结果。而采用VBA编辑构建函数、逻辑等,将中间过程全部交给电脑处理,使用时计算时间往往在几秒,大大节省了时间,还提高了成果的准确度。因此在工作中,有效利用编程,是提高工作效率的一大途径,值得大家共同探讨。
参考文献:
[1]熊启均.取水输水建筑物丛书涵洞分册[M].北京:中国水利水电出版社,2010.
[2]陈雷,索丽生.水工设计手册第二版第9卷灌排、供水[M].北京:中国水利水电出版社,2014.
[3]黄朝阳,罗刚君.Excel2013VBA编程与实践[M].北京:电子工业出版社,2014.
[4]李炜.水力计算手册(第二版)[M].北京:中国水利水电出版社,2006.