学习笔记

OpenFOAM programming tutorial

创建自己的求解器

  • 寻找和你求解器功能最接近的求解器;
  • 拷贝到目标文件夹,并重命名;
  • 改变文件名字以及Make/files
  • 定制代码

以myIcoFoam为例

  • 拷贝文件夹
    zhoudq@zhoudq-MacBookAir:~/OpenFOAM/OpenFOAM-6/applications$ cp -r icoFoam $WM_PROJECT_USER_DIR/applications
    
  • 重命名文件
    mv icoFoam.C myIcoFoam.C
    
  • 清除生成的中间文件
    wclean
    
  • 进入Make文件夹,修改files文件
zhoudq@zhoudq-MacBookAir:~/OpenFOAM/zhoudq-6/applications/myIcoFoam$ cd Make/
zhoudq@zhoudq-MacBookAir:~/OpenFOAM/zhoudq-6/applications/myIcoFoam/Make$ ls
files  options
zhoudq@zhoudq-MacBookAir:~/OpenFOAM/zhoudq-6/applications/myIcoFoam/Make$ vim files 
zhoudq@zhoudq-MacBookAir:~/OpenFOAM/zhoudq-6/applications/myIcoFoam/Make$ more files 
myIcoFoam.C

EXE = $(FOAM_USER_APPBIN)/myIcoFoam
  • 如果要使用该求解器,需要在计算文件夹中修改system/controlDict中的application
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    location    "system";
    object      controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

application    myIcoFoam;
  • 植入方程:

We want to solve the following transport equation for the scalar field T, It is an unsteady, convection-diffusion transport equation. ν is the kinematic viscosity.

我们要做的大体有两件事: ①在createFields.H头文件中创建几何场(geometric field) T; ②在求解器主文件myIcoFoam中求解上述标量运输方程;

#include "createPhi.H"
Info<< "Reading field T\n" << endl;
volScalarField T
(
    IOobject
    (
        "T",
        runTime.timeName(),
        mesh,
        IOobject::MUST_READ,
        IOobject::AUTO_WRITE
    ),
    mesh
);

这里面的#include “createPhi.H”为原来就有的,这一句的作用是什么呢? T is defined on the computational mesh (mesh object):

  • 创建T方程 Create a new empty file, TEqn.H: echo > TEqn.H

在myIcoFoam中增加TEqn.H调用

  while (piso.correct())
        {
            #include "TEqn.H"
            volScalarField rAU(1.0/UEqn.A());
            volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p));
            surfaceScalarField phiHbyA
            (…

在TEqn.H中求解T方程:

solve
(
fvm::ddt(T)
+ fvm::div(phi, T)
- fvm::laplacian(nu, T)
);

下面检验一下上述求解器,拷贝cavity到自己的文件夹,并在0文件夹中新增T字典文件

zhoudq@zhoudq-MacBookAir:~/OpenFOAM/CFD/cavity/cavity/0$ cp p T

修改T文件

/*--------------------------------*- C++ -*----------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     | Website:  https://openfoam.org
    \\  /    A nd           | Version:  6
     \\/     M anipulation  |
\*---------------------------------------------------------------------------*/
FoamFile
{
    version     2.0;
    format      ascii;
    class       volScalarField;
    object      T;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

dimensions      [0 0 0 0 0 0 0];

internalField   uniform 0;

boundaryField
{
    movingWall
    {
        type            fixedValue;
        value           uniform 1;
    }

    fixedWalls
    {
        type            fixedValue;
        value           uniform 0;
    }

    frontAndBack
    {
        type            empty;
    }
}

修改离散格式文件system/fvSchemes,

  • 修改对流项
    divSchemes
    {
      default         none;
      div(phi,U)      Gauss linear;
      div(phi,T)      Gauss linear;//add
    }
    

    ==总共有多少种离散格式?适用情况如何?==

  • 修改拉普拉斯项,本文采用的默认离散格式
    laplacianSchemes
    {
      default         Gauss linear orthogonal;
    }
    
  • 修改求解方法及控制文件system/fvSolution
    T
     {
          solver          PBiCG;// 采用预条件双共轭梯度法(主要用于反对称矩阵)
          preconditioner  DILU;//预测器,对角不完全LU
          tolerance       1e-06;//残差
          relTol          0.05;//迭代容差
      }//add
    

==其中为什么要采用上述求解器以及预条件(速度采用预条件双共轭梯度法(主要用于反对称矩阵))?==

上述为什么留在明天解答吧。 本文总阅读量 ⤧  Next post openfoam学习笔记-3 ⤧  Previous post openfoam学习笔记-1