一维对流扩散问题求解.docx
《一维对流扩散问题求解.docx》由会员分享,可在线阅读,更多相关《一维对流扩散问题求解.docx(37页珍藏版)》请在冰豆网上搜索。
一维对流扩散问题求解
Subjects:
Aproperty
istransportedbymeansofconvectionanddiffusionthroughtheone-dimensionaldomain.Thegoverningequationis
;boundaryconditionsare
atx=0and
atx=L.Usingfiveequallyspacedcellsandthecentraldifferencingschemeforconvectionanddiffusioncalculatethedistributionof
asafunctionofxfor
(i)Case1:
u=0.1m/s,
(ii)Case2:
Case1:
u=2.5m/s,andcomparetheresultswiththeanalyticalsolution
.
(iii)Case3:
recalculatethesolutionforu=2.5m/swith20gridnodesandcomparetheresultswiththeanalyticalsolution,thefollowingdateapply:
lengthL=1.0m,
.
Solution:
Programminglanguage:
Filename:
二维稳态导热模拟.cpp
Compilesoftware:
MicrosoftVisualC++6.0
Code:
#include
#include
#include
usingnamespacestd;
#defineGn15//网格节点数.
#defineGn220//网格节点数.
#defineP1//流体密度,单位:
kg/m/m/m.
#defineProA1//A端传递特性.
#defineProB0//B端传递特性.
//////FDD///////追赶法过程
voidTDMA1(doublea[],doubleb[],doublec[],doublef[],double*p)
{//矩阵形式
//b0c000//=f0
//a0b1c10//=f1
//...............
//00...b(N-1)c(N-2)//=f(N-1)
doubled[Gn1-1],u[Gn1],ll[Gn1-1],y[Gn1],X[Gn1];
inti;
for(i=0;i<=Gn1-2;i++)
{
d[i]=c[i];
}
u[0]=b[0];
for(i=1;i<=Gn1-1;i++)
{
ll[i-1]=a[i-1]/u[i-1];
u[i]=b[i]-ll[i-1]*c[i-1];
}
y[0]=f[0];
for(i=1;i<=Gn1-1;i++)
{
y[i]=f[i]-ll[i-1]*y[i-1];
}
X[Gn1-1]=y[Gn1-1]/u[Gn1-1];
for(i=Gn1-2;i>=0;i--)
{
X[i]=(y[i]-c[i]*X[i+1])/u[i];
}
for(i=0;i<=Gn1-1;i++)
*(p+i)=X[i];
}
voidTDMA2(doublea[],doubleb[],doublec[],doublef[],double*p)
{
doubled[Gn2-1],u[Gn2],ll[Gn2-1],y[Gn2],X[Gn2];
inti;
for(i=0;i<=Gn2-2;i++)
{
d[i]=c[i];
}
u[0]=b[0];
for(i=1;i<=Gn2-1;i++)
{
ll[i-1]=a[i-1]/u[i-1];
u[i]=b[i]-ll[i-1]*c[i-1];
}
y[0]=f[0];
for(i=1;i<=Gn2-1;i++)
{
y[i]=f[i]-ll[i-1]*y[i-1];
}
X[Gn2-1]=y[Gn2-1]/u[Gn2-1];
for(i=Gn2-2;i>=0;i--)
{
X[i]=(y[i]-c[i]*X[i+1])/u[i];
}
for(i=0;i<=Gn2-1;i++)
*(p+i)=X[i];
}
voidmain()
{
doubleu,L=1,T=0.1,min_x,F,D,aW,aE,m,n;
doublea[Gn2],b[Gn2],c[Gn2],f[Gn2],X[Gn2];
intserial_number1,serial_number2,i;
printf("Therearefourmethodstosolvethesecases:
\n");
printf("1.Thecentraldifferencingscheme.\n");
printf("2.Theupwinddifferencingscheme.\n");
printf("3.Thehybriddifferencingscheme.\n");
printf("4.Thepower-lawscheme.\n");
printf("Pleaseinputtheserialnumberofthemethodwhichyouwanttouse:
");
scanf("%d",&serial_number1);
printf("Therearethreecasesinthissubject:
\n");
printf("1.u=0.1m/swith5gridnodes.\n");
printf("2.u=2.5m/swith5gridnodes.\n");
printf("3.u=2.5m/swith20gridnodes.\n");
printf("Pleaseinputtheserialnumberofthecasewhichyouwanttosolve:
");
scanf("%d",&serial_number2);
if(serial_number1==1)//中心差分法
{
if(serial_number2==1)//第一题开始
{
u=0.1;
min_x=L/Gn1;
F=P*u;
D=T/min_x;
aW=D+F/2;
aE=D-F/2;
m=2*D+F;
n=2*D-F;
for(i=0;i{
a[i]=-aW;
c[i]=-aE;
}
for(i=0;i{
if(i==0)
{
b[i]=-c[i]+m;
f[i]=m*ProA;
}
elseif(i==Gn1-1)
{
b[i]=-a[i-1]+n;
f[i]=n*ProB;
}
else
{
b[i]=-c[i]-a[i-1];
f[i]=0;
}
}
voidTDMA1(doublea[],doubleb[],doublec[],doublef[],double*p);
TDMA1(a,b,c,f,X);
printf("Result:
X[");
printf("%d",Gn1);
printf("]=\n");
for(i=0;i<=Gn1-1;i++)
{
printf("");
printf("%lf\n",X[i]);
}
}
elseif(serial_number2==2)//第二题开始
{
u=2.5;
min_x=L/Gn1;
F=P*u;
D=T/min_x;
aW=D+F/2;
aE=D-F/2;
m=2*D+F;
n=2*D-F;
for(i=0;ia[i]=-aW,
c[i]=-aE;
for(i=0;i{
if(i==0)
{
b[i]=-c[i]+m;
f[i]=m*ProA;
}
elseif(i==Gn1-1)
{
b[i]=-a[i-1]+n;
f[i]=n*ProB;
}
else
{
b[i]=-c[i]-a[i-1];
f[i]=0;
}
}
TDMA1(a,b,c,f,X);
printf("Result:
X[");
printf("%d",Gn1);
printf("]=\n");
for(i=0;i<=Gn1-1;i++)
{
printf("");
printf("%lf\n",X[i]);
}
}
elseif(serial_number2==3)//第三题开始
{
u=2.5;
min_x=L/Gn2;
F=P*u;
D=T/min_x;
aW=D+F/2;
aE=D-F/2;
m=2*D+F;
n=2*D-F;
for(i=0;i{
a[i]=0;
c[i]=0;
}
for(i=0;i{
b[i]=0;
f[i]=0;
}
for(i=0;ia[i]=-aW;
c[i]=-aE;
for(i=0;i{
if(i==0)
{
b[i]=-c[i]+m;
f[i]=m*ProA;
}
elseif(i==Gn2-1)
{
b[i]=-a[i-1]+n;
f[i]=n*ProB;
}
else
{
b[i]=-c[i]-a[i-1];
f[i]=0;
}
}
TDMA2(a,b,c,f,X);
printf("Result:
X[");
printf("%d",Gn2);
printf("]=\n");
for(i=0;i<=Gn2-1;i++)
{
printf("");
printf("%lf\n",X[i]);
}
}
else
printf("NOcaseisselected,pleasecheckouttheinputserialnumber.");
}
elseif(serial_number1==2)//一阶迎风方法
{
if(serial_number2==1)//第一题开始
{
u=0.1;
min_x=L/Gn1;
F=P*u;
D=T/min_x;
aW=D+F;
aE=D;
m=2*D+F;
n=2*D;
for(i=0;i{
a[i]=0;
c[i]=0;
}
for(i=0;i{
b[i]=0;
f[i]=0;
}
for(i=0;i{
a[i]=-aW;
c[i]=-aE;
}
for(i=0;i{
if(i==0)
{
b[i]=-c[i]+m;
f[i]=m*ProA;
}
elseif(i==Gn1-1)
{
b[i]=-a[i-1]+n;
f[i]=n*ProB;
}
else
{
b[i]=-c[i]-a[i-1];
f[i]=0;
}
}
TDMA1(a,b,c,f,X);
printf("Result:
X[");
printf("%d",Gn1);
printf("]=\n");
for(i=0;i<=Gn1-1;i++)
{
printf("");
printf("%lf\n",X[i]);
}
}
elseif(serial_number2==2)//第二题开始
{
u=2.5;
min_x=L/Gn1;
F=P*u;
D=T/min_x;
aW=D+F;
aE=D;
m=2*D+F;
n=2*D;
for(i=0;i{
a[i]=-aW;
c[i]=-aE;
}
for(i=0;i{
if(i==0)
{
b[i]=-c[i]+m;
f[i]=m*ProA;
}
elseif(i==Gn1-1)
{
b[i]=-a[i-1]+n;
f[i]=n*ProB;
}
else
{
b[i]=-c[i]-a[i-1];
f[i]=0;
}
}
TDMA1(a,b,c,f,X);
printf("Result:
X[");
printf("%d",Gn1);
printf("]=\n");
for(i=0;i<=Gn1-1;i++)
{
printf("");
printf("%lf\n",X[i]);
}
}
elseif(serial_number2==3)//第三题开始
{
u=2.5;
min_x=L/Gn2;
F=P*u;
D=T/min_x;
aW=D+F;
aE=D;
m=2*D+F;
n=2*D;
for(i=0;i{
a[i]=0;
c[i]=0;
}
for(i=0;i{
b[i]=0;
f[i]=0;
}
for(i=0;i{
a[i]=-aW;
c[i]=-aE;
}
for(i=0;i{
if(i==0)
{
b[i]=-c[i]+m;
f[i]=m*ProA;
}
elseif(i==Gn2-1)
{
b[i]=-a[i-1]+n;
f[i]=n*ProB;
}
else
{
b[i]=-c[i]-a[i-1];
f[i]=0;
}
}
TDMA2(a,b,c,f,X);
printf("Result:
X[");
printf("%d",Gn2);
printf("]=\n");
for(i=0;i<=Gn2-1;i++)
{
printf("");
printf("%lf\n",X[i]);
}
}
else
printf("Nocaseisselected,pleasecheckouttheinputserialnumber.\n");
}
elseif(serial_number1==3)//混合方法
{
if(serial_number2==1)//第一题开始
{
u=0.1;
min_x=L/Gn1;
F=P*u;
D=T/min_x;
aW=F;
aE=0;
m=2*D+F;
n=2*D;
for(i=0;i{
a[i]=-aW;
c[i]=-aE;
}
for(i=0;i{
if(i==0)
{
b[i]=-c[i]+m;
f[i]=m*ProA;
}
elseif(i==Gn1-1)
{
b[i]=-a[i-1]+n;
f[i]=n*ProB;
}
else
{
b[i]=-c[i]-a[i-1];
f[i]=0;
}
}
TDMA1(a,b,c,f,X);
printf("Result:
X[");
printf("%d",Gn1);
printf("]=\n");
for(i=0;i<=Gn1-1;i++)
{
printf("");
printf("%lf\n",X[i]);
}
}
elseif(serial_number2==2)//第二题开始
{
u=2.5;
min_x=L/Gn1;
F=P*u;
D=T/min_x;
aW=F;
aE=0;
m=2*D+F;
n=2*D;
for(i=0;i{
a[i]=-aW;
c[i]=-aE;
}
for(i=0;i{
if(i==0)
{
b[i]=-c[i]+m;
f[i]=m*ProA;
}
elseif(i==Gn1-1)
{
b[i]=-a[i-1]+n;
f[i]=n*ProB;
}
else
{
b[i]=-c[i]-a[i-1];
f[i]=0;
}
}
TDMA1(a,b,c,f,X);
printf("Result:
X[");
printf("%d",Gn1);
printf("]=\n");
for(i=0;i<=Gn1-1;i++)
{
printf("");
printf("%lf\n",X[i]);
}
}
elseif(serial_number2==3)//第三题开始
{
u=2.5;
min_x=L/Gn2;
F=P*u;
D=T/min_x;
aW=F;
aE=0;
m=2*D+F;
n=2*D;
for(i=0;i{
a[i]=-aW;
c[i]=-aE;
}
for(i=0;i{
if(i==0)
{
b[i]=-c[i]+m;
f[i]=m*ProA;
}
elseif(i==Gn2-1)
{
b[i]=-a[i-1]+n;
f[i]=n*ProB;
}
else
{
b[i]=-c[i]-a[i-1];
f[i]=0;
}
}
TDMA2(a,b,c,f,X);
printf("Result:
X[");
printf("%d",Gn2);
printf("]=\n");
for(i=0;i<=Gn2-1;i++)
{
printf("");
printf("%lf\n",X[i]);
}
}
else
printf("Nocaseisselected,pleasecheckouttheinputserialnumber.\n");
}
elseif(serial_number1==4)//指数方法
{
if(serial_number2==1)//第一题开始
{
u=0.1;
min_x=L/Gn1;
F=P*u;
D=T/min_x;
aW=0.03125*D+F;