Gmsh <二>:Mesh generation

上一节主要涉及Gmsh的使用入门和几何模型构建简介中,我们讲了Gmsh构建几何的一些基本知识,下面主要侧重于Gmsh在网格生成方面的操作。

网格生成的不同算法

在Gmsh中,当几何模型构建完成后,我们可以使用函数gmsh.model.mesh.generate() 来生成网格,可以通过gmsh.model.mesh.setSize(gmsh.model.getEntities(0), 0.1) 来再次定义尺寸。接下来,我们可以设定不同的算法来生成网格。

import gmsh
   	
gmsh.initialize()
gmsh.model.add("model13")
gmsh.model.occ.addBox(1,1,1,1,1,1)
gmsh.model.occ.synchronize()
   	
gmsh.model.mesh.setSize(gmsh.model.getEntities(0), 0.05)
gmsh.option.setNumber("Mesh.Algorithm3D",1)
gmsh.model.mesh.generate(3)
   	
gmsh.fltk.run()
gmsh.finalize()

如果想要生成二维三角形网格,则\textcolor{blue}{generate()}函数中输入参数2,如果生成三维四面体网格,则输入参数3。在这里,我们使用\textcolor{blue}{gmsh.option.setNumber}来设置全局选项,而其他类似的函数如\textcolor{blue}{gmsh.option.setString} 和\textcolor{blue}{gmsh.option.setBool} 可以用来设置字符串和布尔类型的选项的值。

上面的代码中设置了网格生成所使用的算法,\textcolor{blue}{gmsh.option.setNumber(“Mesh.Algorithm3D”, 1)} 设置了生成四面体网格的算法为Delaunay算法,不同的数字选项表示不同的网格生成算法。在这里,\textcolor{blue}{“Mesh.Algorithm3D”}是用于控制三维网格生成过程中所使用的算法。下面是一些常见的选项值及其含义:

0 - 使用自动算法:Gmsh 将自动选择适合问题的算法。这是默认值。

1 - 使用Delaunay算法,这是一种常见的三角剖分算法,可以用于生成三维表面网格。适用于一般的几何形状。

2 - 使用Frontal-Delaunay 算法:这是一种更快速的 Delaunay 算法变体。适用于具有大量几何实体的复杂三维模型。

3 - 使用 Frontal-Delaunay 算法与局部优化:这个选项在 Frontal-Delaunay 算法的基础上引入了局部优化步骤,以改善网格质量。适用于需要更好网格质量的复杂三维模型。

结果如下:

p1

当然,除了 gmsh.option.setNumber,还有一些选项参数,如 “Mesh.Algorithm” 用于设置二维网格生成的算法选项,“Geometry.PointNumbers” 用于设置是否显示标签值,“Mesh.Smoothing” 用于设置平滑选项的参数, “Mesh.CharacteristicLengthFactor” 用于设置生成网格的特征长度的因子等。下面的代码中我们将会演示这几种参数的用法。


超限网格与结构网格的生成

超限网格

超限网格是在传统网格方法之外发展出的一种网格生成技术。传统网格方法通常将计算区域划分为规则形状的网格单元,且每个单元具有相同的大小和形状。而超限网格方法则不限制网格单元的形状和大小,允许在计算区域中使用不规则形状的网格单元。

import gmsh
import gmsh_geo_tools as tools

gmsh.initialize()

gmsh.model.add('model14')

vertices = [
    [0, 0], [2, 0], [2, 1], [1.2, 1.3], [0.7, 1.3], [0, 1]
]
# 调用顶点坐标生成二维网格的API
tools.model_made_point(vertices)

# 均匀插点
gmsh.model.geo.mesh.setTransfiniteCurve(2, 20)
gmsh.model.geo.mesh.setTransfiniteCurve(4, 6)
gmsh.model.geo.mesh.setTransfiniteCurve(5, 6)
gmsh.model.geo.mesh.setTransfiniteCurve(6, 10)

