爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 7817|回复: 10

NCL数组无法创建的问题

[复制链接]

新浪微博达人勋

发表于 2018-1-23 20:56:12 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
NCL编程时有个关于数组创建的报错,百度之后了解到可能因为数组的内存过大。数组維数(840,17,73,144),出于数据分析需要,我不太想将数组截取。但是我一共创建了三个相同維数的数组,一开始运行后并未报错,多次运行后报错了,然后我删去一个数组,还剩两个,多次运行成功后又报错了,求教各位路过的大佬。抱拳了:)
2018-01-23 20-55-03屏幕截图.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-1-24 08:30:29 | 显示全部楼层
按float型算了下,你这一个数值不到600 mb大小,三个数值不到2G,不一定是内存不足的问题。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-1-25 00:18:32 | 显示全部楼层
御风者 发表于 2018-1-24 08:30
按float型算了下,你这一个数值不到600 mb大小,三个数值不到2G,不一定是内存不足的问题。

好的,我再找找原因。谢谢!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-1-25 14:51:18 | 显示全部楼层
(840,17,73,144)改为(/840,17,73,144/)
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-1-26 09:05:07 | 显示全部楼层
liyf 发表于 2018-1-25 14:51
(840,17,73,144)改为(/840,17,73,144/)

我创建的时候就是用的(/840,17,73,144/)
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-1-26 12:19:52 | 显示全部楼层
独一吖 发表于 2018-1-26 09:05
我创建的时候就是用的(/840,17,73,144/)

脚本贴出来
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-1-26 22:55:53 | 显示全部楼层

begin
  2
  3 pf=addfile("/home/hlq/NCL/data/qingzang/pres.mon.mean.nc","r")
  4 af=addfile("/home/hlq/NCL/data/qingzang/air.mon.mean.nc","r")
  5 of=addfile("/home/hlq/NCL/data/qingzang/omega.mon.mean.nc","r")
  6 uf=addfile("/home/hlq/NCL/data/qingzang/uwnd.mon.mean.nc","r")
  7 vf=addfile("/home/hlq/NCL/data/qingzang/vwnd.mon.mean.nc","r")
  8
  9 pres =pf->pres
10 air  =af->air
11 omega=of->omega
12 u    =uf->uwnd
13 v    =vf->vwnd
14 ;time =pf->time
15 ;date =cd_calendar(time,1)
16 level =af->level
17 ;level=of->level
18 ;print(level)
19 demo=air(0:199,:,:,:)
20
21 ;potem=new((/840,17,73,144/),float)
22 ;potem=0
23
24
25 print(level)
26
27 ;select the lowest level
28 ppres=new(dimsizes(pres),typeof(pres))
29 ip=new((/200,73,144/),integer)
30 do tt=0,199
31   do j=0,72
32       do i=0,143
33       l=0
34      do while(pres(tt,j,i).le.level(l))
35         l=l+1
36      end do
37        ppres(tt,j,i)=level(l)
38        ip(tt,j,i)=l
39        end do
40     end do
41  end do
42 ;
43 ;;print(ppres(0,:,:))
44 ;
45 ;compute potential temperature
46 potem=new(dimsizes(demo),typeof(demo))
47 do tt=0,199
48    do l=0,16
49      do j=0,72
50         do i=0,143
51         potem(tt,l,j,i)=air(tt,l,j,i)*((level(l)/1000)^0.286)
52         end do
53      end do
54     end do
55  end do
56
57 ;compute temperature advection
58 a=6371000
59 pi=3.41592
60 dy=278000
61 dlamda=278000
                      begin
  2
  3 pf=addfile("/home/hlq/NCL/data/qingzang/pres.mon.mean.nc","r")
  4 af=addfile("/home/hlq/NCL/data/qingzang/air.mon.mean.nc","r")
  5 of=addfile("/home/hlq/NCL/data/qingzang/omega.mon.mean.nc","r")
  6 uf=addfile("/home/hlq/NCL/data/qingzang/uwnd.mon.mean.nc","r")
  7 vf=addfile("/home/hlq/NCL/data/qingzang/vwnd.mon.mean.nc","r")
  8
  9 pres =pf->pres
10 air  =af->air
11 omega=of->omega
12 u    =uf->uwnd
13 v    =vf->vwnd
14 ;time =pf->time
15 ;date =cd_calendar(time,1)
16 level =af->level
17 ;level=of->level
18 ;print(level)
19 demo=air(0:199,:,:,:)
20
21 ;potem=new((/840,17,73,144/),float)
22 ;potem=0
23
24
25 print(level)
26
27 ;select the lowest level
28 ppres=new(dimsizes(pres),typeof(pres))
29 ip=new((/200,73,144/),integer)
30 do tt=0,199
31   do j=0,72
32       do i=0,143
33       l=0
34      do while(pres(tt,j,i).le.level(l))
35         l=l+1
36      end do
37        ppres(tt,j,i)=level(l)
38        ip(tt,j,i)=l
39        end do
40     end do
41  end do
42 ;
43 ;;print(ppres(0,:,:))
44 ;
45 ;compute potential temperature
46 potem=new(dimsizes(demo),typeof(demo))
47 do tt=0,199
48    do l=0,16
49      do j=0,72
50         do i=0,143
51         potem(tt,l,j,i)=air(tt,l,j,i)*((level(l)/1000)^0.286)
52         end do
53      end do
54     end do
55  end do
56
57 ;compute temperature advection
58 a=6371000
59 pi=3.41592
60 dy=278000
61 dlamda=278000
                       phi=new((/73/),float)
