LZN's Blog CodePlayer

【已解决】ncl高效输出netCDF格式文件

2014-11-08
LZN

从模式原始输出中抽变量出来,采用默认输出方式输出50年全球(144x96)的ZMDT,程序会卡半天,而且最后时不时还会弹出write failed的错误。查了下,发现这种默认的输出方式非常低效(虽然不知道为什么),高效的方式是完全自行定义维数名称、属性等等。测试下速度确实快很多,而且不存在上面的问题,但是代码量增加了三四十行左右。兹举例如下:

48 ;************************************************ 49 ; Write the file 50 ;************************************************ 51 52 ;Get dimsize 53 dims=dimsizes(ctrl_var1p(0,:,:,:)) 54 nlvl=dims(0) 55 nlat=dims(1) 56 nlon=dims(2) 57 58 ;Set fileoption 59 system("rm "+pdata_fn) 60 fout = addfile(pdata_fn ,"c") ; open output netCDF file 61 setfileoption(fout,"DefineMode",True) 62 63 ;Set All field attribution 64 fileAtt = True 65 fileAtt@creation_date=systemfunc("date") 66 fileattdef(fout,fileAtt) 67 68 ;Define Coordinate 69 dimNames =(/"time","lev_p","lat","lon"/) 70 dimSizes =(/-1,nlvl,nlat,nlon/) 71 dimUnlim =(/True,False,False,False/) 72 filedimdef(fout,dimNames,dimSizes,dimUnlim) 73 74 ;Define var, type and dim 75 filevardef(fout,"time",typeof(ctrl_var1p&time),getvardims(ctrl_var1p&time)) 76 filevardef(fout,"lev_p",typeof(ctrl_var1p&lev_p),getvardims(ctrl_var1p&lev_p)) 77 filevardef(fout,"lat",typeof(ctrl_var1p&lat),getvardims(ctrl_var1p&lat)) 78 filevardef(fout,"lon",typeof(ctrl_var1p&lon),getvardims(ctrl_var1p&lon)) 79 filevardef(fout,"ZMDT",typeof(ctrl_var1p),getvardims(ctrl_var1p)) 80 81 ;Define Attribute 82 filevarattdef(fout,"ZMDT",ctrl_var1p) 83 84 fout->time=(/ctrl_var1p&time/) 85 fout->lev_p=(/ctrl_var1p&lev_p/) 86 fout->lat=(/ctrl_var1p&lat/) 87 fout->lon=(/ctrl_var1p&lon/) 88 fout->ZMDT=(/ctrl_var1p/)

#Up to 20141108#

这种输出模式下,注意应到将时间维和坐标维度单列变量输出到nc文件,坐标维度应当设置degree定义方向,否则绘图时需要重设。

另外这种方法大部分时间还是比较高效的,但是有时会出现奇怪的远远超出一般用时的卡顿,在数据量较大时容易出现。

#Up to 20141109#


上一篇 A Walk in the Rain

Comments

Content