Discretization
给定一个流动域,将其建模为连续介质,整个非线性方程组将各种流体动力学量关联起来。 离散化是将这个连续域细分为离散段并将这些方程线性化的过程。 所得方程为有限和线性的,可通过数值求解。 有几种离散化方法,包括:
有限差分法;
有限面积法
有限体积法 和
有限元法。
有几种离散化方案,包括:
欧拉
高斯线性。
Discretization coefficients
离散化系数是由问题的离散化得到的系数。它们与矩阵系数密切相关。OpenFOAM在其源代码中使用了矩阵系数。离散化系数有这种形式
p is the cell volume for which the equation applies;
r are the related cell volumes (i.e. in close proximity to cell p)
A are the discretization coefficients;
S is the source term.
fai is the variable being solved for;
以r为索引的相邻有限容积单元依赖于计算分子的大小,而计算分子的大小又依赖于离散化方案。(The neighbour cells, indexed by r, depend on the size of the computational molecule, which depends on the discretization scheme.)对于简单的离散化方案,相邻单元只包含相邻单元;而对于更高阶的方案,则在总和中包含更多的距离较远的单元。在正交网格中,相邻的符号通常用罗盘方向( compass directions即 N S W E 东西南北)来表示;然而,这不能用于非结构化网格
Matrix coefficients
矩阵系数是离散化后得到的系数。它们与离散化系数密切相关。OpenFOAM在其源代码中使用了矩阵系数
1 Definition
矩阵系数有这种形式
或者
A are the matrix coefficients;
fai is the matrix vector of variables being solved for;
i and j are cell indices.
2 Coefficient matrix
例如,给定一个简单的3×3正交网格(在二维中)9个网格单元:
-1- -2- -3-
-6- -5- -4-
-7- -8- -9-
系数矩阵可能是这样的
系数矩阵:
一个N x N的方阵,其中N是网格中的网格单元数;是稀疏、对角占优矩阵。
1、式中:X表示对角单元格;O和N表示非零的非对角单元格。
2、由于矩阵是稀疏的,所以只需要存储非零项,这是OpenFOAM中的矩阵使用lduAddressing实现的。
3、lduAddressing的工作原理是:每个网格单元都有一个对角系数;每个单元都有非对角系数由于存在相邻单元。因此,对角系数存储在一个N长向量数组中,其中N是网格单元的数目。非对角系数的数量等于在线性化方程式中彼此直接影响的单元的数量,在OpenFOAM中的矩阵级别,这仅包括相邻单元。 因此,非对角系数的数量等于网格中共享面的数量
(lduAddressing works by recognizing that:
Every cell has a diagonal coefficient; and Every cell has off-diagonal coefficients for each of their neighbours.
Therefore the diagonal coefficients are stored in an N-long vector array, where N is the number of cells. The number of off-diagonal coefficients is equal to the number of cell-pairs that directly influence one another in the linearized equations. At the matrix level in OpenFOAM, this only includes adjacent cells. Therefore the number of off-diagonal coefficients is equal to the number of shared faces in the mesh. )
2.1 Storage in OpenFOAM
OpenFOAM stores:
diagonal coefficients as a scalar field, indexed by cell volume; and off-diagonal coefficients as two scalar fields, indexed by face centres.
lduAddressing用于将这两种索引方法关联起来。.
3 Relationship with discretization coefficients
每个矩阵系数都有对应的离散化系数(Discretization coefficients)。它们是相关的
App应为Aii
即非对角矩阵系数与对应的离散化系数符号相反;而对角线与其对应的离散化系数符号相同。
Matrices in OpenFOAM
由离散化方法得到的线性方程在OpenFOAM中使用矩阵方法求解。 OpenFOAM具有处理这些矩阵的专门策略。
A is the discretization matrix, which holds the matrix coefficients;
fai is the vector array of variables being solved for; and
B is the discretization source term.
A是一个N x N方阵,其中N是离散化过程产生的方程数。
OpenFOAM已开发出一种专门的策略来处理此矩阵。 该策略的重要组成部分包括:
lduMatrix(下部-对角线-上部-矩阵存储类);
lduAddressing(索引类);
fvMatrix(包含特定于有限体积方法的组件)。
但是LDU只保存非0元素,因为矩阵大部分都是0,把那么多0保存下载没意义。解决的方法是LDU里只保存非0元素,然后用一个IduAddressing的类来保存矩阵的哪些位置有值这样的信息,如此就可以把LDU里保存的非0元素一个个填回矩阵A里,还原这个矩阵的本来面目。fvMatrix里面不止有IduMatrix和IduAddressing,还有其他一些变量。我最关心的B就是source,其他边界条件对矩阵A和B的影响主要是通过internalCoeffs和boundaryCoeffs实现的,二者的区别是internalCoeffs修改A,boundaryCoeffs修改B。
lduMatrix
lduMatrix类将矩阵系数存储在三个数组中
scalarField *lowerPtr_;
scalarField *diagPtr_;
scalarField *upperPtr_;
这些数组是包含系数矩阵中所有非零项的字段。
Diagonals
每个单元格都有且只有一个对角系数,没有一个是零。因此,对角线列表包含N个值,其中N是网格中的单元格数
As discretization coefficients,
As matrix coefficients,
Upper and lower triangles
上面和下面的三角形有(N - 1)N个可能的值,但是大多数都是0。非零值对应于相互影响的网格单元。换句话说,网格中的每个内部面都有两个非零系数:一个出现在下面的三角形中;一个出现在上面的三角形中。有些数学运算需要区分这两个系数,因为它们有时在符号上是相反的(例如涉及到通量时)。OpenFOAM的网格设计预见了这一需求,这就是为什么每个面都有一个所有者单元和一个邻居单元。所有者、邻居和对角系数定义为
根据这个定义,下面的三角形有owner系数;上面的三角形neighbour系数
Diagonal, symmetric, and asymmetric matrices
必须定义对角线;其他的是不需要的。如果只定义了一个下三角形或一个上三角形,则假定矩阵是对称的。如果两者都有定义,它将假定矩阵是不对称的,即使它们是相等的