安裝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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM