BUG: sampledSets - ensure results are written on all procs

This commit is contained in:
Andrew Heather
2021-12-07 21:08:43 +00:00
parent 65bc8d1140
commit f6ccd77d8c

View File

@ -136,46 +136,63 @@ Foam::fileName Foam::sampledSets::writeSampleFile
{ {
wordList valueSetNames(masterFields.size()); wordList valueSetNames(masterFields.size());
List<const Field<Type>*> valueSets(masterFields.size()); List<const Field<Type>*> valueSets(masterFields.size());
forAll(masterFields, fieldi) forAll(masterFields, fieldi)
{ {
const word& fieldName = masterFields[fieldi].name(); const word& fieldName = masterFields[fieldi].name();
valueSetNames[fieldi] = fieldName; valueSetNames[fieldi] = fieldName;
valueSets[fieldi] = &masterFields[fieldi][setI];
// Values only available on master
Type averageValue, minValue, maxValue;
label sizeValue;
if (Pstream::master())
{
valueSets[fieldi] = &masterFields[fieldi][setI];
averageValue = average(*valueSets[fieldi]);
minValue = min(*valueSets[fieldi]);
maxValue = max(*valueSets[fieldi]);
sizeValue = valueSets[fieldi]->size();
}
Pstream::scatter(averageValue);
Pstream::scatter(minValue);
Pstream::scatter(maxValue);
Pstream::scatter(sizeValue);
// Set results // Set results
setResult("average(" + fieldName + ")", average(*valueSets[fieldi])); setResult("average(" + fieldName + ")", averageValue);
setResult("min(" + fieldName + ")", min(*valueSets[fieldi])); setResult("min(" + fieldName + ")", minValue);
setResult("max(" + fieldName + ")", max(*valueSets[fieldi])); setResult("max(" + fieldName + ")", maxValue);
setResult("size(" + fieldName + ")", valueSets[fieldi]->size()); setResult("size(" + fieldName + ")", sizeValue);
} }
fileName fName fileName fName;
( if (Pstream::master())
timeDir/formatter.getFileName(masterSampleSet, valueSetNames) {
); fName = timeDir/formatter.getFileName(masterSampleSet, valueSetNames);
OFstream ofs(fName); OFstream ofs(fName);
if (ofs.opened()) if (ofs.opened())
{ {
formatter.write formatter.write
( (
masterSampleSet, masterSampleSet,
valueSetNames, valueSetNames,
valueSets, valueSets,
ofs ofs
); );
return fName; }
} else
else {
{ WarningInFunction
WarningInFunction << "File " << ofs.name() << " could not be opened. "
<< "File " << ofs.name() << " could not be opened. " << "No data will be written" << endl;
<< "No data will be written" << endl; }
return fileName::null;
} }
Pstream::scatter(fName);
return fName;
} }
@ -325,20 +342,15 @@ void Foam::sampledSets::sampleAndWrite(fieldGroup<Type>& fields)
forAll(masterSampledSets_, setI) forAll(masterSampledSets_, setI)
{ {
fileName sampleFile; fileName sampleFile = writeSampleFile
if (Pstream::master()) (
{ masterSampledSets_[setI],
sampleFile = writeSampleFile masterFields,
( setI,
masterSampledSets_[setI], outputPath_/mesh_.time().timeName(),
masterFields, fields.formatter()
setI, );
outputPath_/mesh_.time().timeName(),
fields.formatter()
);
}
Pstream::scatter(sampleFile);
if (sampleFile.size()) if (sampleFile.size())
{ {
// Case-local file name with "<case>" to make relocatable // Case-local file name with "<case>" to make relocatable