Alien  1.3.0
Developer documentation
Loading...
Searching...
No Matches
AbstractItemFamily.cc
1/*
2 * Copyright 2020 IFPEN-CEA
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 * SPDX-License-Identifier: Apache-2.0
17 */
18
19#include <algorithm>
20#include <unordered_map>
21
22#include <alien/utils/Precomp.h>
23
24#include "AbstractItemFamily.h"
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29namespace Alien
30{
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
35AbstractItemFamily::AbstractItemFamily(const AbstractItemFamily& family)
36: m_parallel_mng(family.m_parallel_mng)
37, m_trace_mng(family.m_trace_mng)
38, m_unique_ids(family.m_unique_ids)
39, m_owners(family.m_owners)
40, m_uid2lid(family.m_uid2lid)
41{}
42
43/*---------------------------------------------------------------------------*/
44AbstractItemFamily::AbstractItemFamily(ConstArrayView<Int64> uniqueIds,
45 ConstArrayView<Integer> owners,
46 IMessagePassingMng* parallel_mng,
47 ITraceMng* trace_mng)
48: m_parallel_mng(parallel_mng)
49, m_trace_mng(trace_mng)
50{
51 copy(m_unique_ids, uniqueIds);
52 copy(m_owners, owners);
53
54 for (Integer i = 0; i < uniqueIds.size(); ++i) {
55 m_uid2lid[uniqueIds[i]] = i;
56 }
57}
58
59AbstractItemFamily::AbstractItemFamily(ConstArrayView<Int64> uniqueIds,
60 ConstArrayView<Int64> ghost_uniqueIds,
61 ConstArrayView<Integer> ghost_owners,
62 IMessagePassingMng* parallel_mng,
63 ITraceMng* trace_mng)
64: m_parallel_mng(parallel_mng)
65, m_trace_mng(trace_mng)
66{
67 const Integer commRank = m_parallel_mng->commRank();
68 const Integer localSize = uniqueIds.size();
69 const Integer ghostSize = ghost_uniqueIds.size();
70
71 m_unique_ids.reserve(localSize + ghostSize);
72 m_owners.reserve(localSize + ghostSize);
73
74 // remise en tête des uids locaux associé à commRank
75 addRange(m_unique_ids, uniqueIds);
76 addRange(m_owners, commRank, localSize);
77 for (Integer ighost = 0; ighost < ghostSize; ++ighost) {
78 addRange(m_unique_ids, ghost_uniqueIds);
79 addRange(m_owners, ghost_owners);
80 }
81
82 for (Integer i = 0; i < uniqueIds.size(); ++i) {
83 m_uid2lid[uniqueIds[i]] = i;
84 }
85
86 for (Integer i = 0; i < ghost_uniqueIds.size(); ++i) {
87 m_uid2lid[ghost_uniqueIds[i]] = localSize + i;
88 }
89}
90
91/*---------------------------------------------------------------------------*/
92
93AbstractItemFamily::AbstractItemFamily(ConstArrayView<Int64> uniqueIds,
94 IMessagePassingMng* parallel_mng, [[maybe_unused]] ITraceMng* trace_mng)
95{
96
97 m_unique_ids.copy(uniqueIds);
98 m_owners.fill(parallel_mng->commRank());
99
100 for (Integer i = 0; i < uniqueIds.size(); ++i) {
101 m_uid2lid[uniqueIds[i]] = i;
102 }
103}
104
105/*---------------------------------------------------------------------------*/
106
107void AbstractItemFamily::uniqueIdToLocalId(
108ArrayView<Int32> localIds, ConstArrayView<Int64> uniqueIds) const
109{
110
111 for (Integer i = 0; i < uniqueIds.size(); ++i) {
112 auto iter = m_uid2lid.find(uniqueIds[i]);
113 if (iter == m_uid2lid.end()) {
114 throw Alien::FatalErrorException(A_FUNCINFO, "UniqueId not found");
115 }
116 else
117 localIds[i] = iter->second;
118 }
119}
120
121/*---------------------------------------------------------------------------*/
122
124AbstractItemFamily::item(Int32 localId) const
125{
126 return IAbstractFamily::Item(m_unique_ids[localId], m_owners[localId]);
127}
128
129/*---------------------------------------------------------------------------*/
130
132AbstractItemFamily::owners(ConstArrayView<Int32> localIds) const
133{
134 const Integer size = localIds.size();
135 SharedArray<Integer> result(size);
136 for (Integer i = 0; i < size; ++i) {
137 result[i] = m_owners[localIds[i]];
138 }
139 return SafeConstArrayView<Integer>(result);
140}
141
142/*---------------------------------------------------------------------------*/
143
145AbstractItemFamily::uids(ConstArrayView<Int32> localIds) const
146{
147 const Integer size = localIds.size();
148 SharedArray<Int64> result(size);
149 for (Integer i = 0; i < size; ++i) {
150 result[i] = m_unique_ids[localIds[i]];
151 }
152 return SafeConstArrayView<Int64>(result);
153}
154
155/*---------------------------------------------------------------------------*/
156
159{
160 SharedArray<Int32> local_ids(m_unique_ids.size());
161 for (Integer i = 0; i < m_unique_ids.size(); ++i)
162 local_ids[i] = i;
163 return SafeConstArrayView<Int32>(local_ids);
164}
165
166/*---------------------------------------------------------------------------*/
167/*---------------------------------------------------------------------------*/
168AbstractFamily::AbstractFamily(const AbstractFamily& family)
169: m_parallel_mng(family.m_parallel_mng)
170, m_trace_mng(family.m_trace_mng)
171, m_unique_ids(family.m_unique_ids)
172, m_owners(family.m_owners)
173, m_uid2lid(family.m_uid2lid)
174{}
175
176/*---------------------------------------------------------------------------*/
177AbstractFamily::AbstractFamily(ConstArrayView<Int64> uniqueIds,
178 ConstArrayView<Integer> owners,
179 IMessagePassingMng* parallel_mng,
180 ITraceMng* trace_mng)
181: m_parallel_mng(parallel_mng)
182, m_trace_mng(trace_mng)
183{
184 copy(m_unique_ids, uniqueIds);
185 copy(m_owners, owners);
186
187 for (Integer i = 0; i < uniqueIds.size(); ++i) {
188 m_uid2lid[uniqueIds[i]] = i;
189 }
190}
191
192AbstractFamily::AbstractFamily(ConstArrayView<Int64> uniqueIds,
193 ConstArrayView<Int64> ghost_uniqueIds,
194 ConstArrayView<Integer> ghost_owners,
195 IMessagePassingMng* parallel_mng,
196 ITraceMng* trace_mng)
197: m_parallel_mng(parallel_mng)
198, m_trace_mng(trace_mng)
199{
200 const Integer commRank = m_parallel_mng->commRank();
201 const Integer localSize = uniqueIds.size();
202 const Integer ghostSize = ghost_uniqueIds.size();
203
204 m_unique_ids.reserve(localSize + ghostSize);
205 m_owners.reserve(localSize + ghostSize);
206
207 // remise en tête des uids locaux associé à commRank
208 addRange(m_unique_ids, uniqueIds);
209 addRange(m_owners, commRank, localSize);
210 for (Integer ighost = 0; ighost < ghostSize; ++ighost) {
211 addRange(m_unique_ids, ghost_uniqueIds);
212 addRange(m_owners, ghost_owners);
213 }
214
215 for (Integer i = 0; i < uniqueIds.size(); ++i) {
216 m_uid2lid[uniqueIds[i]] = i;
217 }
218
219 for (Integer i = 0; i < ghost_uniqueIds.size(); ++i) {
220 m_uid2lid[ghost_uniqueIds[i]] = localSize + i;
221 }
222}
223
224/*---------------------------------------------------------------------------*/
225
226AbstractFamily::AbstractFamily(ConstArrayView<Int64> uniqueIds,
227 IMessagePassingMng* parallel_mng,
228 ITraceMng* trace_mng)
229: m_parallel_mng(parallel_mng)
230, m_trace_mng(trace_mng)
231{
232 copy(m_unique_ids, uniqueIds);
233 m_owners.resize(uniqueIds.size());
234 m_owners.fill(parallel_mng->commRank());
235
236 for (Integer i = 0; i < uniqueIds.size(); ++i) {
237 m_uid2lid[uniqueIds[i]] = i;
238 }
239}
240/*---------------------------------------------------------------------------*/
241
242void AbstractFamily::uniqueIdToLocalId(
243ArrayView<Int32> localIds, ConstArrayView<Int64> uniqueIds) const
244{
245
246 for (Integer i = 0; i < uniqueIds.size(); ++i) {
247 auto iter = m_uid2lid.find(uniqueIds[i]);
248 if (iter == m_uid2lid.end()) {
249 localIds[i] = -1;
250 throw Alien::FatalErrorException(A_FUNCINFO, "UniqueId not found");
251 }
252 else
253 localIds[i] = iter->second;
254 }
255}
256
257/*---------------------------------------------------------------------------*/
258
260AbstractFamily::item(Int32 localId) const
261{
262 return IIndexManager::IAbstractFamily::Item(m_unique_ids[localId], m_owners[localId]);
263}
264
265/*---------------------------------------------------------------------------*/
266
267Arccore::SharedArray<Arccore::Integer>
268AbstractFamily::owners(ConstArrayView<Int32> localIds) const
269{
270 const Integer size = localIds.size();
271 SharedArray<Integer> result(size);
272 for (Integer i = 0; i < size; ++i) {
273 result[i] = m_owners[localIds[i]];
274 }
275 return result;
276}
277
278/*---------------------------------------------------------------------------*/
279
280Arccore::SharedArray<Arccore::Int64>
281AbstractFamily::uids(ConstArrayView<Int32> localIds) const
282{
283 const Integer size = localIds.size();
284 SharedArray<Int64> result(size);
285 for (Integer i = 0; i < size; ++i) {
286 result[i] = m_unique_ids[localIds[i]];
287 }
288 return result;
289}
290
291/*---------------------------------------------------------------------------*/
292
293Arccore::SharedArray<Arccore::Int32>
295{
296 SharedArray<Int32> local_ids(m_unique_ids.size());
297 for (Integer i = 0; i < m_unique_ids.size(); ++i)
298 local_ids[i] = i;
299 return local_ids;
300}
301
302} // namespace Alien
303
304/*---------------------------------------------------------------------------*/
305/*---------------------------------------------------------------------------*/
Arccore::SharedArray< Arccore::Int32 > allLocalIds() const override
Retourne l'ensemble des identifiants locaux de la famille.
SafeConstArrayView< Int32 > allLocalIds() const override
Local ids of this family members.
IAbstractFamily::Item item(Int32 localId) const override
Give back an Item from its local id.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Definition BackEnd.h:17