예제 #1
0
def test_scaling():
    alpha = 1.3
    s = frentos.Scale(frentos.Cuboid([0, 0, 0], [1, 2, 3]), alpha)
    frentos.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
예제 #2
0
def test_stretch():
    alpha = 2.0
    s = frentos.Stretch(
            frentos.Cuboid([0, 0, 0], [1, 2, 3]),
            [alpha, 0.0, 0.0]
            )
    frentos.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
예제 #3
0
def test_extrude():
    p = frentos.Polygon2D([[-0.5, -0.3], [0.5, -0.3], [0.0, 0.5]])
    domain = frentos.Extrude(p, [0.0, 0.3, 1.0])
    frentos.generate_mesh(
            domain,
            'out.mesh',
            cell_size=0.1,
            edge_size=0.1,
            verbose=False
            )

    vertices, cells, _, _, _ = meshio.read('out.mesh')

    tol = 1.0e-3
    assert abs(max(vertices[:, 0]) - 0.5) < tol
    assert abs(min(vertices[:, 0]) + 0.5) < tol
    assert abs(max(vertices[:, 1]) - 0.8) < tol
    assert abs(min(vertices[:, 1]) + 0.3) < tol
    assert abs(max(vertices[:, 2]) - 1.0) < tol
    assert abs(min(vertices[:, 2]) + 0.0) < tol

    vol = sum(compute_volumes(vertices, cells['tetra']))
    assert abs(vol - 0.4) < tol

    return
