【讨论】小型水库洪水调节计算
nidr_zys
nidr_zys Lv.8
2011年02月13日 16:15:55
只看楼主

现在一般的调洪计算,大多采用VB或者VBA配合EXCEl来做,因为EXCEL应用比较广泛,大家都比较熟悉。如果应用SQL或者Oracle的话,在大计算量情况下比较有优势。一般的计算似乎有点得不偿失,因此本文仅对一般小型水库洪水调节计算应用VBA和EXCEL进行说明。 首先说明一下,大型水库尤其是洪量大,泄流能力大水库,这样的水库调节起来比较容易。如果有朋友计算过不同类型的水库调洪,会深有感触。大型水库一般只要过了最高水位时段,以后时段水位大多平稳回落到起调水位。小型水库不然,在洪水过程线最开始的若干时段,属于控泄时段,随着来水量加大,水库按泄流能力泄流。达到最高水位后,水位开始回落,此时入库逐渐减小,出库也减小,但出库减小幅度小于入库减小幅度。在整个洪水过程中,一个水位变化的完整过程是:1、起调水位-2、最高水位->3、起调水位。那么小水库的洪水时段划分的应适当小一些,而且3、起调水位出现之前,出库是大于入库的,因此往往存在调节到最后,水位低于起调水位,这种情况是不允许,因为那意味这你可能放走了一部分兴利库容。即使你简单控制低于3、起调水位也不是很容易,这就是与大型水库调节计算之间的差别。大型水库小频率洪水流量相当大,每个洪水时段(h)相对而言就较小,因此调节起来就符合水位变化过程。小型水库,尤其是小型水库的大频率洪水,比如33%,20%,洪水流量一般都不大,但是由于库区堤防等需要这样频率的洪水水位,仍要进行计算。当然,常规的计算能够得到最高水位,但是最高水位出现后的其余洪水过程不对特征水位有影响,但是如果看到一个这样过程的话(即最终水位低于起调水位),这样的计算过程是不完善的,也是不合理的。

现在一般的调洪计算,大多采用VB或者VBA配合EXCEl来做,因为EXCEL应用比较广泛,大家都比较熟悉。如果应用SQL或者Oracle的话,在大计算量情况下比较有优势。一般的计算似乎有点得不偿失,因此本文仅对一般小型水库洪水调节计算应用VBA和EXCEL进行说明。
首先说明一下,大型水库尤其是洪量大,泄流能力大水库,这样的水库调节起来比较容易。如果有朋友计算过不同类型的水库调洪,会深有感触。大型水库一般只要过了最高水位时段,以后时段水位大多平稳回落到起调水位。小型水库不然,在洪水过程线最开始的若干时段,属于控泄时段,随着来水量加大,水库按泄流能力泄流。达到最高水位后,水位开始回落,此时入库逐渐减小,出库也减小,但出库减小幅度小于入库减小幅度。在整个洪水过程中,一个水位变化的完整过程是:1、起调水位-2、最高水位->3、起调水位。那么小水库的洪水时段划分的应适当小一些,而且3、起调水位出现之前,出库是大于入库的,因此往往存在调节到最后,水位低于起调水位,这种情况是不允许,因为那意味这你可能放走了一部分兴利库容。即使你简单控制低于3、起调水位也不是很容易,这就是与大型水库调节计算之间的差别。大型水库小频率洪水流量相当大,每个洪水时段(h)相对而言就较小,因此调节起来就符合水位变化过程。小型水库,尤其是小型水库的大频率洪水,比如33%,20%,洪水流量一般都不大,但是由于库区堤防等需要这样频率的洪水水位,仍要进行计算。当然,常规的计算能够得到最高水位,但是最高水位出现后的其余洪水过程不对特征水位有影响,但是如果看到一个这样过程的话(即最终水位低于起调水位),这样的计算过程是不完善的,也是不合理的。
因此,我们需要对计算过程进行修正。一般计算过程见下:


H(1)为起调水位,HΔ为某一微量
V(1)为起调水位对应库容,VΔ为某一微量

洪水时段 入 库 出 库 水库水位 库 容
1 Qr(1) Qc(1) H(1) V(1)
2 Qr(2) Qc(2) H(2) V(2)
................................
最高水位出现在两虚线之间
................................
n Qr(n) Qc(n) H(n) V(n)
n+1 Qr(n+1) Qc(n+1) H(n+1) V(n+1)

假设第n个时段 H(n)>H(1),第n+1个时段H(n+1) 那么n+1个时段的出库流量Qc(n+1)=(V(n)-V(1)+Qr(n+1))/时段长,
这样,出库流量才是正确的,第n+1时段末水位及库容均与起调时相应,其以后时段按入库泄流。整个过程完全正常!

附件为某一小水库的洪水调节计算过程,在小频率的时候特别明显,即时段末无法正常回到起调水位。因为以前做大水库的时候,根本遇不到这样的问题,因此,把这个提出来希望和大家一起探讨。
附件的excel程序中带有宏,没有病毒请放心,另外,那个excel都是比较简单的VBA,我不是跟大家探讨编程序的问题,相信论坛很多都是编程高手,因此那个excel也不是通用性很好,仅作交流用,希望不要把它用在实际工程计算上,不然出问题本人概不负责!
呵呵!


