本帖最后由 scott198510 于 2013-11-20 21:55 编辑
- clear all;clc;close all;
- %initialization
- nx=100;
- ny=30;
- %速度场
- u=zeros(ny+2,nx+1,3);
- v=zeros(ny+1,nx+2,3);
- %压力场
- p=zeros(ny,nx,3);
- %===========动量守恒方程=============
- aeu=zeros(ny+2,nx+1);
- awu=zeros(ny+2,nx+1);
- asu=zeros(ny+2,nx+1);
- anu=zeros(ny+2,nx+1);
- apu=zeros(ny+2,nx+1);
- aev=zeros(ny+1,nx+2);
- awv=zeros(ny+1,nx+2);
- asv=zeros(ny+1,nx+2);
- anv=zeros(ny+1,nx+2);
- apv=zeros(ny+1,nx+2);
- %============压力修正================
- pce=zeros(ny,nx);
- pcw=zeros(ny,nx);
- pcs=zeros(ny,nx);
- pcn=zeros(ny,nx);
- aep=zeros(ny,nx);
- awp=zeros(ny,nx);
- asp=zeros(ny,nx);
- anp=zeros(ny,nx);
- app=zeros(ny,nx);
- aepc=zeros(ny,nx);
- awpc=zeros(ny,nx);
- anpc=zeros(ny,nx);
- aspc=zeros(ny,nx);
- appc=zeros(ny,nx);
- pc=zeros(ny+2,nx+2,3);
- %=========质量不守恒,需要通过压力修正===========
- mp=zeros(ny,nx);
- errp=zeros(ny,nx);
- raw=1000;
- dx=0.001/ny;
- dy=0.001/ny;
- d=0.001;
- u(2:ny+1,:,:)=0.01;
- for q=1:5000
- %===========动量守恒方程=============
- for ll=1:10
- for i=2:ny+1
- for j=2:nx
- if i==2
- aeu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1)));
- awu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1)));
- asu(i,j)=2*d*max(0,(1-0.1*abs(raw*dy*(0.25*v(i-1,j+1,1)+0.25*v(i-1,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1)));
- anu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1)));
- if j==nx
- aeu(i,j)=0;
- end
- apu(i,j)=aeu(i,j)+awu(i,j)+asu(i,j)+anu(i,j);
- u(i,j,1)=(aeu(i,j)*u(i,j+1,1)+awu(i,j)*u(i,j-1,1)+anu(i,j)*u(i+1,j,1)+asu(i,j)*u(i-1,j,1)+(p(i-1,j-1,1)-p(i-1,j,1))*dy)/apu(i,j);
- else if i==ny+1
- aeu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1)));
- awu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1)));
- asu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1)));
- anu(i,j)=2*d*max(0,(1-0.1*abs(raw*dy*(0.25*v(i,j+1,1)+0.25*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1)));
- if j==nx
- aeu(i,j)=0;
- end
- apu(i,j)=aeu(i,j)+awu(i,j)+asu(i,j)+anu(i,j);
- u(i,j,1)=(aeu(i,j)*u(i,j+1,1)+awu(i,j)*u(i,j-1,1)+anu(i,j)*u(i+1,j,1)+asu(i,j)*u(i-1,j,1)+(p(i-1,j-1,1)-p(i-1,j,1))*dy)/apu(i,j);
- else
- aeu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1)));
- awu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1)));
- asu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1)));
- anu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1)));
- if j==nx
- aeu(i,j)=0;
- end
- apu(i,j)=aeu(i,j)+awu(i,j)+asu(i,j)+anu(i,j);
- u(i,j,1)=(aeu(i,j)*u(i,j+1,1)+awu(i,j)*u(i,j-1,1)+anu(i,j)*u(i+1,j,1)+asu(i,j)*u(i-1,j,1)+(p(i-1,j-1,1)-p(i-1,j,1))*dy)/apu(i,j);
- end
- end
- end
- end
- u(:,nx,1)=u(:,nx,1)*(sum(u(:,1,1))/sum(u(:,nx,1)));
- u(:,nx+1,1)=u(:,nx,1);
- for i=2:ny
- for j=2:nx+1
- if j==2
- aev(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1)));
- awv(i,j)=2*d*max(0,(1-0.1*abs(raw*dy*(0.25*u(i,j-1,1)+0.25*u(i+1,j-1,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1)));
- asv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1)));
- anv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1)));
- if j==nx+1
- aev(i,j)=0;
- end
- apv(i,j)=aev(i,j)+awv(i,j)+asv(i,j)+anv(i,j);
- v(i,j,1)=(aev(i,j)*v(i,j+1,1)+awv(i,j)*v(i,j-1,1)+anv(i,j)*v(i+1,j,1)+asv(i,j)*v(i-1,j,1)+(p(i-1,j-1,1)-p(i,j-1,1))*dy)/apv(i,j);
- else if j==nx+1
- aev(i,j)=2*d*max(0,(1-0.1*abs(raw*dy*(0.25*u(i,j,1)+0.25*u(i+1,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1)));
- awv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1)));
- asv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1)));
- anv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1)));
- if j==nx+1
- aev(i,j)=0;
- end
- apv(i,j)=aev(i,j)+awv(i,j)+asv(i,j)+anv(i,j);
- v(i,j,1)=(aev(i,j)*v(i,j+1,1)+awv(i,j)*v(i,j-1,1)+anv(i,j)*v(i+1,j,1)+asv(i,j)*v(i-1,j,1)+(p(i-1,j-1,1)-p(i,j-1,1))*dy)/apv(i,j);
- else
- aev(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1)));
- awv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1)));
- asv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1)));
- anv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1)));
- if j==nx+1
- aev(i,j)=0;
- end
- apv(i,j)=aev(i,j)+awv(i,j)+asv(i,j)+anv(i,j);
- v(i,j,1)=(aev(i,j)*v(i,j+1,1)+awv(i,j)*v(i,j-1,1)+anv(i,j)*v(i+1,j,1)+asv(i,j)*v(i-1,j,1)+...
- (p(i-1,j-1,1)-p(i,j-1,1))*dy)/apv(i,j);
- end
- end
- end
- end
- end
- %================压力场修正============
- for i=2:ny+1
- for j=2:nx
- if i==2
- aeu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1)));
- awu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1)));
- asu(i,j)=2*d*max(0,(1-0.1*abs(raw*dy*(0.25*v(i-1,j+1,1)+0.25*v(i-1,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1)));
- anu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1)));
- if j==nx
- aeu(i,j)=0;
- end
- apu(i,j)=aeu(i,j)+awu(i,j)+asu(i,j)+anu(i,j);
- else if i==ny+1
- aeu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1)));
- awu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1)));
- asu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1)));
- anu(i,j)=2*d*max(0,(1-0.1*abs(raw*dy*(0.25*v(i,j+1,1)+0.25*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1)));
- if j==nx
- aeu(i,j)=0;
- end
- apu(i,j)=aeu(i,j)+awu(i,j)+asu(i,j)+anu(i,j);
- else
- aeu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j+1,1)+0.5*u(i,j,1)));
- awu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i,j,1)));
- asu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j+1,1)+0.5*v(i-1,j,1)));
- anu(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i,j+1,1)+0.5*v(i,j,1)));
- if j==nx
- aeu(i,j)=0;
- end
- apu(i,j)=aeu(i,j)+awu(i,j)+asu(i,j)+anu(i,j);
- end
- end
- end
- end
- for i=2:ny
- for j=2:nx+1
- if j==2
- aev(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1)));
- awv(i,j)=2*d*max(0,(1-0.1*abs(raw*dy*(0.25*u(i,j-1,1)+0.25*u(i+1,j-1,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1)));
- asv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1)));
- anv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1)));
- apv(i,j)=aev(i,j)+awv(i,j)+asv(i,j)+anv(i,j);
- else if j==nx+1
- aev(i,j)=2*d*max(0,(1-0.1*abs(raw*dy*(0.25*u(i,j,1)+0.25*u(i+1,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1)));
- awv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1)));
- asv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1)));
- anv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1)));
- apv(i,j)=aev(i,j)+awv(i,j)+asv(i,j)+anv(i,j);
- else
- aev(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1))/d))^5)+max(0,-raw*dy*(0.5*u(i,j,1)+0.5*u(i+1,j,1)));
- awv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1))/d))^5)+max(0,raw*dy*(0.5*u(i,j-1,1)+0.5*u(i+1,j-1,1)));
- asv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,raw*dy*(0.5*v(i-1,j,1)+0.5*v(i,j,1)));
- anv(i,j)=d*max(0,(1-0.1*abs(raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1))/d))^5)+max(0,-raw*dy*(0.5*v(i+1,j,1)+0.5*v(i,j,1)));
- apv(i,j)=aev(i,j)+awv(i,j)+asv(i,j)+anv(i,j);
- end
- end
- end
- end
- for i=1:ny
- for j=2:nx-1
- aepc(i,j)=raw*dy^2/apu(i+1,j+1);
- awpc(i,j)=raw*dy^2/apu(i+1,j);
- end
- end
- for i=2:ny-1
- for j=1:nx
- anpc(i,j)=raw*dx^2/apv(i+1,j+1);
- aspc(i,j)=raw*dx^2/apv(i,j+1);
- end
- end
- for i=1:ny
- awpc(i,1)=0;
- aepc(i,1)=raw*dy^2/apu(i+1,2);
- awpc(i,nx)=raw*dy^2/apu(i+1,nx);
- aepc(i,nx)=0;
- end
- for j=1:nx
- anpc(1,j)=raw*dx^2/apv(2,j+1);
- aspc(1,j)=0;
- anpc(ny,j)=0;
- aspc(ny,j)=raw*dx^2/apv(ny,j+1);
- end
- for i=1:ny
- for j=1:nx
- appc(i,j)=aepc(i,j)+awpc(i,j)+anpc(i,j)+aspc(i,j);
- end
- end
- for i=1:ny
- for j=1:nx
- mp(i,j)=raw*dx*((u(i+1,j+1,1)-u(i+1,j,1))+(v(i+1,j+1,1)-v(i,j+1,1)));
- end
- end
- for ll=1:1000
- for i=2:ny+1
- for j=2:nx+1
- pc(i,j,1)=(pc(i,j+1,1)*aepc(i-1,j-1)+pc(i,j-1,1)*awpc(i-1,j-1)+pc(i+1,j,1)*anpc(i-1,j-1)+...
- pc(i-1,j,1)*aspc(i-1,j-1)-mp(i-1,j-1))/appc(i-1,j-1); %求出p'
- end
- end
- end
- ref=pc(2,2,1);
- for i=2:ny+1
- for j=2:nx+1
- pc(i,j,1)=pc(i,j,1)-ref;
- end
- end
- for i=1:ny
- for j=1:nx
- p(i,j,1)=p(i,j,1)+0.01*pc(i+1,j+1,1);
- end
- end
- for i=2:ny+1
- for j=2:nx
- u(i,j,1)=u(i,j,1)+dx/apu(i,j)*(pc(i,j,1)-pc(i,j+1,1));
- end
- end
- for i=2:ny
- for j=2:nx
- v(i,j,1)=v(i,j,1)+dy/apv(i,j)*(pc(i,j,1)-pc(i+1,j,1));
- end
- end
- err=norm(mp(:));
- if err<1e-5;break, end
- for i=2:ny-1
- for j=2:nx-1
- mp(i,j)=raw*dx*((u(i,j+1,1)-u(i,j,1))+(v(i+1,j,1)-v(i,j,1)));
- end
- end
- end
- contourf(u(1:31,:,1),30);axis equal
- set(gcf,'color','w')
复制代码 上面的方程比较简单,再附上一个,其实通过矩阵整体迭代求解可以适当加快求解过程,
matlab的向量迭代优势可以进一步体现出来,流场不管是否迎风模式,都可以采用。
看到有考虑多重求解雷诺方程的,雷诺方程本质上和Navier-Stokes是一样的,只是一个变种。
做这方面的都可以参与讨论。 |