Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ItemGroup.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/* ItemGroup.h (C) 2000-2024 */
9/* */
10/* Groupes d'entités du maillage. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ITEMGROUP_H
13#define ARCANE_ITEMGROUP_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/AutoRef.h"
18#include "arcane/utils/Iterator.h"
19
20#include "arcane/core/ItemGroupImpl.h"
23
24/*---------------------------------------------------------------------------*/
25/*---------------------------------------------------------------------------*/
26
27namespace Arcane
28{
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
33class ItemVectorView;
34class IVariableSynchronizer;
35
36/*---------------------------------------------------------------------------*/
37/*---------------------------------------------------------------------------*/
38//NOTE: la documentation plus complète est dans ItemGroup.cc
39/*!
40 * \ingroup Mesh
41 * \brief Groupe d'entités de maillage.
42 *
43 * Un groupe d'entité contient un ensemble d'entité d'une famille
44 * donnée. Un groupe se créé via la famille correspondante par
45 * IItemFamily::createGroup(), IItemFamily::findGroup().
46 *
47 */
48class ARCANE_CORE_EXPORT ItemGroup
49{
50 public:
51
52 //! Construit un groupe nul.
53 ItemGroup();
54 //! Construit un groupe à partir de la représentation interne \a prv
55 // TODO: ce contructeur devrait être explicite pour éviter des conversions
56 // implicites mais on le met pas encore pour des raisons de compatibilité
57 /*explicit*/ ItemGroup(ItemGroupImpl* prv);
58 //! Construit une référence au groupe \a from.
59 ItemGroup(const ItemGroup& from) : m_impl(from.m_impl) {}
60
61 //! Affecte à cette instance une référence au groupe \a from.
62 ItemGroup& operator=(const ItemGroup& from) = default;
63
64 //! Type de l'intervalle d'itération (à supprimer)
66
67 public:
68
69 //! \a true is le groupe est le groupe nul
70 inline bool null() const
71 {
72 return m_impl->null();
73 }
74
75 //! Nom du groupe
76 inline const String& name() const
77 {
78 return m_impl->name();
79 }
80
81 //! Nom du groupe
82 inline const String& fullName() const
83 {
84 return m_impl->fullName();
85 }
86
87 //! Nombre d'éléments du groupe
88 inline Integer size() const
89 {
90 m_impl->_checkNeedUpdateNoPadding();
91 return m_impl->size();
92 }
93
94 /*!
95 * \brief Teste si le groupe est vide.
96 *
97 * Un groupe est vide s'il est nul (null() retourne \c true)
98 * ou s'il n'a pas d'éléments (size() retourne \c 0).
99 * \retval true si le groupe est vide,
100 * \retval false sinon.
101 */
102 inline bool empty() const
103 {
104 m_impl->_checkNeedUpdateNoPadding();
105 return m_impl->empty();
106 }
107
108 //! Genre du groupe. Il s'agit du genre de ses éléments
109 inline eItemKind itemKind() const { return m_impl->itemKind(); }
110
111 public:
112
113 /*!
114 * \internal
115 * \brief Retourne l'implémentation du groupe.
116 * \warning Cette méthode retourne un pointeur sur la représentation
117 * interne du groupe et ne doit pas être utilisée
118 * en dehors d'Arcane.
119 */
120 ItemGroupImpl* internal() const { return m_impl.get(); }
121
122 //! Famille d'entité à laquelle appartient ce groupe (0 pour le group nul)
123 IItemFamily* itemFamily() const { return m_impl->itemFamily(); }
124
125 //! Maillage auquel appartient ce groupe (0 pour le group nul)
126 IMesh* mesh() const { return m_impl->mesh(); }
127
128 public:
129
130 // Items in the group owned by the subdomain
131 ItemGroup own() const;
132
133 // Items in the group not owned by the subdomain
134 ItemGroup ghost() const;
135
136 //! Retourne si le groupe contient uniquement des éléments propres au sous-domaine
137 bool isOwn() const;
138
139 //! Positionne la propriété de groupe local ou non.
140 void setOwn(bool v);
141
142 // Items in the group lying on the boundary between two subdomains
143 // Implemented for faces only
144 ItemGroup interface() const;
145
146 //! Groupe des noeuds des éléments de ce groupe
147 NodeGroup nodeGroup() const;
148
149 //! Groupe des arêtes des éléments de ce groupe
150 EdgeGroup edgeGroup() const;
151
152 //! Groupe des faces des éléments de ce groupe
153 FaceGroup faceGroup() const;
154
155 //! Groupe des mailles des éléments de ce groupe
156 CellGroup cellGroup() const;
157
158 /*!
159 * \brief Groupe des faces internes des éléments de ce groupe
160 *
161 * Ce groupe n'existe que pour un groupe de maille (itemKind()==IK_Cell).
162 * Une face est interne si elle connectée à deux mailles de ce groupe.
163 */
164 FaceGroup innerFaceGroup() const;
165
166 /*!
167 * \brief Groupe des faces externes des éléments de ce groupe
168 *
169 * Ce groupe n'existe que pour un groupe de maille (itemKind()==IK_Cell).
170 * Une face est externe si elle n'est connectée qu'à une maille de ce groupe.
171 */
172 FaceGroup outerFaceGroup() const;
173
174 //! AMR
175 //! Groupe des mailles actives des éléments de ce groupe
176 CellGroup activeCellGroup() const;
177
178 //! Groupe des mailles propres actives des éléments de ce groupe
179 CellGroup ownActiveCellGroup() const;
180
181 //! Groupe des mailles de niveau l des éléments de ce groupe
182 CellGroup levelCellGroup(const Integer& level) const;
183
184 //! Groupe des mailles propres de niveau l des éléments de ce groupe
185 CellGroup ownLevelCellGroup(const Integer& level) const;
186
187 /*!
188 * \brief Groupe des faces actives
189 *
190 * Ce groupe n'existe que pour un groupe de maille (itemKind()==IK_Cell).
191 */
192 FaceGroup activeFaceGroup() const;
193
194 /*!
195 * \brief Groupe des faces actives propres au domaine des éléments de ce groupe
196 *
197 * Ce groupe n'existe que pour un groupe de maille (itemKind()==IK_Cell).
198 */
199 FaceGroup ownActiveFaceGroup() const;
200
201 /*!
202 * \brief Groupe des faces internes des éléments de ce groupe
203 *
204 * Ce groupe n'existe que pour un groupe de maille (itemKind()==IK_Cell).
205 * Une face est interne si elle connectée à deux mailles actives de ce groupe.
206 */
207 FaceGroup innerActiveFaceGroup() const;
208
209 /*!
210 * \brief Groupe des faces externes actives des éléments de ce groupe
211 *
212 * Ce groupe n'existe que pour un groupe de maille (itemKind()==IK_Cell).
213 * Une face est externe si elle n'est connectée qu'à une maille de ce groupe et est active.
214 */
215 FaceGroup outerActiveFaceGroup() const;
216
217 //! Crée un sous-groupe calculé
218 /*! Le gestion mémoire du functor est alors délégué au groupe */
219 ItemGroup createSubGroup(const String& suffix, IItemFamily* family, ItemGroupComputeFunctor* functor) const;
220
221 //! Accès à un sous-groupe
222 ItemGroup findSubGroup(const String& suffix) const;
223
224 //! Vrai si le groupe est local au sous-domaine
226 {
227 return m_impl->isLocalToSubDomain();
228 }
229
230 /*! \brief Positionne le booléen indiquant si le groupe est local au sous-domaine.
231
232 Par défaut lors de sa création, un groupe est commun à tous les sous-domaines,
233 ce qui signifie que chaque sous-domaine doit posséder une instance de ce groupe,
234 même si cette instance est vide.
235
236 Un groupe local au sous-domaine n'est pas transféré lors d'un rééquilibrage.
237 */
239 {
240 m_impl->setLocalToSubDomain(v);
241 }
242
243 /*! \brief Invalide le groupe.
244
245 Pour un groupe calculé dynamiquement (comme le groupe des entités propres
246 au sous-domaine), cela signifie qu'il doit se recalculer.
247
248 Si \a force_recompute est faux, le groupe est juste invalidé et sera
249 recalculé la première fois qu'on y accédera. Sinon, il est immédiatement
250 recalculé.
251 */
252 void invalidate(bool force_recompute=false) { m_impl->invalidate(force_recompute); }
253
254 //! Ajoute des entités.
255 void addItems(Int32ConstArrayView items_local_id,bool check_if_present=true);
256
257 //! Supprime des entités.
258 void removeItems(Int32ConstArrayView items_local_id,bool check_if_present=true);
259
260 //! Positionne les entités du groupe.
261 void setItems(Int32ConstArrayView items_local_id);
262
263 /*!
264 * \brief Positionne les entités du groupe.
265 *
266 * Si \a do_sort est vrai, les entités sont triées par uniqueId croissant.
267 */
268 void setItems(Int32ConstArrayView items_local_id,bool do_sort);
269
270 //! Vérification interne de la validité du groupe
271 void checkValid();
272
273 //! Supprime les entités du groupe
274 void clear();
275
276 //! Applique l'opération \a operation sur les entités du groupe.
277 void applyOperation(IItemOperationByBasicType* operation) const;
278
279 //! Vue sur les entités du groupe.
280 ItemVectorView view() const;
281
282 //! Indique si le groupe est celui de toutes les entités
283 bool isAllItems() const;
284
285 //! Retourne le temps du groupe. Ce temps est incrémenté après chaque modification.
286 Int64 timestamp() const
287 {
288 return m_impl->timestamp();
289 }
290
291 //! Table des local ids vers une position pour toutes les entités du groupe
293 {
294 return m_impl->localIdToIndex();
295 }
296
297 //! Synchronizer du groupe
298 IVariableSynchronizer* synchronizer() const;
299
300 //! Vrai s'il s'agit d'un groupe calculé automatiquement.
301 bool isAutoComputed() const;
302
303 //! Indique si le groupe possède un synchroniser actif
304 bool hasSynchronizer() const;
305
306 //! Vérifie et retourne si le groupe est trié par uniqueId() croissants.
307 bool checkIsSorted() const;
308
309 //! Vue sur les entités du groupe avec padding pour la vectorisation
310 ItemVectorView _paddedView() const;
311
312 /*!
313 * \brief Vue sur les entités du groupe sans padding pour la vectorisation.
314 *
315 * La vue retournée NE doit PAS être utilisée dans les macros de vectorisation
316 * telles ENUMERATE_SIMD_CELL().
317 */
318 ItemVectorView _unpaddedView() const;
319
320 public:
321
322 //! API interne à Arcane
323 ItemGroupImplInternal* _internalApi() const;
324
325 public:
326
327 //! Enumérateur sur les entités du groupe.
328 ItemEnumerator enumerator() const;
329
330 private:
331
332 template <typename T>
334 //! Enumérateur sur les entités du groupe pour la vectorisation
335 ItemEnumerator _simdEnumerator() const;
336
337 protected:
338
339 //! Représentation interne du groupe.
341
342 protected:
343
344 //! Retourne le groupe \a impl s'il est du genre \a kt, le groupe nul sinon
346 {
347 return impl->itemKind()==ik ? impl : ItemGroupImpl::checkSharedNull();
348 }
349
350 ItemVectorView _view(bool do_padding) const;
351};
352
353/*---------------------------------------------------------------------------*/
354/*---------------------------------------------------------------------------*/
355/*!
356 * \brief Compare les références de deux groupes.
357 * \retval true si \a g1 et \a g2 réfèrent au même groupe,
358 * \retval false sinon.
359 */
360inline bool
361operator==(const ItemGroup& g1,const ItemGroup& g2)
362{
363 return g1.internal()==g2.internal();
364}
365
366/*!
367 * \brief Compare deux groupes.
368 * L'ordre utilisé est quelconque et ne sert que pour faire un tri
369 * éventuel pour les containers de la STL.
370 * \retval true si \a g1 est inférieur à \a g2,
371 * \retval false sinon.
372 */
373inline bool
374operator<(const ItemGroup& g1,const ItemGroup& g2)
375{
376 return g1.internal()<g2.internal();
377}
378
379/*!
380 * \brief Compare les références de deux groupes.
381 * \retval true si \a g1 et \a g2 ne réfèrent pas au même groupe,
382 * \retval false sinon.
383 */
384inline bool
385operator!=(const ItemGroup& g1,const ItemGroup& g2)
386{
387 return g1.internal()!=g2.internal();
388}
389
390/*---------------------------------------------------------------------------*/
391/*---------------------------------------------------------------------------*/
392/*!
393 * \brief Référence à un groupe d'un genre donné.
394 */
395template<typename T>
397: public ItemGroup
398{
399 public:
400
401 //! Type de cette classe
403 //! Type de la classe contenant les caractéristiques de l'entité
405
406 typedef typename TraitsType::ItemType ItemType;
407
408 typedef const ItemType* const_iterator;
409 typedef ItemType* iterator;
410 typedef ItemType value_type;
411 typedef const ItemType& const_reference;
412
413 public:
414
415 inline ItemGroupT() = default;
416 inline explicit ItemGroupT(ItemGroupImpl* from)
417 : ItemGroup(_check(from,TraitsType::kind())){}
418 inline ItemGroupT(const ItemGroup& from)
419 : ItemGroup(_check(from.internal(),TraitsType::kind())) {}
420 inline ItemGroupT(const ItemGroupT<T>& from)
421 : ItemGroup(from) {}
422 inline const ItemGroupT<T>& operator=(const ItemGroupT<T>& from)
423 { m_impl = from.internal(); return (*this); }
424 inline const ItemGroupT<T>& operator=(const ItemGroup& from)
425 { _assign(from); return (*this); }
426
427 public:
428
429 ThatClass own() const
430 {
431 return ThatClass(ItemGroup::own());
432 }
433
434 ItemEnumeratorT<T> enumerator() const
435 {
436 return ItemEnumeratorT<T>::fromItemEnumerator(ItemGroup::enumerator());
437 }
438
439 protected:
440
441 void _assign(const ItemGroup& from)
442 {
443 m_impl = _check(from.internal(),TraitsType::kind());
444 }
445};
446
447/*---------------------------------------------------------------------------*/
448/*---------------------------------------------------------------------------*/
449
450} // End namespace Arcane
451
452/*---------------------------------------------------------------------------*/
453/*---------------------------------------------------------------------------*/
454
455#endif
Types et macros pour itérer sur les entités du maillage.
Déclarations de types sur les entités.
Encapsulation d'un pointeur avec compteur de référence.
Definition AutoRef.h:41
Interface d'une famille d'entités.
Interface d'un opérateur sur des entités rangées par type.
Interface d'un service de synchronisation de variable.
Enumérateur sur une liste d'entités.
Fonctor pour le calcul des éléments d'un groupe.
eItemKind itemKind() const
Genre du groupe. Il s'agit du genre de ses éléments.
ItemTraitsT< T > TraitsType
Type de la classe contenant les caractéristiques de l'entité
Definition ItemGroup.h:404
ItemGroupT< T > ThatClass
Type de cette classe.
Definition ItemGroup.h:402
Groupe d'entités de maillage.
Definition ItemGroup.h:49
ItemEnumerator enumerator() const
Enumérateur sur les entités du groupe.
Definition ItemGroup.cc:542
bool empty() const
Teste si le groupe est vide.
Definition ItemGroup.h:102
void setLocalToSubDomain(bool v)
Positionne le booléen indiquant si le groupe est local au sous-domaine.
Definition ItemGroup.h:238
static ItemGroupImpl * _check(ItemGroupImpl *impl, eItemKind ik)
Retourne le groupe impl s'il est du genre kt, le groupe nul sinon.
Definition ItemGroup.h:345
const String & name() const
Nom du groupe.
Definition ItemGroup.h:76
bool isLocalToSubDomain() const
Vrai si le groupe est local au sous-domaine.
Definition ItemGroup.h:225
void invalidate(bool force_recompute=false)
Invalide le groupe.
Definition ItemGroup.h:252
Int64 timestamp() const
Retourne le temps du groupe. Ce temps est incrémenté après chaque modification.
Definition ItemGroup.h:286
ItemGroup & operator=(const ItemGroup &from)=default
Affecte à cette instance une référence au groupe from.
const String & fullName() const
Nom du groupe.
Definition ItemGroup.h:82
SharedPtrT< GroupIndexTable > localIdToIndex() const
Table des local ids vers une position pour toutes les entités du groupe.
Definition ItemGroup.h:292
Integer size() const
Nombre d'éléments du groupe.
Definition ItemGroup.h:88
IItemFamily * itemFamily() const
Famille d'entité à laquelle appartient ce groupe (0 pour le group nul)
Definition ItemGroup.h:123
ItemGroup(const ItemGroup &from)
Construit une référence au groupe from.
Definition ItemGroup.h:59
AutoRefT< ItemGroupImpl > m_impl
Représentation interne du groupe.
Definition ItemGroup.h:340
eItemKind itemKind() const
Genre du groupe. Il s'agit du genre de ses éléments.
Definition ItemGroup.h:109
bool null() const
true is le groupe est le groupe nul
Definition ItemGroup.h:70
ItemEnumerator const_iter
Type de l'intervalle d'itération (à supprimer)
Definition ItemGroup.h:65
ItemGroup()
Construit un groupe nul.
Definition ItemGroup.cc:148
IMesh * mesh() const
Maillage auquel appartient ce groupe (0 pour le group nul)
Definition ItemGroup.h:126
ItemGroup own() const
Groupe équivalent à celui-ci mais contenant uniquement les éléments propres au sous-domaine.
Definition ItemGroup.cc:189
Vue sur un vecteur d'entités.
Vue constante d'un tableau de type T.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
bool operator<(const Item &item1, const Item &item2)
Compare deux entités.
Definition Item.h:533
eItemKind
Genre d'entité de maillage.