我正在考虑使用gmsh代替Ansys网格器(避免了Workbench / APDL的网格文件类型不兼容)。
我想实现一种算法以在立方体中引入球体(以后将是任何体积的体积)。它们不应该相互接触,因此我需要检查要引入的体积是否与之前引入的任何体积相交。
理想情况下,拥有一个检查边界的命令会很好。我看到有一些命令,例如Boundary
,PointsOf
和CombinedBoundary
,似乎可以检索边界上的实体。但是我不确定它们如何工作(文档没有解释在没有边界的情况下会发生什么)。
我试图在GUI中使用这些命令,但找不到它们。
其他选择,但是比较慢,是尝试使用相交命令(不删除任何原始体积)并检查相交之后有多少个体积。如果比以前多,则有一个交集。但是我对这种解决方案不是很满意。无论如何,我将需要能够计算之前和之后的卷数,而我在gmsh文档中看不到任何类似的内容。
所以,我的问题是:是否可以在实际执行交集之前检测gmsh中的交集?是否可以计算卷的数量(我想是的)?
非常感谢。
答案 0 :(得分:4)
我认为您不能在进行交点之前对交点进行计数,但是可以使用GMSH API(download 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中工作。