[ 本帖最后由 nidr_zys 于 2011-2-13 16:17 编辑 ]
7c7561539746a04b3b0b.rar
49.2 KB
立即下载
免费打赏
nidr_zys
2011年02月13日 16:59:41
2楼
怎么没人踩啊,呵呵,好容易发个帖子,我容易吗?
回复
chenhuan945
2011年02月13日 17:42:08
3楼
顶一下,谢谢楼主,以前下过相关的,还是看一下这个怎样
回复
闲逛的猪
2011年02月15日 13:02:00
4楼
我来顶下你好了。
我算水利水能从不是用EXECL的,我习惯用VC做。不过万法同源,语言不过是一种表述方法而已。我对付这个调洪的算法比较简单,归纳为以下几句话,供你参考:
1、调节后,水位高于起调水位,则取调后水位;调节后,水位低于起调水位,则取当前水位为起调水位,出库流量为来水量(即以闸门控制,来多少泄多少)
2、不限泄调节后,水位高于防洪高水位,则取调后水位;不限泄调节后,水位低于防洪高水位,按限泄重调;重调后水位低于防洪高水位,取重调后水位;重调后水位高于防洪高水位,则取防洪高水位、出库流量为来水量(闸门控制水位,但下游防洪遭受破坏)
回复
nidr_zys
2011年02月18日 22:14:06
5楼
楼上提供了一个好思路,我也可以用VC,以前用VC也写过一些小东西,但是现在大家都用VB,VBA。语言其实都是一个东西,但是你说的第一条似乎有点不合适,比如最高水位出现后,出库小于入库,但是水位高于起调水位,这个时候,出库就应大于入库,而不是等于入库了。
回复
闲逛的猪
2011年02月18日 22:56:05
6楼
我贴两块核心代码上来
void CMyDoc::Compute()
{
double now_height;
double next_height;
double now_time;
double next_time;
double last_time;
double now_q_out;
double next_q_out;
if(Flood_curve.get_longth()<2)
{
AfxMessageBox("洪水过程线不全,计算无法继续!");
return;
}
if(HQ_curve.get_longth()<2)
{
AfxMessageBox("泄流曲线不全,计算无法继续!");
return;
}
if(HV_curve.get_longth()<2)
{
AfxMessageBox("库容曲线不全,计算无法继续!");
return;
}
Result.Reflash();
last_time=get_last_time();//获取洪水过程线最后的时间
now_height=height_first;
now_time=Flood_curve.Head->x;
next_time=now_time+time_step;
now_q_out=HQ_curve.get_y(now_height);
if(now_q_out>Flood_curve.get_y(now_time))
now_q_out=Flood_curve.get_y(now_time);
while(next_time<=last_time)
{
next_height=get_next_height(now_time,now_height,now_q_out);//试算求下一库水位
//修正下泄流量计算结果
next_q_out=HQ_curve.get_y(next_height);
if(next_height {
next_height=height_first;
next_q_out=Flood_curve.get_y(next_time);
}
if(fabs(next_height-limit_height) {
next_height=limit_height;
next_q_out=Flood_curve.get_y(next_time);
if(next_q_out>HQ_curve.get_y(next_height))
next_q_out=HQ_curve.get_y(next_height);
}
else
{
if(next_height {
if(next_q_out>limit_q)
next_q_out=limit_q;
}
}
Result.append(next_time,next_height,Flood_curve.get_y(next_time),next_q_out,HV_curve.get_y(next_height));
now_time=next_time;
now_height=next_height;
now_q_out=next_q_out;
next_time=now_time+time_step;
}
ComputeDone=1;
}


double CMyDoc::get_next_height(double now_time,double now_height, double now_q_out)
{
double next_q_out;
double now_flood;
double next_flood;
double now_v;
double next_v;
double next_height;
double Hmax,Hmin,Hnow,derda_v;
now_flood=Flood_curve.get_y(now_time);
next_flood=Flood_curve.get_y(now_time+time_step);
now_v=HV_curve.get_y(now_height);
next_v=now_v+((now_flood+next_flood)/2.0-now_q_out)*3600*time_step;
next_height=HV_curve.get_x(next_v);
if(fabs(next_height-now_height) return next_height;
if(next_height>now_height)
{
Hmax=next_height;
Hmin=now_height;
}
else
{
Hmin=next_height;
Hmax=now_height;
}
while (fabs(Hmax-Hmin)>accurate_height)
{
Hnow=(Hmax+Hmin)/2;
next_q_out=HQ_curve.get_y(Hnow);
if(Hnow limit_q)
next_q_out=limit_q;
derda_v=((now_flood+next_flood)/2.0-(now_q_out+next_q_out)/2.0)*0.3600*time_step;
next_v=HV_curve.get_y(Hnow);
if(derda_v>(next_v-now_v))
Hmin=Hnow;
else
Hmax=Hnow;
}
return (Hmax+Hmin)/2;
}
回复
nidr_zys
2011年02月24日 08:15:32
7楼
楼上很强大,我第一次看见调洪勇VC来做的,呵呵厉害!
回复
gaoanzhl
2011年03月05日 12:31:16
8楼
小型水库洪水调节计算,谢谢楼主的奉献,下载学习!!!
回复
liuyu_lyu
2011年03月25日 19:27:58
9楼
谢谢楼主的热心,学习一下。
回复
sd7805
2011年04月05日 19:13:50
10楼

很大的帮助
谢谢各位高手
回复
倾心感悟
2011年04月06日 10:34:57
11楼
我有一套安徽的84办法编制的调洪演算电子表格程序
有需要的话 QQ 24535488
回复

相关推荐

APP内打开