From 58f82fccbde862da486a444f9ed6dfc2af6d7bf3 Mon Sep 17 00:00:00 2001 From: Henry Weller Date: Mon, 4 Sep 2023 11:57:27 +0100 Subject: [PATCH] functionObjects::volFieldValue: Filter processors without zone cells for max/min Resolves bug-report https://bugs.openfoam.org/view.php?id=4014 --- .../fieldValues/volFieldValue/volFieldValue.C | 8 +++--- .../fieldValues/volFieldValue/volFieldValue.H | 1 + .../volFieldValue/volFieldValueTemplates.C | 28 +++++++++++++------ 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.C b/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.C index 1a53e1859c..cfb66e2cef 100644 --- a/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.C +++ b/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.C @@ -194,22 +194,22 @@ bool Foam::functionObjects::fieldValues::volFieldValue::processValues { case operationType::min: { - compareScalars(values, result, lessOp()); + compareScalars(values, vGreat, result, lessOp()); return true; } case operationType::minMag: { - compareScalars(mag(values), result, lessOp()); + compareScalars(mag(values), vGreat, result, lessOp()); return true; } case operationType::max: { - compareScalars(values, result, greaterOp()); + compareScalars(values, -vGreat, result, greaterOp()); return true; } case operationType::maxMag: { - compareScalars(mag(values), result, greaterOp()); + compareScalars(mag(values), -vGreat, result, greaterOp()); return true; } default: diff --git a/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.H b/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.H index 011c8ffeb4..b5fb235ccb 100644 --- a/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.H +++ b/src/functionObjects/field/fieldValues/volFieldValue/volFieldValue.H @@ -193,6 +193,7 @@ protected: void compareScalars ( const scalarField& values, + const scalar emptyVal, Result& result, const Op& op ) const; diff --git a/src/functionObjects/field/fieldValues/volFieldValue/volFieldValueTemplates.C b/src/functionObjects/field/fieldValues/volFieldValue/volFieldValueTemplates.C index 02d32c6fc8..23a5145213 100644 --- a/src/functionObjects/field/fieldValues/volFieldValue/volFieldValueTemplates.C +++ b/src/functionObjects/field/fieldValues/volFieldValue/volFieldValueTemplates.C @@ -79,23 +79,33 @@ template void Foam::functionObjects::fieldValues::volFieldValue::compareScalars ( const scalarField& values, + const scalar emptyVal, Result& result, const Op& op ) const { - label i = 0; - forAll(values, j) + // Check if the zone on this processor is non-zero sized + if (values.size()) { - if (op(values[j], values[i])) + label i = 0; + forAll(values, j) { - i = j; + if (op(values[j], values[i])) + { + i = j; + } } + + result.value = values[i]; + result.celli = celli(i); + result.cc = fieldValue::mesh_.C()[result.celli]; + } + else + { + result.value = emptyVal; } - result.value = values[i]; - result.celli = celli(i); result.proci = Pstream::parRun() ? Pstream::myProcNo() : -1; - result.cc = fieldValue::mesh_.C()[result.celli]; reduce ( @@ -147,12 +157,12 @@ bool Foam::functionObjects::fieldValues::volFieldValue::processValues { case operationType::minMag: { - compareScalars(mag(values), result, lessOp()); + compareScalars(mag(values), vGreat, result, lessOp()); return true; } case operationType::maxMag: { - compareScalars(mag(values), result, greaterOp()); + compareScalars(mag(values), -vGreat, result, greaterOp()); return true; } default: