码迷,mamicode.com
首页 > 编程语言 > 详细

新安江模型程序C++代码

时间:2019-12-14 12:12:20      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:name   --   output   mes   记录   mil   ++   man   model   

以下是类的声明:

class XinanjiangModel

{

private:

????// FORCING

????double *m_pP; // 降水数据

????double *m_pEm; // 水面蒸发数据

????//

????long m_nSteps; // 模型要运行的步长(一共m_nSteps)

????long steps;

????// OUTPUT

????double *m_pR; // 流域内每一步长的产流量(径流深度)

????double *m_pRs; // 每一步长的地表径流深(毫米)

????double *m_pRi; // 每一步长的壤中流深(毫米)

????double *m_pRg; // 每一步长的地下径流深(毫米)

????double *m_pE; // 每一步长的蒸发(毫米)

????double *m_pQrs; // 流域出口地表径流量

????double *m_pQri; // 流域出口壤中流径流流量

????double *m_pQrg; // 流域出口地下径流量

????double *m_pQ; // 流域出口的总流量

????double m_U; // for 24h. U=A(km^2)/3.6/delta_t

????// SOIL

????double *m_pW; // 流域内土壤湿度

????double *m_pWu;???? // 流域内上层土壤湿度

????double *m_pWl;???? // 流域内下层土壤适度

????double *m_pWd; // 流域内深层土壤湿度

????double m_Wum;???? // 流域内上层土壤蓄水容量

????double m_Wlm; // 流域内下层土壤蓄水容量

????double m_Wdm; // 流域内深层土壤蓄水容量,WDM=WM-WUM-WLM

????// EVAPORATION

????double *m_pEu; // 上层土壤蒸发量(毫米)

????double *m_pEl; // 下层土壤蒸发量(毫米)

????double *m_pEd; // 深层土壤蒸发量(毫米)

????//runoff

????double *RF;

????// PARAMETER

????double m_Kc; // 流域蒸散发能力与实测蒸散发值的比

????double m_IM; // 不透水面积占全流域面积之比

????double m_B; // 蓄水容量曲线的方次,小流域(几平方公里)B0.1左右

// 中等面积(平方公里以内).2~0.3,较大面积.3~0.4

????double m_WM; // 流域平均蓄水容量(毫米)(WM=WUM+WLM+WDM)

double m_C; // 流域内深层土壤蒸发系数,江南湿润地区:0.15-0.2

//华北半湿润地区:.09-0.12

????double m_SM; //自由水蓄水容量

????double m_EX; //自由水蓄水容量~面积分布曲线指数

????double m_KG; //地下水日出流系数

????double m_KI; //壤中流日出流系数

????double m_CG; //地下水消退系数

????double m_CI; //壤中流消退系数

????double *m_UH; // 单元流域上地面径流的单位线

????double m_WMM; // 流域内最大蓄水容量

????double m_Area; // 流域面积

????int m_DeltaT; // 每一步长的小时数

????int m_PD; // 给定数据,用以判断是否时行河道汇流计算

public:

????XinanjiangModel(void);

????~XinanjiangModel(void);

????// 初始化模型

????void InitModel(long nSteps, double Area,int DeltaT, int PD, char *ForcingFile);

????// 设置模型参数

????void SetParameters(double *Params);

????// 运行新安江模型

????void RunModel(void);

????// 保存模拟结果到文件

????void SaveResults(char *FileName);

????// 记录出流数据,用以作图分析

????void Runoff(char *runoff);

private:

????// 进行汇流计算,将径流深度转换为流域出口的流量

????void Routing(void);

};

以下是类的定义

#include "stdafx.h"

#include "xinanjiangmodel.h"

#include <iostream>

#include <fstream>

#include <iomanip>

using namespace std;

#include "math.h"

#include "stdio.h"

#include "conio.h"

XinanjiangModel::XinanjiangModel(void)

{

????this->m_pP = NULL;

????this->m_pEm = NULL;

????this->m_pE = NULL;

????this->m_pEd = NULL;

????this->m_pEl = NULL;

????this->m_pEu = NULL;

????this->m_pW = NULL;????

????this->m_pWd = NULL;????

????this->m_pWl = NULL;????

????this->m_pWu = NULL;????

????this->m_pR = NULL;

????this->m_pRg = NULL;

????this->m_pRi = NULL;

????this->m_pRs = NULL;????

????this->m_pQ = NULL;

????this->m_pQrg = NULL;

????this->m_pQri = NULL;

????this->m_pQrs = NULL;

}

XinanjiangModel::~XinanjiangModel(void)

{

????delete[] this->m_pP;????

????delete[] this->m_pEm;

????delete[] this->m_pE;

????delete[] this->m_pEd;

????delete[] this->m_pEl;

????delete[] this->m_pEu;

????delete[] this->m_pW;????

????delete[] this->m_pWd;????

????delete[] this->m_pWl;????

????delete[] this->m_pWu;????

????delete[] this->m_pR;

????delete[] this->m_pRg;

????delete[] this->m_pRi;

????delete[] this->m_pRs;

????delete[] this->m_pQ;

????delete[] this->m_pQrg;

????delete[] this->m_pQrs;

????delete[] this->m_pQri;

}

// 初始化模型

void XinanjiangModel::InitModel(long nSteps, double Area, int DeltaT,int PD, char * ForcingFile)

{

????FILE * fp;

????int i;

????this->m_nSteps = nSteps;

????this->steps = this->m_nSteps + 18;

????// 驱动数据

????this->m_pP = new double[this->steps];????

????this->m_pEm = new double[this->steps];

????// 模型输出,蒸散发项

????this->m_pE = new double[this->steps];

????this->m_pEd = new double[this->steps];

????this->m_pEl = new double[this->steps];

????this->m_pEu = new double[this->steps];

????// 模型输出,出流项,经过汇流的产流

????this->m_pQrg = new double[this->steps];

????this->m_pQrs = new double[this->steps];

????this->m_pQri = new double[this->steps];

????this->m_pQ = new double[this->steps];

????// 模型输出,产流项

????this->m_pR = new double[this->steps];

????this->m_pRg= new double[this->steps];

????this->m_pRi= new double[this->steps];

????this->m_pRs = new double[this->steps];

????// 模型状态量,土壤湿度

????this->m_pW = new double[this->steps];????

????this->m_pWd = new double[this->steps];????

????this->m_pWl = new double[this->steps];????

????this->m_pWu = new double[this->steps];

????//runoff

????this->RF = new double[this->steps];

????for(i = 0;i<this->steps;i++ )

????{

????????// 驱动数据

????????this->m_pP [i] = 0.00;????

????????this->m_pEm [i] = 0.00;

????????// 模型输出,蒸散发项

????????this->m_pE [i] = 0.00;

????????this->m_pEd [i] = 0.00;

????????this->m_pEl [i] = 0.00;

????????this->m_pEu [i] = 0.00;

????????// 模型输出,出流项,经过汇流的产流

????????this->m_pQrg[i] = 0.00;

????????this->m_pQrs[i] = 0.00;

????????this->m_pQri[i] = 0.00;

????????this->m_pQ[i] = 0.00;

????????// 模型输出,产流项

????????this->m_pR [i] = 0.00;

????????this->m_pRg [i] = 0.00;

????????this->m_pRi [i] = 0.00;

????????this->m_pRs [i] = 0.00;

????????// 模型状态量,土壤湿度

????????this->m_pW [i] = 0.00;????

????????this->m_pWd[i] = 0.00;????

????????this->m_pWl[i] = 0.00;????

????????this->m_pWu[i] = 0.00;

????}

????this->m_Area = Area;

????this->m_DeltaT = DeltaT;

????this->m_PD = PD;

????this->m_U = this->m_Area/(3.6 * this->m_DeltaT);

????// Forcing文件格式:第一列:降水(单位毫米)空格第二列水面蒸发(毫米)

????if((fp = fopen(ForcingFile,"r")) == NULL)

????{printf("Can not open forcing file!\n");return; }

????for(i = 0;i<this->m_nSteps;i++ )

????{ fscanf(fp,"%lf%lf",&(this->m_pP[i]),&(this->m_pEm[i])); }

????fclose(fp);

}

