  This paper accompanies first release of libmpdata++, a C++ library
implementing the Multidimensional Positive-Definite Advection Transport
Algorithm (MPDATA). The library offers basic numerical solvers for systems of
generalised transport equations. The solvers are forward-in-time, conservative
and non-linearly stable. The libmpdata++ library covers the basic
second-order-accurate formulation of MPDATA, its third-order variant, the
infinite-gauge option for variable-sign fields and a flux-corrected transport
extension to guarantee non-oscillatory solutions. The library is equipped with
a non-symmetric variational elliptic solver for implicit evaluation of pressure
gradient terms. All solvers offer parallelisation through domain decomposition
using shared-memory parallelisation.
  The paper describes the library programming interface, and serves as a user
guide. Supported options are illustrated with benchmarks discussed in the
MPDATA literature. Benchmark descriptions include code snippets as well as
quantitative representations of simulation results. Examples of applications
include: homogeneous transport in one, two and three dimensions in Cartesian
and spherical domains; shallow-water system compared with analytical solution
(originally derived for a 2D case); and a buoyant convection problem in an
incompressible Boussinesq fluid with interfacial instability. All the examples
are implemented out of the library tree. Regardless of the differences in the
problem dimensionality, right-hand-side terms, boundary conditions and
parallelisation approach, all the examples use the same unmodified library,
which is a key goal of libmpdata++ design. The libmpdata++ library is
implemented in C++, making use of the Blitz++ multi-dimensioanl array
containers, and is released as free/libre and open-source software.
