From 422993f9a5a2281b90c515bd720c3ed4783938a8 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@Germany>
Date: Thu, 8 Dec 2016 11:00:18 +0000
Subject: [PATCH] ENH: add weightedAreaIntegrate operation for
 surfaceFieldValue

---
 .../surfaceFieldValue/surfaceFieldValue.C     |  5 ++-
 .../surfaceFieldValue/surfaceFieldValue.H     | 10 +++--
 .../surfaceFieldValueTemplates.C              | 44 +++++++++++--------
 3 files changed, 35 insertions(+), 24 deletions(-)

diff --git a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.C b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.C
index 446a6440447..baa86b3157b 100644
--- a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.C
+++ b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.C
@@ -64,7 +64,7 @@ template<>
 const char* Foam::NamedEnum
 <
     Foam::functionObjects::fieldValues::surfaceFieldValue::operationType,
-    15
+    16
 >::names[] =
 {
     "none",
@@ -77,6 +77,7 @@ const char* Foam::NamedEnum
     "areaAverage",
     "weightedAreaAverage",
     "areaIntegrate",
+    "weightedAreaIntegrate",
     "min",
     "max",
     "CoV",
@@ -93,7 +94,7 @@ const Foam::NamedEnum
 const Foam::NamedEnum
 <
     Foam::functionObjects::fieldValues::surfaceFieldValue::operationType,
-    15
+    16
 > Foam::functionObjects::fieldValues::surfaceFieldValue::operationTypeNames_;
 
 
diff --git a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.H b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.H
index b34a9b6544f..8f39f204c4a 100644
--- a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.H
+++ b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.H
@@ -109,14 +109,15 @@ Usage
        sumDirectionBalance | sum of balance of values in given direction
        average       | ensemble average
        weightedAverage | weighted average
-       areaAverage   | area weighted average
+       areaAverage   | area-weighted average
        weightedAreaAverage | weighted area average
        areaIntegrate | area integral
+       weightedAreaIntegrate | weighted area integral
        min           | minimum
        max           | maximum
        CoV           | coefficient of variation: standard deviation/mean
-       areaNormalAverage| area weighted average in face normal direction
-       areaNormalIntegrate | area weighted integral in face normal directon
+       areaNormalAverage| area-weighted average in face normal direction
+       areaNormalIntegrate | area-weighted integral in face normal directon
     \endplaintable
 
 Note
@@ -210,6 +211,7 @@ public:
             opAreaAverage,          //!< Area average
             opWeightedAreaAverage,  //!< Weighted area average
             opAreaIntegrate,        //!< Area integral
+            opWeightedAreaIntegrate, //!< Weighted area integral
             opMin,                  //!< Minimum
             opMax,                  //!< Maximum
             opCoV,                  //!< Coefficient of variation
@@ -218,7 +220,7 @@ public:
         };
 
         //- Operation type names
-        static const NamedEnum<operationType, 15> operationTypeNames_;
+        static const NamedEnum<operationType, 16> operationTypeNames_;
 
 
 private:
diff --git a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValueTemplates.C b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValueTemplates.C
index 5272714d957..5c76bc055bd 100644
--- a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValueTemplates.C
+++ b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValueTemplates.C
@@ -176,10 +176,9 @@ processSameTypeValues
         }
         case opWeightedAverage:
         {
-            label wSize = returnReduce(weightField.size(), sumOp<label>());
-
-            if (wSize > 0)
+            if (returnReduce(weightField.size(), sumOp<label>()))
             {
+                // has weights
                 result =
                     gSum(weightField*values)/(gSum(weightField) + ROOTVSMALL);
             }
@@ -192,31 +191,40 @@ processSameTypeValues
         }
         case opAreaAverage:
         {
-            const scalarField magSf(mag(Sf));
+            const scalarField factor(mag(Sf));
 
-            result = gSum(magSf*values)/gSum(magSf);
+            result = gSum(factor*values)/gSum(factor);
             break;
         }
         case opWeightedAreaAverage:
         {
-            const scalarField magSf(mag(Sf));
-            label wSize = returnReduce(weightField.size(), sumOp<label>());
-
-            if (wSize > 0)
-            {
-                result = gSum(weightField*magSf*values)/gSum(magSf*weightField);
-            }
-            else
-            {
-                result = gSum(magSf*values)/gSum(magSf);
-            }
+            const scalarField factor
+            (
+                returnReduce(weightField.size(), sumOp<label>()) // has weights
+              ? weightField*mag(Sf)
+              : mag(Sf)
+            );
+
+            result = gSum(factor*values)/gSum(factor);
             break;
         }
         case opAreaIntegrate:
         {
-            const scalarField magSf(mag(Sf));
+            const scalarField factor(mag(Sf));
 
-            result = gSum(magSf*values);
+            result = gSum(factor*values);
+            break;
+        }
+        case opWeightedAreaIntegrate:
+        {
+            const scalarField factor
+            (
+                returnReduce(weightField.size(), sumOp<label>()) // has weights
+              ? weightField*mag(Sf)
+              : mag(Sf)
+            );
+
+            result = gSum(factor*values);
             break;
         }
         case opMin:
-- 
GitLab