diff --git a/src/finiteArea/Make/options b/src/finiteArea/Make/options index bd8bff0044..851f94b6b3 100644 --- a/src/finiteArea/Make/options +++ b/src/finiteArea/Make/options @@ -1,6 +1,10 @@ EXE_INC = \ + -I$(LIB_SRC)/fileFormats/lnInclude \ + -I$(LIB_SRC)/surfMesh/lnInclude \ -I$(LIB_SRC)/meshTools/lnInclude LIB_LIBS = \ -lOpenFOAM \ + -lfileFormats \ + -lsurfMesh \ -lmeshTools diff --git a/src/functionObjects/utilities/areaWrite/areaWrite.H b/src/functionObjects/utilities/areaWrite/areaWrite.H index 832bc00f32..fdcec555c3 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 void writeSurface ( surfaceWriter& writer, - const Field& values, + const Field* fieldPtr, const word& fieldName ); diff --git a/src/functionObjects/utilities/areaWrite/areaWriteTemplates.C b/src/functionObjects/utilities/areaWrite/areaWriteTemplates.C index 1a6813fcbf..f100554d6e 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 void Foam::areaWrite::writeSurface ( surfaceWriter& writer, - const Field& values, + const Field* fieldPtr, const word& fieldName ) { + const Field& values = (fieldPtr ? *fieldPtr : Field::null()); + fileName outputName = writer.write(fieldName, values); // Case-local file name with "" to make relocatable @@ -64,11 +66,23 @@ void Foam::areaWrite::performAction wordList fieldNames; if (loadFromFiles_) { - fieldNames = objects.sortedNames(fieldSelection_); + // With syncPar (sorted and parallel-consistent) + fieldNames = objects.names(fieldSelection_, true); } else { - fieldNames = areaMesh.thisDb().sortedNames(fieldSelection_); + fieldNames = areaMesh.thisDb().names(fieldSelection_); + + // With syncPar + if (Pstream::parRun()) + { + // Synchronize names + Pstream::combineGather(fieldNames, ListOps::uniqueEqOp()); + 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(fieldName), - fieldName - ); + const auto* fieldPtr = + areaMesh.thisDb().cfindObject(fieldName); + + writeSurface(writer, fieldPtr, fieldName); } } }