Gmsh有限元网格剖分(Python)---点、直线、平面的移动

devtools/2024/12/26 20:41:43/

Gmsh有限元网格剖分(Python)—点、直线、平面的移动和旋转

最近在学习有限元的网格剖分算法,主要还是要参考老外的开源Gmsh库进行,写一些博客记录下学习过程,方便以后回忆嘞。

Gmsh的官方英文文档可以参考:gmsh.pdf

但咋就说,这里面东西太多了,不太适合初学者去看,因此分享下自己学习的过程吧。

此次记录基于下面博客的内容:

Gmsh有限元网格剖分(Python)—任意点、直线、平面的创建

目录

  • Gmsh有限元网格剖分(Python)---点、直线、平面的移动和旋转
    • 1、点、直线、平面的移动
      • 1.1 点的移动
      • 1.2 线的移动
      • 1.3 面的移动
      • 1.4 总结
    • 2、点、直线、平面的旋转
      • 2.1、点的旋转
      • 2.2、线的旋转
      • 2.3、线的旋转-旋转图形中的线
      • 2.4、面的旋转

1、点、直线、平面的移动

1.1 点的移动

在Gmsh有限元网格剖分(Python)—任意点、直线、平面的创建的代码中额外创建一个点并连线:

python">point5_tag = kernel.addPoint(1, 2, 0, meshSize=mesh_size)
line5_tag = kernel.addLine(point4_tag, point5_tag)

绘制得到的结果如下:
在这里插入图片描述
使用下面的命令对新创建的点进行平移,其中:

------ [(0, point5_tag)]:0是代表移动的是0维的点,point5_tag是要移动的点的编号
------dx、dy、dz是向各个方向平移的距离

python">kernel.translate([(0, point5_tag)], dx=1, dy=0, dz=0)

geo引擎
如果我们使用gmsh自带的kernel = gmsh.model.geo引擎,可以看到平移后的线依旧连接,创建的线会和点一起移动:
在这里插入图片描述
occ引擎
如果我们使用Open CASCADE的kernel = gmsh.model.occ引擎,可以看到平移后的线不动,只移动单个点:
在这里插入图片描述
全部代码:

python">import mathimport gmsh
import sysgmsh.initialize()
# 新建模型,命名为t1,t1指的是整个结构
gmsh.model.add("my_t2")kernel = gmsh.model.geo
mesh_size = 5e-1
point1_tag = kernel.addPoint(0, 0, 0, meshSize=mesh_size)
point2_tag = kernel.addPoint(0, 1, 0, meshSize=mesh_size)
point3_tag = kernel.addPoint(1, 0, 0, meshSize=mesh_size)
point4_tag = kernel.addPoint(1, 1, 0, meshSize=mesh_size)
line1_tag = kernel.addLine(point1_tag, point2_tag)
line2_tag = kernel.addLine(point2_tag, point4_tag)
line3_tag = kernel.addLine(point4_tag, point3_tag)
line4_tag = kernel.addLine(point3_tag, point1_tag)
curve_loop_tag = kernel.addCurveLoop([line1_tag, line2_tag, line3_tag, line4_tag])
surface_tag = kernel.addPlaneSurface([curve_loop_tag])point5_tag = kernel.addPoint(1, 2, 0, meshSize=mesh_size)
line5_tag = kernel.addLine(point4_tag, point5_tag)kernel.translate([(0, point5_tag)], dx=1, dy=0, dz=0)# GMSH模型同步
kernel.synchronize()
# 创建点集合,命名为My point
gmsh.model.addPhysicalGroup(2, [surface_tag], name="My Surface")# 2维网格剖分
gmsh.model.mesh.generate(2)
# 保存一下
gmsh.write("my_t1.msh")
# 默认启动gui界面
if '-nopopup' not in sys.argv:gmsh.fltk.run()
# 结束gmsh
gmsh.finalize()

1.2 线的移动

线的移动基于同样的函数,其解释和代码如下:

------ [(1, line5_tag)]:1是代表移动的是1维的线,line5_tag是要移动的点的编号
------dx、dy、dz是向各个方向平移的距离

python">kernel.translate([(1, line5_tag)], dx=1, dy=0, dz=0)

