DHSVM结果文件处理程序

DHSVM的一些水文成分(比如降雨蒸散发等)是输出在Mass.Balance这个文件中,按照模拟的时间步长输出的。

如下:

但是实际我们可能关系的是在daily,monthly or yearly的尺度上的结果,方便分析比较。为此我写了一个MATLAB程序能把这个文件输出到三个不同的文件,分别代表daily, montly, yearly的结果。

下面是代码的头文件,需要用户自定义一些:

%% This Code is used to sumarized the default output of DHSVM (Mass.Balance)

%  Initally created by LING ZHANG, zhanglingky@lzb.ac.cn

%  The result is in Excel format; note:the Begining day should be 01/01 if

%  you want to summarize yearly data

%% The meaning for each colunmn

% Total runoff

% Total amount of water in the canopy

% Total amount of water in the soil

% Total amount of snow water equivalent

% Total amount of saturated subsurface flow

% Total amount of water intercepted by channels

% Total amount of water intercepted by roads

% Total amount of water returned by culverts to the land surface

% Total amount of evapotranspiration

% Total amount of precipitation

% Total amount of sublimation from snow on the ground

% To[……]

Read more

VIC模型对气象数据进行时间降尺度

DHSVM模型需要subdaily的气象数据,而一般气象站只有daily的数据。为此,我将VIC模型的自带的气象数据的Meteorological Forcing Disaggregation模块,比较粗略的抠出来了,使其可以方便的使用于气象数据时间降尺度,从而满足DHSVM模型模型的数据要求。否则,直接采用原来的VIC模型,对于新手,比较复杂。 抠出来的代码我已经编译了,然后放在这里共享。程序输入为daily的气象台站数据,然后输出subdaily数据,格式完全和DHSVM对应。因此可以直接驱动DHSVM数据。 关于这个程序,我写了个简单说明: #****************************************************************************# This program is used to disaggregate daily meterological data to subdaily intervals(1, 3, 6 hours) using the VIC model, for the utilization of DHSVM. The resultant data can be used to driving DHSVM directly.   Usage:(1) Open current dir CMD, cmd: VIC_Mete -g global_param.example (2) Double click VIC_Mete.bat   $Author: LING ZHANG, zhanglingky@lzb.ac.cn, xiaolingzi.com #****************************************************************************# 1.  Data Preparation: (1) First, preparing the (station) meterological data. The file name should be station_latitute(user-defined)_Longitute(user-defined). The format of the file should be prep[……]

Read more

Arcgis可视化DHSVM的streamnetwork

问题是这样的,现在我手上有DHSVM的test site data,现在我想可视化stream,这需要做一些处理。

DHSVM的输入数据中包含了stream.map文件,格式如下:

现在我需要将这个文件在Arcgis中转为可视化文件。

(1)采用MATLAB,将上述文件转化为ACII文件,没有的数据设置为-9999;

(2) 添加header file,这样得到Arcgis需要的标准的ACII文件。

(3) 采用Arcgis中ASCII to Raster工具进行转化,OK!

现在我想对dem进行渲染。工具:3D Analyst Tools–>Raster Surface–>Hillshade;

得到渲染的图dem_shadow,将原来dem放在渲染图之上,并设置透明度为50%。现在看起来很有立体感。

主成分分析(PCA )

关于主成分(PCA)分析,其实在上大学时就已经接触到了,当时感觉也没弄得十分清楚。前面花了点时间,来重新figure it out.

(1)真实的训练数据总是存在各种各样的问题:

1、 比如拿到一个汽车的样本,里面既有以“千米/每小时”度量的最大速度特征,也有“英里/小时”的最大速度特征,显然这两个特征有一个多余。

2、 拿到一个数学系的本科生期末考试成绩单,里面有三列,一列是对数学的兴趣程度,一列是复习时间,还有一列是考试成绩。我们知道要学好数学,需要有浓厚的兴趣,所以第二项与第一项强相关,第三项和第二项也是强相关。那是不是可以合并第一项和第二项呢?

3、 拿到一个样本,特征非常多,而样例特别少,这样用回归去直接拟合非常困难,容易过度拟合。比如北京的房价:假设房子的特征是(大小、位置、朝向、是否学区房、建造年代、是否二手、层数、所在层数),搞了这么多特征,结果只有不到十个房子的样例。要拟合房子特征->房价的这么多特征,就会造成过度拟合。

4、 这个与第二个有点类似,假设在IR中我们建立的文档-词项矩阵中,有两个词项为“learn”和“study”,在传统的向量空间模型中,认为两者独立。然而从语义的角度来讲,两者是相似的,而且两者出现频率也类似,是不是可以合成为一个特征呢?

5、 在信号传输过程中,由于信道不是理想的,信道另一端收到的信号会有噪音扰动,那么怎么滤去这些噪音呢?

对于上述问题,PCA能很好解决。

(2) PCA的原理

理论基础:在信号处理中认为信号具有较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好。

基本思想:主成分分析是采取一种数学降维的方法,找出几个综合变量来代替原来众多的变量,使这些综合变量能尽可能地代表原来变量的信息量,而且彼此之间互不相关。这种将把多个变量化为少数几个互相无关的综合变量的统计分析方法就叫做主成分分析或主分量分析。主成分分析所要做的就是设法将原来众多具有一定相关性的变量,重新组合为一组新的相互无关的综合变量来代替原来变量。通常,数学上的处理方法就是将原来的变量做线性组合,作为新的综合变量,但是这种组合如果不加以限制,则可以有很多,应该如何选择呢?如果将选取的第一个线性组合即第一个综合变量记为F1,自然希望它尽可能多地反映原来变量的信息,这里“[……]

Read more

DHSVM Subdailiy to Daily streamflow

Update 2016/11/30

今天我又重新写了subdaily to monthly的程序,现在放在这里一并和大家分享。

截个图:

DHSVM_stream.rar

DHSVM模型流域出口的河川径流的格式(3小时为例):

现在要将Subdaily的streamflow转化为daily,我写了一个C的程序来实现,先贴结果.

源代码如下:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define MaxLine 1024

int main(int argc, char *argv[])

{

FILE *InputFid, *OutputFid;

int TempStrComp, CountForDay;

long offset;

char strline01[MaxLine];

char StartLine[MaxLine];

double TempDischarge, ReadDischarge, MeanDailyDischarge;

char StrDate01[11],TempStrDate[11];

const char  *input_name = “Streamflow.Only”;

const char  *Output_name = “Streamflow_daily.Only”;

char *TempStrDischarge;

if ((InputFid=fopen(input_name,”r”))==NULL){

printf(“Open %s Failed”, input_name);

return;

}

if ((OutputFid=fopen(Output_name,”w+”))==NULL){

printf(“Open %s Failed”, Output_name);

return;

}

/* Write header, DATE OUTLET */

fgets(strline01,MaxLine,InputF[……]

Read more