一、问题:方腔驱动流
边界条件:
二、建立交错网格
三、边界条件的处理
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 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 |
感谢西南交通大学力学与工程学院陈浩老师对本程序的指导