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