国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

NetCDF格式在Windows及Linux平臺下的讀寫

2014-10-21 07:01:28李繼祥于立陳龍泉姚仁太郝宏偉范丹呂明華
安徽農(nóng)業(yè)科學 2014年33期

李繼祥 于立 陳龍泉 姚仁太 郝宏偉 范丹 呂明華

摘要 使用Linux平臺的NetCDF3.6.1源代碼程序包,利用hdf提供的Windows平臺NetCDF的庫,分別編寫Windows平臺和Linux平臺下讀寫NetCDF的C語言程序及Fortran語言程序。在Windows平臺只需要netcdf.dll、libcurl.dll、zlib1.dll和netcdf.lib這4個文件就可以用C和Fortran讀寫NetCDF格式文件,在Linux平臺下只需要libnetcdf.a這1個文件就可以用C和Fortran讀寫,在不安裝NetCDF軟件包的情況下就可以使用,并且程序語言均很簡單,讀寫起來很方便,還對比了Windows和Linux平臺下C和Fortran的讀寫精度及速度。該研究對使用NetCDF格式數(shù)據(jù)的人員有指導和參考價值。

關鍵詞 NetCDF格式;Windows平臺;Linux平臺;讀寫速度與精度

中圖分類號 P49;S126 文獻標識碼

A 文章編號 0517-6611(2014)33-11942-04

Read and Write NetCDF Format Files on Windows and Linux Platform

LI Ji-xiang1, YU Li2,3, CHEN Long-quan1 et al (1. Atmospheric Boundary Layer Wind Tunnel Laboratory of China Institute for Radiation Protection, Taiyuan, Shanxi 030006; 2. Taiyuan Satellite Launch Center, Taiyuan, Shanxi 030006; 3. College of Atmospheric Sciences, Lanzhou University, Lanzhou, Gansu 730000)

Abstract Based on the NetCDF3.6.1 source code package on Linux platform, with NetCDF library on Windows platform provided by HDF, we compiled programs to read and write NetCDF files in C language and Fortran language on Windows platform and Linux platform. On Windows platform we only need netcdf. dll, libcurl. dll, zlib1. dll and netcdf.lib to read and write netcdf format files in C and Fortran languages, and we only need libnetcdf.a file to do that on Linux platform, in the case of not installing NetCDF package and the program is very simple, it is convenient to read and write, at last we compared the Windows and Linux platforms read and write speed and accuracy of C and Fortran languages.This paper has certainguidance and reference value on the use of NetCDF format data.

Key words NetCDF format; Windows platform; Linux platform; Read and write speed and accuracy

基金項目 國家自然科學基金項目(11175161)。

作者簡介 李繼祥(1987- ),男,甘肅秦安人,實習研究員,從事大氣邊界層和空氣污染數(shù)值模擬研究。

收稿日期 2014-10-13

NetCDF(Network Common Data Form)是一種網(wǎng)絡通用的數(shù)據(jù)格式,文件最初應用于貯存氣象數(shù)據(jù),由于其靈活性,能夠傳輸海量的面向陣列(Array-oriented)數(shù)據(jù),目前廣泛應用于大氣科學、水文、海洋學、環(huán)境模擬、地球物理等諸多領域。已被國內外許多行業(yè)和組織采用,例如NCEP(美國國家環(huán)境預報中心)發(fā)布的再分析資料及NOAA的CDC(氣候數(shù)據(jù)中心)發(fā)布的海洋與大氣綜合數(shù)據(jù)集(COADS)均采用NetCDF作為標準。

目前大部分的氣象資料均為NetCDF格式,例如廣泛使用的中尺度天氣預報模式WRF,其輸出數(shù)據(jù)模式即為NetCDF,因此,準確、快速的讀寫該類型數(shù)據(jù)是一項有意義的工作。查石祥探討了在Unix平臺下用Fortran讀取該類型數(shù)據(jù)的方法,但未討論寫成NetCDF的方法,而且該方法對系統(tǒng)環(huán)境依賴性大[1]。孫建偉等介紹了在Windows下用Fortran讀寫NetCDF格式的方法,但也需要創(chuàng)建NetCDF環(huán)境,讀寫需要依賴于NetCDF環(huán)境[2]。張林等用VC++在Windows下讀取了NetCDF格式數(shù)據(jù),但除使用dll文件外還需要一些h文件,且讀取程序比較麻煩[3]。還有一些作者[4-9]也研究了NetCDF格式讀寫的方法,但均不系統(tǒng),很多都依賴于NetCDF環(huán)境或借助其他軟件讀取。為此,筆者介紹只需要NetCDF庫之后不再依賴NetCDF環(huán)境讀寫的方法,并且討論了在Windows和Linux下Fortran和C的讀寫以及讀寫的精度和速度,以便更快速更便捷地讀寫數(shù)據(jù)。

