999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人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ù)的人員有指導(dǎo)和參考價值。

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

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

NetCDF name{

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

Variables:… //定義變量

Attributes:… //屬性

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

}

其軟件實現(xiàn)形式是一個免費的NetCDF 軟件包,內(nèi)含可訪問 NetCDF 數(shù)據(jù)的工具程序和多種語言的接口函數(shù)庫,其接口可以在Fortran、C、C++和IDL等多種語言下使用,同時支持多種操作平臺下(Linux、Windows等)的讀取以及在異構(gòu)的網(wǎng)絡(luò)平臺間進行數(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對應(yīng)的netcdf.lib這個lib文件,而libcurl.dll和zlib1.dll對應(yīng)的lib不需要。因為libcurl.dll和zlib1.dll是通過netcdf.dll調(diào)用其庫函數(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下,點擊菜單“生成”里的編譯,接著點擊“生成”里的生成,最后點擊“調(diào)試”里的開始執(zhí)行即可(圖1)。若要讀取其他類型數(shù)據(jù),只需按照使用說明找到對應(yīng)的讀取函數(shù)即可,具體可參考NetCDF使用說明[10-11]。

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

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

}

在上述工作的基礎(chǔ)上用VS2010編譯成.dll格式,就可以供Fortran使用了。編譯具體步驟為:①在新建win32控制臺應(yīng)用程序的應(yīng)用程序類型中選擇dll;②編譯生成即可,然后在對應(yīng)debug或release中可看到lib和dll文件。圖2為創(chuàng)建C語言dll庫的截圖。對應(yīng)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調(diào)用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ù)讀取應(yīng)該完全正確。運行速度是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 結(jié)語

該研究在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)建與應(yī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ù)預(yù)處理[C]//中國空間科學學會空間探測專業(yè)委員會第十九次學術(shù)會議論文集(下冊).中國空間科學學會空間探測專業(yè)委員會,2006:660-662.

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

[7] 劉文軍,李靖,袁昌洪,等.基于NetCDF數(shù)據(jù)模型的氣息資料存儲設(shè)計[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ù)跨平臺分析與應(yīng)用技術(shù)研究[J].電腦知識與技術(shù),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.

主站蜘蛛池模板: 99久久精品久久久久久婷婷| 波多野结衣的av一区二区三区| 手机在线免费不卡一区二| 国产乱人激情H在线观看| 国产精品网址你懂的| 欧美午夜性视频| 免费毛片网站在线观看| 中文字幕人成人乱码亚洲电影| 国产一区二区色淫影院| 亚洲国产亚综合在线区| 九九精品在线观看| 激情网址在线观看| 国产精品天干天干在线观看| 中文无码精品a∨在线观看| 青青青国产视频手机| 亚洲精品国偷自产在线91正片| 亚洲无码免费黄色网址| 40岁成熟女人牲交片免费| 欧美精品伊人久久| 日韩在线视频网站| 亚洲精品黄| 亚洲国产中文精品va在线播放| 国产午夜福利在线小视频| 久久77777| 一级毛片a女人刺激视频免费| 中文字幕在线播放不卡| 91九色国产porny| 国产亚洲现在一区二区中文| 国产午夜一级淫片| 日韩福利在线视频| 思思热在线视频精品| 亚洲人成网站在线播放2019| 国产成人一二三| 亚洲中文字幕久久无码精品A| 91成人免费观看在线观看| 国产乱人伦AV在线A| 四虎成人精品| 国产在线一二三区| 996免费视频国产在线播放| 黄色在线不卡| 国产日韩欧美一区二区三区在线| 毛片卡一卡二| 青青草91视频| 久久久久久国产精品mv| 午夜老司机永久免费看片| 欧美在线视频不卡第一页| 99re热精品视频中文字幕不卡| 国产性猛交XXXX免费看| 成人国产精品2021| 国产九九精品视频| 久久国产高清视频| 青青国产在线| 夜夜操国产| 成人免费一级片| 欧美一区二区自偷自拍视频| 日韩天堂视频| 青青青伊人色综合久久| 久久精品一卡日本电影| 亚洲成人在线免费观看| 怡春院欧美一区二区三区免费| 美女一级毛片无遮挡内谢| 91久久偷偷做嫩草影院免费看| 无码日韩精品91超碰| 一级毛片在线免费看| av无码一区二区三区在线| 91亚洲免费| 日韩美毛片| 无套av在线| 日韩欧美亚洲国产成人综合| 亚洲日本在线免费观看| 久久综合九色综合97网| 中文字幕 欧美日韩| 亚洲日本在线免费观看| 美女高潮全身流白浆福利区| 国产成人综合久久精品下载| 精品在线免费播放| 亚洲无码精彩视频在线观看| 欧美黄网站免费观看| 青青久视频| 四虎国产永久在线观看| 欧美在线观看不卡| 尤物特级无码毛片免费|