devc++源文件未编译_OpenFOAM16 编译PETSc库

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文件,如下图所示修改其内容:

4f10b4018b0fb30ef9a0046e8d2485cb.png

添加的内容选项为:

--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.2\DPInt32\externalpackages\f2cblaslapack-3.4.2.q4中发现了两个静态库文件libf2cblas.alibf2clapack.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检查是否安装成功,此时提示错误:

d7f4268c5853ada4c7988c59b3e79505.png

说是找不到文件libpetsc.so.3.13。搜索了一下找到了此文件。

972d951a572490ef8b1dd2f5e3e8050e.png

发现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/controlDictsystem/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。

92056da4783d3b22ba6ef91bdc25eb87.png

计算结果如下图所示。

da770ab174cc4a3254bd6c5014210b42.png

未发现任何问题。


注:OpenFOAM v8用相同的方式并不能解决编译,现在还没找到问题出在哪里。我决定要放弃org版了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
penFOAM基础--编译applications和libraries openFOAM是一个,用户在编程时需要调用此,当然用的语言是面向对象的c++语言。在使用openFOAM时我们应该将关注点放在顶层使用类以及数值算法上,这就需要对openFOAM Library的调用机制有一个详细的了解。并且由于我们在使用c++语言编程,因此需要对c++编译过程有所了解。 关于编译器,我们可以直接使用LINUX自带的make程序,但openFOAM又提供了一个编译程序wmake,它建立在make的基础上,但比make更强大和简单。并且wmake不仅可以用于openFOAM library,而且可以用于任何c++代码。 openFOAM中的类,本质上是c++的class,都定义在.c文件中,这些文件在用编译器进行编译之后会生成.so文件(可执行的二进制文件),形成(library)。openFOAM在提供时都已经生成了.so文件,因此当我们编译一个调用了某class(该class所在文件为nc.c)的程序app.c时,nc.c不会被重新编译,而是调用直接调用nc.so文件。这种机制称为“动态链接”。而如果对某.c文件进行了修改,则重新编译之后才会生效。 c++中,我们在使用一个变量或者对象时,必须确保该变量或对象已经存在,这就需要进行声明。在使用类时同样需要事先声明,这些对类的声明都包装在.h文件中,我们称之为头文件(header file)。头文件中声明的类一定要能在中找到,这就要求声明的类与.c文件中定义的类相一致。头文件都必须以#include "xx.h"的形式被“包含”在使用了该头文件的c文件中(.c或.h文件)。一个c文件要想使用某个类,则必须在文件的开始将声明了该类的.h文件包含进来。这样一来,我们在编译一个程序的时候,可以通过“递归搜索”找到一系列的.h文件名,我们把这些.h文件称为dependences,而这一系列文件名也就是一个dependence list。编译器会判断这个list中的各个.h文件在最后一次进行编译之后是否被修改过,如果修改了,则从新编译,如果没有被修改,那么不再编译。然后,编译器会根据.h文件中的声明和程序中的调用情况在中找到想要的代码,进而链接出可执行文件来。一方面,只有有了.h文件,我们在写程序代码时才能保证用到的类都是声明过的;另一方面,只有有了.h文件中的声明,我们才能在中找到自己需要的东西,从这个角度来讲,h文件可以看作是的接口。 (.h文件的用途不仅仅是用来做class declaration。当某程序代码需要调用本身的时候,通常为了增加程序的可读性,也会选择.h文件来组织文件结构。)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值