예제 #4
0
def test_translation():
    s0 = frentos.Translate(
            frentos.Cuboid([0, 0, 0], [1, 2, 3]),
            [1.0, 0.0, 0.0]
            )
    frentos.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
    assert abs(max(vertices[:, 0]) - 2.0) < tol
    assert abs(min(vertices[:, 0]) - 1.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
예제 #5
0
def test_tetrahedron():
    s0 = frentos.Tetrahedron(
            [0.0, 0.0, 0.0],
            [1.0, 0.0, 0.0],
            [0.0, 1.0, 0.0],
            [0.0, 0.0, 1.0]
            )
    frentos.generate_mesh(
            s0, 'out.mesh', cell_size=0.1, edge_size=0.1,
            verbose=False
            )

    vertices, cells, _, _, _ = meshio.read('out.mesh')

    tol = 1.0e-4
    assert abs(max(vertices[:, 0]) - 1.0) < tol
    assert abs(min(vertices[:, 0]) + 0.0) < tol
    assert abs(max(vertices[:, 1]) - 1.0) < tol
    assert abs(min(vertices[:, 1]) + 0.0) < tol
    assert abs(max(vertices[:, 2]) - 1.0) < tol
    assert abs(min(vertices[:, 2]) + 0.0) < tol

    vol = sum(compute_volumes(vertices, cells['tetra']))
    assert abs(vol - 1.0/6.0) < tol

    return
예제 #6
0
def test_extrude_rotate():
    p = frentos.Polygon2D([[-0.5, -0.3], [0.5, -0.3], [0.0, 0.5]])
    edge_size = 0.1
    domain = frentos.Extrude(
            p,
            [0.0, 0.0, 1.0],
            0.5 * 3.14159265359,
            edge_size
            )
    frentos.generate_mesh(
            domain,
            'out.mesh',
            cell_size=0.1,
            edge_size=edge_size,
            verbose=False
            )

    vertices, cells, _, _, _ = meshio.read('out.mesh')

    tol = 1.0e-3
    assert abs(max(vertices[:, 0]) - 0.583012701892) < tol
    assert abs(min(vertices[:, 0]) + 0.5) < tol
    assert abs(max(vertices[:, 1]) - 0.5) < tol
    assert abs(min(vertices[:, 1]) + 0.583012701892) < tol
    assert abs(max(vertices[:, 2]) - 1.0) < tol
    assert abs(min(vertices[:, 2]) + 0.0) < tol

    vol = sum(compute_volumes(vertices, cells['tetra']))
    assert abs(vol - 0.4) < 0.05

    return
예제 #7
0
def test_cylinder():
    radius = 1.0
    z0 = 0.0
    z1 = 1.0
    edge_length = 0.1
    s0 = frentos.Cylinder(z0, z1, radius, edge_length)
    frentos.generate_mesh(
            s0, 'out.mesh', cell_size=0.1, edge_size=edge_length,
            verbose=False
            )

    vertices, cells, _, _, _ = meshio.read('out.mesh')

    tol = 1.0e-1
    assert abs(max(vertices[:, 0]) - radius) < tol
    assert abs(min(vertices[:, 0]) + radius) < tol
    assert abs(max(vertices[:, 1]) - radius) < tol
    assert abs(min(vertices[:, 1]) + radius) < tol
    assert abs(max(vertices[:, 2]) - z1) < tol
    assert abs(min(vertices[:, 2]) + z0) < tol

    vol = sum(compute_volumes(vertices, cells['tetra']))
    ref_vol = numpy.pi*radius*radius * (z1 - z0)
    assert abs(vol - ref_vol) < tol

    return
예제 #8
0
def test_cone():
    base_radius = 1.0
    height = 2.0
    edge_size = 0.1
    s0 = frentos.Cone(base_radius, height, edge_size)
    frentos.generate_mesh(
            s0, 'out.mesh', cell_size=0.1, edge_size=edge_size,
            verbose=False
            )

    vertices, cells, _, _, _ = meshio.read('out.mesh')

    tol = 2.0e-1
    assert abs(max(vertices[:, 0]) - base_radius) < tol
    assert abs(min(vertices[:, 0]) + base_radius) < tol
    assert abs(max(vertices[:, 1]) - base_radius) < tol
    assert abs(min(vertices[:, 1]) + base_radius) < tol
    assert abs(max(vertices[:, 2]) - height) < tol
    assert abs(min(vertices[:, 2]) + 0.0) < tol

    vol = sum(compute_volumes(vertices, cells['tetra']))
    ref_vol = numpy.pi*base_radius*base_radius / 3.0 * height
    assert abs(vol - ref_vol) < tol

    return
예제 #9
0
def test_cuboids_union():
    c0 = frentos.Cuboid([0, 0, -0.5], [3, 3, 0.5])
    c1 = frentos.Cuboid([1, 1, -2], [2, 2, 2])
    inter = frentos.ListOfDomains()
    inter.append(c0)
    inter.append(c1)
    u = frentos.Union(inter)

    frentos.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
예제 #10
0
def test_ring_extrude():
    p = frentos.Polygon2D([[0.5, -0.3], [1.5, -0.3], [1.0, 0.5]])
    edge_size = 0.1
    domain = frentos.ring_extrude(p, edge_size)
    frentos.generate_mesh(
            domain,
            'out.mesh',
            cell_size=0.1,
            edge_size=edge_size,
            verbose=False
            )

    vertices, cells, _, _, _ = meshio.read('out.mesh')

    tol = 1.0e-3
    assert abs(max(vertices[:, 0]) - 1.5) < tol
    assert abs(min(vertices[:, 0]) + 1.5) < tol
    assert abs(max(vertices[:, 1]) - 1.5) < tol
    assert abs(min(vertices[:, 1]) + 1.5) < tol
    assert abs(max(vertices[:, 2]) - 0.5) < tol
    assert abs(min(vertices[:, 2]) + 0.3) < tol

    vol = sum(compute_volumes(vertices, cells['tetra']))
    assert abs(vol - 2 * numpy.pi * 0.4) < 0.05

    return
예제 #11
0
def test_balls_union():
    radius = 1.0
    displacement = 0.5
    s0 = frentos.Ball([displacement, 0, 0], radius)
    s1 = frentos.Ball([-displacement, 0, 0], radius)
    uni = frentos.ListOfDomains()
    uni.append(s0)
    uni.append(s1)
    u = frentos.Union(uni)

    a = numpy.sqrt(radius**2 - displacement**2)
    edge_size = 0.1
    n = int(2*numpy.pi*a / edge_size)
    circ = [
        [
            0.0,
            a * numpy.cos(i * 2*numpy.pi / n),
            a * numpy.sin(i * 2*numpy.pi / n)
        ] for i in range(n)
        ]
    circ.append(circ[0])

    frentos.generate_mesh(
            u,
            'out.mesh',
            feature_edges=[circ],
            cell_size=0.15,
            edge_size=edge_size,
            verbose=False
            )

    vertices, cells, _, _, _ = meshio.read('out.mesh')

    assert abs(max(vertices[:, 0]) - (radius + displacement)) < 0.02
    assert abs(min(vertices[:, 0]) + (radius + displacement)) < 0.02
    assert abs(max(vertices[:, 1]) - radius) < 0.02
    assert abs(min(vertices[:, 1]) + radius) < 0.02
    assert abs(max(vertices[:, 2]) - radius) < 0.02
    assert abs(min(vertices[:, 2]) + radius) < 0.02

    vol = sum(compute_volumes(vertices, cells['tetra']))
    h = radius - displacement
    ref_vol = 2 * (
        4.0/3.0 * numpy.pi * radius**3
        - h * numpy.pi / 6.0 * (3*a**2 + h**2)
        )

    assert abs(vol - ref_vol) < 0.1

    return
예제 #12
0
def test_balls_difference():
    radius = 1.0
    displacement = 0.5
    s0 = frentos.Ball([displacement, 0, 0], radius)
    s1 = frentos.Ball([-displacement, 0, 0], radius)
    u = frentos.Difference(s0, s1)

    a = numpy.sqrt(radius**2 - displacement**2)
    edge_size = 0.15
    n = int(2*numpy.pi*a / edge_size)
    circ = [
        [
            0.0,
            a * numpy.cos(i * 2*numpy.pi / n),
            a * numpy.sin(i * 2*numpy.pi / n)
        ] for i in range(n)
        ]
    circ.append(circ[0])

    frentos.generate_mesh(
            u,
            'out.mesh',
            feature_edges=[circ],
            cell_size=0.15,
            edge_size=edge_size,
            facet_angle=25,
            facet_size=0.15,
            cell_radius_edge_ratio=2.0,
            verbose=False
            )

    vertices, cells, _, _, _ = meshio.read('out.mesh')

    tol = 0.02
    assert abs(max(vertices[:, 0]) - (radius + displacement)) < tol
    assert abs(min(vertices[:, 0]) - 0.0) < tol
    assert abs(max(vertices[:, 1]) - radius) < tol
    assert abs(min(vertices[:, 1]) + radius) < tol
    assert abs(max(vertices[:, 2]) - radius) < tol
    assert abs(min(vertices[:, 2]) + radius) < tol

    vol = sum(compute_volumes(vertices, cells['tetra']))
    h = radius - displacement
    ref_vol = 4.0/3.0 * numpy.pi * radius**3 \
        - 2 * h * numpy.pi / 6.0 * (3*a**2 + h**2)

    assert abs(vol - ref_vol) < 0.05

    return
예제 #13
0
def test_ball():
    s = frentos.Ball([0, 0, 0], 1.0)
    frentos.generate_mesh(s, 'out.mesh', cell_size=0.2, verbose=False)

    vertices, cells, _, _, _ = meshio.read('out.mesh')

    assert abs(max(vertices[:, 0]) - 1.0) < 0.02
    assert abs(min(vertices[:, 0]) + 1.0) < 0.02
    assert abs(max(vertices[:, 1]) - 1.0) < 0.02
    assert abs(min(vertices[:, 1]) + 1.0) < 0.02
    assert abs(max(vertices[:, 2]) - 1.0) < 0.02
    assert abs(min(vertices[:, 2]) + 1.0) < 0.02

    vol = sum(compute_volumes(vertices, cells['tetra']))
    assert abs(vol - 4.0/3.0 * numpy.pi) < 0.15

    return
예제 #14
0
def test_cuboids_intersection():
    c0 = frentos.Cuboid([0, 0, -0.5], [3, 3, 0.5])
    c1 = frentos.Cuboid([1, 1, -2], [2, 2, 2])
    inter = frentos.ListOfDomains()
    inter.append(c0)
    inter.append(c1)
    u = frentos.Intersection(inter)

    # 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]],
    #         ]

    frentos.generate_mesh(
            u,
            'out.mesh',
            cell_size=0.1,
            edge_size=0.1,
            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]) - 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(compute_volumes(vertices, cells['tetra']))
    assert abs(vol - 1.0) < 0.05

    return
예제 #15
0
def test_rotation():
    s0 = frentos.Rotate(
            frentos.Cuboid([0, 0, 0], [1, 2, 3]),
            [1.0, 0.0, 0.0],
            numpy.pi / 12.0
            )
    frentos.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
예제 #16
0
def test_torus():
    major_radius = 1.0
    minor_radius = 0.5
    s0 = frentos.Torus(major_radius, minor_radius)
    frentos.generate_mesh(s0, 'out.mesh', cell_size=0.1, verbose=False)

    vertices, cells, _, _, _ = meshio.read('out.mesh')

    tol = 1.0e-2
    radii_sum = major_radius + minor_radius
    assert abs(max(vertices[:, 0]) - radii_sum) < tol
    assert abs(min(vertices[:, 0]) + radii_sum) < tol
    assert abs(max(vertices[:, 1]) - radii_sum) < tol
    assert abs(min(vertices[:, 1]) + radii_sum) < tol
    assert abs(max(vertices[:, 2]) - minor_radius) < tol
    assert abs(min(vertices[:, 2]) + minor_radius) < tol

    vol = sum(compute_volumes(vertices, cells['tetra']))
    ref_vol = (numpy.pi * minor_radius * minor_radius) * \
        (2 * numpy.pi * major_radius)
    assert abs(vol - ref_vol) < 1.0e-1

    return
