前言

    做一个项目需要用到火星大气数据库进行建模。当前广泛使用的高精度火星大气数据库有NASA的Mars-GRAM和欧洲的MCD(Mars Climate Database)。NASA的火星大气数据库需要申请并提供个人或学校的信息进行审核,还需要国外的电话号码,我的申请没有收到回信。因此选用欧洲的MCD数据库,MCD数据库是开源免费的,下面记录一下MCD数据库的安装过程。

    提前声明,后面的安装过程涉及到Linux系统,本人在配置之前对于Linux一窍不通,如果文章有问题或者更好的方法欢迎指点讨论

一、下载MCD数据库

   MCD数据库的下载链接:http://www-mars.lmd.jussieu.fr/

emma数据库 maude数据库_数据库

 

        点击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系统文件夹

emma数据库 maude数据库_linux_02

   配置完成后,我的系统数据如下:

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浏览器访问无反应,如图

emma数据库 maude数据库_emma数据库_03


   

   如果访问失败,可以启用ftp功能再尝试,启动方式为

   控制面板=>程序=>启用或关闭Windows功能,打开Internet information Services勾选FTP服务器以及其下的FTP服务、FTP扩展性。如图

emma数据库 maude数据库_linux_04

     在/usr/local下建立software文件夹,将四个库全部解压放在文件夹下,如图

emma数据库 maude数据库_数据库_05


    注意,每个文件夹内部应当是包含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文件中的地址

emma数据库 maude数据库_f5_06

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中的路径参数

emma数据库 maude数据库_emma数据库_07

   输入

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运用这方面网上的资料较少,希望各位大佬指点简单的配置方法。