openfoam学习笔记-1
学习笔记
OpenFOAM programming tutorial
- foam为进入OPENFOAM文件夹的快捷命令;
- app为进入application文件夹的快捷命令;
- tut为进入tutorials文件夹的快捷命令; 关于icoFoam求解器 文件类型 头文件(header files) 位于主程序入口之前int main (int arg, char* argv[]) 包含不同类的定义; 集合在一起方便使用; 包含文件(include files) 通常为通用模块; Enforce consistent naming between executables, e.g. mesh, runTime ? 当地使用文件(Local implementation files) 例如createFields.H 主要代码
icoFoam
#include "fvCFD.H"
#include "pisoControl.H"
int main(int argc, char *argv[])
{
#include "setRootCaseLists.H"
#include "createTime.H"
#include "createMesh.H"
pisoControl piso(mesh);
#include "createFields.H"
#include "initContinuityErrs.H"
Info<< "\nStarting time loop\n" << endl;
函数入口 int main(int argc, char *argv[]) 其中int argc and char *argv[] 为参数个数以及实际运行过程中的实际参数;然后执行
#include "setRootCaseLists.H"
#include "createTime.H"
#include "createMesh.H"
上述文件均位于$FOAM_SRC/finiteVolume/lnInclude;
createFields.H 文件位于icoFoam文件夹,用于初始化求解器使用的变量;
#include "CourantNo.H"
计算courant数; 然后定义动量方程并求解动量方程
while (runTime.loop())
{
Info<< "Time = " << runTime.timeName() << nl << endl;
#include "CourantNo.H"
// Momentum predictor
fvVectorMatrix UEqn
(
fvm::ddt(U)
+ fvm::div(phi, U)
- fvm::laplacian(nu, U)
);
if (piso.momentumPredictor())
{
solve(UEqn == -fvc::grad(p));
}
// --- PISO loop
while (piso.correct())
{
volScalarField rAU(1.0/UEqn.A());
volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p));
surfaceScalarField phiHbyA
(
"phiHbyA",
fvc::flux(HbyA)
+ fvc::interpolate(rAU)*fvc::ddtCorr(U, phi)
);
adjustPhi(phiHbyA, U, p);
// Update the pressure BCs to ensure flux consistency
constrainPressure(p, U, phiHbyA, rAU);
// Non-orthogonal pressure corrector loop
while (piso.correctNonOrthogonal())
{
// Pressure corrector
fvScalarMatrix pEqn
(
fvm::laplacian(rAU, p) == fvc::div(phiHbyA)
);
pEqn.setReference(pRefCell, pRefValue);
pEqn.solve(mesh.solver(p.select(piso.finalInnerIter())));
if (piso.finalNonOrthogonalIter())
{ phi = phiHbyA - pEqn.flux();
}
}
#include "continuityErrs.H"
U = HbyA - rAU*fvc::grad(p);
U.correctBoundaryConditions();
}
runTime.write();//写入文件;
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
<< " ClockTime = " << runTime.elapsedClockTime() << " s"
<< nl << endl;
}
Info<< "End\n" << endl;
return 0;
}
然后做压力修正以及正交修正;求解结束。
#include “pisoControl.H”
查了一下pisoControl文件说明:PISO control class. Provides time-loop and PISO-loop control methods. No convergence checking is done. 没有收敛判断?那如何退出piso修正循环的呢?没有循环么?
while (piso.correct())
{
..
}
piso.correct()返回值是什么? 在pisoControl.C中correct()函数定义如下:
bool Foam::pisoControl::correct()
{
read();
if (finalPISOIter())
{
corrPISO_ = 0;
return false;
}
++ corrPISO_;
return true;
}
在该函数中使用了finalPISOIter()作为最后一次PISO迭代的标志判断;在文件pisoControlI.H中定义,其定义如下:
inline bool Foam::pisoControl::finalPISOIter() const
{
return corrPISO_ >= nCorrPISO_;
}
其中corrPISO为当前PISO修正;nCorrPISO为最大PISO修正;
而nCorrPISO是在pisoControl.C中通过成员函数读取
bool Foam::pisoControl::read()
{
if (!fluidSolutionControl::read())
{
return false;
}
const dictionary& solutionDict = dict();//dict()函数为返回求解字典Return the solution dictionary.
nCorrPISO_ = solutionDict.lookupOrDefault<label>("nCorrectors", 1);
return true;
}
读取fvSolution字典文件中的nCorrectors来定义,缺省值为1;以elbow案例为例,fvsolution字典文件如下:
PISO
{
nCorrectors 2;
nNonOrthogonalCorrectors 2;
}
本文总阅读量次 ⤧ Next post openfoam学习笔记-2 ⤧ Previous post The flow through orifice