4.3 C++程序代码
4.3.1 新安江三水源模型
//新安江三水源模型.h
#include <fstream>
#include <iostream>
#include <iomanip>
#include <cmath>
const intVariableNum = 11, //待率定参数个数
M = 485,//其为降雨起止间时段数(应该为)
Mq = 14;//单位线中q[i]的个数,此课设中为
const double F = 686, dt = 6;//面积、系列数据的时间间隔
const double FE =0.8;
const int Days[4] = {30, 31, 30, 31}; //四至七月份每月天数
const doubleAveE[2][4] = {1.57, 2.29, 2.65, 3.41,0.97, 1.49, 1.71, 2.34};//四至七月份每月的多年平均日蒸发量
double K, WUM, WLM, C, //蒸发(蒸散发能力折算系数、分层蓄水容量、深层蒸散发系数)
WM, b, //产流(蓄水容量、蓄水容量曲线指数)
SM, EX, KI, //水源划分(自由水蓄水容量、自由水蓄水容量曲线指数、自由水蓄水库出流系数)
KKI, KKG; //汇流(壤中流、地下径流消退系数)
doubleP[M], Ep[M], EU[M], EL[M], ED[M], E[M], PE[M], WU[M + 1], WL[M + 1], WD[M + 1],W[M], a[M], R[M];
doubleaf[M];//af[i]指产流面积比率(%),三水源划分中需要的数据
doubleP1[M], P2[M], P3[M], Qo[ M ]; //三个雨量站实测雨量,实测流域流量
doubleS[M], AU[M], RS[M], RI[M], RG[M];
doubleq[Mq], QS[Mq + M - 1],Qs[Mq + M - 1][M];
doubleQ[Mq + M - 1], QI[Mq + M - 1], QG[Mq + M - 1];
doubleSumQo, AveQo, S1, S2;
doubleU = F/3.6/dt;//折算系数
doubleDC;//确定性系数
void inputQ();//读入原始数据
double FuntionDC(doubleCanshu[]);//计算确定性系数
void outputQ(doubleCanshu[]);//输出模拟流量
//**********读入原始数据(函数)************
void inputQ()
{
usingnamespace std;
ifstream infile;//读人三个雨量站实测流域流量
infile.open("infile_3P_Qo.txt");
for(int i = 0; i < M; i++)
infile>>P1[i]>>P2[i]>>P3[i]>>Qo[i];
SumQo = 0, AveQo;
for (int i = 0; i < M; i++)
SumQo += Qo[i];
AveQo = SumQo/M;
S2 = 0;
for (int i = 0; i < M; i++)
S2 += pow(Qo[i] -AveQo, 2);
infile.close();
infile.open("infile_q.txt");
for (int i = 0; i < Mq; i++)
{ //读人时段单位线数据
infile>>q[i];
}
infile.close();
}
//**********计算确定性系数(函数)************
doubleFuntionDC(double Canshu[])
{
usingnamespace std;
K = Canshu[10]; WM =Canshu[0]; WUM = Canshu[1]; WLM = Canshu[2]; C = Canshu[3];
b = Canshu[4];
SM = Canshu[5]; EX = Canshu[6];KI = Canshu[7];
KKI = Canshu[8]; KKG = Canshu[9];
//******三层蒸发模式下的蓄满产流模型(开始)
double WDM =WM - WUM - WLM, KG = 0.7 - KI;
double WMM =WM*(1 + b);
WU[0] = FE*WUM;
WL[0] = FE*WLM;
WD[0] = FE*WDM;
//********计算蒸发能力
intSumTime1 = 0, SumTime2 = 0;
for(int j = 0; j < 4; j++)
{
SumTime1 = SumTime2;
SumTime2+=4*Days[j];
if(SumTime2 > M) SumTime2 = M;
for(int i = SumTime1; i < SumTime2; i++)
{
P[i] = (P1[i]+P2[i]+P3[i])/3;
if(P[i] < 3) Ep[i] = AveE[0][j] * K;
else Ep[i] =AveE[1][j] * K;
}
}
for (int i = 0; i < M; i++)
{
W[i] = WU[i] + WL[i]+ WD[