问题标签 [gmsh]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
276 浏览

python - 使用 GMSH python API 对 step 文件进行网格划分并将生成的 msh 文件保存到磁盘

我有大量的步骤文件,我想使用 GMSH 的 python API 从中提取网格信息。我正在按照教程在 gmsh 的官方文档页面中加载和操作 STEP 文件,但它会在生成网格之前进行切片。

但是,我只想加载一个步骤文件并生成其 3D 网格并将网格文件保存到磁盘而不进行任何操作。

我该怎么做呢?

0 投票
1 回答
51 浏览

python - 在 python 中使用 gmsh API 与 matplotlib 乳胶混淆

我已经为此苦苦挣扎了一段时间,我想我缩小了以下问题的原因:

通过 Anaconda 在 Spyder 中使用虚拟 python 3.8 环境,我能够绘制出我想要的一切;使用 palatino 乳胶字体的广泛而复杂的情节。但是,只要我在其中输入最少量的 gmsh 代码,就会弹出诸如“找不到乳胶”或“缺少字体度量文件”或“找不到 dvipng”之类的错误。我只能猜测 gmsh 将目录弄乱了,但 sys.path 显示所有相关文件夹(对于可执行文件 Miktex、dvipng)仍然存在。我对python相当陌生,所以我希望你们注意到我犯的一些非常愚蠢或基本的错误。提前致谢!

对我来说导致问题的最小示例:

PS 虚拟环境是这样设置的:

为避免因python版本不同造成依赖冲突,本项目使用python 3.8。使用以下步骤使用 Anaconda 激活它:

  1. 启动 Anaconda Navigator 应用程序。
  2. 在此应用程序中,启动 CMD.exe 提示符。
  3. 在此提示中,为 python 3.8 和必要的模块分别执行以下行(在每个“安装或创建”后按“y”): conda create --name py38 python=3.8

conda 激活 py38

conda install --name py38 spyder -c conda-forge

conda config --add 通道 conda-forge

conda install libspatialindex==1.9.3 rtree==0.9.7

conda install numpy==1.21.2 scipy==1.6.2 matplotlib==3.4.2

康达安装 gmsh python-gmsh

conda install -c conda-forge/label/cf202003 miktex

康达安装ghostscript

蜘蛛

0 投票
1 回答
124 浏览

c++ - 无法从 Visual Studio C++ 使用 gmsh

  1. 我下载了 sdk 并运行了此处描述的 Windows 相关命令。
  2. 然后我创建了一个新的 VC++ 项目并复制了包含在该 sdk (t1.cpp) 中的教程文件的内容。
  3. 有编译时错误,我通过在 projcet->Properties->Configuration Properties->C/C++->General->Additional Include Directories 中找到的包含设置中包含 gmsh.h 的路径来修复它。
  4. 我还在 projcet->Properties->Configuration Properties->Linker->General->Additional Libraries Directory 中包含了 gmsh.lib 文件的路径。

在尝试构建项目时,我仍然收到以下错误:

请说出我在这里缺少的东西。我在 Windows 10 上运行 Microsoft Visual Studio Community 2019(版本 16.10.4)。

0 投票
0 回答
85 浏览

python - Gmsh:如何使用高阶元素对地形进行网格划分

当与高阶元素(地质力学模拟所需)进行网格划分时,以stl文件形式给出的相当中等形状的地形会导致网格不可用(jac.<0 )。我在官方 Gmsh 演示模型terrain_stl.py中演示了这个问题。

使用 (tetra mesh)将行添加gmsh.model.mesh.setOrder(2)到此脚本transfinite=False会导致警告

并且生成的网格无法用于后续的 FEM 模拟。

设置transfinite=True(十六进制网格)会发出警告Failed to compute equidistant parameters,但生成的网格有效。然而,这种超限网格的制备通常需要更多的努力,甚至并不总是可行的。

这些扭曲元素背后的原因是什么?如何规避它们?是否有助于引入中间层、所有面的 STL 网格,或者是否有特别适合的网格划分算法或选项?

为了完整起见,这里是完整的代码(Python)

0 投票
0 回答
38 浏览

c++ - 如何将 STDOUT 从 GMSH 调用定向到接受 char 数组的回调函数?

我已向我的本机 C++ 代码添加了一个回调函数,以将有关我的 GMSH 调用的信息返回到我的 C# 代码。该函数接受一个 char 数组,如下所示:typedef void(__stdcall* ProgressCallback)(char*);

