- 积分
- 4
- 注册时间
- 2009-11-30
- 仿真币
-
- 最后登录
- 1970-1-1
|
本帖最后由 scott198510 于 2013-10-8 22:34 编辑
- % A program of incompressible Couette flow in 2D
- % based on pressure correction (SIMPLE) algorithm.
- % Written by scott , Oct, 2013
- % Based on John D. Anderson, JR., section 9.4, Chapter 9, In
- % Computational Fluid Dynamics, The Basics with Applications,McGraw-Hill, 2002, 4
- clc;clear all; close all;
- nx=21;%x方向网格数
- ny=11;%y方向网格数
- nstop=1000;%迭代步数
- x=zeros(nx,1);%矩阵预分配
- y=zeros(ny,1);%矩阵预分配
- p=zeros(nx,ny);%矩阵预分配
- u=zeros(nx+1,ny);%矩阵预分配
- v=zeros(nx+2,ny+1);%矩阵预分配
- ru=zeros(nx+1,ny);%矩阵预分配
- rv=zeros(nx+2,ny+1);%矩阵预分配
- ux=zeros(nx+1,ny);%矩阵预分配
- vx=zeros(nx+2,ny+1);%矩阵预分配
- px=zeros(nx,ny);%矩阵预分配
- rux=zeros(nx+1,ny);%矩阵预分配
- rvx=zeros(nx+2,ny+1);%矩阵预分配
- d=zeros(nx,ny);%矩阵预分配
- ppm=zeros(nx,ny);%矩阵预分配
- ppb=zeros(nx,ny);%矩阵预分配
- pp=zeros(nx,ny);%矩阵预分配
- cri=zeros(nx,ny);%矩阵预分配
- % initial parameter
- xl=0.5; %x方向长度 单位英尺
- yl=0.01;%y方向长度 单位英尺
- dx=xl/(nx-1); %x方向单位长度
- dy=yl/(ny-1);%y方向单位长度
- dt=0.001;%单位时间
- re=63.6;%雷诺数
- r=0.002377;%密度ρ
- vis=yl*1*r/re;%粘性系数
- fct1=0.5;
- fct2=0.1;
- for i=1:nx
- x(i)=(i-1)*xl/(nx-1);%x方向区域网格化
- end
- for j=1:ny
- y(j)=(j-1)*yl/(ny-1);%x方向区域网格化
- end
- for i=1:nx+1 %u迭代区域 x:1-22, y:1-11
- for j=1:ny
- ux(i,j)=0.0;%u*初始化
- u(i,j)=0.0; %u初始化
- if (j==ny) %u的上边界位置特定值
- u(i,j)=1.0; %u=1
- rux(i,j)=r*ux(i,j);%ρu*
- end
- end
- end
- for i=1:nx+2 %u迭代区域 x:1-23, y:1-12
- for j=1:ny+1
- vx(i,j)=0.0; %v*初始化
- v(i,j)=0.0; %v初始化
- if (i==15&&j==5) %设置特殊点(15,5)速度
- vx(i,j)=0.5;
- rvx(i,j)=r*vx(i,j);%ρv*
- end
- end
- end
- for i=1:nx %压力场p迭代区域 x:1-21, y:1-11
- for j=1:ny
- px(i,j)=0.0; %p*初始化
- p(i,j)=0.0; %p初始化
- pp(i,j)=0.0; % p'初始化
- end
- end
- for nstep=1:nstop; %迭代计算部分
- % Pressure correction (SIMPLE) algorithm
- % step 1. solve at n+1 step : ρu* and ρv*
- % 1. for ru and u
- for i=1:nx-1 %以(5,3)作为中心点 即(i,j)对应(5,3)
- for j=2:ny-1
- vb=0.5*(v(i+1,j+1)+v(i+2,j+1));%v平
- vbb=0.5*(v(i+1,j)+v(i+2,j));%v2平
- ruu53=r*u(i+2,j)*u(i+2,j);%(ρu^2)53
- ruu33=r*u(i,j)*u(i,j);%(ρu^2)33
- ruv44=r*u(i+1,j+1)*vb; %(ρuvb)44
- ruv42=r*u(i+1,j-1)*vbb;%(ρuvbb)42
- uu1=(u(i+2,j)-2*u(i+1,j)+u(i,j))/dx/dx;%u(i+2,j):u53,u(i+1,j):u43,u(i,j):u33
- uu2=(u(i+1,j+1)-2*u(i+1,j)+u(i+1,j-1))/dy/dy;%u(i+1,j+1):u44,u(i+1,j):u43,u(i+1,j-1):u42
- ax=-((ruu53-ruu33)/2/dx+(ruv44-ruv42)/2/dy)+vis*(uu1+uu2);%A*整项
- rux(i+1,j)=rux(i+1,j)+ax*dt-dt/dx*(px(i+1,j)-px(i,j));%(ρu*)43 in n+1 step 对应式子(9.58)
- ux(i+1,j)=rux(i+1,j)/r; %(u*)43 in n+1 step
- end
- end
- for j=2:ny-1
- ux(1,j)=ux(2,j);%上边界赋值 u1j*=u2j*
- ux(nx+1,j)=ux(nx,j);%下边界赋值 u22j*=u21j*
- end
- % 2. for rv and v
- for i=1:nx %以(3,3)作为中心点 即(i,j)对应(3,3)
- for j=1:ny-1
- ub=0.5*(u(i+1,j)+u(i+1,j+1));%u平
- ubb=0.5*(u(i,j)+u(i,j+1)); %u2平
- rvv45=r*v(i+1,j+2)*v(i+1,j+2); %(ρv^2)45
- rvv43=r*v(i+1,j)*v(i+1,j); %(ρv^2)43
- rvu54=r*v(i+2,j+1)*ub; %(ρvub)54
- rvu34=r*v(i,j+1)*ubb; %(ρvubb)34
- vv1=(v(i+2,j+1)-2*v(i+1,j+1)+v(i,j+1))/dx/dx;%u(i+2,j+1):v54,u(i+1,j+1):v44,u(i,j+1):v34
- vv2=(v(i+1,j+2)-2*v(i+1,j+1)+v(i+1,j))/dy/dy;%u(i+1,j+2):v45,u(i+1,j+1):v44,v(i,j+1):v43
- bx=-((rvv45-rvv43)/2/dy+(rvu54-rvu34)/2/dx)+vis*(vv1+vv2);%B*整项
- rvx(i+1,j+1)=rvx(i+1,j+1)+bx*dt-dt/dy*(px(i,j+1)-px(i,j));%(ρv*)44 in n+1 step 对应式子(9.59)
- vx(i+1,j+1)=rvx(i+1,j+1)/r; %(v*)44 in n+1 step
- end
- end
- for j=2:ny
- vx(nx+2,j)=vx(nx+1,j);%下边界赋值 v23j*=v22j*
- end
- % step 2. solve p' from pressure correction formula
- % by relaxation method (inner iteration)
- a=2*(dt/dx/dx+dt/dy/dy);% 对应(6.104)式子a值
- b=-dt/dx/dx; % 对应(6.104)式子b值
- c=-dt/dy/dy;% 对应(6.104)式子c值
- tiny2=0; %设定值
- for i=2:nx-1
- for j=2:ny-1
- pp(i,j)=0;
- d(i,j)=(rux(i+1,j)-rux(i,j))/dx+(rvx(i+1,j+1)-rvx(i+1,j))/dy;% 对应(6.104)式子d值
- end
- end
- for nii=1:1000
- tiny1=0;
- for i=2:nx-1
- for j=2:ny-1 %再以(3,3)作为中心点 即(i,j)对应(3,3)
- ppb(i,j)=-1/a*(b*pp(i+1,j)+b*pp(i-1,j)+c*pp(i,j+1)+c*pp(i,j-1)+d(i,j));% 式(9.60) p33'
- ppm(i,j)=pp(i,j)+fct1*(ppb(i,j)-pp(i,j));%迭代后的pp
- cri(i,j)=abs(ppm(i,j)-pp(i,j))/abs(ppm(i,j));%计算增量
- pp(i,j)=ppm(i,j);%迭代后赋值
- if (cri(i,j)>=tiny1)
- tiny1=cri(i,j);
- end
- if (abs(d(i,j))>=tiny2)
- tiny2=d(i,j);
- end
- end
- end
- if (tiny1<=0.0001); break,end %小于设定值时,即认为已经收敛
- end
- % step 3. calculate p at n+1 step
- for i=2:nx-1
- for j=2:ny-1
- p(i,j)=px(i,j)+fct2*pp(i,j);%对应 式子(6.106)
- end
- end
- % step 4. calculate u and v at n+1 step
- for i=1:nx-1
- for j=1:ny
- u(i+1,j)=ux(i+1,j)-dt/dx/r*(pp(i+1,j)-pp(i,j)); % u更新
- end
- end
- for i=1:nx
- for j=1:ny-1
- v(i+1,j+1)=vx(i+1,j+1)-dt/dy/r*(pp(i,j+1)-pp(i,j));% v更新
- end
- end
- % update boundary conditions
- for i=1:nx
- pp(i,ny)=0;
- pp(i,1)=0;
- end
- for i=1:nx+1
- u(i,ny)=1;
- u(i,1)=0;
- end
- for i=1:nx+2
- v(i,ny+1)=0;
- v(i,1)=0;
- end
- for j=1:ny
- pp(1,j)=0;
- pp(nx,j)=0;
- end
- for j=1:ny
- u(1,j)=u(2,j);
- u(nx+1,j)=u(nx,j);
- end
- for j=1:ny+1
- v(1,j)=0;
- v(nx+2,j)=v(nx+1,j);
- end
- % step 5. check the primary iteration
- for i=2:nx-1
- for j=2:ny-1
- px(i,j)=p(i,j);
- end
- end
- end
- figure,surf(p) % pressure distribution in cavity
- figure,contour(p,15) % pressure distribution in cavity
- figure,surf(u) % u component of velocity
- figure,contour(u,15) %u component of velocity
- figure,surf(v) %v component of velocity
- figure,contour(v,15)%v component of velocity</P>
- set(gcf,'color','w');
复制代码 SIMPLE 算法在不可压缩流场中应用广泛,看到有不少做这方面的开发的,附上 John D. Anderson 英文版计算流体力学,
section 9.4, Chapter 9,采用SIMPLE 算法的算例的程序,程序采用matlab语言编写,属原创。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|