强度计算:有限体积法(FVM)中的激波捕捉与限幅器技术教程_第1页
强度计算:有限体积法(FVM)中的激波捕捉与限幅器技术教程_第2页
强度计算:有限体积法(FVM)中的激波捕捉与限幅器技术教程_第3页
强度计算:有限体积法(FVM)中的激波捕捉与限幅器技术教程_第4页
强度计算:有限体积法(FVM)中的激波捕捉与限幅器技术教程_第5页
已阅读5页,还剩11页未读, 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

强度计算:有限体积法(FVM)中的激波捕捉与限幅器技术教程1有限体积法(FVM)基础1.1FVM的基本原理有限体积法(FVM)是一种广泛应用于流体力学、热传导和电磁学等领域的数值计算方法。其核心思想是将计算域划分为一系列控制体积(或称为单元),并在每个控制体积上应用守恒定律。与有限差分法和有限元法相比,FVM更直接地基于守恒原理,这使得它在处理非结构化网格和复杂几何形状时具有优势。1.1.1守恒原理在FVM中,守恒原理被应用于每个控制体积。例如,对于连续性方程,质量守恒意味着流入控制体积的质量必须等于流出的质量加上控制体积内的质量变化。数学上,这可以表示为:∂其中,ρ是密度,u是流体速度,t是时间。1.1.2控制体积控制体积的选择和生成是FVM中的关键步骤。控制体积可以是任意形状,但通常选择为四边形(2D)或六面体(3D)。控制体积的边界称为面,面的法向量用于计算面通量。1.2离散化过程详解离散化是将连续的偏微分方程转化为离散形式的过程,以便在计算机上进行数值求解。在FVM中,离散化过程包括:积分形式:将偏微分方程转化为积分形式,即在每个控制体积上应用守恒定律。数值积分:使用数值积分方法(如中点规则、梯形规则或高斯积分)来近似积分。通量计算:计算通过控制体积面的通量,这通常涉及到对流项和扩散项的处理。离散方程:将积分形式转化为离散方程,这些方程可以用于迭代求解。1.2.1示例:离散化连续性方程考虑一个简单的1D连续性方程:∂在控制体积Vid其中,n是面的法向量,dSd其中,Ai+12和1.2.2Python代码示例下面是一个使用Python和NumPy库离散化1D连续性方程的简单示例:importnumpyasnp

#定义网格参数

nx=100#网格点数

dx=1.0/(nx-1)#网格间距

nt=100#时间步数

dt=0.001#时间步长

#初始化密度和速度

rho=np.ones(nx)

u=np.zeros(nx)

#更新边界条件

rho[0]=1.0

rho[-1]=1.0

#离散化过程

forninrange(nt):

rho[1:-1]-=dt/dx*(u[1:-1]*(rho[2:]-rho[0:-2]))

#输出最终的密度分布

print(rho)1.3网格生成与选择网格生成是FVM中的另一个关键步骤。网格的选择直接影响到计算的精度和效率。在FVM中,网格可以是结构化的(如矩形网格)或非结构化的(如三角形网格)。网格生成通常涉及到以下步骤:定义网格参数:包括网格点数、网格间距和网格形状。生成网格:使用网格生成软件或编程语言生成网格。网格质量检查:检查网格的质量,包括网格的正交性、扭曲度和网格尺寸的均匀性。1.3.1示例:使用Python生成1D均匀网格下面是一个使用Python生成1D均匀网格的示例:importnumpyasnp

#定义网格参数

nx=100#网格点数

L=1.0#计算域长度

#生成网格

x=np.linspace(0,L,nx)

#输出网格

print(x)1.3.2网格质量检查网格质量检查通常涉及到计算网格的正交性、扭曲度和网格尺寸的均匀性。例如,对于1D网格,我们可以检查网格间距的均匀性:#计算网格间距

dx=np.diff(x)

#检查网格间距的均匀性

ifnp.allclose(dx,dx[0]):

print("网格间距均匀")

else:

