b一维可压ns方程b0814093738.docx

上传人:b****4 文档编号:24461770 上传时间:2023-05-27 格式:DOCX 页数:24 大小:47.81KB
下载 相关 举报
b一维可压ns方程b0814093738.docx_第1页
第1页 / 共24页
b一维可压ns方程b0814093738.docx_第2页
第2页 / 共24页
b一维可压ns方程b0814093738.docx_第3页
第3页 / 共24页
b一维可压ns方程b0814093738.docx_第4页
第4页 / 共24页
b一维可压ns方程b0814093738.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

b一维可压ns方程b0814093738.docx

《b一维可压ns方程b0814093738.docx》由会员分享,可在线阅读,更多相关《b一维可压ns方程b0814093738.docx(24页珍藏版)》请在冰豆网上搜索。

b一维可压ns方程b0814093738.docx

b一维可压ns方程b0814093738

附录B一维可压缩黏性流动问题的数值解法与计算程序

一维可压缩黏性流动是气体动力学中最经典的黏性流动问题,对它采用迎风型TVD差分算法进行数值求解。

同时,为了初学者入门和练习方便,这里给出了由C语言和Fortran7语言编写的、计算一维可压缩黏性流动问题的计算程序,供大家学习参考。

B-1利用二阶迎风型TVD差分格式求解一维可压缩黏性流动问题1.一维可压缩黏性流动问题

在两端开口管道中充满了可压缩黏性流体。

当黏性流体以超声速

从左向右运动时,一定会在管道中形成一道正激波,如图B.1所示。

1、Ui、Pi和2、U2、P2分别为激波波前和波后的参数。

该问题可简化为一维可压缩黏性流动问题。

当数值解达到稳定时,在管道中可求解得到一道稳定的激波。

r

1

|-

k

1

p2—1

1

