Alien  1.3.0
Developer documentation
Loading...
Searching...
No Matches
BasicIndexManager.h
1#pragma once
2
3#include <map>
4#include <memory>
5#include <vector>
6
7#include <alien/index_manager/IIndexManager.h>
8#include <alien/utils/Precomp.h>
9
10/*---------------------------------------------------------------------------*/
11/*---------------------------------------------------------------------------*/
12
13namespace Alien
14{
15
16/*---------------------------------------------------------------------------*/
17/*---------------------------------------------------------------------------*/
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
26class ALIEN_EXPORT BasicIndexManager : public IIndexManager
27{
28 public:
29 public:
31 explicit BasicIndexManager(Alien::IMessagePassingMng* parallelMng);
33 ~BasicIndexManager() override;
34
36 void init() override;
37
39 [[nodiscard]] bool isPrepared() const override { return m_state == Prepared; }
40
42 void setTraceMng(Alien::ITraceMng* traceMng) override;
43
45 void prepare() override;
46
48
49 void stats(Arccore::Integer& globalSize, Arccore::Integer& minLocalIndex,
50 Arccore::Integer& localSize) const override;
51
53
54 [[nodiscard]] Arccore::Integer globalSize() const override;
55
57
58 [[nodiscard]] Arccore::Integer minLocalIndex() const override;
59
61
62 [[nodiscard]] Arccore::Integer localSize() const override;
63
65 [[nodiscard]] EntryEnumerator enumerateEntry() const override;
66
68 ScalarIndexSet buildScalarIndexSet(const Arccore::String& name,
69 Arccore::IntegerConstArrayView localIds,
70 const IIndexManager::IAbstractFamily& family) override;
71
74 ScalarIndexSet buildScalarIndexSet(
75 const Arccore::String& name, const IIndexManager::IAbstractFamily& family) override;
76
78
79 VectorIndexSet buildVectorIndexSet(const Arccore::String& name,
80 Arccore::IntegerConstArrayView localIds,
82 Arccore::Integer n) override;
83
86
87 VectorIndexSet buildVectorIndexSet(const Arccore::String& name,
88 const IIndexManager::IAbstractFamily& family, Arccore::Integer n) override;
89
91 [[nodiscard]] Arccore::UniqueArray<Arccore::Integer> getIndexes(
92 const ScalarIndexSet& entry) const override;
93
96 [[nodiscard]] Arccore::UniqueArray2<Arccore::Integer> getIndexes(
97 const VectorIndexSet& entries) const override;
98
100
101 [[nodiscard]] Arccore::MessagePassing::IMessagePassingMng* parallelMng() const override
102 {
103 return m_parallel_mng;
104 }
105
107 void setMaxNullIndexOpt(bool flag) override { m_max_null_index_opt = flag; }
108
109 [[nodiscard]] Arccore::Integer nullIndex() const override
110 {
111 ALIEN_ASSERT((m_state == Prepared), ("nullIndex is valid only in Prepared state"));
112 if (m_max_null_index_opt)
113 return m_global_entry_offset + m_local_entry_count;
114 else
115 return -1;
116 }
117
118 public:
119 void keepAlive(const IAbstractFamily* family) override;
120
121 private:
122 Arccore::MessagePassing::IMessagePassingMng* m_parallel_mng = nullptr;
123 Arccore::Integer m_local_owner = 0;
124
125 enum State
126 {
127 Undef,
128 Initialized,
129 Prepared
130 } m_state;
131
132 Arccore::ITraceMng* m_trace = nullptr;
133
134 Arccore::Integer m_local_entry_count = 0;
135 Arccore::Integer m_global_entry_count = 0;
136 Arccore::Integer m_global_entry_offset = 0;
137 Arccore::Integer m_local_removed_entry_count = 0;
138 Arccore::Integer m_global_removed_entry_count = 0;
139
140 bool m_max_null_index_opt = false;
141
142 class MyEntryImpl;
143 class MyEntryEnumeratorImpl;
144
145 struct InternalEntryIndex
146 {
147 InternalEntryIndex(MyEntryImpl* e, Arccore::Integer lid, Arccore::Integer kind,
148 Arccore::Int64 uid, Arccore::Integer index,
149 [[maybe_unused]] Arccore::Integer creation_index, Arccore::Integer owner)
150 : m_entry(e)
151 , m_uid(uid)
152 , m_localid(lid)
153 , m_kind(kind)
154 , m_index(index)
155 // , m_creation_index(creation_index)
156 , m_owner(owner)
157 {}
158 MyEntryImpl* m_entry;
159 Arccore::Int64 m_uid;
160 Arccore::Integer m_localid, m_kind, m_index;
161 // Integer m_creation_index;
162 Arccore::Integer m_owner;
163 bool operator==(const InternalEntryIndex& m) const
164 {
165 return m.m_entry == m_entry && m.m_localid == m_localid;
166 }
167 };
168
169 typedef std::vector<InternalEntryIndex> EntryIndexMap;
170
172 {
173 inline bool operator()(
174 const InternalEntryIndex& a, const InternalEntryIndex& b) const;
175 };
176
178 typedef std::map<Arccore::String, MyEntryImpl*> EntrySet;
179 EntrySet m_entry_set;
180
182 Arccore::Integer m_creation_index = 0;
183
185
186 Arccore::Integer m_abstract_family_base_kind = 0;
187
188 // TODO: why a shared_ptr here ?
189 std::map<Arccore::Integer, std::shared_ptr<IAbstractFamily>>
191 std::map<const IAbstractFamily*, Arccore::Integer>
194
196
197 [[nodiscard]] Entry getEntry(const Arccore::String& name) const override;
198
199 protected:
201 struct EntrySendRequest;
202 struct EntryRecvRequest;
203
204 protected: // Méthodes protègés en attendant une explicitation du besoin
205 private:
206 Entry buildEntry(const Arccore::String& name, const IAbstractFamily* itemFamily,
207 Arccore::Integer kind);
208 void defineIndex(const Entry& entry, Arccore::IntegerConstArrayView localIds);
209 void parallel_prepare(EntryIndexMap& entry_index);
210 void sequential_prepare(EntryIndexMap& entry_index);
211 [[nodiscard]] inline bool isOwn(const IAbstractFamily::Item& item) const
212 {
213 return item.owner() == m_local_owner;
214 }
215 [[nodiscard]] inline bool isOwn(const InternalEntryIndex& i) const
216 {
217 return i.m_owner == m_local_owner;
218 }
219 void reserveEntries(const EntryIndexMap& entry_index);
220 Arccore::Integer addNewAbstractFamily(const IAbstractFamily* family);
221
223 void init_mine();
224};
225
226/*---------------------------------------------------------------------------*/
227/*---------------------------------------------------------------------------*/
228} // namespace Alien
229
230/*---------------------------------------------------------------------------*/
231/*---------------------------------------------------------------------------*/
Squelette de l'implementation locale de Entry La vraie implémentation est MyAbstractEntryImpl....
std::map< Arccore::String, MyEntryImpl * > EntrySet
Table des Entry connues localement.
void setMaxNullIndexOpt(bool flag) override
define null index : default = -1, if true null_index = max_index+1
VectorIndexSet buildVectorIndexSet(const Arccore::String &name, const IIndexManager::IAbstractFamily &family, Arccore::Integer n) override
Arccore::UniqueArray< Arccore::Integer > getIndexes(const ScalarIndexSet &entry) const override
Fournit une table de translation indexé par les items.
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.
ScalarIndexSet buildScalarIndexSet(const Arccore::String &name, const IIndexManager::IAbstractFamily &family) override
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 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.
Entry getEntry(const Arccore::String &name) const override
Retourne l'entrée associée à un nom.
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.
bool isPrepared() const override
Indique si la phase de préparation est achevée.
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.
void init() override
Initialisation.
Interface for abstract families of items.
Classe de représentation des Entry.
Interface des familles abstraites pour l'indexation de items.
IIndexManager()=default
Constructeur par défaut.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Definition BackEnd.h:17