print("网格间距不均匀")通过以上步骤,我们可以使用有限体积法(FVM)来解决强度计算中的数值问题,特别是在处理激波捕捉和限幅器时,FVM的守恒性和稳定性使其成为一种非常有效的工具。然而,激波捕捉和限幅器的详细讨论将留待后续的教程中进行。2激波捕捉技术2.1激波捕捉的必要性在流体力学中,激波是流体速度突然变化的界面,这种变化通常伴随着密度、压力和温度的急剧增加。在数值模拟中,激波的准确捕捉对于模拟高马赫数流、燃烧过程、爆炸等现象至关重要。有限体积法(FVM)作为一种广泛使用的数值方法,能够通过激波捕捉技术在网格上准确地表示激波,从而提高模拟的精度和可靠性。2.2上风格式与中心格式对比2.2.1上风格式上风格式(UpwindScheme)是一种基于流体流动方向的数值格式,它在处理对流项时特别有效。上风格式能够稳定地捕捉激波,避免数值振荡,这是因为上风格式考虑了物理信息的传播方向,只从前一个网格单元(对于正向流动)或后一个网格单元(对于反向流动)获取信息,从而减少了信息的“混合”,避免了不物理的振荡。2.2.1.1代码示例假设我们有一个一维的对流方程,使用上风格式进行离散:∂其中,u是流体的速度,a是对流速度。使用上风格式,我们可以得到以下离散方程:u如果a>0,则使用uin−uiimportnumpyasnp

#参数设置

a=1.0#对流速度

dx=0.1#空间步长

dt=0.01#时间步长

nx=100#网格点数

nt=100#时间步数

#初始条件

u=np.zeros(nx)

u[0:40]=2.0

#边界条件

u[0]=2.0

#上风格式更新

forninrange(nt):

un=u.copy()

foriinrange(1,nx):

ifa>0:

u[i]=un[i]-a*dt/dx*(un[i]-un[i-1])

else:

u[i]=un[i]-a*dt/dx*(un[i+1]-un[i])2.2.2中心格式中心格式(CentralScheme)在计算对流项时,使用网格点两侧的值进行平均,这在平滑流场中表现良好,但在激波附近会导致数值振荡,因为中心格式没有考虑信息的传播方向。2.2.2.1代码示例使用中心格式离散上述一维对流方程:u#中心格式更新

forninrange(nt):

un=u.copy()

foriinrange(1,nx-1):

u[i]=un[i]-a*dt/dx*(un[i+1]-un[i-1])/22.3高分辨率方案介绍高分辨率方案(High-ResolutionSchemes)旨在提高数值模拟的精度,特别是在激波和不连续性附近的精度。这些方案通常结合了上风格式的稳定性与中心格式的精度,通过使用限幅器(Limiter)来控制数值振荡,从而在保持高分辨率的同时,确保数值解的稳定性。2.3.1限幅器限幅器是一种用于控制数值解中不物理振荡的工具,它通过调整数值格式的斜率来实现。限幅器的设计原则是,在平滑区域使用高阶格式以提高精度,在激波或不连续性附近使用低阶格式以保持稳定性。2.3.1.1代码示例使用VanLeer限幅器(一种常用的限幅器)来更新上风格式的斜率:defvan_leer_limiter(r):

return(r+abs(r))/(1+abs(r))

#使用VanLeer限幅器的上风格式更新

forninrange(nt):

un=u.copy()

foriinrange(1,nx):

ifa>0:

slope=(un[i]-un[i-1])/dx

slope_limited=van_leer_limiter(slope)

u[i]=un[i]-a*dt*slope_limited

else:

slope=(un[i+1]-un[i])/dx

slope_limited=van_leer_limiter(slope)

