TetMesh Geodesics

[1]:
import numpy as np

# import plotly
# plotly.offline.init_notebook_mode(connected=True)
import plotly.io as pio

from lapy import TetMesh
from lapy.plot import plot_tet_mesh

pio.renderers.default = "sphinx_gallery"

First we need a TetMesh, so lets open a cube with 48K tetrahedra and make sure it is oriented consistently.

[2]:
T = TetMesh.read_vtk("../data/cubeTetra.vtk")
# T.is_oriented()
T.orient_()
--> VTK format         ...
 --> DONE ( V: 9261 , T: 48000 )

Flipped 24000 tetrahedra
[2]:
np.int64(24000)

Laplace

Next we solve the Laplace eigenvalue problem to get 10 eigenvalues and -vectors/functions.

[3]:
from lapy import Solver

fem = Solver(T, lump=True)

evals, evec = fem.eigs(10)
TetMesh with regular Laplace
Solver: spsolve (LU decomposition) ...

To better see the first non-constant function also in the interior we slice the cube at x<0.5.

[4]:
# also get A,B (lumped), and inverse of B (easy as it is diagonal)
A, B = fem.stiffness, fem.mass
Bi = B.copy()
Bi.data **= -1
[5]:
evnum = 1
cutting = ["x<0.5"]
# also here we comment all plots to reduce file size
# uncomment and take a look
plot_tet_mesh(
    T,
    vfunc=evals[evnum] * evec[:, evnum],
    plot_edges=None,
    plot_levels=False,
    cutting=cutting,
    edge_color="rgb(50,50,50)",
    html_output=False,
    flatshading=True,
)
Mesh is oriented, nothing to do
Found 3040 triangles on boundary.

Similar to the triangle case, computing the - divergence of the gradient of an eigenfunctions (and multiplying with inv(B)) yields a scaled version of that function.

[6]:
from lapy.diffgeo import compute_divergence, compute_gradient

grad = compute_gradient(T, evec[:, evnum])
divx = -compute_divergence(T, grad)
vfunc = Bi * divx
[7]:
cutting = ["x<0.5"]
plot_tet_mesh(
    T,
    vfunc=vfunc,
    plot_edges=None,
    plot_levels=False,
    cutting=cutting,
    edge_color="rgb(50,50,50)",
    html_output=False,
    flatshading=True,
)
Mesh is oriented, nothing to do
Found 3040 triangles on boundary.