Duxy's

a digged hole

NCL初试

很早就听说NCL是气象里一个比较好用的东东,但一直没能好好研究一下。其实也是一直不想太深入发展。但此次交流,发现仅仅让对方提供NCL的模板是不够的,作为项目实施者,必须要对客户业务非常了解,那么了解NCL也就成了必须。也罢,反正这几天什么新语言都接触一下,就把NCL拿来玩玩吧。

NCL的头

一上来就闹了一个笑话,我给对方说好像脚本里引用的好多文件你都没给我啊,结果被BS了。
在NCL的一开始的时候,也会有类似C语言一样的include,不过它不叫include,见下了,按格式写就Ok了。

load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"

接下来就是一个begin end括起来的代码段。

画图

画图是NCL的重点,所以使用起来也非常的方便,把代码贴在下面,应该非常容易就看懂了。
第一种是啥都不配,直接上的。这里的DEMO用了画坐标图的函数。

wks = gsn_open_wks("x11","gsun01n")
plot = gsn_xy(wks,x,y,False)

另一种是有一堆环境配置,在这里被称作资源配置,配完后上的。这里用了等值线图的函数。

resources = True

resources@... = ... ;这里需要好好配置一下

xwks = gsn_open_wks("x11","gsun02n")
plot = gsn_contour(xwks,EAct,resources)

ASCII文件的读入

ASCII文件的读入看起来挺暴力的,从DEMO来看,好像是直接默认列宽是一样的,尚未研究是否还有其他方式。

data = asciiread(filename,(/129,4/),"float")

上述代码是指从文件中按129行4列读入数据。读进来以后,再对数据进行切分。

NC文件的读入

相比之下,NC文件的读入就算太优雅了。

cdf_file = addfile(filename,"r")
pres = cdf_file->Psl(0,:,:)               ; pressure at mean sea level1
lat  = cdf_file->lat                      ; latitude
lon  = cdf_file->lon                      ; longitude

需要注意的是,这里的Psl是nc文件中定义的一个变量,它是3维的,但这里控制第一维为0,因而读出来的是一张表。如果需要读3维,直接使用Psl(:,:,:)就可以了。

资源的定义

资源用来配置图片显示效果,参数巨多,估计用到什么就查什么就好了。

resources                 = True
resources@cnMonoLineColor = False
resources@cnFillOn          = True

resources@tiXAxisString    = lon@long_name
resources@tiYAxisString    = lat@long_name
resources@tiMainString    = pres@long_name

上述就是一个资源的简单配的方法,它配了填充、横轴描述、纵轴描述、标题。然后在画图是传进去就可以了。
感觉资源文件好像可以单独的配成一个文件哪,后面再好好研究一下。

自定义色标

我个人还是比较看重色标的,在这里定义起来也简单。

cmap = (/(/1.,0.,0./),(/0.,1.,1./)/)
gsn_define_colormap(xwks,cmap)

一些肯定会用到的函数

为了提高效率,NCL不能使用循环,需要循环的都得用矩阵运算来代替。那么有些函数是必须的了,结果DEMO里还没有。。。在此记录一下吧。

  • 生成一个1到100的序列 nx = ispan(1,100,1)
  • 定义一个数组 x = new(9, float)