2

我正在尝试使用以下代码使用 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()在最终的几何图形和线/裂缝之间做一个,但这不起作用。

任何帮助将不胜感激。

编辑

这种类型的网格生成的目的是模拟身体中的物理裂缝。在网格划分过程中,可以通过网格的元素连通性对裂纹进行建模(即元素必须具有不同的节点才能创建裂纹面)。例如,在施加任何载荷之前,裂缝是闭合的:

在此处输入图像描述

施加载荷后,裂缝打开,因为单元连通性允许这样做:

在此处输入图像描述

4

2 回答 2

1

您可以通过在该区域建模一个非常窄的矩形来实现这一点。你可以很容易地给出像 1e-10 这样的尺寸。我还模拟了裂纹尖端,通过模拟一个非常小的圆圈将节点折叠在一个点上。它工作得很好。

现在也有一个插件。它会自动分离指定裂缝线/表面处的节点。

于 2021-04-09T09:04:49.143 回答
0

这可以使用“嵌入”功能来实现。下面的最小工作示例(在 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()

输出:

在此处输入图像描述

于 2021-05-13T13:02:59.760 回答