Alien  1.3.0
User documentation
Loading...
Searching...
No Matches
IIndexManager.h
1#pragma once
2
3#include <memory> // for std::shared_ptr.
4#include <vector>
5
6#include <alien/utils/Precomp.h>
7
8/*---------------------------------------------------------------------------*/
9/*---------------------------------------------------------------------------*/
10
11namespace Alien
12{
13
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17/*---------------------------------------------------------------------------*/
18/*---------------------------------------------------------------------------*/
19
20/**
21 * Voir \ref secLinearSolver "Description des services de solveurs
22 * linéaires" pour plus de détails
23 *
24 * \todo Pour gérer les inconnues vectoriel, mettre un argument additionnel qui
25 * est le sous-indice (vectoriel) avec une valeur par défaut de 0 (ou
26 * bien un proto différent)
27 */
29{
30 public:
31 //! Interface des familles abstraites pour l'indexation de items
33 {
34 public:
35 class Item
36 {
37 public:
38 Item(Arccore::Int64 uniqueId, Arccore::Integer owner)
39 : m_unique_id(uniqueId)
40 , m_owner(owner)
41 {}
42
43 public:
44 Arccore::Int64 uniqueId() const { return m_unique_id; }
45 Arccore::Integer owner() const { return m_owner; }
46
47 private:
48 Arccore::Int64 m_unique_id;
49 Arccore::Integer m_owner;
50 };
51
52 public:
53 virtual ~IAbstractFamily() = default;
54
55 public:
56 //! Construit un clone de cet objet
57 virtual IAbstractFamily* clone() const = 0;
58
59 public:
60 //! Identifiant maximal des localIds pour cette famille
61 virtual Arccore::Int32 maxLocalId() const = 0;
62 //! Convertit des uniqueIds en localIds. Erreur fatale si un item n'est pas retrouvé
63 virtual void uniqueIdToLocalId(Arccore::ArrayView<Arccore::Int32> localIds,
64 Arccore::ConstArrayView<Arccore::Int64> uniqueIds) const = 0;
65 //! Retourne un objet Item à partir de son localId
66 virtual Item item(Arccore::Int32 localId) const = 0;
67 //! Retourne l'ensemble des owners (propriétaires) d'un ensemble d'item décrits par
68 //! leur localIds
69 virtual Arccore::SharedArray<Arccore::Integer> owners(
70 Arccore::ConstArrayView<Arccore::Int32> localIds) const = 0;
71 //! Retourne l'ensemble des uniqueIds d'un ensemble d'item décrits par leur localIds
72 virtual Arccore::SharedArray<Arccore::Int64> uids(
73 Arccore::ConstArrayView<Arccore::Int32> localIds) const = 0;
74 //! Retourne l'ensemble des identifiants locaux de la famille
75 virtual Arccore::SharedArray<Arccore::Int32> allLocalIds() const = 0;
76 };
77
78 protected:
79 //! Interface d'implémentation de \a Entry
81 {
82 public:
83 //! Destructeur
84 virtual ~EntryImpl() = default;
85 //! Retourne la liste des Index de l'Entry
86 virtual Arccore::ConstArrayView<Arccore::Integer> getOwnIndexes() const = 0;
87 //! Retourne la liste des Index de l'Entry (own + ghost)
88 virtual Arccore::ConstArrayView<Arccore::Integer> getAllIndexes() const = 0;
89 //! Retourne la liste des Items de l'Entry
90 virtual Arccore::ConstArrayView<Arccore::Integer> getOwnLocalIds() const = 0;
91 //! Retourne la liste des Items de l'Entry (own + ghost)
92 virtual Arccore::ConstArrayView<Arccore::Integer> getAllLocalIds() const = 0;
93 //! Retourne le nom de l'entrée
94 virtual Arccore::String getName() const = 0;
95 //! Retourne le type de support de l'Entry
96 virtual Arccore::Integer getKind() const = 0;
97 //! Retourne la famille abstraite de l'Entry
98 virtual const IAbstractFamily& getFamily() const = 0;
99 //! Ajout d'un tag
100 virtual void addTag(
101 const Arccore::String& tagname, const Arccore::String& tagvalue) = 0;
102 //! Suppression d'un tag
103 virtual void removeTag(const Arccore::String& tagname) = 0;
104 //! Test d'existance d'un tag
105 virtual bool hasTag(const Arccore::String& tagname) = 0;
106 //! Lecture d'un tag
107 virtual Arccore::String tagValue(const Arccore::String& tagname) = 0;
108 //! Référentiel du manager associé
109 virtual IIndexManager* manager() const = 0;
110 };
111
112 public:
113 //! Classe de représentation des Entry
114 /*! Cette classe est un proxy; sa copie est donc peu couteuse et son
115 * implémentation variable suivant le contexte
116 */
117 class Entry
118 {
119 protected:
120 //! Implémentation de ce type d'entrée
122
123 public:
124 //! Constructeur par défaut
126 : m_impl(nullptr)
127 {}
128
129 //! Constructeur par copie
130 Entry(const Entry& en) = default;
131
132 //! Constructeur
133 explicit Entry(EntryImpl* impl)
134 : m_impl(impl)
135 {}
136
137 //! Opérateur de copie
139 {
140 if (this != &en)
141 m_impl = en.m_impl;
142 return *this;
143 }
144
145 //! Accès interne à l'implementation
146 EntryImpl* internal() const { return m_impl; }
147
148 //! Indique si l'entrée est définie
149 bool null() const { return m_impl == nullptr; }
150
151 void nullify() { m_impl = nullptr; }
152
153 //! Ensemble des indices 'own' gérés par cette entrée
154 Arccore::ConstArrayView<Arccore::Integer> getOwnIndexes() const
155 {
156 return m_impl->getOwnIndexes();
157 }
158
159 //! Ensemble des indices 'own + ghost' gérés par cette entrée (
160 Arccore::ConstArrayView<Arccore::Integer> getAllIndexes() const
161 {
162 return m_impl->getAllIndexes();
163 }
164
165 //! Ensemble des items 'own' gérés par cette entrée
166 Arccore::ConstArrayView<Arccore::Integer> getOwnLocalIds() const
167 {
168 return m_impl->getOwnLocalIds();
169 }
170
171 //! Ensemble des items 'own + ghost' gérés par cette entrée
172 Arccore::ConstArrayView<Arccore::Integer> getAllLocalIds() const
173 {
174 return m_impl->getAllLocalIds();
175 }
176
177 //! Nom de l'entrée
178 Arccore::String getName() const { return m_impl->getName(); }
179
180 //! Support de l'entrée (en terme d'item)
181 Arccore::Integer getKind() const { return m_impl->getKind(); }
182
183 //! Retourne la famille abstraite de l'Entry
184 const IAbstractFamily& getFamily() const { return m_impl->getFamily(); }
185
186 //@{ @name Gestion des tags
187 //! Ajout d'un tag
188 void addTag(const Arccore::String& tagname, const Arccore::String& tagvalue)
189 {
190 return m_impl->addTag(tagname, tagvalue);
191 }
192
193 //! Suppression d'un tag
194 void removeTag(const Arccore::String& tagname) { return m_impl->removeTag(tagname); }
195
196 //! Test d'existance d'un tag
197 bool hasTag(const Arccore::String& tagname) { return m_impl->hasTag(tagname); }
198
199 //! Acces en lecture à un tag
200 Arccore::String tagValue(const Arccore::String& tagname)
201 {
202 return m_impl->tagValue(tagname);
203 }
204 //@}
205
206 //! Référentiel du manager associé
207 IIndexManager* manager() const { return m_impl->manager(); }
208 };
209
210 //! Interface d'implementation de \a EntryEnumerator
211 class EntryEnumeratorImpl
212 {
213 public:
214 EntryEnumeratorImpl() = default;
215 virtual ~EntryEnumeratorImpl() = default;
216 virtual void moveNext() = 0;
217 virtual bool hasNext() const = 0;
218 virtual EntryImpl* get() const = 0;
219 };
220
221 //! Classe d'énumération des \a Entry connues
222 /*! Classe de type proxy; la copie est peu couteuse et l'implémentation variable */
224 {
225 protected:
226 std::shared_ptr<EntryEnumeratorImpl> m_impl;
227
228 public:
229 //! Constructeur par copie
230 EntryEnumerator(const EntryEnumerator& e) = default;
231
232 //! Constructeur par consultation de l'\a IndexManager
233 explicit EntryEnumerator(IIndexManager const* manager)
234 : m_impl(manager->enumerateEntry().m_impl)
235 {}
236 //! Constructeur par implémentation
238 : m_impl(impl)
239 {}
240 //! Avance l'énumérateur
241 void operator++() { m_impl->moveNext(); }
242 //! Teste l'existence d'un élément suivant
243 bool hasNext() const { return m_impl->hasNext(); }
244 //! Déréférencement
245 Entry operator*() const { return Entry(m_impl->get()); }
246 //! Déréférencement indirect
247 EntryImpl* operator->() const { return m_impl->get(); }
248 //! Nombre d'élément dans l'énumérateur
249 Arccore::Integer count() const
250 {
251 Arccore::Integer my_size = 0;
252 for (EntryEnumerator i = *this; i.hasNext(); ++i)
253 ++my_size;
254 return my_size;
255 }
256 bool null() { return m_impl == nullptr; }
257 };
258
259 public:
260 //! Constructeur par défaut
261 IIndexManager() = default;
262
263 //! Destructeur
264 virtual ~IIndexManager() = default;
265
266 //! Indique si la phase de préparation est achevée
267 virtual bool isPrepared() const = 0;
268
269 //! Initialisation les structures
270 /*! Implicitement appelé par le constructeur */
271 virtual void init() = 0;
272
273 //! Préparation : fixe l'indexation (fin des définitions)
274 virtual void prepare() = 0;
275
276 //! Définit le gestionnaire de trace
277 virtual void setTraceMng(Arccore::ITraceMng* traceMng) = 0;
278
279 //! Statistiques d'indexation
280 /*! Uniquement valide après \a prepare */
281 virtual void stats(Arccore::Integer& globalSize, Arccore::Integer& minLocalIndex,
282 Arccore::Integer& localSize) const = 0;
283
284 //! Retourne la taille globale
285 /*! Uniquement valide après \a prepare */
286 virtual Arccore::Integer globalSize() const = 0;
287
288 //! Retourne l'indice minimum local
289 /*! Uniquement valide après \a prepare */
290 virtual Arccore::Integer minLocalIndex() const = 0;
291
292 //! Retourne l'indice minimum local
293 /*! Uniquement valide après \a prepare */
294 virtual Arccore::Integer localSize() const = 0;
295
296 //! Construction d'un enumerateur sur les \a Entry
297 virtual EntryEnumerator enumerateEntry() const = 0;
298
299 //! Retourne l'entrée associée à un nom
300 virtual Entry getEntry(const Arccore::String& name) const = 0;
301
302 typedef Entry ScalarIndexSet;
303 typedef Arccore::UniqueArray<ScalarIndexSet> VectorIndexSet;
304
305 //! Construit une nouvelle entrée scalaire sur des items du maillage
306 // virtual ScalarIndexSet buildScalarIndexSet(const String name,Arcane::IItemFamily *
307 // item_family) = 0;
308 // virtual void defineIndex(ScalarIndexSet& set , const Arcane::ItemGroup & itemGroup)
309 // =
310 // 0;
311 // virtual ScalarIndexSet buildScalarIndexSet(const String name, const
312 // Arcane::ItemGroup
313 // & itemGroup) = 0;
314
315 //! Construit une nouvelle entrée scalaire sur un ensemble d'entités abstraites
316 virtual ScalarIndexSet buildScalarIndexSet(const Arccore::String& name,
317 Arccore::ConstArrayView<Arccore::Integer> localIds,
318 const IAbstractFamily& family) = 0;
319
320 //! Construit une nouvelle entrée scalaire sur l'ensemble des entités d'une familles
321 //! abstraite
322 virtual ScalarIndexSet buildScalarIndexSet(
323 const Arccore::String& name, const IAbstractFamily& family) = 0;
324
325 //! Construit une nouvelle entrée vectorielle sur des items du maillage
326 /*! L'implémentation actuelle considére le multi-scalaire comme du vectoriel */
327 // virtual VectorIndexSet buildVectorIndexSet(const String name, const
328 // Arcane::ItemGroup
329 // & itemGroup, const Integer n) = 0;
330 //! Construit une nouvelle entrée vectoriellesur un ensemble d'entités abstraites
331 /*! L'implémentation actuelle considére le multi-scalaire comme du vectoriel */
332 virtual VectorIndexSet buildVectorIndexSet(const Arccore::String& name,
333 Arccore::ConstArrayView<Arccore::Integer> localIds,
334 const IAbstractFamily& family,
335 Arccore::Integer n) = 0;
336
337 //! Construit une nouvelle entrée scalaire sur l'ensemble des entités d'une familles
338 //! abstraite
339 /*! L'implémentation actuelle considére le multi-scalaire comme du vectoriel */
340 virtual VectorIndexSet buildVectorIndexSet(
341 const Arccore::String& name, const IAbstractFamily& family, Arccore::Integer n) = 0;
342
343 //! Demande de dé-indexation d'une partie d'une entrée
344 /*! Utilisable uniquement avant prepare */
345 // virtual void removeIndex(const ScalarIndexSet & entry, const Arcane::ItemGroup &
346 // itemGroup) = 0;
347
348 // virtual Integer getIndex(const Entry & entry, const Item & item) const = 0 ;
349
350 //! Consultation vectorielle d'indexation d'une entrée (après prepare)
351 // virtual void getIndex(const ScalarIndexSet & entry, const Arcane::ItemVectorView &
352 // items, ArrayView<Integer> indexes) const = 0;
353
354 //! Fournit une table de translation indexé par les items
355 virtual Arccore::UniqueArray<Arccore::Integer> getIndexes(
356 const ScalarIndexSet& entry) const = 0;
357
358 //! Fournit une table de translation indexé par les items
359 virtual Arccore::UniqueArray2<Arccore::Integer> getIndexes(
360 const VectorIndexSet& entry) const = 0;
361
362 //! Donne le gestionnaire parallèle ayant servi à l'indexation
363 virtual Alien::IMessagePassingMng* parallelMng() const = 0;
364
365 //! define null index : default == -1, if true nullIndex() == max index of current
366 //! indexation
367 virtual void setMaxNullIndexOpt(bool flag) = 0;
368
369 //! return value of null index
370 virtual Arccore::Integer nullIndex() const = 0;
371
372 public:
373 //! Permet de gérer la mort d'une famille associée à l'index-manager
374 /*! Méthode de bas niveau pour les implémentationsde IAbstractFamily,
375 * usuellement dans le desctructeur des implémentations extérieures de
376 * IAbstractFamily
377 */
378 virtual void keepAlive(const IAbstractFamily* family) = 0;
379};
380
381/*---------------------------------------------------------------------------*/
382/*---------------------------------------------------------------------------*/
383
384} // namespace Alien
385
386/*---------------------------------------------------------------------------*/
387/*---------------------------------------------------------------------------*/
Interface d'implementation de EntryEnumerator.
Classe d'énumération des Entry connues.
Arccore::Integer count() const
Nombre d'élément dans l'énumérateur.
EntryEnumerator(EntryEnumeratorImpl *impl)
Constructeur par implémentation.
void operator++()
Avance l'énumérateur.
EntryEnumerator(const EntryEnumerator &e)=default
Constructeur par copie.
Entry operator*() const
Déréférencement.
EntryEnumerator(IIndexManager const *manager)
Constructeur par consultation de l'IndexManager.
bool hasNext() const
Teste l'existence d'un élément suivant.
EntryImpl * operator->() const
Déréférencement indirect.
Interface d'implémentation de Entry.
virtual IIndexManager * manager() const =0
Référentiel du manager associé
virtual ~EntryImpl()=default
Destructeur.
virtual Arccore::ConstArrayView< Arccore::Integer > getAllIndexes() const =0
Retourne la liste des Index de l'Entry (own + ghost).
virtual Arccore::String tagValue(const Arccore::String &tagname)=0
Lecture d'un tag.
virtual void removeTag(const Arccore::String &tagname)=0
Suppression d'un tag.
virtual Arccore::ConstArrayView< Arccore::Integer > getOwnLocalIds() const =0
Retourne la liste des Items de l'Entry.
virtual void addTag(const Arccore::String &tagname, const Arccore::String &tagvalue)=0
Ajout d'un tag.
virtual Arccore::ConstArrayView< Arccore::Integer > getAllLocalIds() const =0
Retourne la liste des Items de l'Entry (own + ghost).
virtual bool hasTag(const Arccore::String &tagname)=0
Test d'existance d'un tag.
virtual Arccore::String getName() const =0
Retourne le nom de l'entrée.
virtual Arccore::ConstArrayView< Arccore::Integer > getOwnIndexes() const =0
Retourne la liste des Index de l'Entry.
virtual Arccore::Integer getKind() const =0
Retourne le type de support de l'Entry.
virtual const IAbstractFamily & getFamily() const =0
Retourne la famille abstraite de l'Entry.
Classe de représentation des Entry.
bool null() const
Indique si l'entrée est définie.
EntryImpl * internal() const
Accès interne à l'implementation.
Arccore::ConstArrayView< Arccore::Integer > getOwnIndexes() const
Ensemble des indices 'own' gérés par cette entrée.
Entry()
Constructeur par défaut.
IIndexManager * manager() const
Référentiel du manager associé
Entry(const Entry &en)=default
Constructeur par copie.
const IAbstractFamily & getFamily() const
Retourne la famille abstraite de l'Entry.
Arccore::Integer getKind() const
Support de l'entrée (en terme d'item).
Arccore::ConstArrayView< Arccore::Integer > getAllLocalIds() const
Ensemble des items 'own + ghost' gérés par cette entrée.
Arccore::String tagValue(const Arccore::String &tagname)
Acces en lecture à un tag.
Entry(EntryImpl *impl)
Constructeur.
bool hasTag(const Arccore::String &tagname)
Test d'existance d'un tag.
EntryImpl * m_impl
Implémentation de ce type d'entrée.
void addTag(const Arccore::String &tagname, const Arccore::String &tagvalue)
Ajout d'un tag.
Arccore::ConstArrayView< Arccore::Integer > getOwnLocalIds() const
Ensemble des items 'own' gérés par cette entrée.
void removeTag(const Arccore::String &tagname)
Suppression d'un tag.
Arccore::String getName() const
Nom de l'entrée.
Entry & operator=(const Entry &en)
Opérateur de copie.
Arccore::ConstArrayView< Arccore::Integer > getAllIndexes() const
Ensemble des indices 'own + ghost' gérés par cette entrée (.
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 void uniqueIdToLocalId(Arccore::ArrayView< Arccore::Int32 > localIds, Arccore::ConstArrayView< Arccore::Int64 > uniqueIds) const =0
Convertit des uniqueIds en localIds. Erreur fatale si un item n'est pas retrouvé
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
virtual Arccore::SharedArray< Arccore::Int32 > allLocalIds() const =0
Retourne l'ensemble des identifiants locaux de la famille.
virtual VectorIndexSet buildVectorIndexSet(const Arccore::String &name, const IAbstractFamily &family, Arccore::Integer n)=0
virtual void setTraceMng(Arccore::ITraceMng *traceMng)=0
Définit le gestionnaire de trace.
virtual ScalarIndexSet buildScalarIndexSet(const Arccore::String &name, const IAbstractFamily &family)=0
virtual Arccore::Integer localSize() const =0
Retourne l'indice minimum local.
virtual Arccore::Integer globalSize() const =0
Retourne la taille globale.
virtual void keepAlive(const IAbstractFamily *family)=0
Permet de gérer la mort d'une famille associée à l'index-manager.
virtual Entry getEntry(const Arccore::String &name) const =0
Retourne l'entrée associée à un nom.
virtual VectorIndexSet buildVectorIndexSet(const Arccore::String &name, Arccore::ConstArrayView< Arccore::Integer > localIds, const IAbstractFamily &family, Arccore::Integer n)=0
Construit une nouvelle entrée vectorielle sur des items du maillage.
virtual void init()=0
Initialisation les structures.
virtual void prepare()=0
Préparation : fixe l'indexation (fin des définitions).
virtual Arccore::UniqueArray< Arccore::Integer > getIndexes(const ScalarIndexSet &entry) const =0
Demande de dé-indexation d'une partie d'une entrée.
virtual bool isPrepared() const =0
Indique si la phase de préparation est achevée.
virtual Arccore::Integer minLocalIndex() const =0
Retourne l'indice minimum local.
virtual Arccore::UniqueArray2< Arccore::Integer > getIndexes(const VectorIndexSet &entry) const =0
Fournit une table de translation indexé par les items.
virtual Alien::IMessagePassingMng * parallelMng() const =0
Donne le gestionnaire parallèle ayant servi à l'indexation.
virtual void stats(Arccore::Integer &globalSize, Arccore::Integer &minLocalIndex, Arccore::Integer &localSize) const =0
Statistiques d'indexation.
virtual void setMaxNullIndexOpt(bool flag)=0
virtual ~IIndexManager()=default
Destructeur.
virtual ScalarIndexSet buildScalarIndexSet(const Arccore::String &name, Arccore::ConstArrayView< Arccore::Integer > localIds, const IAbstractFamily &family)=0
Construit une nouvelle entrée scalaire sur des items du maillage.
virtual Arccore::Integer nullIndex() const =0
return value of null index
virtual EntryEnumerator enumerateEntry() const =0
Construction d'un enumerateur sur les Entry.
IIndexManager()=default
Constructeur par défaut.
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Definition BackEnd.h:17