using System;
using System.Collections.Generic;
using System.Text;
namespace testone
{
class KB
{
private int t, t0, Tf;
private double hL;//堤坝高度(常态)
public double hr;//堤坝内水高度(过程态)
private double hLb;//堤坝溃堤最低处(终态)
public double hb;//破堤瞬時間高程; (过程态)
private double hp;//河道外水位;(过程态)
private double h_low;//瞬時溢流較低水位高程; (过程态)
private double h_high;//瞬時溢流較高水位高程; (过程态)
private double gamma;//內外水位比值(过程态)
private double alpha;//以決定河道內水是否溢流於堤防外(过程态)
private double beta;
private double b;//溃堤宽度(终态)
private double bt;//最终溃堤宽度(过程态)
private double dx;//沿主道方向的断面距离(常态)
double q12 = 0;
private void getalpha()
{
alpha = -1;// (hr - hp) / (h_high - h_low);//当正常外流,应该为-1。
}
private void getgamma()
{
gamma = 1;// (hp - hb) / (hr - hb);//当正常外流,应该为-1。
}
private void getbeta()
{
if (gamma <= 0.67) beta = 1;
else
beta = 1 - 27.8 * (gamma - 0.67) * (gamma - 0.67) * (gamma - 0.67);//当正常外流,应该为-1。
}
private void getbt()
{
if (t <= t0 + Tf)
{
double x = t;
double y = Tf;
double tmp = (double)(x / y);
bt = b *tmp ;
}
else bt = b;
}
private void gethb()
{
if (t <= t0 + Tf) hb = hL - (hL - hLb) * t / Tf;
else hb = hLb;
}
#region
private void gethr()
{ hr = h_high; }
private void gethp()
{ hp = h_low; }
#endregion
//输入量包括hr,hp,
private void getQ12()
{
double tmp = Math.Pow(System.Math.E, -(double)t / (Tf / 3));
//this.h_high = hLb + (hL - hLb) * tmp;//符合某种规则减少(需要带入水网之维纳特方程求解。。。)
double x = (h_high - hLb) * tmp; //h_high - hb;//必须大于0
double y = 1.5;
double z = 2.5;
double tmp1 = System.Math.Pow(x,y);
double tmp2 = System.Math.Pow(x,z);
double tmp3 = 0.5 * bt * tmp1 + 0.64 * tmp2;
q12 = alpha * beta * tmp3 / dx;
}
/// <summary>
/// 设置溃堤参数
/// </summary>
/// <param name="t0">破堤起始时间</param>
/// <param name="Tf">破堤时长(小时)</param>
/// <param name="h_high">渠道内水位初始高度</param>
/// <param name="hLb">最后破堤水位高度</param>
/// <param name="b">破堤宽度</param>
/// <param name="dx">沿主道方向的断面距离</param>
public void setparams(int t0, int Tf, double h_high, double hLb,double b, double dx)
{
getalpha();
getbeta();
this.b = b;
this.t0 = t0;
this.Tf = Tf;
this.dx = dx;
this.h_high = h_high;//水位
this.hLb = hLb;
}
//需要输入的参数包括:堤防高度、溃堤处终态最低高度、起始时间、溃堤模拟时长、最後破堤水位高度、破堤宽度、沿主道方向的断面距离
//理论上,参数有破堤之位置、河道水面高程(洪水位)、破堤寬度、破堤持續時間及最後破堤水位高度
public double computer(int t)
{
this.t = t;
getbt();
gethb();
this.getQ12();
return q12;
}
}
}