向玉红
(南京信息工程大学 教务处,江苏 南京 210044)
HDF5数据接口的二次开发
向玉红
(南京信息工程大学 教务处,江苏南京210044)
HDF5(Hierarchical Data Format,HDF)数据具有自我描述、跨平台、支持平行读写的优势,被世界气象组织列为气象数据通用存储格式。Fortran是气象工作者的主要编程语言,文章将介绍如何用Fortran语言对HDF5数据接口的二次开发,实现HDF5数据接口高效封装,让读写HDF5变得简单易行。
HDF5;Fortran;二次开发
气象观测资料是开展气象研究和气象业务的基础。全球已逐步建立了较为完善的天基、空基和地基相结合的观测体系,提供了包括常规气象资料、卫星、雷达和探空等多种非常规观测资料,而不同的资料还采取不同的格式进行存储和传播。我国气象局的常规观测资料采取的ASCII格式存储,欧洲中心(ECMWF)的数值预报产品使用GRIB和Burf格式进行编码,我国台湾地区和美国合作的GPS掩星资料采用的是NETCDF格式。不同的数据格式给用户带来了诸多不便,建立一种高效、通用的标准化数据格式是大气和遥感领域在数据存储方面急需解决的问题。1998年美国国家航空与航天管理局( NASA)、美国国家计算机安全协会与美国三大实验室( IINI,LANL,SNI)合作设计开发了一种新型的数据格式HDF5。HDF5具有自我描述、自我组织、可扩展、跨平台和支持并行读写功能,被世界气象组织列为气象数据通用存储格式。目前,越来越多的单位和机构采用HDF5格式来存储数据,如美国NOAA系列卫星,欧洲的系列卫星和我国风云系列卫星。HDF5是一种层次式数据存储格式,直接读取HDF5文件是比较困难的,用户需要用HDF5提供的接口程序对文件进行操作。如何让读写HDF5变得简单和易行是本文关注的重点。
HDF5文件有两种基本数据对象组(group)、数据集(datasets)和3种辅助对象:数据类型(datatype)、数据空间(dataspace)和属性(attribute)。如图1所示,HDF5文件结构类似于Unix操作系统下的文件目录结构,组和数据集类比与文件夹和文件,最上级为根组(root group),下面包括组、数据集和全局属性。组可以包含数据文件,也可以包含其他的组对象,从而形成一个层递式的数据对象。数据集主要有数据空间(数组)和相关的描述信息(局地属性),说明数据类型和数据的维数大小。全局属性是用来描述整个HDF5文件的属性信息。
HDF5的本质是一个包括数据集和元数据的文件。HDF5库提供了C和Fortran数据接口(API),这些API供用户进行HDF5文件读写操作。所以,在利用这些API之前,先要安装HDF5库文件。如果要使用HDF5库提供的Fortran API,在安装库的时候要使用选项confgure --enble-fortran(--enable-fortran2003)。在安装目录的lib目录下有两个静态链接库libhdf5.a和libhdf5_ fortran.a,这两个文件分别是C和Fortran的API。下面以Fortran读取HDF5数据集为例介绍基于API的二次开发。
图1 HDF5文件结构示意
要利用API接口,在Module里边就要用到USE HDF5。读取数据集就必须要考虑数据类型和数据空间这两个问题。因此,针对每一个数据类型和不同的空间维数分别写一个函数,如读取一维的实型(4字节)数据集,过程名H5Read_Real4_1d(cfname,cdataset,dataset). cfname是要读取的HDF5的文件名,cdataset是数据集的名字(类似目录结构),dataset就是用来读取数据集的数值。具体过程如下:先利用API H5open_f初始化,然后用h5fopen_f打开文件,返回文件句柄,接着用h5dopen_f打开数据集,返回数据集的句柄,后面就是分配内存空间,然后用h5dread_f读取数据集并且返回值。实现代码如下(有删减):
Fortran的数据类型有整型、实型和字符型,每一种类型按照不同的维数完成相应的过程代码,如H5Read_ Real4_1d,H5Read_Int1_1d,H5Read_ReadString_1d....。最后用Fortran提供的重构(overload)功能,把这些不同类型不同维数的Module重构在一个Interface里。这样,无论是什么类型的数据集也不管它是几维数组,都用一个函数hdf5read去完成。最后,把这些文件编译并arch成静态库libhdf5_read.a供用户使用。代码如下:
本文重点讨论了用HDF5的二次开发技术。通过封装API函数,使得读取HDF5的数据集变得非常简单。本软件的完成对于推动HDF5在我国的普及和传播起到积极了的推动作用。利用同样的方法和思路,很容易就可以完成其他类似数据格式的API封装,如HDF4,HDF-EOS和NETCDF。本文给具有描述性的数据格式的封装提供了一个有益的参考。
Secondary development of HDF5 data interface
Xiang Yuhong
(Dean's Offce of Nanjing University of Information Engineering, Nanjing 210044, China)
HDF5 is a data model with the advantages of self description, cross platform, supporting parallel reading and writing, which is adopted as a common format of meteorological data storage by World Meteorological Organization(WMO). Fortran is the main programming language of meteorological workers. This paper will focus on how to use Fortran language to develop HDF5 data interface,aiming to fnd an easy way to read and write HDF5 data.
HDF5; Fortran; secondary development
向玉红(1977— ),女,湖北鹤峰,大专,助理工程师;研究方向:多媒体管理和维护。