大集群上SOWFA安装

本文最后更新于 2024年12月29日 晚上

大集群上OpenFOAM-2.4.x和SOWFA的安装(无网络、无sudo权限)

〇. 准备工作

根据以下下载链接下载安装包和依赖库的源码(如果链接失效,可以网上找对应版本的安装包下载),使用sftp工具上传到服务器的~/uploads文件夹

第一步OpenFOAM需要用到的:

第二步OpenFAST需要用到的:

第三步SOWFA需要用到的:

一. OpenFOAM2.4.x安装

0. 注意

安装OpenFOAM前先检查一下~/.bashrc中有没有激活其他版本的cmake和gcc,如果有,先注释掉改用大服务器自带的gcc-4.8.5(在/usr/bin/gcc)和cmake-2.8.12.2(在/usr/bin/cmake)

1. 拷贝OpenFOAM2.4.x和ThirdParty-2.4.x源码并解压

终端执行下面的代码,将~/uploads目录下OpenFOAM和ThirdParty的压缩包拷贝到OpenFOAM的安装目录下,解压。

1
2
3
mkdir ~/OpenFOAM && cd ~/OpenFOAM
tar -zxvf ~/uploads/OpenFOAM-2.4.x.tar.gz
tar -zxvf ~/uploads/ThirdParty-2.4.x.tar.gz

2. 准备第三方依赖库

终端执行下面的代码,将~/uploads目录下的几个依赖库的压缩包解压到~/OpenFOAM/ThirdParty-2.4.x目录下

1
2
3
4
5
6
7
8
cd ~/OpenFOAM/ThirdParty-2.4.x
tar -zxvf ~/uploads/scotch_6.0.3.tar.gz
tar -zxvf ~/uploads/cgal-releases-CGAL-4.6.tar.gz && mv cgal-releases-CGAL-4.6 CGAL-4.6
tar -jxvf ~/uploads/boost_1_55_0.tar.bz2
tar -zxvf ~/uploads/gcc-4.8.5.tar.gz
tar -xvf ~/uploads/gmp-5.1.2.tar.xz
tar -zxvf ~/uploads/mpfr-3.1.2.tar.gz
tar -zxvf ~/uploads/mpc-1.0.1.tar.gz

终端执行下面的代码,编译安装openmpi-2.1.1(如果服务器上已经有openmpi-2.1.1,可以不用自己安装)

1
2
3
4
5
6
7
mkdir ~/Packages && cd ~/Packages
tar -zxvf ~/uploads/openmpi-2.1.1.tar.gz
cd openmpi-2.1.1
mkdir build && cd build
../configure --prefix=$HOME/Packages/openmpi-2.1.1/install --with-ucx=/usr/local/ucx
make
make install

编辑~/.bashrc文件,在末尾添加以下内容激活环境变量:

1
2
3
4
5
6
# OpenMPI
export PATH=~/Packages/openmpi-2.1.1/install/bin:$PATH
export LD_LIBRARY_PATH=~/Packages/openmpi-2.1.1/install/lib:$LD_LIBRARY_PATH
export INCLUDE=~/Packages/openmpi-2.1.1/install/include/:$INCLUDE
export CPATH=~/Packages/openmpi-2.1.1/install/include/:$CPATH
export MANPATH=~/Packages/openmpi-2.1.1/install/share/man:$MANPATH

终端执行下面的代码,使修改生效

1
source ~/.bashrc

3. 设置环境变量

终端执行下面的代码,修改源码中的boost版本和gcc版本

1
2
3
cd ~/OpenFOAM
sed -i -e 's=boost-system=boost_1_55_0=' OpenFOAM-2.4.x/etc/config/CGAL.sh
sed -i -e 's=gcc\-4\.8\.2=gcc-4.8.5=' OpenFOAM-2.4.x/etc/config/settings.sh(这句执行完去验证一下这个文件第245行有没有改成4.8.5)

