swash编译安装教程
# 简介
SWASH是一个通用的数值计算工具,用于模拟非稳态、非流体静力学的、自由表面的或旋转的流动,以及以及由波浪、潮汐、浮力或风力驱动的沿海水域的运输现象。
官网地址:传送门 (opens new window); 源码下载:传送门 (opens new window)。
# 编译环境
串行版需要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
1
2
3
2
3
说明:
- 前两行为加载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
1
2
2
说明:
- 第一行为使用 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
1
2
3
4
5
2
3
4
5
编译完成后会生成一个名为swash.exe的可执行文件。
# 运行
# 普通运行
准备好输入文件,如test.sws,a13stwav.bot。
/path/to/swash/swashrun -input test -mpi 12 > swashout
1
说明:
参数 | 含义 |
---|---|
/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 # 修改后
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
编写作业提交脚本
编写一个作业提交脚本,名为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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
提交任务 由于将该任务所需的信息均已在脚本中提供,故仅需要提交该脚本即可。
sh runswash.sh
1