|Abstract||Scientic applications are usually written in a single language such as C, C++, or a avor of Fortran. Various algorithmic dierentiation (AD) tools exist to dierentiate these applications by using source transformation [1, 2, 3, 4] or operator-overloading [5, 6]. The language that an application is written in often dictates the approach and tool to be used for dierentiation. Additionally, performance considerations, tool philosophy (recomputation vs. storage), and specic tool capabilities such as support for sparse Jacobians or xed-point iterations may play a role in the tool
that is ultimately used to dierentiate an application.
Operator overloading and source transformation have their own strengths and weaknesses. The most important feature of operator-overloading-based AD tools is that they can be used in software regardless of its design complexity. Many large simulation tools (e.g., ISSM , SU2 [8, 9]) have been successfully dierentiated in this manner. One drawback, however, is the large amount of memory required to store the tool-specic internal representation of the computation in order to run it in the reverse mode. The execution speed also suers because of low compiler optimization potential. Both problems do not occur in source transformation tools. However, such tools cannot handle runtime features of C++ such as object inheritance, polymorphism, and templating.