Hybrid approaches to adjoint code generation with dco/c++

  • Hybride Verfahren zur Generierung adjungierter Programme mithilfe von dco/c++

Lotz, Johannes; Naumann, Uwe (Thesis advisor); Gauger, Nicolas Ralph (Thesis advisor)

Aachen (2016)
Dissertation / PhD Thesis

Dissertation, RWTH Aachen University, 2016


This dissertation is concerned with the computation of arbitrary-order derivative projections (tangents and adjoints) of numerical simulation programs written in C++. Thanks to the increasing computational power, simulation nowadays plays a fundamental role within a wide range of applications. On this basis, in the last decades simulation programs became the foundation for optimization problems in a wide variety of domains, e.g. design optimization in computational fluid dynamics. When using derivative-based algorithms to carry out the optimization, first- and higher-order sensitivities of the underlying simulation program are required. Since in many cases gradients of scalar objective functions need to be computed, the adjoint method should be used. Adjoint programs can either be written by hand or generated by Algorithmic (or Automatic) Differentiation (AD) tools. AD is a semantic program transformation exploiting the chain rule of differential calculus to automatically generate programs such that sensitivities are computed in addition to the original function values. Writing adjoint programs by hand can be a tedious, time-consuming, and error-prone task, but on the other hand, the well-versed programmer can possibly write much more efficient code, especially when exploiting mathematical properties by symbolic transformations. When hand-coding an adjoint simulation program, an incremental software development process is difficult. To achieve an effective development process and get an efficient program, hybridization techniques can be used to couple an AD tool with hand-written code. This makes a top-down adjoint code development possible -- beginning with a pure AD solution, going step by step to a more efficient implementation.This thesis consists of three main points. First, the software dco/c++ is presented. dco/c++ implements AD by overloading in C++ and features hybridization techniques in a flexible and efficient way. Flexibility is meant in terms of compliance with a modern C++ environment (e.g. generic concepts, exception-safety, thread-safety, or portability), and in terms of a convenient interface with emphasis on the support for arbitrary-order derivatives. Efficiency on the other hand is ensured by the newly developed AD test suite, which carries out performance tests also in comparison to other AD tools.As the second main point, arbitrary-order derivative projections of common numerical algorithms like linear and nonlinear solvers are derived symbolically, exploiting mathematical properties. Those results are shown to be of practical relevance by connecting them to the hybridization capabilities of dco/c++. This combination is presented with the help of an extensive case study demonstrating the effectiveness of the approach. In addition, dco/c++ was successfully used in many projects and its applicability is therefore shown in terms of "reference projects".When using AD to generate an adjoint program, the resulting executable typically requires a huge amount of memory. The third point of this thesis therefore covers the Call Tree Reversal (CTR) problem. CTR is a checkpointing technique, which allows for a tradeoff between additional runtime and memory requirements. The problem itself is an NP-complete optimization problem, which in this thesis is approached by a mixed integer programming formulation for the first time.