要实际对模型进行网格划分,我使用的是这样导入的 STEP 文件:geo::importShapes(kStepS.c_str(), outDimTags, true, "step");

如果 STEP 文件中的模型几何存在问题,此importShapes函数会将错误写入控制台。同样,该gmsh::generate()函数还将在其执行期间输出有关网格划分的信息。

我的问题是如何获取信息,无论是来自函数stdout还是stderr来自函数,以便我可以调用我的回调函数来报告此错误?

0 投票
0 回答
107 浏览

stl - 在不使用“阈值”字段的情况下,使用 .stl 文件的 gmsh 中是否可以使用渐变网格大小?

我正在为晶体塑性 FEM 模拟创建多晶微结构。我使用 DREAM.3D 软件导出 .stl 文件,然后使用 gmsh 进行网格化。这很好用,我之前使用教程“t10.geo”中解释的“阈值”字段来控制本地网格大小。但是,我需要在不降低四面体元素质量的情况下创建具有网格大小梯度的模型。

这些模型包含退火孪晶,它们是非常薄的“煎饼”形晶粒,需要充分表示小的四面体元素。但是,要创建具有合理运行时间的模型,元素的总数不能过多。因此,理想的做法是创建单元尺寸向晶粒中心逐渐增加的网格。除了薄退火孪晶外,模型中的其他晶粒是球形的,如下所示(注意:这是在将体素化网格转换为 DREAM.3D 中的 .stl 文件之前): 微观结构模型中的样品晶粒。

一个主要的限制是我无法更改 .stl 文件边界处的三角形,因为这些三角形与必须进行类似网格划分的其他晶粒接触。我在此处(https://www.researchgate.net/post/Is_a_gradient_mesh_size_possible_in_gmsh_with_stl_files_without_using_a_Threshold_field)附上了我的微观结构模型中代表性晶粒的 .stl 文件和用于生成两个 .msh 文件的 .geo 文件,这些文件用于对 .stl 文件进行网格划分。在其中之一中,我没有指定网格大小,并以 398,426 个四面体元素结束。另一方面,我使用下面的附加两行指定“背景”网格大小,并以 84,322 个四面体元素结束:

在这里(根据我的理解),“背景”元素大小指定为 10。

这大大减少了元素的总数,但问题是 .stl 文件边界处的四面体元素包含一个小三角形面,但向晶粒内部拉长以满足上述所需的元素大小,这会降低它们的质量。理想情况下,我将能够 1) 在 .stl 文件的边界处保留精细的三角形面和小的四面体元素,以及 2) 指定远离 .stl 边界的逐渐变大的网格尺寸。t10.geo 中演示的“阈值”字段需要指定更精细网格的点,因此理论上这可以工作,因为我可以指定每个颗粒的中心......但这很快就会变得复杂,因为有些颗粒可以凹并且有相当复杂的形态,所以我不

以下是来自 gmsh 的元素质量度量:

未指定网格尺寸

“背景”网格大小为 10

有没有办法将网格尺寸指定为与 .stl 边界的距离的函数?或者也许指定最大元素大小但包括将较大但强烈扭曲的元素分解为更高质量的较小元素的东西?

提前感谢您的帮助,如果我能进一步澄清我的问题,请告诉我。

最好的问候,克里斯

更新

对于那些感兴趣的人,有一种快速的方法可以使用一个或多个 .stl 文件,或者更一般地说,具有不同表面的多个体积来实现渐变网格。最新版本的 gmsh(4.9.3 版,2022 年 1 月 4 日发布)包括一种名为“扩展”的新型“字段”选项。

此处显示了此新字段的示例:https ://gitlab.onelab.info/gmsh/gmsh/-/blob/master/examples/boolean/extend_field.geo 。请参阅我在 gmsh 的 GitLab 页面上的原始帖子以获取更多信息:https ://gitlab.onelab.info/gmsh/gmsh/-/issues/1678 。

对于我上面发布的具体示例,必要的代码(.geo 文件的格式)是:

对于上面的示例,考虑了三个 .stl 文件。用户将更改:

  • SurfacesList:指定应考虑的所有表面。
  • DistMax : 尺寸扩展的最大距离
  • SizeMax:DistMax 之外的网格尺寸
  • :用于插值网格大小的幂指数

