Gmsh教程

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()  
  
# 注意:  
# - 定义了包含孔的复杂体积  
# - 使用了表面填充来创建球形孔  
# - 设置了网格生成算法和选项  
# - 可以通过命令行参数调整全局网格尺寸因子

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值