新安江模型程序 C++代码
以下是类的声明:
class XinanjiangModel
{
private:
// FORCING
double *m_pP;
double *m_pEm;
//
long 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;
// SOIL
double *m_pW;
double *m_pWu;
double *m_pWl;
double *m_pWd;
double m_Wum;
double m_Wlm;
// 降水数据
// 水面蒸发数据
// 模型要运行的步长(一共m_nSteps步)
// 流域内每一步长的产流量(径流深度)
// 每一步长的地表径流深(毫米)
// 每一步长的壤中流深(毫米)
// 每一步长的地下径流深(毫米)
// 每一步长的蒸发(毫米)
// 流域出口地表径流量
// 流域出口壤中流径流流量
// 流域出口地下径流量
// 流域出口的总流量
// for 24h. U=A(km^2)/3.6/delta_t
// 流域内土壤湿度
// 流域内上层土壤湿度
// 流域内下层土壤适度
// 流域内深层土壤湿度
// 流域内上层土壤蓄水容量
// 流域内下层土壤蓄水容量
// 流域内深层土壤蓄水容量,WDM=WM-WUM-WLM
// 上层土壤蒸发量(毫米)
// 下层土壤蒸发量(毫米)
// 深层土壤蒸发量(毫米)
// 流域蒸散发能力与实测蒸散发值的比
// 不透水面积占全流域面积之比
// 蓄水容量曲线的方次,小流域(几平方公里)B0.1左右
// 中等面积(平方公里以内).2~0.3,较大面积.3~0.4
// 流域平均蓄水容量(毫米)(WM=WUM+WLM+WDM)
// 流域内深层土壤蒸发系数,江南湿润地区:0.15-0.2,
//华北半湿润地区:.09-0.12
//自由水蓄水容量
//自由水蓄水容量~面积分布曲线指数
//地下水日出流系数
//壤中流日出流系数
//地下水消退系数
//壤中流消退系数
// 单元流域上地面径流的单位线
// 流域内最大蓄水容量
// 流域面积
// 每一步长的小时数
// 给定数据,用以判断是否时行河道汇流计算
double m_Wdm;
// EVAPORATION
double *m_pEu;
double *m_pEl;
double *m_pEd;
//runoff
double *RF;
// PARAMETER
double m_Kc;
double m_IM;
double m_B;
double m_WM;
double m_C;
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
#include
#include
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;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("Can not open forcing file!\n");return; }
for(i = 0;im_nSteps;i++ )
{
fclose(fp);
fscanf(fp,"%lf%lf",&(this->m_pP[i]),&(this->m_pEm[i])); }
}
// 设置模型参数
void XinanjiangModel::SetParameters(double* Params)
{
this->m_Kc = Params[0];
this->m_IM = Params[1];
this->m_B = Params[2];
this->m_Wum = Params[3];
this->m_Wlm = Params[4];
this->m_Wdm = Params[5];
this->m_C = Params[6];
this->m_SM = Params[7];
this->m_EX = Params[8];
// (1) 流域蒸散发能力与实测水面蒸发之比
// (2) 流域不透水面积占全流域面积之比
// (3) 蓄水容量曲线的方次
// (4) 上层蓄水容量
// (5) 下层蓄水容量
// (6) 深层蓄水容量
// (7) 深层蒸散发系数
// (8)自由水蓄水容量
// (9)自由水蓄水容量~面积分布曲线指数
this->m_KG = Params[9];
this->m_KI = Params[10];
this->m_CG = Params[11];
this->m_CI = Params[12];
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);
// (10)地下水日出流系数
// (11)壤中流日出流系数
// (12)地下水消退系数
// (13)壤中流消退系数
}
// 运行新安江模型
void XinanjiangModel::RunModel(void)
{
// > 0 时为净雨量;< 0 为蒸发不足量(mm)
//m_Kc * m_pEm[i]
// 产流深度,包括地表径流、壤中流和地下径流(mm)
// 不透水面上产生的径流深度(mm)
// 地下径流深度(mm)
// 壤中流深度(mm)
// 地表径流深(mm)
//土壤湿度为W时土壤含水量折算成的径流深度(mm)
long i;
// 模型的状态变量
double PE;
double Ep;
double P;
double R;
double RB;
double RG;
double RI;
double RS;
double A;
double E = 0.0;
double EU = 0.0;
double EL = 0.0;
double ED =0.0;
double S;
double FRo;
double FR;
double MS;
double AU;
// 蒸散发(mm)
// 上层土壤蒸散发量(mm)
// 下层土壤蒸散发量(mm)
// 深层土壤蒸散发量(mm)