openfoam学习心得—动网格源码剖析

在openfoam V7 pimpleFoam求解器代码中,有以下代码,用于处理动网格:

#include "dynamicFvMesh.H"
#include "createDynamicFvMesh.H"--展开后如下:
    Info<< "Create mesh for time = "
        << runTime.timeName() << nl << endl;
    autoPtr<dynamicFvMesh> meshPtr
    (
        dynamicFvMesh::New
        (
            IOobject
            (
                dynamicFvMesh::defaultRegion,
                runTime.timeName(),
                runTime,
                IOobject::MUST_READ
            )
        )
    );
    dynamicFvMesh& mesh = meshPtr();//指针所指向对象的引用

源代码中网格更新只有一行代码:mesh.update(),我们去类dynamicFvMesh中找此函数,发现此函数是个纯虚函数,仔细思考,这里使用了C++多态性质,mesh是执行基类的引用,可以初始化为子类对象,再看上面有 dynamicFvMesh::New,故可以断定这里是RTS机制,meshPtr()确实是子类对象,update函数应该是子类对象中的update函数。子类有如下几种,主要看dynamicMotionSolverFvMesh.
在这里插入图片描述

#include "dynamicFvMesh.H"
namespace Foam
{
class motionSolver;   前向声明,说明使用了这个类
class dynamicMotionSolverFvMesh
:
    public dynamicFvMesh   继承于基类
{
    // Private Data
        autoPtr<motionSolver> motionPtr_;   指针并未初始化,RTS机制指向子类对象
        位于基类中的类,用于修正边界场的速度,不用深究
        velocityMotionCorrection velocityMotionCorrection_; 
        ......
     bool Foam::dynamicMotionSolverFvMesh::update() 求解器中调用的函数
{
		用到了基类的基类fvMesh,以及motionSolver类中的newPoints()方法
    fvMesh::movePoints(motionPtr_->newPoints()); 
    velocityMotionCorrection_.update();  不用深究
    return true;
}

现在我们转到motionSolver类,位于此文件夹下./dynamicMesh/motionSolvers/motionSolver/motionSolver.H,其为一个虚基类:

Virtual base class for mesh motion solver.
- Provide new points for motion.  Solves for motion
  virtual tmp<pointField> newPoints();返回一个点场,其也为geometricField中的一类
  Foam::tmp<Foam::pointField> Foam::motionSolver::newPoints()
{
    solve();此函数求解vol场
    return curPoints();由vol插值到point
}
发现这两个函数均是纯虚函数,固要到其子类中寻找
virtual void solve() = 0
virtual tmp<pointField> curPoints() const = 0;

这中间经过了好多重继承才最终定义这两个函数,具体见下图:
openfoam学习心得—动网格源码剖析_第1张图片上面只是给出了运动方程求解器的程序所在位置及调用关系,此求解器对应的边界条件在哪里设定呢?位于此文件夹下/root/OpenFOAM/OpenFOAM-7/src/fvMotionSolver/pointPatchFields/derived/与运动方程求解器位于一个地方,暂时先写这么多,笔者突然觉得还是把openfoam想的太简单,其可以更灵活,openfoam理应是CFD界的matlab。

你可能感兴趣的:(openfoam学习心得—动网格源码剖析)