安装ROMS

昨天晚上安好ROMS,今天总结一下。
Google上的安装教程、视频也有很多,简单安装,复杂安装都有。
在自己笔记本虚拟机上安装得比较简单,就是打算实验一下,后续再去了解一下怎样丰富地去配置一下配置参数,再去装一下。 下面就将自己的安装思路写一下,如有不正确的地方还请指正。

How to install ROMS

安装主要参考https://www.myroms.org/wiki/ROMS_Cygwin,ROMS的官网。安装比较简单,按照他介绍的安装步骤差不多问题不大。就是他的安装步骤是老式的代码,所以有的地方需要改动一下。 也可以参考http://madiris.altervista.org/?p=248,跟他的安装步骤差不多,他用的是gfortran。

首先装subversion

sudo apt-get install subversion   

安装netcdf,netcdf之前安装了就不用再安装了。安装netcdf可以参考我之前的文章https://www.cnblogs.com/keegentang/p/11128618.html。昨天在看其他安装教程的时候发现用

sudo apt-get install libnetcdf-dev netcdf-bin  

也可以安装netcdf,没有试过,没有安装netcdf或者觉得前面安装netcdf安装不好的可以试试。
安装编译器,安装intel编译器的可以用icc(C),icpc(C++),fortran编译器用ifort,或者gfortran都行。我安装的intel的编译器。

下面只说和官网安装的不同。新代码都文件是以roms开头,所以教程里的ocean改为roms,如ocean_upwelling.in改为roms_upwelling.in,然后关于build_roms.bash的配置,我改了部分,仅供参考:

export        MY_ROOT_DIR=/home/keegen/ROMS  #我修改的是绝对路径
export     MY_PROJECT_DIR=${MY_ROOT_DIR}/Projects/Upwelling
export              FORT=ifort
export       USE_NETCDF4=on           #取消注释  
export   USE_PARALLEL_IO=on            #取消注释  
# export           USE_MPI=on            # 都注释掉
# export        USE_MPIF90=on            # compile with mpif90 script
#export         which_MPI=mpich         # compile with MPICH library
#export         which_MPI=mpich2        # compile with MPICH2 library
# export         which_MPI=openmpi       # compile with OpenMPI library
export        WRF_SRC_DIR=${MY_ROOT_DIR}/trunk/Atmosphere/WRF    #这个路径记得改一下  

然后Compile:

./build_roms.bash -j [n]  

如果处理器有多个的话可以加上-j参数,我虚拟机只分配了1个处理器,就没加-j参数。

接下来多去看一下视频和教程,学习更有效的编译ROMS方法。

————————————分割线 2019.8.3————————————

暑假放了俩周儿,距离写这篇文章差不多一个月了。现在做了一些改进,主要是openMP库在Intel Fortran并行计算的处理。
查看svn中ROMS库版本:

/home/keegen/ROMS/trunk# svn st -v Compilers/
969      937 arango       Compilers/AIX-xlf.mk

我的ROMS版本为969,933版之前和933版之后稍有不同,就是build文件中自定义库部分移到了Compilers/my_build_paths.bash中去了,所以将看不到build文件中 if [ -n "${USE_MY_LIBS:+1}" ]这一块儿,如果build文件中选择了export USE_MY_LIBS=on,那么一些个路径需要到my_build_paths.bash中设置为自己的路径。下面是我build.bash的设置:

# export           USE_MPI=on            # distributed-memory parallelism
# export        USE_MPIF90=on            # compile with mpif90 script
#export         which_MPI=mpich         # compile with MPICH library
#export         which_MPI=mpich2        # compile with MPICH2 library
# export         which_MPI=openmpi       # compile with OpenMPI library

export        USE_OpenMP=on            # shared-memory parallelism

export       USE_NETCDF4=on            # compile with NetCDF-4 library
#export   USE_PARALLEL_IO=on            # Parallel I/O with NetCDF-4/HDF5

# export USE_MY_LIBS=no            # use system default library paths
export USE_MY_LIBS=yes           # use my customized library paths

OpenMP Intel Fortran在安装之后默认都是支持的,所以可以使用OpenMP, 利用多线程和多核CPU来加速程序的执行。测试了一下,不使用OpenMP库2核4G内存在Upwelling算例中大约需要13分钟,使用OpenMP4分钟不到就可以运行结束。
因为选择了export USE_MY_LIBS=yes,我修改了my_build_paths.bash文件,只改变了两行:

