gmsh tutorial 多种文件格式说明,但是本身 geo 文件格式说明还是蛮粗略的,建议使用 c++ 或 python 进行入门,文件说明及输出更详细一点
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
曲线作为基础构成,Line
是 Curve
简单的一种,创建参数为 起始点,终点,目标标记,形成一个向量
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 后调用