예제 #17
0
def test_custom_function():
    class Hyperboloid(frentos.DomainBase):
        def __init__(self, edge_size):
            super(Hyperboloid, self).__init__()
            self.z0 = -1.0
            self.z1 = 1.0
            self.waist_radius = 0.5
            self.edge_size = edge_size
            return

        def eval(self, x):
            if self.z0 < x[2] and x[2] < self.z1:
                r2 = x[0]**2 + x[1]**2
                return r2 - (x[2]**2 + self.waist_radius)**2
            else:
                return 1.0

        def get_bounding_sphere_squared_radius(self):
            z_max = max(abs(self.z0), abs(self.z1))
            r_max = z_max**2 + self.waist_radius
            return r_max*r_max + z_max*z_max

        def get_features(self):
            radius0 = self.z0**2 + self.waist_radius
            n0 = int(2*numpy.pi*radius0 / self.edge_size)
            circ0 = [[
                    radius0 * numpy.cos((2*numpy.pi * k) / n0),
                    radius0 * numpy.sin((2*numpy.pi * k) / n0),
                    self.z0
                    ] for k in range(n0)
                    ]
            circ0.append(circ0[0])

            radius1 = self.z1**2 + self.waist_radius
            n1 = int(2*numpy.pi*radius1 / self.edge_size)
            circ1 = [[
                    radius1 * numpy.cos((2*numpy.pi * k) / n1),
                    radius1 * numpy.sin((2*numpy.pi * k) / n1),
                    self.z1
                    ] for k in range(n1)
                    ]
            circ1.append(circ1[0])
            return [circ0, circ1]

    edge_size = 0.12
    d = Hyperboloid(edge_size)

    frentos.generate_mesh(
            d,
            'out.mesh',
            cell_size=0.1,
            edge_size=edge_size,
            verbose=False
            )

    vertices, cells, _, _, _ = meshio.read('out.mesh')

    tol = 1.0e-2
    assert abs(max(vertices[:, 0]) - 1.5) < tol
    assert abs(min(vertices[:, 0]) + 1.5) < tol
    assert abs(max(vertices[:, 1]) - 1.5) < tol
    assert abs(min(vertices[:, 1]) + 1.5) < tol
    assert abs(max(vertices[:, 2]) - 1.0) < tol
    assert abs(min(vertices[:, 2]) + 1.0) < tol

    vol = sum(compute_volumes(vertices, cells['tetra']))
    assert abs(vol - 2*numpy.pi * 47.0/60.0) < 0.15

    return