def test_mesh_rotation(ambient_dim, visualize=False): order = 3 if ambient_dim == 2: nelements = 32 mesh = mgen.make_curve_mesh(partial(mgen.ellipse, 2.0), np.linspace(0.0, 1.0, nelements + 1), order=order) elif ambient_dim == 3: mesh = mgen.generate_torus(4.0, 2.0, order=order) else: raise ValueError("unsupported dimension") from meshmode.mesh.processing import _get_rotation_matrix_from_angle_and_axis mat = _get_rotation_matrix_from_angle_and_axis(np.pi / 3.0, np.array([1.0, 2.0, 1.4])) # check that the matrix is in the rotation group assert abs(abs(la.det(mat)) - 1) < 10e-14 assert la.norm(mat @ mat.T - np.eye(3)) < 1.0e-14 from meshmode.mesh.processing import rotate_mesh_around_axis rotated_mesh = rotate_mesh_around_axis(mesh, theta=np.pi / 2.0, axis=np.array([1, 0, 0])) if visualize: from meshmode.mesh.visualization import write_vertex_vtk_file write_vertex_vtk_file(mesh, "mesh_rotation_original.vtu") write_vertex_vtk_file(rotated_mesh, "mesh_rotation_rotated.vtu")
def test_quad_mesh_3d(mesh_name, order=3, visualize=False): if mesh_name == "ball": from meshmode.mesh.io import ScriptWithFilesSource script = ScriptWithFilesSource( """ Merge "ball-radius-1.step"; // Mesh.CharacteristicLengthMax = 0.1; Mesh.RecombineAll = 1; Mesh.Recombine3DAll = 1; Mesh.Recombine3DLevel = 2; Mesh.Algorithm = 8; Mesh.Algorithm3D = 8; Mesh 3; Save "output.msh"; """, ["ball-radius-1.step"]) with open("ball-quad.geo", "w") as f: f.write(script.source) elif mesh_name == "cube": from meshmode.mesh.io import ScriptSource script = ScriptSource( """ SetFactory("OpenCASCADE"); Box(1) = {0, 0, 0, 1, 1, 1}; Transfinite Line "*" = 8; Transfinite Surface "*"; Transfinite Volume "*"; Mesh.RecombineAll = 1; Mesh.Recombine3DAll = 1; Mesh.Recombine3DLevel = 2; """, "geo") else: raise ValueError(f"unknown mesh name: '{mesh_name}'") np.set_printoptions(linewidth=200) from meshmode.mesh.io import generate_gmsh logger.info("BEGIN GEN") mesh = generate_gmsh(script, 3, order=order, target_unit="MM") logger.info("END GEN") if visualize: from meshmode.mesh.visualization import write_vertex_vtk_file write_vertex_vtk_file(mesh, f"quad_mesh_3d_{mesh_name}.vtu", overwrite=True)
def test_quad_mesh_2d(ambient_dim, filename, visualize=False): from meshmode.mesh.io import generate_gmsh, ScriptWithFilesSource logger.info("BEGIN GEN") mesh = generate_gmsh( ScriptWithFilesSource( f""" Merge "{filename}"; Mesh.CharacteristicLengthMax = 0.05; Recombine Surface "*" = 0.0001; Mesh 2; Save "output.msh"; """, [filename]), order=1, force_ambient_dim=ambient_dim, target_unit="MM", ) logger.info("END GEN") logger.info("nelements: %d", mesh.nelements) groups = [] for grp in mesh.groups: if not isinstance(grp, TensorProductElementGroup): # NOTE: gmsh isn't guaranteed to recombine all elements, so we # could still have some simplices sitting around, so skip them groups.append(grp.copy()) continue g = mgen.make_group_from_vertices(mesh.vertices, grp.vertex_indices, grp.order, group_cls=TensorProductElementGroup) assert g.nodes.shape == (mesh.ambient_dim, grp.nelements, grp.nunit_nodes) groups.append(g) mesh_from_vertices = Mesh(mesh.vertices, groups=groups, is_conforming=True) if visualize: from meshmode.mesh.visualization import write_vertex_vtk_file write_vertex_vtk_file(mesh, "quad_mesh_2d_orig.vtu") write_vertex_vtk_file(mesh_from_vertices, "quad_mesh_2d_groups.vtu")
def test_vtk_overwrite(ctx_getter): pytest.importorskip("pyvisfile") def _try_write_vtk(writer, obj): import os from meshmode import FileExistsError filename = "test_vtk_overwrite.vtu" if os.path.exists(filename): os.remove(filename) writer(filename, []) with pytest.raises(FileExistsError): writer(filename, []) writer(filename, [], overwrite=True) if os.path.exists(filename): os.remove(filename) ctx = ctx_getter() queue = cl.CommandQueue(ctx) target_order = 7 from meshmode.mesh.generation import generate_torus mesh = generate_torus(10.0, 2.0, order=target_order) from meshmode.discretization import Discretization from meshmode.discretization.poly_element import \ InterpolatoryQuadratureSimplexGroupFactory discr = Discretization( queue.context, mesh, InterpolatoryQuadratureSimplexGroupFactory(target_order)) from meshmode.discretization.visualization import make_visualizer from meshmode.discretization.visualization import \ write_nodal_adjacency_vtk_file from meshmode.mesh.visualization import write_vertex_vtk_file vis = make_visualizer(queue, discr, 1) _try_write_vtk(vis.write_vtk_file, discr) _try_write_vtk( lambda x, y, **kwargs: write_vertex_vtk_file(discr.mesh, x, **kwargs), discr.mesh) _try_write_vtk( lambda x, y, **kwargs: write_nodal_adjacency_vtk_file( x, discr.mesh, **kwargs), discr.mesh)
def test_vtk_overwrite(ctx_getter): pytest.importorskip("pyvisfile") def _try_write_vtk(writer, obj): import os from meshmode import FileExistsError filename = "test_vtk_overwrite.vtu" if os.path.exists(filename): os.remove(filename) writer(filename, []) with pytest.raises(FileExistsError): writer(filename, []) writer(filename, [], overwrite=True) if os.path.exists(filename): os.remove(filename) ctx = ctx_getter() queue = cl.CommandQueue(ctx) target_order = 7 from meshmode.mesh.generation import generate_torus mesh = generate_torus(10.0, 2.0, order=target_order) from meshmode.discretization import Discretization from meshmode.discretization.poly_element import \ InterpolatoryQuadratureSimplexGroupFactory discr = Discretization( queue.context, mesh, InterpolatoryQuadratureSimplexGroupFactory(target_order)) from meshmode.discretization.visualization import make_visualizer from meshmode.discretization.visualization import \ write_nodal_adjacency_vtk_file from meshmode.mesh.visualization import write_vertex_vtk_file vis = make_visualizer(queue, discr, 1) _try_write_vtk(vis.write_vtk_file, discr) _try_write_vtk(lambda x, y, **kwargs: write_vertex_vtk_file(discr.mesh, x, **kwargs), discr.mesh) _try_write_vtk(lambda x, y, **kwargs: write_nodal_adjacency_vtk_file(x, discr.mesh, **kwargs), discr.mesh)
def test_vtk_overwrite(actx_factory): pytest.importorskip("pyvisfile") def _try_write_vtk(writer, obj): import os filename = "vtk_overwrite_temp.vtu" if os.path.exists(filename): os.remove(filename) writer(filename, []) with pytest.raises(FileExistsError): writer(filename, []) writer(filename, [], overwrite=True) if os.path.exists(filename): os.remove(filename) actx = actx_factory() target_order = 7 mesh = mgen.generate_torus(10.0, 2.0, order=target_order) from meshmode.discretization import Discretization discr = Discretization( actx, mesh, InterpolatoryQuadratureSimplexGroupFactory(target_order)) from meshmode.discretization.visualization import make_visualizer from meshmode.discretization.visualization import \ write_nodal_adjacency_vtk_file from meshmode.mesh.visualization import write_vertex_vtk_file vis = make_visualizer(actx, discr, 1) _try_write_vtk(vis.write_vtk_file, discr) _try_write_vtk( lambda x, y, **kwargs: write_vertex_vtk_file(discr.mesh, x, **kwargs), discr.mesh) _try_write_vtk( lambda x, y, **kwargs: write_nodal_adjacency_vtk_file( x, discr.mesh, **kwargs), discr.mesh)