# 等比数列插点
gmsh.model.geo.mesh.setTransfiniteCurve(3, 30, "Progression", 1.1)
gmsh.model.geo.mesh.setTransfiniteCurve(1, 30, "Progression", -1.1)

# 生成超限网格
gmsh.model.geo.mesh.setTransfiniteSurface(1, "Right", [1, 2, 3, 6])
# 将三角形网格合并成四边形网格
gmsh.model.geo.mesh.setRecombine(2, 1)

gmsh.model.geo.synchronize()

# 设置平滑选项的参数
# gmsh.option.setNumber("Mesh.Smoothing", 1000)
# # 设置是否显示标签值
# gmsh.option.setNumber("Geometry.PointNumbers", 1)

gmsh.model.mesh.generate(2)

gmsh.fltk.run()
gmsh.finalize()

上述代码中,调用了tools文件夹(放置了上一章中我定义的用方程生成网格的API)里的model_made_point,先生成了一个二维图形,然后使用 setTransfiniteCurve函数在每条边上进行均匀插点,如果加入Progression参数与相应的值,就会按照等比数列进行插点,即新插入的点到上一个点的距离是到上两个点的距离的给定的值的倍数。之后,调用setTransfiniteSurface生成超限网格,由于超限插值是在曲面四边形上进行插值,因此需要给定四个顶点。之后我们可以使用setRecombine函数将三角形网格合并成为四边形网格,其中参数含义分别是维数2和需要合并的面1。

同时,我们还可以测试 “Mesh.Smoothing”“Geometry.PointNumbers” 的功能,将32和34行代码注释后,注释与非注释分别得到以下结果:
p2
不难发现,图b比a的网格线更平滑且有点的标签值。

结构网格

结构网格是一种规则的网格结构,也称作均匀网格或正交网格。在结构网格中,计算区域被划分为规则的网格单元,每个单元具有相同的形状和大小。结构网格通常由矩形或立方体网格单元组成,其边界与坐标轴平行。

利用超限插值,我们可以使用Gmsh生成结构网格

import gmsh
import gmsh_geo_tools as tools

gmsh.initialize()
gmsh.model.add("model15")

vertices = [
    [0, 0], [1, 0], [1, 1], [0, 1]
]
# 调用顶点坐标生成二维网格的API
tools.model_made_point(vertices)

# 对每一边进行均匀插值
for i in range(1, 5):
    gmsh.model.geo.mesh.setTransfiniteCurve(i, 10)

# 生成超限网格
gmsh.model.geo.mesh.setTransfiniteSurface(1, "Right")

# 合并为四边形网格
gmsh.model.geo.mesh.setRecombine(1, 1)

gmsh.model.geo.synchronize()

gmsh.model.mesh.generate(2)

gmsh.write("quadrilateralMesh.off")

gmsh.fltk.run()
gmsh.finalize()

由于该几何体本身就是个四边形,所以setTransfiniteSurface不需要给定四个点的编号。同样的我们对setRecombine进行测试,注释21行,分别得到结构三角形网格和结构四边形网格如下:

p2.5


网格尺寸场

除了在每点处设置网格尺寸,Gmsh还提供了使用Field设置网格尺寸的方法,通过定义尺寸场类型和相应的尺寸场参数,可以生成不同尺寸分布的网格,我们举例来进行说明。

import gmsh
    	
gmsh.initialize()
gmsh.model.add("model16")
    	
lc = 0.15
    	
gmsh.model.occ.addRectangle(0, 0, 0, 1, 1, 1)
gmsh.model.occ.synchronize()
    	
# 定义 Box 尺寸场,标号为1
gmsh.model.mesh.field.add("Box", 1)  
    	
