logo资料库

新安江C++程序.docx

第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
资料共17页,剩余部分请下载后查看
新安江模型程序C++代码
新安江模型程序 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)
分享到:
收藏