occ引擎
如果我们使用Open CASCADE的kernel = gmsh.model.occ引擎,可以看到实际中线被平移了:
在这里插入图片描述
geo引擎
如果我们使用gmsh自带的kernel = gmsh.model.geo引擎,线的移动会改变原有的和线连接的结构,总之就是结构全部耦合在一块了:
在这里插入图片描述
全部代码:

python">import mathimport gmsh
import sysgmsh.initialize()
# 新建模型,命名为t1,t1指的是整个结构
gmsh.model.add("my_t2")kernel = gmsh.model.geo
mesh_size = 5e-1
point1_tag = kernel.addPoint(0, 0, 0, meshSize=mesh_size)
point2_tag = kernel.addPoint(0, 1, 0, meshSize=mesh_size)
point3_tag = kernel.addPoint(1, 0, 0, meshSize=mesh_size)
point4_tag = kernel.addPoint(1, 1, 0, meshSize=mesh_size)
line1_tag = kernel.addLine(point1_tag, point2_tag)
line2_tag = kernel.addLine(point2_tag, point4_tag)
line3_tag = kernel.addLine(point4_tag, point3_tag)
line4_tag = kernel.addLine(point3_tag, point1_tag)
curve_loop_tag = kernel.addCurveLoop([line1_tag, line2_tag, line3_tag, line4_tag])
surface_tag = kernel.addPlaneSurface([curve_loop_tag])point5_tag = kernel.addPoint(1, 2, 0, meshSize=mesh_size)
line5_tag = kernel.addLine(point4_tag, point5_tag)kernel.translate([(1, line5_tag)], dx=1, dy=0, dz=0)# GMSH模型同步
kernel.synchronize()
# 创建点集合,命名为My point
gmsh.model.addPhysicalGroup(2, [surface_tag], name="My Surface")# 2维网格剖分
gmsh.model.mesh.generate(2)
# 保存一下
gmsh.write("my_t1.msh")
# 默认启动gui界面
if '-nopopup' not in sys.argv:gmsh.fltk.run()
# 结束gmsh
gmsh.finalize()

1.3 面的移动

面的移动基于同样的函数,其解释和代码如下(将平面向上移动):

------ [(2, surface_tag)]:2是代表移动的是2维的面,surface_tag是要移动的面的编号
------dx、dy、dz是向各个方向平移的距离

python">kernel.translate([(2, surface_tag)], dx=0, dy=0, dz=1)

occ引擎
如果我们使用Open CASCADE的kernel = gmsh.model.occ引擎,可以看到实际中单独的这个面被平移了,其余结构没有变化:
在这里插入图片描述
geo引擎
如果我们使用gmsh自带的kernel = gmsh.model.geo引擎,面的移动会改变原有的和线连接的结构:
在这里插入图片描述
代码:

python">import mathimport gmsh
import sysgmsh.initialize()
# 新建模型,命名为t1,t1指的是整个结构
gmsh.model.add("my_t2")kernel = gmsh.model.geo
mesh_size = 5e-1
point1_tag = kernel.addPoint(0, 0, 0, meshSize=mesh_size)
point2_tag = kernel.addPoint(0, 1, 0, meshSize=mesh_size)
point3_tag = kernel.addPoint(1, 0, 0, meshSize=mesh_size)
point4_tag = kernel.addPoint(1, 1, 0, meshSize=mesh_size)
line1_tag = kernel.addLine(point1_tag, point2_tag)
line2_tag = kernel.addLine(point2_tag, point4_tag)
line3_tag = kernel.addLine(point4_tag, point3_tag)
line4_tag = kernel.addLine(point3_tag, point1_tag)
curve_loop_tag = kernel.addCurveLoop([line1_tag, line2_tag, line3_tag, line4_tag])
surface_tag = kernel.addPlaneSurface([curve_loop_tag])point5_tag = kernel.addPoint(1, 2, 0, meshSize=mesh_size)
line5_tag = kernel.addLine(point4_tag, point5_tag)kernel.translate([(2, surface_tag)], dx=0, dy=0, dz=1)# GMSH模型同步
kernel.synchronize()
# 创建点集合,命名为My point
gmsh.model.addPhysicalGroup(2, [surface_tag], name="My Surface")# 2维网格剖分
gmsh.model.mesh.generate(2)
# 保存一下
gmsh.write("my_t1.msh")
# 默认启动gui界面
if '-nopopup' not in sys.argv:gmsh.fltk.run()
# 结束gmsh
gmsh.finalize()

