OpenFOAM - 悲催的科学匠人 - 冷水's blog
OpenFoam中动态库与静态库链接的问题
1 Pstream封装了MPI,采用mpicxx的编译选项生成了mpi/libPstream.so
同时有串行版的Pstream,生成dummy/libPstream.so
2 OpenFoam库,调用Pstream,并链接了dummy/libPstream.so,生成了libOpenFoam.so
3 基于OpenFoam库的并行程序,链接libOpenFoam.so
事实上,第2、3步不需要制定MPI链接选项(-lmpich之类),我做了一个例子来尝试
代码aa.C定义一个函数,
#include <cstdio> #include "mpi.h" using namespace std; void func(int argc,char **argv) { int rank ,size; MPI::Init(argc,argv); size=MPI::COMM_WORLD.Get_size(); rank=MPI::COMM_WORLD.Get_rank(); printf("Hello world! , I am %d,in %d/n computer", rank, size); MPI::Finalize(); }
mpicxx -c aa.C
mpicxx aa.o -shared -o libaa.so
这样将其编译为一个动态库
而后代码tt.C定义主函数
void func(int argc, char** argv); int main(int argc,char **argv) { func(argc,argv); }
编译
icpc tt.C -L./ -laa -o tt
且定义libaa.so的搜索路径
而后mpirun即可
但是还是有一个疑问:为何libOpenFoam.so要链接dummy/libPstream.so。也许在执行的时候换上mpi/libPstream.so就可以实现并行?
在国家超级计算中心的天河服务器上编译OpenFOAM2.1.0
OpenFOAM默认使用gcc和openmpi,但是天河上是Intel编译器和特制的mpich。
按照OpenFOAM源代码编译说明,设置好环境变量后,需要做如下修改
在$OPENFOAM/OpenFOAM-2.1.0/etc/bashrc中设置
66行: export WM_COMPILER=Icc
84行:export WM_MPLIB=MPI
关键是对MPI的具体设置,在$OPENFOAM/OpenFOAM-2.1.0/etc/config/settings.sh中找到585行左右有关对MPI的设置
486 export FOAM_MPI=mpi
487 export MPI_ARCH_PATH=/usr/local/mpi
491 export FOAM_MPI_LIBBIN=$FOAM_LIBBIN/mpi
然后是针对本地的mpi添加一个编译选项文件,路径是 wmake/rules/General/linux64Icc/mplibMPI,内容为
PFLAGS = -fPIC
PINC = -I/usr/local/mpi/include
PLIBS = -L/usr/local/glex/lib -L/usr/local/mpi/lib -lmpichcxx -lmpich -lopa -lpmi -lglex -lpthread -lrt -luuid -lrt
于是就ok了。只要执行 source ~/.bashrc后,环境变量就更新了,可以进行wmake了
最后在编译 src/parallel/decompose/ptscotchDecomp/ptscotchDecomp.C时会出现一点错误,只要将extern "C"{}里面的 #include "mpi.h"移到外面来就可以了。
OpenFoam十分巨大,编译要半天左右,因此可以利用其自带的并行编译功能来加速。详细的参考网站上有关
wmakeScheduler for faster compilation 的说明就行了。我是设置了8个进程来加速,但是往往用不上,不能指望8倍加速。