NEMO海洋模型的安装、搭建与运行


笔者在安装构建NEMO(Nucleus forEuropeanModelling of theOcean)的时候苦于资料太少,花费了不少时间和精力,踩了不少坑。因此笔者将安装过程进行总结,以供大家参考。

1. 系统信息

OS信息:Linux black 5.15.0-89-generic #99-Ubuntu x86_64 GNU/Linux

安装路径:软件安装包放在: /home/czhang/softwarepkg

相关依赖软件安装在:/home/czhang/local

NEMO安装在:/home/czhang/NEMO

XIOS安装在:/home/czhang/xios

各软件安装版本如下:
curl-7.81.0
hdf5-1.14.3
mpich-4.2.0
netcdf-c-4.7.4
netcdf-fortran-4.5.3
pnetcdf-1.12.3
szip-2.1.1
zlib-1.2.11

2. 安装MPICH

在/home/czhang/local下创建mpich文件夹

$ tar -zxvf mpich-4.2.0.tar.gz
$ cd mpich-4.2.0
$ ./configure --prefix=/home/czhang/local/mpich
$ make
$ make install

安装后需要将mpich的相应路径添加到环境变量当中。

export LD_LIBRARY_PATH=/home/czhang/local/mpich/lib
export PATH=$PATH:/home/czhang/local/mpich/bin

也可以在.bashrc中,添加随后 source ~/.bashrc

3. 安装NetCDF

在/home/czhang/local下创建netcdf文件夹。安装的每一个依赖软件均需在其源代码目录下进行

(1)安装zlib

$ tar -zxvf zlib-1.2.11.tar.gz
$ cd zlib-1.2.11
$ ./configure --prefix=/home/czhang/local/netcdf
$ make
$ make install

(2)安装szip

$ tar -zxvf szip-2.1.1.tar.gz
$ cd szip-2.1.1
$ ./configure --prefix=/home/czhang/local/netcdf
$ make
$ make install

(3)安装curl

$ tar -zxvf curl-7.81.0.tar.gz
$ cd curl-7.81.0
$ ./configure --prefix=/home/czhang/local/netcdf -with-openssl    # 这里要看自己系统上用的什么ssl
$ make
$ make install

(4)安装HDF5

$ tar -zxvf hdf5-1.14.3.tar.gz
$ cd hdf5-1.14.3
$ export CPPFLAGS=-I /home/czhang/local/netcdf/include
$ export LDFLAGS=-L /home/czhang/local/netcdf/lib
$ export LD_LIBRARY_PATH=/home/czhang/local/netcdf/lib
$ ./configure --prefix=/home/czhang/local/netcdf --enable-parallel --enable-fortran
$ make
$ make install

(5)安装PNetCDF

在/home/czhang/local下创建pnetcdf文件夹,pnetcdf安装在该文件夹中

$ tar -zxvf pnetcdf-1.12.3.tar.gz
$ cd pnetcdf-1.12.3
$ ./configure --prefix=/home/czhang/local/pnetcdf --enable-fortran --enable-large-file-test --enable-shared
$ make
$ make install

(6)安装NetCDF-C

$ tar -zxvf netcdf-c-4.7.4.tar.gz
$ cd netcdf-c-4.7.4
$ ./configure --prefix=/home/czhang/local/netcdf --enable-pnetcdf --enable-large-file-tests --enable-largefile  --enable-parallel-tests --enable-shared  --with-pic --disable-doxygen  --enable-netcdf-4     
$ make
$ make install

成功后会有 congratulations

(7)安装NetCDF-Fortran

$ tar -zxvf netcdf-fortran-4.5.3.tar.gz     # 注意:该版本需要netcdf-c在4.7.4及以上
$ cd netcdf-fortran-4.5.3
$ export LIBS=-lnetcdf
$ ./configure --prefix=/home/czhang/local/netcdf --disable-static --enable-shared --with-pic --enable-parallel-tests --enable-large-file-tests --enable-largefile           
$ make
$ make install

成功后会有 congratulations

安装完成后需要配置环境变量,笔者在 .bashrc 文件添加的内容如下:

export DIR=/home/czhang/local
export NETCDF=$DIR/netcdf
export MPI=$DIR/mpich
export PNETCDF=$DIR/pnetcdf

