You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

83 lines
2.1 KiB

function [MESH,V]=MeshGenerate(num)
% 剖分立方体为num^3个正六面体网格
% CUBE 8列,每一行表示一个六面体的8个顶点的序号
% V=[X,Y,Z], X Y Z表示节点坐标.
% NeumannBC: 6列
% e.g. the i-th line [1 0 0 0 0 0] means
% the 1st face of the i-th element is imposed
% with Neumann B.C.
% 1st face: node 1-2-3-4
% 2nd face: node 2-4-8-6
% 3rd face: node 4-3-7-8
%  4th face: node 3-1-5-7
% 5th face: node 1-2-6-5
% 6th face: node 6-8-7-5
% h: 六面体单元边长
h=1/num;
% Number the Nodes
% X = i * h, Y = j * h, Z = k * h
% Then index of the node is
% ( k * (num+1)^2 + j * (num+1) + i+1 )
V=zeros((num+1)^3,3);
X=zeros((num+1)^3,1);
Y=zeros((num+1)^3,1);
Z=zeros((num+1)^3,1);
NodeNumber=zeros((num+1),(num+1),(num+1));
index=1;
for k=0:num
for j=0:num
for i=0:num
X(index)=i*h;
Y(index)=j*h;
Z(index)=k*h;
NodeNumber(i+1,j+1,k+1)=index;
index=index+1;
end
end
end
V(:,1)=X;V(:,2)=Y;V(:,3)=Z;
% Number the Cubes
nel=num^3;% number of elements( cubes here)
CUBE=zeros(nel,8);
for index=1:nel
r = mod(index,(num*num));
zz = (index-r)/(num*num);
if r == 0
%tmp1 = NodeNumber(num+1,num+1,zz+1)
CUBE(index,8) = NodeNumber(num+1,num+1,zz+1);
else
rr = mod(r,num);
yy = (r-rr)/num;
if rr==0
%tmp2 = NodeNumber(num+1,yy+1,zz+2)
CUBE(index,8) = NodeNumber(num+1,yy+1,zz+2);
else
%tmp3 = NodeNumber(rr+1,yy+2,zz+2)
CUBE(index,8) = NodeNumber(rr+1,yy+2,zz+2);
end
end
CUBE(index,4) = CUBE(index,8) - (num+1)*(num+1);
CUBE(index,7) = CUBE(index,8) - 1;
CUBE(index,6) = CUBE(index,8) - (num+1);
CUBE(index,5) = CUBE(index,6) - 1;
CUBE(index,3) = CUBE(index,4) - 1;
CUBE(index,2) = CUBE(index,4) - (num+1);
CUBE(index,1) = CUBE(index,2) - 1;
end
MESH=CUBE;
MESH(:,4) = CUBE(:,3);
MESH(:,3) = CUBE(:,1);
MESH(:,2) = CUBE(:,2);
MESH(:,1) = CUBE(:,4);
MESH(:,8) = CUBE(:,7);
MESH(:,7) = CUBE(:,5);
MESH(:,6) = CUBE(:,6);
MESH(:,5) = CUBE(:,8);
end