当前位置: 首页 > 工具软件 > Gmsh > 使用案例 >

GMSH 使用 Tutorial-1

江凯风
2023-12-01

使用指南

gmsh tutorial 多种文件格式说明,但是本身 geo 文件格式说明还是蛮粗略的,建议使用 c++ 或 python 进行入门,文件说明及输出更详细一点

Tutorial-1 (c++)

Point 点创建可有 5 个参数,前 3 个参数是点在三维立体空间的分布,x、y、z 坐标,第 4 个参数是目标网格尺寸 ?,最后一个参数指定生成这个点的标记

  double lc = 1e-2;
  gmsh::model::geo::addPoint(0, 0, 0, lc, 1);
  gmsh::model::geo::addPoint(.1, 0, 0, lc, 2);
  gmsh::model::geo::addPoint(.1, .3, 0, lc, 3);
  int p4 = gmsh::model::geo::addPoint(0, .3, 0, lc);

Line 则由需为各个标记点所组成,在二维上应该是有 Curve 曲线作为基础构成,LineCurve 简单的一种,创建参数为 起始点,终点,目标标记,形成一个向量

  	gmsh::model::geo::addLine(1, 2, 1);
  	gmsh::model::geo::addLine(3, 2, 2);
  	gmsh::model::geo::addLine(3, p4, 3);
  	gmsh::model::geo::addLine(4, 1, p4);

接下来介绍的元素实体是 Surface 面,这里先使用 CurveLoop 形成线的循环,注意形成面的向量要形成循环

  	gmsh::model::geo::addCurveLoop({4, 1, -2, 3}, 1);

此时还是没有面的轮廓的,需要对 CurveLoop 继续进行操作

  	gmsh::model::geo::addPlaneSurface({1}, 1);

现在存在 Surface tag 为 1 的面,gmsh 知道该面的所有信息,如果我们想要把面分为更有意义的实体组,在 gmsh 中叫做 Physical Groups 物理组,默认情况下如果定义了物理组,gmsh 会把物理组下的元素都给导出,物理组可以分为 0,1,2,3 维度,并可用字符串命名

输入参数为 维度,{该维下目标tags…},生成物理组标记

  	gmsh::model::addPhysicalGroup(1, {1, 2, 4}, 5);
  	int ps = gmsh::model::addPhysicalGroup(2, {1});
  	gmsh::model::setPhysicalName(2, ps, "My surface");

每次代码输入完后,在 c++ 中需要将数据同步到代码内核,尽量每次编辑完数据同步一次,同步的数据少一点

  	gmsh::model::geo::synchronize();

给 2维 面生成网格,并保存

  	gmsh::model::mesh::generate(2);
  	gmsh::write("t1.msh");
  	gmsh::option::setNumber("Mesh.SaveAll", 1); # 强制保存所有物理组
	gmsh::write("t1.unv"); # 也可以保存为其他格式

可视化模型我们可以运行 (需要有图形屏幕输出)

	gmsh::fltk::run()

gmsh 默认是使用 Built-in 内核的,如果想使用其他内核,比如 OpenCASCADE,需要切换命名空间。Bulit-in内核需要严格按照 点-线-面-立体 的顺序生成几何体,OpenCASCADE 可以直接生成。

	gmsh::model::occ::addRectangle(.2, 0, 0, .1, .3); 
	# 可悬浮查阅参数,输入为创建起始点 x,y,z,以及长宽 dx dy
	gmsh::model::occ::synchronize(); # 同步到内核

最后

	gmsh :: model :: getBoundary(); # 内核同步后可查看曲线和点
	gmsh::finalize(); # 结束使用 C++ API 后调用

参考

GMSH 教程

 类似资料: