Added functionality for smoothing the sensitivity derivatives
Summary
Adjoint-based sensitivity maps can now be optionally smoothed using a Laplace-Beltrami operator.
When computing sensitivity maps on surface meshes generated from industrial geometries, the outcome might appear noisy, especially if a volume-to-surface approach is used for meshing, like the one utilised by snappyHexMesh. Even though the sensitivity map is technically correct, the noisy patterns that appear might make the extraction of useful information challenging. This new feature facilitates the interpretation of the sensitivity map in such cases.
Details of new models
The sensitivity map can be smoothed using a Laplace-Beltrami operator of the form
\tilde{m} - \frac{\partial}{\partial x_j}\left[R^2\frac{\partial \tilde{m}}{\partial x_j}\right] = m
where \tilde{m}
is the smoothed sensitivity map, m
is the original
sensitivity map and R
a smoothing radius. The latter is computed as a
multiple of the average 'length' of the boundary faces, if not provided by the
user explicitly.
The above-mentioned equation is solved on the part of the surface mesh defined by the patches on which the sensitivity map is computed, using the finiteArea infrastructure of OpenFOAM.
If an faMesh is provided, it will be used; otherwise it will be created on the fly based on either an faMeshDefinition dictionary in system or one constructed internally based on the sensitivity patches.
From an optimisation point of view, this smoothing can alternatively be seen as computing the sensitivity derivatives \frac{\delta J}{\delta b_i}
of the objective function J
w.r.t. a different set of design variables b_i, i\in[1,N]
, defined as
x_i = x_i^{init} + \tilde{b_i} \\
\tilde{b_i} - \frac{\partial}{\partial x_j}\left[R^2\frac{\partial \tilde{b_i}}{\partial x_j}\right] = b_i
where x_i
are the coordinates of the updated geometry and \tilde{b_i}
a smooth displacement field. In other words,
no loss of accuracy is incurred by the smoothing; instead, sensitivities are computed w.r.t. a different set of design variables.
Examples
An example of a noisy sensitivity map and its smoothed variants using different R
values is presented below, taken from the updated motorbike tutorial under
$FOAM_TUTORIALS/incompressible/adjointOptimisationFoam/sensitivityMaps/motorBike,
Risks
No risks are foreseen. To enable the smoothing, the smoothSensitivities
bool should be set to true
, along with some optional entries.
sensitivities
{
type surfacePoints;
patches (motorBikeGroup);
includeSurfaceArea false;
smoothSensitivities true;
meanRadiusMultiplier 10; // Optional, defaults to 10. Controls the smoothing radius
iters 2000; // Optional, defaults to 500
}
Since the Laplace-Beltrami equation is solved using the finiteArea framework, faSchemes
and faSolution
should be present under system
.
The smoothed sensitivity map is written in the smoothedSurfaceSens + adjointSolverName + sensitivityFormulation
file, under the current time-step.
References
The notion of sensitivity smoothing using a Laplace-Beltrami operator was used throught the seminal works of Antony Jameson. A reference can be found in
Vassberg J. C., Jameson A. (2006). Aerodynamic Shape Optimization Part I: Theoretical Background. VKI Lecture Series, Introduction to Optimization and Multidisciplinary Design, Brussels, Belgium, 8 March, 2006.