完整的代码描述见:https ://gmsh.info/doc/texinfo/gmsh.html

非常感谢 Christophe Geuzaine 教授在这方面的帮助!

0 投票
0 回答
26 浏览

python - 无法理解的输出

为了澄清我的模拟输出的性质,我将不胜感激。该模拟考虑了在 3D 中包含在圆柱形通道内的立方体周围的流动。数学模型是 Navier-Stokes 方程和连续性方程 (div U = 0)。我已经开发了二维数值模拟的代码并且输出是正确的,这让我认为 2d 和 3d 问题相同的变分问题(如果我错了,请纠正我)在 FEniCS 中很好地提出. 当我尝试在 3D 几何体上运行模拟时,我在压力和速度场(u,p)方面都得到了以下(输出)。

我想通过几个步骤来解释我是如何管理几何的:

  1. 在 FreeCAD 中构建它

  2. 在 GMSH 中导入

  3. 通过命令 add-->surfaces 定义边界并用从 1 到 4 的数字标记它们
    3.1) 对应于标签“1”的壁表示与圆柱体相关联的表面
    3.2) 对应于标签“2”的障碍物表示内部立方体表面
    3.3) 对应于标签“3”(“4”)的入口(出口)表示与气缸相关的入口和出口表面

  4. 用 add-->volumes 定义卷并用 5 标记它

  5. 将 .msh 文件转换为 .xml 文件,生成两个附加文件:physical_region.xml 和 facet_region.xml。这两个文件必须自动包含有关边界的信息。然后实现以下行,以便在计算模拟之前在 python3 中详细说明几何:

    % 读取网格
    mesh = Mesh('file.xml')
    cd=MeshFunction('size_t', mesh, 'prova_physical_region.xml')
    fd=MeshFunction('size_t', mesh, 'prova_facet_region.xml')
    bcu_inflow = DirichletBC(V , 常数((2, 2, 0)), '3')
    bcu_wall = DirichletBC(V, 常数((0, 0, 0)), '1')
    bcu_cube = DirichletBC(V, Constant((0, 0, 0)), '2')
    bcp_outflow = DirichletBC(Q, Constant(0), '4')

模拟没有给出任何错误并计算(输出)中显示的结果,这在我们的物理环境(流体动力学)中没有意义,那么我想知道问题出在哪里。我会强调网格在 FEniCS 中充电良好。

0 投票
1 回答
45 浏览

user-interface - 编写一个非常简单的 CAD 应用程序

我想创建一个非常简单的 2D(后来的 3D 取决于资金)交互式 CAD 应用程序,其功能非常少,例如:

  1. 能够创建线、点、简单的凸多边形和椭圆等简单形状
  2. 能够细分多边形。

出于这个原因,我将采用客户端-服务器模型,其中客户端由 GUI 和渲染组件组成。为此,我正在考虑使用 Kivy 框架,因为它在一个框架中同时具有 GUI 和 OpenGL。另一种选择,是使用 QT 框架。这是符号上的便利,一切都将在一台机器上运行。

对于包含用于操作几何的代码的服务器部分,我正在考虑直接使用 OpenCASCADE 或 gmsh。这里的基本思想是:一旦几何体被建模,它在服务器中被网格化,然后被发送回客户端进行渲染。

我的问题是,这种方法是否适用于交互式应用程序?我的理解是网格生成需要很长时间,因此为几何中的每一个微小变化创建一个网格对于交互式应用程序来说可能并不理想。但是,OpenGL 只能渲染很少的几何图元(如点、线、三角形和四边形),并且只有在对几何体进行网格化时才使用 OpenGL(据我所知,OpenCASCADE 使用边界表示来表示模型)。

请理解我对几何建模和计算机图形学一般都很陌生,因此感谢您的帮助。

编辑:添加更多说明。

0 投票
0 回答
12 浏览

mesh - 在 GMSH 中使用 BooleanDifference 后如何将曲面分配给球体

我需要为内部球体分配一个表面,我现在拥有的是

0 投票
0 回答
21 浏览

python - python - 通过 pip 和 conda 安装后无法使用 gmsh

我安装了 gmsh 但我不能在 spyder 中使用它。我使用了以下内容:

但是当我运行以下代码时:

我收到以下错误:

我正在使用 ubuntu 20.04 和 spyder 3.3.6