|Authors||S. Mitusch and S. W. Funke|
|Title||A new algorithmic differentiation tool (not only) for FEniCS|
|Project(s)||OptCutCell: Simulation-based optimisation with dynamic domains, Center for Biomedical Computing (SFF)|
|Year of Publication||2017|
|Place Published||FEniCS 2017 conference, Luxembourg|
The derivation and implementation of adjoint models for time-dependent, non-linear PDEs is a challenging task. A common strategy is to an apply algorithmic differentiation tool (AD) which (semi- )automatically derives the adjoint model from the forward model. Specifically for finite-element models,  proposed a high-level AD approach, which derives the adjoint by analysing and exploiting the high- level mathematical structure inherent in finite element methods. This idea has shown to provide major benefits compared to traditional low-level AD tools, including near to theoretically optimal performance and natural support of parallelism. However, the high-level AD tool for FEniCS, dolfin-adjoint, lacks important features such as differentiation with respect to Dirichlet boundary conditions and higher-order derivatives. To overcome these limitations, we propose a new algorithmic differentiation tool for FEniCS. The core of this tool is formed by pyadjoint, a generic operator overloading AD tool written in Python. pyadjoint considers the model as a sequence of arbitrary operations with inputs and outputs. This abstraction can be seen as a generalisation of low and high-level AD tools: operations can be individual floating point operations (as for traditional AD tools), entire systems of differential equations (as for high-level AD tools), or a mix of both. The adjoint developer must overload each relevant model function according to the pyadjoint API, and in particular provide implementations for their derivatives. With this information pyadjoint records a tape of model operations at runtime and automatically derives and executes the associated adjoint model. Specifically, the support for adjoint FEniCS model is achieved by overloading of the FEniCS API, in particular the creating of new objects such as Functions, Constants, and overloading operators such as assemble, project and solve.
Winner of the FEniCS 2017 Best Poster Competition