From f1ecad63b8dae7fe468c6c422987eba0f50f22c5 Mon Sep 17 00:00:00 2001 From: Mark Olesen <Mark.Olesen@esi-group.com> Date: Mon, 20 Feb 2023 14:52:25 +0100 Subject: [PATCH] BUG: globalIndex gather/scatter fails with multi-world (fixes #2706) - was using UPstream::procIDs(), which returns the sub-ranks with respect to the parent communicator. This is normally just an identity list (single-world) but with multi-world the indexing is incorrect. Use UPstream::allProcs() instead. --- src/OpenFOAM/parallel/globalIndex/globalIndex.H | 4 ++-- .../parallel/globalIndex/globalIndexTemplates.C | 14 +++++++------- .../distributedTriSurfaceMesh.C | 8 ++++---- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/OpenFOAM/parallel/globalIndex/globalIndex.H b/src/OpenFOAM/parallel/globalIndex/globalIndex.H index 707dd1d3f50..a14f1942fbf 100644 --- a/src/OpenFOAM/parallel/globalIndex/globalIndex.H +++ b/src/OpenFOAM/parallel/globalIndex/globalIndex.H @@ -489,12 +489,12 @@ public: //- Collect indirect data in processor order on master // Handles contiguous/non-contiguous data, skips empty fields. - template<class Type, class Addr> + template<class ProcIDsContainer, class Type, class Addr> static void gather ( const labelUList& offsets, //!< offsets (master only) const label comm, //!< communicator - const UList<int>& procIDs, + const ProcIDsContainer& procIDs, const IndirectListBase<Type, Addr>& fld, List<Type>& allFld, //! output field (master only) const int tag = UPstream::msgType(), diff --git a/src/OpenFOAM/parallel/globalIndex/globalIndexTemplates.C b/src/OpenFOAM/parallel/globalIndex/globalIndexTemplates.C index f1b60ac0335..c0696036024 100644 --- a/src/OpenFOAM/parallel/globalIndex/globalIndexTemplates.C +++ b/src/OpenFOAM/parallel/globalIndex/globalIndexTemplates.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2013-2017 OpenFOAM Foundation - Copyright (C) 2019-2022 OpenCFD Ltd. + Copyright (C) 2019-2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -248,12 +248,12 @@ void Foam::globalIndex::gather } -template<class Type, class Addr> +template<class ProcIDsContainer, class Type, class Addr> void Foam::globalIndex::gather ( const labelUList& off, // needed on master only const label comm, - const UList<int>& procIDs, + const ProcIDsContainer& procIDs, const IndirectListBase<Type, Addr>& fld, List<Type>& allFld, const int tag, @@ -368,7 +368,7 @@ void Foam::globalIndex::gather ( offsets_, // needed on master only comm, - UPstream::procID(comm), + UPstream::allProcs(comm), // All communicator ranks sendData, allData, tag, @@ -404,7 +404,7 @@ void Foam::globalIndex::gather ( offsets_, // needed on master only comm, - UPstream::procID(comm), + UPstream::allProcs(comm), // All communicator ranks sendData, allData, tag, @@ -622,7 +622,7 @@ void Foam::globalIndex::mpiGather ( offsets_, // needed on master only comm, - UPstream::procID(comm), + UPstream::allProcs(comm), // All communicator ranks sendData, allData, tag, @@ -967,7 +967,7 @@ void Foam::globalIndex::scatter ( offsets_, // needed on master only comm, - UPstream::procID(comm), + UPstream::allProcs(comm), // All communicator ranks allData, localData, tag, diff --git a/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.C b/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.C index 5d53b49ead5..1448ea96446 100644 --- a/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.C +++ b/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.C @@ -1949,7 +1949,7 @@ Foam::distributedTriSurfaceMesh::independentlyDistributedBbs // //globalBorderTris.gather // //( // // UPstream::worldComm, -// // UPstream::procID(Pstream::worldComm), +// // UPstream::allProcs(UPstream::worldComm), // // globalBorderCentres // //); // pointField globalBorderCentres(allCentres); @@ -1996,7 +1996,7 @@ Foam::distributedTriSurfaceMesh::independentlyDistributedBbs // //globalBorderTris.scatter // //( // // UPstream::worldComm, -// // UPstream::procID(Pstream::worldComm), +// // UPstream::allProcs(UPstream::worldComm), // // isMasterPoint // //); // //boolList isMasterBorder(s.size(), false); @@ -2094,7 +2094,7 @@ Foam::distributedTriSurfaceMesh::independentlyDistributedBbs globalTris().gather ( UPstream::worldComm, - UPstream::procID(Pstream::worldComm), + UPstream::allProcs(UPstream::worldComm), allCentres ); } @@ -2144,7 +2144,7 @@ Foam::distributedTriSurfaceMesh::independentlyDistributedBbs globalTris().scatter ( UPstream::worldComm, - UPstream::procID(Pstream::worldComm), + UPstream::allProcs(UPstream::worldComm), allDistribution, distribution ); -- GitLab