diff --git a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndex.C b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndex.C index 957725dee6..434bd4200a 100644 --- a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndex.C +++ b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalIndex.C @@ -27,6 +27,84 @@ License \*---------------------------------------------------------------------------*/ #include "globalIndex.H" +#include "labelRange.H" + +// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * // + +Foam::labelList +Foam::globalIndex::calcOffsets +( + const labelUList& localSizes, + const bool checkOverflow +) +{ + labelList values; + + const label len = localSizes.size(); + + if (len) + { + values.resize(len+1); + + label start = 0; + for (label i = 0; i < len; ++i) + { + values[i] = start; + start += localSizes[i]; + + if (checkOverflow && start < values[i]) + { + FatalErrorInFunction + << "Overflow : sum of sizes exceeds labelMax (" + << labelMax << ") after index " << i << " of " + << flatOutput(localSizes) << nl + << "Please recompile with larger datatype for label." << nl + << exit(FatalError); + } + } + values[len] = start; + } + + return values; +} + + +Foam::List +Foam::globalIndex::calcRanges +( + const labelUList& localSizes, + const bool checkOverflow +) +{ + List values; + + const label len = localSizes.size(); + + if (len) + { + values.resize(len); + + label start = 0; + for (label i = 0; i < len; ++i) + { + values[i].reset(start, localSizes[i]); + start += localSizes[i]; + + if (checkOverflow && start < values[i].start()) + { + FatalErrorInFunction + << "Overflow : sum of sizes exceeds labelMax (" + << labelMax << ") after index " << i << " of " + << flatOutput(localSizes) << nl + << "Please recompile with larger datatype for label." << nl + << exit(FatalError); + } + } + } + + return values; +} + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // @@ -52,8 +130,8 @@ void Foam::globalIndex::bin bins.m() = UIndirectList