方腔驱动流的simple算法(附matlab与c++程序)

一、问题:方腔驱动流

边界条件:

二、建立交错网格

三、边界条件的处理

U与V的边界条件看成虚拟节点与内部一层节点之和的一半等于零,即虚拟节点与内部一层节点互为相反数。

P的边界条件在网格中表现为第一层与第二层(或最后一层与倒数第二层)相等

四、有限差分

将当前时刻假设的U与V代入差分方程(1)与(2),求得当前时刻的U*与V*。

(其中i是横坐标,j是纵坐标)

(1)

(2)


五、修正

将U*与V*代入修正方程(3)中,得到P’,程序中利用高斯-塞德尔迭代法来求得方程组

(3)

将P’代入P=P*+0.1×P’中,得到当前时刻准确的P值。

再将P’代入公式(4)得到当前时刻准确的U与V。

(4)

再将当前时刻准确的U与V以及修正完毕的P代入差分方程(1)就可以得到下一时刻的U与V

然后开始循环

六、MATLAB代码

%写在前面:matlab一般无法吃满cpu,因此运算时间较长,可以通过暂停程序查看参数c来看已经迭代次数

m=101;

n=101;%修改除个位数外的位数来修改网格数的数量

P=zeros(m,n);

PX=P;

PP=P;

U=zeros(m,n+1);

V=zeros(m+1,n);

U(1,:)=1;%U的顶盖

VS=V;

US=U;%US是U星

RE=400;%高雷诺数建议增加网格数量进行运算

x=1/(m-1);

y=1/(n-1);

t=0.005;%△xyt的大小,△t<=△x收敛的可能性大,若e=NAN需将△t调小,例如Re=5000时可以调成0.001

e=1;

e1=1;%e1为d的最大值

e2=1;%e2用于选取各个d的值

e3=0;%e3用来保护e1

c=0;%外部迭代次数

l=0;%内部迭代次数

S1=P;%将U从交错网格上回归到P所在的原网格上

S2=P; %将V从交错网格上回归到P所在的原网格上

q=0;%总的内部循环次数

while  c<30000 %%%重要部分!!重要部分!!重要部分!!重要部分!!重要部分!!重要部分!!c<30000是流场收敛的大体迭代次数,已经可以满足大部分情况,也可以自己修改迭代次数缩短运行时间。若对于精度有极高的要求,可以将c<30000改为e1>0.0001,注意,这将消耗大量的运算时间。

     for a=2:n-1

    for b=2:m

  US(a,b)=U(a,b)-t*((U(a,b+1)^2-U(a,b-1)^2)/(2*x)+(U(a+1,b)*(V(a+1,b-1)+V(a+1,b))-U(a-1,b)*(V(a,b-1)+V(a,b)))/(4*y))+(t/RE)*((U(a,b+1)-2*U(a,b)+U(a,b-1))/(x*x)+(U(a+1,b)-2*U(a,b)+U(a-1,b))/(y*y))-(P(a,b)-P(a,b-1))*(t/x);

  VS(b,a)=V(b,a)-t*((V(b+1,a)^2-V(b-1,a)^2)/(2*y)+(V(b,a+1)*(U(b-1,a+1)+U(b,a+1))-V(b,a-1)*(U(b-1,a)+U(b,a)))/(4*x))+(t/RE)*((V(b,a+1)-2*V(b,a)+V(b,a-1))/(x*x)+(V(b+1,a)-2*V(b,a)+V(b-1,a))/(y*y))-(P(b,a)-P(b-1,a))*(t/y); 

    end

     end   %公式1与公式2

   US(:,1)=-US(:,2);

   US(:,n+1)=-US(:,n);

   VS(1,:)=-VS(2,:);

   VS(m+1,:)=-VS(m,:);

    PP=zeros(m,n);%每次内部迭代都要设置一个新的初始迭代值,于是PP于此更新

    PX=PP;

    q=q+l;%总的内部迭代次数

    l=0;

           while 1  %双while语句将无法实现套用的功能,需换成break语句

       l=l+1; %记录单次内部迭代次数     

     for d=2:n-1

    for f=2:m-1   

   PX(d,f)=1/4*(PP(d+1,f)+PP(d,f+1)+PX(d-1,f)+PX(d,f-1)-x*(US(d,f+1)-US(d,f)+VS(d+1,f)-VS(d,f))/t);%等式右边有PX为高斯-塞德尔迭代

    end

     end  %公式6-103

PX(1,:)=PX(2,:);