# 设定参数
gmsh.model.mesh.field.setNumber(1, "VIn", lc/15)
gmsh.model.mesh.field.setNumber(1, "VOut", lc)
gmsh.model.mesh.field.setNumber(1, "XMin", 0.4)
gmsh.model.mesh.field.setNumber(1, "YMin", 0.4)
gmsh.model.mesh.field.setNumber(1, "XMax", 0.6)
gmsh.model.mesh.field.setNumber(1, "YMax", 0.6)
gmsh.model.mesh.field.setNumber(1, "Thickness", 0.3)
    	
# 将尺寸场设置为背景网格
gmsh.model.mesh.field.setAsBackgroundMesh(1)
    	
gmsh.model.mesh.generate(2)
gmsh.fltk.run()
gmsh.finalize()

结果如下:

p3
上述代码中,我们先定义了一个Box尺寸场,编号为1,然后调用setNumbers设置参数(15到21代码中,第一个参数都是尺寸场的编号,第三个参数都是要设置的参数值),通过XMinXMaxYMinYMax定义了一个矩形区域(三维还可以给定ZMinZMax定义立方体),只有在该区域内的网格尺寸会受到尺寸场的影响。并且给定了区域内外的过渡层厚度Thickness,在区域内外设置不同的网格尺寸VInVOut。然后使用setAsBackgroundMesh将尺寸场设置为背景网格,其作用是在生成网格时,确保整个几何模型都受到尺寸场的影响(这意味着,尺寸场所定义的细化和粗化策略将应用于整个几何模型,无论是内部区域还是边界区域)。效果如上图所示。

不同的Field有着不同的功能,有些Field还需要结合使用,例如DistanceThreshold

gmsh.model.mesh.field.add("Distance",2)
gmsh.model.mesh.field.setNumbers(2,"PointsList",[1])
gmsh.model.mesh.field.setNumbers(2,"CurvesList",[2])
gmsh.model.mesh.field.setNumber(2,"Sampling",100)
      	
gmsh.model.mesh.field.add("Threshold", 3)
gmsh.model.mesh.field.setNumber(3, "InField", 2)
gmsh.model.mesh.field.setNumber(3, "SizeMin", lc / 30)
gmsh.model.mesh.field.setNumber(3, "SizeMax", lc)
gmsh.model.mesh.field.setNumber(3, "DistMin", 0.15)
gmsh.model.mesh.field.setNumber(3, "DistMax", 0.5)
      	
gmsh.model.mesh.field.setAsBackgroundMesh(3)

Distance尺寸场并不提供网格尺寸,它只计算区域内其他点到传入其中的点,边,面的距离,而Threshold尺寸场可以通过InField参数传入Distance的数据,根据到给定点,边,面的距离设置相应的网格尺寸,结果如下所示。
p4

上述代码中,先定义一个Distance尺寸场,接下来,用代码设置了尺寸场的特定参数。通过
setNumbers函数,将编号为1的点添加到尺寸场的"PointsList"中,将编号为2的曲线添加到尺寸场的"CurvesList"中,以便通过这些几何实体控制尺寸场的行为,然后设置了尺寸场的一些数值参数,包括 “Sampling” (采样点数),这里设置为100,以决定在离散几何实体的情况下生成网格的质量。接下来,创建一个Threshold尺寸场,使用setNumber函数设置各个参数,包括 “InField”(参考尺寸场的ID)设置为2、 “SizeMin”(最小尺寸)设置为lc / 30、“SizeMax” (最大尺寸)设置为lc,“DistMin”(最小距离)设置为0.15,“DistMax”(最大距离)设置为0.5。

Gmsh还提供了NathEval尺寸场,可以直接通过输入数学函数作为尺寸场生成网格。

gmsh.model.mesh.field.add("MathEval",4)
gmsh.model.mesh.field.setString(4, "F","Cos(4*3.14*x) * Sin(4*3.14*y) / 10 + 0.101")
      	
gmsh.model.mesh.field.setAsBackgroundMesh(4)

