首页/文章/ 详情

Gmsh源码-Mesh3D(Delaunay)

1年前浏览2373

Gmsh划分三维体的步骤与划分GFace的步骤非常相似。其基本结构也相同,如GRegion继承自GEntity,GEntity隶属于一个GModel。网格的节点存储在GEntity的mesh_vertices中,划分的网格存储在GEdge,GFace,GRegion中。

Delaunay方法是三维非结构网格生成的主力算法,Gmsh的三维网格使用此方法。此处讨论使用Delaunay插入法划分三维实体,其前提是,构成实体的边界面,边已经划分完毕(此部分Gmsh调用TetGen实现)。就好像meshGFaceDelaunayInsertion处理GFace网格时,边界已经划分完成。具体划分代码主要包含在meshGRegion.cpp,meshGRegionDelaunayInsertion.cpp 中 。本文主要对GMesh划分GRegion的代码做一剖析,依然遵循"去繁从简,抓住主要步骤"。

1. 数据结构

classMTet4定义如下,











class MTet4 {  friend class MTet4Factory;//用于创建MTet
private:  bool deleted;  //标识单元是否在查找Cavity过程中被删除。  double circum_radius; //外接球半径/期望尺寸  MTetrahedron *base;  //存储四面体基本信息,继承自MElement  MTet4 *neigh[4];// 存储四个邻居  GRegion *gr;}

circum_radius的赋值:前面也提过,这个处理很聪明。使我们要细化的单元永远位于数组的首位。Gmsh期望单元尺寸的计算比较复杂,后边再单独学习。

GMsh支持的单元类型如下图,本文仅关注Delaunay四面体。

2. 划分边界

将Mesh1D,Mesh2D划分得到的边界顶点四面体化,并且恢复边界。3D Delaunay恢复边界是比较复杂的,比插入算法本身难度大。划分边界使用下述函数,但是其内部调用了TetGen。至于为何Gmsh这部分代码不自己开发,不得而知。

3. 插入内部点

划分好边界之后,对不符合尺寸要求的四面体进行细化。在其外接球球心插入点,此部分操作与之前文章描述的Delaunay一致。如果仅划分三维体表面(Mesh.Algorithm3D 设置为“ Initial mesh only”),此部分代码不会执行

4. Region划分全过程

请牢记GMsh划分网格的全过程:由GModel出发,划分Model下的所有Entity。Entity的具体类为GEdge,GFace,GRegion。

路漫漫其修远兮,共勉。

参考:

  • GMsh源码


来源:有限元术
理论科普
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-09-29
最近编辑:1年前
寒江雪_123
硕士 | cae工程师 签名征集中
获赞 49粉丝 106文章 57课程 9
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