Introduced unsteady adjoint functionality. Currently supports full storage of the primal time-series or utilization of binomial checkpointing.
This branch also serves as a fetching point for the profiling and improvement of the unsteady adjoint code during the exaFoam project.
Details of new models
- The unsteady adjoint equations are integrated backwards in time. Since each adjoint time-step requires the primal solution of that time-step to be known, schemes for managing the storage/retrieval of the entire flow series are necessary. These are implemented through the primalStorage class and its derived ones. The latter manipulate a new class of fields, called compressedGeometricFields, which provide hooks for compressing/decompressing a field during the time integration of the primal/adjoint equations. The method used for compressing/decompressing is run-time selectable.
- The current commit provides the shortGeometricField implementation which avoids the storage of patchFields that can be retrieved from the internalField (e.g. coupled, zeroGradient, symmetry, etc), to cut on the storage requirements. More elaborate compression approaches will be included in the future, during the exaFoam project.
- Two primalStorage options are included: compressedFullStorage and binomialCheckPointing.
compressedFullStorage stores the entire flow time-series, potentially by compressing each time-step (only the above-mentioned short approach is available for the moment).
binomialCheckPointing is based on the homonymous algorithm proposed in
\verbatim Wang, Q., Moin, P., & Iaccarino, G.. Minimal Repetition Dynamic Checkpointing Algorithm for Unsteady Adjoint Calculation (2009). SIAM Journal on Scientific Computing, 31(4), 2549-2567. 10.1137/080727890, \endverbatim
which stores the solution of the flow equations in a predefined number of time-steps, named checkpoints. During the backwards-in-time integration of the adjoint equations, if the primal solution at a certain time-step is not available, it is retrieved by re-computing the primal flow field starting from the closest checkpoint. Checkpoints are optimally distributed throughout the time-series to invoke the least number of flow recomputations during the backwards-in-time solution of the adjoint equations. Binomial checkpointing is the current state of the art though its re-computation cost frequently amounts for an extra solution of the flow equations in medium-to-large cases.
- The adjoint to the PISO and PIMPLE solvers, along with their solverControl variants, are additionally included.
- Objective functions are integrated in time, through appropriate entries in the dictionaries defining them.
Authored by Andreas Margetis and reviewed by Vaggelis Papoutsis, with earlier contributions from Dr. Ioannis Kavvadias.