终端执行下面的代码,添加OpenFOAM环境变量

1
2
3
4
5
6
7
# 这里的WM_NCOMPPROCS设置为你编译要用的核数(大集群使用手册说不要在主节点上并行,故设为单核) 
source $HOME/OpenFOAM/OpenFOAM-2.4.x/etc/bashrc WM_NCOMPPROCS=1 WM_LABEL_SIZE=64

echo "alias of24x='source \$HOME/OpenFOAM/OpenFOAM-2.4.x/etc/bashrc $FOAM_SETTINGS'" >> $HOME/.bashrc
echo 'of24x' >> $HOME/.bashrc
source ~/.bashrc
of24x

4. 安装第三方依赖库

终端执行下面的代码,通过makeGcc脚本编译安装CGAL需要的gmp和mpfr库(可能在最后编译安装gcc的时候会报错,可以不用管,因为需要的是前面的gmp和mpfr库)

1
2
cd $WM_THIRD_PARTY_DIR
./makeGcc gcc-4.8.5 gmp-5.1.2 mpfr-3.1.2 mpc-1.0.1

终端执行下面的代码,修改编译cgal要用到的库版本

1
2
3
sed -i -e 's=boost-system=boost_1_55_0=' makeCGAL
sed -i -e 's=gmp-system=gmp-5.1.2=' makeCGAL
sed -i -e 's=mpfr-system=mpfr-3.1.2=' makeCGAL

终端执行下面的代码,编译第三方依赖库

1
2
3
./Allwmake
# 再次执行安装命令输出安装报告,检查安装情况
./Allwmake

5. 安装OpenFOAM

终端执行下面的代码

1
2
3
4
cd $WM_PROJECT_DIR
./Allwmake
# 再次执行安装命令输出安装报告,检查安装情况
./Allwmake

可能会出现fatal error: gmp.h: No such file or directory,会影响非结构化网格的生成工具foamyHexMeshfoamyQuadMesh,如果不用的话影响不大

终端执行下面的代码,创建run文件夹并进入

1
2
mkdir -p $FOAM_RUN
run

6. 测试

icoFoam单核算例

终端执行下面的代码,拷贝测试算例并生成网格

1
2
3
cp -r $FOAM_TUTORIALS/incompressible/icoFoam/cavity $FOAM_RUN
cd cavity
blockMesh

