简介

SWASH是一个通用的数值计算工具,用于模拟非稳态、非流体静力学的、自由表面的或旋转的流动,以及以及由波浪、潮汐、浮力或风力驱动的沿海水域的运输现象。

官网地址:传送门; 源码下载:传送门

编译环境

串行版需要fortran编译器,多线程版本需要支持openmp,MPI版本需要具备mpi编译环境。

编译方法

本文给出使用intel2013编译器和mpich并行编译器编译的基本步骤:

加载编译环境

不同的平台,编译器的安装及加载方式不同,在此给出最常见的加载方式:

source /opt/intel/composer_xe_2013.0.079/bin/iccvars.sh intel64
source /opt/intel/composer_xe_2013.0.079/bin/ifortvars.sh intel64
source /opt/intel/composer_xe_2013.0.079/mkl/bin/mklvars.sh intel64

说明: - 前两行为加载icc(包括icpc等)及ifort编译器。使用source命令,加载编译器安装路径下的的sh脚本,并给出intel64参数,表明是64位操作系统。 - 第三行与之前的类似,加载intel的MKL数学库,因为接下来会用到它。注意修改为自己的intel编译器路径。

export PATH=/usr/local/mpi-intel2013/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/mpi-intel2013/lib:$LD_LIBRARY_PATH

说明: - 第一行为使用 export 命令,声明环境变量 PATH ,它是用来寻找可执行命令路径的环境变量。先给出mpich的安装路径下的bin目录,然后在用 “$” 符号引用 PATH 变量。意味着给 PATH 变量增加一个搜索路径,这样子就能找到我们需要的例如 mpif90命令了。 - 第二行与第一行类似, LD_LIBRARY_PATH 声明的是加载动态库的路径。 注意修改为自己的mpi编译器路径。

编译

tar zxvf swash-4.0.1.tar.gz  
cd swash
make config
make mpi
chmod +x swashrun

编译完成后会生成一个名为swash.exe的可执行文件。

运行

普通运行

准备好输入文件,如test.sws,a13stwav.bot。

/path/to/swash/swashrun -input test -mpi 12 > swashout

说明:

参数 含义
/path/to/swash/swashrun swashrun脚本的路径和名称
-input test 输入文件的名称,注意没有sws后缀
-mpi 12 使用12个cpu核并行
> swashout 将屏幕输入重定向到swashout文件

在天河系统上运行

因为天河系统使用了自主高速网络互联以及slurm作业调度系统,故默认的mpirun变为了yhrun命令,所以需要手动修改一下swashrun脚本,并结合作业调度系统运行。

修改swashrun脚本

# 第50行
if test -f $dir/mpirun; then # 修改前
if test -f $dir/yhrun; then # 修改后
# 第109行
mpirun -np $npmpi -machinefile machinefile swash.exe  # 修改前
yhrun -n $npmpi swash.exe  # 修改后
# 第114行
mpirun -p $npmpi swash.exe # 修改前
yhrun -p $npmpi swash.exe # 修改后

编写作业提交脚本

编写一个作业提交脚本,名为runswash.sh

#!/bin/bash
# ------------------------------------------------------------------------
# change these parameters for each jobs as your need
nodenum=2   # node number
cpuspernode=12   # cpu number per node
partition="debug"  # partition : debug (only for test, just can run 30mis) or TH_NEW1
input="test"  # input file 
logfile="swashout" # log file 
SWASHROOT="/vol-th/software/swash/4.0.1" # change only once for your install directory
# ------------------------------------------------------------------------                     
export PATH=$SWASHROOT:$PATH
#
exe="swashrun-th"
#
totalcpus=$[ $nodenum * $cpuspernode ]
#
# create a submit script file
subScript="sub.sh"
#
# rename sub.sh
if [ -f $subScript ];then
    mv $subScript ${subScript}-bak
fi
#
# create sub.sh
\cat > $subScript << EOF
#!/bin/bash
echo "Partition is $partition"
echo "totalcpus is $totalcpus"
#
# write hostlist
yhrun -N $nodenum -n $totalcpus -p $partition hostname | sort -n | uniq > .hostlist
#
# reame machinefile
if [ -f machinefile ];then
    mv machinefile machinefile-bak
fi
# create machinefile
cat .hostlist | while read line;
do
    echo \$line:$cpuspernode >> machinefile
done
#
# swashrun
$exe -input $input -mpi $totalcpus > $logfile 
EOF
#
# submit job
yhbatch -N $nodenum -n $totalcpus -p $partition $subScript

提交任务 由于将该任务所需的信息均已在脚本中提供,故仅需要提交该脚本即可。

sh runswash.sh