NetCDF数据的编程式访问

  • 格式:pdf
  • 大小:180.97 KB
  • 文档页数:4

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 GYVol.32,Suppl.Dec.,2004N 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 sigmalevel995”; 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 initializedreanalysis/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 ETCDFIN TEGER::ncid,status,nDims,nVars,n G lob2 alAtts,unLimDimIDIN TEGER::Dimid,Var IDIN TEGER uwnd(144,73,1460)注:为了引用F90版本的NetCDF库,可以将该函数库(netcdf.mod)拷贝(命令cp)或链接(命令ln)至当前目录,或者使用编译参数选项-I指定该函数所在的目录。