计算过程:有限体积法

计算过程:有限体积法,第1张

有限体积法建立离散方程的一般步骤:

首先将微分方程在控制体积上进行积分,利用高斯定理把体积积分转化为控制容积边界界面上的面积积分,然后通过对界面上的参数的近似而得到最终的离散方程。其中,对 和 等参数的近似方法的不同就产生了不同的离散的格式。因此,从这个角度来说,对界面上的有关参数的近似方法是确定最终离散格式的核心。

离散过程:

求解方法:

TDMA算法:如上图中整理的公式通过矩阵求解的方法就可以进行求解,计算二维问题时会需要先确定计算方向。假设以N-S方向进行计算,那么认为W-E方向上数值为已知量。N-S方向计算结束后开始N-S方向的扫描,即W-E方向的计算。

简单迭代法 高斯塞德尔迭代

简单迭代就是将待求量表示出来单独放在公式左边,形成待求量的方程组,假定待求量的值,并不断的将新求出的待求量的值带入原方程组进行下一轮求解,直到待求量前后的差距或者差距百分比小于指定的一个小数。高斯塞德尔迭代就是字简单迭代的基础上就是将上一个待求量的值在一次迭代的过程内就带入了下一个待求量的方程组中。

求解方法还有想隐式交替迭代法、多矩阵的PDMA等等。

超松弛与欠松弛

离散格式需要有3个主要的物理性质:守恒性、有界性和迁移性(迁移性在误差分析已经说过)。

首先再回顾一下之前的高斯迭代,就拿T22举例,由于计算是按着从左向右,从下向上的方向    进行的,所以计算T22的时候,就可以拿刚刚计算出来的T12和T21来计算T22,如果说最后结果是收敛的,那么计算出来的T22会更接近于最终值。

对比常规的Jacobi的思想,可以发现高斯迭代的方法有这么一个特点:“在同一个迭代步内,边界条件向计算域传播的更快。”也正是这一个特点造成了高斯迭代的收敛快于Jacobi迭代。

    通过公式了解一下这句话,首先是Jacobi迭代:

这是Guass迭代:

首先讨论Jacobi迭代下:在同一个时间步长内,不同的迭代次数下,受影响的位置是“一圈一圈”向内传播的。

可以把这种影响想象成波!内部节点因为有初始条件的制约,开始不受到外部边界的影响,这种影响是从边界向内部传播的。

在分析Guass-Seidel迭代:

同时也只考虑一个时间步长,在一次迭代过程中计算场每一个点的温度计算都受到了控制体左侧和下侧控制体的影响,也就是说在一个迭代步内,左侧和下侧的影响就传遍了整个计算域;但是上面和右面的控制体在计算域中第一次迭代的影响却还是一步一步。

第一次迭代影响方向用粉色表示:第二次影响方向用蓝色表示;

第一迭代:

第二次迭代:

这个时候,我们再来考虑一下这句话:“在同一个迭代步内,边界条件向计算域传播的更快。”这也就从边界影响传播速度的角度解释了为什么Guass迭代要快于Jacobi迭代。

1.线迭代

参考之前的(1)-(2)式,给出线迭代的公式:

从公式上开看,这和Guass迭代差不多,影响都是从两边一次迭代就传遍了整个计算域,剩下两边只能一格一格的传递影响。即:左侧和右侧均使用新迭代步的值,上下侧使用上一个迭代步的值。

因为每一行上是使用了新迭代步的值,所以在每一行就可以表示成三对角矩阵,有了三对角矩阵就意味着可以用TDMA算法,所以这个计算方法又是一个新的方法:ADI算法。

照猫画虎,这是左右的影响一迭代步传遍全场,当然一步上下全场也是可以的!

2.ADI迭代

这里,在对(3)做进一步修改:

这样就得到了“隐式线迭代”。

想想也知道,(4)隐式线迭代可以做到一个迭代步内x轴双方向全场,y方向单方向全场,所以这个隐式线迭代也叫做“x方向隐式线迭代”。这就有意思了,高斯因为有两个面是一迭代步影响遍布全场,就比Jacobi迭代快,那么隐格式线迭代有三个面的影响单步遍全场,它的迭代绝对是快于高斯迭代的!

既然有“x方向隐式线迭代”,那就必定有“y方向隐式线迭代”,它的表达式,可以写成:

(5)隐式线迭代可以做到一个迭代步内y轴双方向全场,x方向单方向全场。

现在观察(4)-(5)式子,可以发现不管是x方向隐式线迭代还是y方向隐式线迭代,

​    ​三面影响单步遍全场,总有那么一个方向的影响是一步一步传递的。譬如:x方向隐式线迭代,上侧的影响就是一步一步传递的;y方向隐式线迭代,右侧的影响就是一步一步传递的。

现在这么想,如果我们在一个迭代步中,先进行一次x方向隐式线迭代(此时上侧的影响还是一步一步),紧接着进行一次y方向隐式线迭代(这样就保证了上方向也可以单次迭代影响遍全场)。把这种 *** 作就叫做交替方向隐式线迭代,ADI迭代。

这个ADI迭代,对于一个未知的问题,也许利用x方向隐式线迭代需要10次,利用y方向隐式线迭代需要20次,此时,ADI迭代综合了这两种迭代,需要n次就可以达到收敛效果,这里n介于10和20。所以,ADI迭代不能减少计算量,但是对于未知问题,它可以很好的平衡x方向隐式线迭代和y方向隐式线迭代的计算量,所以通用性较强。

这次想讨论一下2D情况下显格式和隐格式的FVM处理,并说三种不同于TDMA的迭代方法!

1. 2D:

