icoFoam动量方程离散与OpenFOAM代码解析

需积分: 50 7 下载量 195 浏览量 更新于2024-09-09 收藏 135KB DOC 举报
"icoFoam离散过程的描述主要涉及了OpenFOAM中用于求解流动问题的基础解算器icoFoam的动量方程离散步骤,以及对应的代码实现。" icoFoam是OpenFOAM中一个常用的不可压缩流体求解器,用于模拟两相流或低雷诺数流体问题。它基于有限体积法,通过离散化连续方程来求解。动量方程在icoFoam中的形式是动量守恒的体现,包括时间导数项、散度项(压力梯度)和拉普拉斯项(粘性扩散)。 1. 时间导数项: 在OpenFOAM中,时间导数项`fvm::ddt(U)`被离散为欧拉方法,即EulerDdtScheme类处理。这段代码利用模板类`template<class Type>`定义了一个临时的`fvMatrix<Type>`对象`tfvm`,其大小为速度场`U`的维度乘以体积除以时间的维度。然后,它设置系数矩阵的对角线元素为`Vp/delta(t)`,其中`rDeltaT = 1.0/mesh().time().deltaTValue()`表示时间步长的倒数,`mesh().V()`是网格体积。如果网格是移动的,源项会包含旧时间层的速度,否则使用当前时间层的速度。 2. 对流项: 对流项`fvm::div(phi,U)`通常采用Gauss积公式进行离散,这涉及到流体质点的运动对速度场的影响。在OpenFOAM中,对流项的处理方式取决于所选的数值通量方案,例如,可能会使用有限体积法中的Upwind、Central或Fluctuation等方案,这些方案的实现会在对应的差分方案类中进行。 3. 扩散项: 拉普拉斯项`fvm::laplacian(nu,U)`表示的是粘性扩散,`nu`是动力粘度。在OpenFOAM中,这通常通过雅可比矩阵的对称部分离散,以确保解的稳定性。扩散项的离散可能涉及到差分算子的选取,如二阶中心差分或者迎风差分,这依赖于所选用的数值稳定策略。 4. 压力梯度项: 压力梯度项`fvm::div(phi,P)`是由于压力变化引起的流体运动,其中`phi`是压力梯度。在icoFoam中,压力项的处理与解耦的压力修正算法密切相关,通常通过PISO(Pressure Implicit with Splitting of Operators)或SIMPLE(Semi-Implicit Method for Pressure-Linked Equations)算法来处理。 整个离散过程确保了动量方程在离散后的数值解能够近似地保持物理意义,并且在数值上是稳定的。通过OpenFOAM提供的工具,如Eclipse,可以深入理解并跟踪代码实现,从而更好地控制和调整求解过程。
2017-11-06 上传
icoFoam 求解器名称 |-createFields.H 场变量的声明和初始化 ————————————————————————————————————————————— Info<< "Reading transportProperties\n" << endl; //屏幕提示读入参数控制文件,等价于 C++中std::cout //声明属性字典类对象,该对象由 constant 文件夹下的“transportProperties”初始化创建。 IOdictionary transportProperties ( IOobject //其实IOobject,顾名思义就是输入输出对象,它完成的是一个桥梁的作用,即连接要构造的类及硬盘中的相应文件。这可以通过其成员函数objectStream()了解到,当完成了“搭桥”之后,便可通过这一成员函数返回硬盘文件对应的输入流,从而从输入流中读入将要构造的类的相关信息// ( "transportProperties", // 文件名称 runTime.constant(), // 文件位置,case/constant mesh, // 网格对象 IOobject::MUST_READ_IF_MODIFIED, //如果更改,必须读入 IOobject::NO_WRITE // 不对该文件进行写操作 ) ); //字典查询黏性,以便初始化带有单位的标量 dimensionedScalar nu ( transportProperties.lookup("nu") ); //屏幕提示创建压力场 Info<< "Reading field p\n" << endl; //创建压力场 volScalarField p //声明一个带单位的标量场,网格中心存储变量。 ( IOobject // IOobject主要从事输入输出控制 ( "p", // 压力场初始文件名称 runTime.timeName(), // 文件位置,由case中的system/controlDict中的startTime控制 //