What is the difference between dolfin-adjoint/pyadjoint and dolfin-adjoint/libadjoint?


This is the original implementation of dolfin-adjoint and uses the C library libadjoint as underlying differentiation tool.

This implementation is not longer under development. The last release was version 2017.2.0. The documentation can still be accessed here.

Existing software projects that already use dolfin-adjoint/libadjoint are encouraged to eventually update their code to dolfin-adjoint/pyadjoint. Since the new implementations is mostly API compatible, the required changes should be relatively small.


This is a full rewrite of dolfin-adjoint based on the Python algorithmic differentiation tool pyadjoint (see this poster).

This version is actively maintained, hence new projects are advised to use this version.

Compared to the old code, this implementation is superiour in some features, for instance it has full Hessian support, a more generic way of defining functionals and support for Dirichlet BC controls.

If you would like to know if a specific FEniCs feature is already implemented in dolfin-adjoint/pyadjoint, consult this list.

If you would like to contribute, please contact us.