PX(:,1)=PX(:,2);

PX(m,:)=PX(m-1,:);

PX(:,n)=PX(:,n-1);

   e=max(max(abs(PP-PX)));%检验内部迭代收敛

   E(q+l,1)=e;%将每个误差存放于一个列向量中方便查看收敛趋势

   PP=PX;

   PX=PP;%高斯塞德尔迭代需要这一步来使第一步迭代准确

       if e<=0.0001

           break;%收敛的精度

       end

          if l>2000

           break;%收敛的迭代次数上限

          end

           end %求公式3的迭代

   P=P+0.1*PX;   %得到当前时刻的P值

P(1,:)=P(2,:);

P(:,1)=P(:,2);

P(m,:)=P(m-1,:);

P(:,n)=P(:,n-1); 

e3=0;

   for g=2:n-1

    for h=2:m-1   

   e2=abs(-US(g,h+1)/x+US(g,h)/x-VS(g+1,h)/x+VS(g,h)/x);

         if e2>e3

             e3=e2;

             e1=e2; %求d的最大值来与精度进行比较

         end

    end

   end  %公式3中d趋近于0

 for a=2:n-1

    for b=2:m   

  U(a,b)=US(a,b)-t/x*(PX(a,b)-PX(a,b-1));

  V(b,a)=VS(b,a)-t/y*(PX(b,a)-PX(b-1,a));

    end

 end %UV的修正方程即公式4

  U(:,1)=-U(:,2);

   U(:,n+1)=-U(:,n);

   V(1,:)=-V(2,:);

   V(m+1,:)=-V(m,:);

     for a=2:n-1

    for b=2:m

  US(a,b)=U(a,b)-t*((U(a,b+1)^2-U(a,b-1)^2)/(2*x)+(U(a+1,b)*(V(a+1,b-1)+V(a+1,b))-U(a-1,b)*(V(a,b-1)+V(a,b)))/(4*y))+(t/RE)*((U(a,b+1)-2*U(a,b)+U(a,b-1))/(x*x)+(U(a+1,b)-2*U(a,b)+U(a-1,b))/(y*y))-(P(a,b)-P(a,b-1))*(t/x);

  VS(b,a)=V(b,a)-t*((V(b+1,a)^2-V(b-1,a)^2)/(2*y)+(V(b,a+1)*(U(b-1,a+1)+U(b,a+1))-V(b,a-1)*(U(b-1,a)+U(b,a)))/(4*x))+(t/RE)*((V(b,a+1)-2*V(b,a)+V(b,a-1))/(x*x)+(V(b+1,a)-2*V(b,a)+V(b-1,a))/(y*y))-(P(b,a)-P(b-1,a))*(t/y); 

    end

     end  %将修正好的UVP再代入修正方程中求得下一时刻的UV

   US(:,1)=-US(:,2);

   US(:,n+1)=-US(:,n);

   VS(1,:)=-VS(2,:);

   VS(m+1,:)=-VS(m,:);

U=US;

V=VS;

c=c+1;%外部迭代次数

end

for a=1:n

    for b=1:m 

        S1(a,b)=(US(a,b)+US(a,b+1))/2;

        S2(b,a)=(VS(b,a)+VS(b+1,a))/2;%将UV从交错网格上重新放到P的网格中

    end

end %将UV化成101*101网格

xx=0:m-1;

yy=0:n-1;

[X,Y]=meshgrid(xx,yy);%生成坐标

figure
pcolor(X,Y,P);%生成压强图

shading interp%输出图像

figure

streamslice(S1,S2);%生成流线图

七、c++代码

#include<iostream>

#include <fstream>

#include<math.h>

using namespace std;

double A[2000][2000],B[2000][2000];

double A1[2000][2000],B1[2000][2000];

double P[2000][2000],P1[2000][2000];

double P2[2000][2000],P3[2000][2000];

double A2[2000][2000],B2[2000][2000];

double P4[2000][2000],P5[2000][2000];

void main()

