diff --git a/src/sampling/sampledSet/sampledSets/sampledSets.H b/src/sampling/sampledSet/sampledSets/sampledSets.H index 6636bb1c1197877a57b9e91d340dada300102e5e..56cee6f74b5a15ae24ec735e4897ec56092e2540 100644 --- a/src/sampling/sampledSet/sampledSets/sampledSets.H +++ b/src/sampling/sampledSet/sampledSets/sampledSets.H @@ -51,7 +51,7 @@ Description interpolationScheme cellPoint; // Output format - surfaceFormat vtk; + setFormat vtk; formatOptions { diff --git a/src/sampling/sampledSet/sampledSets/sampledSetsImpl.C b/src/sampling/sampledSet/sampledSets/sampledSetsImpl.C index dd0e37c5b7935f3c6d4f318f9950e00085f72e51..e2e46e8076a3fd2a0f85831336b71ee1105a592f 100644 --- a/src/sampling/sampledSet/sampledSets/sampledSetsImpl.C +++ b/src/sampling/sampledSet/sampledSets/sampledSetsImpl.C @@ -116,6 +116,11 @@ void Foam::sampledSets::performAction interpPtr.reset(interpolation<Type>::New(samplePointScheme_, fld)); } + // Ensemble min/max/avg values + Type avgEnsemble = Zero; + label sizeEnsemble = 0; + MinMax<Type> limitsEnsemble; + forAll(*this, seti) { const sampledSet& s = (*this)[seti]; @@ -164,24 +169,33 @@ void Foam::sampledSets::performAction // Collect data from all processors globIdx.gatherInplace(values); - // Some values only available on master - Type avgValue, minValue, maxValue; - label sizeValue; + // Local min/max/avg values - calculate on master + Type avgValue = Zero; + label sizeValue = 0; + MinMax<Type> limits; if (Pstream::master()) { - avgValue = average(values); - minValue = min(values); - maxValue = max(values); + avgValue = sum(values); sizeValue = values.size(); + limits = MinMax<Type>(values); + + // Ensemble values + avgEnsemble += avgValue; + sizeEnsemble += sizeValue; + limitsEnsemble += limits; + + if (sizeValue) + { + avgValue /= sizeValue; + } // Use sorted order values = UIndirectList<Type>(values, globOrder)(); } Pstream::scatter(avgValue); - Pstream::scatter(minValue); - Pstream::scatter(maxValue); Pstream::scatter(sizeValue); + Pstream::scatter(limits); // Store results: min/max/average/size with the name of the set // for scoping. @@ -189,16 +203,16 @@ void Foam::sampledSets::performAction const word resultArg('(' + setName + ',' + fieldName + ')'); this->setResult("average" + resultArg, avgValue); - this->setResult("min" + resultArg, minValue); - this->setResult("max" + resultArg, maxValue); + this->setResult("min" + resultArg, limits.min()); + this->setResult("max" + resultArg, limits.max()); this->setResult("size" + resultArg, sizeValue); if (verbose_) { Info<< name() << ' ' << setName << " : " << fieldName << nl << " avg: " << avgValue << nl - << " min: " << minValue << nl - << " max: " << maxValue << nl << nl; + << " min: " << limits.min() << nl + << " max: " << limits.max() << nl << nl; } if (request & ACTION_WRITE) @@ -206,6 +220,27 @@ void Foam::sampledSets::performAction writeCoordSet<Type>(writers_[seti], values, fieldName); } } + + if (sizeEnsemble) + { + avgEnsemble /= sizeEnsemble; + } + + if (size()) + { + Pstream::scatter(avgEnsemble); + Pstream::scatter(sizeEnsemble); + Pstream::scatter(limitsEnsemble); + + // Store results: min/max/average/size for the ensemble + // Eg, average(T) ... + const word resultArg('(' + fieldName + ')'); + + this->setResult("average" + resultArg, avgEnsemble); + this->setResult("min" + resultArg, limitsEnsemble.min()); + this->setResult("max" + resultArg, limitsEnsemble.max()); + this->setResult("size" + resultArg, sizeEnsemble); + } }