Team Ecuador studies Algorithmic Differentiation (AD) of computer programs, blending :

**AD theory:** We study software engineering techniques, to
analyze and transform programs mechanically. Algorithmic Differentiation (AD)
transforms a program `P` that computes a function `P'`
that computes analytical derivatives of *adjoint mode* of AD,
a sophisticated transformation that yields gradients for optimization at a remarkably low cost.

**AD application to Scientific Computing:**
We adapt the strategies of Scientific Computing
to take full advantage of AD.
We validate our work on real-size applications.

We want to produce AD code that can compete with hand-written sensitivity and adjoint programs used in the industry. We implement our algorithms into the tool Tapenade, one of the most popular AD tools now.

Our research directions :

Efficient adjoint AD of frequent dialects e.g. Fixed-Point loops.

Development of the adjoint AD model towards Dynamic Memory Management.

Evolution of the adjoint AD model to keep in pace with with modern programming languages constructs.

Optimal shape design and optimal control for steady and unsteady simulations. Higher-order derivatives for uncertainty quantification.

Adjoint-driven mesh adaptation.

(AD, aka Automatic Differentiation) Transformation of a program, that returns a new program that computes derivatives of the initial program, i.e. some combination of the partial derivatives of the program's outputs with respect to its inputs.

Mathematical manipulation of the Partial Differential Equations that define a problem, obtaining new differential equations that define the gradient of the original problem's solution.

General trade-off technique, used in adjoint AD, that trades duplicate execution of a part of the program to save some memory space that was used to save intermediate results.

Algorithmic Differentiation (AD) differentiates
*programs*. The input of AD is
a source program

Any execution of

where each

which can be mechanically written as a sequence of instructions

The above computation of

**Sensitivities**, defined for a given direction

This expression is easily computed from right to left, interleaved with the original
program instructions. This is the *tangent mode* of AD.

