亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        NetCDF格式在Windows及Linux平臺(tái)下的讀寫

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

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

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

        關(guān)鍵詞 NetCDF格式;Windows平臺(tái);Linux平臺(tái);讀寫速度與精度

        中圖分類號(hào) P49;S126 文獻(xiàn)標(biāo)識(shí)碼

        A 文章編號(hào) 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

        基金項(xiàng)目 國(guó)家自然科學(xué)基金項(xiàng)目(11175161)。

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

        收稿日期 2014-10-13

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

        目前大部分的氣象資料均為NetCDF格式,例如廣泛使用的中尺度天氣預(yù)報(bào)模式WRF,其輸出數(shù)據(jù)模式即為NetCDF,因此,準(zhǔn)確、快速的讀寫該類型數(shù)據(jù)是一項(xiàng)有意義的工作。查石祥探討了在Unix平臺(tái)下用Fortran讀取該類型數(shù)據(jù)的方法,但未討論寫成NetCDF的方法,而且該方法對(duì)系統(tǒng)環(huán)境依賴性大[1]。孫建偉等介紹了在Windows下用Fortran讀寫NetCDF格式的方法,但也需要?jiǎng)?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庫(kù)之后不再依賴NetCDF環(huán)境讀寫的方法,并且討論了在Windows和Linux下Fortran和C的讀寫以及讀寫的精度和速度,以便更快速更便捷地讀寫數(shù)據(jù)。

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

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

        NetCDF name{

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

        Variables:… //定義變量

        Attributes:… //屬性

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

        }

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

        2 Windows下的讀寫

        2.1 Windows下用C語(yǔ)言讀寫

        在Windows下對(duì)NetCDF格式數(shù)據(jù)的讀寫都要依賴于netcdf.dll、libcurl.dll和zlib1.dll這3個(gè)dll文件,這3個(gè)文件可由NetCDF官網(wǎng)下載或hdf官網(wǎng)下載,同時(shí)還需下載netcdf.dll對(duì)應(yīng)的netcdf.lib這個(gè)lib文件,而libcurl.dll和zlib1.dll對(duì)應(yīng)的lib不需要。因?yàn)閘ibcurl.dll和zlib1.dll是通過(guò)netcdf.dll調(diào)用其庫(kù)函數(shù)的。

        在有了這4個(gè)文件后,就可以寫C語(yǔ)言程序讀寫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ǎn)擊菜單“生成”里的編譯,接著點(diǎn)擊“生成”里的生成,最后點(diǎn)擊“調(diào)試”里的開始執(zhí)行即可(圖1)。若要讀取其他類型數(shù)據(jù),只需按照使用說(shuō)明找到對(duì)應(yīng)的讀取函數(shù)即可,具體可參考NetCDF使用說(shuō)明[10-11]。

        圖1 Windows下VS2010編譯C語(yǔ)言截圖

        如果不知道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ù)的程序?yàn)椋ㄒ詫懻投S數(shù)據(jù)為例):

        nc_create

        nc_def_dim

        nc_def_var

        nc_enddef

        nc_put_var_int

        nc_close

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

        2.2 Windows下用Fortran語(yǔ)言讀寫

        同樣,F(xiàn)ortran語(yǔ)言讀寫要依賴于netcdf.dll、libcurl.dll、zlib1.dll和netcdf.lib這4個(gè)文件。但這4個(gè)文件是C語(yǔ)言的,F(xiàn)ortran不能直接使用,官網(wǎng)也未公布Windows下Fortran的庫(kù),所以使用Fortran讀寫時(shí)要先用C語(yǔ)言做好可供Fortran使用的庫(kù)或者使用混合編譯的方法以實(shí)現(xiàn)Fortran對(duì)NetCDF的讀寫。該研究使用VS2010和Intel Fortran讀寫NetCDF格式數(shù)據(jù),所以得先用C語(yǔ)言將上述4個(gè)庫(kù)寫成可供Fortran用的庫(kù),以讀取整型二維數(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控制臺(tái)應(yīng)用程序的應(yīng)用程序類型中選擇dll;②編譯生成即可,然后在對(duì)應(yīng)debug或release中可看到lib和dll文件。圖2為創(chuàng)建C語(yǔ)言dll庫(kù)的截圖。對(duì)應(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í)行,這就實(shí)現(xiàn)了Fortran在Windows下的讀取,當(dāng)然,書寫的程序類似。該程序中的module塊是用來(lái)連接C生成的庫(kù)函數(shù)的,這是必須要的,如果是Fortran調(diào)用Fortran生成的庫(kù),則可以不需要。圖3為Windows下用Intel Fortran編譯Fortran程序的截圖。

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

        圖3 Windows下Intel Fortran編譯Fortran截圖

        3 Linux下的讀取

        在Linux下對(duì)NetCDF格式數(shù)據(jù)的讀寫只需要依賴于netcdf.a這1個(gè)文件即可。在NetCDF官網(wǎng)下載安裝包,然后在Linux成功安裝NetCDF,在lib文件夾里就可以看到該文件。Linux對(duì)NetCDF的讀取相比Windows要簡(jiǎn)單,C和Fortran語(yǔ)言都能讀該靜態(tài)庫(kù),以讀取整型二維數(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。為了比較運(yùn)行時(shí)間linux系統(tǒng)用的是虛擬機(jī)的Red Hat系統(tǒng),C編譯器是gcc,F(xiàn)ortran編譯器是pgi fortran和gfortran。讀取了一個(gè)WRF輸出的nc數(shù)據(jù)并寫成文本文件,對(duì)其精度進(jìn)行比較,發(fā)現(xiàn)數(shù)據(jù)差異很小,大部分時(shí)候完全一致,只有很小一部分在最后1位(小數(shù)點(diǎn)后6位)時(shí)數(shù)字才可相差1,所以數(shù)據(jù)讀取應(yīng)該完全正確。運(yùn)行速度是Windows下的Intel Fortran最快,Windows下的C最慢。在Linux下則是gcc較快而Fortran較慢,F(xiàn)ortran和pgi fortran速度接近。具體運(yùn)行速度數(shù)據(jù)見表1。

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

        5 結(jié)語(yǔ)

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

        參考文獻(xiàn)

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

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

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

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

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

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

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

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

        [9] 李永生,劉修偉,楊玉紅.氣象大數(shù)據(jù)跨平臺(tái)分析與應(yīng)用技術(shù)研究[J].電腦知識(shí)與技術(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.

        欧美aaaaaa级午夜福利视频| 国产一区二区三区四区在线视频| 丝袜美腿人妻第一版主| 伊人久久精品无码av一区| 人人妻人人爽人人澡欧美一区| 18无码粉嫩小泬无套在线观看| 三级全黄的视频在线观看| 中文字幕人妻乱码在线| 日本av一级片免费看| 精品国产第一国产综合精品| 玩弄少妇高潮ⅹxxxyw| 亚洲无码夜夜操| 亚洲精品一区二区三区蜜臀| 国产精品一区二区熟女不卡| 天天躁日日躁aaaaxxxx| 亚洲色丰满少妇高潮18p| 国产精品18久久久久网站 | av日本一区不卡亚洲午夜| 国产亚洲中文字幕久久网| 无码人妻丰满熟妇区免费| www插插插无码视频网站| 98在线视频噜噜噜国产| 日韩久久免费精品视频| 丝袜美腿国产一区二区| 成人内射国产免费观看| 日本边添边摸边做边爱的网站| 欧美成人精品福利在线视频| 国产91在线精品观看| 色综合久久中文字幕综合网| 久久www色情成人免费观看| 亚洲AV无码永久在线观看| 亚洲综合网中文字幕在线| 一区二区三区人妻av| 精品999日本久久久影院| 色老头久久综合网老妇女| 国产精品成人久久一区二区| 人妻久久一区二区三区| 国产又爽又大又黄a片| 国产av国片精品| 亚洲一码二码在线观看| 久久精品国产亚洲av不卡国产|