这个例子采用 MRT-LBM 模拟矩形腔绕流--基于 MRT-LBM 的流场与声场仿真计算 --王富海2017
%这个例子采用 MRT-LBM 模拟矩形腔绕流
%基于 MRT-LBM 的流场与声场仿真计算 --王富海2017
%上边界速度边界,其它边界-上下非平衡反弹格式-无滑移壁面
%还是老规矩先宣传一下QQ群: 格子玻尔兹曼救星:293267908。不收费的哦,就是为了早点毕业建的群。
clc
clear
close all
%设置仿真参数
uMax=0.1;%中间最大速度
xLen=151; %水平方向格子数
yLen=101;%垂直方向格子数
Re=100; %雷诺数
nu=uMax*(xLen-1)/Re; %运动粘性
Cs=sqrt(1/3);%格子声速
tau=1/2+3*nu;%松弛时间
omega=1/tau;%松弛频率
step=1000;%最大迭代次数
rhoo=1;%初始化密度
checkStep=100;%收敛计算间隔
saveStep=20;%保存结果间隔
filePath=uigetdir('*.*','D:\MyStudy\MATLAB\YuBrian')%仿真中间过程图片的保存路径
VSSum=[];%所有节点格子速度总和-每 saveStep 步记录一次
VSSum2=[]; %所有节点格子速度总和-每 checkStep 步记录一次,监视收敛曲线
%D2Q9 模型参数
w=[1/9 1/9 1/9 1/9 1/36 1/36 1/36 1/36 4/9 ]%各个方向的权重
cx=[ 1 0 -1 0 1 -1 -1 1 0];%各方向 x 速度分量
cy=[ 0 1 0 -1 1 1 -1 -1 0];%各方向 y 速度分量
M=[1 1 1 1 1 1 1 1 1;-4 -1 -1 -1 -1 2 2 2 2;4 -2 -2 -2 -2 1 1 1 1; ...
0 1 0 -1 0 1 -1 -1 1;0 -2 0 2 0 1 -1 -1 1;0 0 1 0 -1 1 1 -1 -1; ...
0 0 -2 0 2 1 1 -1 -1;0 1 -1 1 -1 0 0 0 0;0 0 0 0 0 1 -1 1 -1;]
% 由于分布函数 0 索引被放置在 matlab 索引 9 的位置,所以将 M 第一列放到最后。
M=circshift(M,[-1 -1]);
s1(9)=0;
s1(3)=s1(9);
s1(5)=s1(9);
s1(7)=omega;
s1(8)=s1(7);
s1(4)=1.2;
s1(6)=s1(4);
s1(1)=omega;
s1(2)=s1(1)-0.1;
s=diag(s1);%对角矩阵-松弛因子
Minv=inv(M);
Minv_s=Minv*s;
% 网格节点初始化,初始化各节点密度=1 ,初始化各节点速度为 0,初始化各节点分布函数=平衡分布函数
for i=1:xLen
for j=1:yLen
rho(i,j)=rhoo;
u(i,j)=0;
v(i,j)=0;
t1=u(i,j)^2+v(i,j)^2; %速度 U*V 内积,t1 写到外面,节省计算量
for k=1:9
t2=u(i,j)*cx(k)+v(i,j)*cy(k);%U*C 内积
f(k,i,j)=rho(i,j)*w(k)*(1+3*t2+4.5*t2^2-1.5*t1);% 计算初始态下的 分布函数=平衡分布函数
end
end
end
%主循环
tstart = tic;%计算时钟
[meshX,meshY]=meshgrid(1:xLen,yLen:-1:1);%产生网格数据。
figure
pc=pcolor(meshX,meshY,ones(yLen,xLen));%绘制伪彩图
shading interp%伪彩色图
axis equal
ylim([1 yLen])
%set(gca,'clim',[0 0.25])
for kk=1:step
step2=kk%显示程序的步进
mm=max(max(rho))%观察最大密度
if mm>100%判断仿真是否发散
break;
end
%1 碰撞过程
for i=1:xLen
for j=1:yLen %
%速度空间到动量空间
m=M*f(1:9,i,j);
%计算平衡动量
m_eq(9,1)=rho(i,j);
m_eq(1,1)=rho(i,j)*(-2+3*(u(i,j)^2+v(i,j)^2));
m_eq(2,1)=rho(i,j)*(1-3*(u(i,j)^2+v(i,j)^2));
m_eq(3,1)=rho(i,j)*u(i,j);
m_eq(4,1)=-rho(i,j)*u(i,j);
m_eq(5,1)=rho(i,j)*v(i,j);
m_eq(6,1)=-rho(i,j)*v(i,j);
m_eq(7,1)=rho(i,j)*(u(i,j)^2-v(i,j)^2);
m_eq(8,1)=rho(i,j)*u(i,j)*v(i,j);
%在动量空间松弛
m_temp=Minv_s*(m-m_eq);
for k=1:9
f(k,i,j)=f(k,i,j)-m_temp(k);
end
end
end
% 2 迁移过程
f2=f;%将碰撞后分布函数保存给变量 f2
for i=1:9
f(i,:,: ) = circshift(f2(i,:,: ), [0,cx(i),cy(i)]);
end
%施加上下边界条件-非平衡反弹模式
u(1:xLen,1)=0;
v(1:xLen,1)=0;
u(1:xLen,yLen)=uMax;
v(1:xLen,yLen)=0;
for i=2:xLen-1
%下边界
rho(i,1)=(f(9,i,1)+f(1,i,1)+f(3,i,1)+2*(f(4,i,1)+f(7,i,1)+f(8,i,1)))/(1-v(i,1));
f(2,i,1)=f(4,i,1)+2/3*rho(i,1)*v(i,1);
f(5,i,1)=f(7,i,1)-1/2*(f(1,i,1)-f(3,i,1))+1/6*rho(i,1)*v(i,1)+1/2*rho(i,1)*u(i,1);
f(6,i,1)=f(8,i,1)+1/2*(f(1,i,1)-f(3,i,1))+1/6*rho(i,1)*v(i,1)-1/2*rho(i,1)*u(i,1);
%上边界
rho(i,yLen)=(f(9,i,yLen)+f(1,i,yLen)+f(3,i,yLen)+2*(f(2,i,yLen)+f(6,i,yLen)+f(5,i,yLen)))/(1+v(i,yLen));
f(4,i,yLen)=f(2,i,yLen)-2/3*rho(i,yLen)*v(i,yLen);
f(7,i,yLen)=f(5,i,yLen)+1/2*(f(1,i,yLen)-f(3,i,yLen))-1/6*rho(i,yLen)*v(i,yLen)-1/2*rho(i,yLen)*u(i,yLen);
f(8,i,yLen)=f(6,i,yLen)-1/2*(f(1,i,yLen)-f(3,i,yLen))-1/6*rho(i,yLen)*v(i,yLen)+1/2*rho(i,yLen)*u(i,yLen);
end
%施加左右边界条件-非平衡反弹模式
u(1,:)=0;
v(1,:)=0;
u(xLen,:)=0;
v(xLen,:)=0;
for j=2:yLen-1
%左边界-速度边界
rho(1,j)=(f(9,1,j)+f(2,1,j)+f(4,1,j)+2*(f(3,1,j)+f(6,1,j)+f(7,1,j)))/(1-u(1,j));
%rho(1,j)=1;
f(1,1,j)=f(3,1,j)+2/3*rho(1,j)*u(1,j);
f(5,1,j)= f(7,1,j)-1/2*( f(2,1,j)-f(4,1,j))+1/6*rho(1,j)*u(1,j)+1/2*rho(1,j)*v(1,j);
f(8,1,j)= f(6,1,j)+1/2*( f(2,1,j)-f(4,1,j))+1/6*rho(1,j)*u(1,j)-1/2*rho(1,j)*v(1,j);
%右边界-速度边界
rho(xLen,j)=(f(9,xLen,j)+f(2,xLen,j)+f(4,xLen,j)+2*(f(1,xLen,j)+f(5,xLen,j)+f(8,xLen,j)))/(1+u(xLen,j));
f(3,xLen,j)=f(1,xLen,j)-2/3*rho(xLen,j)*u(xLen,j);
f(7,xLen,j)= f(5,xLen,j)+1/2*( f(2,xLen,j)-f(4,xLen,j))-1/6*rho(xLen,j)*u(xLen,j)-1/2*rho(xLen,j)*v(xLen,j);
f(6,xLen,j)= f(8,xLen,j)-1/2*( f(2,xLen,j)-f(4,xLen,j))-1/6*rho(xLen,j)*u(xLen,j)-1/2*rho(xLen,j)*v(xLen,j);
end
%四个角落的处理
%左上角
f(1,1,yLen)=f(3,1,yLen);
f(4,1,yLen)=f(2,1,yLen);
f(8,1,yLen)=f(6,1,yLen);
f(5,1,yLen)=0.5*(rho(1,yLen-1)-f(9,1,yLen)-f(1,1,yLen)-f(2,1,yLen)-f(3,1,yLen)-f(4,1,yLen)-f(6,1,yLen)-f(8,1,yLen));
f(7,1,yLen)=f(5,1,yLen);
%左下角
f(1,1,1)=f(3,1,1);
f(2,1,1)=f(4,1,1);
f(5,1,1)=f(7,1,1);
f(6,1,1)=0.5*(rho(1,2)-f(9,1,1)-f(1,1,1)-f(2,1,1)-f(3,1,1)-f(4,1,1)-f(5,1,1)-f(7,1,1));
f(8,1,1)=f(6,1,1);
%右上角
f(3,xLen,yLen)=f(1,xLen,yLen);
f(4,xLen,yLen)=f(2,xLen,yLen);
f(7,xLen,yLen)=f(5,xLen,yLen);
f(6,xLen,yLen)=0.5*(rho(xLen,yLen-1)-f(9,xLen,yLen)-f(1,xLen,yLen)-f(2,xLen,yLen) ...
-f(3,xLen,yLen)-f(4,xLen,yLen)-f(5,xLen,yLen)-f(7,xLen,yLen));
f(8,xLen,yLen)=f(6,xLen,yLen);
%右下角
f(3,xLen,1)=f(1,xLen,1);
f(2,xLen,1)=f(4,xLen,1);
f(6,xLen,1)=f(8,xLen,1);
f(5,xLen,1)=0.5*(rho(xLen,2)-f(9,xLen,1)-f(1,xLen,1)-f(2,xLen,1) -f(3,xLen,1)-f(4,xLen,1)-f(6,xLen,1)-f(6,xLen,1));
f(7,xLen,1)=f(5,xLen,1);
%计算宏观量
for i=1:xLen
for j=1:yLen
rho(i,j)=sum(f(:,i,j));%计算每一点的密度
end
end
for i=1:xLen
for j=1:yLen
uSum=0;
vSum=0;
for k=1:9
uSum=uSum+f(k,i,j)*cx(k);
vSum=vSum+f(k,i,j)*cy(k);
end
u(i,j)=uSum/rho(i,j);%计算速度场
v(i,j)=vSum/rho(i,j);
end
end
%每 saveStep 步保存下误差,检查收敛性
if mod(kk,saveStep)==0
temp=0;
for i=1:xLen
for j=1:yLen
temp=temp+sqrt(u(i,j)^2+v(i,j)^2); %节点的速度和
end
end
VSSum2=[VSSum2;temp];
u2=rot90(u);
v2=rot90(v);
for i=1:xLen
for j=1:yLen
speed(j,i)=sqrt(u2(j,i)^2+v2(j,i)^2);%节点的速度
end
end
set(pc,'cdata',speed);
drawnow
saveas(gcf,['D:\MyStudy\MATLAB\YuBrian','\',num2str(kk/saveStep),'.tif'])
picLength=kk/saveStep; %保存的图片数量
%每 checkStep 次保存下误差
if mod(kk,checkStep)==0
VSSum=[VSSum;temp];
%计算节点速度和变化(网格点总数*误差),判断是否跳出循环
if length(VSSum)>=2 && abs(VSSum(end)-VSSum(end-1))/VSSum(end-1)<=(1e-6)
fprintf('迭代步数:%d \n',kk);
fprintf('迭代误差:%d\n',abs(VSSum(end)-VSSum(end-1))/(xLen*yLen));
break;
end
end
end
end
runtime = toc(tstart);%仿真用的时间
%结果后处理
u2=rot90(u);
v2=rot90(v);
for i=1:xLen
for j=1:yLen
speed(j,i)=sqrt(u2(j,i)^2+v2(j,i)^2);
end
end
meshX2=(meshX-1)/(xLen-1);
meshY2=(meshY-1)/(xLen-1);
%速度场彩图 1
figure
pcolor(meshX2,meshY2,speed);
shading interp
colorbar
%axis equal tight
xlim([0 1])
ylim([0 (yLen-1)/(xLen-1)])
xlabel('x/L','fontsize',16)
ylabel('y/L','fontsize',16)
axis equal tight
set(gcf, 'Color', 'w');
set(gcf,'position',[440 447 560 351])
print(gcf,'-djpeg','-r600',[pwd '\Re' num2str(Re) '-11.jpg'])
%绘制流线图 2
figure
streamslice(meshX2,meshY2,u2,v2,4,'nearest ' )
axis equal tight
xlim([0 1])
ylim([0 (yLen-1)/(xLen-1)])
xlabel('x/L','fontsize',16)
ylabel('y/L','fontsize',16)
set(gcf, 'Color', 'w');
set(gcf,'position',[440 447 560 351])
print(gcf,'-djpeg','-r600',[pwd '\Re' num2str(Re) '-22.jpg'])