6、转换网格,删除实体
import gmsh
import math
import sys
gmsh.initialize() # 初始化Gmsh
gmsh.model.add("t6") # 添加一个名为"t6"的模型
lc = 1e-2 # 设置特征长度
gmsh.model.geo.addPoint(0, 0, 0, lc, 1) # 添加点1
gmsh.model.geo.addPoint(.1, 0, 0, lc, 2) # 添加点2
gmsh.model.geo.addPoint(.1, .3, 0, lc, 3) # 添加点3
gmsh.model.geo.addPoint(0, .3, 0, lc, 4) # 添加点4
# 添加线段
gmsh.model.geo.addLine(1, 2, 1)
gmsh.model.geo.addLine(3, 2, 2)
gmsh.model.geo.addLine(3, 4, 3)
gmsh.model.geo.addLine(4, 1, 4)
# 添加曲线环
gmsh.model.geo.addCurveLoop([4, 1, -2, 3], 1)
# 添加平面表面
gmsh.model.geo.addPlaneSurface([1], 1)
# 删除表面和左线,并用3条新线替换左线:
gmsh.model.geo.remove([(2, 1), (1, 4)])
# 添加新点
p1 = gmsh.model.geo.addPoint(-0.05, 0.05, 0, lc)
p2 = gmsh.model.geo.addPoint(-0.05, 0.1, 0, lc)
# 添加新线
l1 = gmsh.model.geo.addLine(1, p1)
l2 = gmsh.model.geo.addLine(p1, p2)
l3 = gmsh.model.geo.addLine(p2, 4)
gmsh.model.geo.addCurveLoop([2, -1, l1, l2, l3, -3], 2)
gmsh.model.geo.addPlaneSurface([-2], 1)
# `setTransfiniteCurve()'网格约束明确指定了曲线上节点的位置。
# 例如,以下命令强制在曲线2上均匀放置20个节点(包括两个端点上的节点):
gmsh.model.geo.mesh.setTransfiniteCurve(2, 20)
# 在组合曲线`l1', `l2'和`l3'上总共放置20个点
# 注意点`p1'和`p2'是由曲线共享的,所以我们不创建6 + 6 + 10 = 22个节点,而是20!
gmsh.model.geo.mesh.setTransfiniteCurve(l1, 6)
gmsh.model.geo.mesh.setTransfiniteCurve(l2, 6)
gmsh.model.geo.mesh.setTransfiniteCurve(l3, 10)
# 最后,我们在曲线1上放置30个节点,按照几何级数排列(反转)
# 在曲线3上也放置30个点,按照几何级数排列
gmsh.model.geo.mesh.setTransfiniteCurve(1, 30, "Progression", -1.2)
gmsh.model.geo.mesh.setTransfiniteCurve(3, 30, "Progression", 1.2)
# `setTransfiniteSurface()'网格约束使用曲面的参数平面中的跨有限插值算法
# 来连接边界上的节点,使用结构化网格。
# 如果表面有超过4个角点,跨有限插值的角必须手动指定:
gmsh.model.geo.mesh.setTransfiniteSurface(1, "Left", [1, 2, 3, 4])
# 要创建四边形而不是三角形,可以使用`setRecombine'约束:
gmsh.model.geo.mesh.setRecombine(2, 1)
# 当表面边界上只有3或4个点时,在`setTransfiniteSurface()'调用中可以省略角列表:
gmsh.model.geo.addPoint(0.2, 0.2, 0, 1.0, 7)
gmsh.model.geo.addPoint(0.2, 0.1, 0, 1.0, 8)
gmsh.model.geo.addPoint(0.25, 0.2, 0, 1.0, 9)
gmsh.model.geo.addPoint(0.3, 0.1, 0, 1.0, 10)
gmsh.model.geo.addLine(8, 10, 10)
gmsh.model.geo.addLine(10, 9, 11)
gmsh.model.geo.addLine(9, 7, 12)
gmsh.model.geo.addLine(7, 8, 13)
gmsh.model.geo.addCurveLoop([13, 10, 11, 12], 14)
gmsh.model.geo.addPlaneSurface([14], 15)
for i in range(10, 14):
gmsh.model.geo.mesh.setTransfiniteCurve(i, 10)
gmsh.model.geo.mesh.setTransfiniteSurface(15)
# 生成三角形的方式可以通过在`setTransfiniteSurface()'中指定"Left"、"Right"或"Alternate"来控制。
# 例如:
# gmsh.model.geo.mesh.setTransfiniteSurface(15, "Alternate")
gmsh.model.geo.synchronize() # 同步几何数据
# 最后,我们对网格应用椭圆平滑器以获得更规则的网格:
gmsh.option.setNumber("Mesh.Smoothing", 100)
gmsh.model.mesh.generate(2) # 生成网格
gmsh.write("t6.msh") # 写入网格文件
# 启动GUI以查看结果:
if '-nopopup' not in sys.argv:
gmsh.fltk.run()
gmsh.finalize() # 清理并结束Gmsh
7、背景网格
import gmsh
import os
import sys
# 通过提供一个背景网格,即包含目标网格大小的后期处理视图,可以非常准确地指定网格大小。
gmsh.initialize()
# 合并一个包含目标网格大小的基于列表的后期处理视图:
path = os.path.dirname(os.path.abspath(__file__))
gmsh.merge(os.path.join(path, os.pardir, 't7_bgmesh.pos'))
# 如果后期处理视图是基于模型的而不是基于列表的(即如果它是基于实际的网格),
# 那么我们需要创建一个新的模型来包含几何体,以便对其进行网格划分不会破坏背景网格。
# 在这里不需要这样做,因为视图是基于列表的,但这样做也没有坏处:
gmsh.model.add("t7")
# 创建一个简单的矩形几何体:
lc = 1e-2
gmsh.model.geo.addPoint(0, 0, 0, lc, 1)
gmsh.model.geo.a