有了之前1D的知识储备,2D就好理解了。

照猫画虎,写出2D情况下的方程:

模型参考:

再一次假设当我们把控制体无穷小分开时,物理量符合线性分布,这样利用线性插值来近似,时间上采用显格式形式,有:

同样对于上面的式子,我们写成系数的形式:

观察上面的式子,依然可以利用1D的思想,中心控制体是受到周围四个控制体影响的,是他们的加权平均值。

    ​   于是,考虑以下的问题:有一个3米*2米的矩形。

我们将这个面分成5*5的结构化网格。

显式格式:

类似于1D情况,2D我们也在边界外侧引入虚拟点。套用(3)式,先对于内部节点进行赋值计算:

对于T11角节点:

很好理解,距离缩小一半,影响程度扩大一半。

对于T12边界节点:

对于这三类节点(内部节点,角节点,边界节点),全部按照各自思路来计算,这样一共得到25个公式。

各个节点的温度,如下图(当然了,网格越密结果越精确。):

隐格式:

想着重说一下隐格式的处理:

同样的,利用(4)式将表达式表示成系数形式:

将未知量和已知量分开表示,如(6)式:

这样的话,如果你代入数据整理,你会发现它的系数矩阵就是一个五对角稀疏矩阵。类比于1D情况,求解未知的系数矩阵的方法,TDMA是否在2D情况下派上用场呢?答案是否定的,三角追赶法只适用于三对角矩阵,所以五对角稀疏矩阵得另外找方法。

除了三角追赶法,《数值分析》中的还有Guass消去法,假设我们的模型网格非常多,千万数量级。它和三角追赶法的不同是:消元法随着方程个数的增加,计算量超线性增大,但是TDMA算法计算量和方程个数是线性增加的。所以,归根结底,消元法就是普通的手算解决一个方程组就行,工程计算消元法实在是计算量太大!

虽然精确解无望,那么近似解的迭代法如何?

对于(6)式进行修改:

这完全就可以用迭代的思想取求解,同一个时间下一共有25个Tp,最开始假设一组TE、TW、TN、TS,例如:算出一个T1,1之后紧接着带入到T1,2的公式中,之后类推同理...直到每个控制体的温度迭代前后的值达到误差范围之内为止!

    ​在这一段过程中,迭代前后的未知量的变化量就是“残差”!如果说最后的迭代过程式收敛的,残差应该是越来越小最后趋于0的,如果熟悉Fluent等商用软件,对这个概念应该不陌生。但是对于2D情况来说,因为一共有很多控制体在依次迭代,每个控制体都有自己的残差,对于每一个来说,迭代前后的残差叫做:绝对残差。但是整体来看,就本例来说,25个控制体,25个方程,一共有25个绝对残差。如果将这25个残差写成向量形式,又该如何描述整体的残差呢?有两种表述方法:1.Rmax,n=max(Rabs,n),即找25个绝对残差中的最大值l;2.Rrms,n将每个绝对残差进行均方根计算,这叫做均方根残差。

可以发现,不管隐格式还是显格式,最后的结果必定是一样的!

2.几种迭代的讨论:

对于线性方程组,最常见的就是Jacobi和Guass-Seidel还有SOR法。这里利用之前《数值传热学》课中的一个小作业为例,先用有限差分的思想说一下这三种方法。之后再讨论一下利用Guass-Seidel在FVM时的应用。

四边的边界值已知,给中间6点一个初始值:假设给的全部为0.

    ​对于拉普拉斯离散方程的求解,可以运用Jacobi迭代或者Gauss-Seidel迭代,还有SOR法。

2.1  Jacobi:

先用假设的值计算6点温度,利用公式:

    ​将每一个点都计算一遍。这时,每个点的温度都得到了一次更新但还不是稳定时候的结果,仍然需要第二次更新,同样利用的(1)式。就这样,每一次迭代更新,都会得到一组新计算出来的值,直到迭代前后的数值之间的误差非常小,满足误差要求为止,所以迭代法就是近似解而非精确解。

这里我设置的误差为(10^-6),可以看到Jacobi迭代的结果:34次迭代完毕:

2.2  Guass-Seidel迭代

同样上述例子,同样内部点的初始值为0。

第一次迭代,我要计算1点的值,利用公式(1),算完之后,计算2点的值,仍然利用(1)只不过计算2点的公式中要将刚刚算出的1点值立马用起来带入到2点计算里;计算3点,要立马将1,2点刚刚算出的值带入用来计算3点;往后每个点都如此;

    ​第一次迭代结束之后的每个点数值肯定不会是最终的解,那么就得第二次、第三次、.....迭代,直到迭代前后的数值之间的误差非常小,满足误差要求为止,所以迭代法就是近似解而非精确解。

(可以明显发现,Guass-Seidel的计算要明显快于Jacobi!)

2.3  SOR

关于松弛因子取决于具体的问题:当他介于0和1之间-称为亚松驰;介于1和2之间-称为超松驰法。

可以发现,SOR法比高斯-赛德尔迭代还要快,这里我的松弛因子设的是1.29。关于松弛因子的最佳值,也许目前有方法了,但我不知道?我的想法就是一直试,看哪个最佳。

回到FVM中:

    ​想一下,在计算机辅助的情况下,计算的方向是:x轴从左向右,y轴从下往上。在计算每一个点的值的时候,可以参考Jacobi的思路,每一点的计算利用上一次迭代的结果;也可以利用Guass迭代的思路,算完T11,在算T21或者T12的时候,将本次迭代之前的计算结果(T11)值立马带入,因为经过新一次迭代后的值更接近于最终解,所以Guass迭代的思路要更快!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11494983.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存