{int i,j,n,m;

double x=0.025,y=0.025,t=0.01;/*空间、时间步长*/

double uva,uvb,vua,vub;/*存储平均速度的值*/

double Re=300,e;

double a,b,c,d;/*表示求P的系数*/

a=2*(t/(x*x)+t/(y*y));

b=-t/(x*x);

c=-t/(y*y);

for(i=1;i<=41;i++)

{for(j=1;j<=41;j++)

{P[i][j]=0;}}/*给定初始P*的值*/

for(i=1;i<=40;i++)

{for(j=1;j<=40;j++)

{A[i][j]=0;

 B[i][j]=0;}}/*给定n时刻u*,v*的值*/

for(j=0;j<=41;j++)

{B[1][j]=0;

B[41][j]=0;}

for(i=0;i<=41;i++)

{A[i][1]=0;

A[i][41]=1;}

for(j=1;j<=41;j++)

{ A[0][j]=0-A[1][j];

  A[41][j]=0-A[40][j]; }

for(i=0;i<=41;i++)

{A[i][0]=0-A[i][2];

A[i][42]=2-A[i][40];}

for(i=1;i<=41;i++)

{B[i][0]=0-B[i][1];

 B[i][41]=0-B[i][40];}

for(j=0;j<=41;j++)

{ B[0][j]=0-B[2][j];

  B[42][j]=0-B[40][j];}/*处理u*,v*的边界值*/

int a1=0,a2=0;

double f,s,sum1=0,sum2=0;

for(n=1;n<=500;n++)

{for(i=1;i<=40;i++)

  {for(j=1;j<=41;j++)

   {uva=(A[i][j+1]+A[i][j])*(B[i+1][j]+B[i][j])/4;

    uvb=(A[i][j]+A[i][j-1])*(B[i+1][j-1]+B[i][j-1])/4;

    A1[i][j]=A[i][j]-(A[i+1][j]*A[i+1][j]-A[i][j]*A[i][j])/x*t-(uva-uvb)/y*t+

                       1/Re*((A[i+1][j]-2*A[i][j]+A[i-1][j])/x/x+

              (A[i][j+1]-2*A[i][j]+A[i][j-1])/y/y)*t-t/x*(P[i+1][j]-P[i][j]);}}

 for(i=1;i<=41;i++)

  {for(j=1;j<=40;j++)

   {vua=(A[i][j+1]+A[i][j])*(B[i+1][j]+B[i][j])/4;

    vub=(A[i-1][j+1]+A[i-1][j])*(B[i-1][j]+B[i][j])/4;

    B1[i][j]=B[i][j]-(vua-vub)/x*t-(B[i][j+1]*B[i][j+1]-B[i][j]*B[i][j])/y*t+

                       1/Re*((B[i+1][j]-2*B[i][j]+B[i-1][j])/x/x+

              (B[i][j+1]-2*B[i][j]+B[i][j-1])/y/y)*t-t/y*(P[i][j+1]-P[i][j]);}}

             /*求出un+1*,vn+1**/

for(i=0;i<=42;i++)

{for(j=0;j<=42;j++)

 {P1[i][j]=0;

  P2[i][j]=0;

  P3[i][j]=0;}}/*给定初始P’的值为了迭代*/

 d=1/x*(A1[4][5]-A1[3][5])+1/y*(B1[4][5]-B1[4][4]);

 P1[4][5]=-b/a*P1[5][5]-b/a*P1[3][5]-c/a*P1[4][6]-c/a*P1[4][4]-d/a;

for(i=2;i<=40;i++)

{for(j=2;j<=40;j++)

{   if(i==2&&j!=2&&j!=40)

 {d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P4[i][j]=-b/(a+b)*P1[i+1][j]-c/(a+b)*P1[i][j+1]-c/(a+b)*P2[i][j-1]-d/(a+b);

P2[i][j]=P1[i][j]+0.2*(P4[i][j]-P1[i][j]);}

else if(i==40&&j!=2&&j!=40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P4[i][j]=-b/(a+b)*P2[i-1][j]-c/(a+b)*P1[i][j+1]-c/(a+b)*P2[i][j-1]-d/(a+b);

P2[i][j]=P1[i][j]+0.2*(P4[i][j]-P1[i][j]);}

else if(j==2&&i!=2&&i!=40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P4[i][j]=-b/(a+c)*P1[i+1][j]-b/(a+c)*P2[i-1][j]-c/(a+c)*P1[i][j+1]-d/(a+c);

P2[i][j]=P1[i][j]+0.2*(P4[i][j]-P1[i][j]);}

else if(j==40&&i!=2&&i!=40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P4[i][j]=-b/(a+c)*P1[i+1][j]-b/(a+c)*P2[i-1][j]-c/(a+c)*P2[i][j-1]-d/(a+c);

P2[i][j]=P1[i][j]+0.2*(P4[i][j]-P1[i][j]);}

else if(i==2&&j==2)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P4[i][j]=-b/(a+b+c)*P1[i+1][j]-c/(a+b+c)*P1[i][j+1]-d/(a+b+c);

P2[i][j]=P1[i][j]+0.2*(P4[i][j]-P1[i][j]);}

else if(i==2&&j==40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P4[i][j]=-b/(a+b+c)*P1[i+1][j]-c/(a+b+c)*P2[i][j-1]-d/(a+b+c);

P2[i][j]=P1[i][j]+0.2*(P4[i][j]-P1[i][j]);}

else if(i==40&&j==2)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P4[i][j]=-b/(a+b+c)*P2[i-1][j]-c/(a+b+c)*P1[i][j+1]-d/(a+b+c);

P2[i][j]=P1[i][j]+0.2*(P4[i][j]-P1[i][j]);}

else if(i==40&&j==40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P4[i][j]=-b/(a+b+c)*P2[i-1][j]-c/(a+b+c)*P2[i][j-1]-d/(a+b+c);

P2[i][j]=P1[i][j]+0.2*(P4[i][j]-P1[i][j]);}

else{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P4[i][j]=-b/a*P1[i+1][j]-b/a*P2[i-1][j]-c/a*P1[i][j+1]-c/a*P2[i][j-1]-d/a;

P2[i][j]=P1[i][j]+0.2*(P4[i][j]-P1[i][j]);}}}