1U{-

1

<*2—

1

1

II

1耳-

1

—3P*-

P1—*

1

1

1

1

1

1

X

0I

2.基本方程组、初始条件和边界条件

设流体是黏性流体。

一维可压缩黏性流动问题,在数学上可以用

T

E

CT

12

II

Pr

Cp

p2,

M2

E

Cv1

u

2

Pr

k

UL

1

Cp

T

Re,

cv

9j

a

1

M2

Cv

M

为:

f—(B.1)

xx

其中

(B.1b)

其中、up和E分别是量纲为一的密度、速度、压力和单位体积总能,s为流体的黏性项。

Pr为普朗特数(此处公式中Cp、k、是有量纲量),Re为雷诺数,c为比定容热容,Cp为比定压热容,Cp,cv是量纲为一的量,称为气体绝热指数,a为当地声速。

初始条件:

在t0时刻,x,01,其他物理量采用线性插值得

到。

右边界x1处:

x,t

0

x1

x

u1,t

2

M2

1

1..2—M

1

T1,t2M2

1

11

2

11

1M2

3.二阶精度迎风型TVD差分格式

一维N-S方程组中的对流项采用

Harten的二阶精度迎风型

分格式:

n1n.n

ujujrh1

JJj2

hn

J

s

1

2X

t(B.4)

1

'ji2fjfj1Rj2°j2(B.4a)

其中r。

向量①在第l个特征方向上分量为:

x

iii

.1gjgj1Q

j2

l

a1

j2

l

.1.1

jTjT

22

(B.4b)

gjminmod11

J2

l

1,j2

ll

11

j-j-

22

(B.4c)

(B.3)

TVD差

ll

gj1gj

l

.1j

2

0

(B.4d)

0,

流通量矢量f的非线性Jiacobia系数矩阵A=Rar-1为:

非线性Jiacobia系数矩阵A的特征值为:

(B.6)

非线性Jiacobia系数矩阵A的右特征矢量R、R-1为:

 

一维N-S方程组中的黏性项

1

1

1

Ru

uau

a

(B.7)

12u

2

huah

ua

1

1u2

1

u

1

2a2

2a

2a

R1

u

1u2

1u

1

1

2a2(B.8)

2a

4a2

2a2

2a

u

1u2

1u

1

1

2a

4a2

2a2

2a

2a2

t采用二阶精度中心差分格式

4.计算结果分析

采用用C语言和Fortran77语言对一维可压缩黏性流动问题编制了计算程序,并对雷诺数Re50的流动进行了计算,计算结果如图B.2和图B.3所示。

图B.2Fortran7语言程序得到图B.3C语言程序得到

图B.2和图B.3是计算达到稳定后激波间断位置和密度()、速度(u)、压

的结果的结果

力(P)和单位质量内能(e)的分布。

由上述计算结果中可以看出,采用二阶精度迎风型TVD差分格式计算一维可压缩黏性流动问题得到的数值解和经典文献中的结果是完全一致的。

计算结果表明,迎风型TVD差分格式能够精确地捕捉激波间断,计算效果较好。

由于本问题中黏性较大(Re50),所以计算得到的激波比较

光滑,有一定的宽度。

一维可压缩黏性流动问题的解是连续、光滑的

B-2一维可压缩黏性流动问题的数值计算源程序

1.C语言源程序

//UpwindTVD_1D.c

//

//二阶迎风型TVD差分格式求解一维可压缩黏性流动问题(C语言版本)

//

#include"stdio.h"

#include"math.h"

#definegama1.4

#defineTt5.0

#defineim201//网格数

//全局变量:

doubleQ[3][im],Qold[3][im];//Q:

[rou,rou*u,E]doublerou[im],u[im],p[im],T[im],E[im],a[im];doublePr,Re,cv,cp,Ma,dx,dt;

//voidinitial()

{

doublexl,xr,x;

doubleul,Tl,ur,Tr;//进出口的u,T值inti;

dx=1.0/(im-1);

dt=1.0e-6;

Pr=0.72;

Re=50.0;

Ma=2.0;

cv=1.0/(gama*(gama-1.0)*Ma*Ma);

cp=gama*cv;

xl=0.0;

xr=1.0;

ul=1.0;

Tl=1.0;

ur=(2.0/(gama-1.0)+Ma*Ma)/((gama+1.0)/(gama-1.0)*Ma*

Ma);

Tr=2.0*gama/(gama+1.0)*Ma*Ma-(gama-1.0)/(gama+1.0);

Tr=Tr*((gama-1.0)/(gama+1.0)+2.0/(gama+1.0)/Ma/Ma);

for(i=0;i<=im-1;i++)

{

x=i*dx;

rou[i]=1.0;

u[i]=(x-xl)/(xr-xl)*(ur-ul)+ul;

T[i]=(x-xl)/(xr-xl)*(Tr-Tl)+Tl;

p[i]=rou[i]*T[i]/(gama*Ma*Ma);

E[i]=rou[i]*(cv*T[i]+0.5*u[i]*u[i]);

}

for(i=0;i

{

Q[0][i]=rou[i];

Q[1][i]=rou[i]*u[i];

Q[2][i]=E[i];

}

}

//doubleqz(doublex)

{

doubleresult;

if(fabs(x)>0.1)

{

result=fabs(x);

}

else

{

result=(x*x/0.1+0.1)/2.0;

}

returnresult;

}

//

doubleminmod(doublex,doubley)

{

doubleresult;

if(x*y<=0.0)

{

result=0.0;

}

elseif(fabs(x)>fabs(y))

{

result=y;

}

elseif(fabs(x)

{

result=x;

}

returnresult;

}

voidQ2U()

{

inti;

for(i=0;i

{

rou[i]=Q[0][i];

u[i]=Q[1][i]/rou[i];

E[i]=Q[2][i];

T[i]=(E[i]/rou[i]-0.5*u[i]*u[i])/cv;

p[i]=rou[i]*T[i]/(gama*Ma*Ma);a[i]=sqrt(T[i])/Ma;

}

}

//voidUpwindTVD_1D_Solver()

{

inti,l,k;

doubledq[3][im],lamda[3][im],sigma[3][im],f[3][im];doublefl[3],fwave[3][im],fr[3],g[3][im],Gv[3][im];doublealfa[3][im],beta[3][im],Rn[3][3][im],R[3][3][im];

doubleut,at;//临时变量

Q2U();

for(i=0;i

f[0][i]=rou[i]*u[i];

f[1][i]=rou[i]*u[i]*u[i]+p[i];

f[2][i]=u[i]*(E[i]+p[i]);

}

for(i=0;i<=im-2;i++)

{

lamda[0][i]=(u[i]+u[i+1])/2.0;

lamda[1][i]=(u[i]-a[i]+u[i+1]-a[i+1])/2.0;

lamda[2][i]=(u[i]+a[i]+u[i+1]+a[i+1])/2.0;

}

for(i=0;i<=im-2;i++)

for(l=0;l<=2;l++)

{

dq[l][i]=Q[l][i+1]-Q[l][i];

sigma[l][i]=qz(lamda[l][i])/2.0;

}

//计算左右特征向量

for(i=0;i<=im-2;i++)

{

ut=(u[i]+u[i+1])/2.0;

at=(a[i]+a[i+1])/2.0;

R[0][0][i]=1.0;

R[0][1][i]=1.0;

R[0][2][i]=1.0;

R[1][0][i]=ut;

R[1][1][i]=ut-at;

R[1][2][i]=ut+at;

R[2][0][i]=ut*ut/2.0;

R[2][1][i]=at*at/(gama-1.0)+ut*ut/2.0-ut*at;

R[2][2][i]=at*at/(gama-1.0)+ut*ut/2.0+ut*at;

Rn[0][0][i]=1.0-(gama-1.0)*ut*ut/2.0/at/at;

Rn[0][1][i]=(gama-1.0)*ut/at/at;

Rn[0][2][i]=-(gama-1.0)/at/at;

Rn[1][0][i]=ut/2.0/at+(gama-1.0)*ut*ut/4.0/at/at;

Rn[1][1][i]=-(gama-1.0)*ut/2./at/at-1.0/2.0/at;

Rn[1][2][i]=(gama-1.0)/2.0/at/at;

Rn[2][0][i]=-ut/2.0/at+(gama-1.0)*ut*ut/4.0/at/at;

Rn[2][1][i]=(1.0-gama)*ut/2./at/at+1.0/2.0/at;

Rn[2][2][i]=(gama-1.0)/2./at/at;

}

for(i=0;i<=im-1;i++)

for(l=0;l<=2;l++)

{

alfa[l][i]=0.0;

//计算alfa

for(i=0;i<=im-2;i++)

for(l=0;l<=2;l++)

for(k=0;k<=2;k++)

{alfa[l][i]=alfa[l][i]+Rn[l][k][i]*dq[k][i];

}

//计算g

for(i=1;i<=im-2;i++)

for(l=0;l<=2;l++)

{

g[l][i]=minmod(sigma[l][i]*alfa[l][i],sigma[l][i-1]*

alfa[l][i-1]);

}

for(i=0;i<=im-2;i++)

for(l=0;l<=2;l++)

{

if(alfa[l][i]!

=0.0)

}

else

{

beta[l][i]=0.0;

}

}

for(i=0;i<=im-2;i++)

for(l=0;l<=2;l++)

for(k=0;k<=2;k++)

{

fwave[l][i]=fwave[l][i]+0.5*R[l][k][i]*(g[k][i]+g[k]

[i+1]

-qz(lamda[k][i]+beta[k][i])*alfa[k][i]);

}

for(i=1;i<=im-2;i++)

for(l=0;l<=2;l++)

{fl[l]=0.5*(f[l][i-1]+f[l][i])+fwave[l][i-1];fr[l]=0.5*(f[l][i+1]+f[l][i])+fwave[l][i];

}

//黏性项的处理

for(i=1;i<=im-2;i++)

{

Gv[0][i]=0.0;

Gv[1][i]=(T[i]*(u[i+1]-2.*u[i]+u[i-1])+(T[i+1]-T[i-1])

*(u[i+1]-u[i-1])/4.)*4./3./Re/(dx*dx);

Gv[2][i]=((T[i]*(u[i+1]-2.*u[i]+u[i-1])*u[i]+(T[i+1]-T[i-1])*

(u[i+1]-u[i-1])*u[i]/4.+T[i]*(u[i+1]-u[i-1])

*(u[i+1]-u[i-1])/4.)*4./3.+(T[i]*(T[i+1]-2.*T[i]+T[i-1])

+(T[i+1]-T[i-1])*(T[i+1]-T[i-1])/4.)*cp/Pr)/Re/(dx*dx);

}for(i=1;i<=im-2;i++)for(l=0;l<=2;l++)

Q[l][i]=Q[l][i]+Gv[l][i]*dt;

}

//边界条件

Q[0][im-1]=Q[0][im-2];

Q[1][im-1]=Q[0][im-1]*u[im-1];

Q[2][im-1]=Q[0][im-1]*(cv*T[im-1]+0.5*u[im-1]*u[im-1]);

}

//doubleerror(doubleQ1[3][im],doubleQ2[3][im])

{

inti,l;

doubleerr,ddu;

err=1.0e-10;

for(i=0;i

for(l=0;l<3;l++)

{

if(Q2[l][i]!

=0.0)

{

ddu=fabs((Q2[l][i]-Q1[l][i])/Q2[l][i]);

}

else

{

ddu=fabs(Q2[l][i]-Q1[l][i]);

}

if(err

}

returnerr;

}

//voidoutput()

{

doublex,rou1,u1,E1,p1,T1;//临时变量

inti;

FILE*fp;

fp=fopen("result.dat","w");

fprintf(fp,"variables=x,rou,u,p,e\n");

for(i=0;i

{

x=i*dx;

rou1=Q[0][i];

u1=Q[1][i]/rou1;

E1=Q[2][i];

T1=(E1/rou1-0.5*u1*u1)/cv;

p1=rou1*T1/(gama*Ma*Ma);

fprintf(fp,"%15.8e%15.8e%15.8e%15.8e%15.8e\n",

x,rou1,u1,p1,cv*T1);

}

fclose(fp);

}

//main()

{

doublet,err;

intn,i,l;

initial();

t=0.0;

n=0;

err=1.0e-7;

while(t1.0e-8)

t=t+dt;

n=n+1;

for(i=0;i

for(l=0;l<3;l++)

{

Qold[l][i]=Q[l][i];

}

UpwindTVD_1D_Solver();

err=error(Q,Qold);

if(n/10000*10000==n)

{

printf("%10dtime:

%16.9eerror:

%16.9e\n",n,t,err);

output();

}

}

output();

printf("Programend!

\n");

}

2.Fortran77语言源程序

!

UpwindTVD_1D.f

!

!

二阶迎风型TVD差分格式求解一维可压缩黏性流动问题!

(Fortran77语言版本)

!

programUPWIND_TVD_1D

implicitreal*8(a-h,o-z)parameter(mx=201,Tt=5.0)

dimensionQ(3,mx),Qold(3,mx)!

Q:

[rou,rou*u,E]dimensionrou(mx),u(mx),p(mx),T(mx),E(mx)

real*8Ma

common/para_def/Sf,Re,Ma,pr,gama,cp,cv,dx,dt,imim=mx

callInitialize(Q)

time=0.0

n=0

1n=n+1

time=time+dt

doi=1,im

dol=1,3

Qold(l,i)=Q(l,i)

enddo

enddo

callUpwindTVD_1D_Solver(Q)write(*,20)n,time,error(Q,Qold)

callOutPut(Q)

endif

20format(1x,i10,'time=',e16.9,'error=',e16.9,1x).and.

goto1

endif

callOutPut(Q)

write(*,*)'Programend!

'

end

!

subroutineInitialize(Q)

implicitreal*8(a-h,o-z)

real*8Ma

common/para_def/Sf,Re,Ma,pr,gama,cp,cv,dx,dt,imdimensionrou(im),u(im),p(im),T(im),E(im),Q(3,im)

Re=50.0!

雷诺数

Ma=2.0!

马赫数

pr=0.72!

普朗特数

gama=1.4!

气体常数

cv=1.0/(gama*(gama-1.0)*Ma**2)!

比定容热容

cp=gama*cv!

比定压热容

dt=1.0e-6

dx=1.0/(1.0*(im-1))!

空间步长

xl=0.0

xr=1.0

rou0=1.0

u0=1.0

T0=1.0

temp=(gama+1.)/(gama-1.)

u1=(2./(gama-1.)+Ma**2)/(temp*Ma**2)

T1=(2.*gama/(gama+1)*Ma**2-1./temp)*(1./temp+2./(gam

a+1.)/Ma**2)

doi=1,im

rou(i)=rou0

xi=(i-1)*dx

u(i)=(xi-xl)/(xr-xl)*(u1-u0)+u0

T(i)=(xi-xl)/(xr-xl)*(T1-T0)+T0

P(i)=rou(i)*T(i)/(gama*Ma**2)

E(i)=rou(i)*(cv*T(i)+0.5*u(i)**2)

enddo

doi=1,im

Q(1,i)=rou(i)

Q(2,i)=rou(i)*u(i)

Q(3,i)=E(i)

enddo

end

!

subroutineQ2U(Q,rou,u,p,T,E,a)implicitreal*8(a-h,o-z)real*8Macommon/para_def/Sf,Re,Ma,pr,gama,cp,cv,dx,dt,imdimensionQ(3,im),rou(im),u(im)dimensionp(im),T(im),E(im),a(im)doi=1,imrou(i)=Q(1,i)u(i)=Q(2,i)/Q(1,i)

E(i)=Q(3,i)T(i)=(E(i)/rou(i)-0.5*u(i)**2)/cvp(i)=rou(i)*T(i)/(gama*Ma**2)a(i)=dsqrt(T(i))/Maenddo

end

!

subroutineUpwindTVD_1D_Solver(Q)

implicitreal*8(a-h,o-z)

real*8Ma,lamda,minmodcommon/para_def/Sf,Re,Ma,pr,gama,cp,cv,dx,dt,imdimensionQ(3,im),Qold(3,im),dq(3,im),rou(im),u(im),p(im),T(im)

dimensionE(im),a(im),f(3,im),fwave(3,im),fr(3),fl(3)dimensionGv(3,im),g(3,im),lamda(3,im),sigma(3,im)dimensionalfa(3,im),Rn(3,3,im),R(3,3,im),beta(3,im)callQ2U(Q,rou,u,p,T,E,a)

doi=1,im

f(1,i)=rou(i)*u(i)

f(2,i)=rou(i)*u(i)**2+p(i)

f(3,i)=u(i)*(E(i)+p(i))

enddo

doi=1,im-1

lamda(1,i)=(u(i)+u(i+1))/2.0

lamda(2,i)=(u(i)-a(i)+u(i+1)-a(i+1))/2.0

lamda(3,i)=(u(i)+a(i)+u(i+1)+a(i+1))/2.0

enddo

doi=1,im-1

dol=1,3

dq(l,i)=(Q(l,i+1)-Q(l,i))sigma(l,i)=qz(lamda(l,i))/2.0!

定常情况enddo

enddo

doi=1,im-1

ut=(u(i)+u(i+1))/2.0!

ut临时变量

at=(a(i)+a(i+1))/2.0!

at临时变量

R(1,1,i)=1.0

R(1,2,i)=1.0

R(1,3,i)=1.0

R(2,1,i)=ut

R(2,2,i)=ut-at

R(2,3,i)=ut+at

R(3,1,i)=ut*ut/2.0

R(3,2,i)=at*at/(gama-1.0)+ut*ut/2.0-ut*atR(3,3,i)=at*at/(gama-1.0)+ut*ut/2.0+ut*atRn(1,1,i)=1.0-(gama-1.0)*ut*ut/2.0/at/atRn(1,2,i)=(gama-1.0)*ut/at/at

Rn(1,3,i)=-(gama-1.0)/at/at

Rn(2,1,i)=ut/2.0/at+(gama-1.0)*ut*ut/4.0/at/at

Rn(2,2,i)=-(gama-1.0)*ut/2./at/at-1.0/2.0/at

Rn(2,3,i)=(gam

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 军事政治

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1