u[i]=un[i]-a*dt*slope_limited通过上述代码示例,我们可以看到,使用限幅器的上风格式能够更准确地捕捉激波,同时避免了数值振荡,提高了数值模拟的精度和稳定性。3限幅器原理与应用3.1限幅器的作用与分类限幅器在数值计算方法,尤其是有限体积法(FVM)中扮演着关键角色,主要用于激波捕捉,防止数值解出现非物理的振荡。限幅器通过限制数值解的梯度或斜率,确保解的单调性,从而提高计算的稳定性和准确性。3.1.1分类限幅器可以分为线性限幅器和非线性限幅器两大类。线性限幅器通常基于简单的数学规则,如最小值和最大值的限制,来调整数值解的斜率。非线性限幅器则更为复杂,它们根据局部流场的特性动态调整限幅参数,以更好地捕捉激波和其它非线性现象。3.2TVD限幅器详解TVD(TotalVariationDiminishing)限幅器是一种非线性限幅器,旨在保持解的总变差不增加,从而避免数值振荡。TVD限幅器的核心思想是通过调整数值解的斜率,确保在计算过程中,解的总变差不会增加,这有助于保持解的单调性,特别是在激波附近。3.2.1原理TVD限幅器通过计算两个相邻网格点之间的斜率,并根据这些斜率的比值来调整数值解的斜率。具体来说,如果两个相邻网格点的斜率比值超过一定阈值,限幅器会减少斜率,以避免非物理的振荡。3.2.2实现在有限体积法中,TVD限幅器的实现通常涉及到对数值通量的修正。以下是一个使用Python实现的TVD限幅器示例,用于修正一维标量方程的数值解。importnumpyasnp

deftvd_limiter(r):

"""

TVD限幅器函数,输入为斜率比值r,输出为修正后的斜率。

"""

#Superbee限幅器

phi=np.where(r<=0,0,np.where(r<=1,r,np.where(r<=2,2*r-2,0)))

returnphi

defupdate_solution(u,dt,dx,flux):

"""

更新数值解u,dt为时间步长,dx为空间步长,flux为数值通量。

"""

#计算斜率

slope=np.gradient(u,dx)

#计算斜率比值

r=np.where(slope[:-1]==0,1,slope[1:]/slope[:-1])

#应用TVD限幅器

limiter=tvd_limiter(r)

#修正斜率

slope_limited=np.where(slope[:-1]==0,slope[:-1],limiter*slope[:-1])

#更新解

u_new=u-dt/dx*(flux[1:]-flux[:-1])+dt*(slope_limited[1:]-slope_limited[:-1])

returnu_new在这个示例中,tvd_limiter函数实现了Superbee限幅器,它根据斜率比值r动态调整限幅参数。update_solution函数则使用这个限幅器来修正数值解u,确保在时间步长dt和空间步长dx下,解的更新不会引入非物理的振荡。3.3非线性限幅器的实现非线性限幅器的实现通常需要更复杂的数学模型,以适应不同类型的流场和激波。以下是一个使用Python实现的非线性限幅器示例,它基于VanLeer的β函数,用于修正数值解的斜率。defvan_leer_limiter(r):

"""

VanLeer的β函数限幅器,输入为斜率比值r,输出为修正后的斜率。

"""

phi=(r+np.abs(r))/(1+np.abs(r))

returnphi

defupdate_solution_nonlinear(u,dt,dx,flux):

"""

使用VanLeer限幅器更新数值解u,dt为时间步长,dx为空间步长,flux为数值通量。

"""

#计算斜率

slope=np.gradient(u,dx)

#计算斜率比值

r=np.where(slope[:-1]==0,1,slope[1:]/slope[:-1])

#应用VanLeer限幅器

limiter=van_leer_limiter(r)

#修正斜率

slope_limited=np.where(slope[:-1]==0,slope[:-1],limiter*slope[:-1])

#更新解

u_new=u-dt/dx*(flux[1:]-flux[:-1])+dt*(slope_limited[1:]-slope_limited[:-1])

