OpenFOAM v2006版本加入了对petsc库的支持。今天尝试着编译了一下,其间踏坑无数,差一点点就放弃了。不过好在坚持到了最后。此文留作日后备查。
1 编译petsc库
OpenFOAM v2006安装完毕后,进入到ThirdParty-v2006
文件夹,输入下面的命令进行编译:
./Allwmake
一些独立库需要从网络上下载程序。如Petsc库可以从网站https://www.mcs.anl.gov/petsc/mirror/release-snapshots/下载3.13.2版本解压后放到路径下,然后运行命令进行编译:
./makePETSC
运行过程中会提示找不到blas和lapack,要从网络上下载,然而根本下载不下来。此时可以手动下载,然后随便放到一个路径中。
打开makePETSC
文件,如下图所示修改其内容:
添加的内容选项为:
--download-f2cblaslapack=/opt/OpenFOAM/ThirdParty-v2006/f2cblaslapack-3.4.2.q4.tar.gz
重新运行./makePETSC
,此时不要求重新下载,且能够编译blas与lapack。
然而又提示No module named 'distutils.sysconfig'
,此时运行下面命令安装python3-distutils,重新编译后此问题解决。
sudo apt install python3-distutils
不过继续运行又报新的错误,错误提示为:
/usr/bin/ld: cannot find -lf2clapack
/usr/bin/ld: cannot find -lf2cblas
意思是找不到库libf2clapack与libf2cblas,问题很诡异,之前lapack与blas明明是成功编译了的。
搜索了一波,在文件夹petsc-3.13.2DPInt32externalpackagesf2cblaslapack-3.4.2.q4
中发现了两个静态库文件libf2cblas.a
与libf2clapack.a
。
现在将这两个文件拷贝到系统库路径/usr/lib
中。
cd /usr/lib
sudo cp /opt/OpenFOAM/ThirdParty-v2006/petsc-3.13.2/DPInt32/externalpackages/f2cblaslapack-3.4.2.q4/libf2cblas.a .
sudo cp /opt/OpenFOAM/ThirdParty-v2006/petsc-3.13.2/DPInt32/externalpackages/f2cblaslapack-3.4.2.q4/libf2clapack.a .
重新执行makePETSC
进行编译,问题解决,petsc顺利安装完毕。。
2 编译petsc4Foam
OpenFOAM v2006在安装时,petsc4Foam的源文件已经被放置到了$WM_PROJECT_DIR/modules
文件夹下。
运行下面的命令进行编译:
cd $WM_PROJECT_DIR/modules/external-solver
./Allwmake -prefix=openfoam
经过一段时间后编译完成。
编译完毕后利用命令foamHasLibrary -verbose petscFoam
检查是否安装成功,此时提示错误:
说是找不到文件libpetsc.so.3.13
。搜索了一下找到了此文件。
发现libpetsc.so.3.13文件异常,其大小为0 KB,不过文件libpetsc.so.3.13.2文件大小正常,这里将此文件拷贝到OpenFOAM的lib文件夹试试。
运行下面的命令:
lib
cp $WM_THIRD_PARTY_DIR/platforms/linux64Gcc63DPInt32/petsc-3.13.2/lib/libpetsc.so.3.13.2 .
mv libpetsc.so.3.13.2 libpetsc.so.3.13
此时利用命令foamHasLibrary -verbose petscFoam
进行检查,问题得到解决。
3 测试
这里使用petsc4Foam官方提供的pitzDaily算例进行测试,看是否安装成功。
cd $FOAM_RUN
cp -r $FOAM_TUTORIALS/incompressible/simpleFoam/pitzDaily .
cd pitzDaily/
只需要修改system/controlDict
及system/fvSolution
文件。
1、修改controlDict文件
只需要添加libs (petscFoam);
以加载外部库。
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object controlDict;
}
// 添加petscFoam库
libs (petscFoam);
application simpleFoam;
startFrom startTime;
startTime 0;
stopAt endTime;
endTime 2000;
deltaT 1;
writeControl timeStep;
writeInterval 100;
purgeWrite 0;
writeFormat ascii;
writePrecision 6;
writeCompression off;
timeFormat general;
timePrecision 6;
runTimeModifiable true;
functions
{
#includeFunc streamlines
}
2、fvSolution文件
修改fvSolution文件如下所示。
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object fvSolution;
}
// * * * * * * * * * * * * * * * //
solvers
{
p
{
solver petsc;
petsc
{
options
{
ksp_type cg;
ksp_cg_single_reduction true;
ksp_norm_type none;
pc_type bjacobi;
sub_pc_type ilu;
}
caching
{
matrix
{
update always;
}
preconditioner
{
update always;
}
}
}
tolerance 1e-06;
relTol 0.1;
}
"(U|k|epsilon|omega|f|v2)"
{
solver petsc;
petsc
{
options
{
ksp_type bicg;
pc_type bjacobi;
sub_pc_type ilu;
}
caching
{
matrix
{
update always;
}
preconditioner
{
update always;
}
}
}
tolerance 1e-05;
relTol 0.1;
}
}
SIMPLE
{
nNonOrthogonalCorrectors 0;
consistent yes;
residualControl
{
p 1e-2;
U 1e-3;
"(k|epsilon|omega|f|v2)" 1e-3;
}
}
relaxationFactors
{
equations
{
U 0.9;
".*" 0.9;
}
}
修改完毕后执行命令进行计算:
blockMesh
simpleFoam
计算过程如下图所示,可以看到代数方程的求解的确使用的是PETSc。
计算结果如下图所示。
未发现任何问题。
注:OpenFOAM v8用相同的方式并不能解决编译,现在还没找到问题出在哪里。我决定要放弃org版了。
”
本篇文章来源于微信公众号: CFD之道
评论前必须登录!
注册