昨天晚上安好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