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

上传人:b****7 文档编号:11232668 上传时间:2023-02-26 格式:DOCX 页数:20 大小:20.94KB
下载 相关 举报
新安江模型程序C++代码.docx_第1页
第1页 / 共20页
新安江模型程序C++代码.docx_第2页
第2页 / 共20页
新安江模型程序C++代码.docx_第3页
第3页 / 共20页
新安江模型程序C++代码.docx_第4页
第4页 / 共20页
新安江模型程序C++代码.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

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

《新安江模型程序C++代码.docx》由会员分享,可在线阅读,更多相关《新安江模型程序C++代码.docx(20页珍藏版)》请在冰豆网上搜索。

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

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

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

以下是类的声明:

classXinanjiangModel

{

private:

//FORCING

double*m_pP;//降水数据

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

//

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

longsteps;

//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;//流域出口的总流量

doublem_U;//for24h.U=A(km^2)/3.6/delta_t

//SOIL

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

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

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

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

doublem_Wum;//流域内上层土壤蓄水容量

doublem_Wlm;//流域内下层土壤蓄水容量

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

//EVAPORATION

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

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

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

//runoff

double*RF;

//PARAMETER

doublem_Kc;//流域蒸散发能力与实测蒸散发值的比

doublem_IM;//不透水面积占全流域面积之比

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

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

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

doublem_C;//流域内深层土壤蒸发系数,江南湿润地区:

0.15-0.2,

//华北半湿润地区:

.09-0.12

doublem_SM;//自由水蓄水容量

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

doublem_KG;//地下水日出流系数

doublem_KI;//壤中流日出流系数

doublem_CG;//地下水消退系数

doublem_CI;//壤中流消退系数

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

doublem_WMM;//流域内最大蓄水容量

doublem_Area;//流域面积

intm_DeltaT;//每一步长的小时数

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

public:

XinanjiangModel(void);

~XinanjiangModel(void);

//初始化模型

voidInitModel(longnSteps,doubleArea,intDeltaT,intPD,char*ForcingFile);

//设置模型参数

voidSetParameters(double*Params);

//运行新安江模型

voidRunModel(void);

//保存模拟结果到文件

voidSaveResults(char*FileName);

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

voidRunoff(char*runoff);

private:

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

voidRouting(void);

};

以下是类的定义

#include"stdafx.h"

#include"xinanjiangmodel.h"

#include

#include

#include

usingnamespacestd;

#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;

}

//初始化模型

voidXinanjiangModel:

:

InitModel(longnSteps,doubleArea,intDeltaT,intPD,char*ForcingFile)

{

FILE*fp;

inti;

this->m_nSteps=nSteps;

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

//驱动数据

this->m_pP=newdouble[this->steps];

this->m_pEm=newdouble[this->steps];

//模型输出,蒸散发项

this->m_pE=newdouble[this->steps];

this->m_pEd=newdouble[this->steps];

this->m_pEl=newdouble[this->steps];

this->m_pEu=newdouble[this->steps];

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

this->m_pQrg=newdouble[this->steps];

this->m_pQrs=newdouble[this->steps];

this->m_pQri=newdouble[this->steps];

this->m_pQ=newdouble[this->steps];

//模型输出,产流项

this->m_pR=newdouble[this->steps];

this->m_pRg=newdouble[this->steps];

this->m_pRi=newdouble[this->steps];

this->m_pRs=newdouble[this->steps];

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

this->m_pW=newdouble[this->steps];

this->m_pWd=newdouble[this->steps];

this->m_pWl=newdouble[this->steps];

this->m_pWu=newdouble[this->steps];

//runoff值

this->RF=newdouble[this->steps];

for(i=0;isteps;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("Cannotopenforcingfile!

\n");return;}

for(i=0;im_nSteps;i++)

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

fclose(fp);

}

//设置模型参数

voidXinanjiangModel:

:

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);

}

//运行新安江模型

voidXinanjiangModel:

:

RunModel(void)

{

longi;

//模型的状态变量

doublePE;//>0时为净雨量;<0为蒸发不足量(mm)

doubleEp;//m_Kc*m_pEm[i]

doubleP;

doubleR;//产流深度,包括地表径流、壤中流和地下径流(mm)

doubleRB;//不透水面上产生的径流深度(mm)

doubleRG;//地下径流深度(mm)

doubleRI;//壤中流深度(mm)

doubleRS;//地表径流深(mm)

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

doubleE=0.0;//蒸散发(mm)

doubleEU=0.0;//上层土壤蒸散发量(mm)

doubleEL=0.0;//下层土壤蒸散发量(mm)

doubleED=0.0;//深层土壤蒸散发量(mm)

doubleS;

doubleFRo;

doubleFR;

doubleMS;

doubleAU;

doubleWU=5.0;//流域内上层土壤湿度

doubleWL=55.0;//流域内下层土壤适度

doubleWD=40.0;//流域内深层土壤湿度

doubleW=100.0;

doubleSo=5.0;

MS=m_SM*(1+m_EX);

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

for(i=0;im_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;}

elseif((WU+P)

{

EU=WU+P;

if(WL>=(m_C*m_Wlm))

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

elseif((m_C*(Ep-EU))<=WL&&WL<(m_C*m_Wlm))

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

elseif(WL

{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)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

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

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

elseif(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();

}

//保存模拟结果到文件

voidXinanjiangModel:

:

SaveResults(char*FileName)

{

inti;

FILE*fp;

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

{

printf("Cannotcreateoutputfile!

\n");

return;

}

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

fprintf(fp,"E(mm)EU(mm)EL(mm)ED(mm)W(mm)WU(mm)WL(mm)WD(m

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 化学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1