Gmsh <二>:Mesh generation

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

网格生成的不同算法

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

import gmshgmsh.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 toolsgmsh.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 toolsgmsh.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 gmshgmsh.initialize()
gmsh.model.add("model16")lc = 0.15gmsh.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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件测试:测试用例八大要素模板

一、通用测试用例八要素 1、用例编号; 2、测试项目; 3、测试标题; 4、重要级别; 5、预置条件; 6、测试输入; 7、操作步骤; 8、预期输出 二、具体分析通用测试用例八要素 1、用例编号 一般是数字…

sqlmap400报错问题解决

python sqlmap.py -r sql.txt --batch --techniqueB --tamperspace2comment --risk 3 --force-ssl–batch 选项全部默认 不用再手动输入 –techniqueB 使用布尔盲注,该参数是指出要求使用的注入方式 –tamperspace2comment使用特殊脚本,space2comment是把…

Linux lshw命令(lshw指令)(List Hardware,获取底层硬件信息)(查询硬件信息)

文章目录 Linux lshw命令:一个全面的硬件信息查询工具介绍安装lshw使用lshwlshw的选项和参数lshw文档英文文档中文文档 命令示例lshw -c network -sanitize查看系统网络硬件信息,并移除敏感项(显示为REMOVED) lshw与其他命令的对比…

视频集中存储/智能分析融合云平台EasyCVR平台接入rtsp,突然断流是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

微信小程序nodejs+vue+uniapp视力保养眼镜店连锁预约系统

作为一个视力保养连锁预约的网络系统,数据流量是非常大的,所以系统的设计必须满足使用方便,操作灵活的要求。所以在设计视力保养连锁预约系统应达到以下目标: (1)界面要美观友好,检索要快捷简易…

APP分发平台的域名HTTPS域名怎么绑定

一、登录咕噜分发官网(https://www.gulufenfa.com) 二、进入控制台后在左侧选择【个人中心】—【绑定域名】 三、 我这里用https协议阿里云备案给大家做个演示 四、申请SSL证书 我这里使用的证书是用的阿里云免费SSL证书 登录阿里云网站(www.aliyun.com) 选择【数字证书管理…

【C语言】函数递归详解(一)

目录 1.什么是递归: 1.1递归的思想: 1.2递归的限制条件: 2.递归举例: 2.1举例1:求n的阶乘: 2.1.1 分析和代码实现: 2.1.2图示递归过程: 2.2举例2:顺序打印一个整数的…

【问题总结】Docker环境下,将Nacos版本2.0.4升级到2.2.3,操作留档 以及 踩坑记录

前记,鉴于nacos暴露的验证鉴权bug(之前尝试解决但是没有完全解决!,需要对公司之前架构留下来的老版本nacos进行升级 参考资料: https://nacos.io/zh-cn/blog/announcement-token-secret-key.html https://nacos.io/…

SpringbootWeb登录认证

登录校验 会话技术 会话:用户打开浏览器,访问web服务器的资源,会建立会话,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。会话跟踪:一种维护浏览器状态的方法,服务器需要…

Redis quicklist源码+listpack源码(6.0+以上版本)

ziplist设计上的问题,每一次增删改都需要计算前面元素的空间和长度(prevlen),这种设计缺陷非常明显,一旦其中一个entry发生修改,以这个entry后面开始,全部需要重新计算prevlen,因此诞…

SQL Sever 基础知识 - 数据筛选(2)

SQL Sever 基础知识 - 四、数据筛选 第3节 NULL3.1 NULL 和三值逻辑3.2 IS NULL / IS NOT NULL 第4节 AND4.1 AND 运算符简介4.2 AND 运算符示例4.2.1 一个 AND 运算符4.2.2 多个 AND 运算符4.2.3 将 AND 运算符与其他逻辑运算符一起使用 第5节 OR5.1 OR 运算符简介5.2 OR 运算…

web前端之css变量的妙用、通过JavaScrip改变css文件中的属性值、querySelector、setProperty

MENU 效果图htmlJavaScripstylequerySelectorsetProperty 效果图 html <div id"idBox" class"p_r w_680 h_160 b_1s_red"><div id"idItem" class"p_a l_0 t_30 w_100 h_100 bc_rgba_255_00_05 radius_50_"></div> …