Riemann问题精确解及程序实现

本文详细介绍了Riemann问题,包括问题描述、求解方法和程序实现。针对五种不同情况,讨论了左激波、右激波、左膨胀波和右膨胀波的处理,利用Riemann不变量和特征线分析,通过数值方法求解中间压力p*,进而得到其他物理量。文章提供了MATLAB程序实现的概述,展示了不同情况下的运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习自李新亮的《计算流体力学讲义PPT》第2讲 双曲型方程组及间断解

1 问题描述

一维无粘流动初始间断的演化问题,激波管问题(Sod激波管问题),由于该问题属于典型的间断问题,且有精确解存在,故广泛用于对比验证CFD中离散格式、数值方法的准确性,意义嘛还是蛮重要的,哈。

一无限长管道内部充满理想气体(无粘),中间有一不计厚度的隔膜,初始时刻 t 0 t_0 t0,左侧气体的速度、密度、压力分别为 u 1 u_1 u1 ρ 1 \rho_1 ρ1 p 1 p_1 p1,右侧气体的速度、密度、压力分别为 u 2 u_2 u2 ρ 2 \rho_2 ρ2 p 2 p_2 p2。不考虑流体粘性,突然将隔膜抽出(也可认为隔膜突然消失),那么到时刻 t t t后,管道内流体的速度、密度、压力将如何分布?

---------------------------------------------------------
   u 1 , ρ 1 , p 1 u_1, \rho_1,p_1 u1,ρ1,p1    |    u 2 , ρ 2 , p 2 u_2, \rho_2, p_2 u2,ρ2,p2
---------------------------------------------------------

