1、几何基础、基本实体、物理组
# 导入Gmsh模块和系统模块
import gmsh
import sys
# 初始化Gmsh
gmsh.initialize()
# 添加新模型"t1"
gmsh.model.add("t1")
# 使用内置CAD内核定义几何体
# 定义点,包括坐标、局部网格尺寸和标签
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)
p4 = gmsh.model.geo.addPoint(0, .3, 0, lc) # 自动分配标签
# 定义直线,通过点标签指定起点和终点
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)
# 定义曲线环,形成面的边界
gmsh.model.geo.addCurveLoop([4, 1, -2, 3], 1)
# 定义平面面,基于曲线环
gmsh.model.geo.addPlaneSurface([1], 1)
# 同步CAD实体与Gmsh模型
gmsh.model.geo.synchronize()
# 定义物理组,将几何实体分组
gmsh.model.addPhysicalGroup(1, [1, 2, 4], 5) # 物理曲线组
gmsh.model.addPhysicalGroup(2, [1], name="My surface") # 物理表面组
# 生成二维网格
gmsh.model.mesh.generate(2)
# 保存网格到MSH文件
gmsh.write("t1.msh")
# 可视化模型(如果命令行未指定"-nopopup")
if '-nopopup' not in sys.argv:
gmsh.fltk.run()
# 清理资源
gmsh.finalize()
# 注意:
# - 可以使用OpenCASCADE几何内核定义更复杂的几何体
# - 可以将网格保存到其他格式,如UNV
# - 可以设置MSH文件的版本
2、变换、挤压几何形状、体积
import gmsh
import sys
import math
# 初始化Gmsh,解析命令行参数
gmsh.initialize(sys.argv)
gmsh.model.add("t2")
# 定义基础几何体(从t1.py复制)
# ...(省略了详细的点、线、面定义)
# 定义新点并进行平移和旋转
gmsh.model.geo.addPoint(0, .4, 0, lc, 5)
gmsh.model.geo.translate([(0, 5)], -0.02, 0, 0)
gmsh.model.geo.rotate([(0, 5)], 0, 0.3, 0, 0, 0, 1, -math.pi / 4)
# 复制并平移点3
ov = gmsh.model.geo.copy([(0, 3)])
gmsh.model.geo.translate(ov, 0, 0.05, 0)
gmsh.model.geo.addLine(3, ov[0][1], 7)
# ...(省略了后续线、面定义)
# 复制并平移两个面
ov = gmsh.model.geo.copy([(2, 1), (2, 11)])
gmsh.model.geo.translate(ov, 0.12, 0, 0)
print("New surfaces", ov[0][1], "and", ov[1][1])
# 定义体积
# ...(省略了点、线、面、曲面环、体积环的定义)
# 使用extrude函数挤出体积
ov2 = gmsh.model.geo.extrude([ov[1]], 0, 0, 0.12)
# 设置特定点的网格尺寸
gmsh.model.geo.mesh.setSize([(0, tag), ...], lc * 3)
# 同步数据并定义物理组
gmsh.model.geo.synchronize()
gmsh.model.addPhysicalGroup(3, [129, 130], 1, "The volume")
# 生成并保存网格
gmsh.model.mesh.generate(3)
gmsh.write("t2.msh")
# 可视化模型(如果命令行未指定"-nopopup")
if '-nopopup' not in sys.argv:
gmsh.fltk.run()
# 清理资源
gmsh.finalize()
# 注意:
# - 可以使用extrude等函数简化几何体定义
# - 可以导出几何体为不同格式(如Unrolled GEO、OpenCASCADE BRep)
# - Gmsh不转换几何体数据到通用表示,操作在原生CAD内核中执行
3、挤压网格、ONELAB参数、选项
import gmsh
import math
import sys
gmsh.initialize()
def createGeometryAndMesh():
gmsh.clear(); gmsh.model.add("t3")
# 定义基础几何体(从t1.py复制)
# ...(省略详细几何体定义)
# 挤出几何体和网格
h = 0.1
gmsh.model.geo.extrude([(2, 1)], 0, 0, h, [8, 2], [0.5, 1])
# 旋转挤出
gmsh.model.geo.revolve([(2, 28)], -0.1, 0, 0.1, 0, 1, 0, -math.pi / 2, [7])
# 扭转挤出,角度从ONELAB获取
angle = gmsh.onelab.getNumber('Parameters/Twisting angle')[0]
gmsh.model.geo.twist([(2, 50)], 0, 0.15, 0.25, -2 * h, 0, 0, 1, 0, 0,
angle * math.pi / 180., [10], [], True)
gmsh.model.geo.synchronize()
# 定义物理体积组
gmsh.model.addPhysicalGroup(3, [1, 2, ov[1][1]], 101)
gmsh.model.mesh.generate(3)
gmsh.write("t3.msh")
# 设置选项和颜色
gmsh.option.setNumber("Geometry.PointNumbers", 1)
gmsh.option.setColor("Geometry.Color.Points", 255, 165, 0)
# ...(省略其他颜色设置)
# 创建ONELAB参数
gmsh.onelab.set("""[{"type":"number","name":"Parameters/Twisting angle","values":[90],"min":0,"max":120,"step":1}]""")
createGeometryAndMesh()
# GUI事件处理
def checkForEvent():
if gmsh.onelab.getString("ONELAB/Action")[0] == "check":
gmsh.onelab.setString("ONELAB/Action", [""])
createGeometryAndMesh()
gmsh.graphics.draw()
return True
if "-nopopup" not in sys.argv:
gmsh.fltk.initialize()
while gmsh.fltk.isAvailable() and checkForEvent():
gmsh.fltk.wait()
gmsh.finalize()
# 注意:
# - 挤出、旋转挤出和扭转挤出用于生成复杂几何体
# - ONELAB参数允许在GUI中交互修改并与其他代码交换数据
# - GUI事件处理允许动态更新模型
4、内置功能、表面孔洞、注释、实体颜色
import gmsh
import math
import sys
import os
gmsh.initialize()
gmsh.model.add("t4")
# 定义常量
# ...(省略具体常量定义)
# 定义辅助函数hypot
def hypot(a, b):
return math.sqrt(a * a + b * b)
# 计算中间变量
# ...(省略中间变量计算)
# 定义几何体
factory = gmsh.model.geo
# 添加点和线
# ...(省略具体点和线定义)
# 添加圆弧和其他曲线
factory.addCircleArc(14, 15, 16, 3)
# ...(省略其他曲线定义)
# 定义曲面环和表面
factory.addCurveLoop([...], 21)
factory.addPlaneSurface([21], 22)
factory.addCurveLoop([...], 23)
factory.addPlaneSurface([23, 21], 24)
factory.synchronize()
# 添加注释
v = gmsh.view.add("comments")
gmsh.view.addListDataString(v, [10, -10], ["Created with Gmsh"])
gmsh.view.addListDataString(v, [0, 0.11, 0], ["Hole"], ["Align", "Center", "Font", "Helvetica"])
# 添加图片注释,包括不同尺寸和方向
# ...(省略具体图片注释代码)
# 设置双击事件响应
gmsh.view.option.setString(v, "DoubleClickedCommand", "Printf('View[0] has been double-clicked!');")
gmsh.option.setString("Geometry.DoubleClickedLineCommand", "Printf('Curve %g has been double-clicked!', Geometry.DoubleClickedEntityTag);")
# 设置实体颜色
# ...(省略具体颜色设置代码)
gmsh.model.mesh.generate(2)
gmsh.write("t4.msh")
# 启动GUI(如果未指定"-nopopup")
if '-nopopup' not in sys.argv:
gmsh.fltk.run()
gmsh.finalize()
# 注意:
# - 定义了包含孔的复杂表面
# - 使用了圆弧、图片注释等高级特性
# - 设置了实体颜色和双击事件响应
5、网格大小、宏、循环、体积中的孔
import gmsh
import math
import sys
gmsh.initialize()
gmsh.model.add("t5")
# 定义局部网格尺寸
lcar1, lcar2, lcar3 = .1, .0005, .055
# 定义几何体(一个截断的立方体)
# ...(省略具体点和线的定义)
# 定义曲面和曲面环
# ...(省略具体曲面和曲面环的定义)
# 创建一个列表来存储表面环,用于定义体积
shells = []
# 添加一个表面环来定义截断的立方体的外部边界和内部孔
sl = gmsh.model.geo.addSurfaceLoop([...])
shells.append(sl)
def cheeseHole(x, y, z, r, lc, shells):
# 在体积中创建一个球形孔
# ...(省略具体点和曲线弧的定义)
# 使用addSurfaceFilling填充曲面
# ...(省略具体曲面填充的定义)
# 创建一个新的表面环并添加到列表中
sl = gmsh.model.geo.addSurfaceLoop([...])
v = gmsh.model.geo.addVolume([sl])
shells.append(sl)
return v
# 在立方体中创建五个孔
x, y, z, r = 0, 0.75, 0, 0.09
for t in range(1, 6):
x += 0.166
z += 0.166
v = cheeseHole(x, y, z, r, lcar3, shells)
gmsh.model.geo.addPhysicalGroup(3, [v], t)
# 定义立方体的外部体积(包含五个孔)
gmsh.model.geo.addVolume(shells, 186)
gmsh.model.geo.synchronize()
# 定义物理体积组
gmsh.model.addPhysicalGroup(3, [186], 10)
# 设置网格生成选项
gmsh.option.setNumber("Mesh.Algorithm", 6) # 2D网格的Frontal-Delaunay算法
# ...(省略其他可选的网格生成设置)
gmsh.model.mesh.generate(3)
gmsh.write("t5.msh")
# 启动GUI(如果未指定"-nopopup")
if '-nopopup' not in sys.argv:
gmsh.fltk.run()
gmsh.finalize()
# 注意:
# - 定义了包含孔的复杂体积
# - 使用了表面填充来创建球形孔
# - 设置了网格生成算法和选项
# - 可以通过命令行参数调整全局网格尺寸因子