When it comes to building a general, efficient, surface process code, there are a couple of significant challenges that stand in our way. One is to address the interesting operators that appear in the mathematical formulation that are not commonly encountered in computational mechanics. The other is to cater for the many different formulations that have been put forward in the literature as no single, universal set of equations has been agreed upon by the community.Computational Approach
We view Quagmire as a community toolbox and acknowledge that this means there is no one best way to formulate any of the landscape evolution models. We instead provide a collection of useful operators and examples of how to assemble various kinds of models. We do assume that:
- the surface is a single-valued height field described by the coordinates on a two-dimensional plane
- the vertical evolution can be described by the time-derivative of the height field
- the horizontal evolution can be described by an externally imposed velocity field
- the formulation can be expressed through (non-linear) operators on the two dimensional plane
- any sub-grid parameterisation (e.g. of stream bed geometry) is expressible at the grid scale
- a parallel algorithm is desirable
We don't make any assumptions about:
- the nature of the mesh: triangulation or a regular array of 'pixels'
- the parallel decomposition (except that it is assumed to be general)
- the specific erosion / deposition / transport model
Quagmire is a collection of python objects that represent parallel vector and matrix operations on meshes and provide a number of useful surface-process operators in matrix-vector form. The implementation is through PETSc, numpy, and scipy. Quagmire is open source and a work in progress.Mathematical Approach
Matrix-vector multiplication is the duct tape of computational science: fast, versatile, ubiquitous. Any problem that can be formulated in terms of basic linear algebra operations can usually be rendered into an abstract form that opens up multiple avenues to solve the resulting matrix equations and it is often possible to make extensive use of existing fast, parallel software libraries. Quagmire provides parallel, matrix-based operators on regular Cartesian grid and unstructured triangulations for local operations such as gradient evaluation, diffusion, smoothing but also for non-local, graph-based operations that include catchment identification, upstream summation, and flood-filling.
The advantage of the formulation is in the degree of abstraction that is introduced, separating the details of the discrete implementation from the solution phase. The matrix-based approach also makes it trivial to introduce concepts such as multiple-pathways in graph traversal / summation operations without altering the structure of the solution phase in any way. Although we have not yet done so, there are obvious future possibilities in developing implicit, non-linear solvers to further improve computational performance and to place the model equations in an inverse modelling framework.