File: test_sphere.py

package info (click to toggle)
python-meshzoo 0.9.4-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 316 kB
  • sloc: python: 1,691; makefile: 8
file content (75 lines) | stat: -rw-r--r-- 2,764 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import numpy as np
import pytest

import meshzoo

from .helpers import is_near_equal


def _compute_cells_normals_dir(points, cells):
    pc = points[cells]
    midpoints = np.sum(pc, axis=1) / 3.0
    nrm = np.sqrt(np.einsum("ij,ij->i", midpoints, midpoints))
    normals = (midpoints.T / nrm).T
    cross = np.cross(
        pc[:, 1, :] - pc[:, 0, :],
        pc[:, 2, :] - pc[:, 0, :],
    )
    return np.einsum("ij,ij->i", normals, cross)


def test_uv_sphere(num_points_per_circle=20, num_circles=10):
    points, cells = meshzoo.uv_sphere(num_points_per_circle, num_circles)
    assert len(points) == 162
    assert is_near_equal(np.sum(points, axis=0), [0.0, 0.0, 0.0])
    assert len(cells) == 320
    assert (_compute_cells_normals_dir(points, cells) > 0.0).all()
    assert np.all(np.abs(np.einsum("ij,ij->i", points, points) - 1.0) < 1.0e-10)


def test_geo_sphere(num_points_per_circle=20, num_circles=10):
    points, tri, quad = meshzoo.geo_sphere(num_points_per_circle, num_circles)
    # import meshio
    # meshio.write_points_cells("geo-sphere.vtk", points, {"triangle": tri, "quad": quad})
    assert len(points) == 162
    assert is_near_equal(np.sum(points, axis=0), [0.0, 0.0, 0.0])
    assert len(tri) == 40
    assert len(quad) == 140
    # assert (_compute_cells_normals_dir(points, cells) > 0.0).all()
    assert np.all(np.abs(np.einsum("ij,ij->i", points, points) - 1.0) < 1.0e-10)


def test_tetra_sphere(n=16):
    points, cells = meshzoo.tetra_sphere(n)
    # import meshio
    # meshio.write_points_cells("out.vtk", points, {"triangle": cells})
    assert len(points) == 514
    assert is_near_equal(np.sum(points, axis=0), [0.0, 0.0, 0.0])
    assert len(cells) == 1024
    assert (_compute_cells_normals_dir(points, cells) > 0.0).all()
    assert np.all(np.abs(np.einsum("ij,ij->i", points, points) - 1.0) < 1.0e-10)


def test_octa_sphere(n=16):
    points, cells = meshzoo.octa_sphere(n)
    assert len(points) == 1026
    assert is_near_equal(np.sum(points, axis=0), [0.0, 0.0, 0.0])
    assert len(cells) == 2048
    assert (_compute_cells_normals_dir(points, cells) > 0.0).all()
    assert np.all(np.abs(np.einsum("ij,ij->i", points, points) - 1.0) < 1.0e-10)


@pytest.mark.parametrize("flat_top", [True, False])
def test_icosa_sphere(flat_top, n=16):
    points, cells = meshzoo.icosa_sphere(n, flat_top)
    # import meshio
    # meshio.write_points_cells("out.vtk", points, {"triangle": cells})
    assert len(points) == 2562
    assert is_near_equal(np.sum(points, axis=0), [0.0, 0.0, 0.0])
    assert len(cells) == 5120
    assert (_compute_cells_normals_dir(points, cells) > 0.0).all()
    assert np.all(np.abs(np.einsum("ij,ij->i", points, points) - 1.0) < 1.0e-10)


if __name__ == "__main__":
    test_geo_sphere()