当前目录下创建提交脚本script.sh文件,内容如下(将#$ -N zxf中的zxf修改为你的任务名),其他参数的设置以及注意点看组里服务器的使用要求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/sh 
#___INFO__MARK_BEGIN__
# Welcome to use EasyCluster V1.6 All Rights Reserved.
#
#___INFO__MARK_END__
#
#$ -S /bin/sh
#$ -N zxf
#$ -j y
#$ -o ./
#$ -e ./
#$ -cwd
#$ -q zone3.q
#$ -pe thread 1

source ~/.bashrc
hash -r
export path=$TMPDIR:$path

icoFoam > log.icoFoam 2>&1

终端执行下面的代码,提交、查询任务

1
2
3
4
5
# 提交任务
ssub script.sh

#查询任务状态
qstat

并行测试,damBreak算例

终端执行下面的代码,拷贝测试算例并生成网格

1
2
3
4
5
6
cp -r $FOAM_TUTORIALS/multiphase/interFoam/laminar/damBreak $FOAM_RUN
cd damBreak
blockMesh
cp -r 0/alpha.water.org 0/alpha.water
setFields
decomposePar

在当前目录下创建提交脚本script.sh文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/sh 
#___INFO__MARK_BEGIN__
# Welcome to use EasyCluster V1.6 All Rights Reserved.
#
#___INFO__MARK_END__
#
#$ -S /bin/sh
#$ -N zxf_openfoam_test
#$ -j y
#$ -o ./
#$ -e ./
#$ -cwd
#$ -q zone3.q
#$ -pe mpi 4-4
source ~/.bashrc
hash -r
export path=$TMPDIR:$path

mpirun -np $NSLOTS interFoam -parallel > log.interFoam 2>&1

终端执行下面的代码,提交、查询任务

1
2
3
4
5
# 提交任务
ssub script.sh

#查询任务状态
qstat

计算完成后,使用reconstructPar命令重建数据(如果是大算例要把这个命令放进提交脚本中,这里测试算例小,直接在终端单核执行)

1
2
reconstructPar
# 可以将数据文件下载到本地,用paraview查看

二. OpenFAST安装

1. 安装依赖

建议创建一个依赖库的总的安装目录,可以终端执行下面的代码创建(这里用Packages文件夹,如果用其他名字注意安装过程中对应把Packages改成你的文件夹名)

1
mkdir $HOME/Packages

终端执行下面的代码,将~/upload目录下的下列安装包解压到$HOME/Packages/目录下

1
2
3
4
5
6
7
8
cd $HOME/Packages/
tar -zxvf ~/upload/lapack-3.10.1.tar.gz
tar -zxvf ~/upload/libxml2-v2.8.0.tar.gz
mv libxml2-v2.8.0 libxml2-2.8.0
tar -zxf ~/upload/hdf5-1.8.15.tar.gz
tar -zxf ~/upload/yaml-cpp-yaml-cpp-0.6.0.tar.gz
mv yaml-cpp-yaml-cpp-0.6.0 yaml-cpp-0.6.0
cp ~/upload/cmake-3.26.3-linux-x86_64.sh ./

BLAS&LAPACK

1
2
3
4
5
cd $HOME/Packages/lapack-3.10.1
cp make.inc.example make.inc
# 默认直接安装到$HOME/Packages/lapack-3.10.1目录下
make blaslib
make lapacklib

LibXml2

1
2
3
4
5
cd $HOME/Packages/libxml2-2.8.0
mkdir build && cd build
../configure --prefix=$HOME/Packages/libxml2-2.8.0/install
make
make install

HDF5

1
2
3
4
5
6
cd $HOME/Packages/hdf5-1.8.15
mkdir build && cd build
../configure --prefix=$HOME/Packages/hdf5-1.8.15/install
make
make check
make install

yaml-cpp

1
2
3
4
5
6
7
cd $HOME/Packages/yaml-cpp-0.6.0
mkdir build && cd build
cmake .. \
-DCMAKE_INSTALL_PREFIX="$HOME/Packages/yaml-cpp-0.6.0/install" \
-DBUILD_SHARED_LIBS=ON
make
make install

cmake-3.26.3

1
2
3
4
5
cd $HOME/Packages
chmod +x ./cmake-3.26.3-linux-x86_64.sh
# 执行安装脚本,路径保持默认,装在当前目录下
./cmake-3.26.3-linux-x86_64.sh
# 要调用新版本cmake可以通过他的绝对路径~/Packages/cmake-3.26.3-linux-x86_64/bin/cmake进行调用

2. 安装OpenFAST-2.4.0

配置intel编译器

编辑bashrc文件,在文件末尾添加以下内容设置intel编译器

1
2
# Intel compiler
source /opt/intel/parallel_studio_xe_2020/bin/psxevars.sh intel64

终端执行下面的代码,使修改生效

1
source ~/.bashrc

编译安装

终端执行下面的代码,将~/upload/openfast-2.4.0.tar.gz解压到安装目录下,这里以安装到$HOME/Programs为例

1
2
3
mkdir ~/Programs && cd ~/Programs
tar -zxvf ~/upload/openfast-2.4.0.tar.gz
cd openfast-2.4.0

终端执行下面的代码,进入编译文件夹

1
mkdir build && cd build

终端执行下面的代码,配置编译选项(注意这里的依赖库路径要和你的依赖库安装的路径对应)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
~/Packages/cmake-3.26.3-linux-x86_64/bin/cmake .. \
-DBLAS_LIBRARIES="$HOME/Packages/lapack-3.10.1" \
-DLAPACK_LIBRARIES="$HOME/Packages/lapack-3.10.1" \
-DLIBXML2_LIBRARY="$HOME/Packages/libxml2-2.8.0/install/lib" \
-DLIBXML2_INCLUDE_DIR="$HOME/Packages/libxml2-2.8.0/install/include/libxml2/libxml" \
-DBUILD_OPENFAST_CPP_API=ON \
-DHDF5_ROOT="$HOME/Packages/hdf5-1.8.15/install" \
-DYAML_ROOT="$HOME/Packages/yaml-cpp-0.6.0/install" \
-DCMAKE_C_COMPILER=icc \
-DCMAKE_CXX_COMPILER=icpc \
-DCMAKE_Fortran_COMPILER=ifort \
-DBUILD_SHARED_LIBS=ON \
-DCMAKE_BUILD_TYPE=Release \
-DFPE_TRAP_ENABLED=ON \
-DCMAKE_INSTALL_PREFIX="$HOME/Programs/openfast-2.4.0/install" \
-DOPENMP=ON

终端执行下面的代码,安装

1
2
make
make install

没有报error即为安装成功

三. SOWFA的安装

1. 拷贝源码

终端执行下面的代码,将~/upload/SOWFA.tar.gz解压到SOWFA安装目录下,这里安装到~/OpenFOAM目录下

1
2
3
cd ~/OpenFOAM
tar -zxvf ~/upload/SOWFA.tar.gz
cd SOWFA

2. 修改源码错误

参考了这篇文档,修改源码的部分错误

要修改的三个文件分别为:

  1. applications/solvers/incompressible/windEnergy/pisoFoamTurbine.ALMAdvancedOpenFAST/Make/options
  2. applications/solvers/incompressible/windEnergy/windPlantSolver.ALMAdvancedOpenFAST/Make/options
  3. src/turbineModels/turbineModelsOpenFAST/Make/options

3. 创建.bashrc中的启动命令

$HOME目录下创建.sowfarc文件,内容如下:

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
export inst_loc=$HOME/OpenFOAM
export sowfa_loc=$HOME/OpenFOAM

# Unset OpenFOAM environment variables.
if [ -z "$FOAM_INST_DIR" ]; then
echo "Nothing to unset..."
else
echo "*Unsetting OpenFOAM environment variables..."
. $FOAM_INST_DIR/OpenFOAM-2.4.x/etc/config/unset.sh
fi

# Set the OpenFOAM version and installation directory
export OPENFOAM_VERSION=2.4.x
export OPENFOAM_NAME=OpenFOAM-$OPENFOAM_VERSION
export FOAM_INST_DIR=$inst_loc
export WM_PROJECT_USER_DIR=$sowfa_loc/SOWFA

foamDotFile=$FOAM_INST_DIR/$OPENFOAM_NAME/etc/bashrc
if [ -f $foamDotFile ] ; then
echo "Sourcing $foamDotFile..."
source $foamDotFile
fi

export WM_NCOMPPROCS=1
export WM_COLOURS="white blue green cyan red magenta yellow"

alias tut='cd $sowfa_loc/SOWFA/exampleCases'

export SOWFA_DIR=$sowfa_loc/SOWFA
export SOWFA_APPBIN=$SOWFA_DIR/applications/bin/$WM_OPTIONS
export SOWFA_LIBBIN=$SOWFA_DIR/lib/$WM_OPTIONS
export OPENFAST_DIR=$HOME/Programs/openfast-2.4.0/install
export HDF5_DIR=$HOME/Packages/hdf5-1.8.15/install

export LD_LIBRARY_PATH=$SOWFA_LIBBIN:$OPENFAST_DIR/lib:$LD_LIBRARY_PATH
export PATH=$SOWFA_APPBIN:$OPENFAST_DIR/bin:$PATH

终端执行下面的代码,把SOWFA环境启动命令加入到~/.bashrc文件中

1
echo "alias sf24x = 'of24x && source ~/.sowfarc'" >> ~/.bashrc

终端执行下面的代码,更新~/.bashrc文件

1
source ~/.bashrc

4. 执行安装

终端执行下面的代码,设置环境变量

1
sf24x

终端执行下面的代码,编译安装

1
2
cd $SOWFA_DIR
./Allwmake

终端执行下面的代码,再次执行来查看各个求解器安装情况

1
./Allwmake

未来每次需要使用SOWFA的时候都要输入sf24x来激活环境

5. 测试案例

终端执行下面的代码,复制大气边界层案例到运行目录下

1
2
3
cp -r $SOWFA_DIR/exampleCases/example.ABL.flatTerrain.neutral $FOAM_RUN/
run
cd example.ABL.flatTerrain.neutral

修改runscript.preprocess文件

  • 注释掉第13行:
1
# OpenFOAMversion=2.4.x-central
  • 注释掉第71-80行:
1
2
3
4
5
6
7
8
9
10
# if [ $parallel -eq 1 ]
# then
# cd $PBS_O_WORKDIR
# fi


# # Source the bash profile and then call the appropriate OpenFOAM version function
# # so that all the modules and environment variables get set.
# source $HOME/.bash_profile
# OpenFOAM-$OpenFOAMversion

修改runscript.solve.1文件

为了在集群上并行运行,改成了如下模板(可以把#$ -N zxf中的zxf改成你要的任务名,把#$ -pe mpi 8-8中的两个8改成你的核数),其他设置和注意点参考组里服务器的使用说明:

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
#!/bin/sh 
#___INFO__MARK_BEGIN__
# Welcome to use EasyCluster V1.6 All Rights Reserved.
#
#___INFO__MARK_END__
#
#$ -S /bin/sh
#$ -N zxf
#$ -j y
#$ -o ./
#$ -e ./
#$ -cwd
#$ -q zone3.q
#$ -pe mpi 8-8

source ~/.bashrc
# 需要下面这行命令激活sowfa环境变量
source ~/.sowfarc
hash -r
export path=$TMPDIR:$path

initializer=setFieldsABL
solver=ABLSolver
runNumber=1
startTime=0

cp system/controlDict.$runNumber system/controlDict

echo "Starting OpenFOAM job at: " $(date)
echo "using " $NSLOTS " cores"

# Run the flow field initializer (parallel)
if [ $runNumber -eq 1 ]
then
mpirun -np $NSLOTS $initializer -parallel > log.$runNumber.$initializer 2>&1
fi
# Run the solver (parallel)
mpirun -np $NSLOTS $solver -parallel > log.$runNumber.$solver 2>&1

echo "Ending OpenFOAM job at: " $(date)

修改setUp文件

nx改为30,ny改为30,nz改为10

nCores改为你有的核数,比如8,decompOrder改为(2,2,2),要保证乘起来要等与nCores

修改system/controlDict.1文件

将endTime改为1000,writeInterval改为100

运行计算

终端执行下面的代码,进行网格预处理(此处为了方便,直接用主节点进行预处理了,如果网格量多,就需要写任务脚本提交到计算节点处理)

1
./runscript.preprocess

终端执行下面的代码,运行并行计算

1
2
3
4
5
# 提交任务
ssub runscript.solve.1

# 查看任务
qstat

可以通过log.1.setFieldsABLlog.1.ABLSolver文件来查看结果

终端执行下面的代码,合并多核结果(此处为了方便,直接用主节点进行预处理了,如果网格量多,就需要写任务脚本提交到计算节点处理)

1
reconstructPar

注意

如果运行过程提示缺什么.so或者.h文件,可以看看是什么库,如果是已经安装的但是他检测不到,可以通过在~/.bashrc文件中LD_LIBRARY_PATH和INCLUDE环境变量来指定库的路径。