Skip to main content

使用集群上安装的BOUT++库

· 4 min read
one

本文演示了如何使用实验室集群上安装的BOUT++。

使用已安装的某版本BOUT++库:

$ spack load bout-dev ~openmp+scorep

使用BOUT++的依赖,但不包括BOUT++库本身:

$ spack load --only dependencies ~openmp+scorep

查看当前BOUT++的配置:

$ bout-config --all

链接集群上已安装的BOUT++库

BOUT++通常需要开发者在源代码目录下编译,也就是in-source build。完成build后有以下几个比较重要的文件:

  • lib/libbout++.a:BOUT++的静态库,默认是没有共享库的;
  • bin/bout-config:打印BOUT++配置信息的脚本,比如库的路径、编译器路径等;
  • make.config:编译BOUT++算例用的makefile,包含头文件和库路径、编译flags等。

随后我们可以进到算例的目录下,直接调make来编译算例得到可执行文件,例如

$ cd examples/conduction
$ make

算例目录下的makefile会将BOUT++的根目录BOUT_TOP设置为当前源代码的根目录,然后调make.config完成后续工作。

make.config中的关键变量是在用户配置BOUT++的过程中设置的,和实验室集群上安装的BOUT++不一样。因此,要链接集群上安装的BOUT++库,我们就不能直接用算例目录下现有的makefile,需要按照BOUT++官网的说明修改makefile。

examples/conduction/makefile为例链接实验室集群上安装的BOUT++库:

## 加载Spack环境
$ source /apps/spack/share/spack/setup-env.sh

## 加载BOUT++,如果有多个BOUT++包,请按照集群文档中Spack使用说明来筛选
## 最终提交脚本到集群运行算例时,也要用这一句来加载环境
$ spack load bout-dev +openmp+scorep

## 目前,在集群上安装的BOUT++至少有OpenMP和非OpenMP两个版本
## spack load bout-dev ~openmp+scorep

## 进入自己下载的BOUT++算例目录
$ cd BOUT-dev/examples/conduction

## 修改makefile,新makefile的例子在examples/make-script中
$ sed -e 's/test.cxx/conduction.cxx/g' ../make-script/makefile > makefile

## 创建可执行文件
$ make clean && make

执行上述命令后,我们就得到了算例的可执行文件conduction

若要使用BOUT++源代码目录下的Python包,有两种选择:用自己下载的,或用集群上已安装的。自己下载的可参考文后的链接。下面演示如何使用集群上已有的。

## 加载集群的BOUT++包
$ spack load bout-dev +openmp+scorep

## 使用bout-config获取Python包路径并添加到环境变量中
$ export PYTHONPATH=$(bout-config --python):$PYTHONPATH

执行上述命令后,便可在使用Python时导入BOUT++的Python包。

使用集群上安装的依赖项编译BOUT++

当我们想重新编译BOUT++时,可以使用集群上安装的BOUT++依赖项,通常不需要自己再次安装。涉及Spack的操作可参考集群文档中Spack的说明。

## 加载BOUT++的依赖项,但不加载BOUT++本身
$ spack load --only dependencies bout-dev ~openmp+scorep

## 进入自己下载的BOUT++目录
$ cd BOUT-dev

## 按照自己的需要完成build
$ ./configure --with-petsc --with-sundials && make -j16

参考资料