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