returnu_new在这个示例中,van_leer_limiter函数实现了VanLeer的β函数限幅器,它通过计算斜率比值r的β函数来动态调整限幅参数。update_solution_nonlinear函数则使用这个限幅器来修正数值解u,确保在处理复杂流场时,解的更新仍然保持稳定和准确。通过上述示例,我们可以看到限幅器在有限体积法中的重要性,以及如何通过不同的限幅器策略来提高数值计算的稳定性和准确性。在实际应用中,选择合适的限幅器策略对于准确捕捉激波和其它非线性现象至关重要。4FVM中的激波捕捉与限幅器实践4.1激波捕捉算法的编程实现在有限体积法(FVM)中,激波捕捉算法是处理激波和间断现象的关键技术。激波捕捉算法通过在间断处添加人工耗散,确保数值解的稳定性和物理一致性。下面,我们将通过一个具体的例子来展示如何在Python中实现一个简单的激波捕捉算法。4.1.1例子:一维Burgers方程的激波捕捉一维Burgers方程为:u我们使用FVM和激波捕捉算法来求解这个方程。4.1.1.1步骤1:定义网格和初始条件importnumpyasnp

#定义网格参数

nx=100

dx=1.0/(nx-1)

nt=100

dt=0.001

#初始化网格和速度场

x=np.linspace(0,1,nx)

u=np.where(x<0.5,2.0,1.0)4.1.1.2步骤2:实现FVM离散化flux=lambdau:0.5*u**2

#FVM离散化

forninrange(nt):

un=u.copy()

u[1:-1]-=dt/dx*(flux(un[2:])-flux(un[:-2]))4.1.1.3步骤3:添加激波捕捉为了稳定解,我们添加一个简单的激波捕捉算法,例如VanLeer限幅器。defvan_leer_limiter(r):

return(r+np.abs(r))/(1+np.abs(r))

#添加限幅器

forninrange(nt):

un=u.copy()

slope=(un[2:]-un[1:-1])/dx

slope_limited=van_leer_limiter(slope[1:]/slope[:-1])

u[1:-1]-=dt/dx*(flux(un[2:]-slope_limited[1:]*dx)-flux(un[:-2]+slope_limited[:-1]*dx))4.1.2分析与讨论通过上述代码,我们实现了FVM中的一维Burgers方程求解,并添加了VanLeer限幅器来捕捉激波。限幅器的作用是限制数值解的斜率,防止出现非物理的振荡。4.2限幅器在FVM中的应用案例限幅器在FVM中广泛应用于处理激波和间断,下面通过一个二维Euler方程的求解来展示限幅器的应用。4.2.1例子:二维Euler方程的激波捕捉二维Euler方程描述了流体动力学中的守恒定律,包括质量、动量和能量的守恒。4.2.1.1步骤1:定义网格和初始条件nx,ny=100,100

dx,dy=1.0/(nx-1),1.0/(ny-1)

nt=100

dt=0.001

#初始化网格和流体状态

x,y=np.meshgrid(np.linspace(0,1,nx),np.linspace(0,1,ny))

rho=np.ones((nx,ny))

rho[np.where(x<0.5)]=2.0

u=np.zeros((nx,ny))

v=np.zeros((nx,ny))

p=np.ones((nx,ny))4.2.1.2步骤2:实现FVM离散化#FVM离散化

forninrange(nt):

rho_un,u_un,v_un,p_un=rho.copy(),u.copy(),v.copy(),p.copy()

#更新密度、速度和压力

rho-=dt/dx*(rho_un*u_un)[1:,:]-dt/dy*(rho_un*v_un)[:,1:]

u-=dt/dx*(u_un**2+p_un/rho_un)[1:,:]-dt/dy*(u_un*v_un)[:,1:]

v-=dt/dx*(u_un*v_un)[:,1:]-dt/dy*(v_un**2+p_un/rho_un)[:,1:]4.2.1.3步骤3:添加限幅器#添加VanLeer限幅器

forninrange(nt):

rho_un,u_un,v_un,p_un=rho.copy(),u.copy(),v.copy(),p.copy()

#计算斜率

slope_rho_x=(rho_un[2:,:]-rho_un[1:-1,:])/dx

slope_rho_y=(rho_un[:,2:]-rho_un[:,1:-1])/dy

#限幅

slope_limited_rho_x=van_leer_limiter(slope_rho_x[1:,1:]/slope_rho_x[:-1,1:])

slope_limited_rho_y=van_leer_limiter(slope_rho_y[1:,1:]/slope_rho_y[1:,:-1])

