为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

第二章-NCL变量及基本语法

2021-01-26 4页 pdf 425KB 110阅读

用户头像 机构认证

壹笑先生

致力于服务广大学子、教师、社考人员等一份学习的资料!

举报
第二章-NCL变量及基本语法第一章前言及简介第二章NCL变量及基本语法2.1netCDF规则2.2NCL语法2.3list变量2.4if语句及do循环2.5显示结果及调试第三章数据处理第四章文件输入输出第五章绘图•NCL变量形式是基于netCDF变量形式。•NCL使得GRIB,HDF,HDF-EOS看上去像netCDF。•除首字符必须为字母外,字母和数字均可,下划线“_”也可。2.1netCDF规则COARDS(1995;已不用)–CooperativeOcean/AtmosphereResearchDataService–http://ferret.w...
第二章-NCL变量及基本语法
第一章前言及简介第二章NCL变量及基本语法2.1netCDF2.2NCL语法2.3list变量2.4if语句及do循环2.5显示结果及调试第三章数据处理第四章文件输入输出第五章绘图•NCL变量形式是基于netCDF变量形式。•NCL使得GRIB,HDF,HDF-EOS看上去像netCDF。•除首字符必须为字母外,字母和数字均可,下划线“_”也可。2.1netCDF规则COARDS(1995;已不用)–CooperativeOcean/AtmosphereResearchDataService–http://ferret.wrc.noaa.gov/noaa_coop/coop_cdf_profile.htmlCF(2005/2006;仍在使用和改进中)–ClimateandForecastMetadataConvention(1.0->1.6)–兼容并扩展了COARDSconventionConvention:关于文件内容一系列需遵循的规则–使数据比较更加容易–使数据查看更加容易(比如ncview)netCDF文件的一部分ncdump–hfoo.nc(orncl_filedumpfoo.nc)DIMENSIONSIZES&NAMESdimensions:lat=64lon=128time=12变量:名称,类型,属性,坐标变量variables:floatlat(lat)lat:long_name="latitude"lat:units="degrees_north"floatlon(lon)lon:long_name="longitude"lon:units="degrees_east"doubletime(time)time:long_name="time"time:units=”hours_since…"floatT(time,lat,lon)T:long_name=“Temperature”T:units=“degC"T:missing_value=1.e+20fT:_FillValue=1.e+20f文件属性全域属性:title=“Temp:1999”source=“NCAR”Conventions=”CF-1.0”练习:ncl_filedumpFOO.nc|lessncl_filedumpFOO.grb|lesstime=UNLIMITED(比如12个月)NCL/netCDF变量doubleT(time,lat,lon)T:long_name=“Temperature”T:units=“degC"T:_FillValue=1.e+20fvariabletype–double(float,int,short,..)variablename–Tnameddimensions–time,lat,lonattributes–long_name,units,_FillValuefloatprr(time,y,x)prr:_FillValue=-9999.f;CFprr:missing_value=-9999.f;COARDSprr:long_name="LiquidPrecipitation";CF,COARDSprr:grid_mapping="Lambert_Conformal";prr:units="kgm-2s-1";CF,COARDSprr:height="surface";prr:coordinates="lonlat";CFlong_name:“Temperature”units:“degC”nameddimensions:x(time,lat)lat:(/-60,-30,0,30,60/)time:(/2000,2001,2002,2003,2004,2005/)4.354.390.27-3.35-6.904.364.663.77-1.664.069.73-5.840.898.4610.39173.685.080.14-5.63-0.63-4.12-2.511.76-1.43-4.290.075.850.878.65x•array[长度可以为1(标量)]•(可能)有附加的信息name:xtype:float[real]shape:2-dimensionssize:6(rows)x5(columns)values:x(2,3)=8.46[rowmajor,0-basedindexing]MetadataNCL/netCDF变量详细查看netCDF变量(NCL)ncl;交互模式ncl0>f=addfile(“UV300.nc”,“r”);打开文档(nc,grb,hdf,hdfeos)ncl1>u=f->U;提取STRUCTUREncl2>printVarSummary(u);查看变量Variable:uType:floatTotalSize:65536bytes16384valuesNumberofDimensions:3DimensionsandSizes:[time|2]x[lat|64]x[lon|128]Coordinates:time:[1..7]lat:[-87.8638..87.8638]lon:[0..357.185]NumberofAttributes:5_FillValue:1e36[CF]units:m/s[COARDS,CF]long_name:ZonalWind[COARDS,CF]short_name:Umissing_value:1e36[COARDS;CF-1.6]经典的netCDF变量模式NCL可查询/修改/使用/添加数据的任何方面netCDF[NCL]变量形式f=addfile(“foo.nc”,”r”);grb/hdfx=f->XX标量或数组属性long_name_FillValueunitsadd_offsetscale_factoretc.values标量或数组attributeslong_name_FillValueunitsadd_offsetscale_factoretc.通过@读取通过&读取timelevlatlonetc.坐标timelevlatlonetc.coordvarNCL读取标量/数组,属性,和坐标变量以作为一个object(structure)Xload"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"load"$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"f=addfile(“erai_1989-2009.mon.msl_psl.nc”,“r”);打开文档[hdf,grib]p=f->SLP;(time,lat,lon);(252,121,240)printVarSummary(p);netCDF变量形式wks=gsn_open_wks(“x11”,“parvis_1”);打开一个PS文件plot=gsn_csm_contour_map(wks,p(0,:,:),False);默认绘图方式;属性,坐标标量将会被使用图形库NetCDF[NCL]变量形式p=f->SLPNCL读取•datavalues(标量或者数组)•属性@•坐标变量&以作为一个单独的数据对象.scalarorarrayvaluesattributescoordspaccessedvia@accessedvia&_FillValuelong_namemissing_valueunitsetc.timelatitudelongitudeetc2.2NCL语法•=-赋值•:=-重新赋值(v6.1.2)•;-注释[可在任何地方出现,“;”右边文字将被忽略]•->-通过addfile(s)输入/输出变量•@-读取/创建属性•!-读取/创建nameddimension•&-读取/创建坐标变量•{…}–坐标截取•$...$-当使用addfile(s)输入/输出变量时,包住字符•(/../)–构建数组并移除metadata•[/../]–构建list;•[:]-list中的所有分量•:-数组语法•|-用于隔离nameddimensions•\-连续符[statementtospanmultiplelines]•::-外部共享对象的语法(比如fortran/C)数据类型numeric(classicnetCDF3)•double(64bit)•float(32bit)•long(64bit;signed+/-)•integer(32bit;signed+/-)•short(16bit;signed+/-)•byte(8bit,signed+/-)•complexNOTsupportednon-numeric•string•character•graphic•file•logical•listenumeric(netCDF4;HDF5)•int64(64bit;signed+/-)•uint64(64bit;unsigned)•uint(32bit;unsigned)•ulong(32bit;unsigned)•ushort(16bit;unsigned)•ubyte(8bit,unsigned)snumeric[numeric,enumeric]创建变量的简单a_int=1a_float=2.0;0.00002,2e-5a_double=3.2d;0.0032d,3.2d-3a_string="a”a_logical=True[False];注意大写的T/F•创建数组(/…/)–a_integer=(/1,2,3/);ispan(1,3,1)–a_float=(/2.0,5,8.0/);fspan(2,8,3)–a_double=(/12,2d0,3.2/);(/12,2,3.2/)*1d0–a_string=(/"abcd","e","Hello,World”/)–a_logical=(/True,False,True/)–a_2darray=(/(/1,2,3/),(/4,5,6/),(/7,8,9/)/)http://www.ncl.ucar.edu/Document/Manuals/Ref_Manual/NclDataTypes.shtml#BasicNumericTypes创建和删除变量a=2.0pi=4.0*atan(1.0)s=(/“Melbourne”,“Sydney”,“Toulouse”,“Boulder”/)r=f->precip;(time,lat,lon)R=random_normal(20,7,(/N,M/));R(N,M)q=new((/ntim,klev,nlat,mlon/),“double”);占用内存;通常而言,不需要这么做;删除每个变量delete(a)delete(pi)delete(s)delete(r)delete(R);在一行中删除多个变量delete([/a,pi,s,r,R,q/]);[/…/]list语法数据类型之间的转换•NCL是一种‘stronglytyped’语言–不容易将各种类型的数据混在一起•coercion–将一种类型转换成另一种(内部)。令i为整型,x为float或double型–fortran:x=iandi=x–NCL:x=iandi=toint(x)•许多函数执行转换变量重新赋值•两个方法–直至V6.1.1,需两步–delete(k);删除已存在的变量–k=(/17.5,21.4/);重新复制–V6.1.2–k:=(/17.5,21.4/);与上述2步同效;•NCL=错误的使用方法k=(/1,3,4,9/);1darray,typeinteger…laterincode…k=(/17.5,21.4/);不同的大小和类型•NCL:=错误的使用方法x=x(::4,:,:);同一个变量MetaData•与变量或文件有关的信息–attributes:@(numeric,text)–nameddimensions:!(text)–coordinates:&(numeric)•@,!,&可用来创建/赋值•最通常的情况是,metadata从文件中读取属性[@]•用@复制和读取T=(/10,25,39/)T@units=“degC”T@long_name=“Temperature”T@wgts=(/0.25,0.5,0.25/)T@x2d=(/(/1,2,3/),(/4,5,6/),(/7,8,9/)/)T@_FillValue=-999title=T@long_name•属性函数[isatt,getfilevaratts]if(isatt(T,"units"))then....endifatts=getfilevaratts(fin,"T")•delete属性:delete(T@wgts)•与变量或文件相联系的信息–属性可以是任意数据类型,除文件和list–标量,多维数组(字符,数字)_FillValue属性•Unidata&NCL保留的属性;CF兼容•netCDFOperators[NCO]&CDO:_FillValue属性•ncview:可识别missing_value属性(COARDS)–创建netCDF文件时最好两种规则都采用•NCL:最好不要用0作为_FillValue–但在绘等值线时完全可以•NCL函数可识别_FillValue–大多数的函数在计算中会忽略缺省值(比如,“avg”)–使用内置函数“ismissing”来检查_FillValue–if(any(ismissing(T)))then…endif注意:if(any(T.eq.T@_FillValue))不会正常执行数组和行列的排列序号•行为主左边变化最慢;右边变化最快行列从左至右的序号为[0,1,..]•截取从0开始[0,N-1]不同的语言/工具:•NCL/C/C++:0开始;左(最慢)–右(最快)•fortran,Matlab,R:1开始;左(最快)–右(最慢)•IDL:0开始;左(最快)–右(最慢)比如T(:,:,:)T(0,1,2)leftdimensionis0:变化最慢middledimensionis1rightdimensionis2:变化最快NCL–Fortran/Matlab数组指数•ncl:x(N,M)=>value<=x(M,N):fortranM=3,N=2x(0,0)=>7.23<=x(1,1)x(0,1)=>-12.5<=x(2,1)x(0,2)=>0.3<=x(3,1)转到下一个指数x(1,0)=>-431.2<=x(1,2)x(1,1)=>323.1<=x(2,2)x(1,2)=>-234.6<=x(3,2)NCL(netCDF):命名行列[!]•用!赋值{letT(:,:,:)->T(0,1,2)}–T!0=“time”;最左边[变化最慢]dim–T!1="lat“–T!2=“lon”;最右边[变化最快]dim•dim名称可以被重新命名–T!1=”latitude"…dName=T!2•delete可以删除:delete(T!2)•可以“命名”:x(time,level,lat,lon)•在netCDF文件中,行列是被命名的•命名行列用于行列调整–T(lat|:,lon|:,time|:)坐标变量的创建与赋值[&]•令二维的x(:,:)•命名行列–x!0=“time”…x!1=“lon”•为x赋值坐标变量–x&time=time…x&lon=lon•为数组行列命名–time!0=“time”–lon!0=“lon”•创建1D数组–time=(/1980,1981,1982/)–time@units=“yyyy”–lon=ispan(0,355,5)–lon@units=“degrees_E”netCDF/NCL:坐标变量(CV)•CV:CoordinateVariable(Unidata中的一个定义)–1D变量行列的名称与其变量的名称一致–必须是单调增加或减少•CV举例–lat(lat),longitude(longitude),plevel(plevel),time(time)•CV可以通过{…}用‘自然’的坐标来截取–Q(time,plevel,lat,longitude)CV:Q(:,{925:400},{-20:60},{130:280})Index:Q(:,3:10,24:40,42:75)以下例子不是坐标变量:floatxlat(nlat,mlon);2Dxlat:units="degrees_north”MetaData语法回顾读取/改变/创建/删除•@属性–u@long_name="U"–lonName=u@long_name•!命名的行列–u!0="TIME"–tName=u!0•&坐标变量–u&lat=(/-90.,-85,....,85.,90./)–latitude=u&lat•$替代字符–x=fin->$variable(n)$变量的截取(1of3)的数组截取(通过指数)•范围:开始/结束以及[可选的]间隔•指数值用:相分离•忽略起始/结束指数则用默认的起始/结束比如T(time,lat,lon)T整个数组[不用T(:,:,:)]T(0,:,::5)1sttimeindex,alllat,every5thlonT(:3,::-1,:50)1st4timeindices,reverse,1st51lonT(7:12,45,10:20)6timeindices,46thvalueoflat,11-21valuesoflon好的编程:使用变量T(tstrt:tlast,:,ln1:ln2)时间指数tstrt:tlast,所有纬度:,经度指数ln1:ln2变量的截取(2of3)CoordinateVariable截取•仅用于坐标变量(1D,单调)•同样的规则适用于范围、间隔•用{…}•标准的和坐标截取可以混在一起T(2:7,{-30:30},:)6个时次,所有的lon,lat-30to+30°T(0,{-20},{-180:35:3})1st时次,最接近-20°的lat,在-180°至35°之间每第3个lonT(::12,{latS:latN},:)所有的times/lon,latlatStolatNT(8,{latS},{lonL:lonR:3})第9时次,最接近latS,在latL和lonR之间每第三个经度变量的截取(3of3)命名的行列•仅用于行列调整•用|表示•行列的名字必须用于每一维•命名的/坐标截取可以混合使用比如T(time,lat,lon)t=T(lat|:,lon|:,time|:)得到t(lat,lon,time)t=T(time|:,{lon|90:120},{lat|-20:20})所有时次,90-120°lon,-20-20°latLongitudecoordinatevariable(1D)Latitudecoordinatevariable(1D)截取:指数,CV标准的:T(9:13,1:8)坐标的:T({-10:20},{-170:-110})混合的:T({-10:20},1:8)2.3listvariable[1of2]f=addfile(….,“r”);typefilei=ispan(1,10,2);integerz=(/“example”,“wkshop”/);arrayconstructorvariable(/.../)delete([/f,i,z/]);deletemultiplevariablesq=addfiles(fil_names,"r");qisoftype“list”x=q[:]->X;[:]meanallelementsoflists=q[2:8:2]->X;extractxfromfiles2,4,6,8•‘container’forvariablesofanytype•canbemixedtype(numeric,string,file,…)•threewaystocreateavariableoflist•f=addfiles(…)•x=[/…/]listconstructor•a=NewList(…)2.3listvariable[2of2]r=random_normal(mean,stdev,N)s=(/“sample”,“string”/)lst=NewList(“fifo”);createalistvariableListPush(lst,r);add‘r’ListPush(lst,r^2);addr^2ListPush(lst,s);addsnlst=ListCount(lst);numberofitemsin‘lst’don=0,nlst-1print(lst[n]);printcontentsoflistitem‘n’enddo2.4if语句及do循环•if-then-endif(注意:endif有空格)if(all(a.gt.0.))then…statementsendif•if-then-else-endifif(any(ismissing(a)))then…statementselse…statementsendif•lazyexpressionevaluation[左到右]if(any(b.lt.0.).and.all(a.gt.0.))then…statementsendif2.4if语句及do循环•没有‘elseif’block,但ifblocks可被嵌套str="MAR”if(str.eq."JAN")thenprint("January")elseif(str.eq."FEB")thenprint("February")elseif(str.eq."MAR")thenprint("March")elseif(str.eq."APR")thenprint("April")elseprint("Enoughofthis!")endif;mustgroupall‘endif’atend…不是特别清晰endifendifendif2.4if语句及do循环•doloop(传统的结构;enddo有空格)–doi=scalar_start_exp,scalar_end_exp[,scalar_skip_exp]don=nStrt,nLast[,stride]…statementsenddo;'enddo'hasaspace–如果start>end‘n’每次减正的stride,当start>end,stride必须设定•dowhileloopdowhile(x.gt.100)…statementsenddo•break:中断[f90:exit]•continue:进入到下一个循环[f90:cycle]•少用循环(在任何一种interpretedlanguage)–用数组运算符,内置函数和内置程序–用Fortran/Ccodes进行高效的循环运算2.5显示结果及调试•printVarSummary–列出一个变量的大致信息•print–包括了一些printVarSummary中的信息–打印每一个变量•write_matrix–打印至标准输出或文件–可对数值的格式进行调整–同样可以写入文档printVarSummary•打印变量内容以下信息–类型–行列信息–坐标信息(如果有的话)–属性(如果有的话)•printVarSummary(u)Variable:uType:doubleTotalSize:1179648bytes147456valuesNumberofDimensions:4Dimensions/Sizes:[time|1]x[lev|18]x[lat|64]x[lon|128]Coordinates:time:[4046..4046]lev:[4.809..992.5282]lat:[-87.86379..87.86379]lon:[0.0..357.1875]NumberofAttributes:2long_name:zonalwindcomponentunits:m/sprint(1of3)Variable:TType:floatTotalSize:32768bytes8192valuesNumberofDimensions:2Dimensions/Sizes:[lat|64]x[lon|128]Coordinates:lat:[-87.86379..87.86379]lon:[0.0..357.1875]NumberofAttributes:2long_name:Temperatureunits:degC(0,0)-31.7(0,1)-31.4(0,2)-32.3(0,3)-33.4(0,4)-31.3etc.[entireTarraywillbeprinted]•打印所有变量信息,包括–所有metadata,数值–T(lat,lon):print(T)print(2of3)Variable:T(subsection)Type:floatTotalSize:256bytes64valuesNumberofDimensions:1Dimensions/Sizes:[lat|64]Coordinates:lat:[-87.86379..87.86379]NumberofAttributes:3long_name:Temperatureunits:degClon:109.6875[added](0)-40.7(1)-33.0(2)-25.1(3)-20.0(4)-15.3etc.•可用于打印数组的一部分子集–metadata,数值–T(lat,lon):print(T(:,103))或者print(T(:,{110}))print(3of3)•print用嵌入的strings–没有metadata–print(”T:min="+min(T)+"max="+max(T))•sprintf和sprinti可进行格式化输出-通常用于图形标签-print("min(T)="+sprintf("%5.2f",min(T)))(0)T:min=-53.8125max=25.9736(0)min(T)=-53.81•sprinti可以用0填充左边(ex:letn=3)-fnam="h"+sprinti("%0.5i",n)+".nc"-print("filename="+fnam)(0)filename=h00003.ncwrite_matrix(x[*][*],fmt,opt)4.354.390.27-3.35-6.904.364.663.77-1.664.069.73-5.840.898.4610.394.914.59-3.097.554.56173.685.080.14-5.63-0.63-4.12-2.511.76-1.43-4.290.075.850.878.65•很好的地打印2D数组(table)至标准输出–integer,float,double–控制格式(fmt)–T(N,M),N=7,M=5:write_matrix(T,“5f7.2”,False)•同样可以创建一个ASCII文档opt=Trueopt@fout=“foo.ascii”;文件名write_matrix(T,“5f7.2”,opt)调试,错误信息,帮助•NCL没有内置的调试器•用print/printVarSummary检查输出!•nmsg=num(ismissing(x));统计_FillValue的个数•print(“x:min=“+min(x)+”max=“+max(x))•错误的信息;Warning或者Fatal•查看信息,它们通常可描述出问•比如:Fatal:leftandrightsidehavedifferentsizes•printVarSummaryofvariablesbeforeFatalHelp:question(s):ncl-talk@ucar.edu-includeenoughinfotofacilitateanswering-do*not*attachlargefiles(>1.5Mb)-theywillberejected,useftp/web-do*not*'dump'amessyscripttoncl-talk-Ourtimeisvaluabletoo!
/
本文档为【第二章-NCL变量及基本语法】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索