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

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

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

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

#include "ListOps.H"
27
#include "labelRange.H"
28

29
30
// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //

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


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


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


65
66
// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //

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


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


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


85
inline Foam::label Foam::globalIndex::offset(const label proci) const
86
{
87
    return offsets_[proci];
88
89
90
}


91
92
93
94
95
96
97
98
99
100
101
102
inline Foam::label Foam::globalIndex::localStart(const label proci) const
{
    return offsets_[proci];
}


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


103
inline Foam::label Foam::globalIndex::localSize(const label proci) const
mattijs's avatar
mattijs committed
104
{
105
    return offsets_[proci+1] - offsets_[proci];
mattijs's avatar
mattijs committed
106
107
108
}


mattijs's avatar
mattijs committed
109
110
111
112
113
114
inline Foam::label Foam::globalIndex::localSize() const
{
    return localSize(Pstream::myProcNo());
}


115
116
117
118
119
120
121
122
123
124
125
126
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());
}


127
128
inline Foam::label Foam::globalIndex::size() const
{
129
    return offsets_.last();
130
131
132
}


133
134
135
136
137
138
139
140
141
142
143
144
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);
}


145
146
inline Foam::label Foam::globalIndex::toGlobal
(
147
    const label proci,
148
149
150
    const label i
) const
{
151
    return i + offsets_[proci];
152
153
154
}


155
156
inline Foam::label Foam::globalIndex::toGlobal(const label i) const
{
157
    return toGlobal(Pstream::myProcNo(), i);
158
159
}

160

161
162
163
164
165
inline Foam::labelList Foam::globalIndex::toGlobal
(
    const label proci,
    const labelUList& labels
) const
166
{
167
168
169
170
    labelList result(labels);
    inplaceToGlobal(proci, result);

    return result;
171
172
173
}


174
175
176
177
inline Foam::labelList Foam::globalIndex::toGlobal
(
    const labelUList& labels
) const
178
{
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
    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);
201
202
203
}


204
205
inline Foam::label
Foam::globalIndex::toLocal(const label proci, const label i) const
206
{
207
    const label locali = i - offsets_[proci];
208

209
    if (locali < 0 || i >= offsets_[proci+1])
210
    {
211
        FatalErrorInFunction
212
            << "Global " << i << " does not belong on processor "
213
            << proci << nl << "Offsets:" << offsets_
214
215
            << abort(FatalError);
    }
216
    return locali;
217
218
219
220
221
222
223
224
225
226
227
}


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
228
    if (i < 0 || i >= size())
229
    {
230
        FatalErrorInFunction
231
232
233
234
235
            << "Global " << i << " does not belong on any processor."
            << " Offsets:" << offsets_
            << abort(FatalError);
    }

mattijs's avatar
mattijs committed
236
    return findLower(offsets_, i+1);
237
238
239
240
}


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