1.4 总结

kernel = gmsh.model.geo时对形状的编辑耦合比较严重
kernel = gmsh.model.occ时各个图形隔离度高,推荐使用occ引擎

2、点、直线、平面的旋转

2.1、点的旋转

使用下面的函数进行旋转:

python">kernel.rotate([(0, point5_tag)], 1, 1, 0, 0, 0, 1, -math.pi / 2)

其中:

------ [(0, point5_tag)]:0是代表移动的是0维的点,point5_tag是要移动的点的编号
------1, 1, 0参数代表旋转选择的中心点在坐标(1,1,0)
------0, 0, 1参数代表选择所绕的轴是Z轴
------(-math.pi / 2)参数表示是顺时针旋转90°

occ引擎
如果我们使用Open CASCADE的kernel = gmsh.model.occ引擎,可以看到只有点被旋转过去了:
在这里插入图片描述
geo引擎
如果我们使用gmsh自带的kernel = gmsh.model.geo引擎,可以看到点和点所在的线全部被旋转了:
在这里插入图片描述
全部代码:

python">import mathimport gmsh
import sysgmsh.initialize()
# 新建模型,命名为t1,t1指的是整个结构
gmsh.model.add("my_t2")kernel = gmsh.model.geo
mesh_size = 5e-1
point1_tag = kernel.addPoint(0, 0, 0, meshSize=mesh_size)
point2_tag = kernel.addPoint(0, 1, 0, meshSize=mesh_size)
point3_tag = kernel.addPoint(1, 0, 0, meshSize=mesh_size)
point4_tag = kernel.addPoint(1, 1, 0, meshSize=mesh_size)
line1_tag = kernel.addLine(point1_tag, point2_tag)
line2_tag = kernel.addLine(point2_tag, point4_tag)
line3_tag = kernel.addLine(point4_tag, point3_tag)
line4_tag = kernel.addLine(point3_tag, point1_tag)
curve_loop_tag = kernel.addCurveLoop([line1_tag, line2_tag, line3_tag, line4_tag])
surface_tag = kernel.addPlaneSurface([curve_loop_tag])point5_tag = kernel.addPoint(1, 2, 0, meshSize=mesh_size)
line5_tag = kernel.addLine(point4_tag, point5_tag)kernel.rotate([(0, point5_tag)], 1, 1, 0, 0, 0, 1, -math.pi / 2)# GMSH模型同步
kernel.synchronize()
# 创建点集合,命名为My point
gmsh.model.addPhysicalGroup(2, [surface_tag], name="My Surface")# 2维网格剖分
gmsh.model.mesh.generate(2)
# 保存一下
gmsh.write("my_t1.msh")
# 默认启动gui界面
if '-nopopup' not in sys.argv:gmsh.fltk.run()
# 结束gmsh
gmsh.finalize()

2.2、线的旋转

使用下面的函数进行旋转:

python">kernel.rotate([(1, line5_tag)], 1, 1, 0, 0, 0, 1, -math.pi / 2)

其中:

------ [(1, line5_tag)]:1是代表移动的是1维的线,line5_tag是要移动的线的编号
------1, 1, 0参数代表旋转选择的中心点在坐标(1,1,0)
------0, 0, 1参数代表选择所绕的轴是Z轴
------(-math.pi / 2)参数表示是顺时针旋转90°

occ引擎
如果我们使用Open CASCADE的kernel = gmsh.model.occ引擎,可以看到线和线上的点被成功旋转90°:
在这里插入图片描述
geo引擎
如果我们使用gmsh自带的kernel = gmsh.model.geo引擎,可以看到线和线上的点被成功旋转90°,此时使用两个3维引擎效果是一致的:
在这里插入图片描述
全部代码:

