
1
跨音速流动仿真的基本概念
在高速流体仿真中,跨音速流动是一个非常重要的领域。跨音速流动是指流体
速度接近或超过音速的流动情况。在这一区域,流体的物理特性会发生显著变
化,如压缩性增强、激波形成等,这些变化对仿真算法的设计和实现提出了更
高的要求。
跨音速流动的特点包括: - 压缩性增强:当流速接近音速时,流体的密度不再
视为常数,而是随着压力的变化而变化。 - 激波形成:在超音速流动中,流体
速度超过音速时会产生激波,这是一种非线性的现象,需要特殊的处理方法。 -
亚音速到超音速的过渡:跨音速流动中,流体速度从亚音速逐渐过渡到超音速,
这一过程中会出现复杂的流动结构。
数学模型
跨音速流动的数学模型主要包括连续性方程、动量方程和能量方程。这些方程
通常以守恒形式表示,适用于各种流动状态。
1. 连续性方程
连续性方程描述了质量守恒的原理:
∂
ρ
∂
t
+
∇
⋅
(
ρ
u
)
=
0
其中,
ρ
是密度,
u
是速度向量。
2. 动量方程
动量方程描述了动量守恒的原理:
∂
(
ρ
u
)
∂
t
+
∇
⋅
(
ρ
u
u
T
)
=
−
∇
p
+
∇
⋅
τ
+
f
其中,
p
是压力,
τ
是应力张量,
f
是外力。
3. 能量方程
能量方程描述了能量守恒的原理:

2
∂
E
∂
t
+
∇
⋅
(
E
u
)
=
∇
⋅
(
u
⋅
τ
)
+
u
⋅
f
+
∇
⋅
q
其中,
E
是总能量,
q
是热流向量。
数值方法
跨音速流动的数值仿真通常采用有限体积法(FVM)和有限差分法(FDM)。
1. 有限体积法(FVM)
有限体积法是一种常用的数值方法,通过将计算域划分为若干个控制体(或控
制体积),并应用守恒定律来求解控制体内的流场参数。
1.1 控制体积的划分
控制体积的划分可以是结构化网格或非结构化网格。结构化网格通常用于规则
的几何形状,而非结构化网格适用于复杂几何形状。
#
示例:使用
Python
进行二维结构化网格划分
import numpy as np
def create_structured_grid(nx, ny, Lx, Ly):
"""
创建一个二维结构化网格
:param nx: x
方向上的网格点数
:param ny: y
方向上的网格点数
:param Lx: x
方向上的长度
:param Ly: y
方向上的长度
:return: x, y
网格坐标
"""
x = np.linspace(0, Lx, nx)
y = np.linspace(0, Ly, ny)
x, y = np.meshgrid(x, y)
return x, y
#
创建一个
10x10
的网格,覆盖
0
到
1
的区域
x, y = create_structured_grid(10, 10, 1, 1)
print(x)
print(y)

3
1.2 守恒方程的离散化
通过积分守恒方程,将其转化为每个控制体的代数方程。例如,连续性方程的
离散化形式为:
∂
ρ
i
∂
t
+
1
V
i
F
i
f
=
1
(
ρ
u
⋅
n
f
)
A
f
=
0
其中,
ρ
i
是控制体 i 内的密度,
V
i
是控制体 i 的体积,
n
f
是面 f 的法向向量,
A
f
是
面 f 的面积。
激波捕捉
在跨音速流动仿真中,激波的捕捉是关键问题。常用的激波捕捉方法包括
Godunov 方 法 、 TVD ( Total Variation Diminishing ) 方 法 和 WENO ( Weighted
Essentially Non-Oscillatory)方法。
1. Godunov 方法
Godunov 方法是一种基本的激波捕捉方法,通过求解 Riemann 问题来获得界面
处的物理参数。
1.1 Riemann 问题
Riemann 问题是指初始条件为两个不同状态的流体在界面处的相互作用。通过
求解 Riemann 问题,可以得到界面处的物理参数。
#
示例:求解一维
Riemann
问题
def riemann_solver(left_state, right_state):
"""
求解一维
Riemann
问题
:param left_state:
左侧状态,包含密度、速度、压力
:param right_state:
右侧状态,包含密度、速度、压力
:return:
界面处的物理参数
"""
rho_l, u_l, p_l = left_state
rho_r, u_r, p_r = right_state
#
计算声速

4
c_l = np.sqrt(1.4 * p_l / rho_l)
c_r = np.sqrt(1.4 * p_r / rho_r)
#
计算激波速度
s_l = u_l - c_l
s_r = u_r + c_r
#
判断激波类型
if s_l > 0 and s_r > 0:
rho, u, p = right_state
elif s_l < 0 and s_r < 0:
rho, u, p = left_state
else:
#
计算中间状态
p_star = (s_r * p_l + s_l * p_r + s_l * s_r * (rho_r * u_r - rho_l * u_l)) / (s_r + s_l)
u_star = (s_r * u_l + s_l * u_r + (p_l - p_r)) / (s_r + s_l)
rho_star_l = rho_l * (s_l - u_l) / (s_l - u_star)
rho_star_r = rho_r * (s_r - u_r) / (s_r - u_star)
if u_star > 0:
rho, u, p = rho_star_l, u_star, p_star
else:
rho, u, p = rho_star_r, u_star, p_star
return rho, u, p
#
左侧状态
left_state = (1.0, 0.75, 1.0)
#
右侧状态
right_state = (0.125, 0.0, 0.1)
#
求解
Riemann
问题
interface_state = riemann_solver(left_state, right_state)
print(interface_state)
2. TVD 方法
TVD 方法是一种防止数值振荡的高分辨率方法,通过限制斜率来避免非物理的
震荡。
2.1 斜率限制器
斜率限制器用于计算控制体之间的物理参数变化率,常见的限制器包括 Van

5
Leer 限制器和 Superbee 限制器。
#
示例:使用
Van Leer
限制器
def van_leer limiter(r):
"""
Van Leer
限制器
:param r:
比值
:return:
限制后的斜率
"""
return (r + abs(r)) / (1 + abs(r))
#
示例:计算斜率
def compute_slope(rho, dx):
"""
计算斜率
:param rho:
密度数组
:param dx:
网格间距
:return:
限制后的斜率
"""
r = (rho[2:] - rho[1:-1]) / (rho[1:-1] - rho[:-2])
slope = (rho[1:-1] - rho[:-2]) * van_leer_limiter(r)
return slope
#
密度数组示例
rho = np.array([1.0, 0.5, 0.25, 0.125, 0.0625])
dx = 0.1
#
计算斜率
slope = compute_slope(rho, dx)
print(slope)
仿真软件
跨音速流动仿真常用的软件包括 OpenFOAM、FLUENT 和 SU2。这些软件提供了
丰富的求解器和工具,可以处理各种复杂的流动问题。
1. OpenFOAM
OpenFOAM 是一个开源的 CFD(计算流体力学)软件,支持多种物理模型和数
值方法。