1 NetCDF數(shù)據(jù)格式介紹

NetCDF網(wǎng)絡通用數(shù)據(jù)格式是由美國大學大氣研究協(xié)會(University Corporation for Atmospheric Research,UCAR)的Unidata項目科學家針對科學數(shù)據(jù)的特點開發(fā)的,是一種面向數(shù)組型并適于網(wǎng)絡共享的數(shù)據(jù)的描述和編碼標準。它具有自描述性、易用性、高可用性、可追加性和平臺無關性等特點,所以文件包含自身的描述信息,可以使用多種方式管理和操作這些數(shù)據(jù),訪問效率高,新數(shù)據(jù)可沿某一維進行追加,可以由多種軟件讀取并使用多種語言編寫,使用起來靈活方便高效。NetCDF數(shù)據(jù)的格式是使用者根據(jù)需求自己定義的。一個NetCDF數(shù)據(jù)集包含維(dimensions)、變量(variables)和屬性(attributes)3種描述類型。一個NetCDF文件的結構包括以下對象:

NetCDF name{

Dimensions:… //定義維數(shù)

Variables:… //定義變量

Attributes:… //屬性

Data:…//數(shù)據(jù)

}

其軟件實現(xiàn)形式是一個免費的NetCDF 軟件包,內含可訪問 NetCDF 數(shù)據(jù)的工具程序和多種語言的接口函數(shù)庫,其接口可以在Fortran、C、C++和IDL等多種語言下使用,同時支持多種操作平臺下(Linux、Windows等)的讀取以及在異構的網(wǎng)絡平臺間進行數(shù)據(jù)傳輸和數(shù)據(jù)共享。軟件包可從其官網(wǎng)http://www.unidata.ucar.edu/software/netcdf/上下載。

2 Windows下的讀寫

2.1 Windows下用C語言讀寫

在Windows下對NetCDF格式數(shù)據(jù)的讀寫都要依賴于netcdf.dll、libcurl.dll和zlib1.dll這3個dll文件,這3個文件可由NetCDF官網(wǎng)下載或hdf官網(wǎng)下載,同時還需下載netcdf.dll對應的netcdf.lib這個lib文件,而libcurl.dll和zlib1.dll對應的lib不需要。因為libcurl.dll和zlib1.dll是通過netcdf.dll調用其庫函數(shù)的。

在有了這4個文件后,就可以寫C語言程序讀寫NetCDF格式數(shù)據(jù)了。在知道NetCDF文件變量名稱及維數(shù)的以及類型的情況下,以讀取整型二維數(shù)據(jù)為例,程序代碼為:

#include

#include

#pragma comment(lib,"netcdf.lib")

#define FILE_NAME "simple_xy.nc"

#define NX 6

#define NY 12

void main()

{

int ncid,varid,x,y,retval;

int data_in[NX][NY];

retval = nc_open(FILE_NAME, NC_NOWRITE, &ncid)

retval = nc_inq_varid(ncid, "data", &varid)

retval = nc_get_var_int(ncid, varid, &data_in[0][0])

/*已讀出數(shù)據(jù)*/

retval = nc_close(ncid)

}

在VS2010下,點擊菜單“生成”里的編譯,接著點擊“生成”里的生成,最后點擊“調試”里的開始執(zhí)行即可(圖1)。若要讀取其他類型數(shù)據(jù),只需按照使用說明找到對應的讀取函數(shù)即可,具體可參考NetCDF使用說明[10-11]。

圖1 Windows下VS2010編譯C語言截圖

如果不知道NetCDF文件數(shù)據(jù)的變量名稱及維數(shù)以及類型的情況,那么這需要讀取該信息,可以用以下函數(shù)查詢(為了避免重復代碼,以下均只寫出函數(shù)名稱):

nc_inq_varid

nc_inq_var

nc_inq_dimlen

nc_get_vara_text

nc_inq

nc_inq_dim

用以上函數(shù)可以查詢出文件里的變量名稱、變量類型、維數(shù)等信息。這樣,就可以讀取NetCDF格式數(shù)據(jù)了。而書寫NetCDF格式的數(shù)據(jù)的程序為(以寫整型二維數(shù)據(jù)為例):