// 设置模型参数

void XinanjiangModel::SetParameters(double* Params)

{

????this->m_Kc = Params[0]; // (1) 流域蒸散发能力与实测水面蒸发之比

????this->m_IM = Params[1]; // (2) 流域不透水面积占全流域面积之比

????this->m_B = Params[2]; // (3) 蓄水容量曲线的方次

????this->m_Wum = Params[3]; // (4) 上层蓄水容量

????this->m_Wlm = Params[4]; // (5) 下层蓄水容量

????this->m_Wdm = Params[5]; // (6) 深层蓄水容量

????this->m_C = Params[6]; // (7) 深层蒸散发系数

????this->m_SM = Params[7]; // (8)自由水蓄水容量

????this->m_EX = Params[8]; // (9)自由水蓄水容量~面积分布曲线指数

????this->m_KG = Params[9]; // (10)地下水日出流系数

????this->m_KI = Params[10]; // (11)壤中流日出流系数

????this->m_CG = Params[11]; // (12)地下水消退系数

????this->m_CI = Params[12]; // (13)壤中流消退系数

????this->m_WM = this->m_Wum + this->m_Wlm + this->m_Wdm;

????this->m_WMM = this->m_WM * (1.0 + this->m_B)/(1.0 - this->m_IM);

}

// 运行新安江模型

void XinanjiangModel::RunModel(void)