#更新流体状态

rho[1:-1,1:-1]-=dt/dx*(rho_un[2:,1:-1]-rho_un[1:-1,1:-1]-slope_limited_rho_x*dx)

rho[1:-1,1:-1]-=dt/dy*(rho_un[1:-1,2:]-rho_un[1:-1,1:-1]-slope_limited_rho_y*dy)

#类似地更新u,v,p4.2.2分析与讨论在二维Euler方程的求解中,限幅器同样起到了稳定解的作用,尤其是在激波和间断的处理上。通过限幅器,我们可以确保数值解的物理意义,并避免非物理的振荡。4.3数值稳定性与收敛性分析在FVM中,激波捕捉算法和限幅器的使用直接影响到数值解的稳定性和收敛性。稳定性分析通常涉及CFL条件,而收敛性则需要检查解是否随着网格细化和时间步长减小而收敛到真实解。4.3.1例子:CFL条件的检查CFL条件是确保数值解稳定性的关键。对于一维Burgers方程,CFL条件为:d#检查CFL条件

max_u=np.max(np.abs(u))

cfl=dt/dx

ifcfl>1/max_u:

print("CFL条件不满足,可能产生不稳定解")4.3.2分析与讨论CFL条件的检查是确保FVM算法稳定性的基础。在实际应用中,我们可能需要动态调整时间步长以满足CFL条件,从而保证数值解的稳定性。4.3.3例子:网格细化和时间步长减小的收敛性测试为了检查算法的收敛性,我们可以比较不同网格细化程度和时间步长下的解。#定义不同网格和时间步长的参数

nx_list=[50,100,200]

dx_list=[1.0/(nx-1)fornxinnx_list]

dt_list=[0.001,0.0005,0.00025]

#对每个参数组合求解并比较解

fornx,dx,dtinzip(nx_list,dx_list,dt_list):

x=np.linspace(0,1,nx)

u=np.where(x<0.5,2.0,1.0)

#FVM求解

forninrange(nt):

un=u.copy()

u[1:-1]-=dt/dx*(flux(un[2:])-flux(un[:-2]))

#比较解

ifnx_list.index(nx)>0:

diff=np.linalg.norm(u-u_prev)

print(f"网格细化至{nx},时间步长减小至{dt},解的差异为{diff}")

u_prev=u.copy()4.3.4分析与讨论通过上述代码,我们可以观察到随着网格细化和时间步长的减小,解的差异逐渐减小,这表明算法是收敛的。收敛性测试是验证数值方法正确性和有效性的关键步骤。通过上述例子和分析,我们展示了激波捕捉算法和限幅器在FVM中的实现和应用,以及如何检查数值解的稳定性和收敛性。这些技术对于处理流体动力学中的激波和间断现象至关重要。5高级主题与研究进展5.1多维激波捕捉技术5.1.1原理多维激波捕捉技术是有限体积法(FVM)中处理激波和间断问题的关键方法。在多维流场中,激波的形成和传播不仅沿一个方向,而是可能在多个方向上同时发生。传统的激波捕捉方法,如一维的Godunov方法或其变种,可能无法准确捕捉到多维流场中的激波结构。因此,多维激波捕捉技术通过考虑流场的多维特性,使用更复杂的数值通量和重构策略,以提高激波捕捉的准确性和稳定性。5.1.2内容多维激波捕捉技术通常包括以下内容:多维重构:在每个网格单元内,使用多维信息进行状态变量的重构,以更准确地描述激波附近的流场变化。例如,可以使用多维有限体积法中的多维限幅器进行重构。多维数值通量:基于多维流场的特性,计算网格边界上的数值通量。这可能涉及到多维Riemann问题的求解,如HLLC或Roe通量。多维限幅器:为了防止数值振荡,多维限幅器被设计用于限制重构的斜率,确保数值解的单调性。5.1.3示例假设我们正在处理一个二维流场中的激波问题,使用多维有限体积法进行数值模拟。以下是一个使用Python实现的多维重构和限幅器的简化示例:importnumpyasnp

