提示:与HPC群集的系统管理员联系,以确保正确构建OpenFOAM。

在本节中,当尝试在HPC集群上安装OpenFOAM时,将考虑一些主题。在远程集群上工作时,需要一个由不同硬件、软件库和编译器版本组成的全新系统。由于这些差异,每个系统都会有所不同,安装时可能会遇到特殊的挑战。

尽管如此,本节将尝试概述您在任何特定系统上可能遇到的一些更通用的问题,而不是涵盖系统细节。接下,假设读者在执行编译器、设置其配置以及使用Linux系统环境变量方面有一定的经验。这包括将包含文件夹和库二进制文件链接到编译。

  • 修改$WM_PROJECT_DIR/etc/bashrc文件更改编译器
# [WM_COMPILER_TYPE] - Compiler location:
# = system | ThirdParty
export WM_COMPILER_TYPE=system
# [WM_COMPILER] - Compiler:
# = Gcc | Gcc4[8-9] | Gcc5[1-5] | Gcc6[1-5] | Gcc7[1-4] | Gcc8[12] |
# Clang | Clang3[7-9] | Clang[4-6]0 | Icc | Cray | Arm | Pgi
export WM_COMPILER=Gcc

建议使用HPC集群上可用的MPI库,因为它们是由集群管理员精心构建的,以最大限度地提高特定计算机上的性能。如果使用OpenFOAM打包的库存第三方文件夹中包含的OpenMPI库进行编译,求解器可能仍能正常工作,但没有相当多的并行优化和互连支持。这可能会严重阻碍并行速度和伸缩性,不建议这样做。

如果没有功能齐全的MPI编译,OpenFOAM的Pstream库将无法正确编译。Pstream库充当CFD库和原始MPI函数之间的接口,这对于任何并行计算都是必要的。

每个集群通常都有一个官方支持的编译器用于系统。这可能是一个开源编译器,如Gcc,但也可能是一个预配置的商用C++编译器,如Intel®提供的Icc。要为OpenFOAM选择编译器,必须调整主配置文件$WM_PROJECT_ DIR/etc/bashrc。文件中涉及编译器选择的部分如清单所示。第一个选项,编译器位置,定义wmake在任何编译活动中是使用系统编译器还是使用与OpenFOAM一起打包在第三方目录中的编译器。在HPC安装的情况下,应始终使用系统编译器。另一个选项将设置要使用的编译器。有很多选项可用,但它们可能都没有安装在相关系统上。例如,许多基于Linux的计算集群将在系统的某处安装Gcc,但推荐的编译器可能是经过高度优化和调优的Icc版本。在这种情况下,编译器应定义为:

# [WM_COMPILER] - Compiler:
# [WM_MPLIB] - MPI implementation:
# = SYSTEMOPENMPI | OPENMPI | SYSTEMMPI | MPI | MPICH | MPICH-GM |
# HPMPI | CRAY-MPICH | FJMPI | QSMPI | SGIMPI | INTELMPI | USERMPI
# Also possible to use INTELMPI-xyz etc and define your own wmake rule
export WM_MPLIB=SYSTEMOPENMPI

# = Gcc | Gcc4[8-9] | Gcc5[1-5] | Gcc6[1-5] | Gcc7[1-4] | Gcc8[12] |
# Clang | Clang3[7-9] | Clang[4-6]0 | Icc | Cray | Arm | Pgi
export WM_COMPILER=Icc

与编译器一样,需要将wmake配置为针对特定于HPC系统的受支持MPI实现进行构建。这是在与编译器选择相同的bashrc文件中完成的(请参见清单3)。根据选择的实现,OpenFOAM为 MPI_ARCH_PATH and MPI_HOME设置不同的目标位置,该位置是集群文件系统中存在这些MPI可执行文件、库和头文件的位置。HPC安装中最常见的问题之一是,由于缺少MPI库和标头,此目录未正确设置,并且Pstream库未正确编译。

在这种情况下,WM_MPILIB=OPENMPI设置将指示我们使用与ThirdParty目录打包的OPENMPI版本。如果改为设置SYSTEMOPENMPI,脚本将查找系统以加载OpenMPI库。根据选择定义这些环境变量的脚本位于MPI_HOME _foamAddPath MPI_ARCH_PATH/bin


如果hpmpi文件夹的位置不完全是/opt/hpmpi,则将无法正确设置MPI\U HOME,错误将在整个脚本中层叠,并最终中断编译。谢天谢地,假设目标MPI实现在系统目录树中的位置已知,手动设置这些变量非常容易。

```bash
source ~/OpenFOAM/OpenFOAM-2.2.0/etc/bashrc
export MPI_ARCH_PATH=/opt/apps/ssmpi/1.3
export MPI_HOME=/opt/apps/ssmpi/1.3

wmake规则如下所示:

?>  cat WM_PROJECT_DIR/wmake/General/mplibOPENMPI
PFLAGS = -DOMPI_SKIP_MPICXX
PINC = -I<span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.13889em;">MP</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0785em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.07153em;">RC</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0813em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em;">P</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mclose">)</span><span class="mord">/</span><span class="mord mathnormal">in</span><span class="mord mathnormal">c</span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="mord mathnormal">u</span><span class="mord mathnormal">d</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mord mathnormal">L</span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord mathnormal" style="margin-right:0.05764em;">BS</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord mathnormal">L</span></span></span></span>(MPI_ARCH_PATH)/lib<span class="katex"><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.13889em;">W</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">C</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.13889em;">OMP</span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord mathnormal">L</span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0077em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">L</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.07847em;">I</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.07153em;">RC</span><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">L</span></span></span></span>(MPI_ARCH_PATH)/lib -lmpi

假设这个集群支持一个特定的、虚构的MPI实现,称为超级伸缩MPI,简称ssmpi。这个虚构的库版本为1.3,可以在目录树/opt/apps/ssmpi/1.3中找到。

由于脚本不知道如何配置wmake以链接到此,因此必须在$HOME/.bashrc中手动定义mpi环境变量。在获取OpenFOAM bashrc后,相应地设置变量,以确保覆盖任何加载错误的值。在查看用于设置MPI编译器标志的wmake规则时,设置此环境变量的重要性显而易见(请参见清单5)。在使用OpenMPI编译的配置文件中,这些变量用于设置指向标头和二进制位置的路径。如果安装是用虚构的SSMPI代码设置的,则将按照此命名约定创建一个新的配置文件,并用适当的文件路径填充。最后,所有这些设置都是为了确保Pstream库正确编译并链接到本地MPI实现。Pstream编译选项存储在$WM_PROJECT_DIR/src/Pstream/mpi/Make/options中,包含PFLAGS、PINC和PLIB,它们通过-I和-L直接提供给编译器标志。这将在编译时用于头和库链接。除了与MPI库接口之外,OpenFOAM大部分是自包含的,只有少数其他外部库依赖。如果在编译期间发生重大故障,则很可能在配置这些MPI库和编译器设置期间发生。