Skip to content

API of module geo

layersfromsurf(surfmesh, thickness)

Use a topographic surface to create a 3D terrain-following mesh.

Parameters

surfmesh : Pyvista.UnstructuredGrid with 2D-Elements Surface mesh. thickness : List of float thickness of layers in z-direction.

Returns

mesh : Pyvista.UnstructuredGrid with 3D-Elements Extruded surface mesh.

Source code in voromesh/geo/__init__.py
 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
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
def layersfromsurf(surfmesh, thickness):
    """
    Use a topographic surface to create a 3D terrain-following mesh.

    Parameters
    ----------
    surfmesh : Pyvista.UnstructuredGrid with 2D-Elements
        Surface mesh.
    thickness : List of float
        thickness of layers in z-direction.

    Returns
    -------
    mesh : Pyvista.UnstructuredGrid with 3D-Elements
        Extruded surface mesh.

    """

    surfmesh = surfmesh.compute_cell_sizes(length=False,
                                           area=True,
                                           volume=False)
    area = surfmesh["Area"]
    volume = list()

    # Typ des Geometry bzws. des Prismas
    ctype = {3: vtk.VTK_WEDGE,
             4: vtk.VTK_HEXAHEDRON,
             5: vtk.VTK_PENTAGONAL_PRISM,
             6: vtk.VTK_HEXAGONAL_PRISM,
             7: vtk.VTK_CONVEX_POINT_SET}

    nlayer = np.size(thickness)
    points = np.tile(surfmesh.points, (nlayer+1, 1))
    nc = surfmesh.number_of_points

    # Für jede Schicht werden z-Koordinaten festgelegt.
    for i in range(nlayer):
        points[((i+1)*nc):(i+2)*nc, 2] = (points[i*nc:((i+1)*nc), 2]
                                          + thickness[i])

    cells = list()
    celltypes = list()
    layer = list()

    ind = 0
    for i in range(surfmesh.number_of_cells):
        npoints = surfmesh.cells[ind]
        edges = surfmesh.cells[ind+1:ind+1+npoints]

        ind = ind + 1 + npoints

        for j in range(nlayer):
            celltypes.append(ctype.setdefault(npoints,
                                              vtk.VTK_CONVEX_POINT_SET))

            cells.append(2*npoints)         # number of points
            cells.extend(edges+j*nc)        # lower side
            cells.extend(edges+(j+1)*nc)    # upper side

            volume.append(area[i]*thickness[j])
            layer.append(j)

    mesh = pv.UnstructuredGrid(cells,
                               np.array(celltypes),
                               points)

    mesh["Volume"] = volume
    mesh["Layer"] = layer

    return mesh

update_z_from_surf(mesh, surf)

Maps elevation data from surf to mesh.

Parameters

mesh : pyvista.UnstructuredGrid (Surface) Mesh without elevation data. surf : pyvista.UnstructuredGrid Surface mesh with elevation data.

Returns

mesh : pyvista.UnstructuredGrid (Surface) Mesh with elevation data from surf

Source code in voromesh/geo/__init__.py
 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
def update_z_from_surf(mesh, surf):
    """
    Maps elevation data from surf to mesh.

    Parameters
    ----------
    mesh : pyvista.UnstructuredGrid
        (Surface) Mesh without elevation data.
    surf : pyvista.UnstructuredGrid
        Surface mesh with elevation data.

    Returns
    -------
    mesh : pyvista.UnstructuredGrid
        (Surface) Mesh with elevation data from surf

    """

    z = surf.points[:, 2].copy()
    surf["z"] = z
    surf.points[:, 2] = 0

    mesh = mesh.sample(surf)
    mesh.points[:, 2] = mesh["z"]

    surf.points[:, 2] = z
    return mesh