我试图用汽车形状的障碍重现这个CFD模拟,但它并没有证明我是怎么想的

时间:2018-04-03 00:25:43

标签: matlab octave

以下是我要重现的内容:CFD simulation - Car

以下是我使用我的代码获得的内容: My stuff

我最初使用的方程是来自the NASA website的Euler方程,我将时间变量加到了2个动量方程中。

我也跟着theses two videos to help with discretization (11 and 12)

我需要提一下,我是CFD和编码的初学者,所以我对这些事情的经验非常有限。

这是我的代码,我一直在Octave上编写代码,但我意识到Matlab本身的执行速度要快得多:

clear all;

nx = 80; ny = 60;
nt = 20; nit = 20; dt = 0.01;
vis = 0; rho = 1.225;

dx = 5/(nx-1); dy = 2/(ny-1);
x = 0:dx:5; y = 0:dy:2;
u = zeros(nx,ny);
v = zeros(nx,ny);
p = zeros(nx,ny);

cmap = flipud(jet(256));

%u([1,2], 1) = 0;
%v([1,2], 1) = 0;
%p(:, 2) = 0;

[y,x] = meshgrid(y,x);
u(:, :) = 0.1;

for it = 1:nt+1

  % constant flow from the left wall
  u(1, :) = 0.1;

  for i = 2:nx-1
    for j = 2:ny-1
      b(i,j) = rho*( (u(i+1,j)-u(i-1,j))/2/dx + (v(i,j+1)-v(i,j-1))/2/dy )/dt + rho*(((u(i+1,j)-u(i-1,j))/2/dx).^2 + 2*(u(i,j+1)-u(i,j-1))/2/dy*(v(i+1,j)-v(i,j-1))/2/dx) + ( (v(i,j+1)-v(i,j-1))/2/dy ).^2;
    end
  end

  b(nx,:) = 0; b(:,ny) = 0;       % add row and column 20 = 0 for pcolor to 
 match (19 v 20)

  for iit = 1:nit+1
    pn = p;
    for i = 2:nx-1
      for j = 2:ny-1
        p(i,j) = ((pn(i+1,j) + pn(i-1,j))*dy^2 + (pn(i,j+1)+pn(i,j-1))*dx^2 - b(i,j)*dx^2*dy^2) / (dx^2+dy^2) / 2;
      end
    end
    p(1,:) = p(2,:);  p(nx,:) = p(nx-1,:);
    p(:,1) = p(:,2);  p(:,ny) = p(:,ny-1);
  end

  un = u; vn = v;
  for i = 2:nx-1
    for j = 2:ny-1
      u(i,j) = un(i,j) - un(i,j)*dt/dx*(un(i,j) - un(i-1,j)) - vn(i,j)*dt/dy*(un(i,j)-un(i,j-1)) - 1/rho*(p(i+1,j)-p(i-1,j))*dt/2/dx + vis*dt/dx^2*(un(i+1,j)-2*un(i,j)+un(i-1,j)) + vis*dt/dy^2*(un(i,j+1)-2*un(i,j)+un(i,j-1));

      v(i,j) = vn(i,j) - un(i,j)*dt/dx*(vn(i,j) - vn(i-1,j)) - vn(i,j)*dt/dy*(vn(i,j)-vn(i,j-1)) - 1/rho*(p(i,j+1)-p(i,j-1))*dt/2/dy + vis*dt/dx^2*(vn(i+1,j)-2*vn(i,j)+vn(i-1,j)) + vis*dt/dy^2*(vn(i,j+1)-2*vn(i,j)+vn(i,j-1));
      end
    end
    u(1,:) = 0;  u(nx,:) = 0;  u(:,1) = 0;  u(:,ny) = 0;
    v(1,:) = 0;  v(nx,:) = 0;  v(:,1) = 0;  v(:,ny) = 0;  % set borders to 0


  % car front
  for c = 1:8
    for d = 1:10
      u(c+11, d+4) = 0;
      v(c+11, d+4) = 0;
    end
  end

  % car body
  for c = 1:11
    for d = 1:17
      u(c+19, d+4) = 0;
      v(c+19, d+4) = 0;
    end
  end

  % car rear
  for c = 1:8
    for d = 1:10
      u(c+30, d+4) = 0;
      v(c+30, d+4) = 0;
    end
  end

end

colormap (cmap);
pcolor(x,y,b);
shading interp;
hold on;
quiver (x, y, u, v, 'color', [0 0 0]);

1 个答案:

答案 0 :(得分:1)

不可压缩的Navier-Stokes方程(类似于欧拉方程,但具有扩散)是这些类型模拟的典型选择。在您的模拟情况下,由于流量在那里更加复杂(再循环区域),因此在汽车后通常会有5到20倍的区域。如果您不想编写自己的代码,可以考虑使用Matlab CFD toolbox并按照tutorial for flow over a cylinder(同时用汽缸代替您的汽车几何)。最后,如果内置求解器太慢,您还可以使用OpenFOAM CFD求解器集成来加速仿真。