{

????long i;

????// 模型的状态变量

????double PE; // > 0 时为净雨量;< 0 为蒸发不足量(mm

????double Ep; //m_Kc * m_pEm[i]

????double P;

????double R; // 产流深度,包括地表径流、壤中流和地下径流(mm

????double RB; // 不透水面上产生的径流深度(mm

????double RG; // 地下径流深度(mm

????double RI; // 壤中流深度(mm

????double RS; // 地表径流深(mm

????double A; //土壤湿度为W时土壤含水量折算成的径流深度(mm

????double E = 0.0; // 蒸散发(mm)

????double EU = 0.0; // 上层土壤蒸散发量(mm

????double EL = 0.0; // 下层土壤蒸散发量(mm

????double ED =0.0; // 深层土壤蒸散发量(mm

????double S;

????double FRo;

????double FR;

????double MS;

????double AU;

????double WU = 5.0; // 流域内上层土壤湿度

????double WL = 55.0; // 流域内下层土壤适度

????double WD = 40.0; // 流域内深层土壤湿度

????double W = 100.0;

????double So = 5.0;

????MS = m_SM * (1 + m_EX);

????FRo = 1 - pow((1 - So/MS),m_EX);

????for(i = 0;i<this->m_nSteps;i++ )

????{

????????// ——————蒸散发计算————————————//

????????RB = m_pP[i] * m_IM; // RB是降在不透水面的降雨量

????????P = m_pP[i] * (1 - m_IM);

????????Ep = m_Kc * m_pEm[i];

????????if ((WU + P)>= Ep)

????????{EU = Ep; EL = 0; ED = 0; }

????????else if((WU + P)<Ep)

????????{

????????????EU = WU + P;

????????????if(WL>= (m_C * m_Wlm))

????????????{ EL = (Ep - EU) * WL/m_Wlm; ED = 0; }

????????????else if ((m_C * (Ep - EU))<= WL&&WL<(m_C * m_Wlm))

????????????{ EL = m_C * (Ep - EU); ED = 0; }

????????????else if (WL<m_C * (Ep - EU))

????????????{ EL = WL; ED = m_C * (Ep - EU) - EL; }

????????}

????????E = EU + EL + ED;

????????PE = P - E;

????????/* ———————蒸散发计算结束——————————— */

????????//——————子流域产流量计算————————————//

????????if(PE<= 0)

????????{ R = 0.00; W = W + PE; }

????????else

????????{

????????????A = m_WMM * (1 - pow( (1.0 - W/m_WM), 1.0/(1 + m_B) ) );

????????????// 土壤湿度折算净雨量+降水后蒸发剩余雨量<流域内最大含水容量

????????????if((A + PE)<this->m_WMM)

????????????{????

????????????????// 流域内的产流深度计算

????????????????R = PE /* 降水蒸发后的剩余量*/

???????????????????? + W /* 流域内土壤湿度*/

???????????????????? + m_WM * pow((1 - (PE + A)/m_WMM),(1 + m_B))

???????????????????? - m_WM /* 减去流域平均蓄水容量(m_WM:参数) */

???????????????????? + RB; /* 不透水面上产生的径流*/

????????????}

????????????// 土壤湿度折算净雨量+降水后蒸发剩余雨量<流域内最大含水容量

????????????else

????????????{

????????????????// 流域内的产流深度计算

R = PE /* 降水蒸发后的剩余量???????????????????? + W /* 流域内土壤湿度*/

???????????????????? - m_WM /* 减去流域平均蓄水容量 */

???????????????????? + RB; /* 不透水面上产生的径流*/

????????????}

????????}

????????//三层蓄水量的计算: WU, WL, WD

????????if(WU + P - EU - R <= m_Wum)

????????{ WU = WU + P - EU - R; WL = WL - EL; WD = WD – ED; }

????????else

????????{

????????????WU = m_Wum;

????????????if(WL - EL + ( WU + P - EU - R - m_Wum ) <= m_Wlm )

????????????{

????????????????WL = WL – EL + ( WU + P - EU - R - m_Wum );

????????????????WD = WD - ED;

????????????}

????????????else

????????????{

????????????????WL = m_Wlm;

????????????????if(WD - ED + WL - EL + ( WU + P - EU - R - m_Wum )

- m_Wlm <= m_Wdm )

????????????????????WD = WD - ED + WL - EL

+ (WU + P - EU - R - m_Wum ) - m_Wlm;

????????????else

????????????????????WD = m_Wdm;

????????????}

????????}

????????????W = WU + WL + WD;

????????////三水源划分汇流计算

????????if(PE>0)

????????{

????????????FR = (R - RB) / PE;

????????????AU = MS * (1 - pow((1 - So * FRo/FR/m_SM),1/(1 + m_EX)));

????????????if(PE + AU<MS)

????????????????RS = FR * (PE + So * FRo/FR - m_SM + m_SM * pow((1 - (PE

+ AU) / MS),m_EX + 1));

????????????else if(PE + AU>= MS)

????????????????RS = FR * ( PE + So * Fro / FR - m_SM );

???????????? S = So * Fro / FR + ( R – RS ) / FR;

???????????? RI = m_KI * S * FR;

???????????? RG = m_KG * S * FR;

???????????? RS += RB;

???????????? R = RS + RI + RG;

???????????? So = S * ( 1 - m_KI - m_KG );

???????????? FRo = FR;

????????}

????????else

????????{

????????????S = So;

????????????FR = 1 - pow((1 – S / MS) , m_EX );

????????????RI = 0.00;

????????????RG = 0.00;

????????????So = S * ( 1 - m_KI - m_KG );

????????????RS = RB;

????????????R = RS + RI + RG;

????????????FRo = FR;

????????}

????????////三水源划分计算结束

????????/* 以下部分是状态量:总蒸发量、上、下和深层土壤的蒸发的保存*/

????????/* 1 */????this->m_pE[i] = E; // 当前步长的蒸发(模型重要输出)

????????/* 2 */????this->m_pEu[i] = EU; // 当前步长上层土壤蒸发

????????/* 3 */????this->m_pEl[i] = EL; // 当前步长下层土壤蒸发

????????/* 4 */????this->m_pEd[i] = ED; // 当前步长深层土壤蒸发

????????/* 5 */????this->m_pW[i] = W;???? // 当前步长流域平均土壤含水量

????????/* 6 */????this->m_pWu[i] = WU; // 当前步长流域上层土壤含水量

????????/* 7 */????this->m_pWl[i] = WL; // 当前步长流域下层土壤含水量

????????/* 8 */????this->m_pWd[i] = WD; // 当前步长流域深层土壤含水量

????????/* 9 */????this->m_pRg[i] = RG; // 当前步长流域地下径流深度

????????/* 10 */ this->m_pRi[i] = RI; // 当前步长流域壤中流深度

????????/* 11 */????this->m_pRs[i] = RS; // 当前步长流域地表径流径流深度

????????/* 12 */ this->m_pR[i] = R; // 当前步长的总产流径流深度

????}

????this->Routing();

}

