【问题标题】:Detecting intersections in Gmsh在 Gmsh 中检测交叉口
【发布时间】:2018-08-09 09:47:51
【问题描述】:

我正在考虑使用 gmsh 作为 Ansys mesher 的替代品(避免 Workbench/APDL 不兼容网格文件类型)。

我想实现一种算法来在立方体中引入球体(稍后它将是任何类型的体积)。它们不应该相互接触,因此我需要检查我介绍的卷是否与我之前介绍的任何卷相交。

理想情况下,最好有一个检查边界的命令。我看到有一些命令,如BoundaryPointsOfCombinedBoundary,它们似乎检索边界上的实体。但我不确定它们是如何工作的(文档没有解释没有边界时会发生什么)。 我试图在 GUI 中使用这些命令,但我找不到它们。

其他选项,但速度较慢,是尝试交集命令(不删除任何原始卷)并检查交集后有多少卷。如果比以前多,则存在交叉点。但我对这个解决方案不是很满意。无论如何,我需要能够计算之前和之后的卷数,我在 gmsh 文档中没有看到类似的内容。

所以,我的问题是:是否可以在实际执行交叉点之前检测 gmsh 中的交叉点?是否可以计算卷数(我猜是的)?

非常感谢。亲切的问候,

【问题讨论】:

  • 快速评论:大部分 GMSH 命令无法通过 GUI 使用,因此您可能必须进入文本编辑器自行编辑 GEO 文件。
  • 嗨@Anton 非常感谢您的建议。我现在正在尝试这样做。使用文本编辑器,但我不确定如何检测交叉点。
  • 我也没有做过,否则我已经提供了答案。如果我想通了,我可能会在周末回复你。

标签: mesh


【解决方案1】:

我不认为你可以在做交叉点之前计算交叉点,但是你可以在使用GMSH APIdownload here“SDK”)获取信息后删除交叉点创建的对象。我一直在使用python,源文件中的文档很清楚,还有大量的演示。

因为它在 python 中,您可以使用以下命令轻松计算实体:

len(model.getEntities(3))  # returns number of volume entities

我的解决方案涉及计算交集(removeObject=False,removeTool=False),然后找到返回列表的长度。如果有交集创建的体积,则您有一个交集。从那里你可以给自己一个警告,或者删除交叉路口等。

一个示例 python 脚本:

import gmsh  # Download gmsh.py, and libgmsh files from gmsh-sdk

model = gmsh.model
factory = model.occ
mesh = model.mesh

gmsh.initialize()
gmsh.option.setNumber("Mesh.CharacteristicLengthMax", 0.2)  # max mesh size
# gmsh.option.setNumber("General.Terminal", 1)  # can be useful
model.add("Example")  # add a model

 # Create overlapping boxes (can be any shapes)
b1 = (3, factory.addBox(0,0,0, 1, 1, 1))  # 1x1x1 box with "bottom left" at 0,0,0
b2 = (3, factory.addBox(0.5, 0.5, 0.5, 1, 1, 1))

 # Calculate the intersection. With removeObject, removeTool as False, this 
 # creates an object if there is an intesection
intersect = factory.intersect([b1], [b2], removeObject=False, removeTool=False)[0]
factory.synchronize()

if len(intersect):
    # if there is an intersection, do what you want to do.
    factory.remove(intersect, True)  # remove created intersection objects
    factory.synchronize()

mesh.generate(3)

 # Visualise
model.setVisibility(model.getEntities(3),0)  # turn volumes off
gmsh.fltk.run()  # start gmsh
gmsh.finalize()

我希望这会有所帮助 - 我确信这可以使用普通的 .GEO 文件来完成,但我更喜欢/认为它更容易在 Python 中工作。

【讨论】:

  • 嗨,邓肯。我实际上继续前进,但是如果我有时间,我会尝试遵循您的代码。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 2020-10-31
相关资源
最近更新 更多