def test_cuboids_intersection(): c0 = pygalmesh.Cuboid([0, 0, -0.5], [3, 3, 0.5]) c1 = pygalmesh.Cuboid([1, 1, -2], [2, 2, 2]) u = pygalmesh.Intersection([c0, c1]) # In CGAL, feature edges must not intersect, and that's a problem here: The # intersection edges of the cuboids share eight points with the edges of # the tall and skinny cuboid. # eps = 1.0e-2 # extra_features = [ # [[1.0, 1.0 + eps, 0.5], [1.0, 2.0 - eps, 0.5]], # [[1.0 + eps, 2.0, 0.5], [2.0 - eps, 2.0, 0.5]], # [[2.0, 2.0 - eps, 0.5], [2.0, 1.0 + eps, 0.5]], # [[2.0 - eps, 1.0, 0.5], [1.0 + eps, 1.0, 0.5]], # ] mesh = pygalmesh.generate_mesh(u, cell_size=0.1, edge_size=0.1, verbose=False) # filter the vertices that belong to cells verts = mesh.points[numpy.unique(mesh.cells["tetra"])] tol = 1.0e-2 assert abs(max(verts[:, 0]) - 2.0) < tol assert abs(min(verts[:, 0]) - 1.0) < tol assert abs(max(verts[:, 1]) - 2.0) < tol assert abs(min(verts[:, 1]) - 1.0) < tol assert abs(max(verts[:, 2]) - 0.5) < 0.05 assert abs(min(verts[:, 2]) + 0.5) < 0.05 vol = sum(helpers.compute_volumes(mesh.points, mesh.cells["tetra"])) assert abs(vol - 1.0) < 0.05 return
def test_cuboids_union(): c0 = pygalmesh.Cuboid([0, 0, -0.5], [3, 3, 0.5]) c1 = pygalmesh.Cuboid([1, 1, -2], [2, 2, 2]) u = pygalmesh.Union([c0, c1]) pygalmesh.generate_mesh(u, 'out.mesh', cell_size=0.2, edge_size=0.2, verbose=False) vertices, cells, _, _, _ = meshio.read('out.mesh') # filter the vertices that belong to cells verts = vertices[numpy.unique(cells['tetra'])] tol = 1.0e-2 assert abs(max(verts[:, 0]) - 3.0) < tol assert abs(min(verts[:, 0]) - 0.0) < tol assert abs(max(verts[:, 1]) - 3.0) < tol assert abs(min(verts[:, 1]) - 0.0) < tol assert abs(max(verts[:, 2]) - 2.0) < tol assert abs(min(verts[:, 2]) + 2.0) < tol vol = sum(compute_volumes(vertices, cells['tetra'])) assert abs(vol - 12.0) < 0.1 return
def l_shape_3d(h): b0 = pygalmesh.Cuboid([-1.0, -1.0, -1.0], [1.0, 1.0, 1.0]) b1 = pygalmesh.Cuboid([0.0, 0.0, 0.0], [1.1, 1.1, 1.1]) u = pygalmesh.Difference(b0, b1) mesh = pygalmesh.generate_mesh( u, max_edge_size_at_feature_edges=h, max_cell_circumradius=h, verbose=False, # TODO sharpen the intersection edges and avoid # [1] 591479 segmentation fault (core dumped) python3 pygalmesh_examples.py # feature_edges=[ # [[1.0, 0.0, z] for z in numpy.linspace(0.0, 1.0, int(1.0 / h))] # ] ) mesh.remove_lower_dimensional_cells() mesh.remove_orphaned_nodes() return mesh.points, mesh.get_cells_type("tetra")
def test_halfspace(): c = pygalmesh.Cuboid([0, 0, 0], [1, 1, 1]) s = pygalmesh.HalfSpace([1.0, 2.0, 3.0], 1.0, 2.0) u = pygalmesh.Intersection([c, s]) mesh = pygalmesh.generate_mesh(u, cell_size=0.2, edge_size=0.2, verbose=False) vol = sum(helpers.compute_volumes(mesh.points, mesh.cells["tetra"])) assert abs(vol - 1 / 750) < 1.0e-3 return
def test_rotation(): s0 = pygalmesh.Rotate( pygalmesh.Cuboid([0, 0, 0], [1, 2, 3]), [1.0, 0.0, 0.0], numpy.pi / 12.0 ) mesh = pygalmesh.generate_mesh(s0, cell_size=0.1, edge_size=0.1, verbose=False) tol = 1.0e-2 vol = sum(helpers.compute_volumes(mesh.points, mesh.cells["tetra"])) assert abs(vol - 6.0) < tol return
def test_cuboids_union(): c0 = pygalmesh.Cuboid([0, 0, -0.5], [3, 3, 0.5]) c1 = pygalmesh.Cuboid([1, 1, -2], [2, 2, 2]) u = pygalmesh.Union([c0, c1]) mesh = pygalmesh.generate_mesh(u, cell_size=0.2, edge_size=0.2, verbose=False) # filter the vertices that belong to cells verts = mesh.points[numpy.unique(mesh.cells["tetra"])] tol = 1.0e-2 assert abs(max(verts[:, 0]) - 3.0) < tol assert abs(min(verts[:, 0]) - 0.0) < tol assert abs(max(verts[:, 1]) - 3.0) < tol assert abs(min(verts[:, 1]) - 0.0) < tol assert abs(max(verts[:, 2]) - 2.0) < tol assert abs(min(verts[:, 2]) + 2.0) < tol vol = sum(helpers.compute_volumes(mesh.points, mesh.cells["tetra"])) assert abs(vol - 12.0) < 0.1 return
def test_translation(): s0 = pygalmesh.Translate(pygalmesh.Cuboid([0, 0, 0], [1, 2, 3]), [1.0, 0.0, 0.0]) mesh = pygalmesh.generate_mesh(s0, cell_size=0.1, edge_size=0.1, verbose=False) tol = 1.0e-2 assert abs(max(mesh.points[:, 0]) - 2.0) < tol assert abs(min(mesh.points[:, 0]) - 1.0) < tol assert abs(max(mesh.points[:, 1]) - 2.0) < tol assert abs(min(mesh.points[:, 1]) + 0.0) < tol assert abs(max(mesh.points[:, 2]) - 3.0) < tol assert abs(min(mesh.points[:, 2]) + 0.0) < tol vol = sum(helpers.compute_volumes(mesh.points, mesh.cells["tetra"])) assert abs(vol - 6.0) < tol return
def test_cuboid(): s0 = pygalmesh.Cuboid([0, 0, 0], [1, 2, 3]) mesh = pygalmesh.generate_mesh(s0, edge_size=0.1, verbose=False) tol = 1.0e-3 assert abs(max(mesh.points[:, 0]) - 1.0) < tol assert abs(min(mesh.points[:, 0]) + 0.0) < tol assert abs(max(mesh.points[:, 1]) - 2.0) < tol assert abs(min(mesh.points[:, 1]) + 0.0) < tol assert abs(max(mesh.points[:, 2]) - 3.0) < tol assert abs(min(mesh.points[:, 2]) + 0.0) < tol vol = sum( helpers.compute_volumes(mesh.points, mesh.get_cells_type("tetra"))) assert abs(vol - 6.0) < tol
def test_scaling(): alpha = 1.3 s = pygalmesh.Scale(pygalmesh.Cuboid([0, 0, 0], [1, 2, 3]), alpha) mesh = pygalmesh.generate_mesh(s, cell_size=0.2, edge_size=0.1, verbose=False) tol = 1.0e-2 assert abs(max(mesh.points[:, 0]) - 1 * alpha) < tol assert abs(min(mesh.points[:, 0]) + 0.0) < tol assert abs(max(mesh.points[:, 1]) - 2 * alpha) < tol assert abs(min(mesh.points[:, 1]) + 0.0) < tol assert abs(max(mesh.points[:, 2]) - 3 * alpha) < tol assert abs(min(mesh.points[:, 2]) + 0.0) < tol vol = sum(helpers.compute_volumes(mesh.points, mesh.cells["tetra"])) assert abs(vol - 6.0 * alpha ** 3) < tol return
def box_with_refinement(h): s = pygalmesh.Cuboid([-1.0, -1.0, -1.0], [1.0, 1.0, 1.0]) def edge_length(x): return h + 0.1 * numpy.sqrt(x[0]**2 + x[1]**2 + x[2]**2) mesh = pygalmesh.generate_mesh( s, max_edge_size_at_feature_edges=h, # The actual factor sqrt(3 / 8) leads to cells too small in comparison with # cells near the feature edges. Again, just take edge_size. max_cell_circumradius=edge_length, verbose=False, ) return mesh.points, mesh.get_cells_type("tetra")
def test_halfspace(): c = pygalmesh.Cuboid([0, 0, 0], [1, 1, 1]) s = pygalmesh.HalfSpace([1.0, 2.0, 3.0], 1.0, 2.0) u = pygalmesh.Intersection([c, s]) pygalmesh.generate_mesh(u, 'out.mesh', cell_size=0.2, edge_size=0.2, verbose=False) vertices, cells, _, _, _ = meshio.read('out.mesh') vol = sum(compute_volumes(vertices, cells['tetra'])) assert abs(vol - 1 / 750) < 1.0e-3 return
def test_rotation(): s0 = pygalmesh.Rotate(pygalmesh.Cuboid([0, 0, 0], [1, 2, 3]), [1.0, 0.0, 0.0], numpy.pi / 12.0) pygalmesh.generate_mesh(s0, 'out.mesh', cell_size=0.1, edge_size=0.1, verbose=False) vertices, cells, _, _, _ = meshio.read('out.mesh') tol = 1.0e-3 vol = sum(compute_volumes(vertices, cells['tetra'])) assert abs(vol - 6.0) < tol return
def test_cuboid(): s0 = pygalmesh.Cuboid([0, 0, 0], [1, 2, 3]) pygalmesh.generate_mesh(s0, "out.mesh", edge_size=0.1, verbose=False) mesh = meshio.read("out.mesh") tol = 1.0e-3 assert abs(max(mesh.points[:, 0]) - 1.0) < tol assert abs(min(mesh.points[:, 0]) + 0.0) < tol assert abs(max(mesh.points[:, 1]) - 2.0) < tol assert abs(min(mesh.points[:, 1]) + 0.0) < tol assert abs(max(mesh.points[:, 2]) - 3.0) < tol assert abs(min(mesh.points[:, 2]) + 0.0) < tol vol = sum(compute_volumes(mesh.points, mesh.cells["tetra"])) assert abs(vol - 6.0) < tol return
def test_stretch(): alpha = 2.0 s = pygalmesh.Stretch(pygalmesh.Cuboid([0, 0, 0], [1, 2, 3]), [alpha, 0.0, 0.0]) mesh = pygalmesh.generate_mesh(s, cell_size=0.2, edge_size=0.2, verbose=False) tol = 1.0e-2 assert abs(max(mesh.points[:, 0]) - alpha) < tol assert abs(min(mesh.points[:, 0]) + 0.0) < tol assert abs(max(mesh.points[:, 1]) - 2.0) < tol assert abs(min(mesh.points[:, 1]) + 0.0) < tol assert abs(max(mesh.points[:, 2]) - 3.0) < tol assert abs(min(mesh.points[:, 2]) + 0.0) < tol vol = sum(helpers.compute_volumes(mesh.points, mesh.cells["tetra"])) assert abs(vol - 12.0) < tol return
def test_cuboid(): s0 = pygalmesh.Cuboid([0, 0, 0], [1, 2, 3]) pygalmesh.generate_mesh(s0, 'out.mesh', edge_size=0.1, verbose=False) vertices, cells, _, _, _ = meshio.read('out.mesh') tol = 1.0e-3 assert abs(max(vertices[:, 0]) - 1.0) < tol assert abs(min(vertices[:, 0]) + 0.0) < tol assert abs(max(vertices[:, 1]) - 2.0) < tol assert abs(min(vertices[:, 1]) + 0.0) < tol assert abs(max(vertices[:, 2]) - 3.0) < tol assert abs(min(vertices[:, 2]) + 0.0) < tol vol = sum(compute_volumes(vertices, cells['tetra'])) assert abs(vol - 6.0) < tol return
def test_scaling(): alpha = 1.3 s = pygalmesh.Scale(pygalmesh.Cuboid([0, 0, 0], [1, 2, 3]), alpha) pygalmesh.generate_mesh(s, 'out.mesh', cell_size=0.2, edge_size=0.1, verbose=False) vertices, cells, _, _, _ = meshio.read('out.mesh') tol = 1.0e-3 assert abs(max(vertices[:, 0]) - 1 * alpha) < tol assert abs(min(vertices[:, 0]) + 0.0) < tol assert abs(max(vertices[:, 1]) - 2 * alpha) < tol assert abs(min(vertices[:, 1]) + 0.0) < tol assert abs(max(vertices[:, 2]) - 3 * alpha) < tol assert abs(min(vertices[:, 2]) + 0.0) < tol vol = sum(compute_volumes(vertices, cells['tetra'])) assert abs(vol - 6.0 * alpha**3) < tol return
def run_cgal(ef, HMIN=75.0): print("generating a mesh with cgal...") t1 = time.time() mesh = pygalmesh.generate_mesh( pygalmesh.Cuboid([-4200.0, 0.0, 0.0], [0.0, 13520.0, 13520.0]), facet_angle=30, cell_radius_edge_ratio=2.0, cell_size=lambda x: ef.eval(x) / 1.1, edge_size=HMIN, ) elapsed = time.time() - t1 # mesh.write("cgal_EAGE.vtk") plex = meshplex.MeshTetra(mesh.points, mesh.cells[1][1]) angles = plex.q_min_sin_dihedral_angles quality = plex.q_radius_ratio num_cells = len(mesh.cells[1][1]) num_vertices = len(mesh.points) return angles, quality, elapsed, num_vertices, num_cells
def test_stretch(): alpha = 2.0 s = pygalmesh.Stretch(pygalmesh.Cuboid([0, 0, 0], [1, 2, 3]), [alpha, 0.0, 0.0]) pygalmesh.generate_mesh(s, 'out.mesh', cell_size=0.2, edge_size=0.2, verbose=False) vertices, cells, _, _, _ = meshio.read('out.mesh') tol = 1.0e-3 assert abs(max(vertices[:, 0]) - alpha) < tol assert abs(min(vertices[:, 0]) + 0.0) < tol assert abs(max(vertices[:, 1]) - 2.0) < tol assert abs(min(vertices[:, 1]) + 0.0) < tol assert abs(max(vertices[:, 2]) - 3.0) < tol assert abs(min(vertices[:, 2]) + 0.0) < tol vol = sum(compute_volumes(vertices, cells['tetra'])) assert abs(vol - 12.0) < tol return