From ddf1268e730940e896de8078176a6f2554cac4f5 Mon Sep 17 00:00:00 2001
From: Henry Weller <http://cfd.direct>
Date: Mon, 6 Feb 2017 15:48:11 +0000
Subject: [PATCH] functionObjects:surfaceFieldValue, volFieldValue: Added
 weightedSum and weighted[Area|Vol]Integrate

Patch contributed by Timo Niemi, VTT.
Resolves patch request https://bugs.openfoam.org/view.php?id=2452
---
 .../surfaceFieldValue/surfaceFieldValue.C     |  8 +++--
 .../surfaceFieldValue/surfaceFieldValue.H     |  8 +++--
 .../surfaceFieldValueTemplates.C              | 28 +++++++++++++++-
 .../fieldValues/volFieldValue/volFieldValue.C |  8 +++--
 .../fieldValues/volFieldValue/volFieldValue.H | 32 +++++++++++--------
 .../volFieldValue/volFieldValueTemplates.C    | 12 ++++++-
 6 files changed, 72 insertions(+), 24 deletions(-)

diff --git a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.C b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.C
index b532696e40d..3ac33748e29 100644
--- a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.C
+++ b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -65,11 +65,12 @@ template<>
 const char* Foam::NamedEnum
 <
     Foam::functionObjects::fieldValues::surfaceFieldValue::operationType,
-    15
+    17
 >::names[] =
 {
     "none",
     "sum",
+    "weightedSum",
     "sumMag",
     "sumDirection",
     "sumDirectionBalance",
@@ -78,6 +79,7 @@ const char* Foam::NamedEnum
     "areaAverage",
     "weightedAreaAverage",
     "areaIntegrate",
+    "weightedAreaIntegrate",
     "min",
     "max",
     "CoV",
@@ -94,7 +96,7 @@ const Foam::NamedEnum
 const Foam::NamedEnum
 <
     Foam::functionObjects::fieldValues::surfaceFieldValue::operationType,
-    15
+    17
 > Foam::functionObjects::fieldValues::surfaceFieldValue::operationTypeNames_;
 
 
diff --git a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.H b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.H
index 7a58ba56a9a..3c85014755e 100644
--- a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.H
+++ b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -116,6 +116,7 @@ Usage
     \plaintable
        none          | no operation
        sum           | sum
+       weightedSum   | weighted sum
        sumMag        | sum of component magnitudes
        sumDirection  | sum values which are positive in given direction
        sumDirectionBalance | sum of balance of values in given direction
@@ -124,6 +125,7 @@ Usage
        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
@@ -209,6 +211,7 @@ public:
         {
             opNone,
             opSum,
+            opWeightedSum,
             opSumMag,
             opSumDirection,
             opSumDirectionBalance,
@@ -217,6 +220,7 @@ public:
             opAreaAverage,
             opWeightedAreaAverage,
             opAreaIntegrate,
+            opWeightedAreaIntegrate,
             opMin,
             opMax,
             opCoV,
@@ -225,7 +229,7 @@ public:
         };
 
         //- Operation type names
-        static const NamedEnum<operationType, 15> operationTypeNames_;
+        static const NamedEnum<operationType, 17> operationTypeNames_;
 
 
 private:
diff --git a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValueTemplates.C b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValueTemplates.C
index cfcd2c2464d..ddb9107f4db 100644
--- a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValueTemplates.C
+++ b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValueTemplates.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -141,6 +141,18 @@ processSameTypeValues
             result = sum(values);
             break;
         }
+        case opWeightedSum:
+        {
+            if (weightField.size())
+            {
+                result = sum(weightField*values);
+            }
+            else
+            {
+                result = sum(values);
+            }
+            break;
+        }
         case opSumMag:
         {
             result = sum(cmptMag(values));
@@ -213,6 +225,20 @@ processSameTypeValues
             result = sum(magSf*values);
             break;
         }
+        case opWeightedAreaIntegrate:
+        {
+            const scalarField magSf(mag(Sf));
+
+            if (weightField.size())
+            {
+                result = sum(weightField*magSf*values);
+            }
+            else
+            {
+                result = sum(magSf*values);
+            }
+            break;
+        }
         case opMin:
         {
             result = min(values);
diff --git a/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.C b/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.C
index 5f3667e21f9..9383526d33f 100644
--- a/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.C
+++ b/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -48,17 +48,19 @@ const char*
 Foam::NamedEnum
 <
     Foam::functionObjects::fieldValues::volFieldValue::operationType,
-    11
+    13
 >::names[] =
 {
     "none",
     "sum",
+    "weightedSum",
     "sumMag",
     "average",
     "weightedAverage",
     "volAverage",
     "weightedVolAverage",
     "volIntegrate",
+    "weightedVolIntegrate",
     "min",
     "max",
     "CoV"
@@ -67,7 +69,7 @@ Foam::NamedEnum
 const Foam::NamedEnum
 <
     Foam::functionObjects::fieldValues::volFieldValue::operationType,
-    11
+    13
 > Foam::functionObjects::fieldValues::volFieldValue::operationTypeNames_;
 
 
diff --git a/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.H b/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.H
index d8d94b50709..a36597e0947 100644
--- a/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.H
+++ b/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -79,17 +79,19 @@ Usage
 
     The \c operation is one of:
     \plaintable
-       none               | No operation
-       sum                | Sum
-       sumMag             | Sum of component magnitudes
-       average            | Ensemble average
-       weightedAverage    | Weighted average
-       volAverage         | Volume weighted average
-       weightedVolAverage | Weighted volume average
-       volIntegrate       | Volume integral
-       min                | Minimum
-       max                | Maximum
-       CoV                | Coefficient of variation: standard deviation/mean
+       none                 | No operation
+       sum                  | Sum
+       weightedSum          | Weighted sum
+       sumMag               | Sum of component magnitudes
+       average              | Ensemble average
+       weightedAverage      | Weighted average
+       volAverage           | Volume weighted average
+       weightedVolAverage   | Weighted volume average
+       volIntegrate         | Volume integral
+       weightedVolIntegrate | Weighted volume integral
+       min                  | Minimum
+       max                  | Maximum
+       CoV                  | Coefficient of variation: standard deviation/mean
     \endplaintable
 
 See also
@@ -136,19 +138,21 @@ public:
         {
             opNone,
             opSum,
+            opWeightedSum,
             opSumMag,
             opAverage,
             opWeightedAverage,
             opVolAverage,
             opWeightedVolAverage,
             opVolIntegrate,
+            opWeightedVolIntegrate,
             opMin,
             opMax,
             opCoV
         };
 
         //- Operation type names
-        static const NamedEnum<operationType, 11> operationTypeNames_;
+        static const NamedEnum<operationType, 13> operationTypeNames_;
 
 
 protected:
@@ -158,7 +162,7 @@ protected:
         //- Operation to apply to values
         operationType operation_;
 
-        //- Weight field name - only used for opWeightedAverage mode
+        //- Weight field name - only used for weighted modes
         word weightFieldName_;
 
 
diff --git a/src/functionObjects/field/fieldValues/volFieldValue/volFieldValueTemplates.C b/src/functionObjects/field/fieldValues/volFieldValue/volFieldValueTemplates.C
index 54b9e2d5287..a23dd1e5f50 100644
--- a/src/functionObjects/field/fieldValues/volFieldValue/volFieldValueTemplates.C
+++ b/src/functionObjects/field/fieldValues/volFieldValue/volFieldValueTemplates.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -87,6 +87,11 @@ Type Foam::functionObjects::fieldValues::volFieldValue::processValues
             result = gSum(values);
             break;
         }
+        case opWeightedSum:
+        {
+            result = gSum(weightField*values);
+            break;
+        }
         case opSumMag:
         {
             result = gSum(cmptMag(values));
@@ -117,6 +122,11 @@ Type Foam::functionObjects::fieldValues::volFieldValue::processValues
             result = gSum(V*values);
             break;
         }
+        case opWeightedVolIntegrate:
+        {
+            result = gSum(weightField*V*values);
+            break;
+        }
         case opMin:
         {
             result = gMin(values);
-- 
GitLab