export CPPFLAGS="-I$MPI/include -I$NETCDF/include -I$PNETCDF/include"
export LDFLAGS="$LDFLAGS -L$NETCDF/lib -L$MPI/lib -L$PNETCDF/lib -I$NETCDF/include"
export FCFLAGS="-fallow-argument-mismatch"
export FFLAGS="-I$MPI/include -L$MPI/lib -I$NETCDF/include -fallow-argument-mismatch"

export NCDF_F_HOME=$NETCDF
export NCDF_C_HOME=$NETCDF
export HDF5_HOME=$NETCDF

export LD_LIBRARY_PATH=$MPI/lib:$NETCDF/lib:$PNETCDF/lib:$LD_LIBRARY_PATH
export PATH=$PATH:$MPI/bin:$NETCDF/bin:$NETCDF/include

export CC=mpicc #gcc
export CXX=mpicxx     #g++
export FC=mpif90     #gfortran
export FCFLAGS="-m64 $FCFLAGS" 
export F77=mpif77    #gfortran
export FFLAGS="-m64 $FFLAGS"

配置好了之后,检查一下版本和路径

4. 安装XIOS

提取并解析XIOS源代码,并将安装文件夹命名为xios。

svn co http://forge.ipsl.jussieu.fr/ioserver/svn/XIOS2/trunk xios

在 xios/arch 目录下找到相应的架构配置文件并修改。笔者这里是用的GCC_LINUX,需要修改 .path, .env, .fcm 文件。

# arch-GCC_LINUX.env

export HDF5_INC_DIR=$HOME/local/netcdf/include          #根据自己情况修改
export HDF5_LIB_DIR=$HOME/local/netcdf/lib              #根据自己情况修改

export NETCDF_INC_DIR=$HOME/local/netcdf/include        #根据自己情况修改
export NETCDF_LIB_DIR=$HOME/local/netcdf/lib            #根据自己情况修改

export BOOST_INC_DIR=$HOME/boost
export BOOST_LIB_DIR=$HOME/boost

具体路径需要根据自己的安装路径做相应修改。

# arch-GCC_LINUX.fcm

################################################################################
###################                Projet XIOS               ###################
################################################################################

%CCOMPILER      /home/czhang/local/mpich/bin/mpicc       #根据自己情况修改
%FCOMPILER      /home/czhang/local/mpich/bin/mpif90      #根据自己情况修改
%LINKER         /home/czhang/local/mpich/bin/mpif90      #根据自己情况修改

%BASE_CFLAGS    -w -std=c++11 -D__XIOS_EXCEPTION -D_GLIBCXX_USE_CXX11_ABI=0 -ffree-line-length-none   #这个标志需要在原基础上添加一些东西
%PROD_CFLAGS    -O3 -DBOOST_DISABLE_ASSERTS
%DEV_CFLAGS     -g -O2
%DEBUG_CFLAGS   -g

%BASE_FFLAGS    -D__NONE__
%PROD_FFLAGS    -O3
%DEV_FFLAGS     -g -O2
%DEBUG_FFLAGS   -g

%BASE_INC       -D__NONE__
%BASE_LD        -lstdc++

%CPP            cpp
%FPP            cpp -P
%MAKE           make

具体路径需要根据自己的安装路径做相应修改,FLAGS按照上述修改即可。

# arch-GCC_LINUX.path

NETCDF_INCDIR="-I $NETCDF_INC_DIR"
NETCDF_LIBDIR="-L $NETCDF_LIB_DIR"
NETCDF_LIB="-lnetcdff -lnetcdf"

MPI_INCDIR=""
MPI_LIBDIR=""
MPI_LIB=""

HDF5_INCDIR="-I $HDF5_INC_DIR"
HDF5_LIBDIR="-L $HDF5_LIB_DIR"
HDF5_LIB="-lhdf5_hl -lhdf5 -lhdf5 -lz"

以上只展示到了 HDF5 的设置,后面的不用改变。去除 lcurl 标志即可。

配置完成后就可以在xios源代码目录下进行编译了。输入命令:

./make_xios --full --arch GCC_LINUX -j 160 |& tee compile_log.txt

选用GCC_LINUX架构配置进行编译。-j 表示使用多少个线程进行编译,tee compile_log.txt 表示将编译产生的信息存储在txt文件中,这是为了出问题时方便查看。

XIOS编译的时间很长,同时编译完成后不会有成功或恭喜信息,看到 finished 并且没有 error 报错就说明完成了。

5. 安装并编译NEMO

创建NEMO文件夹,并将压缩包解压。编译NEMO之前同样需要修改架构配置文件。笔者这里使用的是linux_gfortran架构

