最近使用ncl总是在最后成图的时候出现input in flex scanner failed这种错误。可以肯定是GUI的问题,查了下资料感觉也无从下手,错误触发原因看起来比高级图形接口更加底层,动弹不得。
这个错误最初是由于把字号改大而出现的,于是我将字号改小,果然没问题……不太懂什么原因
处理CFSR的数据,已经是团队其他成员处理过的了,由于她用的是GrADS,清一色的二进制bin+描述文件ctl,不是自描述的nc文件,ncl处理起来没有任何的metadata,所以都要自己指定。数据文件名是YYYYMM的,循环不是很好写,查了一下,cd_calendar这个函数很好用,官网上给的例子是hours since和days since的,实际上用months也是可以的。
16 time = ispan(0,383,1) 17 time@units = "months since 1979-01-01" 18 19 date = cd_calendar(time,-1)
得到的date变量返回integer形式的YYYYMM,从79年1月到10年12月,perfect! 而且使用cd_calendar函数,发现之前做起来很麻烦(要算位置)的合成和截取,都可以很方便实现了。还是教程看得不够细致呀 = =
#Up to 20151216#
用cd_calendar可以很好地转换days since之类的时间格式,用于长序列数据的切片读取非常有效。例如下面的例子就可以截取197901-201312的SST片。
29 ymstrt = 197901 30 ymlast = 201312 ; 31 32 data_path = "../../data/sst/monthly" 33 ctrl_file1 = data_path+"sst_HadOIBl_bc_1.9x2.5_1850_2011_c130301.nc" 34 ctrl_in1 = addfile (ctrl_file1, "r") 35 36 time = ctrl_in1->time 37 yyyymm = cd_calendar(time,-1) 38 istrt = ind(yyyymm .eq. ymstrt) 39 ilast = ind(yyyymm .eq. ymlast) 40 var1 = ctrl_in2->SST_cpl(istrt:ilast,:,:)
#Up to 20150107#
模式中为了防止海陆边界不连续造成积分不稳定,往往会将海温插值到陆地上,画图时当然不希望这些数据出现,求海温区域平均时也不希望出现,所以必须要处理下。 根据目的是画图还是计算,处理的方式不一样。画图的话,我们希望海陆边缘不要出现
比如这样就很好。其实不需对原数据进行操作,只要改变绘图的属性让地图底图后画就可以:
res@mpFillDrawOrder="PostDraw"
如果要进行计算,就需要mask了,如果是规整的1x1的数据可以用landsea_mask解决
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/shea_util.ncl"
a = addfile("$NCARG_ROOT/lib/ncarg/data/cdf/landsea.nc","r") lsdata = a->LSMASK lsm = landsea_mask(lsdata,data&lat,data&lon) data = mask(data,lsm.eq.1,False) data = mask(data,lsm.eq.3,False)
如果数据不是规整的1x1,需要先做一下插值处理,比如包含极点的场变量转换
var4 = f2fsh_Wrap(var4s1,(/180,360/))