15 vertices = list(itertools.product((0, 1), repeat=dim))
16 indices = {point: k + 1
for k, point
in enumerate(vertices)}
18 for axes
in itertools.permutations(range(dim)):
20 cell = [indices[tuple(point)]]
23 cell.append(indices[tuple(point)])
27 original_count = len(cells)
28 for cell
in list(cells):
30 for vertex_id
in cell:
31 point = list(vertices[vertex_id - 1])
34 if point
not in indices:
35 indices[point] = len(vertices) + 1
36 vertices.append(point)
37 translated.append(indices[point])
38 cells.append(translated)
39 lines = [
"$MeshFormat",
"2.2 0 8",
"$EndMeshFormat",
"$Nodes", str(len(vertices))]
40 for point, index
in indices.items():
41 xyz = list(point) + [0] * (3 - dim)
42 lines.append(f
"{index} " +
" ".join(map(str, xyz)))
43 lines += [
"$EndNodes",
"$Elements", str(len(cells))]
44 for index, cell
in enumerate(cells, 1):
45 region = 2
if split
and index > original_count
else 1
46 lines.append(f
"{index} { {1: 1, 2: 2, 3: 4}[dim]} 2 1 {region} " +
" ".join(map(str, cell)))
47 path.write_text(
"\n".join(lines + [
"$EndElements",
""]))
51 Mesh = getattr(model, f
"SimplicialMesh{dim}")
52 mesh = Mesh(str(path), periodicFaceIDs={-1})
53 assert Mesh.dim == dim
54 assert Mesh().search(np.zeros(dim))
is None
55 np.testing.assert_allclose(mesh.volume(), 1.)
56 assert mesh.periodicBasis().shape == (dim, dim)
57 topology = mesh.polyhedralMesh()
58 assert isinstance(topology, getattr(model, f
"PolyhedralMesh{dim}"))
60 for order
in range(dim, -1, -1):
61 simplices = mesh.simplices(order)
63 for key, simplex
in simplices.items():
64 assert isinstance(simplex, getattr(model, f
"Simplex{dim}{order}"))
65 assert simplex.xID == key
66 assert simplex.order == order
and simplex.dim == dim
67 assert len(simplex.vertices()) == order + 1
69 assert len(simplex.children()) == order + 1
70 for child
in simplex.children():
71 assert child.parents()[key]
is simplex
72 bary = np.full(order + 1, 1 / (order + 1))
73 np.testing.assert_allclose(simplex.bary2pos(bary), simplex.center())
75 np.testing.assert_allclose(simplex.P0, simplex.center())
76 for cell
in topology.cells(order).values():
77 assert isinstance(cell, getattr(model, f
"Polyhedron{dim}{order}"))
79 for child
in cell.children.values():
80 assert child.parents[cell.key]
is cell
81 for source, (partner, shift, permutation)
in mesh.periodicSimplexPairs().items():
82 original = mesh.simplices(dim - 1)[source]
83 np.testing.assert_allclose(original.center() + shift, partner.center(), atol=1e-12)
84 for i, vertex
in enumerate(original.vertices()):
85 np.testing.assert_allclose(vertex.P0 + shift, partner.vertices()[permutation[i]].P0, atol=1e-12)
86 assert mesh.periodicSimplexPairs()
87 root_simplex = mesh.search(np.full(dim, 0.3))
88 assert root_simplex
is not None
89 assert mesh.search(np.full(dim, 2.))
is None
90 np.testing.assert_allclose(root_simplex.bary2pos(root_simplex.pos2bary(np.full(dim, 0.3))), np.full(dim, 0.3))
91 assert root_simplex.region
is mesh.region(1)
92 physical = Mesh(str(path))
93 assert physical.periodicBasis().shape == (dim, 0)
94 assert not physical.periodicSimplexPairs()
95 faces = physical.polyhedralMesh().cells(dim - 1)
96 selected = next(iter(faces))
98 partial.identifyParallelFaces({selected})
99 assert partial.periodicBasis().shape == (dim, 1)
100 reader = getattr(model, f
"SimplexReader{dim}")()
101 reader.read(str(path))
102 assert len(reader.elements()) == len(mesh.simplices())
103 scaled = Mesh(str(path), 2 * np.eye(dim), np.full(dim, 0.25))
104 np.testing.assert_allclose(scaled.xMin(), np.full(dim, -0.5))
105 np.testing.assert_allclose(scaled.xMax(), np.full(dim, 1.5))
106 np.testing.assert_allclose(scaled.volume(), 2.**dim)
107 for method
in (mesh.simplices, topology.cells):
113 raise AssertionError(
"Invalid order accepted")