python">import mathimport gmsh
import sysgmsh.initialize()
# 新建模型,命名为t1,t1指的是整个结构
gmsh.model.add("my_t2")kernel = gmsh.model.geo
mesh_size = 5e-1
point1_tag = kernel.addPoint(0, 0, 0, meshSize=mesh_size)
point2_tag = kernel.addPoint(0, 1, 0, meshSize=mesh_size)
point3_tag = kernel.addPoint(1, 0, 0, meshSize=mesh_size)
point4_tag = kernel.addPoint(1, 1, 0, meshSize=mesh_size)
line1_tag = kernel.addLine(point1_tag, point2_tag)
line2_tag = kernel.addLine(point2_tag, point4_tag)
line3_tag = kernel.addLine(point4_tag, point3_tag)
line4_tag = kernel.addLine(point3_tag, point1_tag)
curve_loop_tag = kernel.addCurveLoop([line1_tag, line2_tag, line3_tag, line4_tag])
surface_tag = kernel.addPlaneSurface([curve_loop_tag])point5_tag = kernel.addPoint(1, 2, 0, meshSize=mesh_size)
line5_tag = kernel.addLine(point4_tag, point5_tag)kernel.rotate([(1, line5_tag)], 1, 1, 0, 0, 0, 1, -math.pi / 2)# GMSH模型同步
kernel.synchronize()
# 创建点集合,命名为My point
gmsh.model.addPhysicalGroup(2, [surface_tag], name="My Surface")# 2维网格剖分
gmsh.model.mesh.generate(2)
# 保存一下
gmsh.write("my_t1.msh")
# 默认启动gui界面
if '-nopopup' not in sys.argv:gmsh.fltk.run()
# 结束gmsh
gmsh.finalize()

2.3、线的旋转-旋转图形中的线

但是,上面我们旋转的线是单独的一根独立的线,如果我们选择旋转现有的构成图形的线,两个引擎会不会有什么区别呢?旋转的目标是下面这个,我们想将其逆时针旋转90°:
在这里插入图片描述
occ引擎-实际上是复制并旋转,这是为了保持原结构不变:
在这里插入图片描述
geo引擎-原来边的对应关系也全部改变了,逻辑关系比较复杂:
在这里插入图片描述
代码:

python">import mathimport gmsh
import sysgmsh.initialize()
# 新建模型,命名为t1,t1指的是整个结构
gmsh.model.add("my_t2")kernel = gmsh.model.geo
mesh_size = 5e-1
point1_tag = kernel.addPoint(0, 0, 0, meshSize=mesh_size)
point2_tag = kernel.addPoint(0, 1, 0, meshSize=mesh_size)
point3_tag = kernel.addPoint(1, 0, 0, meshSize=mesh_size)
point4_tag = kernel.addPoint(1, 1, 0, meshSize=mesh_size)
line1_tag = kernel.addLine(point1_tag, point2_tag)
line2_tag = kernel.addLine(point2_tag, point4_tag)
line3_tag = kernel.addLine(point4_tag, point3_tag)
line4_tag = kernel.addLine(point3_tag, point1_tag)
curve_loop_tag = kernel.addCurveLoop([line1_tag, line2_tag, line3_tag, line4_tag])
surface_tag = kernel.addPlaneSurface([curve_loop_tag])point5_tag = kernel.addPoint(1, 2, 0, meshSize=mesh_size)
line5_tag = kernel.addLine(point4_tag, point5_tag)kernel.rotate([(1, line2_tag)], 0, 1, 0, 0, 0, 1, math.pi / 2)# GMSH模型同步
kernel.synchronize()
# 创建点集合,命名为My point
gmsh.model.addPhysicalGroup(2, [surface_tag], name="My Surface")# 2维网格剖分
# gmsh.model.mesh.generate(2)
# 保存一下
gmsh.write("my_t1.msh")
# 默认启动gui界面
if '-nopopup' not in sys.argv:gmsh.fltk.run()
# 结束gmsh
gmsh.finalize()

2.4、面的旋转

使用下面的函数进行旋转:

python">kernel.rotate([(2, surface_tag)], 0, 0, 0, 0, 0, 1, math.pi / 4)

其中:

------ [(2, surface_tag)]:1是代表移动的是2维的面,surface_tag是要移动的面的编号
------0, 0 0参数代表旋转选择的中心点在坐标(0,0,0)
------0, 0, 1参数代表选择所绕的轴是Z轴
------(math.pi / 4)参数表示是逆时针旋转45°

occ引擎-可以看到原来的正方形向左滚了45°,但是线的位置不变:
在这里插入图片描述

geo引擎-可以看到原来的正方形向左滚了45°,且那线也跟着一起走了,结构是耦合的:
在这里插入图片描述
代码:

