From d6d95c33bc09ab6ad56601c5f4ff18d8a584aee8 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Mon, 8 Jul 2019 19:21:40 +0200
Subject: [PATCH] ENH: return scalar for surface uniformity (#1363)

---
 .../surfaceFieldValue/surfaceFieldValue.H     | 19 +++++++---
 .../surfaceFieldValueTemplates.C              | 37 ++++++++++++++-----
 .../fieldValues/volFieldValue/volFieldValue.H |  2 +-
 .../volFieldValue/volFieldValueTemplates.C    | 34 +++++++++--------
 4 files changed, 62 insertions(+), 30 deletions(-)

diff --git a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.H b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.H
index ff5bfce8e73..811087b1ed9 100644
--- a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.H
+++ b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValue.H
@@ -229,8 +229,9 @@ public:
         enum operationVariant
         {
             typeBase = 0,         //!< Base operation
-            typeWeighted = 0x100, //!< Operation using weighting
-            typeAbsolute = 0x200, //!< Operation using mag (eg, for weighting)
+            typeScalar = 0x100,   //!< Operation returns a scalar
+            typeWeighted = 0x200, //!< Operation using weighting
+            typeAbsolute = 0x400, //!< Operation using mag (eg, for weighting)
         };
 
         //- Operation type enumeration
@@ -252,9 +253,17 @@ public:
             opAreaAverage,          //!< Area average
             opAreaIntegrate,        //!< Area integral
             opCoV,                  //!< Coefficient of variation
-            opAreaNormalAverage,    //!< Area average in normal direction
-            opAreaNormalIntegrate,  //!< Area integral in normal direction
-            opUniformity,           //!< Uniformity index
+
+            // Scalar return values
+
+            //! Area average in normal direction (output is always scalar)
+            opAreaNormalAverage = typeScalar,
+
+            //! Area integral in normal direction (output is always scalar)
+            opAreaNormalIntegrate,
+
+            //! Uniformity index (output is always scalar)
+            opUniformity,
 
             // Weighted variants
 
diff --git a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValueTemplates.C b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValueTemplates.C
index 7eb1abb57ec..cbd56130c08 100644
--- a/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValueTemplates.C
+++ b/src/functionObjects/field/fieldValues/surfaceFieldValue/surfaceFieldValueTemplates.C
@@ -411,15 +411,13 @@ bool Foam::functionObjects::fieldValues::surfaceFieldValue::writeValues
                     // sqrt: component-wise - doesn't change the type
                     for (direction d=0; d < pTraits<Type>::nComponents; ++d)
                     {
-                        setComponent(result,  d)
-                            = sqrt(mag(component(result,  d)));
+                        setComponent(result, d)
+                            = sqrt(mag(component(result, d)));
                     }
                     break;
                 }
             }
 
-            file()<< tab << result;
-
             // Write state/results information
             word prefix, suffix;
             {
@@ -436,13 +434,34 @@ bool Foam::functionObjects::fieldValues::surfaceFieldValue::writeValues
                 suffix += ')';
             }
 
-            Log << "    " << prefix << regionName_ << suffix
-                << " of " << fieldName
-                <<  " = " << result << endl;
+            word resultName = prefix + regionName_ + ',' + fieldName + suffix;
 
             // Write state/results information
-            word resultName = prefix + regionName_ + ',' + fieldName + suffix;
-            this->setResult(resultName, result);
+
+            Log << "    " << prefix << regionName_ << suffix
+                << " of " << fieldName << " = ";
+
+            // Operation tagged that it always returns scalar?
+            const bool alwaysScalar(operation_ & typeScalar);
+
+            if (alwaysScalar)
+            {
+                const scalar sresult = component(result, 0);
+
+                file()<< tab << sresult;
+
+                Log << sresult << endl;
+
+                this->setResult(resultName, sresult);
+            }
+            else
+            {
+                file()<< tab << result;
+
+                Log << result << endl;
+
+                this->setResult(resultName, result);
+            }
         }
     }
 
diff --git a/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.H b/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.H
index 7eb17bacc68..031f7cf631b 100644
--- a/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.H
+++ b/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.H
@@ -140,7 +140,7 @@ public:
         enum operationVariant
         {
             typeBase = 0,         //!< Base operation
-            typeWeighted = 0x100, //!< Operation using weighting
+            typeWeighted = 0x200, //!< Operation using weighting
         };
 
         //- Operation type enumeration
diff --git a/src/functionObjects/field/fieldValues/volFieldValue/volFieldValueTemplates.C b/src/functionObjects/field/fieldValues/volFieldValue/volFieldValueTemplates.C
index a5d2e68a0a4..be4c4197a0f 100644
--- a/src/functionObjects/field/fieldValues/volFieldValue/volFieldValueTemplates.C
+++ b/src/functionObjects/field/fieldValues/volFieldValue/volFieldValueTemplates.C
@@ -229,26 +229,30 @@ bool Foam::functionObjects::fieldValues::volFieldValue::writeValues
             }
         }
 
-        // Apply scale factor
-        values *= scaleFactor_;
+        if (operation_ != opNone)
+        {
+            // Apply scale factor
+            values *= scaleFactor_;
 
-        Type result = processValues(values, V, weightField);
+            Type result = processValues(values, V, weightField);
 
-        file()<< tab << result;
+            // Write state/results information
+            const word& opName = operationTypeNames_[operation_];
+            word outName = fieldName;
+            if (this->volRegion::regionName_ != polyMesh::defaultRegion)
+            {
+                outName = this->volRegion::regionName_ + ',' + outName;
+            }
+            word resultName = opName + '(' + outName + ')';
 
-        Log << "    " << operationTypeNames_[operation_]
-            << "(" << this->volRegion::regionName_ << ") of " << fieldName
-            <<  " = " << result << endl;
+            file()<< tab << result;
 
-        // Write state/results information
-        const word& opName = operationTypeNames_[operation_];
-        word outName = fieldName;
-        if (this->volRegion::regionName_ != polyMesh::defaultRegion)
-        {
-            outName = this->volRegion::regionName_ + ',' + outName;
+            Log << "    " << opName
+                << '(' << this->volRegion::regionName_ << ") of " << fieldName
+                <<  " = " << result << endl;
+
+            this->setResult(resultName, result);
         }
-        word resultName = opName + '(' + outName + ')';
-        this->setResult(resultName, result);
     }
 
     return ok;
-- 
GitLab