  Algorithmic differentiation (AD) has become increasingly capable and
straightforward to use. However, AD is inefficient when applied directly to
solvers, a feature of most engineering analyses. We can leverage implicit
differentiation to define a general AD rule, making adjoints automatic.
Furthermore, we can leverage the structure of differential equations to
automate unsteady adjoints in a memory efficient way. We also derive a
technique to speed up explicit differential equation solvers, which have no
iterative solver to exploit. All of these techniques are demonstrated on
problems of various sizes, showing order of magnitude speed-ups with minimal
code changes. Thus, we can enable users to easily compute accurate derivatives
across complex analyses with internal solvers, or in other words, automate
adjoints using a combination of AD and implicit differentiation.