**Adjoints**, defined after transposition (

This expression is most efficiently computed from right to left,
because matrix*adjoint mode* of AD, most effective for
optimization, data assimilation ,
adjoint problems , or inverse problems.

Adjoint AD builds a very efficient program Section 3.3,
which computes the gradient in a time independent from the number of parameters *tangent mode*
would require running the tangent differentiated program

However, the *inverse* of their computation order. If the
original program *overwrites* a part of

Another research issue is to make the AD model cope with the constant evolution of modern language constructs. From the old days of Fortran77, novelties include pointers and dynamic allocation, modularity, structured data types, objects, vectorial notation and parallel programming. We keep developing our models and tools to handle these new constructs.

Tree representation of a computer program, that keeps only the semantically significant information and abstracts away syntactic sugar such as indentation, parentheses, or separators.

Representation of a procedure body as a directed graph, whose nodes, known as basic blocks, each contain a sequence of instructions and whose arrows represent all possible control jumps that can occur at run-time.

Model that describes program static analysis
as a special sort of execution, in which all branches of control switches are taken
concurrently, and where computed values are replaced by abstract values
from a given *semantic domain*. Each particular analysis gives birth to
a specific semantic domain.

Program analysis that studies how a given property of variables evolves with execution of the program. Data Flow analysis is static, therefore studying all possible run-time behaviors and making conservative approximations. A typical data-flow analysis is to detect, at any location in the source program, whether a variable is initialized or not.

The most obvious example of a program transformation tool is certainly a compiler. Other examples are program translators, that go from one language or formalism to another, or optimizers, that transform a program to make it run better. AD is just one such transformation. These tools share the technological basis that lets them implement the sophisticated analyses required. In particular there are common mathematical models to specify these analyses and analyze their properties.

An important principle is *abstraction*: the core of a compiler
should not bother about syntactic details of the compiled program.
The optimization and code generation phases must be independent
from the particular input programming language. This is generally achieved
using language-specific *front-ends*, language-independent *middle-ends*,
and target-specific *back-ends*.
In the middle-end, analysis can concentrate on the semantics
of a reduced set of constructs. This analysis operates
on an abstract representation of programs made of one
*call graph*, whose nodes are themselves *flow graphs* whose
nodes (*basic blocks*) contain abstract *syntax trees* for the individual
atomic instructions.
To each level are attached symbol tables, nested to capture scoping.

Static program analysis can be defined on this internal representation,
which is largely language independent. The simplest analyses on trees can be
specified with inference rules , , .
But many *data-flow analyses* are more complex, and better defined on graphs than on trees.
Since both call graphs and flow graphs may be cyclic, these global analyses will be solved iteratively.
*Abstract Interpretation* is a theoretical framework to
study complexity and termination of these analyses.

Data flow analyses must be carefully designed to avoid or control
combinatorial explosion. At the call graph level, they can run bottom-up or top-down,
and they yield more accurate results when they take into account the different
call sites of each procedure, which is called *context sensitivity*.
At the flow graph level, they can run forwards or backwards, and
yield more accurate results when they take into account only the possible
execution flows resulting from possible control, which is called *flow sensitivity*.

Even then, data flow analyses are limited, because they are static and thus have very
little knowledge of actual run-time values. Far before reaching the very theoretical limit of
*undecidability*, one reaches practical limitations to how much information one can infer
from programs that use arrays , or pointers.
Therefore, conservative *over-approximations* must be made, leading to
derivative code less efficient than ideal.

In Scientific Computing, the mathematical model often consists of Partial Differential Equations, that are discretized and then solved by a computer program. Linearization of these equations, or alternatively linearization of the computer program, predict the behavior of the model when small perturbations are applied. This is useful when the perturbations are effectively small, as in acoustics, or when one wants the sensitivity of the system with respect to one parameter, as in optimization.

Consider a system of Partial Differential Equations
that define some characteristics of a system with respect to some
parameters. Consider one particular scalar characteristic.
Its sensitivity (or gradient) with respect to the parameters
can be defined by means of *adjoint* equations, deduced from the
original equations through linearization and transposition.
The solution of the adjoint equations is known as the adjoint state.

Scientific Computing provides reliable simulations
of complex systems. For example it is possible to *simulate*
the steady or unsteady 3D air flow around a plane that captures the physical phenomena
of shocks and turbulence. Next comes *optimization*,
one degree higher in complexity because it repeatedly simulates and
applies gradient-based optimization steps until an optimum is reached.
The next sophistication is *robustness*, that detects undesirable solutions which,
although maybe optimal, are very sensitive to uncertainty on design parameters or
on manufacturing tolerances. This makes second derivative come into play.
Similarly *Uncertainty Quantification* can use second derivatives to evaluate how uncertainty on
the simulation inputs imply uncertainty on its outputs.

We investigate several approaches to obtain the gradient, between two extremes:

One can write an *adjoint system* of mathematical equations,
then discretize it and program it by hand. This is time consuming.
Although this looks mathematically sound , this does not provide
the gradient of the discretized function itself, thus
degrading the final convergence of gradient-descent optimization.

One can apply adjoint AD (*cf* )
on the program that discretizes and solves the direct system.
This gives exactly the adjoint of the discrete function
computed by the program. Theoretical results guarantee convergence
of these derivatives when the direct program converges.
This approach is highly mechanizable, but leads to massive use of storage
and may require code transformation by hand , to reduce memory
usage.

If for instance the model is steady, or when the computation uses a Fixed-Point iteration, tradeoffs exist between these two extremes , that combine low storage consumption with possible automated adjoint generation. We advocate incorporating them into the AD model and into the AD tools.

Algorithmic Differentiation of programs gives sensitivities or gradients, useful for instance for :

optimum shape design under constraints, multidisciplinary optimization, and more generally any algorithm based on local linearization,

inverse problems, such as parameter estimation and in particular 4Dvar data assimilation in climate sciences (meteorology, oceanography),

first-order linearization of complex systems, or higher-order simulations, yielding reduced models for simulation of complex systems around a given state,

adaption of parameters for classification tools such as Machine Learning systems,
in which Adjoint Differentiation is also known as *backpropagation*.

mesh adaptation and mesh optimization with gradients or adjoints,

equation solving with the Newton method,

sensitivity analysis, propagation of truncation errors.

A CFD program computes the flow around a shape, starting from a number of inputs that define the shape and other parameters. On this flow one can define optimization criteria e.g. the lift of an aircraft. To optimize a criterion by a gradient descent, one needs the gradient of the criterion with respect to all inputs, and possibly additional gradients when there are constraints. Adjoint AD is the most efficient way to compute these gradients.

Inverse problems aim at estimating the value of hidden parameters from other measurable values, that depend on the hidden parameters through a system of equations. For example, the hidden parameter might be the shape of the ocean floor, and the measurable values of the altitude and velocities of the surface. Figure shows an example of an inverse problem using the glaciology code ALIF (a pure C version of ISSM ) and its AD-adjoint produced by Tapenade.

One particular case of inverse problems is *data assimilation*
in weather forecasting or in oceanography.
The quality of the initial state of the simulation conditions the quality of the
prediction. But this initial state is not well known. Only some
measurements at arbitrary places and times are available.
A good initial state is found by solving a least squares problem
between the measurements and a guessed initial state which itself must verify the
equations of meteorology. This boils down to solving an adjoint problem,
which can be done though AD .
The special case of *4Dvar* data assimilation is particularly challenging.
The 4^{th} dimension in “4D” is time, as available measurements are distributed
over a given assimilation period. Therefore the least squares mechanism must be
applied to a simulation over time that follows the time evolution model.
This process gives a much better estimation of the initial state, because
both position and time of measurements are taken into account.
On the other hand, the adjoint problem involved is more complex,
because it must run (backwards) over many time steps.
This demanding application of AD justifies our efforts in
reducing the runtime and memory costs of AD adjoint codes.

Simulating a complex system often requires solving a system of Partial Differential Equations.
This can be too expensive, in particular for real-time simulations.
When one wants to simulate the reaction of this complex system to small perturbations around a fixed
set of parameters, there is an efficient approximation: just suppose that the system
is linear in a small neighborhood of the current set of parameters. The reaction of the system
is thus approximated by a simple product of the variation of the parameters with the
Jacobian matrix of the system. This Jacobian matrix can be obtained by AD.
This is especially cheap when the Jacobian matrix is sparse.
The simulation can be improved further by introducing higher-order derivatives, such as Taylor
expansions, which can also be computed through AD.
The result is often called a *reduced model*.

Some approximation errors can be expressed by an adjoint state. Mesh adaptation can benefit from this. The classical optimization step can give an optimization direction not only for the control parameters, but also for the approximation parameters, and in particular the mesh geometry. The ultimate goal is to obtain optimal control parameters up to a precision prescribed in advance.

Keywords: Computational Fluid Dynamics - Turbulence

Functional Description: Aironum is an experimental software that solves the unsteady compressible Navier-Stokes equations with k-epsilon, LES-VMS and hybrid turbulence modelling on parallel platforms, using MPI. The mesh model is unstructured tetrahedrization, with possible mesh motion.

Participant: Alain Dervieux

Contact: Alain Dervieux

Keywords: Static analysis - Optimization - Compilation - Gradients

Scientific Description: Tapenade implements the results of our research about models and static analyses for AD. Tapenade can be downloaded and installed on most architectures. Alternatively, it can be used as a web server. Higher-order derivatives can be obtained through repeated application.

Tapenade performs sophisticated data-flow analysis, flow-sensitive and context-sensitive, on the complete source program to produce an efficient differentiated code. Analyses include Type-Checking, Read-Write analysis, and Pointer analysis. AD-specific analyses include:

Activity analysis: Detects variables whose derivative is either null or useless, to reduce the number of derivative instructions.

Adjoint Liveness analysis: Detects the source statements that are dead code for the computation of derivatives.

TBR analysis: In adjoint-mode AD, reduces the set of source variables that need to be recovered.

Functional Description: Tapenade is an Algorithmic Differentiation tool that transforms an original program into a new program that computes derivatives of the original program. Algorithmic Differentiation produces analytical derivatives, that are exact up to machine precision. Adjoint-mode AD can compute gradients at a cost which is independent from the number of input variables. Tapenade accepts source programs written in Fortran77, Fortran90, or C. It provides differentiation in the following modes: tangent, vector tangent, adjoint, and vector adjoint.

News Of The Year: - Continued development of multi-language capacity: AD of codes mixing Fortran and C - Continued front-end for C++ based on Clang - Experimental support for building Abs-Normal Form tangent of non-smooth codes

Participants: Laurent Hascoët and Valérie Pascual

Contact: Laurent Hascoët

We made progress towards the extension of Tapenade for C++. Last year, an external parser for C++ was built
on top of Clang-LLVM https://

As a result, Tapenade is now able to input its first C++ files and is able to output them, but without transformation. Although not advertised nor documented, the functionality is present in the latest release 3.14. Data-Flow analysis and code transformation (e.g. AD) will not be possible until we have a correct IR about variables and their memory locations. This work is going on.

This work benefited from the expertise in C++ of Frederic Cazals (Inria ABS team).
The ABS team provided a large test application code (SBL, https://

Last year Tapenade was extended to differentiate codes that mix different languages, beginning with the tangent mode of AD. Our motivating application here is Calculix, a 3-D Structural Finite Element code that mixes Fortran and C. This year, we continued development towards Adjoint Differentiation. Although more complete testing is needed, we now have a first correct adjoint of Calculix.

Tapenade can now routinely differentiate Fortran+C codes, and accepts and takes advantage of the interoperability directives provided by the Fortran 2003 standard. It can handle not only procedure parameters correspondence, but also interoperability between C `struct` and Fortran `COMMON` blocks. Laurent Hascoët presented the advancement of this work at the ISMP 2018 congress in Bordeaux https://

C files (aka “translation units”) and Fortran modules are two instances of the more general notion of “package” for which we are looking for a unified representation in Tapenade. It appears that this common representation could also handle C++ namespaces.

Algorithmic Differentiation can be used to derive tangent models that cope with a certain class of non-smoothness, through the use of the so-called Abs-Normal Form (ANF) . These tangent models incorporate some knowledge of the nearby discontinuities of the derivatives. These models bring some additional power to processes that use tangent approximations, such as simulation, optimization, or solution of differential equations.

The mechanics to derive these special tangent models can be built as an extension of standard tangent linear Algorithmic Differentiation. This has been first demonstrated by the AD tool AdolC which, being based on Operator Overloading, is more flexible and seems a natural choice for implementation. Together with Krishna Narayanan, we recently tried a similar adaption on Source-Transformation AD tools. It appears that very little development is needed in the AD-tool. Specifically for Tapenade, it appears that no development at all is needed in the tool itself. Any end-user can already produce ANF tangent without needing any access to the tool source. All it requires is a customized derivative of the absolute-value function (ABS), which is currently less than 40 lines of code.

Building the ANF of a given program introduces one new variable per run-time execution of the ABS function. As the number of rows and columns of the constructed extended Jacobian both grow like the number of variables, it may become unreasonably large for large codes. To overcome this issue, we explore the possibility of finding at run-time the "important" ABS calls that deserve this treatment, and those that don't. We base this decision on a notion of distance to the kink induced by this ABS call as illustrated by Figure . We presented these experiments at a Shonan meeting on this question (Shonan, Japan, June 25-29) and at a workshop of ISMP 2018 (Bordeaux, July 2-6)

One of the current frontiers of AD research is the definition of an adjoint AD model that can cope with dynamic memory management. This research is central to provide reliable adjoint differentiation of C, and for our distant goal of AD of C++. This research is conducted in collaboration with the MCS department of Argonne National Lab. Our partnership is formalized by joint participation in the Inria joint lab JLESC, and partly funded by the Partner University Fund (PUF) of the French embassy in the USA.

Adjoint AD must reproduce in reverse order the control decisions of the original code. In languages such as C, allocation of dynamic memory and pointer management form a significant part of these control decisions. Reproducing memory allocation in reverse means reallocating memory, possibly receiving a different memory chunk. Reproducing pointer addresses in reverse thus requires to convert addresses in the former memory chunks into equivalent addresses in the new reallocated chunks. Together with Krishna Narayanan from Argonne, we experiment on real applications to find the most efficient solution to this address conversion problem. We jointly develop a library (called ADMM, ADjoint Memory Management) whose primitives are used in AD adjoint code to handle this address conversion. Both our AD tool Tapenade and Argonne's tool OpenAD use ADMM in the adjoint code they produce.

This year, trying to prove correctness of our current address conversion, we discovered some limitations
that indeed made the proof impossible. To solve these issues, it seems necessary to assign at run-time
a unique identifier to each chunk of memory used by the code, and to carry this identifier along with every pointer.
This results in a code transformation which, although more complex than expected,
can still be described by a small set of rewrite rules.
Moreover, this alternative method should reduce the run-time overhead that we observed previously.
Implementation and measurements are still under way.
We presented this recent research in the form of a catalogue of alternatives for Data-Flow reversal of memory addresses,
at the 21^{st} EuroAD workshop (Jena, Germany, November 19-20).

We support industrial users with their first experiments of Algorithmic Differentiation of large in-house codes.

This year's main application is with ONERA on their ElsA CFD platform (Fortran 90).
Both tangent and adjoint models of the kernel of ElsA were built successfully by Tapenade.
It is worth noticing that this application was performed inside ONERA by ONERA engineers (Bruno Maugars, Sébastien Bourasseau, Bérenger Berthoul) with no need for installation of ElsA inside Inria. We take this as a sign of maturity of Tapenade. Apart from a few minor corrections, our contributon was essentially during development meetings, to point out some strategies and tool options to obtain efficient differentiated code. One emphasis was on adjoint of vectorized code, which was produced as vectorized code too by means of a seldom-used Tapenade option that stores intermediate values statically, i.e. not on a global stack. Sébastien Bourasseau presented the first results at the 21^{st} EuroAD workshop (Jena, Germany, November 19-20), with convincing performance on industrial-size test cases. A joint article is in preparation.

This study is performed in collaboration with IMAG-Montpellier. It addresses an important complexity issue in unsteady mesh adaptation and took place in the work done in the ANR Maidesc (ended 2017). Unsteady high-Reynolds computations are strongly penalized by the very small time step imposed by accuracy requirements on regions involving small space-time scales. Unfortunately, this is also true for sophisticated unsteady mesh adaptive calculations. This small time step is an important computational penalty for mesh adaptive methods of AMR type. This is also the case for the Unsteady Fixed-Point mesh adaptive methods developed by Ecuador in cooperation with the Gamma3 team of Inria-Saclay. In the latter method, the loss of efficiency is even more crucial when the anisotropic mesh is locally strongly stretched since only very few cells are in the regions of small time-step constraint. This loss is evaluated as limiting the numerical convergence order for discontinuities to 8/5 instead of second-order convergence. An obvious remedy is to design time-consistent methods using different time steps on different parts of the mesh, as far as they are efficient and not too complex. The family of time-advancing methods in which unsteady phenomena are computed with different time steps in different regions is referred to as the multirate methods. In our collaboration with university of Montpellier, a novel multirate method using cell agglomeration has been designed and developed in our AIRONUM CFD platform. A series of large-scale test cases show that the new method is much more efficient than an explicit method, while retaining a similar time accuracy over the whole computational domain. A novel analysis shows that the proposed multirate algorithm indeed solves the unsteady mesh adaptation barrier identified in previous works. This work is being published in a journal .

Reducing approximation errors as much as possible is a particular kind of optimal control problem. We formulate it exactly this way when we look for the optimal metric of the mesh, which minimizes a user-specified functional (goal-oriented mesh adaptation). In that case, the usual methods of optimal control apply, using adjoint states that can be produced by Algorithmic Differentiation.

This year, two conference papers were written on the methods of the team, including new analyses in ,, a work on correctors in CFD in an AIAA paper. A detailed study of adjoint-based mesh adaptation for Navier-Stokes flows has been completed and published in a journal .

Following participation of Gamma3 and Ecuador to the European project UMRIDA (ended 2017), we wrote chapters 20, 21, 45, and 48 of the book “Uncertainty Management for Robust Industrial Design in Aeronautics”, edited by C. Hirsch et al. in the Springer series Notes on Numerical Fluid Mechanics and Multidisciplinary Design (2019).

Modeling turbulence is an essential aspect of CFD. The purpose of our work in hybrid RANS/LES (Reynolds Averaged Navier-Stokes / Large Eddy Simulation) is to develop new approaches for industrial applications of LES-based analyses. In the applications targetted (aeronautics, hydraulics), the Reynolds number can be as high as several tens of millions, far too high for pure LES models. However, certain regions in the flow can be predicted better with LES than with usual statistical RANS (Reynolds averaged Navier-Stokes) models. These are mainly vortical separated regions as assumed in one of the most popular hybrid models, the hybrid Detached Eddy Simulation model. Here, “hybrid” means that a blending is applied between LES and RANS. An important difference between a real life flow and a wind tunnel or basin is that the turbulence of the flow upstream of each body is not well known.

The development of hybrid models, in particular DES in the litterature, has raised the question of the domain of validity of these models. According to theory, these models should not be applied to flow involving laminar boundary layers (BL). But industrial flows are complex flows and often present regions of laminar BL, regions of fully developed turbulent BL and regions of non-equilibrium vortical BL. It is then mandatory for industrial use that the new hybrid models give a reasonable prediction for all these types of flow. We concentrated on evaluating the behavior of hybrid models for laminar BL and for vortical wakes. While less predictive than pure LES on laminar BL, some hybrid models still give reasonable predictions for rather low Reynolds numbers.

This year, we have developed a new model relying on the hybridation of a DDES model
based on a k-

We have also addressed this year a challenging test case, the flow around tandem cylinders with a distance between the cylinders of 12 diameters. The accurate capture of the vortices traveling along this path of 12 diameters requires that the LES filter does not accumulate any dissipation along this trajactory. This is a noticeable property or our DVMS model. Further, the numerics need be as accurate as possible. We use a superconvergent approximation, up to fifth order accurate on Cartesian regions of the computational domain. This combination allowed for an accurate prediction of the drag of the second cylinder. This result has been presented at the workshop ETMM12

Ecuador and Lemma have a bilateral contract to share the results of Stephen Wornom, Lemma engineer provided to Inria and hosted by Inria under a Inria-Lemma contract.

Ecuador participates in the Joint Laboratory for Exascale Computing (JLESC) together with colleagues at Argonne National Laboratory.

Laurent Hascoët is on the organizing commitee of the EuroAD Workshops
on Algorithmic Differentiation (http://

Alain Dervieux is Scientific Director for the LEMMA company.

PhD : Éléonore Gauci, “Goal-oriented metric-based mesh adaptation for unsteady CFD simulations involving moving geometries”, defended december 12, co-advisor A. Dervieux