本文演示了如何使用实验室集群上安装的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