Welcome to modepy’s documentation!¶
modepy helps you create well-behaved high-order
discretizations on simplices (i.e. triangles and tetrahedra).
These are a key building block for high-order unstructured
discretizations, as often used in a finite element context.
It closely follows the approach taken in the book
Hesthaven, Jan S., and Tim Warburton. “Nodal Discontinuous Galerkin Methods: Algorithms, Analysis, and Applications”. 1st ed. Springer, 2007. Book web page
The basic objects that
modepy manipulates are functions on a simplex.
For example, it supplies an orthonormal basis on triangles (shown here) and tetrahedra.
Here’s an idea of code that uses
import numpy as np import modepy as mp n = 17 # use this total degree dimensions = 2 # Get a basis of orthonormal functions, and their derivatives. basis = mp.simplex_onb(dimensions, n) grad_basis = mp.grad_simplex_onb(dimensions, n) nodes = mp.warp_and_blend_nodes(dimensions, n) x, y = nodes # We want to compute the x derivative of this function: f = np.sin(5*x+y) df_dx = 5*np.cos(5*x+y) # The (generalized) Vandermonde matrix transforms coefficients into # nodal values. So we can find basis coefficients by applying its # inverse: f_coefficients = np.linalg.solve( mp.vandermonde(basis, nodes), f) # Now linearly combine the (x-)derivatives of the basis using # f_coefficients to compute the numerical derivatives. df_dx_num = np.dot( mp.vandermonde(grad_basis, nodes), f_coefficients) assert np.linalg.norm(df_dx - df_dx_num) < 1e-5
- Modes (Basis functions)
- Interpolation Nodes
- User-visible Changes
- Frequently Asked Questions