- 积分
 - 2990
 
	- 贡献
 -  
 
	- 精华
 
	- 在线时间
 -  小时
 
	- 注册时间
 - 2015-8-4
 
	- 最后登录
 - 1970-1-1
 
 
 
 
 
 
 | 
	
 
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册 
 
 
 
x
 
 本帖最后由 AnneChen 于 2016-11-9 20:43 编辑  
 
全新手。 
这段时间为了计算整层水汽通量,一会儿摸索Grads,一会儿用matlab。 
Grads自带的vint用来做整层水汽通量积分是最好,但是后续我需要做距平,grads就有些不好用了。 
由于技术有限,我尝试将Grads计算出来的水汽通量dat文件导入matlab中,可是维数不对,也不知道dat的数据是如何存储的。 
因此,我又想用matlab写出类似vint的积分方程,从而利用它来计算水汽通量积分。 
以下是我写的代码,不知道对不对,还请指教。 
 
数据来自NCEP再分析数据 
单位分别为: 
q       g/kg 
u       m/s 
v       m/s 
p      millibar 
 
 
q=ncread('shum.mon.mean.nc','shum'); 
u=ncread('uwnd.mon.mean.nc','uwnd'); 
v=ncread('vwnd.mon.mean.nc','vwnd'); 
 
%计算各层qu,qv 
q1=q(:,:,1:8,1:819); 
u1=u(:,:,1:8,1:819); 
v1=v(:,:,1:8,1:819); 
        for i=1:8 
            for j=1:819 
                if q1(:,:,i,j)>=0 &  -70<u1(:,:,i,j)<125 & -70<v1(:,:,i,j)<70 
                    qu(:,:,i,j)=q1(:,:,i,j).*u1(:,:,i,j); 
                    qv(:,:,i,j)=q1(:,:,i,j).*v1(:,:,i,j); 
                else 
                    qu=NaN; 
                    qv=NaN; 
                end 
            end 
        end 
 
 
%各网格点建立气压层数据,并用地表气压订正。 
lev=ncread('shum.mon.mean.nc','level'); 
ps=ncread('pres.sfc.mon.mean.nc','pres'); 
 
lps=size(ps); 
for k=1:lps(1) 
    for kk=1:lps(2) 
        for kkk=1:lps(3) 
            pss=ps(k,kk,kkk); 
            if pss>=0     
                lll=[pss;lev]; 
                dl=lll(1:end-1)-lll(2:end); 
                dp(k,kk,:,kkk)=dl; %#ok<SAGROW> 
            else  
                lll=[1000;lev]; 
                dl=lll(1:end-1)-lll(2:end); 
                dp(k,kk,:,kkk)=dl; %#ok<SAGROW> 
            end 
        end 
    end 
end 
dp(dp<0)=0;  % 水汽积分是离散求和计算而得。因此这一步在于计算每一层层高。层高是下层减上层之间的差值。 
                       % 由于高海拔地区如青藏高原地表气压可能小于地面气压数据,因此在用地表气压订正的时候,该地区可能出现负值层高。 
                       % 这行代码用来置零。 
 
%对整层水汽积分 
tqup_vint=(100/9.8*sum(qu.*dp,3)/1000); %不知道为何vint里需要乘以100作为scale factor,而且vint函数对其他因子的单位标准是什么?还请指导。 
                                                                     %乘以100的目的应该是将milibar 转换为100hpa。(感谢网友热心回答) 
tqvp_vint=(100/9.8*sum(qv.*dp,3)/1000);   % unit: kg/(ms) 
tqup=squeeze(tqup_vint); 
tqvp=squeeze(tqvp_vint); 
 
 
 
  
 
 |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |