icoFoam 解析

icoFoam 是 OpenFOAM User Guide 里面的算例用的一个计算程序。它的源程序位于 $FOAM_SOLVERS/incompressible/icoFoam, 进入到这个目录里,用 tree 会输出以下内容(注:#及其后属于注释,并不是使用该命令的输出结果):

多版本 OpenFOAM 运算环境共存

(如需留言,请移步 CFDwired Forum)

在你的用户目录里,有一个隐藏文件 .bashrc,在里面添加以下语句,

alias fe31='source $HOME/OpenFOAM/foam-extend-3.1/etc/bashrc'
alias of4x  ='source $HOME/OpenFOAM/OpenFOAM-4.x/etc/bashrc'
alias of5x  ='source $HOME/OpenFOAM/OpenFOAM-5.x/etc/bashrc'
alias of1806='source $HOME/OpenFOAM/OpenFOAM-1806/etc/bashrc’

就可以实现 OpenFOAM 的多版本共存,当你需要使用其中一个版本时,比如 foam-extend-3.1, 就打开一个终端,在命令行键入 fe31,随后就可以在这个终端使用 foam-extend-3.1 版本了。

Code of the Week #9: tolerance 1e-06

如需留言,请移步 CFD Forum

Code of the Week #8: solver PCG,这一次来讲讲容差的设置。这个设置位于 system/fvSolution ,部分如下:

Code of the Week #8: solver PCG

如需留言,请移步 CFDwired Forum

前面已经基本了解了 OpenFOAM 对方程是如何离散的,即对 PDEs (偏微分方程, Partial Differential Equations) 离散成矩阵的乘法,以方便计算机求解: $$ \mathbf{A}\varphi=\mathbf{Q} \tag{1} $$ 式中, $\mathbf{A}$ 为矩阵的系数, $\varphi$ 为待求的未知数向量, $\mathbf{Q}$ 为已知向量。

计算机在求解这些方程时,针对方程的特点,也提供了很多的选择,如何选择方程求解的算法,OpenFOAM 将会读取一个设置文件,即位于算例文件夹下的 system/fvSolution 文件,该文件 的一部分如下:

Code of the Week #6: laplacian(rAU, p) linear corrected

在 system/fvSchemes 里,经常见到

laplacianSchemes
{
    laplacian(rAU, p) Gauss linear corrected;
}

laplacianSchemes 是在 system/fvSchemes 文件里的子字典,指定 laplacian 项的离散格式,其语法是

laplacianSchemes
{
    default         none;
    laplacian(gamma,phi) Gauss <interpolationScheme> <snGradScheme>;
}

其代表的意义是 $$ \nabla\cdot(\Gamma\nabla \phi) = \Gamma\nabla^2 \phi = \Gamma\left(\frac{\partial^2}{\partial x_1^2} \phi + \frac{\partial^2}{\partial x_2^2} \phi + \frac{\partial^2}{\partial x_3^2} \phi\right) $$

Code of the Week #7: fvm::laplacian(rUA, p) == fvc::div(phi)

如需讨论,请移步至 CFDwired Forum

fvm::laplacian(rUA, p) == fvc::div(phi)

这一行程序是 icoFoam 中的一行,写成张量形式为 $$ \frac{1}{A_p}\nabla^2 p =\frac{1}{A_p}\nabla\cdot(\nabla p)= \nabla \cdot U \tag{1} $$ 称为压力泊松方程。rUA 就是方程中的 $\dfrac{1}{A_p}$ 。

$A_p$ 是动量方程离散后,去掉压力梯度项,当前 Cell 的矩阵系数: $$ A_\mathrm{P} \mathbf U_\mathrm{P}^{n+1} + \sum A_\mathrm{N}\mathbf U_\mathrm{N}^{n+1} - E_\mathrm{P}^{n+1} = 0 \tag{2} $$

不过,我们先来看一下 U 方程:

下面 icoFoam.C 片段:

Code of the Week #5: div(phi,U) Gauss linear

本周,我们了解一下散度的离散格式指定,如下程序段位于 system/fvSchemes 内。

divSchemes 
{ 
    default         none; 
    div(phi,U)      Gauss linear; 
} 

这一对 {} 指定 $\nabla\cdot$ 的离散方法,其中,default none; 指的是无缺省的离散格式;div(phi, U) Gauss linear; 指定了 $\nabla\cdot(\rho U U)$ 的离散格式为Gauss 方法,并使用中心差分。

Gauss 方法是散度的唯一离散方法,并在其后需要指定所求场的插值格式。指定的方法为

Code of the Week #4: solve(UEqn == -fvc::grad(p))

今天,我们要讲的是

solve(UEqn == -fvc::grad(p));

这一行程序来自于 icoFoam.C ,从字面上理解是求解方程组。

首先,来看一下括号里面各项的定义:

Code of the Week #3: laplacian(nu, U)

本周,我们讨论一下这一个语句:

fvm::laplacian(nu, U);

这一项是动量方程 $$ \frac{\partial U}{\partial t} + \nabla\cdot(UU) = -\nabla p + \nabla\cdot\tau $$ 的右边第二项。

考虑不可压缩牛顿流体,则有 $$ \tau = \nu ( \nabla U +(\nabla U)^T ) $$ 由于不可压缩牛顿流体有 $$ \nabla U = (\nabla U)^T,\, \nabla\cdot U =0 $$ 因此,$\tau$ 的散度为 $$ \nabla\cdot\tau = \nu \nabla^2 U $$ 这一步具体推导可见 wiki N-S 方程推导

Code of the Week #2: ddt(U)

本周,我们讨论一下这一个语句:

fvm::ddt(U);

这一项是动量方程 $$ \frac{\partial U}{\partial t} + \nabla\cdot(UU) = -\nabla p + \nabla\cdot\tau $$ 的左边第一项。

求解这一方程时,需要对 $p$ 和 $U$ 进行解耦。但是,本周,我们不讨论解耦的问题,而讨论一下时间项是如何离散的。为方便说明,设 $$ \frac{\partial U}{\partial t} = S $$ 右边的 $S$ 为源项。

Pages

Subscribe to rheo.works RSS