Draft: unsteady adjoint functionality
Summary
Introduced unsteady adjoint functionality. Currently supports full storage of the primal timeseries 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 timestep requires the primal solution of that timestep 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 runtime 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 timeseries, potentially by compressing each timestep (only the abovementioned 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), 25492567. 10.1137/080727890, \endverbatim

which stores the solution of the flow equations in a predefined number of timesteps, named checkpoints. During the backwardsintime integration of the adjoint equations, if the primal solution at a certain timestep is not available, it is retrieved by recomputing the primal flow field starting from the closest checkpoint. Checkpoints are optimally distributed throughout the timeseries to invoke the least number of flow recomputations during the backwardsintime solution of the adjoint equations. Binomial checkpointing is the current state of the art though its recomputation cost frequently amounts for an extra solution of the flow equations in mediumtolarge 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.