上述代码中,我们在setString中采用关键字 “F” 来设置尺寸场的函数表达式。字符串"Cos(43.14x) * Sin(43.14y) / 10+0.101"表示尺寸场的函数表达式。该表达式使用了数学函数cos和sin,其中4*3.14代表周期为2的四分之一正弦波和余弦波。将该表达式除以10然后加上0.101用于对尺寸进行缩放和偏移,以便在生成网格时产生所需的尺寸。

注,输入的函数只能是Gmsh里所提供顶点数学函数,自定义的函数无法输入。

效果如下:
p5

到目前位置我们已经定义了四种尺寸场,接下来我们可以使用Min尺寸场将所有尺寸场整合到一起。

gmsh.model.mesh.field.add("Min", 5)
gmsh.model.mesh.field.setNumbers(5, "FieldsList", [1,3,4])
      	
gmsh.model.mesh.field.setAsBackgroundMesh(5)

Min尺寸场可将其他尺寸场以尺寸场列表 “FieldsList” 的形式输入,取所有尺寸场的网格尺寸最小值,并将输入的尺寸场合并,如下图所示。

p6

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/220493.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

unity 2d入门飞翔小鸟按钮点击功能且场景切换(二)

1、素材包获取 链接: https://pan.baidu.com/s/1KgCtQ_7wt2mlbGbIaMVvmw 提取码: xxh8 2、将素材全部拉进去 3、创建新的场景 并且将场景添加到build settings里面 4、脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityE…

Python的海龟 turtle 库使用详细介绍(画任意多边形,全网最详细)

学Turtle库,其实就是学数学,而且还能提高对数学和学习的兴趣。Turtle库还能够帮助孩子更好地理解几何学和数学概念,比如角度、比例、几何图形的性质等等,是Python中一个很有趣的库。 前言 Turtle库是Python中一个很有趣的库&…

装修流程篇

装修流程 https://www.xiaohongshu.com/explore/627ba70d00000000210357b3 https://www.xiaohongshu.com/explore/63b6bc0c000000002203776f 半包装修流程 https://www.xiaohongshu.com/explore/64e5ea3b0000000003021711 户型图 效果 https://www.xiaohongshu.com/ex…

5G承载网和大客户承载的演进

文章目录 移动4/5G承载网联通和电信4/5G承载网M-OTN(Metro-optimized OTN),城域型光传送网PeOTN(packet enhanced optical transport network),分组增强型OTN板卡增强型PeOTN集中交叉型PeOTN VC-OTN&#x…

CoreDNS实战(六)-编译安装unbound插件

本文主要介绍coredns的unbound插件进行编译安装的过程及常用的配置方法。 coredns官方的unbound文档:unbound unbound插件的github地址:https://github.com/coredns/unbound 注:unbound插件虽然是coredns中的External Plugins,但…

如何使用llm 制作多模态

首先将任何非字符的序列信息使用特殊n个token 编码。 具体编码方法以图像为例子说明: 将固定尺寸图像如256256 的图像分割为1616 的子图像块。 将已知的所有图像数据都分割后进行str将其看做是一个长的字符,而后去重后方式一个词表。 使用特殊1024 个tok…

GNN Maximum Flow Problem (From Shusen Wang)

Maximum Flow Problem ShusenWang 图数据结构和算法课程笔记 Slides Maximum Flow Problem Description Naive Algorithm Residual Capacity - FlowLeft: Original GraphRight: Residual Graph - Bottleneck capacity 2- Iteration 2:- Find an augmenting path: s -&g…

IntelRealSense深度相机D455在ROS1运行中的消息内容

IntelRealSense深度相机D455在ROS1运行中的消息内容 通过下面命令所有相关信息通过ros topic的方式发布出去rosnode查看rqt_graph查看rostopic查看通过下面命令直接查看RVIZ中点云信息rosnode查看rqt_graph查看rostopic查看 Physical Port:: /sys/devices/pci0000:0…

线性回归既是一种数据挖掘与建模算法,也是统计学领域、计量经济学领域的常用学术建模方法,有何不同?

