首页 >

使用IVF读取netCDF数据

作者:wangkeu  日期:11-24
来源:Cold cold,╰☆君の鋇♂
Netcdf格式数据简称nc数据,其为带有数据描述信息的2进制文本文件,无法使Fortran文本文件(有格式)方式读取,使用二进制(无格式)方式读取也非常的麻烦。
而通过netcdf接口函数库访问netcdf格式的数据[1]则会轻松很多。在Linux使用ifort等编译器可以轻松实现该功能,而本文主要论述在window7下如何实现ivf编译器读取nc数据问题,主要过程分为2步走:设置netcdf环境变量、配置ivf编译环境。
感谢:Unidata 的原始开发,Dr. Yan Haoming 的重新封装和预构建,作者 coldCold 和╰☆君の鋇♂。

注意:经过查阅相关网站,大致可以获得以下信息:
(1)读取的关键在于ivf编译环境的配置,本质是对netcdf接口库函数的调用。
(2)netcdf的版本众多,所以一定要下载适合自己系统和编译器的netcdf文件。部分帖子及管网给出的信息表明netcdf4.1.3版本之后需要先安装netcdf-c及netcdf-f,而之前版本两者则是合并的[2],但不确定此处是否针对Linux操作环境。同时,使用gcc编译器与ivf编译器的配置方法是否相同,还需要进一步的实验。但是基本原理大致相同。
[1]http://www.docin.com/p-586215279.html
[2]http://bbs.06climate.com/forum.php?mod=viewthread&tid=15197

下面说明netcdf的环境变量及ivf编译环境的设定。
操作环境: window7+64位操作系统 ;ivf2011编译环境(32 / 64位)。
主要参考blog如下:
(1)http://blog.sina.com.cn/s/blog_618af1950100kqou.html
(2)http://blog.csdn.net/h4x0r_007/article/details/46900293

第一步:配置netcdf path环境变量
下载预编译的文件包(主要参考blog(2),结合blog(1))
(1)可从网址 http://fcode.cn/download/fcode/NetCDF.Win32.for.CVF.IVF.zip
获得:NetCDF3.6.1Beta1.Win32.for.CVF.IVF.rar 压缩文件包。
64位下载地址:http://fcode.cn/download/fcode/NetCDF.x64.for.IVF.zip (原网址:http://www.unidata.ucar.edu/software/netcdf/)
(2)解压缩成某个文件夹,比如C:\ntecdf3.6.1Beta。此时你可以获得bin、lib、include、F90等多个文件夹,这些文件恰恰是需要使用的netcdf库文件,其余文件为netcdf函数参考手册。
其中,bin文件中的ncdump.exe可以配合grads等软件直接获取nc数据文件的信息,详情可以参考http://bbs.06climate.com/forum.php?mod=viewthread&tid=8413
(3)将bin目录追加入path,操作方法为:
计算机=>右键=>属性=>高级系统设置=>环境变量=>系统变量
在Path里面追加:C:\NetCDF3.6.1Beta\bin(各个路径是用英文字符;分割,切勿删除原有的path路径)
此后可以进行另一步操作:将 C:\ntecdf3.6.1Beta\bin 目录下的 netcdf.dll 文件拷贝到 C:\windows 目录下,这一步操作有时候不需要,但是建议这样操作,以防出现问题(不知道是否和64位系统有关)。
注意:注意修改path后,需要重启计算机或者先注销后登陆才会起作用。

第二步:设置Intel Visual Fortran Compiler环境
打开 Visual Studio,点击工具菜单=>选项=>Intel Visual Fortran=>compilers
点击Libraries,加入如下文件夹:
C:\ntecdf3.6.1Beta\netcdf\F90\IVF\lib
C:\ntecdf3.6.1Beta\lib

大图

点击Includes, 加入如下文件夹(效果如图1):
C:\ntecdf3.6.1Beta \include
C:\ntecdf3.6.1Beta \F90\IVF\include

大图

现在可以在IVF编译器下进行程序测试,可能会出现的错误为:


大图

产生这个错误的原因是:
netcdf.lib(及其他几个lib)是在Release下发布的(依赖运行时库Libcmt.lib),而如果我们的程序在debug下编译(依赖运行时库LibcmtD.lib),则会产生两个版本的一摸一样的运行时函数,产生命名冲突。
解决办法:
1. 可以切换到 Release 方式编译
2. 也可以在项目上右键属性=>配置属性=>Linker=>Input=>Ignore specific library,键入Libcmt.lib(或 LibcmtD.lib)

大图

此时便可以成功生成解决方案,并可以运行程序。


大图


此处的ncfileid在进行子程序调用过程中便可以或得,是由系统分配的,其值也表明程序正常运行。


备注:netCDF 函数库的使用可从官网获得或者参考压缩文件中提及的 pdf 文档,但本人只是进行了2个简单的测试,并未研读相关的函数,特此说明。
常规|工具|专业|读物|
代码|教学|算法|
首页 >
FortranCoder手机版-导航