// 保存模拟结果到文件

void XinanjiangModel::SaveResults(char* FileName)

{

????int i;

????FILE * fp;

????if((fp = fopen(FileName,"w")) == NULL)

????{

????????printf("Can not create output file!\n");

????????return;

????}

????fprintf(fp," - -- -- ---- - - -- -- ---- - ------ --- -- ------ - - -- ---- ----- -- - - ------- -- -- - \n");

fprintf(fp," E(mm) EU(mm) EL(mm) ED(mm) W(mm) WU(mm) WL(mm) WD(mm) R(mm) RS(mm) RI(mm) RG(mm) Q(m3/d) QS(m3/d) QI(m3/d) QG(m3/d)\n");

????fprintf(fp," - -- -- -- - - --- -- -- - - -- ----- -- - - -- -- -- - - -- -- --------- - - -- --------- -- -\n");

????for(i = 0;i<this->steps;i++ )

????{????fprintf(fp,"%9.3lf%9.3lf%9.3lf%9.3lf%9.3lf%9.3lf%9.3lf%9.3lf%9.3lf%9.3lf%

9.3lf%9.3lf%9.3lf%9.3lf%9.3lf%9.3lf\n",

????????????this->m_pE[i],this->m_pEu[i],this->m_pEl[i],this->m_pEd[i],

????????????this->m_pW[i],this->m_pWu[i],this->m_pWl[i],this->m_pWd[i],

????????????this->m_pR[i],this->m_pRs[i],this->m_pRi[i],this->m_pRg[i],

????????????this->m_pQ[i],this->m_pQrs[i],this->m_pQri[i],this->m_pQrg[i]);

????}

????fclose(fp);

}

// 进行汇流计算,将径流深度转换为流域出口的流量

void XinanjiangModel::Routing(void)

