2013-11-25 76 views
0
function [x, y, z, u, v, w] = rectNSgrid() 
global nX nY nZ nuX nvY nwZ h b l 
b=input('Input channel width:'); 
h=input('Input channel height:'); 
l=input('Input channel length:'); 
nX = input('Input number of x divisions'); 
nY = input('Input number of y divisions'); 
nZ = input('Input number of z divisions'); 
x=zeros(nX,nY,nZ); 
y=zeros(nX,nY,nZ); 
z=zeros(nX,nY,nZ); 
xu=zeros(nuX,nvY,nwZ); 
yv=zeros(nuX,nvY,nwZ); 
zw=zeros(nuX,nvY,nwZ); 
for i = 1:nX 
    x(i,:,:) = b*(i-1)/(nX-1); 
end 
for j = 1:nY 
    y(:,j,:) = l*(j-1)/(nY-1); 
end 
for k = 1:nZ 
    z(:,:,k) = h*(k-1)/(nZ-1); 
end 
nuX = nX-1; 
nvY = nY-1; 
nwZ = nZ-1; 
for i=1:nuX 
    xu(i,:,:) = (x(i,:,:)+x(i+1,:,:))/2; % Here is the place it shows the error 
end 
for j=1:nvY 
    yv(:,j,:) = (y(:,j,:)+y(:,j+1,:))/2; 
end 
for k=1:nwZ 
    zw(:,:,k) = (z(:,:,k)+z(:,:,k+1))/2; 
end 

而我该如何绘制MATLAB中的网格点?我需要在矩形刚性网格上求解Navier-Stokes方程。速度控制量与x-CV的宽度相差半个单元边缘距离。??? MATLAB中的下标赋值不匹配错误,同时定义交错网格

回答

0

正如已经说过的,这条线不能工作:

xu(i,:,:) = (x(i,:,:)+x(i+1,:,:))/2; 

因为许(I,:,:)为[1个nuy NUZ]和x(I,:,:)为[1 NY NZ]和ni nui被定义为不同。

我想我明白你会做什么,试试这个,也许它会做你的工作:

function [x, y, z, u, v, w] = rectNSgrid(nX,nY,nZ,h,b,l) 

% CELL NODES 
[X Y Z] = meshgrid([0:b/nX:b],[0:l/nY:l],[0:h/nZ:h]); 

% VELOCITY NODES 
axX = [ 0.5*b/nX : b/nX : b-0.5*b/nX ]; 
axY = [ 0.5*l/nY : l/nY : l-0.5*l/nY ]; 
axZ = [ 0.5*h/nZ : h/nZ : h-0.5*h/nZ ]; 
[uX uY uZ] = meshgrid(axX,axY,axZ); 

% PLOT 
hold on; view(3); axis square; 
plot3(X(:),Y(:),Z(:),'.b'); % CELL NODES 
plot3(uX(:),uY(:),uZ(:),'.r'); % VELOCITY NODES 

但要注意,“meshgrid”给你不正是你想要它索引什么X尺寸在所得到的矩阵的第二维和第一维中的Y.有关详细信息,请参阅“meshgrid”的文档。你可以像我想的那样用'permute'来想要它。

+0

谢谢你的回复。建议的代码有帮助。但是对于矩形网格它的工作方式是否同样好?我的意思是我使用b = 2,l = 290,h = 1(根据我使用的通道的尺寸)并且将nX = 10; nY = 50和nZ = 5,它不显示非常规则的网格。另外我需要问一下,我需要网格来求解Navier-Stokes方程,其中网格中的每个单独点将被分配一个特定的位置或速度值。用这种方式定义的网格可以做到这一点吗?谢谢。 – user2542878

+0

它应该与非正方形网格一样工作,但对于“轴线正方形”,您不会在图表上看到它,而是将“轴线等于”。为了存储你的位置(和速度),只需复制X,Y,Z(和uX,uY,uZ)来存储你的数据。现在对于你的Navier-Stokes问题,如果你正在通过有限差分求解它,这种方式非常好,如果你打算使用有限元素,那么你需要一个三角网格。 –

+0

我只使用有限差异。所以这对我很有用。非常感谢。 – user2542878

0

您需要在interp2中插入错误行,并使用置换来暂时返回正常矩阵。

如何内插没有在你的问题中指定。

0

我并不感到惊讶,因为你正在做的:

for i=1:nuX 
    xu(i,:,:) = (x(i,:,:)+x(i+1,:,:))/2; 
end 

x是大小(nX,nY,nZ)的所以除非nX = nuX,你将有一个错误。即使nX = nuX,由于x(i+1,:,:)i = nuX,您仍然会有错误。

+0

您需要更改代码中'x'的索引,以确保当'i'从'1'到'nuX'时,您总是在'1'和'nX'之间。这很难,因为你使用'i'和'i + 1',所以我不明白这是如何工作的。 – am304