在Gmsh中检测路口

时间:2018-08-09 09:47:51

标签: mesh

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

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

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

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

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

非常感谢。

1 个答案:

答案 0 :(得分:4)

我认为您不能在进行交点之前对交点进行计数,但是可以使用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中工作。