[这个贴子最后由first在 2007/04/14 06:09pm 编辑]
从今天起想做一个系列,争取每天都能和大家分享一点NCL的东西,希望能得到大家的支持,本人也是新手,有写错的请及时指正,共同进步。 :em12:
今天就从安装开始(本人不推荐在windows下面用这个软件,所以只写在linux下如何安装)
NCL的下载地址:
http://www.earthsystemgrid.org 在这个网站上下东西要有注册帐号,申请一下就行了,一般要等一两天才能申请成功,所以新用户要耐心等待了。
先弄清楚自己linux的类型,选择相应的版本下载。例如:我得linux版本是fedora4,32位机,我选择 ncl-4.2.0.a033.Linux_i686.tar.gz
安装步骤:
1.首先确定要安装在那个目录下,推荐/usr/local
2.cd /usr/local
解压文件:gunzip ncl-4.2.0.a033.Linux_i686.tar.gz 生成ncl-4.2.0.a033.Linux_i686.tar
打开压缩包:tar -xvf ncl-4.2.0.a033.Linux_i686.tar,这时就会生成一系列的文件。
3.设定环境变量:
如果你在csh下
setenv NCARG_ROOT /usr/local
set path=(/usr/local/bin $path)
如果你在bash下
export NCARG_ROOT=/usr/local
export PATH=(/usr/local/bin $PATH)
可以把这些命令加到.cshrc 和 .bashrc 中,免得每次要用的时候现敲命令
4.检查NCL是否安装成功:
在shell命令行敲入ncl,如果出现的都是版本信息,没有警告,那就是安装成功了。
注意:建议新手在安装linux的时候选择完全安装,否则再装NCL的时候会找不到一些库文件。
今天就到这,明天介绍NCL中的一些基本的概念。
2.NCL简单语法、读取nc文件
[这个贴子最后由first在 2007/04/14 12:42pm 编辑]
进入ncl的两种方法:
1.直接在shell命令行输入ncl,就能进入ncl,然后一条一条执行命令,这种是交互式的执行方式。
2.编好一个ncl脚本,在shell命令行输入ncl filename.ncl就可以了,这种是批处理的执行方式。
一些特殊的行:注释行; 续行 \
数据类型:
数值型:double(64 bit) , float(32 bit), long(32 bit), integer(32 bit), short(16 bit),byte(8 bit),不支持complex。
非数值型:字符串(string)、字符(character)、图形(graphic)、文件(file)、逻辑型(logical)、列表(list)
运算符:
+ 加法,也用在字符串的连接中
- 减法
* 乘法
^ 指数运算
% 求模 (只适用于整数)
# 矩阵相乘
>,< 大于、小于
逻辑运算符:
.lt. 小于
.le. 小于等于
.gt. 大于
.ne. 不等于
.eq. 等于
.and. 和、并且
.or. 或
.xor. exclusive or除……或
.not. 非
变量:
ncl中的变量名必须以字母开头,但是后面可以是数值字母混合,下划线_也可以用在变量名中。每个变量都有其附属的信息(也称作meta data),这些附属的信息可以通过ncl的命令来获得、建立、修改、删除。
eg :
> ncl ; 进入到ncl
> f=addfile("ho.contr.TEMP.mon.nc","r") ;以只读的方式打开文件ho.contr.TEMP.mon.nc ,这时f就是文件的属性信息了
> print(f) ;查看f的值,print是ncl中显示变量值的命令,下面就是一个输出的例子,文件头没有给出
dimensions:
time = 360 // unlimited
lev = 32
lat = 128
lon = 128
variables:
float TEMP ( time, lev, lat, lon )
long_name : Temperature
units : C
missing_value : 9e+20
float lat ( lat )
long_name : latitude
units : degrees_north
float lev ( lev )
long_name : ocean depth
units : meters
float lon ( lon )
long_name : longitude
units : degrees_east
float time ( time )
long_name : time
units : days since 0000-01-01 00:00:00
从输出的信息我们就能看到这个文件有5个变量、其中有四个是坐标变量、一个是温度变量,温度是四维的变量,还可以看见每个变量的维数,各个维的长度,维的名称、单位等等。
读取变量TEMP的值:
temp=f->TEMP ; 把文件f中的变量TEMP赋给temp,一定要注意文件中变量名的大小写,当然temp你可以随便命名。
这是最好不要print(temp),因为我们可以看到temp是个(360*32*128*128)得数组,如果你想刷屏那可以这么做。
这是想看变量的信息可以通过命令printVarSummary(temp)来看
> printVarSummary(temp)
Variable: temp
Type: float
Total Size: 754974720 bytes
188743680 values
Number of Dimensions: 4
Dimensions and sizes: [time | 360] x [lev | 32] x [lat | 128] x [lon | 128]
Coordinates:
time: [281910..292680]
lev: [-5500..-20]
lat: [-89.29688..89.29688]
lon: [1.40625..358.5938]
Number Of Attributes: 3
long_name : Temperature
units : C
missing_value : 9e+20
还可以抽出变量中的一部分数据来读: ncl中变量的维数是从0开始的(要切记)
temp=f->TEMP ; 这就是把TEMP的所有值都读出来
temp2=f->TEMP(0,31,:,:) ;这就是取第一时刻,第32层的所有温度值
temp3=f->TEMP(0,31,::5,:) ; 取第一时刻,第32层,每隔5个纬度,所有经度取值
temp2,temp3现在就是一个平面的数据了,这就是所谓的维数退化(dimension reduction),这时可以print(temp2)
通过这种addfile,f->TEMP的赋值方式,TEMP中的所有meta data也同时被赋过去。
变量维数及属性表示方法:
@ 表示变量的属性,例如我要看temp的单位属性
ncl 8> print(temp@units)
(0) C
就告诉你单位是度,常用的变量属性有units,_FillValue,missing_value,long_name
!表示变量的维的名称,例如变量temp第一维的名称
ncl 7> print(temp!0)
(0) time
第一维的名称是time
& 表示变两维的数值,例如变量temp第二维的数值
ncl 9> print(temp&lev)
Variable: lev (coordinate)
Type: float
Total Size: 128 bytes
32 values
Number of Dimensions: 1
Dimensions and sizes: [lev | 32]
Coordinates:
Number Of Attributes: 2
long_name : ocean depth
units : meters
(0) -5500
(1) -5000
(2) -4500
(3) -4000
(4) -3500
(5) -3000
(6) -2500
(7) -2000
(8) -1800
(9) -1600
(10) -1400
(11) -1200
(12) -1000
(13) -900
(14) -800
(15) -700
(16) -600
(17) -500
(18) -450
(19) -400
(20) -350
(21) -300
(22) -250
(23) -200
(24) -175
(25) -150
(26) -125
(27) -100
(28) -80
(29) -60
(30) -40
(31) -20
一般要察看一个为数不大的维的信息,我们就可以print(var&dimname),这样维的信息基本上就都显示出来了
3.用NCL输出nc文件
[这个贴子最后由first在 2007/04/15 08:01pm 编辑]
用ncl输出nc文件很简单,主要是建立空白文件、计算变量、给变量附加属性、输出到文件中。
1.要建立一个空白的文件:
out=addfile("dataname.nc","c") ; 这里的c就是create的意思,在创建文件是要保证文件不存在,否则系统会提示错误,所以一般会在这句话前加上 system("rm -f dataname.nc")
2.要准备好要输出的变量,例如我要输出变量u(time,lev,lat,lon)
3.给变量附属性:
u!0="time"
u&time=ispan(1,360,1) ; 这里是创建一个时间序列1,2,3……360
u!1="lev"
u&lev=f->var&lev ; 输出变量u的高度层和文件中var的高度层是一样的
u!2="lat"
u&lat=lat
u!3="lon" ; 这里的lat必须是已经知道的一个数组
u&lon=lon
u@long_name="zonal wind component"
u@units="m/s"
4.输出变量
out->U=u
这样就完成文件的创建了。通过读如旧文件,输出新文件可以修改变量的属性(时间轴、单位等)。