我正在考虑使用gmsh作为Ansys网格器的替代品(避免Workbench/APDL没有网格文件类型兼容性(。
我想实现一种算法来在立方体中引入球体(稍后它将是任何类型的体积(。它们不应该相互接触,因此我需要检查我介绍的卷是否与我之前介绍的任何卷相交。
理想情况下,最好有一个检查边界的命令。我看到有一些命令,如Boundary
,PointsOf
和CombinedBoundary
,它们似乎可以检索边界上的实体。但我不确定它们是如何工作的(文档没有解释在没有边界时会发生什么(。 我尝试在 GUI 中使用这些命令,但找不到它们。
另一个但速度较慢的选项是尝试交集命令(不删除任何原始卷(并检查交集后有多少卷。如果比以前多,就会有一个交叉点。但我对这个解决方案不是很满意。无论如何,我需要能够计算之前和之后的卷数,这是我在 gmsh 文档中没有看到的。
所以,我的问题是:在实际执行交集之前,是否有可能检测 gmsh 中的插播?是否可以计算卷数(我猜是的(?
非常感谢。亲切问候
我认为在进行交集之前无法计算交集,但是您可以在使用 GMSH API 获取信息后删除交集创建的对象(在此处下载"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中工作更容易。