NetCDF数据的编程式访问
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
N etCDF 数据的编程式访问
查石祥
(总参气象中心,北京100081)
作者简介:查石祥,男,1965年生,硕士,高级工程师,从事数值预报模式与高性能计算研究,Email :sxzha @ 收稿日期:2004年6月12日;定稿日期:2004年9月1日
摘要 NetCDF 是一种面向数组型数据的描述和编码标准,目前广泛应用于大气科学、水文、海洋学、环境模拟、地球物理等诸多领域。
用户可以借助多种方式方便地管理和操作NetCDF 数据集。
文章介绍NetCDF 数据的编程式访问方法。
该方法主要应用于数值预报模式,它涉及软件创建、参数配置、NetCDF 文件结构、NetCDF 接口函数库等。
重点探讨了编程者在使用该方法时经常遇到的一些问题,并且给出了一个读取NCEP 再分析文件的编程实例。
关键词 NetCDF 编程环境 文件结构 接口函数库
引言
NetCDF 是一种面向数组型数据的描述和编码
标准,已被国内外许多行业和组织采用,目前广泛应用于大气科学、水文、海洋学、环境模拟、地球物理等诸多领域。
例如,NCEP (美国国家环境预报中心)发布的再分析资料,NOAA CDC (气候数据中心)发布的海洋与大气综合数据集(COADS )均采用NetCDF 作为标准。
本文介绍NetCDF 数据的编程式访问———通过调用NetCDF 软件包提供的库函数,以编程方式实现对NetCDF 数据的直接读写。
这种方式更多地应用于数值预报模式中,作为模式I/O 模块的一部分,实现对NetCDF 数据的直接读写,例如,目前在气象和海洋领域应用较广泛的WRF 模式[1]、POM 模式、LASG 的气候模式等都包含这样的功能选项。
由于NetCDF 软件秉承OSF (Open Software Foun 2dation )理念,在采用编程方式访问NetCDF 数据时,
涉及编程环境的创建、NetCDF 文件结构、NetCDF 接口函数库等。
笔者以自己的开发经验,在综合大
量相关网络资源的基础之上,除了简要介绍NetCDF 之外,有针对性地探讨了编程者在使用该
方法时常会遇到的一些问题,并且给出了一个读取NCEP 再分析文件的编程实例,希望对同行有所
助益。
1 N etCDF 简介
NetCDF (Network Common Data Form 通用的
网络数据格式)是由美国大学大气研究协会(U 2CAR )下的Unidata 项目科学家针对科学数据的特点,提出的一种面向数组型数据、适于网络共享的数据描述和编码标准。
其软件实现形式是一个免费的NetCDF 软件包,内含可访问NetCDF 数据的工具程序和多种语言的接口函数库。
NetCDF 特性:①自描述特性,即NetCDF 数据
文件包含自身的描述信息,这也是网络时代数据的趋势性特征。
②平台无关性,即支持在异构的网络平台间进行数据传输和数据共享。
③易用性,表示存在多种方便的途径来管理和操作NetCDF 数据。
最常见的3种方式包括:使用随NetCDF 软件包提供的工具程序(Ncdump 和Ncgen );使用支持NetCDF 标准的第3方软件(Grads 、AVS 、IDL 和Mathlab );编程式访问。
④高可用性,表示其较高的
数据压缩比,以及基于数组下标的线性存储导致的高效存取。
2 N etCDF 文件结构及接口函数库211 N etCDF 文件结构
NetCDF 数据的自描述特性表示,其中包含描
述自身结构的信息。
为了便于说明,下面给出一个
第32卷,增刊2004年12月 气 象 科 技M ETEOROLO GICAL SCIENCE AND TECHNOLO GY
Vol.32,Suppl.
Dec.,2004
N ECP再分析数据文件的头信息(使用命令ncdump -h uwnd.sig995.1998),如下所示:netcdf uwnd. sig995.1998{
dimensions:
lon=144;
lat=73;
time=UNL IM ITED;//(1460currently) variables:
float lat(lat);
lat:units=“degrees north”;
lat:actual range=90.f,-90.f;
lat:long name=“Latitude”;
…
short uwnd(time,lat,lon);
uwnd:long name=“4xDaily u2wind at sigma
level995”;
uwnd:valid range=-10212f,10212f;
uwnd:actual range=-3219f,3518f;
uwnd:units=“m/s”;
uwnd:add offset=225145f;
uwnd:scale factor=0.01f;
uwnd:missing value=32766s;
…
//global attributes:
:Conventions=“COARDS”;
:title=“4x daily NMC reanalysis(1998)”;
:base date=1998s,1s,1s;
:history=“created98/02/12by Hoop
(netcdf2.3)”;
:description=“Data is from NMC initialized
reanalysis/n”,
“(4x/day).These are the0.9950sigma level values.”;
:platform=“Model”;
}
其中,为节省篇幅,略去了许多类似的描述行。
不难看出,每个NetCDF文件具备如下所示的结构,其中包含维数、变量、属性和数据4个子域,其中属性又分为适用于整个文件的全局属性和适用于特定变量的局地属性:
netcdf name{
dimensions:... //定义维数
variables:... //定义变量
attributes://属性
data:...//数据
}
NetCDF数据的编程访问就是要通过调用NetCDF接口库函数,设定(写文件)或检索(读文件)上述文件名、维数、变量、属性和数据等信息,达到读写NetCDF文件的目的。
212 N etCDF接口函数库
NetCDF接口函数库是提供给用户以编程方式访问NetCDF数据的工具。
NetCDF数据的接口函数库有支持诸如C、C++和Fortran等语言的不同版本,本文只介绍Fortran版本的接口函数库。
对于Fortran语言,Unidata又提供分别支持F77和F90标准的接口函数库,后者是在前者基础上的进一步封装,其包含的库函数更少,更便于编程;目前主流的Fortran编译器都支持F90标准。
因此,本文只介绍支持Fortran90版本的接口函数库[2]。
Fortran90版本的接口函数库只包含26个库函数,对应于NetCDF文件结构,可分为以下4类:①文件处理函数,实现以写或创建的形式打开文件,关闭文件等。
②变量处理函数,实现变量的定义或检索,包括定义或检索变量名、变量ID。
③维数处理函数,实现维数的定义或检索,包括定义或检索维数名称、维数ID。
④属性处理函数,实现属性的定义或检索。
3 N etCDF编程环境的创建
为了实现其平台无关性,Unidata提供适于不同平台的NetCDF软件包。
在Unix平台上,远非PC 平台的Win2Intel一统天下格局,硬件来自众多不同制造商,操作系统则有多种Unix变种,编译器(如CC,F77,F90)更是百花齐放。
尽管Unidata提供已编译好的二进制版本的NetCDF软件包,但是,为避免兼容性问题,笔者建议下载源代码形式的NetCDF软件包,然后针对各自的特定平台环境,创建(即配置、编译、测试和安装)NetCDF软件环境。
本文基于特定平台(CPU:400MHz M IPS R12000(IP27)Processor;OS:IRIX64release6.5),详细介绍NetCDF软件包的创建与安装过程。
(1)软件下载。
从ftp:/// pub/netcdf/处下载源代码形式的NetCDF软件包
14
增刊 查石祥:NetCDF数据的编程式访问
Netcdf.rar。
将此包解压至/usr目录。
则生成目录/ usr/netcdf-3.5.0/src及相关文件。
(2)环境变量设置。
执行编译的脚本程序(make)要求用户设置环境变量(如,CC,CFLA GS, CPPFLA GS,FC,FFLA GS,CXX,CXXFLA GS, F90和F90FLA GS),如果用户不熟悉这些环境变量的设置,可以进入/usr/netcdf- 3.5.0/src目录,执行configure—prefix=/usr/netcdf-3.5.0。
脚本程序configure将为你代劳。
(3)编译。
在/usr/netcdf- 3.5.0/src目录中,执行make。
该脚本程序将编译生成基础的NetCDF 库libnetcdf.a,并视系统配置情况生成各种语言的特定接口库。
如果系统安装有F77或F90编译器,则创建Fortran语言库,该接口库包含在libnetcdf.a 中,如果系统还包含有C++编译器,则创建C++语言的接口库libnetcdf c++.a。
这些库保存在/usr/ netcdf-3.5.0/lib目录下。
此外,make脚本程序还编译生成工具程序ncdump和ncgen。
保存在/usr/ netcdf-3.5.0/bin目录下。
最后,make程序还创建NetCDF的在线帮助文档和不同高级语言接口程序的头文件,分别保存在/usr/netcdf- 3.5.0/man目录和/usr/netcdf-3.5.0/include目录下。
(4)测试。
同样在/usr/netcdf-3.5.0/src目录中,执行make test。
该脚本程序编译与运行标准的测试程序,检验已创建的各种软件库和工具程序等是否正确。
(5)安装。
在/usr/netcdf- 3.5.0/src目录中,执行make install。
该脚本程序创建目录结构,即在/usr/netcdf-3.5.0/目录下建立bin、lib、和man子目录,并将在第3步中生成的工具程序、函数库和在线帮助文档分别拷贝至这些目录。
至此,就完成了NetCDF环境的创建。
4 编程
创建了NetCDF编程环境,就可以通过在程序中调用相应的库函数,直接读或写NetCDF格式的数据文件。
下面给出读取uwnd.sig995.1998文件的编程步骤:
①库引用及变量声明:
USE N ETCDF
IN TEGER::ncid,status,nDims,nVars,n G lob2 alAtts,unLimDimID
IN TEGER::Dimid,Var ID
IN TEGER uwnd(144,73,1460)
注:为了引用F90版本的NetCDF库,可以将该函数库(netcdf.mod)拷贝(命令cp)或链接(命令ln)至当前目录,或者使用编译参数选项-I指定该函数所在的目录。
②以读方式打开数据文件:
status=n f90open(path=‘uwnd.sig995.1998’, m ode=n f90n owrite,ncid=ncid)
if(status/=n f90n oerr)call handle err(status)
③检索文件的信息,诸如维数、变量和全局属性的个数等:
status=nf90inquire(ncid,nDims,nVars, n G lobalAtts,unLimDimID)
if(status/=n f90n oerr)call handle err(status)
④检索关于维数的信息,诸如维数的名称、维数的长度:
DO DimID=1,nDims
status=nf90inquire dimension(ncid,dimid, DimName(DimID))
if(status/=n f90n oerr)call handle err(status)
ENDDO
⑤检索关于变量信息,诸如变量的名称、变量的数据类型等:
DO Var ID=1,nVars
status=nf90inquire variable(ncid,Var ID, VarName(Var ID))
if(status/=n f90n oerr)call handle err(status)
ENDDO
⑥检索关于属性的信息,诸如数据变换参数(偏移量)、有效数据范围和数据单位等:
status=nf90inquire attribute(ncid,1,Var2 Name(1),xtype,ilen,attnum)
if(status/=n f90n oerr)call handle err(status)
⑦数据读取并关闭文件:
status=nf90get var(ncid,4,uwnd)
if(status/=n f90n oerr)call handle err(status)
status=nf90close(ncid)
⑧编译:
完成程序编制之后,注意在编译时应该通过编译参数指定NetCDF库的路径,如下所示:
f90-c ncreadf90.f
24
气 象 科 技 第32卷
f90-o ncread ncread f90.o -L/usr/netcd f -3.5.0/lib -lnetcd f
编译参数-L/usr/netcdf - 3.5.0/lib 和-lnetcdf 共同指向NetCDF 接口函数库libnetcdf.a 。
5 结语
本文结合一个读取NCEP 再分析文件的编程
实例,介绍在Unix 环境下NetCDF 编程环境的创建、NetCDF 文件结构、NetCDF 接口函数库及其编程调用。
类似地,可以编程实现NetCDF 文件的创建,从而以NetCDF 文件的形式发布自己的模式结
果。
希望本文能收到抛砖引玉之效,有兴趣深入了
解NetCDF 的读者,可以访问Unidata 关于NetCDF 的网页:http :///packages/netcdf/。
有需要本文所讨论程序的完整代码者,可通过sxzha @ 与笔者联系。
参考文献
1 K im S B.Weather Research and Forecast (WRF )Model.http ://
www.wrf
2 Rew R ,Pincus CDF User ’s Guide for Fortran 90.http ://
/packages/netcdf
Programming Access to N etCDF Files
Zha Shixiang
(Meteorology Center of the G eneral Staff ,Beijing 100081)
Abstract :As an array 2oriented data describing and encoding standard ,NetCDF is widely used in the atmospher 2ic sciences ,hydrology ,oceanography ,environmental modeling and geophysics ,etc ,currently.There are sever 2al convenient ways to manipulate and display NetCDF data ,such as using available utilities with the NetCDF software package ,or using the third 2party software ,include Grads ,AVS and Math 2lab.The programming ac 2cess to NetCDF files are mainly used in numerical weather prediction models.The focus is put on the problems that programmers frequently encounter ,such as the software configuration ,NetCDF file structure and software interface.An example program for implementing the programming access to a NCEP NetCDF file was given.K ey w ords :NetCDF ,programming environment ,file structure ,interface
3
4增刊 查石祥:NetCDF 数据的编程式访问 。