有限体积法matlab | 您所在的位置:网站首页 › 有限体积法代码 › 有限体积法matlab |
做了剩下有限体积法(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 cellsolver类的目标在于针对设定的物理域、计算域、边界条件、各类参数及求解方法等,建立一个计算求解方案。它包含了grid类(网格),进一步的,grid类中每一个网格单元储存为cell对象。 我是按照自底向上,即cell->grid->solver的过程编写的,毕竟只是解一两道题,而非编写一套CFD程序,不需要太宏观的架构。 参数有两套存储形式,一是在solver类中同意存储所有网格单元上的各类信息,二是分别存储到对应的网格单元上。于是差分格式-积分近似这类计算在网格单元(cell类)中完成,而边界条件的处理及总体系数矩阵的组集则在solver类中计算。 此外,写边界条件设置时需要脑子清醒(比如CDS改成单边近似这种事)。 一些结果与讨论先分别给出40*40网格下,扩散率 分别取0.01和0.001时,CDS求解出的标量场等值线图(对照书上原图应该基本是一模一样的,一丝区别是书上还把边界值给画了进去,这里我就懒得整了) 40*40 Gamma=0.01 CDS Isolines 40*40 Gamma=0.001 CDS Isolines顺便看看40*40网格下的系数(也是稀疏)矩阵A,长得也符合预期: 40*40 Gamma=0.01 CDS sparse matrix A下面两张分别是320*320精细网格下的CDS和更直观的3d图示: 在粗糙网格(10*10)下,CDS出现了震荡解,而UDS的不震荡特性也得到了验证: 10*10 Gamma=0.001 CDS oscillation (看颜色深浅深浅深浅) 10*10 Gamma=0.001 UDS no oscillation然后是Example 2 左侧边界总通量(随网格量变化)的计算结果,与书里一致(书上通量值莫名其妙乘了个100& |
CopyRight 2018-2019 实验室设备网 版权所有 |