42DefaultAbstractFamily::DefaultAbstractFamily(ConstArrayView<Int64> uniqueIds,
43 ConstArrayView<Integer> owners,
44 IMessagePassingMng* parallel_mng)
45: m_parallel_mng(parallel_mng)
47 copy(m_unique_ids, uniqueIds);
48 copy(m_owners, owners);
53DefaultAbstractFamily::DefaultAbstractFamily(ConstArrayView<Int64> uniqueIds,
54 IMessagePassingMng* parallel_mng)
55: m_parallel_mng(parallel_mng)
57 const Integer commSize = m_parallel_mng->commSize();
58 const Integer commRank = m_parallel_mng->commRank();
59 const Integer localSize = uniqueIds.size();
60 UniqueArray<Integer> sizes(commSize);
61 Arccore::MessagePassing::mpAllGather(
62 m_parallel_mng, ConstArrayView<Integer>(1, &localSize), sizes);
63 UniqueArray<Integer> starts(commSize + 1);
65 for (Integer i = 0; i < commSize; ++i)
66 starts[i + 1] = starts[i] + sizes[i];
68 UniqueArray<Int64> allUniqueIds;
69 Arccore::MessagePassing::mpAllGatherVariable(m_parallel_mng, uniqueIds, allUniqueIds);
70 m_unique_ids.reserve(allUniqueIds.size());
71 m_owners.reserve(allUniqueIds.size());
74 addRange(m_unique_ids, subConstView(allUniqueIds, starts[commRank], sizes[commRank]));
75 addRange(m_owners, commRank, sizes[commRank]);
76 for (Integer iRank = 0; iRank < commSize; ++iRank) {
77 if (iRank != commRank) {
78 addRange(m_unique_ids, subConstView(allUniqueIds, starts[iRank], sizes[iRank]));
79 addRange(m_owners, iRank, sizes[iRank]);
84 ALIEN_ASSERT((m_unique_ids.size() == allUniqueIds.size()), (
"Inconsistant sizes"));
85 ALIEN_ASSERT((m_owners.size() == allUniqueIds.size()), (
"Inconsistant sizes"));
86 for (Integer i = 0; i < localSize; ++i) {
87 ALIEN_ASSERT((m_unique_ids[i] == uniqueIds[i]), (
"Bad local numbering"));
88 ALIEN_ASSERT((m_owners[i] == commRank), (
"Bad local owner"));
92 std::sort(allUniqueIds.begin(), allUniqueIds.end());
93 for (Integer i = 1; i < allUniqueIds.size(); ++i)
94 ALIEN_ASSERT((allUniqueIds[i - 1] != allUniqueIds[i]), (
"Duplicated uid"));