preCICE软件在CentOS7超算集群上无root权限从源码编译安装记录贴
-
最近想学习一下用OpenFOAM做流固耦合,看了一圈对preCICE起了一点兴趣,于是在学校超算集群上安装了一下preCICE,想以后能把OpenFOAM和其他的软件结合起来算点东西.
看论坛里面似乎没有人说preCICE的安装,所以开一个贴记录一下从源码编译安装preCICE的痛苦经历,希望日后可以帮到需要帮助的同学哈哈哈.
首先介绍一下集群的配置: 浪潮的机架式服务器,操作系统CentOS Linux release 7.5.1804,内核3.10.0-862.el7.x86_64. 对就是这么老...更可喜的是我的账号没有root权限,所以无论是OpenFOAM的各项依赖还是preCICE,我都是从源码编译安装的. (spack不知道为什么也用不了,非常奇怪,暴风哭泣)
CPU是intel Platinum 8358 CPU @ 2.60GHz(双路CPU,单节点64核心,关闭超线程),内存1TB,支持InfiniBand网络. 一共80个节点,有那么几十张sxm-80GB-A100.
学校集群上我能用上且现有的依赖只有gcc-9.2.0,m4,openMPI-4.0.3,Cmake. 其他的全都要从源码编译.
OpenFOAM的依赖主要有flex,bison,boost,zlib? 这些都比较好解决. OpenFOAM高版本的编译安装就很奇怪,2312版本的solvers编译我是改了源码才编译完成,不过src和utilities无报错.
下面开始preCICE的依赖安装.
-
首先从preCICE官网发现CentOS7最高只支持到preCICE v2.3.0,而依赖项中Eigen3非常好处理,难点在于libxml2...
对,集群上libxml2库我找不到,只能自己安装. 推荐安装libxml2-2.9.13,这个版本修复了一个关于Python的bug. 在configure时要编译有动态链接库的版本:
./configure --prefix=libxml2的/安装/路径 CPPFLAGS="-I集群中python3的位置(我是miniconda3)" LDFLAGS="-L$HOME/miniconda3/lib" --enable-shared=yes
然后PETSc库也得自己装,顺带把lapack和BLAS也让他一起装了
./configure --with-precision=double --prefix=petsc/的/安装路径 --with-openmpi=1 --with-openmpi-dir=/openMPI/的路径 --download-f2cblaslapack --with-fc=0
make和make install步骤就省略了
-
安装完成preCICE之后,继续编译安装calculix-preCICE-adapter.
编译依赖项
根据官网指南编译SPOOLES2.2, ARPACK和yaml-cpp.
spooles可以按照指南编译,但是在
make.inc
文件中需要修改第106行左右的MPI_INSTALL_DIR = mpi/安装/路径
在编译安装arpack96时,由于PETSc库是在preCICE安装时的依赖项,而PETSc安装时自动安装了BLAS和LAPACK,因此除了指南里面的要求之外,还需要修改
ARmake.inc
文件中第60行左右的LAPACKLIB = PETSc库的安装路径/petsc-3.22.2/arch-linux-c-debug/externalpackages/f2cblaslapack-3.8.0.q2/libf2clapack.a BLASLIB = PETSc库的安装路径/petsc-3.22.2/arch-linux-c-debug/externalpackages/f2cblaslapack-3.8.0.q2/libf2cblas.
yaml-cpp在集群中的安装有点坑,首选是查看自己的集群中是否已经安装好了. 次选才是自己从源码编译安装,因为在编译时必须注意集群中的默认gcc版本,例如CentOS7自带的gcc-4.8.5就坑了我好一会儿....
根据指南走,在进入build文件夹之后,cmake命令修改为
CC=$(which gcc) CXX=$(which g++) cmake -DBUILD_SHARED_LIBS=ON ..
以此指定为自己OpenFOAM和preCICE常用的编译器.
不然可能在编译calculix-adapter时出现如下错误
mpifort -fopenmp -Wall -O3 -o bin/ccx_preCICE bin/ccx_2.20.o bin/ccx_2.20.a /beegfs/home/20144242/software/Calculix/dependencies/SPOOLES.2.2/spooles.a -L/beegfs/home/20144242/app/precice/lib64 -lprecice -lstdc++ -L/beegfs/home/20144242/software/Calculix/dependencies/yaml-cpp-yaml-cpp-0.6.2/build -lyaml-cpp /beegfs/home/20144242/software/Calculix/dependencies/ARPACK/libarpack_INTEL.a -lpthread -lm -lc /usr/bin/ld: warning: libgfortran.so.3, needed by /beegfs/software/openmpi-403/lib/libmpi_usempi.so, may conflict with libgfortran.so.5 /usr/bin/ld: warning: libgfortran.so.3, needed by /beegfs/software/openmpi-403/lib/libmpi_usempi.so, may conflict with libgfortran.so.5 bin/ccx_2.20.a(ConfigReader.o): In function `ConfigReader_Read': ConfigReader.cpp:(.text+0x84): undefined reference to `YAML::LoadFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' bin/ccx_2.20.a(ConfigReader.o): In function `YAML::detail::node_ref::set_scalar(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)': ConfigReader.cpp:(.text._ZN4YAML6detail8node_ref10set_scalarERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE[_ZN4YAML6detail8node_ref10set_scalarERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE]+0x2a): undefined reference to `YAML::detail::node_data::set_scalar(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' bin/ccx_2.20.a(ConfigReader.o): In function `YAML::Node::Scalar[abi:cxx11]() const': ConfigReader.cpp:(.text._ZNK4YAML4Node6ScalarB5cxx11Ev[_ZNK4YAML4Node6ScalarB5cxx11Ev]+0x64): undefined reference to `YAML::detail::node_data::empty_scalar[abi:cxx11]' collect2: error: ld returned 1 exit status make: *** [bin/ccx_preCICE] Error 1
编译calculix-adapter
在依赖项编译完成后,根据指南修改
makefile
文件,最后编译即可.但是如果碰到了如下和
_MT
相关的错误bin/ccx_2.19.a(spooles.o): In function `factor_MT': spooles.c:(.text+0x58b): undefined reference to `FrontMtx_MT_factorInpMtx' bin/ccx_2.19.a(spooles.o): In functio [Makefile.txt|attachment](upload://hTRrap8IGPDYBU68AlxhityA5RU.txt) (3.7 KB) n `fsolve_MT': spooles.c:(.text+0x716): undefined reference to `FrontMtx_MT_solve' collect2: error: ld returned 1 exit status make: *** [Makefile:107: bin/ccx_preCICE] Error 1
则需要删除makefile文件中第55行左右的
-DUSE_MT
标志,把CFLAGS修改为CFLAGS = -Wall -O3 -fopenmp $(INCLUDES) -DARCH="Linux" -DSPOOLES -DARPACK -DMATRIXSTORAGE
然后再次编译即可.
-
@Amadeus 在 preCICE软件在CentOS7超算集群上无root权限从源码编译安装记录贴 中说:
但是如果碰到了如下和_MT相关的错误
此处错误的原因在于spooles库编译时没有开启多线程(Multi-Thread),如果你的calculix-preCICE不需要启用多线程,那么就无需往下看了.
spooles多线程编译
@Amadeus 在 preCICE软件在CentOS7超算集群上无root权限从源码编译安装记录贴 中说:
spooles可以按照指南编译
按照preCICE官方给出的指南是默认没有打开spooles库的多线程编译选项的.
因此在make lib之后,需要进入 spooles库所在路径/spooles.2.2/MT/src 中,然后执行make makeLib
注意大小写敏感. 然后就会把多线程支持库合并编译进之前生成的spooles.a文件.
最后回到calculix-adapter文件夹,make clean清理之前生成的文件,把
makefile
文件第55行的CFLAGS改回来即可CFLAGS = -Wall -O3 -fopenmp $(INCLUDES) -DARCH="Linux" -DSPOOLES -DARPACK -DMATRIXSTORAGE -DUSE_MT
最后 make -j 重新编译