在arch文件夹下找到 arch-linux_gfortran.fcm文件并修改

%NCDF_HOME           /home/czhang/local/netcdf
%HDF5_HOME           /home/czhang/local/netcdf
%NCDF_C_HOME         /home/czhang/local/netcdf
%NCDF_F_HOME         /home/czhang/local/netcdf
%XIOS_HOME           /home/czhang/xios

%NCDF_INC            -I%NCDF_F_HOME/include -I%NCDF_C_HOME/include -I%HDF5_HOME/include
%NCDF_LIB            -L%NCDF_F_HOME/lib -lnetcdff -L%NCDF_C_HOME/lib -lnetcdf -lstdc++
%XIOS_INC            -I%XIOS_HOME/inc
%XIOS_LIB            -L%XIOS_HOME/lib -lxios -lstdc++

%OASIS_INC           -I%OASIS_HOME/build/lib/mct -I%OASIS_HOME/build/lib/psmile.MPI1
%OASIS_LIB           -L%OASIS_HOME/lib -lpsmile.MPI1 -lmct -lmpeu -lscrip

%CPP	             cpp -Dkey_nosignedzero
%FC	             mpif90 -c -cpp
%FCFLAGS             -I/home/czhang/local/netcdf/include $(FCFLAGS) -fdefault-real-8 -O3 -funroll-all-loops -fcray-pointer -ffree-line-length-none -fallow-argument-mismatch -cpp
%FFLAGS              %FCFLAGS
%LD                  mpif90
%LDFLAGS
%FPPFLAGS            -P -C -traditional
%AR                  ar
%ARFLAGS             rs
%MK                  make
%USER_INC            %XIOS_INC %NCDF_INC
%USER_LIB            %XIOS_LIB %NCDF_LIB

%CC                  cc
%CFLAGS              -O0

在该配置文件中需要指明netcdf,hdf5,xios的路径

之后就可以进行NEMO 的编译。在源代码根目录进行:

./makenemo -m linux_gfortran -r GYRE_PISCES -n test1

之后就可以在cfgs文件夹下看到test1文件夹,其中包含 BLD, EXP00, MY_SRC, WORK, cpp_test1.fcm,在EXP00文件夹下有nemo执行程序

6. 运行NEMO

在EXP00文件夹下,有一些初始化的输入文件(namelist,用于输入的*.xml文件等),如果需要使用其他输入文件需要将他们放在这个文件夹中

$ cd cfgs/test1/EXP00/         # 进入EXP00文件夹中
$ mpirun -n $NPROCS ./nemo     # $NPROCS 是指要运行的线程数 , mpirun是自己系统的MPI的封装接口

7. 对于NEMO的一些配置

7.1 更改输入输出文件路径

namelist_ref文件中

cn_ocerst_indir = "./input"         !  directory from which to read input ocean restarts
cn_ocerst_outdir = "./output_ocean_restart"        !  directory in which to write output ocean restarts

namelist_top_ref文件中

cn_trcrst_outdir = "./output_restart_trcrst"          !  directory to which to write output passive tracer restarts

file_def_nemo.xml文件中

<file_definition type="multiple_file" name="output_time/@expname@_@freq@_@startdate@_@enddate@" sync_freq="1mo" min_digits="4">

mesh_mask文件 和 ocean_output文件无法更改输出目录,除非修改NEMO源代码

7.2 部分参数的作用

! 在namelist_cfg文件中,调整分辨率
! jpiglo, jpjglo参数不应该出现在该文件中,不用调整
nn_GYRE     =    25     !  GYRE resolution [1/degrees] 。分辨率(度)的倒数
ln_bench    = .true.   !  ! =T benchmark with gyre: the gridsize is kept constant。将NEMO用于作为Benchmark
jpkglo      =    31     !  number of model levels。模拟时的模型层数或深度
rn_Dt      =   7200.    !  time step for the dynamics。设置模拟的时间步长


! 在namelist_ref文件中,调整用于MPI并行计算的网格点,将两个参数设置为0使得系统自动调整网格
jpni        =   0       !  number of processors following i (set automatically if < 1), see also ln_listonly = T
jpnj        =   0       !  number of processors following j (set automatically if < 1), see also ln_listonly = T

模型运行的信息在 ocean.output 文件中,通过该文件展示的信息来判断应该用多少MPI进程

References:


文章作者: Antonio
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Antonio !
  目录