我试图使用PyGmsh生成一个有限元网格,使用以下代码:
import pygmsh
geom = pygmsh.opencascade.Geometry(
characteristic_length_min=0.1,
characteristic_length_max=0.1,
)
rectangle = geom.add_rectangle([-1.0, -1.0, 0.0], 2.0, 2.0)
disk1 = geom.add_disk([-1.2, 0.0, 0.0], 0.5)
disk2 = geom.add_disk([+1.2, 0.0, 0.0], 0.5)
disk3 = geom.add_disk([0.0, -0.9, 0.0], 0.5)
disk4 = geom.add_disk([0.0, +0.9, 0.0], 0.5)
union = geom.boolean_union([rectangle, disk1, disk2])
diff = geom.boolean_difference([union], [disk3, disk4])
mesh = pygmsh.generate_mesh(geom, dim=2)
我可以生成以下网格:
但是,我想在网格上添加一个裂缝,比如:
这里的裂纹只是一个例子,它需要定义之前的啮合过程。我尝试过创建2点(geom.add_point()
)和一条线(geom.add_line()
),然后在最终的几何学和线/裂缝之间做一个geom.boolean_difference()
,但这是行不通的。
任何帮助都将不胜感激。
编辑
这种网格生成的目的是模拟物体中的物理裂纹。在网格划分过程中,裂纹可以用网格的元素连通性来模拟(即单元必须有不同的节点才能生成裂纹面)。例如,在施加任何载荷之前,裂纹是关闭的:
在加载之后,裂纹就会打开,因为元素连接允许这样做:
发布于 2021-04-09 09:04:49
您可以通过在该区域建模一个非常窄的矩形来实现这一点。你可以很容易地给出1e-10这样的尺寸。我还通过模拟一个很小的圆来模拟裂纹尖端,使节点在一个点上倒塌。它运转得很好。
现在也有一个插件。它自动分离指定裂纹线/表面的节点。
发布于 2021-05-13 13:02:59
这可以使用“嵌入”功能来实现。下面的最小工作示例(在Python中)。
import gmsh
gmsh.initialize()
gmsh.model.add("TestModel")
ms = 1 # mesh size at point
# square (plate) points
gmsh.model.geo.addPoint(0, 0, 0, ms, 1)
gmsh.model.geo.addPoint(8, 0, 0, ms, 2)
gmsh.model.geo.addPoint(8, 8, 0, ms, 3)
gmsh.model.geo.addPoint(0, 8, 0, ms, 4)
# square (plate) lines
gmsh.model.geo.addLine(1, 2, 1)
gmsh.model.geo.addLine(2, 3, 2)
gmsh.model.geo.addLine(3, 4, 3)
gmsh.model.geo.addLine(4, 1, 4)
# square (plate) curve loop
gmsh.model.geo.addCurveLoop([1, 2, 3, 4], 1)
# square (plate) surface
s = gmsh.model.geo.addPlaneSurface([1])
# "crack" geometry
a = gmsh.model.geo.addPoint(2, 2, 0, ms)
b = gmsh.model.geo.addPoint(6, 4, 0, ms/100)
l = gmsh.model.geo.addLine(a, b)
# synchronize
gmsh.model.geo.synchronize()
# embed "crack" on plate
gmsh.model.mesh.embed(1, [l], 2, s)
# generate mesh
gmsh.model.mesh.generate(2)
gmsh.fltk.run()
gmsh.finalize()
输出:
https://stackoverflow.com/questions/59920312
复制相似问题