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

Project a function in ten lines

Build a mesh, project a smooth function onto the lowest-order space and read the value at a point.

Use your own mesh, and see what bad input does

Pass vertex and tetrahedron arrays from Gmsh, TetGen or your own code, check them, and find the cell that contains a point.

Read a mesh from Gmsh

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.

The four form degrees

A potential, an edge field, a flux and a density: what each one projects to and where it lives.

A field that is infinite at a vertex

The canonical interpolation refuses it; the stable operator integrates against a weight and stays finite. This is what the bounded operators are for.

Check that the projection commutes with the derivative

The gradient of the projection is the projection of the gradient, so curl-free fields stay curl-free. Two ways to see it.

Keep the values on the boundary

Which operators reproduce boundary values exactly, and which trade that for needing less of the input.

Refine where it matters

Bisect the cells around a feature, keep the mesh conforming, and watch the error near the feature fall.

Time-dependent data

Locate the evaluation points once, then project each new time step cheaply.

Use all the cores

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.

Higher polynomial degree

Canonical interpolation of any degree, the locally bounded higher-order projection, and the trace-preserving operator above the lowest order.

Start here

Reference

Theory and evidence

Contribute