Gmsh概述

1、概述

        Gmsh是一个内置CAD引擎和后处理器的三维有限元网格生成器。其设计目标是提供一个快速、轻量级且用户友好的网格划分工具,具有参数化输入和灵活的可视化功能。

        Gmsh围绕四个模块构建(几何、网格、求解器和后处理),这些模块可以通过图形用户界面(GUI;见Gmsh图形用户界面)、命令行界面(见Gmsh命令行界面)、使用Gmsh自己的脚本语言编写的文本文件(.geo文件;见Gmsh脚本语言)或通过C++、C、Python、Julia和Fortran应用程序编程接口(API;见Gmsh应用程序编程接口)进行控制。

        以下是对这四个模块的简要描述,随后将概述Gmsh的擅长之处(……以及不太擅长之处),并提供一些关于如何在您的计算机上安装和运行Gmsh的实用信息。

2、几何模块

        Gmsh中的模型是通过其边界表示(BRep)定义的:体积由一组曲面界定,曲面由一系列曲线界定,而曲线由两个端点界定。模型实体是拓扑实体,即它们只处理模型中的邻接关系,并且作为一组抽象的拓扑类来实现。这个BRep通过定义嵌入式或内部模型实体来扩展:内部点、曲线和曲面可以嵌入到体积中;内部点和曲线可以嵌入到曲面中。

        模型实体的几何形状可以由不同的CAD内核提供。Gmsh默认接口的两个内核是内置内核和OpenCASCADE内核。Gmsh不会将一个内核的几何表示转换为另一个内核,或者将这些内核转换为某种中性表示。相反,Gmsh直接查询每个CAD内核的本地数据,这避免了数据丢失,对于复杂模型至关重要,因为转换不可避免地会引入与略有不同的表示相关的问题。在.geo脚本中选择CAD内核是通过SetFactory命令完成的(见几何脚本命令),而在Gmsh API中,内核在所有来自gmsh/model命名空间的相关函数中显式出现,内置内核和OpenCASCADE内核分别有geo或occ前缀(见命名空间gmsh/model)。

        实体可以以自下而上的方式构建(首先是点,然后是曲线、曲面和体积),使用内置内核和OpenCASCADE内核,或者以自上而下的构造实体几何方式构建(对其执行布尔运算的实体),使用OpenCASCADE内核。这两种方法也可以结合使用。最后,可以基于基本几何实体定义模型实体组(称为“物理组”)。(见基本实体与物理组,了解更多关于物理组如何影响网格保存方式的信息。)

        模型实体(也称为“基本实体”)和物理组都由一对整数唯一定义:它们的维度(0表示点,1表示曲线,2表示曲面,3表示体积)和它们的标签,一个严格为正的全局识别号。实体和组标签在每个维度上是唯一的:

        每个点必须拥有唯一的标签;
        每条曲线必须拥有唯一的标签;
        每个曲面必须拥有唯一的标签;
        每个体积必须拥有唯一的标签。
        零或负标签由Gmsh保留用于内部使用。

        几何模块中的模型实体可以以多种方式进行操作和变换,但操作总是在它们各自的CAD内核中直接执行。如上所述,没有通用的内部几何表示:相反,Gmsh使用每个CAD内核自己的API在本地几何表示上直接执行操作(平移、旋转、交集、并集、片段等)。同样,模型可以通过每个CAD内核自己的导入机制导入到几何模块中。例如,默认情况下,Gmsh通过OpenCASCADE导入STEP和IGES文件,这将导致创建具有内部OpenCASCADE表示的模型实体。使用内置CAD内核表示的模型可以通过将它们导出为.geo_unrolled文件来序列化到磁盘,而使用OpenCASCADE内核构建的模型可以序列化为.brep或.xao文件。

        Gmsh教程,从t1开始,是学习如何使用几何模块的最佳地点:它包含了基于内置内核和OpenCASCADE内核的复杂度逐渐增加的示例。请注意,几何模块的许多功能都可以在GUI中交互使用(见Gmsh图形用户界面),这也是学习Gmsh脚本语言和API的好方法,因为几何模块中的操作会自动将相关命令追加到输入脚本文件中,并且还可以选择为API支持的语言生成输入(见General.ScriptingLanguages选项;在Gmsh 4.12版本中,这仍然是一个正在进行的工作。)

        除了其几何形状由CAD内核提供的CAD类型几何实体外,Gmsh还支持离散模型实体,它们由网格定义(例如STL)。Gmsh不对此类离散实体执行几何操作,但它们可以通过所谓的“重新参数化”过程配备几何形状。然后,参数化用于网格划分,与CAD实体的方式完全相同。见t13示例。

3、网格模块

        模型的有限元网格是其几何形状通过不同形状的简单几何元素(在Gmsh中:线、三角形、四边形、四面体、棱柱、六面体和金字塔)进行的镶嵌,这些元素的排列方式使得如果其中两个相交,它们将沿着一个面、一条边或一个节点相交,而不是以其他方式相交。这就定义了一个所谓的共形网格。网格模块实现了多种算法来自动生成此类网格。默认情况下,即使是以结构化方式(例如,通过拉伸)生成的,Gmsh生成的网格也被视为非结构化的。这意味着网格元素完全由它们的节点的有序列表定义,并且不假设任何两个元素之间存在预定的排序关系。

        为了保证网格的共形性,网格生成是按照自底向上的流程进行的:首先离散化曲线;然后使用曲线的网格来网格化曲面;接着使用曲面的网格来网格化体积。在此过程中,一个实体的网格仅受其边界网格的约束,除非较低维度的实体被显式地嵌入到较高维度的实体中。例如,在三维空间中,只有当曲面是体积的边界的一部分,或者该曲面已被显式地嵌入到体积中时,离散化曲面的三角形才会被迫成为最终三维网格中的四面体的面。这自动确保了网格的共形性,例如,当两个体积共享一个公共曲面时。网格元素的方向根据底层实体的几何方向来确定。每个网格划分步骤都受网格大小字段的约束,该字段规定了网格中元素的期望大小。这个大小字段可以是均匀的,由与几何中的点关联的值指定,或者由一般的网格大小字段定义(例如,与某些边界的距离、在另一个网格上定义的任意标量场等):参见Gmsh网格大小字段。对于每个网格划分步骤,首先执行所有结构化网格指令,并为非结构化部分提供额外的约束。(共形网格的生成和处理对Gmsh内部存储网格的方式以及通过API访问网格的方式有重要影响:参见Gmsh应用程序编程接口。)

        Gmsh的网格模块包含多种一维、二维和三维网格划分算法:

        二维非结构化算法生成三角形和/或四边形(当使用重组命令或选项时)。三维非结构化算法生成四面体,或者当边界网格包含四边形时,生成四面体和金字塔。

        二维结构化算法(超限插值和拉伸)默认生成三角形,但通过使用重组命令或选项可以获得四边形。三维结构化算法根据它们所基于的曲面网格的类型,生成四面体、六面体、棱柱和金字塔。