defmultidimensional_reconstruction(U,dx,dy):

"""

多维重构函数,输入为状态变量U,网格大小dx和dy。

输出为在每个网格边界上的重构值。

"""

#一维重构

Ux=(U[1:,:]-U[:-1,:])/dx

Uy=(U[:,1:]-U[:,:-1])/dy

#多维限幅器

Ux_limited=minmod(Ux[1:,:],Ux[:-1,:])

Uy_limited=minmod(Uy[:,1:],Uy[:,:-1])

#重构

U_left=U[:-1,:]+0.5*Ux_limited*dx

U_right=U[1:,:]-0.5*Ux_limited*dx

U_bottom=U[:,:-1]+0.5*Uy_limited*dy

U_top=U[:,1:]-0.5*Uy_limited*dy

returnU_left,U_right,U_bottom,U_top

defminmod(a,b):

"""

实现minmod限幅器,用于限制重构斜率,防止数值振荡。

"""

returnnp.sign(a)*np.minimum(np.abs(a),np.abs(b))*(np.sign(a)==np.sign(b))

#假设的流场状态变量U

U=np.array([[1,2,3],[4,5,6],[7,8,9]])

dx=1.0

dy=1.0

#调用多维重构函数

U_left,U_right,U_bottom,U_top=multidimensional_reconstruction(U,dx,dy)在这个示例中,我们首先计算了状态变量U在x和y方向上的梯度,然后使用minmod限幅器对这些梯度进行限制,最后根据限幅后的梯度进行状态变量的重构。5.2自适应网格与限幅器5.2.1原理自适应网格技术在有限体积法中用于动态调整网格的分辨率,以提高计算效率和精度。在激波或间断附近,网格会被细化,而在流场变化平缓的区域,网格则会被粗化。限幅器在自适应网格中同样重要,用于防止在激波捕捉过程中出现的数值振荡。5.2.2内容自适应网格与限幅器的结合使用,可以实现以下功能:网格细化与粗化:根据流场的局部变化率,动态调整网格的分辨率。限幅器的自适应应用:在网格细化的区域,使用更严格的限幅器策略,以确保激波捕捉的稳定性。5.2.3示例以下是一个使用自适应网格和限幅器的简化示例,同样使用Python实现:defadaptive_grid(U,dx,dy,threshold):

"""

自适应网格函数,输入为状态变量U,网格大小dx和dy,以及变化率阈值threshold。

输出为调整后的网格大小dx_new和dy_new。

"""

#计算变化率

dU_dx=np.abs((U[1:,:]-U[:-1,:])/dx)

dU_dy=np.abs((U[:,1:]-U[:,:-1])/dy)

#根据变化率调整网格大小

dx_new=dx/(1+dU_dx>threshold)

dy_new=dy/(1+dU_dy>threshold)

returndx_new,dy_new

#使用自适应网格和限幅器

dx_new,dy_new=adaptive_grid(U,dx,dy,0.5)在这个示例中,我们首先计算了状态变量U在x和y方向上的变化率,然后根据变化率是否超过阈值,动态调整了网格的分辨率。在实际应用中,网格的调整会更加复杂,可能涉及到网格的重新划分和状态变量的重新分布。5.3激波捕捉与限幅器在复杂流场中的应用5.3.1原理在复杂流场中,激波和间断可能以各种形式出现,包括激波反射、激波与激波的相互作用等。激波捕捉与限幅器的结合使用,可以有效地处理这些复杂情况,确保数值解的稳定性和准确性。5.3.2内容激波捕捉与限幅器在复杂流场中的应用通常包括:激波反射的处理:在壁面或障碍物附近,激波会反射,形成复杂的流场结构。激波捕捉技术可以准确地模拟这种反射过程。激波与激波的相互作用:在多激波流场中,激波之间的相互作用会导致流场的剧烈变化。限幅器可以防止在这些区域出现的数值振荡。5.3.3示例假设我们正在模拟一个包含激波反射和激波相互作用的复杂流场,以下是一个

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论