diff --git a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndex.C b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndex.C index 6825497018..6b4c68d157 100644 --- a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndex.C +++ b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndex.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2018 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -27,18 +27,27 @@ License // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // -Foam::globalIndex::globalIndex +Foam::globalIndex::globalIndex(Istream& is) +{ + is >> offsets_; +} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::globalIndex::reset ( const label localSize, const int tag, const label comm, const bool parallel ) -: - offsets_(Pstream::nProcs(comm)+1) { - labelList localSizes(Pstream::nProcs(comm), 0); + offsets_.resize(Pstream::nProcs(comm)+1); + + labelList localSizes(Pstream::nProcs(comm), Zero); localSizes[Pstream::myProcNo(comm)] = localSize; + if (parallel) { Pstream::gatherList(localSizes, tag, comm); @@ -47,9 +56,9 @@ Foam::globalIndex::globalIndex label offset = 0; offsets_[0] = 0; - for (label proci = 0; proci < Pstream::nProcs(comm); proci++) + for (label proci = 0; proci < Pstream::nProcs(comm); ++proci) { - label oldOffset = offset; + const label oldOffset = offset; offset += localSizes[proci]; if (offset < oldOffset) @@ -65,20 +74,21 @@ Foam::globalIndex::globalIndex } -Foam::globalIndex::globalIndex(const label localSize) -: - offsets_(Pstream::nProcs()+1) +void Foam::globalIndex::reset(const label localSize) { - labelList localSizes(Pstream::nProcs(), 0); + offsets_.resize(Pstream::nProcs()+1); + + labelList localSizes(Pstream::nProcs(), Zero); localSizes[Pstream::myProcNo()] = localSize; + Pstream::gatherList(localSizes, Pstream::msgType()); Pstream::scatterList(localSizes, Pstream::msgType()); label offset = 0; offsets_[0] = 0; - for (label proci = 0; proci < Pstream::nProcs(); proci++) + for (label proci = 0; proci < Pstream::nProcs(); ++proci) { - label oldOffset = offset; + const label oldOffset = offset; offset += localSizes[proci]; if (offset < oldOffset) @@ -94,12 +104,6 @@ Foam::globalIndex::globalIndex(const label localSize) } -Foam::globalIndex::globalIndex(Istream& is) -{ - is >> offsets_; -} - - // * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * // Foam::Istream& Foam::operator>>(Istream& is, globalIndex& gi) diff --git a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndex.H b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndex.H index 40f8ad1741..f89d245192 100644 --- a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndex.H +++ b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndex.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2018 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -78,11 +78,11 @@ public: //- Construct from local max size. // Does communication with default communicator and message tag. - globalIndex(const label localSize); + inline explicit globalIndex(const label localSize); //- Construct from local max size. // Does communication with given communicator and message tag - globalIndex + inline globalIndex ( const label localSize, const int tag, @@ -91,10 +91,10 @@ public: ); //- Copy construct from list of labels - inline globalIndex(const labelUList& offsets); + inline explicit globalIndex(const labelUList& offsets); //- Move construct from list of labels - inline globalIndex(labelList&& offsets); + inline explicit globalIndex(labelList&& offsets); //- Construct from Istream globalIndex(Istream& is); @@ -102,14 +102,38 @@ public: // Member Functions - // Edit + //- Check for null constructed or global sum == 0 + inline bool empty() const; - //- Change after construction - inline labelList& offsets(); + //- Const-access to the offsets + inline const labelList& offsets() const; + + + // Edit + + //- Write-access to the offsets, for changing after construction + inline labelList& offsets(); + + //- Reset from local size. + // Does communication with default communicator and message tag. + void reset(const label localSize); + + //- Reset from local size. + // Does communication with given communicator and message tag + void reset + ( + const label localSize, + const int tag, + const label comm, + const bool parallel // use parallel comms + ); // Queries relating to my processor (using world communicator) + //- My local start + inline label localStart() const; + //- My local size inline label localSize() const; @@ -132,6 +156,12 @@ public: //- Global sum of localSizes inline label size() const; + //- Start of proci data + inline label offset(const label proci) const; + + //- Start of proci data + inline label localStart(const label proci) const; + //- Size of proci data inline label localSize(const label proci) const; @@ -150,9 +180,6 @@ public: //- Which processor does global come from? Binary search. inline label whichProcID(const label i) const; - //- Start of proci data - inline label offset(const label proci) const; - // Other diff --git a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndexI.H b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndexI.H index 801e699573..3adfb13ab0 100644 --- a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndexI.H +++ b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndexI.H @@ -28,6 +28,28 @@ License // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // +inline Foam::globalIndex::globalIndex(const label localSize) +: + globalIndex() +{ + reset(localSize); +} + + +inline Foam::globalIndex::globalIndex +( + const label localSize, + const int tag, + const label comm, + const bool parallel +) +: + globalIndex() +{ + reset(localSize, tag, comm, parallel); +} + + inline Foam::globalIndex::globalIndex(const labelUList& offsets) : offsets_(offsets) @@ -42,6 +64,18 @@ inline Foam::globalIndex::globalIndex(labelList&& offsets) // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // +inline bool Foam::globalIndex::empty() const +{ + return offsets_.empty() || offsets_.last() == 0; +} + + +inline const Foam::labelList& Foam::globalIndex::offsets() const +{ + return offsets_; +} + + inline Foam::labelList& Foam::globalIndex::offsets() { return offsets_; @@ -54,6 +88,18 @@ inline Foam::label Foam::globalIndex::offset(const label proci) const } +inline Foam::label Foam::globalIndex::localStart(const label proci) const +{ + return offsets_[proci]; +} + + +inline Foam::label Foam::globalIndex::localStart() const +{ + return localStart(Pstream::myProcNo()); +} + + inline Foam::label Foam::globalIndex::localSize(const label proci) const { return offsets_[proci+1] - offsets_[proci];