前言
做一个项目需要用到火星大气数据库进行建模。当前广泛使用的高精度火星大气数据库有NASA的Mars-GRAM和欧洲的MCD(Mars Climate Database)。NASA的火星大气数据库需要申请并提供个人或学校的信息进行审核,还需要国外的电话号码,我的申请没有收到回信。因此选用欧洲的MCD数据库,MCD数据库是开源免费的,下面记录一下MCD数据库的安装过程。
提前声明,后面的安装过程涉及到Linux系统,本人在配置之前对于Linux一窍不通,如果文章有问题或者更好的方法欢迎指点讨论
一、下载MCD数据库
MCD数据库的下载链接:http://www-mars.lmd.jussieu.fr/
点击Access the database进入获取界面。MCD数据库提供Web版和完全版,如果只需要简单的数据和图像可以直接使用Web版。填写提交信息即可获得下载连接(提交信息不会进行验证)。
解压下载好的文件,user_manual(用户手册)位于doc文件夹中。
阅读用户手册可知
- MCD以NetCDF格式文件存储相关火星数据,以Fortran语言代码读取并计算大气数据。MCD提供的Fortran代码读取计算需要NetCDF库,这个库需要自己下载并配置。
- MCD提供相关的C\C++、Matlab、Python接口直接调用MCD数据库
二、安装NetCDF库
NetCDF库的下载链接:https://www.unidata.ucar.edu/software/netcdf/
NetCDF库分为netcdf-c、netcdf-fortran、netcdf-cxx、netcdf-java等,MCD需要调用的库为netcdf-fortran。netcdf-4.2以上将netcdf-c和netcdf-fortran库独立发展,需要编译安装的是netcdf-fortran库。
netcdf-fortran库由于本地的Fortran编译器类型和版本不同无法直接使用,因此需要通过源代码进行编译,形成可利用的include、lib文件夹。netcdf-fortran官方文档只提供了Linux系统下的编译安装方法。下面提供Windows平台和Linux平台的操作方法(Windows平台我配置失败,但图方便可以尝试一下)
Windows平台
- 利用OneAPI+Visual Studio配置Fortran语言环境
- 利用CMake编译netcdf-fortran源代码
利用OneAPI配置Fortran语言环境参考较多,利用CMake编译源码参考文章
MCD在Windows系统的安装方法可参考MCD官网的FAQ
1.Linux平台
由于我在Windows平台上尝试的解决方案都失败了,于是只能转移到Linux平台上进行配置。我采用Windows自带的Linux子系统功能WSL配置Linux环境。注意:WSL功能只适用于Win10及以上,请注意电脑是否支持此功能。
配置WSL的相关资料较多,Linux版本对于后续的编译影响不大。安装完成后,会在此电脑界面左下方出现Linux系统文件夹
配置完成后,我的系统数据如下:
Windows11 22000.1574
Ubuntu 22.04.1 LTS
GNU Fortran (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
如果缺少相关组件,可以执行以下代码安装
#更新包列表
sudo apt update
#安装 build-essential组件
sudo apt install build-essential
#安装gfortran
sudo apt-get install gfortran
#安装g++
sudo apt-get install g++
#检查版本
gcc --version
gfortran --version
2.下载依赖库
根据说明文档,要安装netcdf-fortran库需要先安装netcdf-c库。官方网站提供了netcdf-c库的源代码文件和二进制代码文件。二进制代码文件提供适用于Windows系统的直接安装程序,而在Linux环境下需要通过源代码文件进行编译。
根据官方文档,netcdf-c库编译需要依赖zlib库和hdf5库。故需要下载的库为
zlib-1.2.8 https://www.zlib.net/ hdf5-1.10.5 https://portal.hdfgroup.org/display/support/HDF5+1.10.5 netcdf-c-4.3.2 netcdf-fortran-4.5.2 ftp://ftp.unidata.ucar.edu/pub/netcdf
其中netcdf相关的旧版本、预编译版本和相关依赖库都可以在第三个链接中找到
注意,ftp链接可以在本机此电脑上方的地址栏直接访问,用edge浏览器访问无反应,如图
如果访问失败,可以启用ftp功能再尝试,启动方式为
控制面板=>程序=>启用或关闭Windows功能,打开Internet information Services勾选FTP服务器以及其下的FTP服务、FTP扩展性。如图
在/usr/local下建立software文件夹,将四个库全部解压放在文件夹下,如图
注意,每个文件夹内部应当是包含makefile和configure文件的源代码文件,如果还嵌套一个文件夹请将其移出。在/usr/local下建立wrf文件夹,后面会将库的编译结果放在这里,为了防止再多个引用文件出现问题,将所有库装在一起。
3.安装zlib-1.2.8
打开终端,进入Linux命令行,输入
cd /usr/local/software/zlib-1.2.8
sudo ./configure --prefix=/usr/local/wrf
sudo make check install
如果在第二步出现错误如下:
1.permission denied:访问权限不够,输入
chmod 777 configure
2.-bash: ./configure: No such file or directory : 查看文件夹中是否有configure文件(是否是源代码文件)
安装zlib库一般不会出现什么问题
4.安装hdf5-1.10.5
输入
#进入hdf5-1.10.5文件夹
cd ..
cd hdf5-1.10.5
#安装hdf5-1.10.5
sudo make
sudo make check
sudo make install
在sudo make或make check过程中出现错误,提示需要安装m4库。与上述库类似,在官网上下载m4库压缩包,将m4库解压至/usr/local/software文件夹下。
m4库下载链接:http://mirrors.kernel.org/gnu/m4/
同理,进入m4文件夹,安装m4
cd m4-1.4.6
sudo ./configure
sudo make
sudo make install
安装完成后继续完成hdf5库的安装步骤。安装完成后,会在wrf/include和wrf/lib中出现hdf5相关文件。
5.安装netcdf-c
输入命令
sudo CPPFLAGS=-I/usr/local/wrf/include LDFLAGS=-L/usr/local/wrf/lib ./configure --prefix=/usr/local/wrf --disable-dap
这一步高版本的netcdf-c库会出现如下错误,如netcdf-c-4.9.1
configure: error: curl required for byte range support. Install curl or build without --enable-byterange.
解决方法:更换低版本的netcdf-c库,如netcdf-c-4.6.2
继续出现其他错误
SKIP: 0
XFAIL: 0
FAIL: 2
XPASS: 0
ERROR: 0
see ncgen3/test-suit.log
查看日志文件,错误信息为 permission denied 访问权限不足。解决方法:将netcdf-c-4.6.2文件全部提升权限,输入
cd ..
chmod -R 777 netcdf-c-4.6.2
cd netcdf-c-4.6.2
sudo make check
sudo make install
安装成功
6.安装netcdf-fortran-4.5.2
cd ..
cd netcdf-fortran-4.5.2
sudo CPPFLAGS=-I/usr/local/wrf/include LD_LIBRARY_PATH=/usr/local/wrf/lib:/usr/lib:${LD_LIBRARY_PATH} LDFLAGS=-L/usr/local/wrf/lib ./configure --prefix=/usr/local/wrf
sudo make
出现如下错误
Type mismatch between actual argument at (1) and actual argument at (2) (INTEGER(1)/REAL(8)).
问题原因:gcc和gfortran版本过高 解决方法:更换低版本
gfortran --version
gcc --version
# GNU Fortran (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
# gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
安装低版本的编译器并重新编译
#安装低版本的gcc gfortran
sudo apt-get install gcc-9
sudo apt-get install gfortran-9
#调整默认使用版本
#调整gcc-11的优先级为40,gcc-9的优先级为100
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 40
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 100
#调整gfortran-11的优先级为40,gfortran-9的优先级为100
sudo update-alternatives --install /usr/bin/gfortran gfortran /usr/bin/gfortran-11 40
sudo update-alternatives --install /usr/bin/gfortran gfortran /usr/bin/gfortran-9 100
#重新编译
sudo make
sudo make check
又出现如下错误
#出现错误
#FAIL: run_examples.sh
#FAIL: run_examples_4.sh
#============================================================================
#Testsuite summary for netCDF-Fortran 4.5.2
#============================================================================
# TOTAL: 2
# PASS: 0
# SKIP: 0
# XFAIL: 0
# FAIL: 2
# XPASS: 0
# ERROR: 0
#============================================================================
#See examples/F77/test-suite.log
#Please report to support-netcdf@unidata.ucar.edu
#============================================================================
打开日志文件发现错误同样为:Permission denied ,同理提升权限
cd ..
chmod -R 777 netcdf-fortran-4.5.2
cd netcdf-fortran-4.5.2
#重新检查
sudo make check
sudo make install
没有错误后,设置环境变量
export CC=gcc
export CXX=g++
export FC=gfortran
export F90=gfortran
export F77=gfortran
export WRF=/usr/local/wrf
export PATH=$WRF/bin:$PATH
export LD_LIBRARY_PATH=usr/local/wrf/lib:$WRF/lib:$LD_LIBRARY_PATH
export CPPFLAGS='-I/usr/local/wrf/include'
export LDFLAGS='-L/usr/local/wrf/lib'
注意,这一段环境变量可以写成脚本,每次重新启动终端后运行一次。检测安装结果
ncdump
最后结果为
netcdf library version 4.6.2 of Feb 27 2023 10:54:22 $
安装成功
三、MCD以及C/C++接口测试
1.MCD测试
将MCD放入Linux的/home文件夹下,进入mcd文件夹。阅读README和compile文件,修改compile文件中的地址
NCDFINC=/usr/local/wrf/include
NCDFLIB=/usr/local/wrf/lib
gfortran MCD.F90 test_mcd.F90 -I. -I$NCDFINC -L$NCDFLIB -lnetcdff -o test_mcd
运行compile文件,生成test_mcd文件,运行test_mcd文件,如果出现输入数据库参数则运行成功
sudo bash compile
sudo ./test_mcd
还可以通过MCD给予的testcase进行测试,方法如下
进入testcase文件夹,运行TEST_SCRIPT脚本。如果出现 Permission denied 则同理提升权限
cd testcase
chmod 777 TEST_SCRIPT
sudo ./TEST_SCRIPT
出现数据即为成功。
2.配置C/C++接口
进入mcd/interfaces/c_interfaces文件夹,修改makefile中的路径参数
输入
make
生成MCD.o test_mcd_c test_mcd_cpp三个执行文件。运行test_mcd_cpp文件报错。
sudo ./test_mcd_cpp
查看test_mcd_cpp依赖库文件
sudo ldd ./test_mcd_cpp
结果为
root@softdream:/home/MCD_6.1/MCD_6.1_queleclim/mcd/interfaces/c_interfaces# ldd test_mcd_cpp
linux-vdso.so.1 (0x00007ffc45b82000)
libnetcdff.so.7 => /usr/local/wrf/lib/libnetcdff.so.7 (0x00007fbdbeec9000)
libgfortran.so.5 => /lib/x86_64-linux-gnu/libgfortran.so.5 (0x00007fbdbebe9000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fbdbe9bf000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fbdbe8d8000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fbdbe8b8000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbdbe68e000)
libnetcdf.so.13 => /usr/local/wrf/lib/libnetcdf.so.13 (0x00007fbdbe570000)
libquadmath.so.0 => /lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007fbdbe528000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbdef05b000)
libhdf5_hl.so.100 => /usr/local/wrf/lib/libhdf5_hl.so.100 (0x00007fbdbe501000)
libhdf5.so.103 => /usr/local/wrf/lib/libhdf5.so.103 (0x00007fbdbe11f000)
libz.so.1 => /usr/local/wrf/lib/libz.so.1 (0x00007fbdbe103000)
如果出现某一so文件后为 not found 的情况,注意检查路径是否指向之前安装编译结果的文件夹。如果未能解决,可以将全部库文件放入/usr/lib文件夹中,并将路径重新指向此文件夹,代码如下。有些库文件可能默认放在/usr/lib中,当然其他地方也有可能,需要自己找一找。
export LD_LIBRARY_PATH=usr/lib:$WRF/lib:$LD_LIBRARY_PATH
继续运行test_mcd_cpp文件,出现输入参数情况即为成功。
sudo ./test_mcd_cpp
C++接口调整完毕,后续C++调用按照test_mcd_cpp中的例子编写即可。
总结
配置到现在已经基本完成了MCD在Linux系统上的使用,但无法在Windows中的Visual Studio或者Matlab中直接调用,需要在Linux系统下将数据导出为文件,再将文件转到Windows系统下读取来间接调用。这个问题暂时没有解决。
本次配MCD环境前后经历了Windows、Linux、Fortran语言、NetCDF库等的配置,大部分都是我不熟悉的方面。我尝试了很多方法,但由于个人水平有限始终没有成功。按照别人的方法走也总会出现许多莫名奇妙的问题。
有关MCD运用这方面网上的资料较少,希望各位大佬指点简单的配置方法。