一.线性回归的基本形式 线性回归既是一种数据挖掘与建模算法,也是统计学领域、计量经济学领域的常用学术建模方法。在数据挖掘与建模领域,线性回归算法是一种较为基础的机器学习算法,其基本思想是将响应变量(因变量、被解释变量&…

协议栈的内部结构

上层会向下层逐层委派工作。 最上面的部分是网络应用程序,它们会将收发数据等工作委派给下层的部分来完成。尽管不同的应用程序收发的数据内容不同,但收发数据的操作是共通的。 应用程序的下面是Socket库,其中包括解析器,解析器…

Java+Swing+Mysql实现超市管理系统

一、系统介绍 1.开发环境 操作系统:Win10 开发工具 :IDEA2018 JDK版本:jdk1.8 数据库:Mysql8.0 2.技术选型 JavaSwingMysql 3.功能模块 4.系统功能 1.系统登录登出 管理员可以登录、退出系统 2.商品信息管理 管理员可以对商品信息…

Windows下安装Git和Git小乌龟

目录 Git简介 Git安装 Git小乌龟简介 Git小乌龟安装 Git简介 Git是一个开源的分布式版本控制系统,可以有效、高速地进行从很小到非常大的项目的版本管理。Git支持将本地仓库与远程仓库进行关联,实现多人协作开发。由于具有分布式版本控制、高效性、灵…

掌握Python Pingouin:数据统计新利器解析!

更多资料获取 📚 个人网站:ipengtao.com Pingouin库基于pandas、scipy和statsmodels,为用户提供了执行常见统计分析的功能。它支持各种统计方法和假设检验,例如 t-tests、ANOVA、correlation analysis 等。让我们看一些示例代码&…

打表技巧—连续正数和

与其明天开始,不如现在行动! 文章目录 连续正数和1 题目描述2 解决思路3 代码实现 💎总结 连续正数和 1 题目描述 定义一种数:可以表示成若干 (数量>1) 连续正数和的数比如: 5 23,5就是这样的数 12345,12就是这样…

全球与中国胃肠道治疗市场:增长趋势、竞争格局与前景展望

胃肠道治疗学是指医学和医疗保健的一个领域,专注于影响胃肠道 (GI) 的疾病和病症的诊断、治疗和管理。胃肠道治疗包括药物治疗和手术干预,旨在解决各种胃肠道疾病,如食道(GERD)、发炎性肠道疾病疾病(IBD)、消化性溃疡和腹泻。它包括多种医学方…

详解十大经典排序算法(五):归并排序(Merge Sort)

算法原理 归并排序的核心思想是将一个大的数组分割成多个小的子数组,然后分别对这些子数组进行排序,最后将排序后的子数组合并起来,得到一个有序的大数组。 算法描述 归并排序(Merge Sort)是一种经典的排序算法&#x…

Azure Machine Learning - 在 Azure 门户中创建演示应用

目录 准备环境启动向导配置搜索结果添加自动提示功能添加建议创建、下载和执行清理资源 使用 Azure 门户的“创建演示应用”向导来生成可下载的“localhost”样式的 Web 应用,该应用在浏览器中运行。 根据其配置,生成的应用在首次使用时就能正常运行&…

第2章 知识抽取:概述、方法

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

信号可靠性剖析

问题 基于信号发送的进程间通信方式可靠吗??? 信号查看(kill -l) 信号的分类 不可靠信号 (传统信号) 信号值在 [1, 31] 之间的所有信号 可靠信号 (实时信号) 信号值在 [SIGRTMIN,SIGRTMAX],即:[34&…

odoo自定义提示性校验

背景: 在odoo16的原生的代码里,可以给按钮添加一个 confirm属性,从而达到 提示性校验的效果。 问题: 这个属性加了之后一定会弹出提示性校验的对话框,于是如何根据我们的实际业务,从后端返回提示性信息,…