for(i=2;i<=40;i++)

{for(j=2;j<=40;j++)

{     if(i==2&&j!=2&&j!=40)

 {d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P5[i][j]=-b/(a+b)*P2[i+1][j]-c/(a+b)*P2[i][j+1]-c/(a+b)*P3[i][j-1]-d/(a+b);

P3[i][j]=P2[i][j]+0.2*(P5[i][j]-P2[i][j]);}

else if(i==40&&j!=2&&j!=40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P5[i][j]=-b/(a+b)*P3[i-1][j]-c/(a+b)*P2[i][j+1]-c/(a+b)*P3[i][j-1]-d/(a+b);

P3[i][j]=P2[i][j]+0.2*(P5[i][j]-P2[i][j]);}

else if(j==2&&i!=2&&i!=40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P5[i][j]=-b/(a+c)*P2[i+1][j]-b/(a+c)*P3[i-1][j]-c/(a+c)*P2[i][j+1]-d/(a+c);

    P3[i][j]=P2[i][j]+0.2*(P5[i][j]-P2[i][j]);}

else if(j==40&&i!=2&&i!=40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P5[i][j]=-b/(a+c)*P2[i+1][j]-b/(a+c)*P3[i-1][j]-c/(a+c)*P3[i][j-1]-d/(a+c);

P3[i][j]=P2[i][j]+0.2*(P5[i][j]-P2[i][j]);}

else if(i==2&&j==2)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P5[i][j]=-b/(a+b+c)*P2[i+1][j]-c/(a+b+c)*P2[i][j+1]-d/(a+b+c);

P3[i][j]=P2[i][j]+0.2*(P5[i][j]-P2[i][j]);}

else if(i==2&&j==40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P5[i][j]=-b/(a+b+c)*P2[i+1][j]-c/(a+b+c)*P3[i][j-1]-d/(a+b+c);

P3[i][j]=P2[i][j]+0.2*(P5[i][j]-P2[i][j]);}

else if(i==40&&j==2)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P5[i][j]=-b/(a+b+c)*P3[i-1][j]-c/(a+b+c)*P2[i][j+1]-d/(a+b+c);

P3[i][j]=P2[i][j]+0.2*(P5[i][j]-P2[i][j]);}

else if(i==40&&j==40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P5[i][j]=-b/(a+b+c)*P3[i-1][j]-c/(a+b+c)*P3[i][j-1]-d/(a+b+c);

P3[i][j]=P2[i][j]+0.2*(P5[i][j]-P2[i][j]);}

else{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P5[i][j]=-b/a*P2[i+1][j]-b/a*P3[i-1][j]-c/a*P2[i][j+1]-c/a*P3[i][j-1]-d/a;

P3[i][j]=P2[i][j]+0.2*(P5[i][j]-P2[i][j]);}}}

for(m=1;m<=200;m++)