{

????///////////// 地面径流汇流计算:单位线法 ///////////////////////

????int i,j;

????double B[10000] = {0.00};

????if (this->m_PD == 1)

????{

????????double UH[] ={3.71,12.99,38.96,94.63,131.74,154.00,166.99,176.27,178.12,

172.55,146.58, 90.91,53.80, 31.54,18.55, 9.27, 3.71,0.00};

????????for(i = 0;i<this->m_nSteps;i++ )

????????{

????????????for(j = 0;j<18;j++ )

????????????{ B[i + j] += this->m_pRs[i] * UH[j]/10.0; }

????????}

????}

????else

????{

????????double UH[] ={ 7.18,23.38,63.20,143.10,221.75,365.18,447.40,491.29,

506.93,504.82,468.46,388.56,309.91,166.49,84.26,40.37,17.56,3.46};

????????for(i = 0;i<this->m_nSteps;i++ )

????????{

????????????for(j = 0;j<18;j++ )

????????????{ B[i + j] += this->m_pRs[i] * UH[j]/10.0; }

????????}

????}

????for(i = 0;i<this->steps;i++ )

????????this->m_pQrs[i] = B[i];

????///// 壤中流汇流计算:线性水库

????for(i = 1;i<this->steps;i++ )????{this->m_pQri[i] = this->m_CI * this->m_pQri[i - 1]

+ (1.0 - this->m_CI) * this->m_pRi[i] * this->m_U; }

????///// 地下径流汇流计算:线性水库

????for(i = 1;i<this->steps;i++ )????{this->m_pQrg[i] = this->m_pQrg[i - 1] * this->m_CG

+ this->m_pRg[i] * (1.0 - this->m_CG) * this->m_U; }

????//////单元面积总入流计算

????for(i = 0;i<this->steps;i++ )

????{ this->m_pQ[i] = this->m_pQrs[i] + this->m_pQri[i] + this->m_pQrg[i]; }

}

void XinanjiangModel::Runoff(char * runoff)

{

????int i;

????ofstream outfile;

????outfile.open(runoff);

????if(outfile.is_open())

{

????for(i = 0;i<this->steps;i++ )???? { outfile<<setprecision(3)<<setiosflags(ios::fixed)<<this->m_pQ[i]<<endl; }

}

????????outfile.close();

}

以下是main()函数语句

int _tmain(int argc, _TCHAR * argv[])

{????long nSteps = 942;

????int DeltaT = 24;

????double Area1 = 1603;

????XinanjiangModel Model1;

????Model1.InitModel(nSteps, Area1,DeltaT,1,"LFForcingfile.txt");

//模型参数/*Kc,IM,B,m_Wum,Wlm,Wdm,C,SM,EX,KG,KI,CG,CI

????double Params1[] = {0.50,0.01,0.30,10,60,40,0.18,32,1.2,0.075,0.072,0.94,0.7};

????Model1.SetParameters(Params1);

????Model1.RunModel();

????Model1.SaveResults("来凤站日模型计算结果.txt");

????Model1.Runoff("LF_Q.txt");

????Model1.~XinanjiangModel();

????double Area2 = 2991;

????XinanjiangModel Model2;

????Model2.InitModel(nSteps, Area2,DeltaT,0,"YCForcingfile.txt");

//模型参数/*Kc,IM,B,m_Wum,Wlm,Wdm,C,SM,EX,KG,KI,CG,CI

????double Params2[] = {0.75,0.01,0.32,10,60,40,0.18,27,1.2,0.065,0.067,0.96,0.8};

????Model2.SetParameters(Params2);

????Model2.RunModel();

????Model2.SaveResults("file.txt");

????Model2.Runoff("YC_Q.txt");

????Model2.~XinanjiangModel();

????????FILE *fp1,*fp2;

????double Q1[1000],Q2[1000],Q[1000]={0.00};

????ofstream outfile;

????outfile.open("Q.txt");

????if((fp1=fopen("LF_Q.txt","r"))==NULL)

????{ printf("Can not open the file!\n"); return 0;}

????if((fp2=fopen("YC_Q.txt","r"))==NULL)

????{ printf("Can not open the file!\n"); return 0; }

????if(outfile.is_open())

????{

????????for(int i=0;i<960;i++)

????????{

????????????fscanf(fp1,"%lf",&Q1[i]);

????????????fscanf(fp2,"%lf",&Q2[i]);

????????????Q[i]=Q1[i]+Q2[i];

????????????outfile<<setprecision(3)<<setiosflags(ios::fixed)<<Q[i]<<endl;

????????}

????????fclose(fp1);

????????fclose(fp2);

????}

????outfile.close() ;

????return 0;

}

新安江模型程序C++代码

标签:name   --   output   mes   记录   mil   ++   man   model   

原文地址:https://www.cnblogs.com/yellowhh/p/12038310.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!