diff --git a/src/functionObjects/utilities/areaWrite/areaWrite.H b/src/functionObjects/utilities/areaWrite/areaWrite.H index 832bc00f3219ddcb7d61bdcb601a8b2134434170..fdcec555c3fd43cbb72c573560d84df21362d4fc 100644 --- a/src/functionObjects/utilities/areaWrite/areaWrite.H +++ b/src/functionObjects/utilities/areaWrite/areaWrite.H @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2019-2020 OpenCFD Ltd. + Copyright (C) 2019-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -144,12 +144,15 @@ class areaWrite // Private Member Functions - //- Write fieldName on surface and on outputDir path + //- Write fieldName on surface and on outputDir path. + // Can have a field nullptr for partially missing fields, + // but the caller should generally filter out completely + // missing fields. template<class Type> void writeSurface ( surfaceWriter& writer, - const Field<Type>& values, + const Field<Type>* fieldPtr, const word& fieldName ); diff --git a/src/functionObjects/utilities/areaWrite/areaWriteTemplates.C b/src/functionObjects/utilities/areaWrite/areaWriteTemplates.C index 1a6813fcbf3c4fd58f8102a5e964dcb1fc3356fe..f100554d6e1bfff3041d3093d419d60c9e91cf89 100644 --- a/src/functionObjects/utilities/areaWrite/areaWriteTemplates.C +++ b/src/functionObjects/utilities/areaWrite/areaWriteTemplates.C @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2019 OpenCFD Ltd. + Copyright (C) 2019-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -35,10 +35,12 @@ template<class Type> void Foam::areaWrite::writeSurface ( surfaceWriter& writer, - const Field<Type>& values, + const Field<Type>* fieldPtr, const word& fieldName ) { + const Field<Type>& values = (fieldPtr ? *fieldPtr : Field<Type>::null()); + fileName outputName = writer.write(fieldName, values); // Case-local file name with "<case>" to make relocatable @@ -64,11 +66,23 @@ void Foam::areaWrite::performAction wordList fieldNames; if (loadFromFiles_) { - fieldNames = objects.sortedNames<GeoField>(fieldSelection_); + // With syncPar (sorted and parallel-consistent) + fieldNames = objects.names<GeoField>(fieldSelection_, true); } else { - fieldNames = areaMesh.thisDb().sortedNames<GeoField>(fieldSelection_); + fieldNames = areaMesh.thisDb().names<GeoField>(fieldSelection_); + + // With syncPar + if (Pstream::parRun()) + { + // Synchronize names + Pstream::combineGather(fieldNames, ListOps::uniqueEqOp<word>()); + Pstream::combineScatter(fieldNames); + } + + // Sort for consistent order on all processors + Foam::sort(fieldNames); } for (const word& fieldName : fieldNames) @@ -92,16 +106,14 @@ void Foam::areaWrite::performAction areaMesh ); - writeSurface(writer, fld, fieldName); + writeSurface(writer, &fld, fieldName); } else { - writeSurface - ( - writer, - areaMesh.thisDb().lookupObject<GeoField>(fieldName), - fieldName - ); + const auto* fieldPtr = + areaMesh.thisDb().cfindObject<GeoField>(fieldName); + + writeSurface(writer, fieldPtr, fieldName); } } }