8#include "BasicIndexManager.h"
17#include <arccore/collections/Array2.h>
18#include <arccore/message_passing/ISerializeMessageList.h>
19#include <arccore/message_passing/Messages.h>
21#include <arccore/trace/ITraceMng.h>
23#include <alien/utils/Precomp.h>
46 const Arccore::Integer KIND_SHIFT = 32;
58 friend class BasicIndexManager;
63 const Integer creationIndex, BasicIndexManager*
manager, Integer kind)
64 : m_creation_index(creationIndex)
69 , m_is_defined(family->maxLocalId(), false)
76 Arccore::ConstArrayView<Arccore::Integer>
getOwnIndexes()
const override
86 Arccore::ConstArrayView<Arccore::Integer>
getAllIndexes()
const override
88 return Arccore::ConstArrayView<Arccore::Integer>(
m_all_indices);
93 return Arccore::ConstArrayView<Integer>(
m_all_items);
96 void addTag(
const String& tagname,
const String& tagvalue)
override
98 m_tags[tagname] = tagvalue;
101 void removeTag(
const String& tagname)
override { m_tags.erase(tagname); }
103 bool hasTag(
const String& tagname)
override
105 return m_tags.find(tagname) != m_tags.end();
108 String tagValue(
const String& tagname)
override
110 auto i = m_tags.find(tagname);
111 if (i == m_tags.end())
116 String
getName()
const override {
return m_name; }
120 ALIEN_ASSERT((m_kind >= 0), (
"Unexpected negative kind"));
121 if (m_kind < KIND_SHIFT)
124 return m_kind % KIND_SHIFT;
144 Integer ghost_i = m_size;
145 for (
const auto& i : entryIndex)
146 if (i.m_entry ==
this) {
147 const Integer local_id = i.m_localid;
148 const Integer index = i.m_index;
149 const bool is_own = m_manager->isOwn(i);
162 ALIEN_ASSERT((own_i == ghost_i), (
"Not merged insertion"));
176 void reserveLid(
const Integer count)
178 m_defined_lids.reserve(m_defined_lids.size() + count);
179#ifdef SPLIT_CONTAINER
180 m_defined_indexes.reserve(m_defined_indexes.size() + count);
183 bool isDefinedLid(
const Integer localId)
const {
return m_is_defined[localId]; }
185 void defineLid(
const Integer localId,
const Integer pos)
187 m_is_defined[localId] =
true;
188#ifdef SPLIT_CONTAINER
189 m_defined_lids.add(localId);
190 m_defined_indexes.add(pos);
192 m_defined_lids.add(std::make_pair(localId, pos));
196 [[maybe_unused]]
void undefineLid(
const Integer localId)
198 m_is_defined[localId] =
false;
199 for (Integer i = 0; i < m_defined_lids.size(); ++i) {
200#ifdef SPLIT_CONTAINER
201 if (m_defined_lids[i] == localId)
203 if (m_defined_lids[i].first == localId)
206 m_defined_lids[i] = m_defined_lids.back();
207 m_defined_lids.resize(m_defined_lids.size() - 1);
208#ifdef SPLIT_CONTAINER
209 m_defined_indexes[i] = m_defined_indexes.back();
210 m_defined_indexes.resize(m_defined_lids.size() - 1);
214 throw FatalErrorException(
215 A_FUNCINFO,
"Inconsistent state : cannot find id to remove");
218#ifdef SPLIT_CONTAINER
219 const UniqueArray<Integer>& definedLids()
const
221 return m_defined_lids;
223 const UniqueArray<Integer>& definedIndexes()
const {
return m_defined_indexes; }
225 const UniqueArray<std::pair<Integer, Integer>>& definedLids()
const
227 return m_defined_lids;
231 void freeDefinedLids()
233#ifdef SPLIT_CONTAINER
234 m_defined_lids.dispose();
235 m_defined_indexes.dispose();
237 m_defined_lids.dispose();
239 std::vector<bool>().swap(m_is_defined);
243 std::map<String, String> m_tags;
244 Integer m_creation_index;
245 BasicIndexManager* m_manager;
247 const IAbstractFamily* m_family;
248 const Integer m_kind;
250 std::vector<bool> m_is_defined;
251#ifdef SPLIT_CONTAINER
252 UniqueArray<Integer> m_defined_lids;
253 UniqueArray<Integer> m_defined_indexes;
255 UniqueArray<std::pair<Integer, Integer>> m_defined_lids;
268 Integer getCreationIndex()
const {
return m_creation_index; }
276 EntrySendRequest() =
default;
278 ~EntrySendRequest() =
default;
280 EntrySendRequest(
const EntrySendRequest& esr) =
default;
283 Arccore::Ref<Arccore::MessagePassing::ISerializeMessage> comm;
286 void operator=(
const EntrySendRequest&) =
delete;
293 EntryRecvRequest() =
default;
295 ~EntryRecvRequest() =
default;
298 explicit EntryRecvRequest(
const EntrySendRequest& err ALIEN_UNUSED_PARAM) {}
300 Arccore::Ref<Arccore::MessagePassing::ISerializeMessage> comm;
301 UniqueArray<Int64> ids;
303 void operator=(
const EntryRecvRequest&) =
delete;
311 EntrySet::const_iterator m_iter, m_end;
314 explicit MyEntryEnumeratorImpl(
const EntrySet& entries)
315 : m_iter(entries.begin())
316 , m_end(entries.end())
319 void moveNext()
override { ++m_iter; }
321 [[nodiscard]]
bool hasNext()
const override {
return m_iter != m_end; }
323 [[nodiscard]]
EntryImpl* get()
const override {
return m_iter->second; }
355 m_state = Initialized;
357 m_local_entry_count = 0;
358 m_global_entry_count = 0;
359 m_global_entry_offset = 0;
360 m_local_removed_entry_count = 0;
361 m_global_removed_entry_count = 0;
364 for (
auto& i : m_entry_set) {
383BasicIndexManager::buildEntry(
386 if (m_state != Initialized)
387 throw FatalErrorException(A_FUNCINFO,
"Inconsistent state");
390 std::pair<EntrySet::iterator, bool> lookup =
391 m_entry_set.insert(EntrySet::value_type(name, (MyEntryImpl*)
nullptr));
393 auto* entry =
new MyEntryImpl(name, family,
m_creation_index++,
this, kind);
394 lookup.first->second = entry;
398 throw FatalErrorException(A_FUNCINFO,
"Already defined entry");
399 return Entry(
nullptr);
408 auto lookup = m_entry_set.find(name);
409 if (lookup != m_entry_set.end()) {
410 return Entry(lookup->second);
413 throw FatalErrorException(A_FUNCINFO,
"Undefined entry requested");
414 return Entry(
nullptr);
420void BasicIndexManager::defineIndex(
421const Entry& entry, ConstArrayView<Integer> localIds)
423 if (m_state != Initialized)
424 throw FatalErrorException(A_FUNCINFO,
"Inconsistent state");
426 ALIEN_ASSERT((entry.manager() ==
this), (
"Incompatible entry from another manager"));
427 auto* myEntry =
dynamic_cast<MyEntryImpl*
>(entry.internal());
430 SharedArray<Integer> owners = family.
owners(localIds);
431 myEntry->reserveLid(localIds.size());
432 for (Integer i = 0, is = localIds.size(); i < is; ++i) {
433 const Integer localId = localIds[i];
435 if (not myEntry->isDefinedLid(localId)) {
438 localId, +(m_local_removed_entry_count + m_local_entry_count++));
443 localId, -(m_global_removed_entry_count + (++m_global_entry_count)));
455 if (m_state != Initialized)
456 throw FatalErrorException(A_FUNCINFO,
"Inconsistent state");
458 Integer total_size = 0;
459 for (
auto& i : m_entry_set) {
461 total_size += entry->definedLids().size();
466 entry_index.reserve(total_size);
468 for (
auto& i : m_entry_set) {
471 const Integer creation_index = entry->getCreationIndex();
473 const Integer entry_kind = entry->
getKind();
474#ifdef SPLIT_CONTAINER
475 const UniqueArray<Integer>& lids = entry->definedLids();
476 const UniqueArray<Integer>& indexes = entry->definedIndexes();
477 ConstArrayView<Integer> owners = family.
owners(lids);
478 ConstArrayView<Int64> uids = family.
uids(lids);
480 const UniqueArray<std::pair<Integer, Integer>>& lids = entry->definedLids();
483 for (Integer
id = 0, is = lids.size();
id < is; ++
id) {
484#ifdef SPLIT_CONTAINER
485 const Integer item_lid = lids[id];
486 const Integer item_index = indexes[id];
487 const Integer item_owner = owners[id];
488 const Int64 item_uid = uids[id];
490 entry, item_lid, entry_kind, item_uid, item_index, creation_index, item_owner));
492 const Integer localid = lids[id].first;
495 item.uniqueId(), lids[
id].second, creation_index, item.owner()));
498 entry->freeDefinedLids();
504 ((Integer)entry_index.size() == m_local_entry_count + m_global_entry_count),
505 (
"Inconsistent global size"));
507 if (m_parallel_mng->commSize() > 1)
508 parallel_prepare(entry_index);
510 sequential_prepare(entry_index);
513 for (
auto& i : m_entry_set) {
514 i.second->finalize(entry_index);
518 m_trace->info() <<
"Entry ordering :";
519 for (
auto& i : m_entry_set) {
520 m_trace->info() <<
"\tEntry '" << i.first <<
"' placed at rank "
521 << i.second->getCreationIndex() <<
" with "
522 << i.second->getOwnLocalIds().size() <<
" local / "
523 << i.second->getAllLocalIds().size() <<
" global indexes ";
525 m_trace->info() <<
"Total local Entry indexes = " << m_local_entry_count;
533void BasicIndexManager::parallel_prepare(EntryIndexMap& entry_index)
535 ALIEN_ASSERT((m_parallel_mng->commSize() > 1), (
"Parallel mode expected"));
547 Alien::Ref<ISerializeMessageList> messageList;
550 typedef std::map<EntryImpl*, EntrySendRequest> SendRequestByEntry;
551 typedef std::map<Integer, SendRequestByEntry> SendRequests;
552 SendRequests sendRequests;
555 for (
const auto& entryIndex : entry_index) {
556 MyEntryImpl* entryImpl = entryIndex.m_entry;
557 const Integer item_owner = entryIndex.m_owner;
559 sendRequests[item_owner][entryImpl].count++;
564 messageList = Arccore::MessagePassing::mpCreateSerializeMessageListRef(m_parallel_mng);
566 UniqueArray<Integer> sendToDomains(2 * m_parallel_mng->commSize(), 0);
568 for (
auto& sendRequest : sendRequests) {
569 const Integer destDomainId = sendRequest.first;
570 SendRequestByEntry& requests = sendRequest.second;
571 for (
auto& j : requests) {
574 const String nameString = entryImpl->
getName();
577 sendToDomains[2 * destDomainId + 0] += 1;
578 sendToDomains[2 * destDomainId + 1] += request.count;
581 request.comm = messageList->createAndAddMessage(MessageRank(destDomainId),
582 Arccore::MessagePassing::ePointToPointMessageType::MsgSend);
584 auto sbuf = request.comm->serializer();
585 sbuf->setMode(Alien::ISerializer::ModeReserve);
586 sbuf->reserve(nameString);
587 sbuf->reserveInteger(1);
588 sbuf->reserve(Alien::ISerializer::DT_Int64, request.count);
589 sbuf->allocateBuffer();
590 sbuf->setMode(Alien::ISerializer::ModePut);
591 sbuf->put(nameString);
592 sbuf->put(request.count);
597 for (
const auto& entryIndex : entry_index) {
599 const Integer item_owner = entryIndex.m_owner;
600 const Int64 item_uid = entryIndex.m_uid;
602 sendRequests[item_owner][entryImpl].comm->serializer()->put(item_uid);
606 UniqueArray<Integer> recvFromDomains(2 * m_parallel_mng->commSize());
607 Arccore::MessagePassing::mpAllToAll(m_parallel_mng, sendToDomains, recvFromDomains, 2);
610 typedef std::list<EntryRecvRequest> RecvRequests;
611 RecvRequests recvRequests;
613 for (Integer isd = 0, nsd = m_parallel_mng->commSize(); isd < nsd; ++isd) {
614 Integer recvCount = recvFromDomains[2 * isd + 0];
615 while (recvCount-- > 0) {
616 auto recvMsg = messageList->createAndAddMessage(MessageRank(isd),
617 Arccore::MessagePassing::ePointToPointMessageType::MsgReceive);
620 recvRequest.comm = recvMsg;
625 messageList->processPendingMessages();
626 messageList->waitMessages(Arccore::MessagePassing::WaitAll);
630 messageList = Arccore::MessagePassing::mpCreateSerializeMessageListRef(m_parallel_mng);
633 for (
auto& recvRequest : recvRequests) {
638 auto sbuf = recvRequest.comm->serializer();
639 sbuf->setMode(Alien::ISerializer::ModeGet);
641 sbuf->get(nameString);
642 uidCount = sbuf->getInteger();
643 recvRequest.ids.resize(uidCount);
644 sbuf->getSpan(recvRequest.ids);
645 ALIEN_ASSERT((uidCount == recvRequest.ids.size()), (
"Inconsistency detected"));
654 auto lookup = m_entry_set.find(nameString);
656 if (lookup == m_entry_set.end())
657 throw FatalErrorException(
"Non local Entry Requested : degenerated system ?");
660 const Integer current_creation_index = currentEntry->getCreationIndex();
663 ArrayView<Int64> ids = recvRequest.ids;
666 const Integer entry_kind = currentEntry->getKind();
667 UniqueArray<Int32> lids(ids.size());
668 family.uniqueIdToLocalId(lids, ids);
671 SharedArray<Integer> owners = family.owners(lids).clone();
672 for (Integer j = 0; j < uidCount; ++j) {
673 const Integer current_item_lid = lids[j];
674 const Int64 current_item_uid = ids[j];
675 const Integer current_item_owner = owners[j];
678 throw FatalErrorException(
"Non local EntryIndex requested");
681 current_item_uid, 0, current_creation_index, current_item_owner);
683 auto lookup2 = std::lower_bound(
686 if ((lookup2 == entry_index.end()) || !(*lookup2 == lookup_entry))
687 throw FatalErrorException(
"Not locally defined entry requested");
691 ids[j] = lookup2->m_index;
696 auto dest = recvRequest.comm->destination();
697 auto orig = recvRequest.comm->source();
698 recvRequest.comm.reset();
699 recvRequest.comm = messageList->createAndAddMessage(dest, Arccore::MessagePassing::ePointToPointMessageType::MsgSend);
701 auto sbuf = recvRequest.comm->serializer();
702 sbuf->setMode(Alien::ISerializer::ModeReserve);
703 sbuf->reserve(nameString);
704 sbuf->reserveInteger(1);
705 sbuf->reserveInteger(uidCount);
706 sbuf->allocateBuffer();
707 sbuf->setMode(Alien::ISerializer::ModePut);
708 sbuf->put(nameString);
718 UniqueArray<Integer> allLocalSizes(m_parallel_mng->commSize());
719 UniqueArray<Integer> myLocalSize(1);
720 myLocalSize[0] = m_local_entry_count;
722 Arccore::MessagePassing::mpAllGather(m_parallel_mng, myLocalSize, allLocalSizes);
724 Alien::UniqueArray<Integer> entry_reindex(m_local_entry_count + m_global_entry_count);
725 entry_reindex.fill(-1);
728 reserveEntries(entry_index);
731 m_global_entry_offset = 0;
732 for (Integer i = 0; i < m_parallel_mng->commRank(); ++i) {
733 m_global_entry_offset += allLocalSizes[i];
738 Integer currentEntryIndex = m_global_entry_offset;
739 for (
auto& i : entry_index) {
741 ALIEN_ASSERT((entryIndex.m_entry !=
nullptr), (
"Unexpected null entry"));
742 const Integer item_owner = entryIndex.m_owner;
744 const Integer newIndex = currentEntryIndex++;
745 entry_reindex[i.m_index + m_global_entry_count] = newIndex;
746 i.m_index = newIndex;
752 for (
auto& recvRequest : recvRequests) {
753 auto sbuf = recvRequest.comm->serializer();
754 auto& ids = recvRequest.ids;
755 for (Integer j = 0; j < ids.size(); ++j) {
757 entry_reindex[ids[j] + m_global_entry_count]);
762 typedef std::list<Alien::Ref<Alien::ISerializeMessage>> ReturnedRequests;
763 ReturnedRequests returnedRequests;
770 typedef std::map<Integer, EntrySendRequest*> SubFastReturnMap;
771 typedef std::map<String, SubFastReturnMap> FastReturnMap;
772 FastReturnMap fastReturnMap;
775 for (
auto& sendRequest : sendRequests) {
776 const Integer destDomainId = sendRequest.first;
777 SendRequestByEntry& requests = sendRequest.second;
778 for (
auto& j : requests) {
781 const String nameString = entryImpl->
getName();
786 auto msg = messageList->createAndAddMessage(MessageRank(destDomainId),
787 Arccore::MessagePassing::ePointToPointMessageType::MsgReceive);
789 returnedRequests.push_back(msg);
791 fastReturnMap[nameString][destDomainId] = &request;
796 messageList->processPendingMessages();
797 messageList->waitMessages(Arccore::MessagePassing::WaitAll);
802 for (
auto& returnedRequest : returnedRequests) {
803 auto& message = returnedRequest;
804 auto origDomainId = message->destination().value();
805 auto sbuf = message->serializer();
806 sbuf->setMode(Alien::ISerializer::ModeGet);
808 sbuf->get(nameString);
810 (fastReturnMap[nameString][origDomainId] !=
nullptr), (
"Inconsistency detected"));
815 const Integer idCount = sbuf->getInteger();
816 ALIEN_ASSERT((request.count == idCount), (
"Inconsistency detected"));
821 for (
auto& i : entry_index) {
823 const Integer item_owner = entryIndex.m_owner;
825 EntryImpl* entryImpl = entryIndex.m_entry;
827 ALIEN_ASSERT((request.count > 0), (
"Unexpected empty request"));
829 auto sbuf = request.comm->serializer();
830 const Integer newIndex = sbuf->getInteger();
832 entry_reindex[i.m_index + m_global_entry_count] = newIndex;
833 i.m_index = newIndex;
838 m_global_entry_count = 0;
839 for (Integer i = 0; i < m_parallel_mng->commSize(); ++i) {
840 m_global_entry_count += allLocalSizes[i];
846void BasicIndexManager::sequential_prepare(EntryIndexMap& entry_index)
848 ALIEN_ASSERT((m_parallel_mng->commSize() <= 1), (
"Sequential mode expected"));
849 ALIEN_ASSERT((m_global_entry_count == 0),
850 (
"Unexpected global entries (%d)", m_global_entry_count));
859 UniqueArray<Integer> entry_reindex(m_local_entry_count + m_local_removed_entry_count);
860 entry_reindex.fill(-1);
863 reserveEntries(entry_index);
867 m_global_entry_offset = 0;
870 Integer currentEntryIndex = m_global_entry_offset;
871 for (
auto& i : entry_index) {
872 ALIEN_ASSERT((i.m_entry !=
nullptr), (
"Unexpected null entry"));
874 (i.m_owner ==
m_local_owner), (
"Item cannot be non-local for sequential mode"));
876 const Integer newIndex = currentEntryIndex++;
877 entry_reindex[i.m_index + m_global_entry_count] = newIndex;
878 i.m_index = newIndex;
881 m_global_entry_count = m_local_entry_count;
886void BasicIndexManager::reserveEntries(
const EntryIndexMap& entry_index)
889 std::map<const EntryImpl*, Integer> count_table;
890 for (
const auto& i : entry_index) {
892 count_table[entryImpl]++;
896 for (
auto& i : m_entry_set) {
898 entry->
reserve(count_table[entry]);
913 if (m_state != Prepared)
914 throw FatalErrorException(A_FUNCINFO,
"Inconsistent state");
916 ALIEN_ASSERT((entry.
manager() ==
this), (
"Incompatible entry from another manager"));
918 ALIEN_ASSERT((en !=
nullptr), (
"Unexpected null entry"));
921 const ConstArrayView<Integer> allIndices = en->getAllIndexes();
922 const ConstArrayView<Integer> allLocalIds = en->getAllLocalIds();
923 const Integer size = allIndices.size();
924 for (Integer i = 0; i < size; ++i)
925 allIds[allLocalIds[i]] = allIndices[i];
934 if (m_state != Prepared)
935 throw FatalErrorException(A_FUNCINFO,
"Inconsistent state");
937 Integer max_family_size = 0;
938 for (Integer entry = 0; entry < entries.size(); ++entry) {
941 (entries[entry].manager() ==
this), (
"Incompatible entry from another manager"));
942 auto* en =
dynamic_cast<MyEntryImpl*
>(entries[entry].internal());
943 ALIEN_ASSERT((en !=
nullptr), (
"Unexpected null entry"));
945 max_family_size = std::max(max_family_size, family.
maxLocalId());
948 UniqueArray2<Integer> allIds(max_family_size, entries.size());
951 for (Integer entry = 0; entry < entries.size(); ++entry) {
952 auto* en =
dynamic_cast<MyEntryImpl*
>(entries[entry].internal());
953 const ConstArrayView<Integer> allIndices = en->
getAllIndexes();
954 const ConstArrayView<Integer> allLocalIds = en->getAllLocalIds();
955 const Integer size = allIndices.size();
956 for (Integer i = 0; i < size; ++i)
957 allIds[allLocalIds[i]][entry] = allIndices[i];
967 if (m_state != Prepared)
968 throw FatalErrorException(A_FUNCINFO,
"Inconsistent state");
980 if (m_state != Prepared)
981 throw FatalErrorException(A_FUNCINFO,
"Inconsistent state");
983 return m_global_entry_count;
991 if (m_state != Prepared)
992 throw FatalErrorException(A_FUNCINFO,
"Inconsistent state");
994 return m_global_entry_offset;
1002 if (m_state != Prepared)
1003 throw FatalErrorException(A_FUNCINFO,
"Inconsistent state");
1005 return m_local_entry_count;
1018bool BasicIndexManager::EntryIndexComparator::operator()(
1022 const MyEntryImpl* aEntry = a.m_entry;
1023 const MyEntryImpl* bEntry = b.m_entry;
1024 if (a.m_kind != b.m_kind)
1025 return a.m_kind < b.m_kind;
1026 else if (a.m_uid != b.m_uid)
1027 return a.m_uid < b.m_uid;
1029 return aEntry->getCreationIndex() < bEntry->getCreationIndex();
1035IIndexManager::ScalarIndexSet
1037 ConstArrayView<Integer> localIds,
1038 const IAbstractFamily& family)
1040 ScalarIndexSet en = buildEntry(name, &family, addNewAbstractFamily(&family));
1041 defineIndex(en, localIds);
1047IIndexManager::ScalarIndexSet
1050 UniqueArray<Int32> localIds = family.allLocalIds();
1051 Entry en = buildEntry(name, &family, addNewAbstractFamily(&family));
1052 defineIndex(en, localIds.view());
1058IIndexManager::VectorIndexSet
1060 ConstArrayView<Integer> localIds,
1063 VectorIndexSet ens(n);
1064 for (Integer i = 0; i < n; ++i) {
1065 ens[i] = buildEntry(
1066 String::format(
"{0}[{1}]", name, i), &family, addNewAbstractFamily(&family));
1067 defineIndex(ens[i], localIds);
1074IIndexManager::VectorIndexSet
1078 UniqueArray<Int32> localIds = family.allLocalIds();
1080 VectorIndexSet ens(n);
1081 for (Integer i = 0; i < n; ++i) {
1082 ens[i] = buildEntry(
1083 String::format(
"{0}[{1}]", name, i), &family, addNewAbstractFamily(&family));
1084 defineIndex(ens[i], localIds.view());
1097 throw FatalErrorException(A_FUNCINFO,
"Already known as kept alive abstract family");
1101 for (
auto& i : m_entry_set) {
1104 entry->resetFamily(new_family);
1116 ALIEN_ASSERT((newKind < KIND_SHIFT), (
"Unexpected kind overflow"));
1119 std::shared_ptr<IAbstractFamily>();
1125 return finder->second;
Squelette de l'implementation locale de Entry La vraie implémentation est MyAbstractEntryImpl....
Arccore::ConstArrayView< Integer > getAllLocalIds() const override
Retourne la liste des Items de l'Entry (own + ghost).
const IAbstractFamily & getFamily() const override
Retourne la famille abstraite de l'Entry.
void finalize(const EntryIndexMap &entryIndex)
Fige les données de l'entry (fin de phase prepare).
UniqueArray< Integer > m_all_indices
Integer getKind() const override
Retourne le type de support de l'Entry.
IIndexManager * manager() const override
Référentiel du manager associé
Arccore::ConstArrayView< Arccore::Integer > getAllIndexes() const override
Retourne la liste des Index de l'Entry (own + ghost).
Arccore::ConstArrayView< Arccore::Integer > getOwnLocalIds() const override
Retourne la liste des Items de l'Entry.
String getName() const override
Retourne le nom de l'entrée.
void reserve(const Integer n)
Préparation des buffers d'indices et d'items.
Arccore::ConstArrayView< Arccore::Integer > getOwnIndexes() const override
Retourne la liste des Index de l'Entry.
MyEntryImpl(const String &name, const IAbstractFamily *family, const Integer creationIndex, BasicIndexManager *manager, Integer kind)
Constructeur par défaut.
UniqueArray< Integer > m_all_items
LocalIds des items gérés par cette entrée rangés own puis ghost.
Integer m_own_size
Nombre d'items own dans les tableaux m_all_*.
std::map< Arccore::String, MyEntryImpl * > EntrySet
Table des Entry connues localement.
Arccore::UniqueArray< Arccore::Integer > getIndexes(const ScalarIndexSet &entry) const override
Fournit une table de translation indexé par les items.
void keepAlive(const IAbstractFamily *family) override
Permet de gérer la mort d'une famille associée à l'index-manager.
VectorIndexSet buildVectorIndexSet(const Arccore::String &name, Arccore::IntegerConstArrayView localIds, const IIndexManager::IAbstractFamily &family, Arccore::Integer n) override
Construit une nouvelle entrée vectoriellesur un ensemble d'entités abstraites.
Arccore::Integer minLocalIndex() const override
Retourne l'indice minimum local.
void setTraceMng(Alien::ITraceMng *traceMng) override
Définit le gestionnaire de trace.
Arccore::Integer m_abstract_family_base_kind
Famille des familles abstraites associées aux familles du maillage.
std::map< const IAbstractFamily *, Arccore::Integer > m_abstract_family_to_kind_map
IAbstractFamily extérieures.
Arccore::Integer m_local_owner
Identifiant du 'propriétaire' courant.
Arccore::Integer localSize() const override
Retourne l'indice minimum local.
Arccore::Integer nullIndex() const override
return value of null index
std::map< Arccore::Integer, std::shared_ptr< IAbstractFamily > > m_abstract_families
Table des IAbstractFamily ici gérées.
void init_mine()
Init datastructure with a non virtual function.
Entry getEntry(const Arccore::String &name) const override
Retourne l'entrée associée à un nom.
Arccore::Integer globalSize() const override
Retourne la taille globale.
void stats(Arccore::Integer &globalSize, Arccore::Integer &minLocalIndex, Arccore::Integer &localSize) const override
Statistiques d'indexation.
ScalarIndexSet buildScalarIndexSet(const Arccore::String &name, Arccore::IntegerConstArrayView localIds, const IIndexManager::IAbstractFamily &family) override
Construit une nouvelle entrée scalaire sur un ensemble d'entités abstraites.
BasicIndexManager(Alien::IMessagePassingMng *parallelMng)
Constructeur de la classe.
Arccore::Integer m_creation_index
Index de creation des entrées.
Arccore::MessagePassing::IMessagePassingMng * parallelMng() const override
Donne le gestionnaire parallèle ayant servi à l'indexation.
EntryEnumerator enumerateEntry() const override
Construction d'un enumerateur sur les Entry.
void prepare() override
Préparation : fixe l'indexation (fin des définitions).
void init() override
Initialisation.
~BasicIndexManager() override
Destructeur de la classe.
Interface for abstract families of items.
virtual SafeConstArrayView< Integer > owners(ConstArrayView< Integer > localIds) const =0
Owners of the given local ids.
Interface d'implementation de EntryEnumerator.
Classe d'énumération des Entry connues.
Interface d'implémentation de Entry.
virtual Arccore::String getName() const =0
Retourne le nom de l'entrée.
Classe de représentation des Entry.
EntryImpl * internal() const
Accès interne à l'implementation.
IIndexManager * manager() const
Référentiel du manager associé
Interface des familles abstraites pour l'indexation de items.
virtual Arccore::SharedArray< Arccore::Int64 > uids(Arccore::ConstArrayView< Arccore::Int32 > localIds) const =0
Retourne l'ensemble des uniqueIds d'un ensemble d'item décrits par leur localIds.
virtual IAbstractFamily * clone() const =0
Construit un clone de cet objet.
virtual Arccore::Int32 maxLocalId() const =0
Identifiant maximal des localIds pour cette famille.
virtual Item item(Arccore::Int32 localId) const =0
Retourne un objet Item à partir de son localId.
virtual Arccore::SharedArray< Arccore::Integer > owners(Arccore::ConstArrayView< Arccore::Int32 > localIds) const =0
IIndexManager()=default
Constructeur par défaut.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --