Visualization

Triangle Mesh

[1]:
import plotly.io as pio

from lapy import Solver, TetMesh, TriaMesh, io, plot

pio.renderers.default = "sphinx_gallery"

This tutorial will show you some of our visualization functionality. For that we load a larger mesh of the cube and compute the first three eigenvalues and eigenvectors. We also show how to save the eigenfunctions to disk.

[2]:
tria = TriaMesh.read_vtk("../data/cubeTria.vtk")
fem = Solver(tria)
evals, evecs = fem.eigs(k=3)
evDict = dict()
evDict["Refine"] = 0
evDict["Degree"] = 1
evDict["Dimension"] = 2
evDict["Elements"] = len(tria.t)
evDict["DoF"] = len(tria.v)
evDict["NumEW"] = 3
evDict["Eigenvalues"] = evals
evDict["Eigenvectors"] = evecs
io.write_ev("../data/cubeTria.ev", evDict)
TriaMesh with regular Laplace-Beltrami
Solver: spsolve (LU decomposition) ...

Let’s look at the result by visualizing the first non-constant eigenfunction on top of the cube mesh. You can see that the extrema localize in two diametrically opposed corners.

[3]:
plot.plot_tria_mesh(
    tria,
    vfunc=evecs[:, 1],
    xrange=None,
    yrange=None,
    zrange=None,
    showcaxis=False,
    caxis=None,
)

We can also adjust the axes and add a color scale.

[4]:
plot.plot_tria_mesh(
    tria,
    vfunc=evecs[:, 1],
    xrange=[-2, 2],
    yrange=[-2, 2],
    zrange=[-2, 2],
    showcaxis=True,
    caxis=[-0.3, 0.5],
)

Tetrahedral Mesh

Next we load a tetrahedral mesh and again compute the first 3 eigenvectors.

[5]:
tetra = TetMesh.read_vtk("../data/cubeTetra.vtk")
fem = Solver(tetra)
evals, evecs = fem.eigs(k=3)
evDict = dict()
evDict["Refine"] = 0
evDict["Degree"] = 1
evDict["Dimension"] = 2
evDict["Elements"] = len(tetra.t)
evDict["DoF"] = len(tetra.v)
evDict["NumEW"] = 3
evDict["Eigenvalues"] = evals
evDict["Eigenvectors"] = evecs
io.write_ev("../data/cubeTetra.ev", evDict)
--> VTK format         ...
 --> DONE ( V: 9261 , T: 48000 )

TetMesh with regular Laplace
Solver: spsolve (LU decomposition) ...

The eigenvector defines a function on all vertices, also inside the cube. Here we can see it as a color overlay on the boundary.

[6]:
plot.plot_tet_mesh(
    tetra,
    vfunc=evecs[:, 1],
    xrange=None,
    yrange=None,
    zrange=None,
    showcaxis=False,
    caxis=None,
)
Flipped 24000 tetrahedra
Found 4800 triangles on boundary.

The plot function allows cutting the solid object open (here we keep every vertex where the function is larger than 0).

[7]:
plot.plot_tet_mesh(
    tetra,
    cutting=("f>0"),
    vfunc=evecs[:, 1],
    xrange=[-2, 2],
    yrange=[-2, 2],
    zrange=[-2, 2],
    showcaxis=True,
    caxis=[-0.3, 0.5],
)
Flipped 11448 tetrahedra
Found 3120 triangles on boundary.