Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ItemGroupImpl.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* ItemGroupImpl.h (C) 2000-2024 */
9/* */
10/* Implémentation d'un groupe d'entités du maillage. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ITEMGROUPIMPL_H
13#define ARCANE_ITEMGROUPIMPL_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/ItemTypes.h"
18#include "arcane/SharedReference.h"
19#include "arcane/utils/SharedPtr.h"
20
21#include "arcane/GroupIndexTable.h"
22
23/*---------------------------------------------------------------------------*/
24/*---------------------------------------------------------------------------*/
25
26namespace Arcane
27{
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31// Macro pour détecter les modifications de conception de ItemGroupImpl
32#define ITEMGROUP_USE_OBSERVERS
33
34/*---------------------------------------------------------------------------*/
35/*---------------------------------------------------------------------------*/
36
37class IItemGroupObserver;
38class IObservable;
39class ItemGroupComputeFunctor;
40class IMesh;
41class ItemGroupInternal;
42class ItemPairGroupImpl;
43class GroupIndexTable;
44class IVariableSynchronizer;
45class ItemGroupImplInternal;
46
47/*---------------------------------------------------------------------------*/
48/*---------------------------------------------------------------------------*/
49/*!
50 * \internal
51 * \brief Implémentation d'un groupe d'entités de maillage.
52
53 Un groupe est un ensemble d'entité du maillage (noeuds,faces,mailles,...)
54 de même genre.
55
56 Une instance de cette classe ne doit pas s'utiliser directement, mais
57 par l'intermédiaire d'une instance de ItemGroup.
58
59 Une entité élément ne peut être présente qu'une seul fois.
60
61 Le développeur ne doit pas conserver directement des instances de cette
62 class mais passer par un ItemGroup. Certains groupes étant déterminés
63 dynamiquement suivant le contenu d'un autre groupe (par exemple, les groupes
64 d'entités propres aux sous-domaines sont calculés à partir du groupe de
65 toutes les entités du sous-domaine), ceci garantit que les mises à jour
66 des groupes se font correctement.
67
68 Cette instance est géré par un compteur de référence et est détruite
69 automatiquement lorsqu'il arrive à zéro.
70 */
71class ARCANE_CORE_EXPORT ItemGroupImpl
72: public SharedReference
73{
74 private:
75
76 friend ItemGroup;
77 class ItemSorter;
78
79 public:
80
81 //! Construit un groupe nul
83
84 /*! \brief Construit un groupe.
85 * Construit un groupe vide de nom \a name, associé à la famille \a family.
86 */
87 ItemGroupImpl(IItemFamily* family,const String& name);
88
89 /*! \brief Construit un groupe fils d'un autre groupe.
90 * Construit un groupe de nom \a name fils du groupe \a parent. Le genre de ce
91 * groupe est le même que celui de la famille à laquelle il appartient.
92 */
93 ItemGroupImpl(IItemFamily* family,ItemGroupImpl* parent,const String& name);
94
95 virtual ~ItemGroupImpl(); //!< Libère les ressources
96
97 private:
98
99 static ItemGroupImpl* shared_null;
100
101 public:
102
103 static ItemGroupImpl* checkSharedNull();
104
105 public:
106
107 virtual ISharedReference& sharedReference() { return *this; }
108
109 public:
110
111 //! Nom du groupe
112 const String& name() const;
113
114 //! Nom complet du groupe (avec maillage + famille)
115 const String& fullName() const;
116
117 //! Nombre de références sur le groupe.
118 virtual Integer nbRef() const { return refCount(); }
119
120 //! Groupe parent (0 si aucun)
121 ItemGroupImpl* parent() const;
122
123 //! Retourne \a true si le groupe est nul.
124 bool null() const;
125
126 //! Retourne si le groupe contient uniquement des éléments propres au sous-domaine
127 bool isOwn() const;
128
129 //! Positionne la propriété de groupe local ou non.
130 void setOwn(bool v);
131
132 //! Groupe des entité propres des entités de ce groupe
133 ItemGroupImpl* ownGroup();
134
135 //! Items in the group not owned by the subdomain
136 ItemGroupImpl* ghostGroup();
137
138 // Items in the group lying on the boundary between two subdomains
139 // Implemented for faces only
140 ItemGroupImpl* interfaceGroup();
141
142 //! Groupe des noeuds des éléments de ce groupe
143 ItemGroupImpl* nodeGroup();
144
145 //! Groupe des arêtes des éléments de ce groupe
146 ItemGroupImpl* edgeGroup();
147
148 //! Groupe des faces des éléments de ce groupe
149 ItemGroupImpl* faceGroup();
150
151 //! Groupe des mailles des éléments de ce groupe
152 ItemGroupImpl* cellGroup();
153
154 //! Crée un sous-groupe calculé
155 /*! Le gestion mémoire du functor est alors délégué au groupe */
156 ItemGroupImpl* createSubGroup(const String& suffix, IItemFamily* family, ItemGroupComputeFunctor* functor);
157
158 //! Accède à un sous-groupe calculé
159 /*! Le gestion mémoire du functor est alors délégué au groupe */
160 ItemGroupImpl* findSubGroup(const String& suffix);
161
162 /*!
163 * \brief Groupe des faces internes des éléments de ce groupe
164 *
165 * Ce groupe n'existe que pour un groupe de maille (itemKind()==IK_Cell).
166 * Une face est interne si elle connectée à deux mailles de ce groupe.
167 */
168 ItemGroupImpl* innerFaceGroup();
169
170 /*!
171 * \brief Groupe des faces externes des éléments de ce groupe
172 *
173 * Ce groupe n'existe que pour un groupe de maille (itemKind()==IK_Cell).
174 * Une face est externe si elle n'est connectée qu'à une maille de ce groupe.
175 */
176 ItemGroupImpl* outerFaceGroup();
177
178 //! AMR
179 /*!
180 * \brief Groupe des mailles actives de ce groupe
181 *
182 * Une maille active est une maille feuille dans l'arbre AMR.
183 */
184 ItemGroupImpl* activeCellGroup();
185
186 /*!
187 * \brief Groupe des mailles propres actives de ce groupe
188 */
189 ItemGroupImpl* ownActiveCellGroup();
190
191 /*!
192 * \brief Groupe des mailles actives de ce groupe
193 *
194 * Une maille active est une maille feuille dans l'arbre AMR.
195 */
196 ItemGroupImpl* levelCellGroup(const Integer& level);
197
198 /*!
199 * \brief Groupe des mailles propres actives de ce groupe
200 */
201 ItemGroupImpl* ownLevelCellGroup(const Integer& level);
202
203 /*!
204 * \brief Groupe des faces actives propres au domaine
205 *
206 * Ce groupe n'existe que pour un groupe de maille (itemKind()==IK_Cell).
207 * Une face est interne active si elle connectée à deux mailles actives de ce groupe.
208 */
209 ItemGroupImpl* activeFaceGroup();
210
211 /*!
212 * \brief Groupe des faces externes actives des éléments de ce groupe
213 *
214 * Ce groupe n'existe que pour un groupe de maille (itemKind()==IK_Cell).
215 * Une face est externe active si elle n'est connectée qu'à une maille de ce groupe et est active.
216 */
217 ItemGroupImpl* ownActiveFaceGroup();
218
219 /*!
220 * \brief Groupe des faces internes actives des éléments de ce groupe
221 *
222 * Ce groupe n'existe que pour un groupe de maille (itemKind()==IK_Cell).
223 * Une face est interne active si elle connectée à deux mailles actives de ce groupe.
224 */
225 ItemGroupImpl* innerActiveFaceGroup();
226
227 /*!
228 * \brief Groupe des faces externes actives des éléments de ce groupe
229 *
230 * Ce groupe n'existe que pour un groupe de maille (itemKind()==IK_Cell).
231 * Une face est externe active si elle n'est connectée qu'à une maille de ce groupe et est active.
232 */
233 ItemGroupImpl* outerActiveFaceGroup();
234
235 //! AMR OFF
236
237 //! Vrai si le groupe est local au sous-domaine
238 bool isLocalToSubDomain() const;
239
240 //! Positionne le booléen indiquant si le groupe est local au sous-domaine.
241 void setLocalToSubDomain(bool v);
242
243 //! Maillage auquel appartient le groupe (0 pour le groupe nul).
244 IMesh* mesh() const;
245
246 //! Genre du groupe. Il s'agit du genre de ses éléments.
247 eItemKind itemKind() const;
248
249 //! Familly à laquelle appartient le groupe (ou 0 si aucune)
250 IItemFamily* itemFamily() const;
251
252 //! Nombre d'entités du groupe
253 Integer size() const;
254
255 //! Vrai si le groupe est vide
256 bool empty() const;
257
258 //! Supprime les entités du groupe
259 void clear();
260
261 //! Groupe parent
262 ItemGroup parentGroup();
263
264 /*!
265 * \brief Invalide le groupe
266 *
267 * Opération très violente qui induit une invalidation de toutes les
268 * dépendances autant des observers que des sous-groupes construits.
269 */
270 void invalidate(bool force_recompute);
271
272 /*!
273 * \brief Ajoute les entités de numéros locaux \a items_local_id.
274 * \sa ItemGroup::addItems()
275 */
276 void addItems(Int32ConstArrayView items_local_id,bool check_if_present);
277
278 //! Positionne les entités du groupe à \a items_local_id
279 void setItems(Int32ConstArrayView items_local_id);
280
281 //! Positionne les entités du groupe à \a items_local_id en les triant éventuellement.
282 void setItems(Int32ConstArrayView items_local_id,bool do_sort);
283
284 //! Supprime les entités \a items_local_id du groupe
285 void removeItems(Int32ConstArrayView items_local_id,bool check_if_present);
286
287 //! Supprime et ajoute les entités \a removed_local_id et \a added_local_id du groupe
288 void removeAddItems(Int32ConstArrayView removed_local_id,
289 Int32ConstArrayView added_local_id,
290 bool check_if_present);
291
292 /*!
293 * \brief Supprime du groupe les entités dont le flag isSuppressed() est vrai
294 */
295 void removeSuppressedItems();
296
297 //! Vérifie que le groupe est valide.
298 void checkValid();
299
300 /*! \brief Réactualise le groupe si nécessaire.
301 *
302 Un groupe doit être réactualisée lorsqu'il est devenu invalide, par exemple
303 suite à un appel à invalidate().
304 \retval true si le groupe a été réactualisé,
305 \retval false sinon.
306 */
307 bool checkNeedUpdate();
308
309 //! Liste des numéros locaux des entités de ce groupe.
310 Int32ConstArrayView itemsLocalId() const;
311
312 /*!
313 * \brief Débute une transaction.
314 *
315 * Une transaction permet d'accèder en écriture à des groupes protégés.
316 * L'utilisation de ce mécanisme indique a Arcane que l'utilisateur
317 * a conscience qu'il modifie 'à ses risques' un groupe.
318 */
319 void beginTransaction();
320
321 //! Termine une transaction
322 void endTransaction();
323
324 ARCANE_DEPRECATED_REASON("Y2022: Use itemInfoListView() instead")
325 //! Liste des entités sur lesquelles s'appuie le groupe
326 ItemInternalList itemsInternal() const;
327
328 //! Liste des entités sur lesquelles s'appuie le groupe
329 ItemInfoListView itemInfoListView() const;
330
331 /*!
332 * \internal
333 * \brief Indique à ce groupe qu'il s'agit du groupe de toutes les
334 * entités de la famille.
335 */
336 void setIsAllItems();
337
338 //! Indique si le groupe est celui de toutes les entités
339 bool isAllItems() const;
340
341 //! Change les indices des entités du groupe
342 void changeIds(Int32ConstArrayView old_to_new_ids);
343
344 //! Applique l'opération \a operation sur les entités du groupe.
345 void applyOperation(IItemOperationByBasicType* operation);
346
347 //! Indique si le groupe a structurellement besoin d'une synchro parallèle
348 bool needSynchronization() const;
349
350 //! Retourne le temps du groupe. Ce temps est incrémenté après chaque modification.
351 Int64 timestamp() const;
352
353 /*!
354 * \brief Attache un observer.
355 *
356 * \param ref référence de l'émetteur de l'observer
357 * \param obs Observer
358 */
359 void attachObserver(const void * ref, IItemGroupObserver * obs);
360
361 /*!
362 * \brief Détache un observer.
363 *
364 * \param ref référence de l'émetteur de l'observer
365 */
366 void detachObserver(const void * ref);
367
368 /*!
369 * \brief Indique si le contenu de ce groupe est observé.
370 *
371 * Ceci a pour effet d'embrayer des mécanismes de modification incrémentaux.
372 *
373 * Un groupe peut n'être observé que pour sa structure
374 * par des objets recalculés non incrémentalement.
375 */
376 bool hasInfoObserver() const;
377
378 //! Définit une fonction de calcul de groupe
379 void setComputeFunctor(IFunctor* functor);
380
381 //! Indique si le groupe est calculé
382 bool hasComputeFunctor() const;
383
384 /*!
385 * \brief Détruit le groupe. Après cet appel, le groupe devient un groupe nul.
386 *
387 * \warning Cette méthode ne doit être appelé qu'avec une extrème précaution
388 * même dans le code bas niveau de Arcane. S'il reste des références sur ce groupe
389 * le comportement est indéfini.
390 */
391 void destroy();
392
393 //! Table des local ids vers une position pour toutes les entités du groupe
394 SharedPtrT<GroupIndexTable> localIdToIndex();
395
396 //! Synchronizer du groupe
397 IVariableSynchronizer* synchronizer();
398
399 //! Indique si ce groupe possède un synchroniser
400 bool hasSynchronizer();
401
402 /*!
403 * \brief Vérifie et retourne si le groupe est trié par uniqueId() croissants.
404 */
405 bool checkIsSorted() const;
406
407 //! Indique si les entités du groupe ont des localIds() contigüs.
408 bool isContigousLocalIds() const;
409
410 /*!
411 * \brief Vérifie si les entités du groupe ont des localIds() contigüs.
412 *
413 * Si c'est le cas, alors \a isContigousLocalIds() retournera \a vrai.
414 */
415 void checkLocalIdsAreContigous() const;
416
417 /*!
418 * \brief Limite au maximum la mémoire utilisée par le groupe.
419 *
420 * Si le groupe est un groupe calculé, il est invalidé et toute sa mémoire
421 * allouée est libérée.
422 *
423 * Si le groupe est un groupe créé par l'utilisateur (donc persistant),
424 * s'assure que la mémoire consommée est minimale. Normalement %Arcane alloue
425 * un peu plus d'éléments que nécessaire pour éviter de faire des réallocations
426 * trop souvent.
427 */
428 void shrinkMemory();
429
430 //! Nombre d'éléments alloués
431 Int64 capacity() const;
432
433 //! API interne à Arcane
434 ItemGroupImplInternal* _internalApi() const;
435
436 public:
437
438 /*!
439 * \internal
440 * \brief Liste des numéros locaux des entités de ce groupe.
441 * \warning a utiliser avec moult précaution, en général
442 * uniquement par le functor de recalcul.
443 */
444 ARCANE_DEPRECATED_REASON("Y2024: This method is internal to Arcane")
445 Int32Array& unguardedItemsLocalId(const bool self_invalidate = true);
446
447
448 public:
449
450 //! \internal
451 static void _buildSharedNull();
452 //! \internal
453 static void _destroySharedNull();
454
455 private:
456
457 //! Initialisation des sous-groupes par types
458 void _initChildrenByType();
459 //! Méthode de calcul des sous-groupes par type
460 void _computeChildrenByType();
461 //! Initialisation des sous-groupes par types
462 void _initChildrenByTypeV2();
463 //! Méthode de calcul des sous-groupes par type
464 void _computeChildrenByTypeV2();
465 //! Invalidation des sous-groupes
466 void _executeExtend(const Int32ConstArrayView * info);
467 //! Invalidation des sous-groupes
468 void _executeReduce(const Int32ConstArrayView * info);
469 //! Invalidation des sous-groupes
470 void _executeCompact(const Int32ConstArrayView * info);
471 //! Invalidation des sous-groupes
472 void _executeReorder(const Int32ConstArrayView * info);
473 //! Invalidation des sous-groupes
474 void _executeInvalidate();
475 //! Mise à jour forcée du flag d'information de restructuration
476 void _updateNeedInfoFlag(const bool flag);
477 //! Invalidate forcée récursive
478 /*! Ne notifie pas les observers. Devra être suivi d'un invalidate() normal */
479 void _forceInvalidate(const bool self_invalidate);
480
481 void _checkUpdateSimdPadding();
482 //! Notification de SharedReference indiquant qu'il faut détruire l'instance.
483 virtual void deleteMe();
484
485 private:
486
487 ItemGroupInternal* m_p = nullptr; //!< Implémentation du groupe
488
489 private:
490
491 //! Supprime les entités \a items_local_id du groupe
492 void _removeItems(SmallSpan<const Int32> items_local_id);
493 bool _checkNeedUpdateNoPadding();
494 bool _checkNeedUpdateWithPadding();
495 bool _checkNeedUpdate(bool do_padding);
496};
497
498/*---------------------------------------------------------------------------*/
499/*---------------------------------------------------------------------------*/
500
501} // End namespace Arcane
502
503/*---------------------------------------------------------------------------*/
504/*---------------------------------------------------------------------------*/
505
506#endif
Interface d'une famille d'entités.
Interface d'un opérateur sur des entités rangées par type.
Interface d'un compteur de référence.
Interface d'un service de synchronisation de variable.
Fonctor pour le calcul des éléments d'un groupe.
virtual Integer nbRef() const
Nombre de références sur le groupe.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
Vue sur une liste pour obtenir des informations sur les entités.
Implémentation d'un compteur de référence utilisant std::atomic.
Classe de base des vecteurs 1D de données.
Vue constante d'un tableau de type T.
Vue d'un tableau d'éléments de type T.
Definition Span.h:670
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
eItemKind
Genre d'entité de maillage.