Files
openfoam/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndex.C
Mark Olesen e18ff114a6 ENH: add UPstream::allProcs() method
- returns a range of `int` values that can be iterated across.
  For example,

      for (const int proci : Pstream::allProcs()) { ... }

  instead of

      for (label proci = 0; proci < Pstream::nProcs(); ++proci) { ... }
2020-09-28 14:25:59 +02:00

177 lines
4.5 KiB
C

/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2018-2020 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "globalIndex.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::globalIndex::globalIndex(Istream& is)
{
is >> offsets_;
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::globalIndex::bin
(
const labelUList& offsets,
const labelUList& globalIds,
labelList& order,
CompactListList<label>& bins,
DynamicList<label>& validBins
)
{
sortedOrder(globalIds, order);
bins.m() = UIndirectList<label>(globalIds, order);
labelList& binOffsets = bins.offsets();
binOffsets.setSize(offsets.size());
binOffsets = 0;
validBins.clear();
if (globalIds.size())
{
const label id = bins.m()[0];
label proci = findLower(offsets, id+1);
validBins.append(proci);
label binSize = 1;
for (label i = 1; i < order.size(); i++)
{
const label id = bins.m()[i];
if (id < offsets[proci+1])
{
binSize++;
}
else
{
// Not local. Reset proci
label oldProci = proci;
proci = findLower(offsets, id+1);
// Set offsets
for (label j = oldProci+1; j < proci; ++j)
{
binOffsets[j] = binOffsets[oldProci]+binSize;
}
binOffsets[proci] = i;
validBins.append(proci);
binSize = 1;
}
}
for (label j = proci+1; j < binOffsets.size(); ++j)
{
binOffsets[j] = binOffsets[proci]+binSize;
}
}
}
void Foam::globalIndex::reset
(
const label localSize,
const int tag,
const label comm,
const bool parallel
)
{
offsets_.resize(Pstream::nProcs(comm)+1);
labelList localSizes(Pstream::nProcs(comm), Zero);
localSizes[Pstream::myProcNo(comm)] = localSize;
if (parallel)
{
Pstream::gatherList(localSizes, tag, comm);
Pstream::scatterList(localSizes, tag, comm);
}
label offset = 0;
offsets_[0] = 0;
for (const int proci : Pstream::allProcs(comm))
{
const label oldOffset = offset;
offset += localSizes[proci];
if (offset < oldOffset)
{
FatalErrorInFunction
<< "Overflow : sum of sizes " << localSizes
<< " exceeds capability of label (" << labelMax
<< "). Please recompile with larger datatype for label."
<< exit(FatalError);
}
offsets_[proci+1] = offset;
}
}
Foam::labelList Foam::globalIndex::sizes() const
{
labelList values;
const label len = (offsets_.size() - 1);
if (len < 1)
{
return values;
}
values.resize(len);
for (label proci=0; proci < len; ++proci)
{
values[proci] = offsets_[proci+1] - offsets_[proci];
}
return values;
}
// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * //
Foam::Istream& Foam::operator>>(Istream& is, globalIndex& gi)
{
return is >> gi.offsets_;
}
Foam::Ostream& Foam::operator<<(Ostream& os, const globalIndex& gi)
{
return os << gi.offsets_;
}
// ************************************************************************* //