63 dx=new((/73/),float)
64 do j=0,72
65    phi(j)=(-90+2.5*j)/180*pi
66    dx(j)=dlamda*cos(phi(j))
67 end do
68
69 temadv=new(dimsizes(demo),typeof(demo))
70 ;temadv=new((/200,17,73,144/),float)
71 do tt=0,199
72    do j=0,72
73        do i=0,143
74           ipp=ip(tt,j,i)
75           do l=ipp,16
76         if (j.eq.0) then
77           if (i.eq.0) then
78           temadv(tt,l,j,i)=u(tt,l,j,i)*(air(tt,l,j,1)-air(tt,l,j,142))/2/dx(j)+v(tt,l,j,i)*(air(tt,l,j+1,i)-air(tt,l,j,i))/dy-u(tt,l,j,i)/a*tan(phi(j))
79           else if(i.eq.143) then
80           temadv(tt,l,j,i)=temadv(tt,l,j,0)
81           else
82           temadv(tt,l,j,i)=u(tt,l,j,i)*(air(tt,l,j,i+1)-air(tt,l,j,i-1))/2/dx(j)+v(tt,l,j,i)*(air(tt,l,j+1,i)-air(tt,l,j,i))/dy-u(tt,l,j,i)/a*tan(phi(j))
83           end if
84           end if
85
86         else if(j.eq.72) then
87           if(i.eq.0) then
88           temadv(tt,l,j,i)=u(tt,l,j,i)*(air(tt,l,j,1)-air(tt,l,j,142))/dx(j)/2+v(tt,l,j,i)*(air(tt,l,j,i)-air(tt,l,j-1,i))/dy-u(tt,l,j,i)/a*tan(phi(j))
89           else if(i.eq.143) then
90           temadv(tt,l,j,i)=temadv(tt,l,j,0)
91           else
92           temadv(tt,l,j,i)=u(tt,l,j,i)*(air(tt,l,j,i+1)-air(tt,l,j,i-1))/2/dx(j)+v(tt,l,j,i)*(air(tt,l,j,i)-air(tt,l,j-1,i))/dy-u(tt,l,j,i)/a*tan(phi(j))
93           end if
94           end if
95
96         else
97           if(i.eq.0) then
98           temadv(tt,l,j,i)=u(tt,l,j,i)*(air(tt,l,j,i+1)-air(tt,l,j,142))/2/dx(j)+v(tt,l,j,i)*(air(tt,l,j+1,i)-air(tt,l,j-1,i))/2/dy-u(tt,l,j,i)/a*tan(phi(j))
99           else if(i.eq.143) then
100           temadv(tt,l,j,i)=temadv(tt,l,j,0)
101           else
102           temadv(tt,l,j,i)=u(tt,l,j,i)*(air(tt,l,j,i+1)-air(tt,l,j,i-1))/2/dx(j)+v(tt,l,j,i)*(air(tt,l,j+1,i)-air(tt,l,j-1,i))/2/dy-u(tt,l,j,i)/a*tan(phi(j))
103           end if
104           end if
105
106         end if
107         end if
108         end do
109        end do
110      end do
111   end do
112  end
                                                                       
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-1-26 22:56:52 | 显示全部楼层
独一吖 发表于 2018-1-26 22:55
begin
  2
  3 pf=addfile("/home/hlq/NCL/data/qingzang/pres.mon.mean.nc","r")

我时间維只取了前200,这样就可以运行出来。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-1-29 14:13:46 | 显示全部楼层
独一吖 发表于 2018-1-26 22:56
我时间維只取了前200,这样就可以运行出来。

抱歉,没有看出明显错误在。
你的第19行应该是取得时间维200,变量demo只是在计算位温时有用,你可以单独放到另一各ncl程序用运行。
PS1:但是我给你一个计算位温的简单方法:
   lev           = af->level
   p=lev*1.0
theta=new((/time,level,lat,lon/),"float")
do j = 0,36;这是你的层次数
theta(:,j,:,:) = t1(:,j,:,:)*(1000./p(j))^0.2857
end do
PS2:看你的程序应该是初学ncl,建议尽量不要使用循环,能用数组运算尽量用数组(我给你的这个计算位温例子,还可以优化),能用函数尽量用函数(ncl有计算梯度的函数,你可用来计算温度平流)
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-1-30 09:44:53 | 显示全部楼层
liyf 发表于 2018-1-29 14:13
抱歉,没有看出明显错误在。
你的第19行应该是取得时间维200,变量demo只是在计算位温时有用,你可以单 ...

非常感谢!!学到啦
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表