1.3.1 选择合适的非结构化算法

        Gmsh提供了多种二维和三维非结构化算法供选择。每种算法都有其自身的优点和缺点。

        对于所有二维非结构化算法,首先使用分治算法构造一个包含一维网格中所有点的Delaunay网格。然后,使用边交换来恢复缺失的边。在这一初始步骤之后,可以应用多种算法来生成最终网格:

        “MeshAdapt”算法基于局部网格修改。该技术使用边交换、拆分和合并:长边被拆分,短边被合并,如果获得更好的几何配置,则交换边。

        “Delaunay”算法受到INRIA的GAMMA团队工作的启发。新点按顺序插入到具有最大无量纲外接圆半径的元素的外接圆中心。然后,使用各向异性Delaunay准则重新连接网格。

        “Frontal-Delaunay”算法受到S. Rebay工作的启发。

        还有其他具有特定功能的实验性算法可用。特别是,“Frontal-Delaunay for Quads”是“Frontal-Delaunay”算法的一个变体,旨在生成适合重组的直角三角形;而“BAMG”允许生成各向异性三角形网格。

        对于非常复杂的曲面,“MeshAdapt”算法是最稳健的。当元素质量很重要时,应尝试使用“Frontal-Delaunay”算法。对于非常大的平面网格,“Delaunay”算法是最快的;它通常也比“Frontal-Delaunay”更好地处理复杂的网格大小字段。当“Delaunay”或“Frontal-Delaunay”算法失败时,将自动触发“MeshAdapt”。“Automatic”算法对平面使用“Delaunay”,对所有其他曲面使用“MeshAdapt”。

        还提供了几种三维非结构化算法:

        “Delaunay”算法分为三个单独的步骤。首先,对模型中所有体积的并集进行初始网格划分,而不在体积中插入点。然后,使用H. Si的边界恢复算法Tetgen/BR恢复曲面网格。然后,应用上述二维Delaunay算法的三维版本来在体积中插入点,以满足网格大小约束。

        “Frontal”算法使用J. Schoeberl的Netgen算法。

        “HXT”算法是Delaunay算法的一种新的、高效且并行的重新实现。

        还有其他具有特定功能的实验性算法可用。特别是,“MMG3D”允许生成各向异性四面体网格。

        目前,“Delaunay”算法是最稳健的,也是唯一支持自动生成包含金字塔的混合网格的算法。嵌入式模型实体和一般网格大小字段(参见指定网格元素大小)目前仅由“Delaunay”和“HXT”算法支持。

        当Gmsh配置有OpenMP支持时(参见编译源代码),大多数网格划分步骤可以并行执行:

        一维和二维网格划分使用粗粒度方法进行并行化,即每条曲线(或每个曲面)按顺序进行网格划分,但可以同时网格划分多条曲线(或多个曲面)。

        使用HXT进行三维网格划分时,使用细粒度方法进行并行化,即对单个体积的实际网格划分过程是并行的。

        线程数可以通过命令行上的-nt标志(参见Gmsh命令行界面)或General.NumThreads、Mesh.MaxNumThreads1D、Mesh.MaxNumThreads2D和Mesh.MaxNumThreads3D选项(参见通用选项和网格选项)进行控制。

1.2.2 指定网格元素大小

        对于给定的几何形状,有几种方法可以指定网格元素的大小:

        首先,如果设置了选项Mesh.MeshSizeFromPoints和Mesh.MeshSizeExtendFromBoundary(默认情况下是设置的;见“网格选项”),你可以简单地在模型的几何点上指定所需的网格元素大小。然后,在网格生成过程中,将通过在这些值之间进行插值来计算网格元素的大小。这有时可能会导致某些区域过度细化,因此你可能需要在模型中添加“虚拟”几何实体以获得所需的元素大小,或使用下面解释的更高级的方法。

        其次,如果Mesh.MeshSizeFromCurvature设置为正值(默认情况下设置为0),则网格将根据模型实体的曲率进行适应,该值表示每2π弧度内的目标元素数量。

        接下来,你可以指定一个一般的目标网格大小,表示为网格大小字段的组合(见“Gmsh网格大小字段”):

        Box字段指定了平行六面体区域内部和外部的元素大小。

        Distance字段根据与某些模型实体的距离来指定网格的大小。

        MathEval字段使用明确的数学函数来指定网格的大小。

        PostView字段以标量后处理视图的形式(见“后处理模块”和“Gmsh文件格式”)指定了一个明确的背景网格,其中节点值是目标元素大小。这种方法非常通用,但它需要一个初步的(通常是粗略的)网格和一种在该网格上计算目标大小的方法(通常是通过误差估计过程,例如在网格适应的迭代过程中)。

        Min字段将大小指定为使用其他字段计算出的大小的最小值。

        网格大小还受到结构化网格约束(例如,跨有限元或挤出网格)以及任何未配备几何形状的离散模型实体的约束,因此这些实体在网格生成过程中将保留其网格。

        根据Mesh.MeshSizeExtendFromBoundary的值,边界网格大小会在表面和/或体积内部进行插值。

        为了确定模型中任何给定点的实际网格大小,Gmsh会评估所有上述网格大小约束,并选择最小的值。使用Gmsh API,可以通过提供的C++、C、Python、Julia或Fortran网格大小回调函数(通过gmsh/model/mesh/setSizeCallback;见“命名空间gmsh/model/mesh”)进一步修改此值。

        所得值进一步受到区间[Mesh.MeshSizeMin,Mesh.MeshSizeMax]的约束(也可以在命令行上使用-clmin和-clmax提供)。然后,所得值最终乘以Mesh.MeshSizeFactor(在命令行上为-clscale)。

        请注意,当元素大小完全由网格大小字段指定时,通常希望设置

        Mesh.MeshSizeFromPoints = 0;

        Mesh.MeshSizeFromCurvature = 0;

        Mesh.MeshSizeExtendFromBoundary = 0;

        以防止由于边界上的网格尺寸过小而导致实体内部过度细化。

