#最近看了李新亮老师的OpenCFD一维差分格式验证的求解器代码,对通量的求法有了一些新的认识,过去自己使用的要么是一阶的,精度差,要么就没考虑到激波问题。在实际求解器中,会使用一些方法来构造高精度的差分格式并避免激波问题,这就需要学习各种差分格式的构造方程,于是有此文章,全当记录。#
一、问题描述
针对一维Sod激波管问题:
其控制方程可以写为:
二、求解思路
Step 1:初始化。划分网格,初始化。
Step 2:计算通量。采用三阶迎风格式构造构造通量。由于迎风格式需要知道方向,即正负,这里已经把通量分为了正值和负值,在第三步会处理。
对于三阶迎风格式:
Step 3:通量分裂处理。为了采用高阶的迎风格式,需要对通量进行处理,这里采用Steger-Warming方法分裂通量,避免出现间断。其思路是将通量分为正值和负值,然后将二者相加,即得到了总通量,即:
由上一步可知:
因此我们需要求出, 过程网上很多人都有介绍如(https://zhuanlan.zhihu.com/p/148377847),这里我们不做推导,只给出结果:
式中:
为了避免导数在间断处不连续,一般会写成这种形式:
其中
Step 4 :时间推进求解。这里采用三阶Runge-Kutta法进行时间推进。
经过我们上述的处理,我们可以得到常微分方程如下:
进一步地,将其展开处理:
采用三阶RK方法进行时间推进,可分为三个子步:
至此,我们已经通过当前时间步,获得了下一时间步的
,遍历整个网格,即可得到所有网格节点上的值
。
重复Step2——Step4,直到达到停止时刻。