From 36b0c5ce15eb214105133967e46f1663f228b949 Mon Sep 17 00:00:00 2001
From: Vaggelis Papoutsis <vaggelisp@gmail.com>
Date: Thu, 30 Jan 2020 19:17:53 +0200
Subject: [PATCH] ENH: changes in SIBase and derived classes

- Added function returning the underlaying surface sensitivities
- Added boolean to control whether to write the underlaying sensitivity
  map (defaults to false)
---
 .../SIBase/SIBaseIncompressible.C             | 21 ++++++++++++++++++-
 .../SIBase/SIBaseIncompressible.H             |  9 ++++++++
 .../sensitivityBezierIncompressible.C         |  3 +++
 .../sensitivityVolBSplinesIncompressible.C    |  3 +++
 4 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/SIBase/SIBaseIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/SIBase/SIBaseIncompressible.C
index 96465d521af..bb9600eb583 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/SIBase/SIBaseIncompressible.C
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/SIBase/SIBaseIncompressible.C
@@ -50,6 +50,8 @@ void SIBase::read()
     surfaceSensitivity_.read();
     includeObjective_ =
         dict().getOrDefault<bool>("includeObjectiveContribution", true);
+    writeSensitivityMap_ =
+        dict().getOrDefault<bool>("writeSensitivityMap", false);
 
     // If includeObjective is set to true both here and in the surface
     // sensitivities, set the one in the latter to false to avoid double
@@ -105,7 +107,8 @@ SIBase::SIBase
         objectiveManager,
         fvOptionsAdjoint
     ),
-    includeObjective_(true)
+    includeObjective_(true),
+    writeSensitivityMap_(true)
 {
     read();
 }
@@ -152,6 +155,22 @@ void SIBase::clearSensitivities()
 }
 
 
+const sensitivitySurface& SIBase::getSurfaceSensitivities() const
+{
+    return surfaceSensitivity_;
+}
+
+
+void SIBase::write(const word& baseName)
+{
+    shapeSensitivities::write(baseName);
+    if (writeSensitivityMap_)
+    {
+        surfaceSensitivity_.write(baseName);
+    }
+}
+
+
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 } // End namespace incompressible
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/SIBase/SIBaseIncompressible.H b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/SIBase/SIBaseIncompressible.H
index ee97adac055..cc3342d05bf 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/SIBase/SIBaseIncompressible.H
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/SIBase/SIBaseIncompressible.H
@@ -72,6 +72,9 @@ protected:
         //  them
         bool includeObjective_;
 
+        //- Write sensitivity map upon write
+        bool writeSensitivityMap_;
+
 
     // Protected Member Functions
 
@@ -127,6 +130,12 @@ public:
 
         //- Zero sensitivity fields and their constituents
         virtual void clearSensitivities();
+
+        //- Return reference to underlaying surface sensitivities
+        const sensitivitySurface& getSurfaceSensitivities() const;
+
+        //- Write sensitivity map
+        virtual void write(const word& baseName = word::null);
 };
 
 
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezier/sensitivityBezierIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezier/sensitivityBezierIncompressible.C
index 0f323575924..af41e4fab2f 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezier/sensitivityBezierIncompressible.C
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityBezier/sensitivityBezierIncompressible.C
@@ -203,6 +203,9 @@ void sensitivityBezier::clearSensitivities()
 void sensitivityBezier::write(const word& baseName)
 {
     Info<< "Writing control point sensitivities to file" << endl;
+    // Write sensitivity map
+    SIBase::write(baseName);
+    // Write control point sensitivities
     if (Pstream::master())
     {
         OFstream derivFile
diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplines/sensitivityVolBSplinesIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplines/sensitivityVolBSplinesIncompressible.C
index 66fb1553638..29946a2c035 100644
--- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplines/sensitivityVolBSplinesIncompressible.C
+++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplines/sensitivityVolBSplinesIncompressible.C
@@ -268,6 +268,9 @@ void sensitivityVolBSplines::clearSensitivities()
 void sensitivityVolBSplines::write(const word& baseName)
 {
     Info<< "Writing control point sensitivities to file" << endl;
+    // Write sensitivity map
+    SIBase::write(baseName);
+    // Write control point sensitivities
     if (Pstream::master())
     {
         OFstream derivFile
-- 
GitLab