当前位置: 首页 > news >正文

【gmsh源码阅读】OCC对象绑定tag及获取几何与网格映射关系

一、Tag是什么?

gmsh中的几何模型相对于OCC的模型增加了id编号,也叫tag,在gmsh中可以显示出来。在gmsh中,点、线、面、体都有Tag,以方便对其查找定位查找。在OCC中TopoDS_Shape只有几何与拓扑结构,没有唯一id编号,所以gmsh导入OCC对象的第一步是打Tag。
在这里插入图片描述

二、gmsh中打Tag的源码

gmsh导入OCC对象有两种方式:
1. 将OCC对象写出step或brep文件,将gmsh作为单独程序使用,用geo文件引入几何文件
2. 将gmsh作为库使用时,可以用gmsh::model::occ::importShapesNativePointer直接导入

不管那种方式导入,最后都会调用OCC_Internals::importShapes方法:

bool OCC_Internals::importShapes(const TopoDS_Shape *shape, bool highestDimOnly,std::vector<std::pair<int, int> > &outDimTags)
{if(!shape) return false;// 打Tag_multiBind(*shape, -1, outDimTags, highestDimOnly, true);return true;
}

这里有个_multiBind方法就是给TopoDS_Shape绑定tag。打开其代码,发现其原理很简单,就是用OCC提供的对象拓扑遍历类TopExp_Explorer遍历体、面、边、点,给其一个唯一的Tag,并记录到对应的map中。

三、获取几何对象与网格映射关系

在CAE产品中,边界与载荷经常施加在几何对象上,但求解器最终使用的是节点、单元,所有需要根据几何查找其对应的节点或单元。所谓的几何与网格的映射关系指根据几何对象查找对应的网格对象(这种叫法是我个人理解,不清楚学界有没有专业术语)。如:几何点对应的节点,几何面有哪些节点组成,又由哪些面单元组成。
gmsh提供了专门的API获取这些数据:
1. gmsh::model::occ::getEntities:获取几何对象的tag及维度
2. gmsh::model::mesh::getNodes:获取几何实体对应的节点
3. gmsh::model::mesh::getElements:获取几何实体对应的单元

下面是一段这些API使用的demo:

gmsh::initialize();
gmsh::model::add("t1");
std::vector<std::pair<int, int> > v;
const TopoDS_Shape aShape = ...; // 改成你自己的shape
gmsh::model::occ::importShapesNativePointer(&aShape, v, false);
gmsh::model::occ::synchronize();
gmsh::option::setNumber("Mesh.MeshSizeMin", 0.1);
gmsh::option::setNumber("Mesh.MeshSizeMax", 1);
gmsh::model::mesh::generate(3);gmsh::vectorpair entities;
gmsh::model::occ::getEntities(entities); // 获取occ的entities
for (auto entity : entities) {std::vector<std::size_t> nodeTags; // 节点的编号std::vector<double> coordinate; // 节点的坐标std::vector<double> pCoord;gmsh::model::mesh::getNodes(nodeTags, coordinate, pCoord, entity.first, entity.second, true);std::vector<int> elementTypes; // 存放单元类型std::vector<std::vector<std::size_t> > elementTags; // 存放单元编号std::vector<std::vector<std::size_t> > elementNodeTags; // 单元节点编号gmsh::model::mesh::getElements(elementTypes, elementTags, elementNodeTags, entity.first, entity.second);
}gmsh::write("t1.vtk");
gmsh::finalize();
http://www.lryc.cn/news/289431.html

相关文章:

  • 【RTP】webrtc 学习3: webrtc对h264的rtp解包
  • 幻兽帕鲁服务器多少钱?4核16G支持32人在线吗?
  • AD/DA(模数数模转换)
  • Docker数据卷挂载(以容器化Mysql为例)
  • YOLOv8-Seg改进:注意力系列篇 | non-local自注意力,助力小目标分割
  • 【Qt无门槛入门】信号以及信号机制及其常用控件(1)
  • 【python】爬取百度热搜排行榜Top50+可视化【附源码】【送数据分析书籍】
  • 排序(插入排序)
  • Spring MVC 请求流程
  • 鸿蒙ArkUI 宫格+列表+HttpAPI实现
  • 【C++中的STL】常用算法1——遍历算法和查找算法
  • Jmeter性能测试: 基于JDK 21 安装 Jmeter 5.6.3
  • Linux命令-apropos命令(在 whatis 数据库中查找字符串)
  • 【算法】解决动态规划问题的通用步骤思路及示例算法:打家劫舍【动态规划】
  • 蓝桥杯之即约分数
  • Pointnet++改进优化器系列:全网首发Sophia优化器 |即插即用,实现有效涨点
  • 1.27回溯(中等)
  • sql管理工具archery简介
  • DEM高程地形瓦片数据Cesium使用教程
  • 3个精美的wordpress律师网站模板
  • 在windows环境下安装hadoop
  • 大数据分析组件Hive-集合数据结构
  • 单核QPS近6000S,陌陌基于OceanBase的持久化缓存探索与实践
  • 关于css 的基础试题
  • Keil-C语言小总结
  • react的withRouter高阶组件:
  • 小程序 样式 WXSS
  • LLM之RAG实战(二十一)| 使用LlamaIndex的Text2SQL和RAG的功能分析产品评论
  • Scikit-learn (sklearn)速通 -【莫凡Python学习笔记】
  • 支持向量机(SVM)详解