Arcane  v3.16.6.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-2025 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-2025 */
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
38class IObservable;
40class IMesh;
41class ItemGroupInternal;
43class GroupIndexTable;
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 */
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 //! \deprecated Utiliser isContiguousLocalIds() à la place
408 bool isContigousLocalIds() const { return isContiguousLocalIds(); }
409
410 //! Indique si les entités du groupe ont des localIds() contigüs.
411 bool isContiguousLocalIds() const;
412
413 //! \deprecated Utiliser checkLocalIdsAreContiguous() à la place
415
416 /*!
417 * \brief Vérifie si les entités du groupe ont des localIds() contigüs.
418 *
419 * Si c'est le cas, alors \a isContiguousLocalIds() retournera \a vrai.
420 */
421 void checkLocalIdsAreContiguous() const;
422
423 /*!
424 * \brief Limite au maximum la mémoire utilisée par le groupe.
425 *
426 * Si le groupe est un groupe calculé, il est invalidé et toute sa mémoire
427 * allouée est libérée.
428 *
429 * Si le groupe est un groupe créé par l'utilisateur (donc persistant),
430 * s'assure que la mémoire consommée est minimale. Normalement %Arcane alloue
431 * un peu plus d'éléments que nécessaire pour éviter de faire des réallocations
432 * trop souvent.
433 */
434 void shrinkMemory();
435
436 //! Nombre d'éléments alloués
437 Int64 capacity() const;
438
439 //! API interne à Arcane
440 ItemGroupImplInternal* _internalApi() const;
441
442 public:
443
444 /*!
445 * \internal
446 * \brief Liste des numéros locaux des entités de ce groupe.
447 * \warning a utiliser avec moult précaution, en général
448 * uniquement par le functor de recalcul.
449 */
450 ARCANE_DEPRECATED_REASON("Y2024: This method is internal to Arcane")
451 Int32Array& unguardedItemsLocalId(const bool self_invalidate = true);
452
453
454 public:
455
456 //! \internal
457 static void _buildSharedNull();
458 //! \internal
459 static void _destroySharedNull();
460
461 private:
462
463 //! Initialisation des sous-groupes par types
464 void _initChildrenByType();
465 //! Méthode de calcul des sous-groupes par type
466 void _computeChildrenByType();
467 //! Initialisation des sous-groupes par types
468 void _initChildrenByTypeV2();
469 //! Méthode de calcul des sous-groupes par type
470 void _computeChildrenByTypeV2();
471 //! Invalidation des sous-groupes
472 void _executeExtend(const Int32ConstArrayView * info);
473 //! Invalidation des sous-groupes
474 void _executeReduce(const Int32ConstArrayView * info);
475 //! Invalidation des sous-groupes
476 void _executeCompact(const Int32ConstArrayView * info);
477 //! Invalidation des sous-groupes
478 void _executeReorder(const Int32ConstArrayView * info);
479 //! Invalidation des sous-groupes
480 void _executeInvalidate();
481 //! Mise à jour forcée du flag d'information de restructuration
482 void _updateNeedInfoFlag(const bool flag);
483 //! Invalidate forcée récursive
484 /*! Ne notifie pas les observers. Devra être suivi d'un invalidate() normal */
485 void _forceInvalidate(const bool self_invalidate);
486
487 void _checkUpdateSimdPadding();
488 //! Notification de SharedReference indiquant qu'il faut détruire l'instance.
489 virtual void deleteMe();
490
491 private:
492
493 ItemGroupInternal* m_p = nullptr; //!< Implémentation du groupe
494
495 private:
496
497 //! Supprime les entités \a items_local_id du groupe
498 void _removeItems(SmallSpan<const Int32> items_local_id);
499 bool _checkNeedUpdateNoPadding();
500 bool _checkNeedUpdateWithPadding();
501 bool _checkNeedUpdate(bool do_padding);
502};
503
504/*---------------------------------------------------------------------------*/
505/*---------------------------------------------------------------------------*/
506
507} // End namespace Arcane
508
509/*---------------------------------------------------------------------------*/
510/*---------------------------------------------------------------------------*/
511
512#endif
Interface d'une famille d'entités.
Definition IItemFamily.h:84
Interface d'un opérateur sur des entités rangées par type.
Interface d'un observable.
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.
ItemGroupImpl * parent() const
Groupe parent (0 si aucun)
void checkLocalIdsAreContiguous() const
Vérifie si les entités du groupe ont des localIds() contigüs.
const String & fullName() const
Nom complet du groupe (avec maillage + famille)
void checkLocalIdsAreContigous() const
bool isContiguousLocalIds() const
Indique si les entités du groupe ont des localIds() contigüs.
bool isContigousLocalIds() const
ItemGroupImpl()
Construit un groupe nul.
const String & name() const
Nom du groupe.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
Vue sur une liste pour obtenir des informations sur les entités.
Int32 refCount() const override
Retourne la valeur du compteur de référence.
Vue d'un tableau d'éléments de type T.
Definition Span.h:673
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:569
ConstArrayView< ItemInternal * > ItemInternalList
Type de la liste interne des entités.
Definition ItemTypes.h:466
eItemKind
Genre d'entité de maillage.
Array< Int32 > Int32Array
Tableau dynamique à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:214
std::int32_t Int32
Type entier signé sur 32 bits.