{for(i=2;i<=40;i++)

{for(j=2;j<=40;j++)

{    if(i==2&&j!=2&&j!=40)

 {d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P4[i][j]=-b/(a+b)*P3[i+1][j]-c/(a+b)*P3[i][j+1]-c/(a+b)*P2[i][j-1]-d/(a+b);

P2[i][j]=P3[i][j]+0.2*(P4[i][j]-P3[i][j]);}

else if(i==40&&j!=2&&j!=40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P4[i][j]=-b/(a+b)*P2[i-1][j]-c/(a+b)*P3[i][j+1]-c/(a+b)*P2[i][j-1]-d/(a+b);

P2[i][j]=P3[i][j]+0.2*(P4[i][j]-P3[i][j]);}

else if(j==2&&i!=2&&i!=40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P4[i][j]=-b/(a+c)*P3[i+1][j]-b/(a+c)*P2[i-1][j]-c/(a+c)*P3[i][j+1]-d/(a+c);

P2[i][j]=P3[i][j]+0.2*(P4[i][j]-P3[i][j]);}

else if(j==40&&i!=2&&i!=40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P4[i][j]=-b/(a+c)*P3[i+1][j]-b/(a+c)*P2[i-1][j]-c/(a+c)*P2[i][j-1]-d/(a+c);

P2[i][j]=P3[i][j]+0.2*(P4[i][j]-P3[i][j]);}

else if(i==2&&j==2)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P4[i][j]=-b/(a+b+c)*P3[i+1][j]-c/(a+b+c)*P3[i][j+1]-d/(a+b+c);

P2[i][j]=P3[i][j]+0.2*(P4[i][j]-P3[i][j]);}

else if(i==2&&j==40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P4[i][j]=-b/(a+b+c)*P3[i+1][j]-c/(a+b+c)*P2[i][j-1]-d/(a+b+c);

P2[i][j]=P3[i][j]+0.2*(P4[i][j]-P3[i][j]);}

else if(i==40&&j==2)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P4[i][j]=-b/(a+b+c)*P2[i-1][j]-c/(a+b+c)*P3[i][j+1]-d/(a+b+c);

P2[i][j]=P3[i][j]+0.2*(P4[i][j]-P3[i][j]);}

else if(i==40&&j==40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P4[i][j]=-b/(a+b+c)*P2[i-1][j]-c/(a+b+c)*P2[i][j-1]-d/(a+b+c);

P2[i][j]=P3[i][j]+0.2*(P4[i][j]-P3[i][j]);}

else{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P4[i][j]=-b/a*P3[i+1][j]-b/a*P2[i-1][j]-c/a*P3[i][j+1]-c/a*P2[i][j-1]-d/a;

P2[i][j]=P3[i][j]+0.2*(P4[i][j]-P3[i][j]);}}}

for(i=2;i<=40;i++)

{for(j=2;j<=40;j++)

{    if(i==2&&j!=2&&j!=40)

 {d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P5[i][j]=-b/(a+b)*P2[i+1][j]-c/(a+b)*P2[i][j+1]-c/(a+b)*P3[i][j-1]-d/(a+b);

P3[i][j]=P2[i][j]+0.2*(P5[i][j]-P2[i][j]);}

else if(i==40&&j!=2&&j!=40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P5[i][j]=-b/(a+b)*P3[i-1][j]-c/(a+b)*P2[i][j+1]-c/(a+b)*P3[i][j-1]-d/(a+b);

P3[i][j]=P2[i][j]+0.2*(P5[i][j]-P2[i][j]);}

else if(j==2&&i!=2&&i!=40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P5[i][j]=-b/(a+c)*P2[i+1][j]-b/(a+c)*P3[i-1][j]-c/(a+c)*P2[i][j+1]-d/(a+c);

    P3[i][j]=P2[i][j]+0.2*(P5[i][j]-P2[i][j]);}

else if(j==40&&i!=2&&i!=40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P5[i][j]=-b/(a+c)*P2[i+1][j]-b/(a+c)*P3[i-1][j]-c/(a+c)*P3[i][j-1]-d/(a+c);

P3[i][j]=P2[i][j]+0.2*(P5[i][j]-P2[i][j]);}

else if(i==2&&j==2)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P5[i][j]=-b/(a+b+c)*P2[i+1][j]-c/(a+b+c)*P2[i][j+1]-d/(a+b+c);

P3[i][j]=P2[i][j]+0.2*(P5[i][j]-P2[i][j]);}

else if(i==2&&j==40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P5[i][j]=-b/(a+b+c)*P2[i+1][j]-c/(a+b+c)*P3[i][j-1]-d/(a+b+c);

P3[i][j]=P2[i][j]+0.2*(P5[i][j]-P2[i][j]);}

else if(i==40&&j==2)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P5[i][j]=-b/(a+b+c)*P3[i-1][j]-c/(a+b+c)*P2[i][j+1]-d/(a+b+c);

P3[i][j]=P2[i][j]+0.2*(P5[i][j]-P2[i][j]);}

