Boolean operator gmsh

After the fuse operation, there is only one surface in the model. This is exactly what a fuse operation is supposed to do.

So of course it is impossible to preserve the tags after the fuse operation. However, based on your other post, I assume you want something like this?

from dolfin import *
import gmsh
import numpy as np
import numpy as np
import matplotlib.pyplot as plt
import meshio


a = 0.25
b = 1
x_dir = 1.5
y_dir = 1 + a
scale = 1
commit = "rectangular"

lc = 1e-1


def createGeometryAndMesh(a, b, lc):
    # Clear all models and create a new one
    gmsh.initialize()
    gmsh.clear()
    gmsh.model.add("t3")

    def geopoints(dx, dy, surf_point):
        P1 = gmsh.model.occ.addPoint(scale * 0 + dx, dy, 0, lc)
        P2 = gmsh.model.occ.addPoint(scale * b + dx, scale * 0 + dy, 0, lc)
        P3 = gmsh.model.occ.addPoint(0 + dx, scale * b + dy, 0, lc)
        P4 = gmsh.model.occ.addPoint(b + dx, scale * b + dy, 0, lc)

        L1 = gmsh.model.occ.addLine(P1, P2)
        L2 = gmsh.model.occ.addLine(P2, P4)
        L3 = gmsh.model.occ.addLine(P4, P3)
        L4 = gmsh.model.occ.addLine(P3, P1)

        Curve1 = gmsh.model.occ.addCurveLoop([L1, L2, L3, L4])
        Surface1 = gmsh.model.occ.addPlaneSurface([Curve1], 11 + surf_point)

        return Surface1

    def geopoints2(dx, dy, surf_point):
        P11 = gmsh.model.occ.addPoint(scale * 0 + dx, dy, 0, lc)
        P22 = gmsh.model.occ.addPoint(scale * b + dx, scale * 0 + dy, 0, lc)
        P33 = gmsh.model.occ.addPoint(0 + dx, scale * b + dy, 0, lc)
        P44 = gmsh.model.occ.addPoint(b + dx, scale * b + dy, 0, lc)

        L11 = gmsh.model.occ.addLine(P11, P22)
        L22 = gmsh.model.occ.addLine(P22, P44)
        L33 = gmsh.model.occ.addLine(P44, P33)
        L44 = gmsh.model.occ.addLine(P33, P11)

        Curve11 = gmsh.model.occ.addCurveLoop([L11, L22, L33, L44])
        Surface2 = gmsh.model.occ.addPlaneSurface([Curve11], 12 + surf_point)

        return Surface2

    def geopoints3(dx, dy, surf_point):
        P111 = gmsh.model.occ.addPoint(scale * 0 + dx, dy, 0, lc)
        P222 = gmsh.model.occ.addPoint(scale * b + dx, scale * 0 + dy, 0, lc)
        P333 = gmsh.model.occ.addPoint(0 + dx, scale * b + dy, 0, lc)
        P444 = gmsh.model.occ.addPoint(b + dx, scale * b + dy, 0, lc)

        L111 = gmsh.model.occ.addLine(P111, P222)
        L222 = gmsh.model.occ.addLine(P222, P444)
        L333 = gmsh.model.occ.addLine(P444, P333)
        L444 = gmsh.model.occ.addLine(P333, P111)

        Curve111 = gmsh.model.occ.addCurveLoop([L111, L222, L333, L444])
        Surface3 = gmsh.model.occ.addPlaneSurface([Curve111], 13 + surf_point)

        return Surface3

    def geopoints4(dx, dy, surf_point):
        P1111 = gmsh.model.occ.addPoint(scale * 0 + dx, dy, 0, lc)
        P2222 = gmsh.model.occ.addPoint(scale * b + dx, scale * 0 + dy, 0, lc)
        P3333 = gmsh.model.occ.addPoint(0 + dx, scale * b + dy, 0, lc)
        P4444 = gmsh.model.occ.addPoint(b + dx, scale * b + dy, 0, lc)

        L1111 = gmsh.model.occ.addLine(P1111, P2222)
        L2222 = gmsh.model.occ.addLine(P2222, P4444)
        L3333 = gmsh.model.occ.addLine(P4444, P3333)
        L4444 = gmsh.model.occ.addLine(P3333, P1111)

        Curve1111 = gmsh.model.occ.addCurveLoop([L1111, L2222, L3333, L4444])
        Surface4 = gmsh.model.occ.addPlaneSurface([Curve1111], 14 + surf_point)

        return Surface4

    def rectangulartp(dx, dy, surf_point):
        P5 = gmsh.model.occ.addPoint(-a, scale * 0 + b + dy, 0, lc)
        P6 = gmsh.model.occ.addPoint(scale * -a, scale * 0 + b + a + dy, 0, lc)
        P7 = gmsh.model.occ.addPoint(
            scale * (a + dx + b), scale * 0 + b + a + dy, 0, lc
        )
        P8 = gmsh.model.occ.addPoint(scale * (a + dx + b), scale * 0 + b + dy, 0, lc)

        L5 = gmsh.model.occ.addLine(P5, P8)
        L6 = gmsh.model.occ.addLine(P8, P7)
        L7 = gmsh.model.occ.addLine(P7, P6)
        L8 = gmsh.model.occ.addLine(P6, P5)
        Curve5 = gmsh.model.occ.addCurveLoop([L5, L6, L7, L8])
        Surface5 = gmsh.model.occ.addPlaneSurface([Curve5], 40 + surf_point)

        return Surface5

    def rectangularbt(dx, dy, surf_point):
        P50 = gmsh.model.occ.addPoint(-a, scale * 0 + b, 0, lc)
        P60 = gmsh.model.occ.addPoint(scale * -a, scale * 0 + b + a, 0, lc)
        P70 = gmsh.model.occ.addPoint(scale * (a + dx + b), scale * 0 + b + a, 0, lc)
        P80 = gmsh.model.occ.addPoint(scale * (a + dx + b), scale * 0 + b, 0, lc)

        L50 = gmsh.model.occ.addLine(P50, P80)
        L60 = gmsh.model.occ.addLine(P80, P70)
        L70 = gmsh.model.occ.addLine(P70, P60)
        L80 = gmsh.model.occ.addLine(P60, P50)
        Curve6 = gmsh.model.occ.addCurveLoop([L50, L60, L70, L80])
        Surface6 = gmsh.model.occ.addPlaneSurface([Curve6], 50 + surf_point)

        return Surface6

    # Entity creation operations
    SurfaceA = geopoints(0, 0, 2000)
    SurfaceB = geopoints2(0, y_dir, 3000)
    SurfaceC = geopoints3(x_dir, 0, 4000)
    SurfaceD = geopoints4(x_dir, y_dir, 5000)
    SurfaceRb = rectangularbt(x_dir, y_dir, 6000)
    SurfaceRt = rectangulartp(x_dir, y_dir, 7000)
    # SurfaceB = geopoints(x_dir+10, y_dir+10, 400)
    gmsh.model.occ.synchronize()
    # gmsh.fltk.run()

    frag, frag_map = gmsh.model.occ.fragment(
        [(2, SurfaceRb)],
        [(2, SurfaceRt), (2, SurfaceB), (2, SurfaceD), (2, SurfaceC), (2, SurfaceA)],
    )

    print("frag, frag_map:", frag, frag_map)
    gmsh.model.occ.synchronize()

    # Create physical groups

    # One group for each of the unit squares
    for i in range(2, len(frag_map)):
        pg1 = gmsh.model.addPhysicalGroup(2, [frag_map[i][0][1]])
        gmsh.model.setPhysicalName(2, pg1, f"main_geometry{i}")
    # One group for the top and middle rectangles (frag_map[0] and frag_map[1])
    pg1 = gmsh.model.addPhysicalGroup(2, [frag_map[0][0][1], frag_map[1][0][1]])
    gmsh.model.setPhysicalName(2, pg1, "filled_geometry")

    # Set mesh size at all points
    gmsh.model.mesh.setSize(gmsh.model.getEntities(0), lc)
    gmsh.model.occ.synchronize()

    gmsh.option.setNumber("Mesh.MshFileVersion", 2.2)
    gmsh.model.mesh.generate()
    gmsh.write("./Result--" + str(commit) + "geoforstl" + ".geo_unrolled")
    gmsh.write("./Result--" + str(commit) + "geo.msh")
    # colors:
    gmsh.option.setNumber("Geometry.PointNumbers", 1)
    gmsh.option.setColor("Geometry.Points", 255, 165, 0)
    gmsh.option.setColor("General.Text", 255, 255, 255)
    gmsh.option.setColor("Mesh.Points", 255, 0, 0)
    rr, gg, bb, aaa = gmsh.option.getColor("Geometry.Points")
    gmsh.option.setColor("Geometry.Surfaces", rr, gg, bb, aaa)
    gmsh.onelab.set(
        """[
    {"type":"number",
    "name":"Parameters/Twisting angle",
    "values":[90],
    "min":0,
    "max":120,
    "step":1}]"""
    )

    def checkForEvent():
        action = gmsh.onelab.getString("ONELAB/Action")
        if len(action) and action[0] == "check":
            gmsh.onelab.setString("ONELAB/Action", [""])
            createGeometryAndMesh()
            gmsh.graphics.draw()
        return True

    # Refine the mesh
    gmsh.model.mesh.refine()

    gmsh.write("t3.opt")

    gmsh.finalize()


createGeometryAndMesh(a, b, lc)


# Importing mesh from gmsh and defining surface and boundary markers
msh = meshio.read("./Result--" + str(commit) + "geo.msh")

for key in msh.cell_data_dict["gmsh:physical"].keys():
    if key == "triangle":
        triangle_data = msh.cell_data_dict["gmsh:physical"][key]

for cell in msh.cells:
    if cell.type == "tetra":
        tetra_cells = cell.data
    elif cell.type == "triangle":
        triangle_cells = cell.data

triangle_mesh = meshio.Mesh(
    points=msh.points,
    cells=[("triangle", triangle_cells)],
    cell_data={"name_to_read": [triangle_data]},
)

meshio.write("./Result--" + str(commit) + "mesh.xdmf", triangle_mesh)
meshio.write("mesh.xdmf", triangle_mesh)

1 Like