python">import mathimport gmsh
import sysgmsh.initialize()
# 新建模型,命名为t1,t1指的是整个结构
gmsh.model.add("my_t2")kernel = gmsh.model.geo
mesh_size = 5e-1
point1_tag = kernel.addPoint(0, 0, 0, meshSize=mesh_size)
point2_tag = kernel.addPoint(0, 1, 0, meshSize=mesh_size)
point3_tag = kernel.addPoint(1, 0, 0, meshSize=mesh_size)
point4_tag = kernel.addPoint(1, 1, 0, meshSize=mesh_size)
line1_tag = kernel.addLine(point1_tag, point2_tag)
line2_tag = kernel.addLine(point2_tag, point4_tag)
line3_tag = kernel.addLine(point4_tag, point3_tag)
line4_tag = kernel.addLine(point3_tag, point1_tag)
curve_loop_tag = kernel.addCurveLoop([line1_tag, line2_tag, line3_tag, line4_tag])
surface_tag = kernel.addPlaneSurface([curve_loop_tag])point5_tag = kernel.addPoint(1, 2, 0, meshSize=mesh_size)
line5_tag = kernel.addLine(point4_tag, point5_tag)kernel.rotate([(2, surface_tag)], 0, 0, 0, 0, 0, 1, math.pi / 4)# GMSH模型同步
kernel.synchronize()
# 创建点集合,命名为My point
gmsh.model.addPhysicalGroup(2, [surface_tag], name="My Surface")# 2维网格剖分
# gmsh.model.mesh.generate(2)
# 保存一下
gmsh.write("my_t1.msh")
# 默认启动gui界面
if '-nopopup' not in sys.argv:gmsh.fltk.run()
# 结束gmsh
gmsh.finalize()

http://www.ppmy.cn/devtools/145616.html

相关文章

要查询 `user` 表中 `we_chat_subscribe` 和 `we_chat_union_id` 列不为空的用户数量

文章目录 1、we_chat_subscribe2、we_chat_union_id 1、we_chat_subscribe 要查询 user 表中 we_chat_subscribe 列不为空的用户数量,你可以使用以下 SQL 查询语句: SELECT COUNT(*) FROM user WHERE we_chat_subscribe IS NOT NULL;解释: …

MyBatis学习

1、MyBatis的执行流程 2、MyBatis支持延迟加载,但是默认是没有开启动。 3、MyBatis缓存

【C++11】可变模板参数

目录 可变模板的定义方式 参数包的展开方式 递归的方式展开参数包 STL中的emplace相关接口函数 STL容器中emplace相关插入接口函数 ​编辑 模拟实现:emplace接口 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板,相比 C9…

最近常用linux、docker命令总结

最近常用linux、docker命令总结 1.ss -ulwn2.lsof -i :80803. ps aux | grep php4.docker stats5.docker inspect milvusapi6.docker ps --format "{{.Names}}: {{.Command}}" --no-trunc 1.ss -ulwn 基本含义 ss:全称是 Socket Statistics,用…

【magic-dash】01:magic-dash创建单页面应用及二次开发

文章目录 一、magic-dash是什么1.1 安装1.2 使用1.2.1 查看内置项目模板1.2.2 生成指定项目模板1.2.3 查看当前magic-dash版本1.2.4 查看命令说明1.2.5 内置模板列表二、创建虚拟环境并安装magic-dash三、magic-dash单页工具应用开发3.1 创建单页面项目3.1.1 使用命令行创建单页…

【Java基础面试题030】Java和Go的区别?

回答重点 可以从语言的设计理念、并发模型、内存管理、生态系统与应用场景来说: 1)语言设计理念: Java:Java是一种面向对象编程语言,强调继承、多态和封装等OOP特性。它运行在Java虚拟机(JVM&#xff09…

解析mysqlbinlog

一、前置设置 ps -ef | grep mysql 查看mysql进程对应的安装目录 需设置mysql binlog日志模式为 ROW 二、执行命令 [rootlocalhost bin]# mysqlbinlog --verbose --base64-outputdecode-rows /usr/local/mysql/data/binlog.000069 > 1.sql 查看文件具体内容

Docker服务发现新纪元:探索Consul的无限魅力

作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 •座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元个人主页:团儿.-CSDN博客 目录 前言&…