控制方程为一维Euler方程(即无粘可压缩理想流体一维流动的控制方程):
{ ∂ ρ ∂ t + ∂ ( ρ u ) ∂ x = 0 ∂ ( ρ u ) ∂ t + ∂ ( ρ u 2 + p ) ∂ x = 0 ∂ ( ρ E ) ∂ t + ∂ ( ρ E u + p u ) ∂ x = 0 \begin{cases} \displaystyle \frac{\partial{\rho}}{\partial{t}} + \frac{\partial{(\rho u)}}{\partial x}=0 \\ \\ \displaystyle \frac{\partial{(\rho u)}}{\partial{t}} + \frac{\partial{(\rho u^2 + p)}}{\partial x}=0 \\ \\ \displaystyle \frac{\partial{(\rho E)}}{\partial{t}} + \frac{\partial{(\rho E u + pu)}}{\partial x}=0 \end{cases} tρ+x(ρu)=0t(ρu)+x(ρu2+p)=0t(ρE)+x(ρEu+pu)=0

初始条件:

t = t 0 时 , ( u , ρ , p ) = { u 1 , ρ 1 , p 1 x < 0 u 2 , ρ 2 , p 2 x ≥ 0 t=t_0时,\quad\quad (u,\rho,p)=\begin{cases} u_1,\rho_1,p_1 &x<0\\ u_2,\rho_2,p_2 &x\geq0\\ \end{cases} t=t0,(u,ρ,p)={u1,ρ1,p1u2,ρ2,p2x<0x0

另外,求解方程需要用到的变量为理想气体比热比 γ = 1.4 \gamma=1.4 γ=1.4,气体守恒能量 ρ E \rho E ρE与气体其他状态参数的关系式

ρ E = p γ − 1 + ρ u 2 2 \displaystyle \rho E=\frac{p}{\gamma-1}+\rho\frac{u^2}{2} ρE=γ1p+ρ2u2

声速与气体其他状态参数的关系式

c = γ p ρ \displaystyle c=\sqrt{\gamma \frac{p}{\rho}} c=γρp

2 求解方法

流场中可能出现三种波:

间断类型特征
激波强间断,满足R-H关系式
接触间断特殊间断,仅密度突变,而速度和压力不变
膨胀波等熵波

依据不同的初始条件,可以产生五类不同的情况,分别为
(1)左激波-接触间断-右激波
(2)左膨胀波-接触间断-右激波
(3)左激波-接触间断-右膨胀波
(4)左膨胀波-接触间断-右膨胀波
(5)左膨胀波-右膨胀波
在这里插入图片描述

2.1 情况1,左右激波和中间的接触间断

在这里插入图片描述
在这里插入图片描述
区域1和区域2中物理量与初始状态一致,分别为 u 1 u_1 u1 ρ 1 \rho_1 ρ1 p 1 p_1 p1 u 2 u_2 u2 ρ 2 \rho_2 ρ2 p 2 p_2 p2

待求量为左激波运动速度 Z 1 Z_1 Z1、右激波运动速度 Z 2 Z_2 Z2,注意左激波是向左运动的,右激波是向右运动的,这里把 Z 1 Z_1 Z1 Z 2 Z_2 Z2的正方向都定义为沿着 x x x轴的正方向。

区域3和区域4中物理量也为待求量,由于接触间断两侧仅密度产生突变,故区域3和区域4中的速度和压力时相同的,将其定义为 u ∗ u^* u p ∗ p^* p,将区域3和区域4的密度分别定义为 ρ ∗ L \rho^{*L} ρL ρ ∗ R \rho^{*R} ρR。注意,中间接触间断面的运动速度并不是未知量,因为该间断面两侧速度相同,都为 u ∗ u^* u,所以该间断面的运动速度也为 u ∗ u^* u

那么总共有6个未知量,即 Z 1 Z_1 Z1 Z 2 Z_2 Z2 u ∗ u^* u p ∗ p^* p ρ ∗ L \rho^{*L} ρL ρ ∗ R \rho^{*R} ρR

在激波两侧的物理量满足R-H关系,即质量、动量、能量通量守恒,即

在这里插入图片描述

{ ρ 1 ( u 1 − Z ) = ρ 2 ( u 2 − Z ) ρ 1 u 1 ( u 1 − Z ) + p 1 = ρ 2 u 2 ( u 2 − Z ) + p 2 ρ 1 E 1 ( u 1 − Z ) + u 1 p 1 = ρ 2 E 2 ( u 2 − Z ) + u 2 p 2 \begin{cases} \displaystyle \rho_1(u_1-Z)=\rho_2(u_2-Z) \\ \displaystyle \rho_1 u_1 (u_1-Z) + p_1=\rho_2 u_2 (u_2-Z) + p_2 \\ \displaystyle \rho_1 E_1 (u_1-Z) + u_1 p_1=\rho_2 E_2 (u_2-Z) + u_2 p_2 \end{cases} ρ1(u1Z)=ρ2(u2Z)ρ1u1(u1Z)+p1=ρ2u2(u2Z)+p2ρ1E1(u1Z)+u1p1=ρ2E2(u2Z)+u2p2

那么,对于1-3两区
{ ρ 1 ( u 1 − Z 1 ) = ρ ∗ L ( u ∗ − Z 1 ) ( 1 ) ρ 1 u 1 ( u 1 − Z 1 ) + p 1 = ρ ∗ L u ∗ ( u ∗ − Z 1 ) + p ∗ ( 2 ) ρ 1 E 1 ( u 1 − Z 1 ) + u 1 p 1 = ρ ∗ L E ∗ L ( u ∗ − Z 1 ) + u ∗ p ∗ ( 3 ) \begin{cases} \displaystyle \rho_1(u_1-Z_1)=\rho^{*L}(u^*-Z_1) & (1) \\ \displaystyle \rho_1 u_1 (u_1-Z_1) + p_1=\rho^{*L} u^* (u^*-Z_1) + p^* & (2)\\ \displaystyle \rho_1 E_1 (u_1-Z_1) + u_1 p_1=\rho^{*L} E^{*L} (u^*-Z_1) + u^* p^* & (3) \end{cases} ρ1(u1Z1)=ρL(uZ1)ρ1u1(u1Z1)+p1=ρLu(uZ1)+pρ1E1(u1Z1)+u1p1=ρLEL(uZ1)+up(1)(2)(3)

对于2-4两区
{ ρ 2 ( u 2 − Z 2 ) = ρ ∗ R ( u ∗ − Z 2 ) ( 4 ) ρ 2 u 2 ( u 2 − Z 2 ) + p 2 = ρ ∗ R u ∗ ( u ∗ − Z 2 ) + p ∗ ( 5 ) ρ 2 E 2 ( u 2 − Z 2 ) + u 2 p 2 = ρ ∗ R E ∗ R ( u ∗ − Z 2 ) + u ∗ p ∗ ( 6 ) \begin{cases} \displaystyle \rho_2(u_2-Z_2)=\rho^{*R}(u^*-Z_2) & (4)\\ \displaystyle \rho_2 u_2 (u_2-Z_2) + p_2=\rho^{*R} u^* (u^*-Z_2) + p^* & (5)\\ \displaystyle \rho_2 E_2 (u_2-Z_2) + u_2 p_2=\rho^{*R} E^{*R} (u^*-Z_2) + u^* p^* & (6) \end{cases} ρ2(u2Z2)=ρR(uZ2)ρ2u2(u2Z2)+p2=ρRu(uZ2)+pρ2E2(u2Z2)+u2p2=ρRER(uZ2)+up(4)(5)(6)

总共6个方程(1)-(6),6个未知数,可解。

解法如下:

先来看1-3区的关系式(1)-(3),共有4个未知数 ρ ∗ L \rho^{*L} ρL u ∗ u^* u Z 1 Z_1 Z1 p ∗ p^* p,注意 E ∗ L E^{*L} EL是其他状态参数的函数,不属于未知量,其与其他量关系为:

ρ ∗ L E ∗ L = p ∗ γ − 1 + ρ ∗ L ( u ∗ ) 2 2 ( 7 ) \displaystyle \rho^{*L} E^{*L}=\frac{p^*}{\gamma-1}+\rho^{*L}\frac{(u^*)^2}{2} \quad (7) ρLEL=γ1p+ρL2(u)2(7)

接下来要做的是从(1)-(3)中消去 ρ ∗ L \rho^{*L} ρL Z 1 Z_1 Z1,找到 u ∗ u^* u p ∗ p^* p的关系式,先由(1)可得
ρ ∗ L = ρ 1 ( u 1 − Z 1 ) ( u ∗ − Z 1 ) ( 8 ) \displaystyle \rho^{*L} = \frac{\rho_1(u_1-Z_1)}{(u^*-Z_1)} \quad (8) ρL=(uZ1)ρ1(u1Z1)(8)

将上式(8)代入到式(2),消去 ρ ∗ L \rho^{*L} ρL,可得
ρ 1 ( u 1 − Z 1 ) ( u 1 − u ∗ ) = p ∗ − p 1 ( 9 ) \rho_1 (u_1-Z_1) (u_1-u^*) = p^* - p_1 \quad (9) ρ1(u1Z1)(u1u)=pp1(9)

将式(8)代入式(3),消去 ρ ∗ L \rho^{*L} ρL,并将能量 E 1 E_1 E1 E ∗ L E^{*L} EL用压力、密度和速度来表示,可得
( p 1 γ − 1 + ρ 1 u 1 2 2 ) ( u 1 − Z 1 ) + u 1 p 1 = p ∗ γ − 1 ( u ∗ − Z 1 ) + ρ 1 ( u ∗ ) 2 2 ( u 1 − Z 1 ) + u ∗ p ∗ \displaystyle \left( \frac{p_1}{\gamma - 1}+\rho_1\frac{u_1^2}{2}\right) (u_1-Z_1)+u_1p_1=\frac{p^*}{\gamma - 1}(u^*-Z_1)+\rho_1\frac{(u^*)^2}{2}(u_1-Z_1) +u^*p^* (γ1p1+ρ12u12)(u1Z1)+u1p1=γ1p(uZ1)+ρ12(u)2(u1Z1)+up


[ p 1 γ − 1 + ρ 1 u 1 2 − ( u ∗ ) 2 2 ] ( u 1 − Z 1 ) = p ∗ γ − 1 ( u ∗ − Z 1 ) + u ∗ p ∗ − u 1 p 1 ( 10 ) \displaystyle \left[ \frac{p_1}{\gamma - 1}+\rho_1\frac{u_1^2-(u^*)^2}{2}\right] (u_1-Z_1)=\frac{p^*}{\gamma - 1}(u^*-Z_1) +u^*p^*-u_1p_1 \quad (10) [γ1p1+ρ12u12(u)2](u1Z1)=γ1p(uZ1)+upu1p1(10)

相当于把原本的式(2)和式(3)消去了 ρ ∗ L \rho^{*L} ρL,转化为了式(9)和式(10),接下来想办法从式(9)和式(10)中消去 Z 1 Z_1 Z1,由式(9)可得
Z 1 = u 1 − p ∗ − p 1 ρ 1 ( u 1 − u ∗ ) ( 11 ) Z_1 = u_1-\frac{p^* - p_1}{\rho_1(u_1-u^*)} \quad (11) Z1=u1ρ1(u1u)pp1(11)

将上式代入到式(10)中,得到
[ p 1 γ − 1 + ρ 1 u 1 2 − ( u ∗ ) 2 2 ] p ∗ − p 1 ρ 1 ( u 1 − u ∗ ) = p ∗ γ − 1 [ u ∗ − u 1 + p ∗ − p 1 ρ 1 ( u 1 − u ∗ ) ] + u ∗ p ∗ − u 1 p 1 \displaystyle \left[ \frac{p_1}{\gamma - 1}+\rho_1\frac{u_1^2-(u^*)^2}{2}\right] \frac{p^* - p_1}{\rho_1(u_1-u^*)}=\frac{p^*}{\gamma - 1} \left[u^*-u_1+\frac{p^* - p_1}{\rho_1(u_1-u^*)}\right] +u^*p^*-u_1p_1 [γ1p1+ρ12u12(u)2]ρ1(u1u)pp1=γ1p[uu1+ρ1(u1u)pp1]+upu1p1


p 1 − p ∗ γ − 1 p ∗ − p 1 ρ 1 ( u 1 − u ∗ ) + 1 2 ( p ∗ − p 1 ) ( u 1 + u ∗ ) = γ p ∗ γ − 1 ( u ∗ − u 1 ) + u 1 ( p ∗ − p 1 ) \displaystyle \frac{p_1-p^*}{\gamma - 1}\frac{p^* - p_1}{\rho_1(u_1-u^*)} +\frac{1}{2}(p^* - p_1)(u_1+u^*)=\frac{\gamma p^*}{\gamma - 1} (u^*-u_1) +u_1(p^*-p_1) γ1p1pρ1(u1u)pp1+21(pp1)(u1+u)=γ1γp(uu1)+u1(pp1)


( p 1 − p ∗ ) 2 ρ 1 ( γ − 1 ) ( u ∗ − u 1 ) + 1 2 ( p ∗ − p 1 ) ( u ∗ − u 1 ) = γ p ∗ γ − 1 ( u ∗ − u 1 ) \displaystyle \frac{(p_1-p^*)^2}{\rho_1(\gamma - 1)(u^*-u_1)} +\frac{1}{2}(p^* - p_1)(u^*-u_1)=\frac{\gamma p^*}{\gamma - 1} (u^*-u_1) ρ1(γ1)(uu1)(p1p)2+21(pp1)(uu1)=γ1γp(uu1)


( p 1 − p ∗ ) 2 ρ 1 ( γ − 1 ) ( u ∗ − u 1 ) = ( γ + 1 ) p ∗ + ( γ − 1 ) p 1 2 ( γ − 1 ) ( u ∗ − u 1 ) \displaystyle \frac{(p_1-p^*)^2}{\rho_1(\gamma - 1)(u^*-u_1)}=\frac{(\gamma+1)p^*+(\gamma-1)p_1}{2(\gamma-1)} (u^*-u_1) ρ1(γ1)(uu1)(p1p)2=2(γ1)(γ+1)p+(γ1)p1(uu1)


2 ( p 1 − p ∗ ) 2 ( γ + 1 ) p ∗ + ( γ − 1 ) p 1 = ρ 1 ( u ∗ − u 1 ) 2 \displaystyle \frac{2(p_1-p^*)^2}{(\gamma+1)p^*+(\gamma-1)p_1}=\rho_1(u^*-u_1)^2 (γ+1)p+(γ1)p12(p1p)2=ρ1(uu1)2


∣ u ∗ − u 1 ∣ = ∣ p 1 − p ∗ ∣ 2 ρ 1 [ ( γ + 1 ) p ∗ + ( γ − 1 ) p 1 ] | u^*-u_1 | =|p_1-p^*| \sqrt{\frac{2}{\rho_1[(\gamma+1)p^*+(\gamma-1)p_1]}} uu1=p1pρ1[(γ+1)p+(γ1)p1]2

这时候需要考虑 p 1 − p ∗ p_1-p^* p1p u ∗ − u 1 u^*-u_1 uu1的正负问题,由于是左行激波,激波运动速度 Z 1 < 0 Z_1<0 Z1<0,那么根据式(11)有
Z 1 = u 1 − p ∗ − p 1 ρ 1 ( u 1 − u ∗ ) < 0 Z_1 = u_1-\frac{p^* - p_1}{\rho_1(u_1-u^*)}<0 Z1=u1ρ1(u1u)pp1<0


u 1 < p ∗ − p 1 ρ 1 ( u 1 − u ∗ ) u_1<\frac{p^* - p_1}{\rho_1(u_1-u^*)} u1<ρ1(u1u)pp1

毫无疑问,密度必须是正值 ρ 1 > 0 \rho_1>0 ρ1>0,而激波后部压力要大于前面,即有 p ∗ > p 1 p^*>p_1 p>p1
u 1 ≥ 0 u_1\ge0 u10,则 p ∗ − p 1 p^* - p_1 pp1 u 1 − u ∗ u_1-u^* u1u同号,才能保证 R H S ≥ 0 RHS\ge0 RHS0
u 1 < 0 u_1<0 u1<0,则 p ∗ − p 1 p^* - p_1 pp1 u 1 − u ∗ u_1-u^* u1u同号时,能保证 R H S > 0 > u 1 RHS>0>u_1 RHS>0>u1,而 p ∗ − p 1 p^* - p_1 pp1 u 1 − u ∗ u_1-u^* u1u异号时,应该不会出现这种情况,具体怎么个分析解释,我暂时也没弄明白,汗颜……。
不论如何,这里经过分析,可以得到,左行激波的 p ∗ > p 1 p^*>p_1 p>p1,而 u 1 > u ∗ u_1>u^* u1>u

故可推得 u ∗ u^* u p ∗ p^* p的关系式
u ∗ = u 1 + ( p 1 − p ∗ ) 2 ρ 1 [ ( γ + 1 ) p ∗ + ( γ − 1 ) p 1 ] \displaystyle u^* = u_1 + (p_1-p^*)\sqrt{\frac{2}{\rho_1[(\gamma+1)p^*+(\gamma-1)p_1]}} u=u1+(p1p)ρ1[(γ+1)p+(γ1)p1]2

一般写成如下形式:
u ∗ = u 1 − p ∗ − p 1 ρ 1 c 1 γ + 1 2 γ p ∗ p 1 + γ − 1 2 γ = u 1 − f ( p ∗ , p 1 , ρ 1 ) ( 12 ) \displaystyle u^* = u_1 - \frac{p^*-p_1}{\rho_1 c_1 \sqrt{\displaystyle \frac{\gamma+1}{2\gamma}\frac{p^*}{p_1}+\frac{\gamma-1}{2\gamma}}}=u_1-f(p^*,p_1,\rho_1) \quad (12) u=u1ρ1c12γγ+1p1p+2γγ1 pp1=u1f(p,p1,ρ1)(12)

其中声速 c 1 = γ p 1 / ρ 1 c_1=\sqrt{\gamma p_1 / \rho_1} c1=γp1/ρ1

采用同样的方法,也可以从2-4区的关系式(4)-(6)推出 u ∗ u^* u p ∗ p^* p u 2 u_2 u2 ρ 2 \rho_2 ρ2 p 2 p_2 p2的关系式,注意,由于是右行激波,分析后发现 p ∗ > p 2 p^*>p_2 p>p2,而 u 2 < u ∗ u_2<u^* u2<u,所以式子里面是加号:
u ∗ = u 2 + p ∗ − p 2 ρ 2 c 2 γ + 1 2 γ p ∗ p 2 + γ − 1 2 γ = u 2 + f ( p ∗ , p 2 , ρ 2 ) ( 13 ) \displaystyle u^* = u_2 + \frac{p^*-p_2}{\rho_2 c_2 \sqrt{\displaystyle \frac{\gamma+1}{2\gamma}\frac{p^*}{p_2}+\frac{\gamma-1}{2\gamma}}}=u_2+f(p^*,p_2,\rho_2) \quad (13) u=u2+ρ2c22γγ+1p2p+2γγ1 pp2=u2+f(p,p2,ρ2)(13)

其中声速 c 2 = γ p 2 / ρ 2 c_2=\sqrt{\gamma p_2 / \rho_2} c2=γp2/ρ2
综合考虑式(12)和式(13),他俩的右端项是相等的,可以消去 u ∗ u^* u,得到关于 p ∗ p^* p的方程,如下:
u 1 − u 2 = f ( p ∗ , p 1 , ρ 1 ) + f ( p ∗ , p 2 , ρ 2 ) ≡ F ( p ∗ ) ( 14 ) u_1 - u_2 =f(p^*,p_1,\rho_1) + f(p^*,p_2,\rho_2) \equiv F(p^*) \quad (14) u1u2=f(p,p1,ρ1)+f(p,p2,ρ2)F(p)(14)

上式中仅含一个未知量 p ∗ p^* p,所以可解,然而方程本身非线性,所以没有解析形式的解,好在 F ( p ∗ ) F(p^*) F(p)函数自身具有很好的单调性,为单调增函数,所以对于给定的 p 1 p_1 p1 p 2 p_2 p2 u 1 u_1 u1 u 2 u_2 u2 ρ 1 \rho_1 ρ1 ρ 2 \rho_2 ρ2,可以很方便地用二分法或Newton法来获得数值解 p ∗ p^* p

算得 p ∗ p^* p之后,可以先用式(12)或式(13)来算出 u ∗ u^* u,再由式(11)来算出 Z 1 Z_1 Z1 Z 2 Z_2 Z2的算法是一样的),最后用式(8)算出 ρ ∗ L \rho^{*L} ρL ρ ∗ R \rho^{*R} ρR的算法是一样的)。

至此,已经获取了情况1的全部6个未知量,即 Z 1 Z_1 Z1 Z 2 Z_2 Z2 u ∗ u^* u p ∗ p^* p ρ ∗ L \rho^{*L} ρL ρ ∗ R \rho^{*R} ρR

2.2 情况2,左膨胀波,右激波,中间接触间断

( u 1 , p 1 , ρ 1 ) = ( 0 , 1 , 1 ) , ( u 2 , p 2 , ρ 2 ) = ( 0 , 0.1 , 0.125 ) (u_1,p_1,\rho_1)=(0,1,1),(u_2,p_2,\rho_2)=(0,0.1,0.125) (u1,p1,ρ1)=(0,1,1),(u2,p2,ρ2)=(0,0.1,0.125)的初始状态,在t=0.14s的参数如下,这属于情况2。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

咱们先计算(3)和(4)两区的值,再计算膨胀波内部(5)区的值。

2-4两区仍然满足R-H关系,与情况1完全一样:
{ ρ 2 ( u 2 − Z 2 ) = ρ ∗ R ( u ∗ − Z 2 ) ( 15 ) ρ 2 u 2 ( u 2 − Z 2 ) + p 2 = ρ ∗ R u ∗ ( u ∗ − Z 2 ) + p ∗ ( 16 ) ρ 2 E 2 ( u 2 − Z 2 ) + u 2 p 2 = ρ ∗ R E ∗ R ( u ∗ − Z 2 ) + u ∗ p ∗ ( 17 ) \begin{cases} \displaystyle \rho_2(u_2-Z_2)=\rho^{*R}(u^*-Z_2) & (15)\\ \displaystyle \rho_2 u_2 (u_2-Z_2) + p_2=\rho^{*R} u^* (u^*-Z_2) + p^* & (16)\\ \displaystyle \rho_2 E_2 (u_2-Z_2) + u_2 p_2=\rho^{*R} E^{*R} (u^*-Z_2) + u^* p^* & (17) \end{cases} ρ2(u2Z2)=ρR(uZ2)ρ2u2(u2Z2)+p2=ρRu(uZ2)+pρ2E2(u2Z2)+u2p2=ρRER(uZ2)+up(15)(16)(17)

1-3两区,首先要满足等熵关系,其次要满足Riemann不变量的相等,即
{ p ∗ ( ρ ∗ L ) γ = p 1 ( ρ 1 ) γ ( 18 ) u 1 + 2 c 1 γ − 1 = u ∗ + 2 c L γ − 1 ( 19 ) \begin{cases} \displaystyle \frac{p^*}{(\rho^{*L})^\gamma}=\frac{p_1}{(\rho_1)^\gamma} & (18) \\ \\ \displaystyle u_1+\frac{2c_1}{\gamma-1}=u^*+\frac{2c^L}{\gamma-1} & (19) \end{cases} (ρL)γp=(ρ1)γp1u1+γ12c1=u+γ12cL(18)(19)

其中 c 1 = γ p 1 / ρ 1 c_1=\sqrt{\gamma p_1/\rho_1} c1=γp1/ρ1 c L = γ p ∗ / ρ ∗ L c^L=\sqrt{\gamma p^* / \rho^{*L}} cL=γp/ρL

关于Riemann不变量,实际上是由1维Euler方程做特征分析所推导出来的,即有两个特征线 d x / d t = u + c dx/dt=u+c dx/dt=u+c d x / d t = u − c dx/dt=u-c dx/dt=uc,在这俩特征线上Riemann量 R 1 R_1 R1 R 2 R_2 R2保持不变,即
{ R 1 = u + 2 c γ − 1 = c o n s t a t d x d t = u + c R 2 = u − 2 c γ − 1 = c o n s t a t d x d t = u − c \begin{cases} \displaystyle R_1=u+\frac{2c}{\gamma-1}=const & & & & at \quad \displaystyle \frac{dx}{dt}=u+c \\ \\ \displaystyle R_2=u-\frac{2c}{\gamma-1}=const & & & & at \quad \displaystyle \frac{dx}{dt}=u-c \end{cases} R1=u+γ12c=constR2=uγ12c=constatdtdx=u+catdtdx=uc

在这里插入图片描述

对于情况1而言,这里蓝色是特征线1,向右传播,红色是特征线2,向左传播。那么,在蓝线上(显然在时空图上,它可以从1区穿过5区穿过3区),都有 R 1 为 常 数 R_1为常数 R1,故而,有式(19)存在。

式(15)-(19)共5个方程,5个未知数 Z 2 Z_2 Z2 u ∗ u^* u p ∗ p^* p ρ ∗ L \rho^{*L} ρL ρ ∗ R \rho^{*R} ρR,比情况1少了个 Z 1 Z_1 Z1,可解。

由式(18)(19)可以推导出, u ∗ u^* u p ∗ p^* p的关系:
u ∗ = u 1 − 2 c 1 γ − 1 [ ( p ∗ p 1 ) γ − 1 2 γ − 1 ] = u 1 − f ( p ∗ , p 1 , ρ 1 ) ( 20 ) u^*=u_1-\frac{2c_1}{\gamma-1}\left[\left(\frac{p^*}{p_1}\right)^{\frac{\gamma-1}{2\gamma}}-1\right] =u_1-f(p^*,p_1,\rho_1) \quad (20) u=u1γ12c1[(p1p)2γγ11]=u1f(p,p1,ρ1)(20)

与情况1一样的,从2-4两区关系式中可以推出 u ∗ u^* u p ∗ p^* p的关系式(13),将其与上式结合起来,便可消去 u ∗ u^* u,得到仅包含未知量 p ∗ p^* p的方程,同样可以采用数值方法来求出 p ∗ p^* p

为方便计,可以将激波和膨胀波的速度压力关系写成统一的表达形式:

左波(激波或膨胀波) u ∗ = u 1 − f ( p ∗ , p 1 , ρ 1 ) u^*=u_1-f(p^*,p_1,\rho_1) u=u1f(p,p1,ρ1)

右波(激波或膨胀波) u ∗ = u 2 + f ( p ∗ , p 2 , ρ 2 ) u^*=u_2+f(p^*,p_2,\rho_2) u=u2+f(p,p2,ρ2)

其中,函数 f ( p ∗ , p i , ρ i ) f(p^*,p_i,\rho_i) f(p,pi,ρi)为:
f ( p ∗ , p i , ρ i ) = { p ∗ − p i ρ i c i γ + 1 2 γ p ∗ p i + γ − 1 2 γ p ∗ > p i 激 波 2 c i γ − 1 [ ( p ∗ p i ) γ − 1 2 γ − 1 ] p ∗ < p i 膨 胀 波 f(p^*,p_i,\rho_i)=\begin{cases} \displaystyle \frac{p^*-p_i}{\rho_i c_i \sqrt{\displaystyle \frac{\gamma+1}{2\gamma}\frac{p^*}{p_i}+\frac{\gamma-1}{2\gamma}}} & & &p^*>p_i & 激波 \\ \\ \displaystyle \frac{2c_i}{\gamma-1}\left[\left(\frac{p^*}{p_i}\right)^{\frac{\gamma-1}{2\gamma}}-1\right] & & & p^*<p_i & 膨胀波 \end{cases} f(p,pi,ρi)=ρici2γγ+1pip+2γγ1 ppiγ12ci[(pip)2γγ11]p>pip<pi
得到关于压力 p ∗ p^* p的方程
u 1 − u 2 = f ( p ∗ , p 1 , ρ 1 ) + f ( p ∗ , p 2 , ρ 2 ) ≡ F ( p ∗ ) u_1 - u_2 =f(p^*,p_1,\rho_1) + f(p^*,p_2,\rho_2) \equiv F(p^*) u1u2=f(p,p1,ρ1)+f(p,p2,ρ2)F(p)

采用数值方法求解即可得出 p ∗ p^* p,然后可以算得 u ∗ u^* u,跟情况1一样,再由式(11)来算出 Z 2 Z_2 Z2(下标1替换为2即可),最后用式(8)算出 ρ ∗ R \rho^{*R} ρR(下标1替换为2即可),而 ρ ∗ L \rho^{*L} ρL的计算可以通过式(18)求出:
ρ ∗ L = ρ 1 ( p ∗ p 1 ) 1 γ \displaystyle \rho^{*L}=\rho_1 \left(\frac{p^*}{p_1}\right)^{\frac{1}{\gamma}} ρL=ρ1(p1p)γ1

至此,5个未知数 Z 2 Z_2 Z2 u ∗ u^* u p ∗ p^* p ρ ∗ L \rho^{*L} ρL ρ ∗ R \rho^{*R} ρR都求出来了,接下来求膨胀波内部的物理量。

在这里插入图片描述

先看膨胀波的边界范围,膨胀波向左传播,所以波头的传播速度为 Z 1 h e a d = u 1 − c 1 Z_{1head}=u_1-c_1 Z1head=u1c1,波尾的传播速度为 Z 1 t a i l = u ∗ − c ∗ L Z_{1tail}=u^*-c^{*L} Z1tail=ucL,那么在t时刻,波头位于 x = ( u 1 − c 1 ) t x=(u_1-c_1)t x=(u1c1)t,波尾位于 x = ( u ∗ − c ∗ L ) t x=(u^*-c^{*L})t x=(ucL)t位置。

在这里插入图片描述

膨胀波内部的物理量,利用特征相容关系计算,红线为从 x = 0 x=0 x=0处发出的左行特征线 d x / d t = u − c dx/dt=u-c dx/dt=uc,故其位置在t时刻为:
x / t = u − c x/t=u-c x/t=uc

而该位置也可由另外一条特征线蓝线在0时刻的位置上右行而来,即特征线 d x / d t = u + c dx/dt=u+c dx/dt=u+c,其上物理量满足 R 2 R_2 R2不变量,即:
u 1 + 2 c 1 γ − 1 = u + 2 c γ − 1 \displaystyle u_1+\frac{2c_1}{\gamma-1}=u+\frac{2c}{\gamma-1} u1+γ12c1=u+γ12c

联立这俩式子,可以求出 u u u c c c来,即
{ c ( x , t ) = γ − 1 γ + 1 ( u 1 − x t ) + 2 c 1 γ + 1 ( 21 ) u ( x , t ) = c + x / t ( 22 ) \begin{cases} \displaystyle c(x,t)=\frac{\gamma-1}{\gamma+1}\left(u_1-\frac{x}{t}\right)+\frac{2c_1}{\gamma+1}& (21) \\ \displaystyle u(x,t)=c+x/t & (22) \end{cases} c(x,t)=γ+1γ1(u1tx)+γ+12c1u(x,t)=c+x/t(21)(22)

而膨胀波内部的压力和密度,则可由等熵关系来计算:
p = p 1 ( c / c 1 ) 2 γ γ − 1 , ρ = γ p / c 2 p=p_1(c/c_1)^\frac{2\gamma}{\gamma-1},\quad \rho=\gamma p /c^2 p=p1(c/c1)γ12γ,ρ=γp/c2

至此,膨胀波内部的物理量是位置 x x x和时间 t t t的函数,且均可算出,情况2分析完毕。

2.3 右膨胀波的处理

其余情况与此类似,只是在处理右膨胀波时稍有差异,对于右膨胀波而言,1-3两区,满足Riemann不变量 R 2 R_2 R2(红色特征线上 d x / d t = u − c dx/dt=u-c dx/dt=uc)的相等,即
{ p ∗ ( ρ ∗ R ) γ = p 2 ( ρ 2 ) γ u 2 − 2 c 2 γ − 1 = u ∗ − 2 c R γ − 1 \begin{cases} \displaystyle \frac{p^*}{(\rho^{*R})^\gamma}=\frac{p_2}{(\rho_2)^\gamma} & \\ \\ \displaystyle u_2-\frac{2c_2}{\gamma-1}=u^*-\frac{2c^R}{\gamma-1} & \end{cases} (ρR)γp=(ρ2)γp2u2γ12c2=uγ12cR

所以,推出来的速度和压力关系式为 u ∗ = u 2 + f ( p ∗ , p 2 , ρ 2 ) u^*=u_2+f(p^*,p_2,\rho_2) u=u2+f(p,p2,ρ2),与之前是一样的,即左波是 − f -f f,右波是 + f +f +f,形式仍旧是统一的。其求解 u ∗ u^* u p ∗ p^* p ρ ∗ R \rho^{*R} ρR的方法和前面也是一样的。

只是在膨胀波的求解时,略有不同。

首先右膨胀波向右传播,所以波头的传播速度为 Z 2 h e a d = u 2 + c 2 Z_{2head}=u_2+c_2 Z2head=u2+c2,波尾的传播速度为 Z 2 t a i l = u ∗ + c ∗ R Z_{2tail}=u^*+c^{*R} Z2tail=u+cR,那么在t时刻,波头位于 x = ( u 2 + c 2 ) t x=(u_2+c_2)t x=(u2+c2)t,波尾位于 x = ( u ∗ + c ∗ R ) t x=(u^*+c^{*R})t x=(u+cR)t位置。

然后就是膨胀波内部物理量的计算,此时刚好与左膨胀波相反,利用特征相容关系计算时,右膨胀波为从 x = 0 x=0 x=0处发出的右行特征线 d x / d t = u + c dx/dt=u+c dx/dt=u+c,故其位置在t时刻为:
x / t = u + c x/t=u+c x/t=u+c

而该位置也可由另外一条特征线在0时刻的位置上左行而来,即特征线 d x / d t = u − c dx/dt=u-c dx/dt=uc,其上物理量满足 R 2 R_2 R2不变量,阶:
u 2 − 2 c 2 γ − 1 = u − 2 c γ − 1 \displaystyle u_2-\frac{2c_2}{\gamma-1}=u-\frac{2c}{\gamma-1} u2γ12c2=uγ12c

联立这俩式子,可以求出 u u u c c c来,即,注意这里的式子和左膨胀波在正负号上略有区分
{ c ( x , t ) = − γ − 1 γ + 1 ( u 2 − x t ) + 2 c 2 γ − 1 u ( x , t ) = − c + x / t \begin{cases} \displaystyle c(x,t)=-\frac{\gamma-1}{\gamma+1}\left(u_2-\frac{x}{t}\right)+\frac{2c_2}{\gamma-1} \\ \displaystyle u(x,t)=-c+x/t \end{cases} c(x,t)=γ+1γ1(u2tx)+γ12c2u(x,t)=c+x/t

而膨胀波内部的密度与压力的计算,还是用等熵关系,和左膨胀波时一样的,不再赘述。

3 Riemann问题的具体求解步骤

为便于程序实现,将Riemann问题的上述求解思路的具体步骤汇总如下

已知量为 u 1 u_1 u1 ρ 1 \rho_1 ρ1 p 1 p_1 p1 u 2 u_2 u2 ρ 2 \rho_2 ρ2 p 2 p_2 p2,以及时刻 t t t

  1. 判断可能出现的情况(五种情况之一)
    1.1. 定义函数
    f ( p ∗ , p 1 , ρ 1 ) + f ( p ∗ , p 2 , ρ 2 ) ≡ F ( p ∗ ) f(p^*,p_1,\rho_1) + f(p^*,p_2,\rho_2) \equiv F(p^*) f(p,p1,ρ1)+f(p,p2,ρ2)F(p)
    其中,函数 f ( p ∗ , p i , ρ i ) f(p^*,p_i,\rho_i) f(p,pi,ρi)为:
    f ( p ∗ , p i , ρ i ) = { p ∗ − p i ρ i c i γ + 1 2 γ p ∗ p i + γ − 1 2 γ p ∗ > p i 激 波 2 c i γ − 1 [ ( p ∗ p i ) γ − 1 2 γ − 1 ] p ∗ < p i 膨 胀 波 f(p^*,p_i,\rho_i)=\begin{cases} \displaystyle \frac{p^*-p_i}{\rho_i c_i \sqrt{\displaystyle \frac{\gamma+1}{2\gamma}\frac{p^*}{p_i}+\frac{\gamma-1}{2\gamma}}} & & &p^*>p_i & 激波 \\ \\ \displaystyle \frac{2c_i}{\gamma-1}\left[\left(\frac{p^*}{p_i}\right)^{\frac{\gamma-1}{2\gamma}}-1\right] & & & p^*<p_i & 膨胀波 \end{cases} f(p,pi,ρi)=ρici2γγ+1pip+2γγ1 ppiγ12ci[(pip)2γγ11]p>pip<pi
    1.2. 判断属于哪种情况
    计算出 F ( 0 ) F(0) F(0) F ( p 1 ) F(p_1) F(p1) F ( p 2 ) F(p_2) F(p2),根据 u 1 − u 2 u_1-u_2 u1u2的大小进行情况判断属于哪种类型。

在这里插入图片描述
在这里插入图片描述

  1. 求解中心区域的压力和速度
    采用二分法或Newton法求解方程,获取压力 p ∗ p^* p
    u 1 − u 2 = F ( p ∗ ) = f ( p ∗ , p 1 , ρ 1 ) + f ( p ∗ , p 2 , ρ 2 ) u_1 - u_2 = F(p^*) = f(p^*,p_1,\rho_1) + f(p^*,p_2,\rho_2) u1u2=F(p)=f(p,p1,ρ1)+f(p,p2,ρ2)
    再由下式算出速度 u ∗ u^* u
    u ∗ = 1 2 [ u 1 + u 2 − f ( p ∗ , p 1 , ρ 1 ) + f ( p ∗ , p 2 , ρ 2 ) ] u^*=\frac{1}{2}[u_1 + u_2 - f(p^*,p_1,\rho_1) + f(p^*,p_2,\rho_2)] u=21[u1+u2f(p,p1,ρ1)+f(p,p2,ρ2)]

  2. 求解中心区域接触间断两侧密度及左右波的传播速度
    3.1. 左波为激波的情况(情况1和3)
    左激波运动速度 Z 1 Z_1 Z1
    Z 1 = u 1 − p ∗ − p 1 ρ 1 ( u 1 − u ∗ ) Z_1 = u_1-\frac{p^* - p_1}{\rho_1(u_1-u^*)} Z1=u1ρ1(u1u)pp1
    中心区域左侧密度 ρ ∗ L \rho^{*L} ρL
    ρ ∗ L = ρ 1 ( u 1 − Z 1 ) ( u ∗ − Z 1 ) \displaystyle \rho^{*L} = \frac{\rho_1(u_1-Z_1)}{(u^*-Z_1)} ρL=(uZ1)ρ1(u1Z1)
    3.2. 左波为膨胀波的情况(情况2,4,5)
    波头速度 Z 1 h e a d Z_{1head} Z1head和波尾速度 Z 1 t a i l Z_{1tail} Z1tail
    Z 1 h e a d = u 1 − c 1 , Z 1 t a i l = u ∗ − c ∗ L Z_{1head}=u_1-c_1, \quad Z_{1tail}=u^*-c^{*L} Z1head=u1c1,Z1tail=ucL
    注意对于情况5,其内部为真空,无法计算声速 c ∗ L c^{*L} cL,其膨胀波的波尾速度为(这个不是很确定~)
    Z 1 t a i l _ c a s e 5 = u 1 − 2 c 1 γ − 1 Z_{1tail\_case5}=u_1-\frac{2c_1}{\gamma-1} Z1tail_case5=u1γ12c1
    膨胀波内物理量的计算( Z 1 h e a d t < x < Z 1 t a i l t Z_{1head}t<x<Z_{1tail}t Z1headt<x<Z1tailt
    { c ( x , t ) = γ − 1 γ + 1 ( u 1 − x t ) + 2 c 1 γ − 1 u ( x , t ) = c + x / t \begin{cases} \displaystyle c(x,t)=\frac{\gamma-1}{\gamma+1}\left(u_1-\frac{x}{t}\right)+\frac{2c_1}{\gamma-1} \\ \displaystyle u(x,t)=c+x/t \end{cases} c(x,t)=γ+1γ1(u1tx)+γ12c1u(x,t)=c+x/t
    而膨胀波内部的压力和密度,则可由等熵关系来计算:
    p = p 1 ( c / c 1 ) 2 γ γ − 1 , ρ = γ p / c 2 p=p_1(c/c_1)^\frac{2\gamma}{\gamma-1},\quad \rho=\gamma p /c^2 p=p1(c/c1)γ12γ,ρ=γp/c2
    3.3. 右波为激波的情况(情况1,2)
    右激波运动速度 Z 2 Z_2 Z2
    Z 2 = u 2 − p ∗ − p 2 ρ 2 ( u 2 − u ∗ ) Z_2 = u_2-\frac{p^* - p_2}{\rho_2(u_2-u^*)} Z2=u2ρ2(u2u)pp2
    中心区域左侧密度 ρ ∗ R \rho^{*R} ρR
    ρ ∗ R = ρ 2 ( u 2 − Z 2 ) ( u ∗ − Z 2 ) \displaystyle \rho^{*R} = \frac{\rho_2(u_2-Z_2)}{(u^*-Z_2)} ρR=(uZ2)ρ2(u2Z2)
    3.4. 右波为膨胀波的情况(情况3,4,5)
    波头速度 Z 2 h e a d Z_{2head} Z2head和波尾速度 Z 2 t a i l Z_{2tail} Z2tail
    Z 2 h e a d = u 2 + c 2 , Z 2 t a i l = u ∗ + c ∗ R Z_{2head}=u_2+c_2, \quad Z_{2tail}=u^*+c^{*R} Z2head=u2+c2,Z2tail=u+cR
    注意对于情况5,其内部为真空,无法计算声速 c ∗ R c^{*R} cR,其膨胀波的波尾速度为(这个不是很确定~)
    Z 2 t a i l _ c a s e 5 = u 2 + 2 c 2 γ − 1 Z_{2tail\_case5}=u_2+\frac{2c_2}{\gamma-1} Z2tail_case5=u2+γ12c2
    膨胀波内物理量的计算( Z 2 t a i l t < x < Z 2 h e a d t Z_{2tail}t<x<Z_{2head}t Z2tailt<x<Z2headt
    { c ( x , t ) = − γ − 1 γ + 1 ( u 2 − x t ) + 2 c 2 γ − 1 u ( x , t ) = − c + x / t \begin{cases} \displaystyle c(x,t)=-\frac{\gamma-1}{\gamma+1}\left(u_2-\frac{x}{t}\right)+\frac{2c_2}{\gamma-1} \\ \displaystyle u(x,t)=-c+x/t \end{cases} c(x,t)=γ+1γ1(u2tx)+γ12c2u(x,t)=c+x/t
    而膨胀波内部的压力和密度,则可由等熵关系来计算:
    p = p 2 ( c / c 2 ) 2 γ γ − 1 , ρ = γ p / c 2 p=p_2(c/c_2)^\frac{2\gamma}{\gamma-1},\quad \rho=\gamma p /c^2 p=p2(c/c2)γ12γ,ρ=γp/c2

  3. 生成数据,绘制图形,展示结果。

4 程序实现

程序采用matlab编写,较好实现和理解。
f ( p ∗ , p i , ρ i ) f(p^*,p_i,\rho_i) f(p,pi,ρi)函数

function [ f ] = P01_fPsPiRi( Ps, Pi, Ri )
%P01_FPSP1R1 f(Ps, Pi, Rhoi)函数
%   激波(膨胀波)一侧已知P和Rho,另一侧Ps,求取f的函数

gamma = 1.4;    % 理想气体比热比
Ci = sqrt(gamma * Pi / Ri); % 声速

if (Ps > Pi)
    f = (Ps - Pi) / (Ri * Ci) / ...
        sqrt((gamma + 1) / (2 * gamma) * (Ps / Pi) + ...
        (gamma - 1) / (2 * gamma));
end
if (Ps < Pi)
    f = 2 * Ci / (gamma - 1) * ...
        ((Ps / Pi) ^ ((gamma - 1) / (2 * gamma)) - 1);
end
if (Ps == Pi)
    f = 0;
end

end

判断情况的函数

function [ idxCase ] = P02_judgeCase( Fp0, Fp1, Fp2, U1, U2, P1, P2 )
%P02_JUDGECASE 判断属于哪种情况,依据F(0), F(p1), F(p2), 根据u2 - u1大小来判断
%   此处显示详细说明

U1_U2 = U1 - U2;
idxCase = 0;    % 情况标致
% p2>=p1, U1-U2对应区间 
% --5--Fp0--4--Fp1--3--Fp2--1-- ->
if P2 >= P1
    if (U1_U2) >= Fp2
        idxCase = 1;
    elseif (U1_U2) >= Fp1 && (U1_U2) < Fp2
        idxCase = 3;
    elseif (U1_U2) >= Fp0 && (U1_U2) < Fp1
        idxCase = 4;
	elseif (U1_U2) < Fp0
        idxCase = 5;
    end
end
% p2<=p1, U1-U2对应区间 
% --5--Fp0--4--Fp2--2--Fp1--1-- ->
if P2 <= P1
    if (U1_U2) >= Fp1
        idxCase = 1;
    elseif (U1_U2) >= Fp2 && (U1_U2) < Fp1
        idxCase = 2;
    elseif (U1_U2) >= Fp0 && (U1_U2) < Fp2
        idxCase = 4;
    elseif (U1_U2) < Fp0
        idxCase = 5;
    end
end

二分法求解中间区域压力 p ∗ p^* p的函数,顺道把 u ∗ u^* u一并计算好了

function [ Ps, Us ] = P03_solvePs( U1, P1, R1, U2, P2, R2 )
%P03_SOLVEPS 求解中心区的压力和速度
% 解方程 u1 - u2 = F(p*) = f(p*, p1, rho1) + f(p*, p2, rho2)
%   此处显示详细说明

PSpn = [0, 1e10];   % 压力一定是正值的,给个足够大的范围吧,0-10000MPa

U1_U2 = U1 - U2;

for iter = 1: 1000
    Ps = mean(PSpn);
    Fps = P01_fPsPiRi(Ps, P1, R1) + P01_fPsPiRi(Ps, P2, R2);
    if U1_U2 == Fps
        return;
    end
    if U1_U2 > Fps
        PSpn = [Ps, PSpn(2)];
    else
        PSpn = [PSpn(1), Ps];
    end
    if PSpn(2) - PSpn(1) < 1e-10
        Ps = mean(PSpn);
        break;
    end
end

Us = 0.5 * (U1 + U2 + P01_fPsPiRi(Ps, P2, R2) - P01_fPsPiRi(Ps, P1, R1));

end

左激波情况下计算激波运行速度 Z 1 Z_1 Z1和中间区域左侧密度 ρ ∗ L \rho^{*L} ρL的函数

 function [ R1s, Z1 ] = P04_calcShockR1sZ1( P1, U1, R1, Ps, Us, gamma )
%P04_CALCRISZI 此处显示有关此函数的摘要
%   此处显示详细说明

Z1 = U1 - (Ps - P1) / (R1 * (U1 - Us));
R1s = R1 * (U1 - Z1) / (Us - Z1);

end

左膨胀波情况下计算波头波尾运行速度 Z 1 h e a d Z_{1head} Z1head Z 1 t a i l Z_{1tail} Z1tail,以及中间区域左侧密度 ρ ∗ L \rho^{*L} ρL的函数

 function [ R1s, Z1Head, Z1Tail ] = ...
 P05_calcExpanR1sZ1( P1, U1, R1, Ps, Us, gamma, idxCase )
%P05_CALCEXPANRISZI 此处显示有关此函数的摘要
%   此处显示详细说明

C1 = sqrt(gamma * P1 / R1);
Z1Head = U1 - C1;

if (idxCase ~= 5) 
    R1s = R1 * (Ps / P1) ^ (1 / gamma);
    C1s = sqrt(gamma * Ps / R1s);
    Z1Tail = Us - C1s;
end

% 对于情况5,中心区为真空,声速c1*无从计算,改由该式计算:
if (idxCase == 5)
    % 感觉好像不对……………………
    R1s = 0;    % 真空
    Z1Tail = U1 - 2 * C1 / (gamma - 1);   
end

end

右激波情况下计算激波运行速度 Z 2 Z_2 Z2和中间区域右侧密度 ρ ∗ R \rho^{*R} ρR的函数,这个函数实际上和左激波的完全一样,没必要单独写一个出来的

function [ R2s, Z2 ] = P06_calcShockR2sZ2( P2, U2, R2, Ps, Us )
%P04_CALCSHOCKR2SZ2 此处显示有关此函数的摘要
%   此处显示详细说明

Z2 = U2 - (Ps - P2) / (R2 * (U2 - Us));
R2s = R2 * (U2 - Z2) / (Us - Z2);

end

右膨胀波情况下计算波头波尾运行速度 Z 2 h e a d Z_{2head} Z2head Z 2 t a i l Z_{2tail} Z2tail,以及中间区域左侧密度 ρ ∗ R \rho^{*R} ρR的函数

function [ R2s, Z2Head, Z2Tail ] = ...
    P07_calcExpanR2sZ2( P2, U2, R2, Ps, Us, gamma, idxCase )
%P07_CALCEXPANR2SZ2 此处显示有关此函数的摘要
%   此处显示详细说明

C2 = sqrt(gamma * P2 / R2);
Z2Head = U2 + C2;

if (idxCase ~= 5)
    R2s = R2 * (Ps / P2) ^ (1 / gamma);
    C2s = sqrt(gamma * Ps / R2s);
    Z2Tail = Us + C2s;
end

% 对于情况5,中心区为真空,声速c2*无从计算,改由该式计算:
if (idxCase == 5)
    % 感觉不太对……………………
    R2s = 0;    % 真空
    Z2Tail = U2 + 2 * C2 / (gamma - 1);
end

end

左膨胀波内部状态值 u , p , ρ u,p,\rho u,p,ρ的计算函数,注意状态值是x和t的函数,所以直接用向量来存储了:

function [ xSpnLftExp, uSpnLftExp, pSpnLftExp, rSpnLftExp ] = ...
    P08_calcLftExpZone( Z1Head, Z1Tail, tNow, gamma, U1, C1, P1 )
%P08_CALCLFTEXPZONE 此处显示有关此函数的摘要
%   此处显示详细说明

xDwn = Z1Head * tNow;       xUp = Z1Tail * tNow;
xDlt = (xUp - xDwn) / 100;  xSpnLftExp = xDwn: xDlt: xUp;

cSpnLftExp = (gamma - 1) / (gamma + 1) * (U1 - xSpnLftExp / tNow) + ...
    2 / (gamma + 1) * C1;
uSpnLftExp = xSpnLftExp ./ tNow + cSpnLftExp;
pSpnLftExp = P1 .* (cSpnLftExp / C1) .^ (2 * gamma / (gamma - 1));
rSpnLftExp = gamma * pSpnLftExp ./ cSpnLftExp .^ 2;

end

右膨胀波内部状态值 u , p , ρ u,p,\rho u,p,ρ的计算函数:

function [ xSpnRgtExp, uSpnRgtExp, pSpnRgtExp, rSpnRgtExp ] = ...
    P09_calcRgtExpZone( Z2Tail, Z2Head, tNow, gamma, U2, C2, P2 )
%P09_CALCRGTEXPZONE 此处显示有关此函数的摘要
%   此处显示详细说明

xDwn = Z2Tail * tNow;       xUp = Z2Head * tNow;
xDlt = (xUp - xDwn) / 100;  xSpnRgtExp = xDwn: xDlt: xUp;

cSpnRgtExp = - (gamma - 1) / (gamma + 1) * (U2 - xSpnRgtExp / tNow) + ...
    2 / (gamma + 1) * C2; % 注意有个负号
uSpnRgtExp = xSpnRgtExp ./ tNow - cSpnRgtExp; % 注意是减号
pSpnRgtExp = P2 .* (cSpnRgtExp / C2) .^ (2 * gamma / (gamma - 1));
rSpnRgtExp = gamma * pSpnRgtExp ./ cSpnRgtExp .^ 2;

end

计算左侧区域范围的函数

function [ xSpnLftWavL, pSpnLftWavL, uSpnLftWavL, rSpnLftWavL ] = ...
    P11_calcLftWaveLftZone( Z1, P1, U1, R1, tNow )
%P11_CALCLFTWAVELFTZONE 此处显示有关此函数的摘要
%   此处显示详细说明

lftShockX = Z1 * tNow;  % 左激波位置(或左膨胀波波头位置)
xSpnLftWavL = [min(-1, floor(lftShockX * 2)), lftShockX];
pSpnLftWavL = [P1, P1];
uSpnLftWavL = [U1, U1];
rSpnLftWavL = [R1, R1];  

end

计算中间区域位于间断左侧范围的函数

function [  xSpnMidL, pSpnMidL, uSpnMidL, rSpnMidL  ] = ...
    P12_calcMidLftZone( Z1, Ps, Us, RsL, tNow )
%P12_CALCMIDLFTZONE 此处显示有关此函数的摘要
%   此处显示详细说明

lftShockX = Z1 * tNow;  % 左激波位置(或左膨胀波波尾位置)
midDisconX = Us * tNow; % 接触间断面位置

xSpnMidL = [lftShockX, midDisconX];
pSpnMidL = [Ps, Ps];
uSpnMidL = [Us, Us];
rSpnMidL = [RsL, RsL];  

end

计算中间区域位于间断右侧范围的函数

function [ xSpnMidR, pSpnMidR, uSpnMidR, rSpnMidR ] = ...
    P13_calcMidRgtZone( Z2, Ps, Us, RsR, tNow )
%P13_CALCMIDRGTZONE 此处显示有关此函数的摘要
%   此处显示详细说明

rgtShockX = Z2 * tNow;  % 右激波位置(或右膨胀波波尾位置)
midDisconX = Us * tNow; % 接触间断面位置

xSpnMidR = [midDisconX, rgtShockX];
pSpnMidR = [Ps, Ps];
uSpnMidR = [Us, Us];
rSpnMidR = [RsR, RsR];

end

计算右侧区域范围的函数

function [ xSpnRgtWavR, pSpnRgtWavR, uSpnRgtWavR, rSpnRgtWavR ] = ...
    P14_calcRgtWavRgtZone( Z2, P2, U2, R2, tNow )
%P14_CALCRGTWAVRGTZONE 此处显示有关此函数的摘要
%   此处显示详细说明

rgtShockX = Z2 * tNow;  % 右激波位置(或右膨胀波波头位置)
xSpnRgtWavR = [rgtShockX, max(1, ceil(rgtShockX * 2))];
pSpnRgtWavR = [P2, P2];
uSpnRgtWavR = [U2, U2];
rSpnRgtWavR = [R2, R2]; 

end

几个区域合并成一个的代码段

% 把这几个区域合并起来啊
xSpn = [xSpnLftWavL, xSpnLftExp, xSpnMidL, xSpnMidR, xSpnRgtExp, xSpnRgtWavR];
uSpn = [uSpnLftWavL, uSpnLftExp, uSpnMidL, uSpnMidR, uSpnRgtExp, uSpnRgtWavR];
pSpn = [pSpnLftWavL, pSpnLftExp, pSpnMidL, pSpnMidR, pSpnRgtExp, pSpnRgtWavR];
rSpn = [rSpnLftWavL, rSpnLftExp, rSpnMidL, rSpnMidR, rSpnRgtExp, rSpnRgtWavR];

绘图展示的代码段

% 绘制图形
figure(99);
plot(xSpn, pSpn, xSpn, uSpn, xSpn, rSpn, 'LineWidth', 2);
legend('p', 'u', 'rho');
xlabel('x');    ylabel('p, u, rho');
title('Riemann Problem Accurate Solution');

最后是主程序,即按照第3部分的求解流程逐个调用子函数来完成求解

% 2020-02-19
% 梅冠华
% 求解Riemann问题的精确解
% Riemann问题,也称Reimann间断解,激波管问题,Sod激波管问题等
% 
% 控制方程:1D Euler方程
% 初始状态,左侧u1, rho1, p1; 右侧u2, rho2, p2; 
% 抽开两侧隔板,依据不同初始状态,会有5种情况出现
% 情况1:左激波 + 接触间断 + 右激波
% 情况2:左膨胀波 + 接触间断 + 右激波
% 情况3:左激波 + 接触间断 + 右膨胀波
% 情况4:左膨胀波 + 接触间断 + 右膨胀波
% 情况5:左膨胀波 + 右膨胀波

%5种情况没弄明白,其它的都还OK了!

clear,clc;

tNow = 0.14;    % 要计算的时刻t1

gamma = 1.4;    % 理想气体比热比

% 初始状态t0
U1 = 0;     R1 = 1;         P1 = 1;     % x < 0
U2 = 0;     R2 = 0.125;     P2 = 0.1;   % x > 0

C1 = sqrt(gamma * P1 / R1);
C2 = sqrt(gamma * P2 / R2);

% 定义函数F(p*) = f(p*, p1, rho1) + f(p*, p2, rho2)
% 计算F(0), F(p1), F(p2);
Fp0 = P01_fPsPiRi(0, P1, R1) + P01_fPsPiRi(0, P2, R2);
Fp1 = P01_fPsPiRi(P1, P1, R1) + P01_fPsPiRi(P1, P2, R2);
Fp2 = P01_fPsPiRi(P2, P1, R1) + P01_fPsPiRi(P2, P2, R2);

% stp 1
% 判断属于哪种情况,依据F(0), F(p1), F(p2), 根据u2 - u1大小来判断
idxCase = P02_judgeCase( Fp0, Fp1, Fp2, U1, U2, P1, P2 );

% stp 2
% 求解中心区的压力和速度
% 先求压力 u1 - u2 = F(p*) = f(p*, p1, rho1) + f(p*, p2, rho2)
% 再求速度 u* = 0.5*(u1+u2+f(p*, p2, rho2) - f(p*, p1, rho1))
[Ps, Us] = P03_solvePs(U1, P1, R1, U2, P2, R2);

% stp 3
% 确定中心区接触间断两侧的密度R1*, R2*, 以及左右波的传播速度Z1和Z2
% 中心接触间断左侧的物理量a, b
% a. 左波为激波的情况(情况13if (idxCase == 1) || (idxCase == 3)
    [RLs, Z1] = P04_calcShockR1sZ1( P1, U1, R1, Ps, Us );
end
% b. 左波为膨胀波(稀疏波)的情况(情况2, 4, 5if (idxCase == 2) || (idxCase == 4) || (idxCase == 5)
    [ RLs, Z1Head, Z1Tail ] = P05_calcExpanR1sZ1...
        ( P1, U1, R1, Ps, Us, gamma, idxCase );
end
% 中心接触间断右侧的物理量c, d
% c. 右波为激波的情况(情况12if (idxCase == 1) || (idxCase == 2)
    [R2s, Z2] = P06_calcShockR2sZ2( P2, U2, R2, Ps, Us );
end
% d. 右波为膨胀波(稀疏波)的情况(情况3, 4, 5if (idxCase == 3) || (idxCase == 4) || (idxCase == 5)
    [ R2s, Z2Head, Z2Tail ] = P07_calcExpanR2sZ2...
        ( P2, U2, R2, Ps, Us, gamma, idxCase );
end

% stp 4
% 计算稀疏波区域的值(如果有的话)
% a. 左稀疏波(情况2, 4, 5% Z1Head*t <= x <= Z1Tail*t
if (idxCase == 2) || (idxCase == 4) || (idxCase == 5)
    [ xSpnLftExp, uSpnLftExp, pSpnLftExp, rSpnLftExp ] = ...
        P08_calcLftExpZone( Z1Head, Z1Tail, tNow, gamma, U1, C1, P1 ); 
else % 整成这样方便后面合并处理
    xSpnLftExp = [];    uSpnLftExp = [];
    pSpnLftExp = [];    rSpnLftExp = [];
end
% b. 右稀疏波(情况3, 4, 5% Z2Tail*t <= x <= Z2Head*t
if (idxCase == 3) || (idxCase == 4) || (idxCase == 5)
    [ xSpnRgtExp, uSpnRgtExp, pSpnRgtExp, rSpnRgtExp ] = ...
        P09_calcRgtExpZone( Z2Tail, Z2Head, tNow, gamma, U2, C2, P2 ); 
else
    xSpnRgtExp = [];    uSpnRgtExp = [];
    pSpnRgtExp = [];    rSpnRgtExp = [];
end

% 计算各区域的存在范围,各区域的状态值,以便合成绘图
% ----左激波(或左膨胀波)左侧区域----左激波(或左膨胀波区域)---
% ----中间区域间断面左侧--接触间断--中间区域间断面右侧----
% ----右激波(或右膨胀波区域)----右激波(或右膨胀波)右侧区域----
% 左激波或左膨胀波左侧区域
% a. 左波为激波的情况(情况13if (idxCase == 1) || (idxCase == 3)
    [ xSpnLftWavL, pSpnLftWavL, uSpnLftWavL, rSpnLftWavL ] = ...
        P11_calcLftWaveLftZone(Z1, P1, U1, R1, tNow);
end
% b. 左波为膨胀波(稀疏波)的情况(情况2, 4, 5if (idxCase == 2) || (idxCase == 4) || (idxCase == 5)
    [ xSpnLftWavL, pSpnLftWavL, uSpnLftWavL, rSpnLftWavL ] = ...
        P11_calcLftWaveLftZone(Z1Head, P1, U1, R1, tNow);
end
% 左膨胀波区域(如果有的话)前面已经算好了
% 中间区域(接触间断左侧区域)
% a. 左波为激波的情况(情况13if (idxCase == 1) || (idxCase == 3)
    [ xSpnMidL, pSpnMidL, uSpnMidL, rSpnMidL ] = ...
        P12_calcMidLftZone(Z1, Ps, Us, RLs, tNow);
end
% b. 左波为膨胀波(稀疏波)的情况(情况2, 4, 5if (idxCase == 2) || (idxCase == 4) || (idxCase == 5)
    [ xSpnMidL, pSpnMidL, uSpnMidL, rSpnMidL ] = ...
        P12_calcMidLftZone(Z1Tail, Ps, Us, RLs, tNow);
end
% 中间区域(接触间断面右侧)
% a. 右波为激波的情况(情况12if (idxCase == 1) || (idxCase == 2)
    [ xSpnMidR, pSpnMidR, uSpnMidR, rSpnMidR ] = ...
        P13_calcMidRgtZone(Z2, Ps, Us, R2s, tNow);
end
% b. 右波为膨胀波(稀疏波)的情况(情况3, 4, 5if (idxCase == 3) || (idxCase == 4) || (idxCase == 5)
    [ xSpnMidR, pSpnMidR, uSpnMidR, rSpnMidR ] = ...
        P13_calcMidRgtZone(Z2Tail, Ps, Us, R2s, tNow);
end
% 右膨胀波区域(如果有的话)前面已经算好了
% 右激波或膨胀波右侧区域
% a. 右波为激波的情况(情况12if (idxCase == 1) || (idxCase == 2)
    [ xSpnRgtWavR, pSpnRgtWavR, uSpnRgtWavR, rSpnRgtWavR ] = ...
        P14_calcRgtWavRgtZone(Z2, P2, U2, R2, tNow);
end
% b. 右波为膨胀波(稀疏波)的情况(情况3, 4, 5if (idxCase == 3) || (idxCase == 4) || (idxCase == 5)
    [ xSpnRgtWavR, pSpnRgtWavR, uSpnRgtWavR, rSpnRgtWavR ] = ...
        P14_calcRgtWavRgtZone(Z2Head, P2, U2, R2, tNow);
end

% 把这几个区域合并起来啊
xSpn = [xSpnLftWavL, xSpnLftExp, xSpnMidL, xSpnMidR, xSpnRgtExp, xSpnRgtWavR];
uSpn = [uSpnLftWavL, uSpnLftExp, uSpnMidL, uSpnMidR, uSpnRgtExp, uSpnRgtWavR];
pSpn = [pSpnLftWavL, pSpnLftExp, pSpnMidL, pSpnMidR, pSpnRgtExp, pSpnRgtWavR];
rSpn = [rSpnLftWavL, rSpnLftExp, rSpnMidL, rSpnMidR, rSpnRgtExp, rSpnRgtWavR];


% 绘制图形
figure(99);
plot(xSpn, pSpn, xSpn, uSpn, xSpn, rSpn, 'LineWidth', 2);
legend('p', 'u', 'rho');
xlabel('x');    ylabel('p, u, rho');
title('Riemann Problem Accurate Solution');

% 结束
disp('done!');

5 运行结果

情况1
在这里插入图片描述
情况2
在这里插入图片描述
情况3,把情况2的初始条件左右对换一下,就是情况3了,结果也和情况2是一样的,只是左右对调,速度反向而已。
在这里插入图片描述
情况4
在这里插入图片描述
情况5,感觉不太对,波尾速度的计算好像不对,就不展示了。

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值