今日分享的主要内容是:如何在Matlab中构造三维有限元网格(C3D4、C3D8单元)?
前几期分享了二维有限元网格在Matlab中自动生成的算法,今天想搓一搓三维的,不过与之前不同,本次就不研究如何在Matlab中自动生成了,而是导入inp文件,在Matlab中绘制网格,可视化一下。
三维的网格自动生成也可以在二维的基础上扩展,但是较为复杂,我就偷了个巧,捡现成的~
话不多说,进入正题!来看一下C3D4、C3D8单元网格如何绘制吧~
节点顺序不唯一,只需在每个面按照顺时针或逆时针的顺序,进行编码即可,如下图所示,(皆按照顺时针排列):
第一个面按照1-2-3节点编码排列; 第二个面按照2-3-4节点编码排列; 第三个面按照3-4-1节点编码排列; 第四个面按照4-1-2节点编码排列;
geom=[0,1,0.5;
0,0,1;
-1,0,0;
1,0,0];
connec=[1,2,3,4];
[nnd,ntemp] = size(geom);
[nel,netemp] = size(connec);
for i=1:nel
vertices_matrix = [geom(connec(i,:),1),geom(connec(i,:),2),geom(connec(i,:),3)];
faces_matrix=[1 2 3; 2 3 4;3 4 1;4 1 2];
h=patch('vertices', vertices_matrix,'faces',faces_matrix,'facecolor','c',... 'Marker','o','MarkerSize',8,'MarkerFaceColor','b','FaceAlpha',.5);
view(3);
xlabel('X')
ylabel('Y')
zlabel('Z')
hold on
end
axis equal
% 节点编号显示
for i=1:nnd
txt =num2str(i);
text(geom(i,1)+0.001,geom(i,2)-0.025,geom(i,3)+0.05,txt,'Color','red','FontWeight', 'bold','FontSize',14);
end
代码解读
patch
函数中vertices
和faces
两个参数的含义,在三维问题中faces
表示的是单元每个面的节点连接信息,与二维有所区别;FaceAlpha
参数定义的是不透明度,范围在0~1;view(3)
默认三维视图。绘图如下:
inp文件单元节点信息导入进Matlab需要用的Readmesh.m
函数,如导入已经创建好的C3D4单元inp文件:
[geom,connec] = Readmesh('C3D4.inp');
得到单元、节点信息后,原绘图函数不变,即可绘制inp文件中的网格信息,与Abaqus对于如下,节点编码一致:
<<< 左右滑动见更多 >>>
节点顺序不唯一,只需在每个面按照顺时针或逆时针的顺序,进行编码即可,如下图所示,(皆按照顺时针排列):
第一个面按照1-2-3-4节点编码排列; 第二个面按照2-6-7-3节点编码排列; 第三个面按照6-5-8-7节点编码排列; 第四个面按照5-1-4-8节点编码排列; 第五个面按照4-3-7-8节点编码排列; 第六个面按照5-6-2-1节点编码排列;
geom=[ 0,0,1;
1,0,1;
1,1,1;
0,1,1;
0,0,0;
1,0,0;
1,1,0;
0,1,0;];
connec=[1,2,3,4,5,6,7,8];
[nnd,ntemp] = size(geom);
[nel,netemp] = size(connec);
for i=1:nel
vertices_matrix = [geom(connec(i,:),1),geom(connec(i,:),2),geom(connec(i,:),3)];
faces_matrix=[1 2 3 4;2 6 7 3;6 5 8 7;5 1 4 8; 4 3 7 8; 5 6 2 1];
h=patch('vertices', vertices_matrix,'faces',faces_matrix,'facecolor','c',... 'Marker','o','MarkerSize',6,'MarkerFaceColor','b','FaceAlpha',.5);
xlabel('X')
ylabel('Y')
zlabel('Z')
view(3);
hold on
end
axis equal
% 节点编号显示
for i=1:nnd
txt =num2str(i);
text(geom(i,1)+0.005,geom(i,2)-0.05,geom(i,3)+0.05,txt,'Color','red','FontWeight', 'bold','FontSize',14);
end
inp文件单元节点信息导入进Matlab需要用的Readmesh.m
函数,如导入已经创建好的C3D8单元inp文件:
[geom,connec] = Readmesh('C3D8.inp');
得到单元、节点信息后,原绘图函数不变,即可绘制inp文件中的网格信息,与Abaqus对于如下,节点编码一致:
<<< 左右滑动见更多 >>>
有了以上基础后,我们也可以根据自己想法更改一下绘图类型,例如,去掉填充面,更改线条粗细:
h=patch('vertices', vertices_matrix,'faces',faces_matrix,'facecolor','none',... 'EdgeColor','b','LineWidth',2,'Marker','o','MarkerSize',8,'MarkerFaceColor','r','MarkerEdgeColor','r');