nc_create

nc_def_dim

nc_def_var

nc_enddef

nc_put_var_int

nc_close

這樣即可完成Windows下C語言對NetCDF格式數(shù)據(jù)的讀寫。

2.2 Windows下用Fortran語言讀寫

同樣,F(xiàn)ortran語言讀寫要依賴于netcdf.dll、libcurl.dll、zlib1.dll和netcdf.lib這4個文件。但這4個文件是C語言的,F(xiàn)ortran不能直接使用,官網(wǎng)也未公布Windows下Fortran的庫,所以使用Fortran讀寫時要先用C語言做好可供Fortran使用的庫或者使用混合編譯的方法以實現(xiàn)Fortran對NetCDF的讀寫。該研究使用VS2010和Intel Fortran讀寫NetCDF格式數(shù)據(jù),所以得先用C語言將上述4個庫寫成可供Fortran用的庫,以讀取整型二維數(shù)據(jù)為例,C程序代碼為:

#include

#include

#pragma comment(lib,"netcdf.lib")

typedef int nc_type;

#define size_t unsigned int

int nc_open(const char *path, int mode, int *ncidp);

int nc_inq_varid(int ncid, const char *name, int *varidp);

int nc_get_var_int(int ncid, int varid, int *ip);

int nc_close(int ncid);

void _declspec(dllexport) nf_open(const char *path, int mode, int *ncidp,int *pp)

{

*pp=nc_open(path, mode,ncidp);

}

...

void _declspec(dllexport) nf_close(int ncid,int *pp)

{

*pp=nc_close(ncid);

}

在上述工作的基礎上用VS2010編譯成.dll格式,就可以供Fortran使用了。編譯具體步驟為:①在新建win32控制臺應用程序的應用程序類型中選擇dll;②編譯生成即可,然后在對應debug或release中可看到lib和dll文件。圖2為創(chuàng)建C語言dll庫的截圖。對應Fortran程序代碼為:

module cprog

interface

subroutine nf_open(ll,a,b,c)

!DEC$ ATTRIBUTES C,ALIAS:'_nf_open'::nf_open

character(len=*)::ll

!DEC$ ATTRIBUTES REFERENCE::ll

INTEGER::a

!DEC$ ATTRIBUTES VALUE::a

INTEGER::b

!DEC$ ATTRIBUTES REFERENCE::b

INTEGER::c

!DEC$ ATTRIBUTES REFERENCE::c

end subroutine

...

end interface

end module cprog

program readnc

use cprog

call nf_open

call nf_inq_varid

call nf_get_var_int

call nf_close

end program

將以上生成的lib和dll文件拷貝到Fortran程序目錄下,在resoure file中添加lib文件即可,然后就編譯、連接、開始執(zhí)行,這就實現(xiàn)了Fortran在Windows下的讀取,當然,書寫的程序類似。該程序中的module塊是用來連接C生成的庫函數(shù)的,這是必須要的,如果是Fortran調用Fortran生成的庫,則可以不需要。圖3為Windows下用Intel Fortran編譯Fortran程序的截圖。

圖2 Windows下VS2010創(chuàng)建C語言dll庫截圖

圖3 Windows下Intel Fortran編譯Fortran截圖

3 Linux下的讀取

在Linux下對NetCDF格式數(shù)據(jù)的讀寫只需要依賴于netcdf.a這1個文件即可。在NetCDF官網(wǎng)下載安裝包,然后在Linux成功安裝NetCDF,在lib文件夾里就可以看到該文件。Linux對NetCDF的讀取相比Windows要簡單,C和Fortran語言都能讀該靜態(tài)庫,以讀取整型二維數(shù)據(jù)為例,程序代碼和Windows基本一樣,只需要將Windows下的“#pragma comment(lib,"netcdf.lib")”這行刪除即可,編譯方法為:

gcc -o readnc readnc.c -L. -lnetcdf

./readnc

然后就可以讀取了,F(xiàn)ortran的程序代碼也和Windows相似,但不需要module塊,代碼為:

program readnc

implicit none

integer,external::nf_open, nf_inq_varid,nf_get_var_int,nf_get_var_int

integer::istat

istat=nf_open

istat=nf_inq_varid

istat=nf_get_var_int

istat=nf_get_var_int

end program

編譯方法和C相似(圖4),為:

gfortran -o readnc readnc.f90 -L. -lnetcdf

./readnc

圖4 Linux下Fortran代碼及編譯截圖

4 讀寫速度及精度比較