else if(i==40&&j==40)

{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P5[i][j]=-b/(a+b+c)*P3[i-1][j]-c/(a+b+c)*P3[i][j-1]-d/(a+b+c);

P3[i][j]=P2[i][j]+0.2*(P5[i][j]-P2[i][j]);}

else{d=1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]);

P5[i][j]=-b/a*P2[i+1][j]-b/a*P3[i-1][j]-c/a*P2[i][j+1]-c/a*P3[i][j-1]-d/a;

P3[i][j]=P2[i][j]+0.2*(P5[i][j]-P2[i][j]);}}}

for(i=2;i<=40;i++)

{for(j=2;j<=40;j++)

{f=abs(P3[i][j]-P2[i][j]);

sum1=sum1+f*f;}}

e=sqrt(sum1)/1521;

if(e<=0.000001&&m!=1)

{m=1001;}

sum1=0;

a1++;}/*运用松弛迭代法求出p’*/

for(i=1;i<=41;i++)

{P3[i][1]=P3[i][2];

P3[i][41]=P3[i][40];}

for(j=2;j<=40;j++)

{P3[1][j]=P3[2][j];

P3[41][j]=P3[40][j];}/*p'的边界条件处理*/

for(i=1;i<=40;i++)

{for(j=1;j<=41;j++)

{A2[i][j]=-t/x*(P3[i+1][j]-P3[i][j]);}}

for(i=1;i<=41;i++)

{for(j=1;j<=40;j++)

{B2[i][j]=-t/y*(P3[i][j+1]-P3[i][j]);}}/*求u',v'的值*/

for(i=1;i<42;i++)

{for(j=1;j<42;j++)

{P[i][j]=P[i][j]+P3[i][j];}}/*pn+1=P*+P'*/

for(i=1;i<=40;i++)

{for(j=1;j<=41;j++)

 {A[i][j]=A1[i][j]+A2[i][j];}}

for(i=1;i<=41;i++)

{for(j=1;j<=40;j++)

 {B[i][j]=B1[i][j]+B2[i][j];}}

for(j=0;j<=41;j++)

{B[1][j]=0;

 B[41][j]=0;}

for(i=0;i<=41;i++)

{A[i][1]=0;

 A[i][41]=1;}

for(j=1;j<=41;j++)

{ A[0][j]=0-A[1][j];

  A[41][j]=0-A[40][j]; }

for(i=0;i<=41;i++)

{ A[i][0]=0-A[i][2];

  A[i][42]=2-A[i][40];}

for(i=1;i<=41;i++)

{ B[i][0]=0-B[i][1];

  B[i][41]=0-B[i][40];}

for(j=0;j<=41;j++)

{ B[0][j]=0-B[2][j];

  B[42][j]=0-B[40][j];}/*处理u,v边界虚拟点*/

for(i=2;i<=40;i++)

{for(j=2;j<=40;j++)

{d=abs(1/x*(A1[i][j]-A1[i-1][j])+1/y*(B1[i][j]-B1[i][j-1]));

sum2=sum2+d*d;}}

s=sqrt(sum2)/1521;

if(s<=0.00001&&n!=1)

{n=1001;}

sum2=0;

a2++;}/*simple算法*/

cout<<e<<" "<<s<<" "<<a1<<" "<<a2;

int g=0,h=0;

string sstr= "C:\\Users\\12489\\Desktop\\re407.txt";

 ofstream fout(sstr);

for(j=1;j<=41;j++)

 {for(i=1;i<=41;i++)

{fout <<g*0.025<<" "<<h*0.025<<" "<<(A[i][j]+A[i-1][j])/2<<" " <<(B[i][j]+B[i][j-1])/2<<" "<<P[i][j]<<"\n";

  g++;

  if(g==41)

   {g=0;

     h++;}}}

fout << endl;

fout.close();} /*将数据写入文件*/

八、运算结果(上流线图下压强分布图)

RE=50    101*101    △t=0.005s

RE=400    101*101    △t=0.005s

RE=1000    201*201    △t=0.005s

RE=5000     501*501    △t=0.001s

感谢西南交通大学力学与工程学院陈浩老师对本程序的指导

  • 40
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 50
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 50
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值