首页/文章/ 详情

基于Matlab的三维有限元网格生成 | C3D4、C3D8单元网格生成

1年前浏览1870

今日分享的主要内容是:如何在Matlab中构造三维有限元网格(C3D4、C3D8单元)?

前几期分享了二维有限元网格在Matlab中自动生成的算法,今天想搓一搓三维的,不过与之前不同,本次就不研究如何在Matlab中自动生成了,而是导入inp文件,在Matlab中绘制网格,可视化一下。

三维的网格自动生成也可以在二维的基础上扩展,但是较为复杂,我就偷了个巧,捡现成的~

话不多说,进入正题!来看一下C3D4、C3D8单元网格如何绘制吧~


C3D4单元网格

节点顺序不唯一,只需在每个面按照顺时针或逆时针的顺序,进行编码即可,如下图所示,(皆按照顺时针排列):

  1. 第一个面按照1-2-3节点编码排列;
  2. 第二个面按照2-3-4节点编码排列;
  3. 第三个面按照3-4-1节点编码排列;
  4. 第四个面按照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 32 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

代码解读

  1. 注意patch函数中verticesfaces两个参数的含义,在三维问题中faces表示的是单元每个面的节点连接信息,与二维有所区别;
  2. FaceAlpha参数定义的是不透明度,范围在0~1;
  3. view(3)默认三维视图。

绘图如下:

 

.inp文件导入网格信息

inp文件单元节点信息导入进Matlab需要用的Readmesh.m函数,如导入已经创建好的C3D4单元inp文件:

[geom,connec] = Readmesh('C3D4.inp');

得到单元、节点信息后,原绘图函数不变,即可绘制inp文件中的网格信息,与Abaqus对于如下,节点编码一致:

 
 

<<< 左右滑动见更多 >>>

C3D8单元网格

节点顺序不唯一,只需在每个面按照顺时针或逆时针的顺序,进行编码即可,如下图所示,(皆按照顺时针排列):

  1. 第一个面按照1-2-3-4节点编码排列;
  2. 第二个面按照2-6-7-3节点编码排列;
  3. 第三个面按照6-5-8-7节点编码排列;
  4. 第四个面按照5-1-4-8节点编码排列;
  5. 第五个面按照4-3-7-8节点编码排列;
  6. 第六个面按照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 84 3 7 85 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文件导入网格信息

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');
  



来源:易木木响叮当
Abaqus
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-06-02
最近编辑:1年前
易木木响叮当
硕士 有限元爱好者
获赞 221粉丝 265文章 351课程 2
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