Windows下用的C編譯器是VS 2010,F(xiàn)ortran編譯器是Intel Fortran。為了比較運行時間linux系統(tǒng)用的是虛擬機的Red Hat系統(tǒng),C編譯器是gcc,F(xiàn)ortran編譯器是pgi fortran和gfortran。讀取了一個WRF輸出的nc數(shù)據(jù)并寫成文本文件,對其精度進行比較,發(fā)現(xiàn)數(shù)據(jù)差異很小,大部分時候完全一致,只有很小一部分在最后1位(小數(shù)點后6位)時數(shù)字才可相差1,所以數(shù)據(jù)讀取應該完全正確。運行速度是Windows下的Intel Fortran最快,Windows下的C最慢。在Linux下則是gcc較快而Fortran較慢,F(xiàn)ortran和pgi fortran速度接近。具體運行速度數(shù)據(jù)見表1。

表1 不同系統(tǒng)下C和Fortran讀取數(shù)據(jù)的時間

5 結語

該研究在Windows下只使用netcdf.dll、libcurl.dll、zlib1.dll和netcdf.lib這4個文件用C和Fortran實現(xiàn)了NetCDF的讀寫,在Linux下只使用libnetcdf.a一個文件完成了C和Fortran讀寫,不依賴其他任何NetCDF環(huán)境及文件,讀寫程序簡單,使用方便。Linux下的程序相比Windows更加簡便一些,并且編譯方法也簡單方便。在Windows下Intel Fortran的讀寫速度比C(VS2010)快4倍多,Linux下C比Fortran快2倍左右。該研究中的程序為讀整型二維數(shù)據(jù)的簡單例子,為了更好地讀寫NetCDF格式,可以參考其使用說明等,希望能起到拋磚引玉的作用。

參考文獻

[1]查石祥.NetCDF數(shù)據(jù)的編程式訪問[J].氣象科技,2004,32(S1):40-43.

[2] 孫建偉,孫昭晨,陳軒,等.NetCDF格式數(shù)據(jù)的創(chuàng)建與應用[J].交通標準化,2010(15):31-34.

[3] 張林,高玉春,楊金紅,等.基于VC++平臺的相控陣天氣雷達NetCDF數(shù)據(jù)讀取與產(chǎn)品顯示[J].氣象科技,2010,38(2):230-234.

[4] 樊軍偉.基于GDAL的NetCDF數(shù)據(jù)提取遙感影像數(shù)據(jù)信息的研究[D].撫州:東華理工大學,2013.6:23-60.

[5] 白偉華,孫越強,朱光武,等.基于NetCDF的GPS數(shù)據(jù)預處理[C]//中國空間科學學會空間探測專業(yè)委員會第十九次學術會議論文集(下冊).中國空間科學學會空間探測專業(yè)委員會,2006:660-662.

[6] 賈俊濤,孟嬋媛,宋海英,等.基于NetCDF的海底地形網(wǎng)格數(shù)據(jù)模型創(chuàng)建與調度[J].海洋測繪,2007,2(5):22-25.

[7] 劉文軍,李靖,袁昌洪,等.基于NetCDF數(shù)據(jù)模型的氣息資料存儲設計[J].安徽農(nóng)業(yè)科學,2009,37(3):1370-1371.

[8] 王想紅,劉紀平,徐勝華,等.基于NetCDF數(shù)據(jù)模型的海洋環(huán)境數(shù)據(jù)三維可視化研究[J].測繪科學,2013,38(2):59-61.

[9] 李永生,劉修偉,楊玉紅.氣象大數(shù)據(jù)跨平臺分析與應用技術研究[J].電腦知識與技術,2013,9(31):6943-6947.

[10] REW R,DAVIS G,EMMERSON S,et al.The NetCDF Users Guide[Z].2010:1-98.

[11] REW R,DAVIS G,EMMERSON S,et al.NetCDF Users Guide for FORTRAN[Z].1997:1-159.

长丰县| 高台县| 卫辉市| 通山县| 淮北市| 黎城县| 西城区| 博罗县| 克什克腾旗| 桓仁| 扶沟县| 奎屯市| 句容市| 三亚市| 玉门市| 湖州市| 梁山县| 张家界市| 册亨县| 镇巴县| 塔城市| 镶黄旗| 综艺| 昂仁县| 揭西县| 莲花县| 洮南市| 布尔津县| 晋州市| 镇原县| 灵山县| 安达市| 玛多县| 遂川县| 班玛县| 东至县| 白河县| 抚远县| 凤城市| 林甸县| 钟祥市|