globalIndexI.H 5.32 KB
Newer Older
1 2 3 4
/*---------------------------------------------------------------------------*\
  =========                 |
  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
   \\    /   O peration     |
OpenFOAM bot's avatar
OpenFOAM bot committed
5 6 7 8
    \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
     \\/     M anipulation  |
-------------------------------------------------------------------------------
                            | Copyright (C) 2011-2016 OpenFOAM Foundation
9 10 11 12
-------------------------------------------------------------------------------
License
    This file is part of OpenFOAM.

13 14 15 16
    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.
17 18 19 20 21 22 23

    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
24
    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
25 26 27 28

\*---------------------------------------------------------------------------*/

#include "ListOps.H"
29
#include "labelRange.H"
30

31 32
// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //

33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
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);
}


55 56 57
inline Foam::globalIndex::globalIndex(const labelUList& offsets)
:
    offsets_(offsets)
58 59 60
{}


61
inline Foam::globalIndex::globalIndex(labelList&& offsets)
62
:
63
    offsets_(std::move(offsets))
64 65 66
{}


67 68
// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //

69 70 71 72 73 74 75 76 77 78 79 80
inline bool Foam::globalIndex::empty() const
{
    return offsets_.empty() || offsets_.last() == 0;
}


inline const Foam::labelList& Foam::globalIndex::offsets() const
{
    return offsets_;
}


81 82 83 84 85 86
inline Foam::labelList& Foam::globalIndex::offsets()
{
    return offsets_;
}


87 88 89 90 91 92 93 94 95 96 97 98
inline Foam::label Foam::globalIndex::size() const
{
    return offsets_.empty() ? 0 : offsets_.last();
}


inline void Foam::globalIndex::reset(const label localSize)
{
    reset(localSize, Pstream::msgType(), 0, true);
}


99
inline Foam::label Foam::globalIndex::offset(const label proci) const
100
{
101
    return offsets_[proci];
102 103 104
}


105 106 107 108 109 110 111 112 113 114 115 116
inline Foam::label Foam::globalIndex::localStart(const label proci) const
{
    return offsets_[proci];
}


inline Foam::label Foam::globalIndex::localStart() const
{
    return localStart(Pstream::myProcNo());
}


117
inline Foam::label Foam::globalIndex::localSize(const label proci) const
mattijs's avatar
mattijs committed
118
{
119
    return offsets_[proci+1] - offsets_[proci];
mattijs's avatar
mattijs committed
120 121 122
}


mattijs's avatar
mattijs committed
123 124 125 126 127 128
inline Foam::label Foam::globalIndex::localSize() const
{
    return localSize(Pstream::myProcNo());
}


129 130 131 132 133 134 135 136 137 138 139 140
inline Foam::labelRange Foam::globalIndex::range(const label proci) const
{
    return labelRange(offsets_[proci], offsets_[proci+1] - offsets_[proci]);
}


inline Foam::labelRange Foam::globalIndex::range() const
{
    return range(Pstream::myProcNo());
}


141 142 143 144 145 146 147 148 149 150 151 152
inline bool Foam::globalIndex::isLocal(const label proci, const label i) const
{
    return i >= offsets_[proci] && i < offsets_[proci+1];
}


inline bool Foam::globalIndex::isLocal(const label i) const
{
    return isLocal(Pstream::myProcNo(), i);
}


153 154
inline Foam::label Foam::globalIndex::toGlobal
(
155
    const label proci,
156 157 158
    const label i
) const
{
159
    return i + offsets_[proci];
160 161 162
}


163 164
inline Foam::label Foam::globalIndex::toGlobal(const label i) const
{
165
    return toGlobal(Pstream::myProcNo(), i);
166 167
}

168

169 170 171 172 173
inline Foam::labelList Foam::globalIndex::toGlobal
(
    const label proci,
    const labelUList& labels
) const
174
{
175 176 177 178
    labelList result(labels);
    inplaceToGlobal(proci, result);

    return result;
179 180 181
}


182 183 184 185
inline Foam::labelList Foam::globalIndex::toGlobal
(
    const labelUList& labels
) const
186
{
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
    return toGlobal(Pstream::myProcNo(), labels);
}


inline void Foam::globalIndex::inplaceToGlobal
(
    const label proci,
    labelList& labels
) const
{
    const label off = offsets_[proci];

    for (label& val : labels)
    {
        val += off;
    }
}


inline void Foam::globalIndex::inplaceToGlobal(labelList& labels) const
{
    inplaceToGlobal(Pstream::myProcNo(), labels);
209 210 211
}


212 213
inline Foam::label
Foam::globalIndex::toLocal(const label proci, const label i) const
214
{
215
    const label locali = i - offsets_[proci];
216

217
    if (locali < 0 || i >= offsets_[proci+1])
218
    {
219
        FatalErrorInFunction
220
            << "Global " << i << " does not belong on processor "
221
            << proci << nl << "Offsets:" << offsets_
222 223
            << abort(FatalError);
    }
224
    return locali;
225 226 227 228 229 230 231 232 233 234 235
}


inline Foam::label Foam::globalIndex::toLocal(const label i) const
{
    return toLocal(Pstream::myProcNo(), i);
}


inline Foam::label Foam::globalIndex::whichProcID(const label i) const
{
mattijs's avatar
mattijs committed
236
    if (i < 0 || i >= size())
237
    {
238
        FatalErrorInFunction
239 240 241 242 243
            << "Global " << i << " does not belong on any processor."
            << " Offsets:" << offsets_
            << abort(FatalError);
    }

mattijs's avatar
mattijs committed
244
    return findLower(offsets_, i+1);
245 246 247 248
}


// ************************************************************************* //