Building a hybrid mesh in 2D¶
In some cases, the modelling domain may require flexibility in one region and equidistant structure in another. In this short example, we demonstrate how to accomplish this for a two-dimensional mesh consisting of a region with regularly spaced quadrilaterals and a region with unstructured triangles.
We start by importing numpy, matplotlib and pygimli with its required components.
We continue by building a regular grid and assign the marker 2 to all cells.
Mesh: Nodes: 1326 Cells: 1250 Boundaries: 2575
Next, we build an unstructured region on top by creating the polygon and calling triangle via pygimli’s TriangleWrapper.
poly = pg.Mesh(2) # empty 2d mesh nStart = poly.createNode(xmin, zmax, 0.0) nA = nStart for x in xreg[1:]: nB = poly.createNode(x, zmax, 0.0) poly.createEdge(nA, nB) nA = nB z2 = 0. nA = poly.createNode(xmax, z2, 0.0) poly.createEdge(nB, nA) nB = poly.createNode(xmin, z2, 0.0) poly.createEdge(nA, nB) poly.createEdge(nB, nStart) tri = pg.core.TriangleWrapper(poly) tri.setSwitches('-pzeAfaq31')
For more information on the triangle switches and the corresponding settings, the reader is referred to the triangle website.
Now we can generate the unstructured mesh.
mesh2 = pg.Mesh(2) tri.generate(mesh2) for cell in mesh2.cells(): cell.setMarker(1)
Finally, the grid and the unstructured mesh can be merged to single mesh for further modelling.
mesh3 = merge2Meshes(mesh1, mesh2)
Of course, you can treat the hybrid mesh like any other mesh and append a
triangle boundary for example with the function
mesh = appendTriangleBoundary(mesh3, -100., 100., quality=31, smooth=True, marker=3, isSubSurface=True) pg.show(mesh, markers=True, showMesh=True) pg.wait()