Esempio n. 1
0
def msh_to_xdmf2D(file, path):
    msh = meshio.read(path + "/" + file)

    line_cells = []
    triangle_cells = []
    line_data = []
    triangle_data = []

    for cell in msh.cells:
        if cell.type == "line":
            if len(line_cells) == 0:
                line_cells = cell.data
            else:
                line_cells = np.vstack([line_cells, cell.data])
        elif cell.type == "triangle":
            if len(triangle_cells) == 0:
                triangle_cells = cell.data
            else:
                triangle_cells = np.vstack([triangle_cells, cell.data])

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

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

    meshio.write(path + "/" + "mesh.xdmf", triangle_mesh)
    meshio.write(path + "/" + "subdomains.xdmf", line_mesh)
Esempio n. 2
0
def test_information_xdmf():
    mesh_out = meshio.Mesh(
        numpy.array([[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [1.0, 1.0, 0.0],
                     [0.0, 1.0, 0.0]]) / 3,
        [("triangle", numpy.array([[0, 1, 2], [0, 2, 3]]))],
        field_data={
            "bottom": numpy.array([1, 1]),
            "right": numpy.array([2, 1]),
            "top": numpy.array([3, 1]),
            "left": numpy.array([4, 1]),
        },
    )
    # write the data
    points, cells, field_data = mesh_out.points, mesh_out.cells, mesh_out.field_data

    assert cells[0].type == "triangle"
    meshio.write(
        "mesh.xdmf",
        meshio.Mesh(points=points, cells=[cells[0]], field_data=field_data),
    )

    # read it back in
    mesh_in = meshio.read("mesh.xdmf")

    assert len(mesh_in.field_data) == len(mesh_out.field_data)
Esempio n. 3
0
    def generate_sphere(R, res):
        geo = geooc()
        from numpy import pi
        #cylinder = geo.add_cylinder([0,0,R], [0,L,0], R, char_length=res)
        #box = geo.add_box([-R,-0.1*L,R], [2.1*R,1.2*L,1.1*R], char_length=res)
        #diff = geo.boolean_difference([cylinder], [box])
        # Uniform refinement of points
        # geo.add_raw_code("pts_bo1[] = PointsOf{Volume{bo1};};")
        # geo.add_raw_code("Characteristic Length{pts_bo1[]} ="+"{0};".format(res))
        box = geo.add_box([-R,-R,R], [2*R,2*R, 1.1*R])
        sphere = geo.add_ball([0,0,R],R)
        diff = geo.boolean_difference([sphere], [box])
        geo.add_raw_code("Physical Surface(2) = {2};")
        geo.add_raw_code("Physical Surface(1) = {1};")

        # Minimum field at line of contact
        geo.add_raw_code("Point(25) = {0,0,0};")
        geo.add_raw_code("Field[1] = Distance; Field[1].NodesList = {25};")
        geo.add_raw_code("Field[2] = Threshold; Field[2].IField=1; Field[2].LcMin = {0}; Field[2].LcMax = {1}; Field[2].DistMin={2}; Field[2].DistMax={3};".format(res, 5*res, 0.3*R, 0.6*R)) #5
        geo.add_raw_code("Field[3] = Min; Field[3].FieldsList = {2};")
        geo.add_raw_code("Background Field = 2;")
        geo.add_physical(diff, label="1")

        gmesh = generate_mesh(geo, geo_filename='mesh/sphere.geo')
        points, cells = gmesh.points, gmesh.cells
        meshio.write("mesh/mesh_" + str(i) + ".xdmf", meshio.Mesh(points=gmesh.points, cells={"tetra": gmesh.cells["tetra"]}))
        meshio.write("mesh/mf_" + str(i) + ".xdmf", meshio.Mesh(points=gmesh.points, cells={"triangle": gmesh.cells["triangle"]},
                                        cell_data={"triangle": {"name_to_read": gmesh.cell_data["triangle"]["gmsh:physical"]}}))
Esempio n. 4
0
def convert_msh_to_xdmf(filepath):
    import meshio
    msh = meshio.read(filepath)
    for cell in msh.cells:
        if cell.type == "triangle":
            triangle_cells = cell.data
        elif cell.type == "line":
            line_cells = cell.data

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

    triangle_mesh = meshio.Mesh(points=msh.points,
                                cells={"triangle": triangle_cells},
                                cell_data={"subdomains": [triangle_data]})
    line_mesh = meshio.Mesh(points=msh.points,
                            cells={"line": line_cells},
                            cell_data={"boundary_conditions": [line_data]})

    meshio.write("%s_triangle.xdmf" % filepath.split('.')[0], triangle_mesh)
    meshio.write("%s_line.xdmf" % filepath.split('.')[0], line_mesh)
    print("successfully saved in:" + filepath.split('.')[0])
def background_mesh(res=0.025):
    """
    Create rectangular background mesh for the Poisson problem
    """
    geometry = Geometry()
    rectangle = geometry.add_rectangle(0, L, 0, H, 0, res)

    geometry.add_physical_surface(rectangle.surface, label=12)
    geometry.add_physical_line(rectangle.line_loop.lines, label=outer_marker)

    (points, cells, point_data, cell_data,
     field_data) = generate_mesh(geometry, prune_z_0=True)

    meshio.write(
        "meshes/multimesh_0.xdmf",
        meshio.Mesh(points=points, cells={"triangle": cells["triangle"]}))

    meshio.write(
        "meshes/mf_0.xdmf",
        meshio.Mesh(points=points,
                    cells={"line": cells["line"]},
                    cell_data={
                        "line": {
                            "name_to_read": cell_data["line"]["gmsh:physical"]
                        }
                    }))
Esempio n. 6
0
def front_mesh_wedge(res=0.025):
    """
    Creates a wedged mesh with symmetry line through y = c_y
    """
    geometry = Geometry()
    mesh_r = width_scale*res
    c = geometry.add_point((c_x,c_y,0))
    
    # Elliptic obstacle
    y_fac = 1
    r_ =0.7
    p1 = geometry.add_point((c_x-r_x, c_y,0),lcar=res/2)
    pt1 = geometry.add_point((c_x-r_*r_x,c_y+y_fac*r_x,0),lcar=res/2)
    pt2 = geometry.add_point((c_x+r_*r_x,c_y+y_fac*r_x,0),lcar=res/2)
    pb1 = geometry.add_point((c_x-r_*r_x, c_y-y_fac*r_x,0),lcar=res/2)
    pb2 = geometry.add_point((c_x+r_*r_x, c_y-y_fac*r_x,0),lcar=res/2)

    p2 = geometry.add_point((c_x+r_x, c_y,0),lcar=res/2)
    # embed()
    arc_1 = geometry.add_bspline([p1, pt1,pt2, p2])
    arc_2 = geometry.add_bspline([p2, pb2,pb1, p1])

    # Surrounding mesh
    p3 = geometry.add_point((c_x-r_x-mesh_r, c_y,0),lcar=res)
    p4 = geometry.add_point((c_x+r_x+mesh_r, c_y,0),lcar=res)
    pt_1 = geometry.add_point((c_x-r_*r_x*y_fac, c_y+y_fac*r_x+mesh_r,0),
                              lcar=res)
    pt_2 = geometry.add_point((c_x+r_*r_x*y_fac, c_y+y_fac*r_x+mesh_r,0)
                              ,lcar=res)
    pb_1 = geometry.add_point((c_x-r_*r_x*y_fac, c_y-y_fac*r_x-mesh_r,0),
                              lcar=res)
    pb_2 = geometry.add_point((c_x+r_*r_x*y_fac, c_y-y_fac*r_x-mesh_r,0),
                              lcar=res)

    arc_5 = geometry.add_bspline([p3, pt_1, pt_2, p4])
    arc_6 = geometry.add_bspline([p4, pb_2, pb_1, p3])
    obstacle_loop = geometry.add_line_loop([arc_1, arc_2])
    outer_loop = geometry.add_line_loop([arc_5,arc_6])
    donut = geometry.add_plane_surface(obstacle_loop, holes = [outer_loop])
    geometry.add_physical_surface([donut],label=12)
    geometry.add_physical_line(obstacle_loop.lines, label=inner_marker)
    geometry.add_physical_line(outer_loop.lines, label=outer_marker)

    # Generate mesh
    (points, cells, point_data,
     cell_data, field_data) = generate_mesh(geometry, prune_z_0=True,
                                            geo_filename="meshes/test.geo")
    
    # Save mesh and mesh-function to file
    meshio.write("multimesh_1.xdmf", meshio.Mesh(
        points=points, cells={"triangle": cells["triangle"]}))
    
    meshio.write("mf_1.xdmf", meshio.Mesh(
        points=points, cells={"line": cells["line"]},
        cell_data={"line": {"name_to_read":
                            cell_data["line"]["gmsh:physical"]}}))
    import os
    os.system("mv multimesh_1.* meshes/")
    os.system("mv mf_1.* meshes/")
def front_mesh(res=0.025):
    geometry = Geometry()
    c = geometry.add_point((c_x, c_y, 0))
    mesh_r = 5 * res  # Width of mesh

    # Elliptic obstacle
    p1 = geometry.add_point((c_x - r_x, c_y, 0))
    p2 = geometry.add_point((c_x, c_y + r_y, 0))
    p3 = geometry.add_point((c_x + r_x, c_y, 0))
    p4 = geometry.add_point((c_x, c_y - r_y, 0))
    arc_1 = geometry.add_ellipse_arc(p1, c, p2, p2)
    arc_2 = geometry.add_ellipse_arc(p2, c, p3, p3)
    arc_3 = geometry.add_ellipse_arc(p3, c, p4, p4)
    arc_4 = geometry.add_ellipse_arc(p4, c, p1, p1)
    obstacle_loop = geometry.add_line_loop([arc_1, arc_2, arc_3, arc_4])

    # Surrounding mesh
    p1 = geometry.add_point((c_x - r_x - mesh_r, c_y, 0))
    p2 = geometry.add_point((c_x, c_y + r_y + mesh_r, 0))
    p3 = geometry.add_point((c_x + r_x + mesh_r, c_y, 0))
    p4 = geometry.add_point((c_x, c_y - r_y - mesh_r, 0))
    arc_5 = geometry.add_ellipse_arc(p1, c, p2, p2)
    arc_6 = geometry.add_ellipse_arc(p2, c, p3, p3)
    arc_7 = geometry.add_ellipse_arc(p3, c, p4, p4)
    arc_8 = geometry.add_ellipse_arc(p4, c, p1, p1)
    loop = geometry.add_line_loop([arc_5, arc_6, arc_7, arc_8])
    mesh = geometry.add_plane_surface(loop, holes=[obstacle_loop])
    geometry.add_physical_surface(mesh, label=12)
    geometry.add_physical_line(loop.lines, label=outer_marker)
    geometry.add_physical_line(obstacle_loop.lines, label=inner_marker)

    # Create refined mesh around geometry
    field = geometry.add_boundary_layer(edges_list=obstacle_loop.lines,
                                        hfar=res,
                                        hwall_n=res / 2,
                                        thickness=2 * res)
    geometry.add_background_field([field])

    # Generate mesh
    (points, cells, point_data, cell_data,
     field_data) = generate_mesh(geometry,
                                 prune_z_0=True,
                                 geo_filename="meshes/test.geo")

    # Save mesh and mesh-function to file
    meshio.write(
        "meshes/multimesh_1.xdmf",
        meshio.Mesh(points=points, cells={"triangle": cells["triangle"]}))

    meshio.write(
        "meshes/mf_1.xdmf",
        meshio.Mesh(points=points,
                    cells={"line": cells["line"]},
                    cell_data={
                        "line": {
                            "name_to_read": cell_data["line"]["gmsh:physical"]
                        }
                    }))
Esempio n. 8
0
def single_mesh(res=0.025):
    """ 
    Creates a single mesh containing a circular obstacle
    """

    geometry = Geometry()
    c = geometry.add_point((c_x, c_y, 0))

    # Elliptic obstacle
    p1 = geometry.add_point((c_x - r_x, c_y, 0))
    p2 = geometry.add_point((c_x, c_y + r_x, 0))
    p3 = geometry.add_point((c_x + r_x, c_y, 0))
    p4 = geometry.add_point((c_x, c_y - r_x, 0))
    arc_1 = geometry.add_ellipse_arc(p1, c, p2, p2)
    arc_2 = geometry.add_ellipse_arc(p2, c, p3, p3)
    arc_3 = geometry.add_ellipse_arc(p3, c, p4, p4)
    arc_4 = geometry.add_ellipse_arc(p4, c, p1, p1)
    obstacle_loop = geometry.add_line_loop([arc_1, arc_2, arc_3, arc_4])

    rectangle = geometry.add_rectangle(0,
                                       L,
                                       0,
                                       H,
                                       0,
                                       res,
                                       holes=[obstacle_loop])
    flow_list = [rectangle.line_loop.lines[3]]
    obstacle_list = obstacle_loop.lines
    walls_list = [rectangle.line_loop.lines[0], rectangle.line_loop.lines[2]]
    geometry.add_physical_surface(rectangle.surface, label=12)
    geometry.add_physical_line(flow_list, label=inflow)
    geometry.add_physical_line(walls_list, label=walls)
    geometry.add_physical_line([rectangle.line_loop.lines[1]], label=outflow)
    geometry.add_physical_line(obstacle_list, label=obstacle)
    field = geometry.add_boundary_layer(edges_list=obstacle_loop.lines,
                                        hfar=res,
                                        hwall_n=res / 8,
                                        thickness=res / 2)
    geometry.add_background_field([field])

    (points, cells, point_data, cell_data,
     field_data) = generate_mesh(geometry,
                                 prune_z_0=True,
                                 geo_filename="test.geo")

    meshio.write(
        "mesh.xdmf",
        meshio.Mesh(points=points, cells={"triangle": cells["triangle"]}))

    meshio.write(
        "mf.xdmf",
        meshio.Mesh(points=points,
                    cells={"line": cells["line"]},
                    cell_data={
                        "line": {
                            "name_to_read": cell_data["line"]["gmsh:physical"]
                        }
                    }))
Esempio n. 9
0
def front_mesh_symmetric(res=0.025):
    """
    Creates a donut mesh with symmetry line through y = c_y
    """
    geometry = Geometry()
    mesh_r = width_scale*res
    c = geometry.add_point((c_x,c_y,0))
    
    # Elliptic obstacle
    p1 = geometry.add_point((c_x-r_x, c_y,0))
    p2 = geometry.add_point((c_x+r_x, c_y,0))
    # embed()
    arc_1 = geometry.add_circle_arc(p1, c, p2)
    arc_2 = geometry.add_circle_arc(p2, c, p1)

    # Surrounding mesh
    p3 = geometry.add_point((c_x-r_x-mesh_r, c_y,0))
    p4 = geometry.add_point((c_x+r_x+mesh_r, c_y,0))
    arc_5 = geometry.add_circle_arc(p3, c, p4)
    arc_6 = geometry.add_circle_arc(p4, c, p3)
    line_front = geometry.add_line(p3, p1)
    line_back = geometry.add_line(p2, p4)    
    surface_top = geometry.add_line_loop([line_front, arc_1, line_back, -arc_5])
    surface_bottom = geometry.add_line_loop([line_front, -arc_2, line_back,
                                             arc_6])

    obstacle_loop = geometry.add_line_loop([arc_1, arc_2])
    outer_loop = geometry.add_line_loop([arc_5,arc_6])
    
    top = geometry.add_plane_surface(surface_top)
    bottom = geometry.add_plane_surface(surface_bottom)
    geometry.add_physical_surface([top, bottom],label=12)
    geometry.add_physical_line(obstacle_loop.lines, label=inner_marker)
    geometry.add_physical_line(outer_loop.lines, label=outer_marker)

    # Create refined mesh around geometry
    field = geometry.add_boundary_layer(edges_list=obstacle_loop.lines,
                                        hfar=res, hwall_n=res/3,
                                        thickness=0.1*mesh_r)
    geometry.add_background_field([field])

    # Generate mesh
    (points, cells, point_data,
     cell_data, field_data) = generate_mesh(geometry, prune_z_0=True,
                                            geo_filename="meshes/test.geo")

    # Save mesh and mesh-function to file
    meshio.write("multimesh_1.xdmf", meshio.Mesh(
        points=points, cells={"triangle": cells["triangle"]}))
    
    meshio.write("mf_1.xdmf", meshio.Mesh(
        points=points, cells={"line": cells["line"]},
        cell_data={"line": {"name_to_read":
                            cell_data["line"]["gmsh:physical"]}}))
    import os
    os.system("mv multimesh_1.* meshes/")
    os.system("mv mf_1.* meshes/")
def single_mesh(res=0.025):
    """
    Create rectangular background mesh for the Poisson problem
    """
    geometry = Geometry()
    c = geometry.add_point((c_x, c_y, 0))
    mesh_r = 5 * res  # Width of mesh

    # Elliptic obstacle
    p1 = geometry.add_point((c_x - r_x, c_y, 0))
    p2 = geometry.add_point((c_x, c_y + r_y, 0))
    p3 = geometry.add_point((c_x + r_x, c_y, 0))
    p4 = geometry.add_point((c_x, c_y - r_y, 0))
    arc_1 = geometry.add_ellipse_arc(p1, c, p2, p2)
    arc_2 = geometry.add_ellipse_arc(p2, c, p3, p3)
    arc_3 = geometry.add_ellipse_arc(p3, c, p4, p4)
    arc_4 = geometry.add_ellipse_arc(p4, c, p1, p1)
    obstacle_loop = geometry.add_line_loop([arc_1, arc_2, arc_3, arc_4])

    # Surrounding mesh
    rectangle = geometry.add_rectangle(0,
                                       L,
                                       0,
                                       H,
                                       0,
                                       res,
                                       holes=[obstacle_loop])
    geometry.add_physical_surface(rectangle.surface, label=12)
    geometry.add_physical_line(obstacle_loop.lines, label=inner_marker)
    geometry.add_physical_line(rectangle.line_loop.lines, label=outer_marker)
    # Create refined mesh around geometry
    field = geometry.add_boundary_layer(edges_list=obstacle_loop.lines,
                                        hfar=res,
                                        hwall_n=res / 2,
                                        thickness=2 * res)
    geometry.add_background_field([field])

    # Generate mesh
    (points, cells, point_data, cell_data,
     field_data) = generate_mesh(geometry,
                                 prune_z_0=True,
                                 geo_filename="meshes/test_single.geo")

    # Save mesh and mesh-function to file
    meshio.write(
        "meshes/singlemesh.xdmf",
        meshio.Mesh(points=points, cells={"triangle": cells["triangle"]}))

    meshio.write(
        "meshes/mf.xdmf",
        meshio.Mesh(points=points,
                    cells={"line": cells["line"]},
                    cell_data={
                        "line": {
                            "name_to_read": cell_data["line"]["gmsh:physical"]
                        }
                    }))
Esempio n. 11
0
def background_mesh(res=0.025):
    """
    Create rectangular background mesh for the Poisson problem
    """
    geo = Geometry()
    # Create points for square with two inlets and one outlet
    points = []
    points.append(geo.add_point((0, 0, 0), res))
    points.append(geo.add_point((1, 0, 0), res))
    points.append(geo.add_point((1, 1, 0), res))
    points.append(geo.add_point(outlet[1], res))
    points.append(geo.add_point(outlet[0], res))
    points.append(geo.add_point((0, 1, 0), res))
    points.append(geo.add_point(inlet1[1], res))
    points.append(geo.add_point(inlet1[0], res))
    points.append(geo.add_point(inlet0[1], res))
    points.append(geo.add_point(inlet0[0], res))
    # Connect points as lines
    lines = []
    for i in range(len(points) - 1):
        lines.append(geo.add_line(points[i], points[i + 1]))
    lines.append(geo.add_line(points[-1], points[0]))
    # Create geometry
    line_loop = geo.add_line_loop(lines)
    square = geo.add_plane_surface(line_loop)

    # Create cell and facet function
    wall_lines = lines[0:3] + lines[4:6] + [lines[7]] + [lines[9]]
    inlet0_lines = [lines[8]]
    inlet1_lines = [lines[6]]
    outlet_lines = [lines[3]]
    geo.add_physical_surface([square], label=12)
    geo.add_physical_line(inlet0_lines, label=inlet0_marker)
    geo.add_physical_line(inlet1_lines, label=inlet1_marker)
    geo.add_physical_line(outlet_lines, label=outlet_marker)
    geo.add_physical_line(wall_lines, label=wall_marker)

    # Create mesh
    (points, cells, point_data, cell_data,
     field_data) = generate_mesh(geo, prune_z_0=True)  #,
    #geo_filename="meshes/tmp.geo")

    meshio.write(
        "meshes/multimesh_0.xdmf",
        meshio.Mesh(points=points, cells={"triangle": cells["triangle"]}))

    meshio.write(
        "meshes/mf_0.xdmf",
        meshio.Mesh(points=points,
                    cells={"line": cells["line"]},
                    cell_data={
                        "line": {
                            "name_to_read": cell_data["line"]["gmsh:physical"]
                        }
                    }))
Esempio n. 12
0
def Generate_PBRpygmsh(xlim,
                       ylim,
                       f_ids,
                       meszf=0.003,
                       folder='pygmeshio_data'):

    # meszf = mesh element size factor
    # rectangle geometry
    xmin, xmax = xlim
    ymin, ymax = ylim
    WAid, INid = f_ids  # Wall and inlet boundaries ids.

    # Pygmsh files
    pygmsh_geo = os.path.join(folder, "PBR.geo")
    pygmsh_msh = os.path.join(folder, "PBR.msh")
    pygmsh_mesh = os.path.join(folder, "PBR_mesh.xdmf")
    pygmsh_facets = os.path.join(folder, "PBR_facets.xdmf")

    geom = pygmsh.built_in.Geometry()
    rect = geom.add_rectangle(xmin, xmax, ymin, ymax, 0.0, lcar=meszf)
    geom.add_physical([rect.line_loop.lines[0]], 10)
    geom.add_physical([rect.line_loop.lines[1]], 11)
    geom.add_physical([rect.line_loop.lines[2]], WAid)  # Wall boundary
    geom.add_physical([rect.line_loop.lines[3]], INid)  # Inlet boundary
    geom.add_physical([rect.surface], 20)

    mesh = pygmsh.generate_mesh(geom,
                                dim=2,
                                prune_z_0=True,
                                geo_filename=pygmsh_geo,
                                msh_filename=pygmsh_msh)

    cells = np.vstack(
        np.array(
            [cells.data for cells in mesh.cells if cells.type == "triangle"]))
    triangle_mesh = meshio.Mesh(points=mesh.points,
                                cells=[("triangle", cells)])

    facet_cells = np.vstack(
        np.array([cells.data for cells in mesh.cells if cells.type == "line"]))
    facet_data = mesh.cell_data_dict["gmsh:physical"]["line"]
    facet_mesh = meshio.Mesh(points=mesh.points,
                             cells=[("line", facet_cells)],
                             cell_data={"name_to_read": [facet_data]})

    # Write mesh
    meshio.xdmf.write(pygmsh_mesh, triangle_mesh)
    meshio.xdmf.write(pygmsh_facets, facet_mesh)

    return pygmsh_mesh, pygmsh_facets
Esempio n. 13
0
def front_mesh_unsym(res=0.025):
    """
    Creates unsymmetric donut mesh
    """
    geometry = Geometry()
    mesh_r = width_scale*res
    c = geometry.add_point((c_x,c_y,0))
    
    # Elliptic obstacle
    p1 = geometry.add_point((c_x-r_x, c_y,0),lcar=res/2)
    p2 = geometry.add_point((c_x+r_x, c_y,0),lcar=res/2)

    arc_1 = geometry.add_circle_arc(p1, c, p2)
    arc_2 = geometry.add_circle_arc(p2, c, p1)

    # Surrounding mesh
    p3 = geometry.add_point((c_x-r_x-mesh_r, c_y,0),lcar=res)
    p4 = geometry.add_point((c_x+r_x+mesh_r, c_y,0),lcar=res)
    arc_5 = geometry.add_circle_arc(p3, c, p4)
    arc_6 = geometry.add_circle_arc(p4, c, p3)
    obstacle_loop = geometry.add_line_loop([arc_1, arc_2])
    outer_loop = geometry.add_line_loop([arc_5,arc_6])
    
    donut = geometry.add_plane_surface(obstacle_loop, holes=[outer_loop])
   
    geometry.add_physical_surface([donut],label=12)
    geometry.add_physical_line(obstacle_loop.lines, label=inner_marker)
    geometry.add_physical_line(outer_loop.lines, label=outer_marker)

    # Create refined mesh around geometry
    # field = geometry.add_boundary_layer(edges_list=obstacle_loop.lines,
    #                                     hfar=res, hwall_n=res/3,
    #                                     thickness=2*res)
    # geometry.add_background_field([field])

    # Generate mesh
    (points, cells, point_data,
     cell_data, field_data) = generate_mesh(geometry, prune_z_0=True,
                                            geo_filename="meshes/test.geo")

    # Save mesh and mesh-function to file
    meshio.write("meshes/multimesh_1.xdmf", meshio.Mesh(
        points=points, cells={"triangle": cells["triangle"]}))
    
    meshio.write("meshes/mf_1.xdmf", meshio.Mesh(
        points=points, cells={"line": cells["line"]},
        cell_data={"line": {"name_to_read":
                            cell_data["line"]["gmsh:physical"]}}))
Esempio n. 14
0
def single_mesh(res=0.025):
    geometry = Geometry()
    c = geometry.add_point((c_x, c_y, 0))

    # Elliptic obstacle
    p1 = geometry.add_point((c_x - r_x, c_y, 0))
    p2 = geometry.add_point((c_x, c_y + r_y, 0))
    p3 = geometry.add_point((c_x + r_x, c_y, 0))
    p4 = geometry.add_point((c_x, c_y - r_y, 0))
    arc_1 = geometry.add_ellipse_arc(p1, c, p2, p2)
    arc_2 = geometry.add_ellipse_arc(p2, c, p3, p3)
    arc_3 = geometry.add_ellipse_arc(p3, c, p4, p4)
    arc_4 = geometry.add_ellipse_arc(p4, c, p1, p1)
    obstacle_loop = geometry.add_line_loop([arc_1, arc_2, arc_3, arc_4])

    rectangle = geometry.add_rectangle(0,
                                       L,
                                       0,
                                       H,
                                       0,
                                       res,
                                       holes=[obstacle_loop])

    geometry.add_physical_surface(rectangle.surface, label=12)
    geometry.add_physical_line(obstacle_loop.lines, label=inner_marker)
    geometry.add_physical_line(rectangle.line_loop.lines, label=outer_marker)
    field = geometry.add_boundary_layer(edges_list=obstacle_loop.lines,
                                        hfar=res,
                                        hwall_n=res / 2,
                                        thickness=2 * res)
    geometry.add_background_field([field])

    (points, cells, point_data, cell_data,
     field_data) = generate_mesh(geometry, prune_z_0=True)

    meshio.write(
        "meshes/singlemesh.xdmf",
        meshio.Mesh(points=points, cells={"triangle": cells["triangle"]}))

    meshio.write(
        "meshes/mf.xdmf",
        meshio.Mesh(points=points,
                    cells={"line": cells["line"]},
                    cell_data={
                        "line": {
                            "name_to_read": cell_data["line"]["gmsh:physical"]
                        }
                    }))
Esempio n. 15
0
    def save(self,
             filename: str,
             point_data: Optional[Dict[str, ndarray]] = None,
             cell_data: Optional[Dict[str, ndarray]] = None) -> None:
        """Export the mesh and fields using meshio.

        Parameters
        ----------
        filename
            The output filename, with suffix determining format;
            e.g. .msh, .vtk, .xdmf
        point_data
            Data related to the vertices of the mesh.
        cell_data
            Data related to the elements of the mesh.

        """
        import meshio

        if point_data is not None:
            if not isinstance(point_data, dict):
                raise ValueError("point_data should be "
                                 "a dictionary of ndarrays.")

        if cell_data is not None:
            if not isinstance(point_data, dict):
                raise ValueError("cell_data should be "
                                 "a dictionary of ndarrays.")

        cells = {self.meshio_type: self.t.T}
        mesh = meshio.Mesh(self.p.T, cells, point_data, cell_data)
        meshio.write(filename, mesh)
Esempio n. 16
0
    def toSTL(self, stlname, **kwargs):
        """save surface shape a stl file using meshio

        Parameters:
          stlname -- string, the filename you want to save, final name is 'stlname.vts'
          kwargs -- optional keyword arguments used for self.plot3d.

        Returns:
          mesh: Mesh object in meshio

        """
        import meshio

        kwargs.setdefault("npol", 120)
        kwargs.setdefault("ntor", 180)
        _xx, _yy, _zz, _nn = self.plot3d("noplot", **kwargs)
        npol = kwargs["npol"]
        ntor = kwargs["ntor"]
        points = np.ascontiguousarray(
            np.transpose([_xx.ravel(), _yy.ravel(),
                          _zz.ravel()]))
        con = []
        for i in range(npol - 1):
            for j in range(ntor - 1):
                ij = i * ntor + j
                con.append([ij, ij + 1, ij + ntor + 1])
                con.append([ij, ij + ntor, ij + ntor + 1])
        cells = [("triangle", np.array(con))]
        mesh = meshio.Mesh(points, cells)
        mesh.write(stlname)
        return mesh
Esempio n. 17
0
def plot_results_over_line(model, data, lines=(-0.5, 0, 0.5), ndata=5, save_name=""):
    device = 'cpu'
    model = model.to(device)
    model.load_state_dict(torch.load("models/model" + save_name + ".pth", map_location=device))
    model.eval()
    with torch.no_grad():
        for i, d in enumerate(data):
            if i > ndata:
                break
            d = d.to(device=device)
            pred = model(d)
            pred = pred.numpy()[:, 0]
            gt = d.y.numpy()[:, 0]

            cells = d.face.numpy()
            points = d.x.numpy()
            points[:, 2] = 0.
            mesh = meshio.Mesh(points=points, cells=[("triangle", cells.T)])

            plt.figure(figsize=(12, 5))
            plt.subplot(1, 2, 1)
            for line in lines:
                plot_mesh_onto_line(mesh, val=pred, x=line)
                plot_mesh_onto_line(mesh, val=gt, x=line, linestyle="--")

            plt.subplot(1, 2, 2)
            for line in lines:
                plot_mesh_onto_line(mesh, val=pred, y=line)
                plot_mesh_onto_line(mesh, val=gt, y=line, linestyle="--")
            plt.show()
Esempio n. 18
0
def convert_vtk_mesh_to_meshio(vtk_mesh):
    mesh_vtu_wrapped = dsa.WrapDataObject(vtk_mesh)
    points = np.array(mesh_vtu_wrapped.GetPoints())
    cells = np.array(mesh_vtu_wrapped.GetCells())
    vtk_cell_type = np.unique(mesh_vtu_wrapped.GetCellTypes())[0]
    if vtk_cell_type == 5:
        mio_cell_type = 'triangle'
        n_cell_comp = 3
    elif vtk_cell_type == 10:
        mio_cell_type = 'tetrahedron'
        n_cell_comp = 4
    n_cells = len(cells)
    cells_reshaped = cells.reshape(
        (int(n_cells / (n_cell_comp + 1)), n_cell_comp + 1))
    cells_reshaped = cells_reshaped[:, 1:]
    mio_cells = {mio_cell_type: cells_reshaped}
    mio_points = points
    mio_cell_data = {}
    for cell_data_name in mesh_vtu_wrapped.CellData.keys():
        data = mesh_vtu_wrapped.CellData.GetArray(cell_data_name)
        mio_cell_data['ElementBlockIds'] = data
    mio_mesh = mio.Mesh(mio_points, mio_cells)
    if len(mio_cell_data) > 0:
        mio_mesh.cell_data[mio_cell_type] = mio_cell_data
    return mio_mesh
Esempio n. 19
0
def test(lcar=1.0):
    lbw = [2, 3, 5]
    geom = pygmsh.built_in.Geometry()
    points = [geom.add_point([x, 0.0, 0.0], lcar) for x in [0.0, lbw[0]]]
    line = geom.add_line(*points)

    _, rectangle, _ = geom.extrude(line,
                                   translation_axis=[0.0, lbw[1], 0.0],
                                   num_layers=lbw[1],
                                   recombine=True)
    geom.extrude(
        rectangle,
        translation_axis=[0.0, 0.0, lbw[2]],
        num_layers=lbw[2],
        recombine=True,
    )

    # compute_volume only supports 3D for tetras, but does return
    # surface area for quads

    ref = sum(l * w for l, w in permutations(lbw, 2))  # surface area
    mesh = pygmsh.generate_mesh(geom, prune_vertices=False)
    # TODO compute hex volumes
    assert (abs(
        compute_volume(
            meshio.Mesh(mesh.points, {"quad": mesh.cells_dict["quad"]})) - ref)
            < 1.0e-2 * ref)
    return mesh
Esempio n. 20
0
def test_square_circle_slice():
    """Test planar suface square with circular hole.

    Also test for surface area of fragments.
    """
    with pygmsh.occ.Geometry() as geom:
        square = square_loop(geom)
        curve_loop = circle_loop(geom)
        surf1 = geom.add_plane_surface(square)
        surf2 = geom.add_plane_surface(curve_loop)
        geom.boolean_fragments(surf1, surf2)
        # Gmsh 4 default format MSH4 doesn't have geometrical entities.
        mesh = geom.generate_mesh()

    ref = 1.0
    val = compute_volume(mesh)
    assert np.abs(val - ref) < 1e-3 * ref

    outer_mask = np.where(mesh.cell_data["gmsh:geometrical"][2] == 13)[0]
    outer_cells = {}
    outer_cells["triangle"] = mesh.cells_dict["triangle"][outer_mask]

    inner_mask = np.where(mesh.cell_data["gmsh:geometrical"][2] == 12)[0]
    inner_cells = {}
    inner_cells["triangle"] = mesh.cells_dict["triangle"][inner_mask]

    ref = 1 - 0.1**2 * np.pi
    value = compute_volume(meshio.Mesh(mesh.points, outer_cells))
    assert np.abs(value - ref) < 1e-2 * ref
Esempio n. 21
0
def test_fragments_diff_union():
    """Test planar surface with holes.

    Construct it with boolean operations and verify that it is the same.
    """
    # construct surface using boolean
    geo_object = pygmsh.opencascade.Geometry(0.04, 0.04)
    geo_object, square = square_loop(geo_object)
    geo_object, line_loop = circle_loop(geo_object)
    surf1 = geo_object.add_plane_surface(square)
    surf2 = geo_object.add_plane_surface(line_loop)

    geo_object.add_physical([surf1], label=1)
    geo_object.add_physical([surf2], label=2)
    surf_diff = geo_object.boolean_difference([surf1], [surf2],
                                              delete_other=False)
    geo_object.boolean_union([surf_diff, surf2])
    mesh = pygmsh.generate_mesh(geo_object)
    assert np.abs((compute_volume(mesh) - 1) / 1) < 1e-3
    surf = 1 - 0.1**2 * np.pi
    outer_mask = np.where(
        mesh.cell_data_dict["gmsh:physical"]["triangle"] == 1)[0]
    outer_cells = {}
    outer_cells["triangle"] = mesh.cells_dict["triangle"][outer_mask]

    inner_mask = np.where(
        mesh.cell_data_dict["gmsh:physical"]["triangle"] == 2)[0]
    inner_cells = {}
    inner_cells["triangle"] = mesh.cells_dict["triangle"][inner_mask]

    value = compute_volume(meshio.Mesh(mesh.points, outer_cells))
    assert np.abs(value - surf) < 1e-2 * surf
Esempio n. 22
0
    def save(
        self,
        filename: str,
        point_data: Optional[Union[ndarray, Dict[str, ndarray]]] = None,
        cell_data: Optional[Union[ndarray, Dict[str,
                                                ndarray]]] = None) -> None:
        """Export the mesh and fields using meshio.

        Parameters
        ----------
        filename
            The filename for vtk-file.
        point_data
            Data related to the vertices of the mesh. Numpy array for one
            output, or dict for multiple.
        cell_data
            Data related to the elements of the mesh. Numpy array for one
            output, or dict for multiple

        """
        import meshio

        if point_data is not None:
            if not isinstance(point_data, dict):
                point_data = {'0': point_data}

        if cell_data is not None:
            if not isinstance(point_data, dict):
                cell_data = {'0': cell_data}

        cells = {self.meshio_type: self.t.T}
        mesh = meshio.Mesh(self.p.T, cells, point_data, cell_data)
        meshio.write(filename, mesh)
Esempio n. 23
0
    def save(self,
             filename: str,
             point_data: Optional[Dict[str, ndarray]] = None,
             cell_data: Optional[Dict[str, ndarray]] = None):
        """Export the mesh and fields using meshio. (Hexahedron version.)

        Parameters
        ----------
        filename
            The filename for vtk-file.
        point_data
            ndarray for one output or dict for multiple
        cell_data
            ndarray for one output or dict for multiple

        """
        import meshio

        # vtk requires a different ordering
        t = self.t[[0, 3, 6, 2, 1, 5, 7, 4], :]

        if point_data is not None:
            if not isinstance(point_data, dict):
                raise ValueError("point_data should be "
                                 "a dictionary of ndarrays.")

        if cell_data is not None:
            if not isinstance(point_data, dict):
                raise ValueError("cell_data should be "
                                 "a dictionary of ndarrays.")

        cells = {'hexahedron': t.T}
        mesh = meshio.Mesh(self.p.T, cells, point_data, cell_data)
        meshio.write(filename, mesh)
Esempio n. 24
0
    def to_meshio(self):
        """
        Convert mesh to :class:`meshio.Mesh`.

        Returns
        -------
        meshio.Mesh
            Output mesh.

        """
        keys = ["points", "point_data", "field_data"]
        kwargs = {key: getattr(self, key) for key in keys}

        version = get_meshio_version()
        cell_data = {k: self.split(v) for k, v in self.cell_data.items()}
        if version[0] >= 4:
            kwargs.update({
                "cells": self.cells,
                "cell_data": cell_data,
                "point_sets": self.point_sets,
                "cell_sets": self.cell_sets,
            })
        else:
            cells, cell_data = get_old_meshio_cells(self.cells, cell_data)
            kwargs.update({
                "cells": cells,
                "cell_data": cell_data,
                "node_sets": self.point_sets,
            })

        return meshio.Mesh(**kwargs)
Esempio n. 25
0
def main():
	if len(sys.argv) != 4:
		print(f'Usage: {sys.argv[0]} [inputFile] [resultFile] [outFile]')
		exit()

	inputFile, resultFile, outFile = sys.argv[1:]

	# read TLC data
	input_dict  = read_TLC_input(inputFile)
	result_dict = read_TLC_result(resultFile)

	# compute TLC result mesh
	pts = result_dict["resV"]
	nV, nDim = pts.shape
	if nDim < 3:  # pad to 3D points
		pts = np.pad(pts,((0,0),(0,3-nDim)))

	raw_cells = input_dict["cells"]
	nF, simplex_size = raw_cells.shape
	
	if simplex_size == 3: # tri
		cells = [ ("triangle", raw_cells)]
	else: # tet
		cells = [ ("tetra", raw_cells) ]
	
	resMesh = meshio.Mesh(pts, cells)

	# write result mesh to file
	meshio.write(outFile, resMesh) 
Esempio n. 26
0
def test_elset():
    points = np.array(
        [[1.0, 0.0, 0.0], [1.0, 1.0, 0.0], [2.0, 0.5, 0.0], [0.0, 0.5, 0.0]]
    )
    cells = [
        ("triangle", np.array([[0, 1, 2]])),
        ("triangle", np.array([[0, 1, 3]])),
    ]
    cell_sets = {
        "right": [np.array([0]), np.array([])],
        "left": [np.array([]), np.array([1])],
    }
    mesh_ref = meshio.Mesh(points, cells, cell_sets=cell_sets)

    with tempfile.TemporaryDirectory() as temp_dir:
        filepath = pathlib.Path(temp_dir) / "test.inp"
        meshio.abaqus.write(filepath, mesh_ref)
        mesh = meshio.abaqus.read(filepath)

    assert np.allclose(mesh_ref.points, mesh.points)

    assert len(mesh_ref.cells) == len(mesh.cells)
    for ic, cell in enumerate(mesh_ref.cells):
        assert cell.type == mesh.cells[ic].type
        assert np.allclose(cell.data, mesh.cells[ic].data)

    assert sorted(mesh_ref.cell_sets.keys()) == sorted(mesh.cell_sets.keys())
    for k, v in mesh_ref.cell_sets.items():
        for ic in range(len(mesh_ref.cells)):
            assert np.allclose(v[ic], mesh.cell_sets[k][ic])
Esempio n. 27
0
def test_square_circle_slice():
    """Test planar suface square with circular hole.

    Also test for surface area of fragments.
    """
    geo_object = built_in_opencascade_geos_fragments()

    # Gmsh 4 default format MSH4 doesn't have geometrical entities.
    mesh = pygmsh.generate_mesh(geo_object,
                                extra_gmsh_arguments=["-format", "msh2"])
    ref = 1
    val = compute_volume(mesh)
    assert np.abs(val - ref) < 1e-3 * ref

    outer_mask = np.where(mesh.cell_data["gmsh:geometrical"][2] == 13)[0]
    outer_cells = {}
    outer_cells["triangle"] = mesh.cells_dict["triangle"][outer_mask]

    inner_mask = np.where(mesh.cell_data["gmsh:geometrical"][2] == 12)[0]
    inner_cells = {}
    inner_cells["triangle"] = mesh.cells_dict["triangle"][inner_mask]

    ref = 1 - 0.1**2 * np.pi
    value = compute_volume(meshio.Mesh(mesh.points, outer_cells))
    assert np.abs(value - ref) < 1e-2 * ref
    return
Esempio n. 28
0
def gosplElev(coords, cells, elev, gmesh, visvtk=False):

    Gmesh = meshplex.MeshTri(coords, cells)
    s = Gmesh.idx_hierarchy.shape
    a = np.sort(Gmesh.idx_hierarchy.reshape(s[0], -1).T)

    if meshplex.__version__ >= "0.16.0":
        Gmesh.edges = {"points": np.unique(a, axis=0)}
        ngbNbs, ngbID = definegtin(len(coords), Gmesh.cells("points"),
                                   Gmesh.edges["points"])
    elif meshplex.__version__ >= "0.14.0":
        Gmesh.edges = {"points": np.unique(a, axis=0)}
        ngbNbs, ngbID = definegtin(len(coords), Gmesh.cells["points"],
                                   Gmesh.edges["points"])
    else:
        Gmesh.edges = {"nodes": np.unique(a, axis=0)}
        ngbNbs, ngbID = definegtin(len(coords), Gmesh.cells["nodes"],
                                   Gmesh.edges["nodes"])

    np.savez_compressed(gmesh,
                        v=coords,
                        c=cells,
                        n=ngbID[:, :8].astype(int),
                        z=elev)

    if visvtk:
        paleovtk = gmesh + ".vtk"
        vis_mesh = meshio.Mesh(coords, {"triangle": cells},
                               point_data={"z": elev})
        meshio.write(paleovtk, vis_mesh)
        print("Writing VTK file {}".format(paleovtk))

    return
Esempio n. 29
0
    def _write(self, fields: Iterable[Field], file_name: str, meshio_geom) -> None:

        cell_data = {}

        # we need to split the data for each group of geometrically uniform cells
        cell_id = meshio_geom[2]
        num_block = cell_id.size

        for field in fields:
            if field.values is None:
                continue

            # for each field create a sub-vector for each geometrically uniform group of cells
            cell_data[field.name] = np.empty(num_block, dtype=object)
            # fill up the data
            for block, ids in enumerate(cell_id):
                if field.values.ndim == 1:
                    cell_data[field.name][block] = field.values[ids]
                elif field.values.ndim == 2:
                    cell_data[field.name][block] = field.values[:, ids].T
                else:
                    raise ValueError

        # add also the cells ids
        cell_data.update({self.cell_id_key: cell_id})

        # create the meshio object
        meshio_grid_to_export = meshio.Mesh(
            meshio_geom[0], meshio_geom[1], cell_data=cell_data
        )
        meshio.write(file_name, meshio_grid_to_export, binary=self.binary)
Esempio n. 30
0
def test_fragments_diff_union():
    """Test planar surface with holes.

    Construct it with boolean operations and verify that it is the same.
    """
    # construct surface using boolean
    with pygmsh.occ.Geometry() as geom:
        geom.characteristic_length_min = 0.04
        geom.characteristic_length_max = 0.04
        square = square_loop(geom)
        surf1 = geom.add_plane_surface(square)
        curve_loop = circle_loop(geom)
        surf2 = geom.add_plane_surface(curve_loop)

        geom.add_physical([surf1], label="1")
        geom.add_physical([surf2], label="2")
        geom.boolean_difference(surf1, surf2, delete_other=False)
        mesh = geom.generate_mesh()

    ref = 1.0
    assert np.abs(compute_volume(mesh) - ref) < 1e-3 * ref

    surf = 1 - 0.1**2 * np.pi
    outer_mask = np.where(
        mesh.cell_data_dict["gmsh:geometrical"]["triangle"] == 1)[0]
    outer_cells = {}
    outer_cells["triangle"] = mesh.cells_dict["triangle"][outer_mask]

    inner_mask = np.where(
        mesh.cell_data_dict["gmsh:geometrical"]["triangle"] == 2)[0]
    inner_cells = {}
    inner_cells["triangle"] = mesh.cells_dict["triangle"][inner_mask]

    value = compute_volume(meshio.Mesh(mesh.points, outer_cells))
    assert np.abs(value - surf) < 1e-2 * surf