做了剩下有限体积法(Ferziger, Ch.4[1])另外两个Example(测试数值扩散的那一算例,书里似乎并没有给出CDS矩阵奇异下的求解方法,我直接按MATLAB里AB求解,结果并不完全一致):
- Scalar Transport in a Known Velocity Field
- Testing the Numerical Diffusion
果然FVM比FDM麻烦不少,一开始还是按面向过程写,中途感到不对劲于是写成类了。写到一半去搜了下Openfoam[2]发现自己写的类定义(思路)和它居然差不太多,挺巧。
*网页端文章还可以把背景图片搞成这种花里胡哨的可还行
问题
Example 2 Scalar Transport in a Known Velocity Field
考虑标量输运方程
算一个给定速度场(驻点附近的无粘流动,
边界条件具体为:
- 左侧(wall)和上侧(inlet)为第一类边界,左侧
为从0到1线性分布(如图),上侧;
- 右侧(outlet)和下侧(symmetric boundary)为第二类边界,
。
要求扩散项采用CDS,对流项分别采用CDS和UDS计算。
Example 3 Testing the Numerical Diffusion
考虑具有阶梯剖面(间断)斜向均匀流中的对流问题(无扩散项)
面对这一问题,CDS构造出的系数矩阵A主对角元均为0,矩阵奇异难以求解。总之就是验证CDS会产生震荡以及UDS通过数值扩散避免了震荡的发生。(TVD格式消除震荡暂时没考虑)
基本思路
设计了三个类:
- solver
- grid
- cell
solver类的目标在于针对设定的物理域、计算域、边界条件、各类参数及求解方法等,建立一个计算求解方案。它包含了grid类(网格),进一步的,grid类中每一个网格单元储存为cell对象。
我是按照自底向上,即cell->grid->solver的过程编写的,毕竟只是解一两道题,而非编写一套CFD程序,不需要太宏观的架构。
参数有两套存储形式,一是在solver类中同意存储所有网格单元上的各类信息,二是分别存储到对应的网格单元上。于是差分格式-积分近似这类计算在网格单元(cell类)中完成,而边界条件的处理及总体系数矩阵的组集则在solver类中计算。
此外,写边界条件设置时需要脑子清醒(比如CDS改成单边近似这种事)。
一些结果与讨论
先分别给出40*40网格下,扩散率
顺便看看40*40网格下的系数(也是稀疏)矩阵A,长得也符合预期:
下面两张分别是320*320精细网格下的CDS和更直观的3d图示:
在粗糙网格(10*10)下,CDS出现了震荡解,而UDS的不震荡特性也得到了验证:
然后是Example 2 左侧边界总通量(随网格量变