if [ -n "${USE_NETCDF4:+1}" ]; then
      if [ -n "${USE_PARALLEL_IO:+1}" ] && [ -n "${USE_MPI:+1}" ]; then
        export       ESMF_DIR=${MPI_SOFT}/esmf_nc4
        export         NETCDF=${MPI_SOFT}/netcdf4
        export      NF_CONFIG=${NETCDF}/bin/nf-config
        export  NETCDF_INCDIR=${NETCDF}/include
        export        NETCDF4=1
      else
        export       ESMF_DIR=${MPI_SOFT}/esmf_nc4
        export         NETCDF=/usr/local/netcdf4      #修改了这一行,这是自己netcdf的安装路径
        export      NF_CONFIG=${NETCDF}/bin/nf-config
        export  NETCDF_INCDIR=${NETCDF}/include
        export    NETCDF_LIBDIR=${NETCDF}/lib     #加了这一行,但是不知道有没有用
        export        NETCDF4=1

当然必须在ifort节内修改才有效。然后进行编译:

./build_roms.bash -j 2   #虚拟机分配了2个CPU

生成了romsO的可执行文件,在执行./romsO <roms_upwelling.in出现了一个问题,

ROMS/TOMS: Wrong choice of grid 01 partition or number of parallel threads.
            NtileI*NtileJ must be a positive multiple of the number of threads.
            Change number of threads (environment variable) or
            change domain partition in input script.

大概是并行线程数选择错误,NtileI*NtileJ必须是线程数的正倍数。所以在roms_upwelling.in文件中修改为

  NtileI == 2                               ! I-direction partition
  NtileJ == 2                               ! J-direction partition

重新./romsO <roms_upwelling.in,运行完之后可以查看时间:

 Elapsed CPU time (seconds):

 Thread #    0 CPU:     236.787
 Thread #    1 CPU:     236.788
 Total:                 473.575

两个线程,运行了4分钟不到。查看运行之后的文件:

/home/keegen/ROMS/Projects/Upwelling# ls -lh
总用量 250M
drwxr-xr-x 2 root root  28K 8月   3 16:51 Build_roms
-rwxr-xr-x 1 root root  11K 8月   3 16:47 build_roms.bash
-rw-r--r-- 1 root root  28M 8月   3 20:48 roms_avg.nc
-rw-r--r-- 1 root root 177M 8月   3 20:48 roms_dia.nc
-rw-r--r-- 1 root root  29M 8月   3 20:48 roms_his.nc
-rwxr-xr-x 1 root root 6.0M 8月   3 16:40 romsO
-rw-r--r-- 1 root root 4.8M 8月   3 20:48 roms_rst.nc
-rwxr-xr-x 1 root root 5.8M 8月   3 16:51 romsS
-rw-r--r-- 1 root root 132K 8月   3 20:43 roms_upwelling.in
-rw-r--r-- 1 root root 1.8K 8月   3 15:22 upwelling.h

生成了4个nc数据文件。

用mpich安装

首先安装mpich,安装可以参考https://blog.csdn.net/baidu_34045013/article/details/78237842
查看文件:

/home/keegen/ROMS/Projects/Upwelling# ls
Build_roms       roms_dia.nc  romsO        roms_upwelling.in
build_roms.bash  roms_his.nc  roms_rst.nc  upwelling.h
roms_avg.nc      romsM        romsS        upwelling.log

build_roms.bash配置:

export           USE_MPI=on            # distributed-memory parallelism
export        USE_MPIF90=on            # compile with mpif90 script
export         which_MPI=mpich         # compile with MPICH library
#export         which_MPI=mpich2        # compile with MPICH2 library
# export         which_MPI=openmpi       # compile with OpenMPI library

#export        USE_OpenMP=on            # shared-memory parallelism

修改my_build_paths.bash:

/home/keegen/ROMS/Projects/Upwelling# vim ../../trunk/Compilers/my_build_paths.bash

改两处地方,改成自己的mpich安装路径就好:

if [ -n "${USE_MPIF90:+1}" ]; then
  case "$FORT" in
    ifort )
      if [ "${which_MPI}" = "mpich" ]; then
        export       MPI_ROOT=/home/keegen/mpich     #改成自己的mpich安装路径

...

export      ARPACK_LIBDIR=/opt/intelsoft/serial/ARPACK
if [ -n "${USE_MPI:+1}" ]; then
  if [ "${which_MPI}" = "mpich" ]; then
    export       MPI_SOFT=/home/keegen/mpich

最后再改一下roms_upwelling.in,使NtileI * NtileJ等于计算核心数

  NtileI == 1                               ! I-direction partition
  NtileJ == 2                               ! J-direction partition

编译:

./build_roms.bash -j 2

运行:

mpirun -np 2 ./romsM roms_upwelling.in
或
mpirun -np 2 ./romsM roms_upwelling.in > upwelling.log

查看运行时间:

 Elapsed CPU time (seconds):

 Node   #    0 CPU:     160.481
 Node   #    1 CPU:     161.599
 Total:                 322.080
posted @ 2019-07-06 12:34  Keegen  阅读(2391)  评论(0编辑  收藏  举报