functionObjects::volFieldValue: Filter processors without zone cells for max/min

Resolves bug-report https://bugs.openfoam.org/view.php?id=4014
This commit is contained in:
Henry Weller
2023-09-04 11:57:27 +01:00
parent 17771b88d5
commit 58f82fccbd
3 changed files with 24 additions and 13 deletions

View File

@ -194,22 +194,22 @@ bool Foam::functionObjects::fieldValues::volFieldValue::processValues
{
case operationType::min:
{
compareScalars(values, result, lessOp<scalar>());
compareScalars(values, vGreat, result, lessOp<scalar>());
return true;
}
case operationType::minMag:
{
compareScalars(mag(values), result, lessOp<scalar>());
compareScalars(mag(values), vGreat, result, lessOp<scalar>());
return true;
}
case operationType::max:
{
compareScalars(values, result, greaterOp<scalar>());
compareScalars(values, -vGreat, result, greaterOp<scalar>());
return true;
}
case operationType::maxMag:
{
compareScalars(mag(values), result, greaterOp<scalar>());
compareScalars(mag(values), -vGreat, result, greaterOp<scalar>());
return true;
}
default:

View File

@ -193,6 +193,7 @@ protected:
void compareScalars
(
const scalarField& values,
const scalar emptyVal,
Result<scalar>& result,
const Op& op
) const;

View File

@ -79,23 +79,33 @@ template<class Op>
void Foam::functionObjects::fieldValues::volFieldValue::compareScalars
(
const scalarField& values,
const scalar emptyVal,
Result<scalar>& 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<scalar>());
compareScalars(mag(values), vGreat, result, lessOp<scalar>());
return true;
}
case operationType::maxMag:
{
compareScalars(mag(values), result, greaterOp<scalar>());
compareScalars(mag(values), -vGreat, result, greaterOp<scalar>());
return true;
}
default: