拟一维喷管流动的数值解——亚声速-超声速等熵喷管流动的守恒型CFD解法(MacCormack方法)

一、Matlab代码片

%亚声速-超声速等熵喷管流动守恒形CFD解法 MacCormack方法
clear; %清理内存变量
clc; %清理工作窗中的所有显示内容
r=1.4; %比热比
L=3; %喷管长度
i=31; %网格数目
C=0.5; %科朗数
x=linspace(0,L,i); %网格点横坐标
N=1401; %时间步
%预分配内存
rho=zeros(1401,31); V=zeros(1401,31); T=zeros(1401,31);
U1=zeros(1401,31); U2=zeros(1401,31); U3=zeros(1401,31);
dx=L/(i-1); %空间步长
dt(1:N)=0; %时间步长
A=1+2.2*(x-1.5).*(x-1.5); %喷管面积
%初始条件
rho(1,:)=[ones(1,6),1.0-0.366.*(x(7:16)-0.5),0.634-0.3879.*(x(17:31)-1.5)];
T(1,:)=[ones(1,6),1.0-0.167.*(x(7:16)-0.5),0.833-0.3507.*(x(17:31)-1.5)]; 
U1(1,:)=rho(1,:).*A(1:31);
U2(1,:)=0.59;
V(1,:)=U2(1,:)./U1(1,:);
U3(1,:)=U1(1,:).*((T(1,:)./(r-1))+r/2.*V(1,:).^2);
%MacCormack方法迭代
for k=1:N-1
    %确定最小时间步长
    t=C*dx./(V(k,:)+sqrt(T(k,:)));
    dt(k)=min(t);
    %预估步通量
    F1(1:i)=U2(k,1:i);
    F2(1:i)=U2(k,1:i).^2./U1(k,1:i)+(r-1)/r.*...
    (U3(k,1:i)-r/2.*U2(k,1:i).^2./U1(k,1:i));
    F3(1:i)=r.*U2(k,1:i).*U3(k,1:i)./U1(k,1:i)...
    -r*(r-1)/2.*U2(k,1:i).^3./U1(k,1:i).^2;
    J2(1:i-1)=1/r.*rho(k,1:i-1).*T(k,1:i-1).*(A(2:i)-A(1:i-1))/0.1; %源项
    %预估偏导数
    U1t(1:i-1)=-(F1(2:i)-F1(1:i-1))/dx;
    U2t(1:i-1)=-(F2(2:i)-F2(1:i-1))/dx+J2(1:i-1);
    U3t(1:i-1)=-(F3(2:i)-F3(1:i-1))/dx;
    %预估值
    U1_(1:i-1)=U1(k,1:i-1)+U1t(1:i-1).*dt(k);
    U2_(1:i-1)=U2(k,1:i-1)+U2t(1:i-1).*dt(k);
    U3_(1:i-1)=U3(k,1:i-1)+U3t(1:i-1).*dt(k);
    rho_(1:i-1)=U1_(1:i-1)./A(1:i-1);
    T_(1:i-1)=(r-1).*( U3_(1:i-1)./U1_(1:i-1)-r/2.*U2_(1:i-1).^2./U1_(1:i-1).^2);
    F1_(1:i-1)=U2_(1:i-1);
    F2_(1:i-1)=U2_(1:i-1).^2./U1_(1:i-1)+(r-1)/r.*...
    (U3_(1:i-1)-r/2.*U2_(1:i-1).^2./U1_(1:i-1));
    F3_(1:i-1)=r.*U2_(1:i-1).*U3_(1:i-1)./U1_(1:i-1)...
    -r*(r-1)/2.*U2_(1:i-1).^3./U1_(1:i-1).^2;
    J2_(2:i-1)=1/r.*rho_(2:i-1).*T_(2:i-1).*(A(2:i-1)-A(1:i-2))/0.1; %注意
    %校正步 校正偏导数
    U1t_(2:i-1)=-(F1_(2:i-1)-F1_(1:i-2))/dx;
    U2t_(2:i-1)=-(F2_(2:i-1)-F2_(1:i-2))/dx+J2_(2:i-1);
    U3t_(2:i-1)=-(F3_(2:i-1)-F3_(1:i-2))/dx;
    %时间导数平均值
    U1tav(2:i-1)=0.5.*(U1t(2:i-1)+U1t_(2:i-1));
    U2tav(2:i-1)=0.5.*(U2t(2:i-1)+U2t_(2:i-1));
    U3tav(2:i-1)=0.5.*(U3t(2:i-1)+U3t_(2:i-1));
    %最终校正值
    U1(k+1,2:i-1)=U1(k,2:i-1)+U1tav(2:i-1).*dt(k);
    U2(k+1,2:i-1)=U2(k,2:i-1)+U2tav(2:i-1).*dt(k);
    U3(k+1,2:i-1)=U3(k,2:i-1)+U3tav(2:i-1).*dt(k);
    rho(k+1,2:i-1)=U1(k+1,2:i-1)./A(2:i-1);
    V(k+1,2:i-1)=U2(k+1,2:i-1)./U1(k+1,2:i-1);
    T(k+1,2:i-1)=(r-1).*(U3(k+1,2:i-1)./U1(k+1,2:i-1)-r/2.*V(k+1,2:i-1).^2);
    %入流边界值
    rho(k+1,1)=1;
    T(k+1,1)=1;
    U1(k+1,1)=A(1);
    U2(k+1,1)=2.*U2(k+1,2)-U2(k+1,3);
    V(k+1,1)=U2(k+1,1)./U1(k+1,1);
    U3(k+1,1)=U1(k+1,1).*((T(k+1,1)./(r-1))+r/2.*V(k+1,1).^2);
    %出流边界值
    U1(k+1,i)=2.*U1(k+1,i-1)-U1(k+1,i-2);
    U2(k+1,i)=2.*U2(k+1,i-1)-U2(k+1,i-2);
    U3(k+1,i)=2.*U3(k+1,i-1)-U3(k+1,i-2);
    %由于不需要返回原变量的出流边界值,故这里省去了原变量出流边界值的计算
end
%绘图 无量纲质量流量在六个不同时刻的瞬时分布
figure;
plot(x,U2(1,:),'k--');
hold on;
plot(x,U2(101,:),'b-');
hold on;
plot(x,U2(201,:),'y-');
hold on;
plot(x,U2(701,:),'m-');
axis([0,3,0.35,0.7]);
title('不同时刻质量流量的变化');
ylabel('无量纲质量流量'),xlabel('无量纲轴向距离');
text(2.6,0.58,'700\Deltat');
text(1.8,0.56,'200\Deltat'); 
text(1.5,0.66,'100\Deltat');
text(1.5,0.6,'0\Deltat');
    

二、计算结果展示

无量纲质量流量在四个不同时刻的瞬时分布

在这里插入图片描述

### 回答1: 通过激波捕捉方法一维喷管流动的问题可以使用Python程序来实现。激波捕捉方法是一种求波动方程的数值方法,它能够模波浪在流体中的传播过程。 在Python程序中,首先需要定义一维喷管的初始条件,包括流体的密度、速度和压力等参数。然后,使用有限差分法来离散化求波浪方程,并在空间和时间上进行迭代计算。 具体而言,可以将一维喷管的空间进行网格化,将时间进行离散化,然后使用波浪方程的差分格式进行数值计算。在每个时间步长中,根据激波捕捉方法的原理,需要通过计算波的传播速度和截断错误来确定数值。 最后,将计算得到的数值用图像的方式展示出来,可以观察到喷管流动的波动和变化过程。在观察和分析波动特性的基础上,可以通过调整初始条件或改变问题的边界条件来研究不同的流动情况,进一步深入理一维喷管流动的特性和机理。 总之,通过激波捕捉方法一维喷管流动的问题,可以使用Python程序进行数值计算和可视化分析,从而获得流动的定量和定性结果,为工程实践和科学研究提供重要的参考和支持。 ### 回答2: 激波捕捉方法是一种常用的求一维喷管流动问题的数值方法。首先,我们需要使用Python编写程序来实现该方法。 首先,我们需要定义一些初始参数,如管道长度、时间步长、空间步长等。然后,我们可以创建一个网格来离散化管道。这个离散化网格可以由一系列节点组成,每个节点上的参数(如密度、速度和压力)可以通过方程进行计算。 接下来,我们需要使用数值方法来计算方程中的不同物理量。激波捕捉方法采用龙格-库塔方法(Runge-Kutta method)来进行时间和空间的离散化计算。这个方法需要定义算子以计算方程左右两边的差分。我们可以使用中心差分法或者迎风格式等方法来计算算子。 然后,我们需要使用激波捕捉(shock capturing)来确保数值计算的稳定性和精度。激波捕捉方法通过检测流场中的激波和区分流场中的激波和扩散区域来实现。我们可以使用MUSCL(Monotone Upstream-Centered Schemes for Conservation Laws)方法来进行激波捕捉,并在计算过程中对激波进行限制。 最后,我们可以通过在时间上进行迭代计算,来求一维喷管流动数值。在每个时间步骤中,我们可以通过将时间步长分成很多小的子步长来进行计算。然后,我们可以使用龙格-库塔方法来将各个子步长的结果进行组合,得到整个时间步长的数值。 通过编写这样的Python程序,我们可以使用激波捕捉方法一维喷管流动问题。这样的程序可以提供高精度、稳定的数值,帮助我们更好地理和分析喷管流动的物理过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值