Documentation
Everything is on this site. Start with Getting started to project your first field, then read how to choose an operator, what each one guarantees, and the evidence behind those guarantees.
Recipes
Build a mesh, project a smooth function onto the lowest-order space and read the value at a point.
Pass vertex and tetrahedron arrays from Gmsh, TetGen or your own code, check them, and find the cell that contains a point.
Load a .msh file (ASCII, format 2.2 or 4.1, first-order tetrahedra) with parseGmsh and use it like any other mesh. What cannot be used is an error that says why.
A potential, an edge field, a flux and a density: what each one projects to and where it lives.
The canonical interpolation refuses it; the stable operator integrates against a weight and stays finite. This is what the bounded operators are for.
The gradient of the projection is the projection of the gradient, so curl-free fields stay curl-free. Two ways to see it.
Which operators reproduce boundary values exactly, and which trade that for needing less of the input.
Bisect the cells around a feature, keep the mesh conforming, and watch the error near the feature fall.
Locate the evaluation points once, then project each new time step cheaply.
Project one field at many points on worker threads, or compute the coefficients of a bounded operator on a pool. The result is bitwise the same as on one thread.
Canonical interpolation of any degree, the locally bounded higher-order projection, and the trace-preserving operator above the lowest order.