1.3.3 基本实体与物理组

        通常,将基本几何实体组合成更有意义的组是很方便的,例如,定义一些数学性质(“域”、“带诺依曼条件的边界”)、功能性质(“左翼”、“机身”)或材料性质(“钢”、“碳”)。在Gmsh的几何模块(见“几何模块”)中,通过定义“物理组”来实现这种分组。

        在Gmsh的MSH网格文件格式(见“Gmsh文件格式”)以及大多数其他网格格式中,默认情况下,如果定义了物理组,则输出网格仅包含至少属于一个物理组的元素。(不同的网格文件格式处理物理组的方式略有不同,这取决于它们定义组的能力。)若要保存所有网格元素,无论是否定义了物理组,请使用Mesh.SaveAll选项(见“网格选项”)或在命令行中指定-save_all。在某些格式(例如MSH2)中,设置Mesh.SaveAll将丢弃所有物理组定义。

4、求解器模块

        Gmsh实现了一个ONELAB(http://onelab.info)服务器,以便与外部求解器或其他代码(称为“客户端”)交换数据。ONELAB接口允许调用此类客户端,并让它们共享参数和建模信息。

        该实现基于客户端-服务器模型,具有服务器端数据库以及通过内存或TCP/IP套接字进行通信的本地或远程客户端。与大多数求解器接口不同,ONELAB服务器对客户端的任何特定信息(如输入文件格式、语法等)没有先验知识。这是通过在任何模拟之前进行分析阶段来实现的,在该阶段,要求客户端将其参数集上传到服务器。参数集的完整性和一致性问题完全在客户端处理:ONELAB的作用仅限于数据集中、修改和重新分发。

        使用Gmsh API,您可以直接将Gmsh嵌入到您的C++、C、Python、Julia或Fortran求解器中,使用ONELAB进行交互式参数定义和修改,并实时创建后处理数据。请参见prepro.py、custom_gui.py和custom_gui.cpp示例。

        如果您希望保持代码分离,您还可以通过提供求解器名称(Solver.Name0、Solver.Name1等)和可执行文件路径(Solver.Executable0、Solver.Executable1等)通过套接字与Gmsh进行通信。然后可以使用ONELAB协议交换参数:请参见utils/solvers目录中的示例。以这种方式接口的全功能求解器是GetDP(https://getdp.info),这是一个使用混合有限元的一般有限元求解器。

5、后处理模块

        后处理模块可以处理多个标量、矢量或张量数据集,以及几何形状和网格。数据集可以以几种格式提供:人类可读的“解析”格式(这些只是标准输入脚本的一部分,但通常放在具有.pos扩展名的单独文件中——见“后处理脚本命令”)、原生MSH文件(具有.msh扩展名的ASCII或二进制文件:见“Gmsh文件格式”),或标准第三方格式,如CGNS或MED。数据集也可以直接使用Gmsh API导入(见“命名空间gmsh/view”)。

        一旦加载到Gmsh中,标量场可以显示为等值线、等值面或色图,而矢量场可以通过三维箭头或位移图来表示。张量场可以显示为Von-Mises有效应力、最小/最大特征值、特征向量、椭圆或椭球体。(要显示其他组件组合,可以使用View.ForceNumComponents选项——见“后处理选项”。)

        每个数据集以及可视化选项都被称为“后处理视图”或简称“视图”。每个视图都有一个名称,可以单独操作(每个视图在GUI中都有自己的按钮,并且可以在脚本或API中通过其索引或唯一标签引用)或全局操作(见“后处理选项”中的PostProcessing.Link选项)。对后处理视图的可能操作包括截面计算、偏移、提升、边界和组件提取、色图和范围修改、动画、矢量图形输出等。这些操作要么通过修改后处理选项以非破坏性方式进行,要么当使用后处理插件完成时(见“Gmsh插件”),可以导致实际修改视图数据或创建新视图。两者都可以在脚本或通过API完全自动化(例如,见t8和t9)。

        默认情况下,Gmsh将所有后处理视图视为三维图,即在三维空间中绘制标量、矢量和张量原始对象(点、曲线、三角形、四面体等)。但是,Gmsh还可以将包含标量点的每个后处理视图表示为二维(“X-Y”)图,无论是空间定向还是时间定向:

        在“2D空间”图中,标量点的顺序与后处理视图中定义的顺序相同:二维图形的横坐标是由点序列定义的曲线的曲线横坐标,并且只使用与点关联的值绘制一条曲线。如果可用多个时间步,则每个时间步生成一条新曲线;

        在“2D时间”图中,为视图中的每个标量点绘制一条曲线,横坐标为时间步。

6、Gmsh擅长什么

以下是Gmsh最擅长的事情的初步列表:

借助用户定义的宏、循环、条件和包含,使用内置脚本语言快速描述简单和/或“重复”的几何图形(请参阅用户定义的宏、循环和条件以及其他通用命令)。对于更高级的几何图形,使用所选语言(C++、C、Python、Julia或Fortran)的Gmsh API(请参见Gmsh应用程序编程界面)会带来更大的灵活性,唯一的缺点是,除了Gmsh之外,还需要编译代码(针对C++、C和Fortran)或配置和安装解释器(Python或Julia)。Gmsh网站上分发了一个二进制软件开发工具包(SDK),以简化流程(请参阅在您的计算机上安装和运行Gmsh);

将这些几何图形参数化。Gmsh的脚本语言或Gmsh API允许所有命令和命令参数依赖于以前的计算。使用OpenCASCADE几何内核,Gmsh可以访问所有常见的构造性实体几何操作(例如t16);

以标准交换格式从其他CAD软件导入几何图形。Gmsh使用OpenCASCADE导入此类文件,包括来自STEP和IGES文件的标签和颜色信息(参见t20);

生成非结构化的1D、2D和3D单纯形(即使用线段、三角形和四面体)有限元网格(见网格模块),对元素大小进行精细控制(见指定网格元素大小);

创建简单的挤压几何形状和网格,并允许自动将这种结构化网格与非结构化网格耦合(使用3D中的金字塔层);

生成符合CAD模型几何形状的高阶(弯曲)网格。高阶网格优化工具可以保证这种弯曲网格的有效性;

通过定义ONELAB参数与外部求解器进行交互,这些参数在Gmsh和求解器之间共享,并可在GUI中轻松修改(请参阅求解器模块);

以多种方式可视化和导出计算结果。Gmsh可以显示标量、矢量和张量数据集,对生成的后处理视图执行各种操作(见后处理模块),可以以多种不同格式导出图表,并可以生成复杂的动画(见t8);

在低端机器和/或没有图形界面的机器上运行。Gmsh可以在有或没有GUI的情况下编译(请参阅编译源代码),所有版本都可以交互式或直接从命令行使用;

配置您的首选选项。Gmsh有大量的配置选项,可以使用GUI交互式设置,分散在脚本文件中,通过API更改,在每个用户的配置文件中设置,并在命令行上指定(请参见Gmsh选项);

在各种平台(Windows、macOS和Linux)上免费执行上述所有操作(请参阅复制条件)!
 

7、Gmsh不擅长什么

        以下是Gmsh的一些已知弱点:Gmsh不是一个多块网格生成器:Gmsh生成的所有网格在有限元网格的意义上都是一致的;Gmsh的图形用户界面只展示了有限数量的可用功能,界面的许多方面都可以得到增强(尤其是操纵器)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值