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.