Arcane  v3.16.2.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ItemGroup.cc
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/* ItemGroup.cc (C) 2000-2025 */
9/* */
10/* Groupes d'entités du maillage. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/core/ItemGroup.h"
15
16#include "arcane/utils/String.h"
17#include "arcane/utils/ArgumentException.h"
18
19#include "arcane/core/IItemFamily.h"
20#include "arcane/core/IMesh.h"
21#include "arcane/core/ICaseMng.h"
22#include "arcane/core/CaseOptionBase.h"
23#include "arcane/core/ICaseOptionList.h"
24#include "arcane/core/MeshHandle.h"
25#include "arcane/core/internal/ItemGroupInternal.h"
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
127/*---------------------------------------------------------------------------*/
128/*---------------------------------------------------------------------------*/
129
132: m_impl(grp)
133{
134 // Si \a grp est nul, le remplace par le groupe nul.
135 // Cela est fait (version 2.3) pour des raisons de compatibilité.
136 // A terme, ce constructeur sera explicite et dans ce cas il
137 // faudra faire:
138 // ARCANE_CHECK_POINTER(grp);
139 if (!grp){
140 std::cerr << "Creating group with null pointer is not allowed\n";
141 m_impl = ItemGroupImpl::checkSharedNull();
142 }
143}
144
145/*---------------------------------------------------------------------------*/
146/*---------------------------------------------------------------------------*/
147
149ItemGroup()
150: m_impl(ItemGroupImpl::checkSharedNull())
151{
152}
153
154/*---------------------------------------------------------------------------*/
155/*---------------------------------------------------------------------------*/
156
158isOwn() const
159{
160 if (null())
161 return true;
162
163 return m_impl->isOwn();
164}
165
166/*---------------------------------------------------------------------------*/
167/*---------------------------------------------------------------------------*/
168
170setOwn(bool v)
171{
172 if (!null())
173 m_impl->setOwn(v);
174}
175
176/*---------------------------------------------------------------------------*/
177/*---------------------------------------------------------------------------*/
190own() const
191{
192 if (null() || isOwn())
193 return (*this);
194 m_impl->checkNeedUpdate();
195 return ItemGroup(m_impl->ownGroup());
196}
197
198/*---------------------------------------------------------------------------*/
199/*---------------------------------------------------------------------------*/
200
201// group of items owned by the subdomain
202ItemGroup ItemGroup::
203ghost() const
204{
205 if (null())
206 return ItemGroup();
207 m_impl->checkNeedUpdate();
208 return ItemGroup(m_impl->ghostGroup());
209}
210
211/*---------------------------------------------------------------------------*/
212/*---------------------------------------------------------------------------*/
213
214// Items in the group lying on the boundary between two subdomains
215// Implemented for faces only
216ItemGroup ItemGroup::
217interface() const
218{
219 if (null())
220 return ItemGroup();
221 m_impl->checkNeedUpdate();
222 return ItemGroup(m_impl->interfaceGroup());
223}
224
225// GERER PLANTAGE SORTED
226/*---------------------------------------------------------------------------*/
227/*---------------------------------------------------------------------------*/
228
230nodeGroup() const
231{
232 if (null())
233 return ItemGroup();
234 m_impl->checkNeedUpdate();
235 return NodeGroup(m_impl->nodeGroup());
236}
237
238/*---------------------------------------------------------------------------*/
239/*---------------------------------------------------------------------------*/
240
242edgeGroup() const
243{
244 if (null())
245 return ItemGroup();
246 m_impl->checkNeedUpdate();
247 return EdgeGroup(m_impl->edgeGroup());
248}
249
250/*---------------------------------------------------------------------------*/
251/*---------------------------------------------------------------------------*/
252
254faceGroup() const
255{
256 if (null())
257 return ItemGroup();
258 m_impl->checkNeedUpdate();
259 return FaceGroup(m_impl->faceGroup());
260}
261
262/*---------------------------------------------------------------------------*/
263/*---------------------------------------------------------------------------*/
264
266cellGroup() const
267{
268 if (null())
269 return ItemGroup();
270 m_impl->checkNeedUpdate();
271 return CellGroup(m_impl->cellGroup());
272}
273
274/*---------------------------------------------------------------------------*/
275/*---------------------------------------------------------------------------*/
276
278innerFaceGroup() const
279{
280 if (null())
281 return ItemGroup();
282 m_impl->checkNeedUpdate();
283 return FaceGroup(m_impl->innerFaceGroup());
284}
285
286/*---------------------------------------------------------------------------*/
287/*---------------------------------------------------------------------------*/
288
290outerFaceGroup() const
291{
292 if (null())
293 return ItemGroup();
294 m_impl->checkNeedUpdate();
295 return FaceGroup(m_impl->outerFaceGroup());
296}
297
298/*---------------------------------------------------------------------------*/
299/*---------------------------------------------------------------------------*/
301/*---------------------------------------------------------------------------*/
302/*---------------------------------------------------------------------------*/
303
305activeCellGroup() const
306{
307 if (null())
308 return ItemGroup();
309 m_impl->checkNeedUpdate();
310 return CellGroup(m_impl->activeCellGroup());
311}
312
313/*---------------------------------------------------------------------------*/
314/*---------------------------------------------------------------------------*/
315
317ownActiveCellGroup() const
318{
319 if (null())
320 return ItemGroup();
321 m_impl->checkNeedUpdate();
322 return CellGroup(m_impl->ownActiveCellGroup());
323}
324
325/*---------------------------------------------------------------------------*/
326/*---------------------------------------------------------------------------*/
327
329levelCellGroup(const Integer& level) const
330{
331 if (null())
332 return ItemGroup();
333 m_impl->checkNeedUpdate();
334 return CellGroup(m_impl->levelCellGroup(level));
335}
336
337/*---------------------------------------------------------------------------*/
338/*---------------------------------------------------------------------------*/
339
341ownLevelCellGroup(const Integer& level) const
342{
343 if (null())
344 return ItemGroup();
345 m_impl->checkNeedUpdate();
346 return CellGroup(m_impl->ownLevelCellGroup(level));
347}
348/*---------------------------------------------------------------------------*/
349/*---------------------------------------------------------------------------*/
350
352activeFaceGroup() const
353{
354 if (null())
355 return ItemGroup();
356 m_impl->checkNeedUpdate();
357 return FaceGroup(m_impl->activeFaceGroup());
358}
359
360/*---------------------------------------------------------------------------*/
361/*---------------------------------------------------------------------------*/
362
364ownActiveFaceGroup() const
365{
366 if (null())
367 return ItemGroup();
368 m_impl->checkNeedUpdate();
369 return FaceGroup(m_impl->ownActiveFaceGroup());
370}
371
372/*---------------------------------------------------------------------------*/
373/*---------------------------------------------------------------------------*/
374
375/*---------------------------------------------------------------------------*/
376/*---------------------------------------------------------------------------*/
377
380{
381 if (null())
382 return ItemGroup();
383 m_impl->checkNeedUpdate();
384 return FaceGroup(m_impl->innerActiveFaceGroup());
385}
386
387/*---------------------------------------------------------------------------*/
388/*---------------------------------------------------------------------------*/
389
392{
393 if (null())
394 return ItemGroup();
395 m_impl->checkNeedUpdate();
396 return FaceGroup(m_impl->outerActiveFaceGroup());
397}
398
399/*---------------------------------------------------------------------------*/
400/*---------------------------------------------------------------------------*/
401
402/*---------------------------------------------------------------------------*/
403/*---------------------------------------------------------------------------*/
404
406createSubGroup(const String & suffix, IItemFamily * family, ItemGroupComputeFunctor * functor) const
407{
408 if (null())
409 return ItemGroup();
410 m_impl->checkNeedUpdate();
411 return ItemGroup(m_impl->createSubGroup(suffix,family,functor));
412}
413
414/*---------------------------------------------------------------------------*/
415/*---------------------------------------------------------------------------*/
416
418findSubGroup(const String & suffix) const
419{
420 if (null())
421 return ItemGroup();
422 return ItemGroup(m_impl->findSubGroup(suffix));
423}
424
425/*---------------------------------------------------------------------------*/
426/*---------------------------------------------------------------------------*/
427
429clear()
430{
431 m_impl->clear();
432}
433
434/*---------------------------------------------------------------------------*/
435/*---------------------------------------------------------------------------*/
446addItems(Int32ConstArrayView items_local_id,bool check_if_present)
447{
448 if (null())
449 throw ArgumentException(A_FUNCINFO,"Can not addItems() to null group");
450 if (isAllItems())
451 throw ArgumentException(A_FUNCINFO,"Can not addItems() to all-items group");
452 m_impl->_checkNeedUpdateNoPadding();
453 m_impl->addItems(items_local_id,check_if_present);
454}
455
456/*---------------------------------------------------------------------------*/
457/*---------------------------------------------------------------------------*/
468removeItems(Int32ConstArrayView items_local_id,bool check_if_present)
469{
470 if (null())
471 throw ArgumentException(A_FUNCINFO,"Can not removeItems() to null group");
472 if (isAllItems())
473 throw ArgumentException(A_FUNCINFO,"Can not removeItems() to all-items group");
474 m_impl->_checkNeedUpdateNoPadding();
475 m_impl->removeItems(items_local_id,check_if_present);
476}
477
478/*---------------------------------------------------------------------------*/
479/*---------------------------------------------------------------------------*/
489setItems(Int32ConstArrayView items_local_id)
490{
491 if (null())
492 throw ArgumentException(A_FUNCINFO,"Can not setItems() to null group");
493 m_impl->setItems(items_local_id);
494}
495
496/*---------------------------------------------------------------------------*/
497/*---------------------------------------------------------------------------*/
509setItems(Int32ConstArrayView items_local_id,bool do_sort)
510{
511 if (null())
512 throw ArgumentException(A_FUNCINFO,"Can not setItems() to null group");
513 m_impl->setItems(items_local_id,do_sort);
514}
515
516/*---------------------------------------------------------------------------*/
517/*---------------------------------------------------------------------------*/
523{
524 m_impl->checkValid();
525}
526
527/*---------------------------------------------------------------------------*/
528/*---------------------------------------------------------------------------*/
529
532{
533 if (null())
534 return;
535 m_impl->checkNeedUpdate();
536 m_impl->applyOperation(operation);
537}
538
539/*---------------------------------------------------------------------------*/
540/*---------------------------------------------------------------------------*/
541
543enumerator() const
544{
545 if (null())
546 return ItemEnumerator();
547 m_impl->_checkNeedUpdateNoPadding();
548 return ItemEnumerator(m_impl->itemInfoListView(),m_impl->itemsLocalId(),m_impl.get());
549}
550
551/*---------------------------------------------------------------------------*/
552/*---------------------------------------------------------------------------*/
553
555_simdEnumerator() const
556{
557 if (null())
558 return ItemEnumerator();
559 m_impl->_checkNeedUpdateWithPadding();
560 return ItemEnumerator(m_impl->itemInfoListView(),m_impl->itemsLocalId(),m_impl.get());
561}
562
563/*---------------------------------------------------------------------------*/
564/*---------------------------------------------------------------------------*/
565
566ItemVectorView ItemGroup::
567_view(bool do_padding) const
568{
569 if (null())
570 return ItemVectorView();
571 m_impl->_checkNeedUpdate(do_padding);
572 Int32 flags = 0;
573 if (m_impl->isContigousLocalIds())
575 // TODO: gérer l'offset
576 return ItemVectorView(m_impl->itemFamily(),ItemIndexArrayView(m_impl->itemsLocalId(),0,flags));
577}
578
579/*---------------------------------------------------------------------------*/
580/*---------------------------------------------------------------------------*/
581
583view() const
584{
585 return _view(true);
586}
587
588/*---------------------------------------------------------------------------*/
589/*---------------------------------------------------------------------------*/
590
592_paddedView() const
593{
594 return _view(true);
595}
596
597/*---------------------------------------------------------------------------*/
598/*---------------------------------------------------------------------------*/
599
601_unpaddedView() const
602{
603 return _view(false);
604}
605
606/*---------------------------------------------------------------------------*/
607/*---------------------------------------------------------------------------*/
608
610isAllItems() const
611{
612 return m_impl->isAllItems();
613}
614
615/*---------------------------------------------------------------------------*/
616/*---------------------------------------------------------------------------*/
617
619synchronizer() const
620{
621 return m_impl->synchronizer();
622}
623
624/*---------------------------------------------------------------------------*/
625/*---------------------------------------------------------------------------*/
626
628isAutoComputed() const
629{
630 return m_impl->hasComputeFunctor();
631}
632
633/*---------------------------------------------------------------------------*/
634/*---------------------------------------------------------------------------*/
635
637hasSynchronizer() const
638{
639 return m_impl->hasSynchronizer();
640}
641
642/*---------------------------------------------------------------------------*/
643/*---------------------------------------------------------------------------*/
644
646_internalApi() const
647{
648 return m_impl->_internalApi();
649}
650
651/*---------------------------------------------------------------------------*/
652/*---------------------------------------------------------------------------*/
653
655checkIsSorted() const
656{
657 m_impl->_checkNeedUpdate(false);
658 return m_impl->checkIsSorted();
659}
660
661/*---------------------------------------------------------------------------*/
662/*---------------------------------------------------------------------------*/
663
665incrementTimestamp() const
666{
667 m_impl->m_p->updateTimestamp();
668}
669
670/*---------------------------------------------------------------------------*/
671/*---------------------------------------------------------------------------*/
672
673extern ARCANE_CORE_EXPORT bool
674_caseOptionConvert(const CaseOptionBase& co,const String& name,ItemGroup& obj)
675{
677 obj = mesh->findGroup(name);
678 return obj.null();
679}
680
681extern ARCANE_CORE_EXPORT bool
682_caseOptionConvert(const CaseOptionBase& co,const String& name,NodeGroup& obj)
683{
684 IMesh* mesh = co.parentOptionList()->meshHandle().mesh();
685 obj = mesh->nodeFamily()->findGroup(name);
686 return obj.null();
687}
688
689extern ARCANE_CORE_EXPORT bool
690_caseOptionConvert(const CaseOptionBase& co,const String& name,EdgeGroup& obj)
691{
692 IMesh* mesh = co.parentOptionList()->meshHandle().mesh();
693 obj = mesh->edgeFamily()->findGroup(name);
694 return obj.null();
695}
696
697extern ARCANE_CORE_EXPORT bool
698_caseOptionConvert(const CaseOptionBase& co,const String& name,FaceGroup& obj)
699{
700 IMesh* mesh = co.parentOptionList()->meshHandle().mesh();
701 obj = mesh->faceFamily()->findGroup(name);
702 return obj.null();
703}
704
705extern ARCANE_CORE_EXPORT bool
706_caseOptionConvert(const CaseOptionBase& co,const String& name,CellGroup& obj)
707{
708 IMesh* mesh = co.parentOptionList()->meshHandle().mesh();
709 obj = mesh->cellFamily()->findGroup(name);
710 return obj.null();
711}
712
713/*---------------------------------------------------------------------------*/
714/*---------------------------------------------------------------------------*/
715
716} // End namespace Arcane
717
718/*---------------------------------------------------------------------------*/
719/*---------------------------------------------------------------------------*/
Exception lorsqu'un argument est invalide.
Classe de base d'une option du jeu de donnée.
ICaseOptionList * parentOptionList() const
OptionList parent.
virtual MeshHandle meshHandle() const =0
Handle du maillage associé
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 service de synchronisation de variable.
Enumérateur sur une liste d'entités.
Fonctor pour le calcul des éléments d'un groupe.
API interne à Arcane de ItemGroupImpl.
Implémentation d'un groupe d'entités de maillage.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
ItemEnumerator enumerator() const
Enumérateur sur les entités du groupe.
Definition ItemGroup.cc:543
bool checkIsSorted() const
Vérifie et retourne si le groupe est trié par uniqueId() croissants.
Definition ItemGroup.cc:655
void clear()
Supprime les entités du groupe.
Definition ItemGroup.cc:429
ItemGroup findSubGroup(const String &suffix) const
Accès à un sous-groupe.
Definition ItemGroup.cc:418
ItemGroup createSubGroup(const String &suffix, IItemFamily *family, ItemGroupComputeFunctor *functor) const
Crée un sous-groupe calculé
Definition ItemGroup.cc:406
IVariableSynchronizer * synchronizer() const
Synchronizer du groupe.
Definition ItemGroup.cc:619
NodeGroup nodeGroup() const
Groupe des noeuds des éléments de ce groupe.
Definition ItemGroup.cc:230
bool isAutoComputed() const
Vrai s'il s'agit d'un groupe calculé automatiquement.
Definition ItemGroup.cc:628
FaceGroup faceGroup() const
Groupe des faces des éléments de ce groupe.
Definition ItemGroup.cc:254
void incrementTimestamp() const
Incrément le temps de dernière modification du groupe.
Definition ItemGroup.cc:665
bool isOwn() const
Retourne si le groupe contient uniquement des éléments propres au sous-domaine.
Definition ItemGroup.cc:158
void removeItems(Int32ConstArrayView items_local_id, bool check_if_present=true)
Supprime des entités.
Definition ItemGroup.cc:468
FaceGroup activeFaceGroup() const
Groupe des faces actives.
Definition ItemGroup.cc:352
FaceGroup innerActiveFaceGroup() const
Groupe des faces internes des éléments de ce groupe.
Definition ItemGroup.cc:379
ItemVectorView view() const
Vue sur les entités du groupe.
Definition ItemGroup.cc:583
void setItems(Int32ConstArrayView items_local_id)
Positionne les entités du groupe.
Definition ItemGroup.cc:489
FaceGroup ownActiveFaceGroup() const
Groupe des faces actives propres au domaine des éléments de ce groupe.
Definition ItemGroup.cc:364
CellGroup cellGroup() const
Groupe des mailles des éléments de ce groupe.
Definition ItemGroup.cc:266
void applyOperation(IItemOperationByBasicType *operation) const
Applique l'opération operation sur les entités du groupe.
Definition ItemGroup.cc:531
AutoRefT< ItemGroupImpl > m_impl
Représentation interne du groupe.
Definition ItemGroup.h:355
CellGroup levelCellGroup(const Integer &level) const
Groupe des mailles de niveau l des éléments de ce groupe.
Definition ItemGroup.cc:329
void addItems(Int32ConstArrayView items_local_id, bool check_if_present=true)
Ajoute des entités.
Definition ItemGroup.cc:446
FaceGroup innerFaceGroup() const
Groupe des faces internes des éléments de ce groupe.
Definition ItemGroup.cc:278
ItemGroupImplInternal * _internalApi() const
API interne à Arcane.
Definition ItemGroup.cc:646
ItemEnumerator _simdEnumerator() const
Enumérateur sur les entités du groupe pour la vectorisation.
Definition ItemGroup.cc:555
ItemVectorView _paddedView() const
Vue sur les entités du groupe avec padding pour la vectorisation.
Definition ItemGroup.cc:592
bool hasSynchronizer() const
Indique si le groupe possède un synchroniser actif.
Definition ItemGroup.cc:637
bool isAllItems() const
Indique si le groupe est celui de toutes les entités.
Definition ItemGroup.cc:610
ItemVectorView _unpaddedView() const
Vue sur les entités du groupe sans padding pour la vectorisation.
Definition ItemGroup.cc:601
EdgeGroup edgeGroup() const
Groupe des arêtes des éléments de ce groupe.
Definition ItemGroup.cc:242
CellGroup ownActiveCellGroup() const
Groupe des mailles propres actives des éléments de ce groupe.
Definition ItemGroup.cc:317
void checkValid()
Vérification interne de la validité du groupe.
Definition ItemGroup.cc:522
bool null() const
true is le groupe est le groupe nul
Definition ItemGroup.h:70
void setOwn(bool v)
Positionne la propriété de groupe local ou non.
Definition ItemGroup.cc:170
CellGroup ownLevelCellGroup(const Integer &level) const
Groupe des mailles propres de niveau l des éléments de ce groupe.
Definition ItemGroup.cc:341
ItemGroup()
Construit un groupe nul.
Definition ItemGroup.cc:149
FaceGroup outerActiveFaceGroup() const
Groupe des faces externes actives des éléments de ce groupe.
Definition ItemGroup.cc:391
ItemGroup own() const
Groupe équivalent à celui-ci mais contenant uniquement les éléments propres au sous-domaine.
Definition ItemGroup.cc:190
CellGroup activeCellGroup() const
AMR.
Definition ItemGroup.cc:305
FaceGroup outerFaceGroup() const
Groupe des faces externes des éléments de ce groupe.
Definition ItemGroup.cc:290
Vue sur un tableau d'index (localIds()) d'entités.
@ F_Contigous
Les numéros locaux sont contigüs.
Vue sur un vecteur d'entités.
IMesh * mesh() const
Maillage associé.
Chaîne de caractères unicode.
ItemGroupT< Cell > CellGroup
Groupe de mailles.
Definition ItemTypes.h:183
ItemGroupT< Face > FaceGroup
Groupe de faces.
Definition ItemTypes.h:178
ItemGroupT< Edge > EdgeGroup
Groupe d'arêtes.
Definition ItemTypes.h:173
ItemGroupT< Node > NodeGroup
Groupe de noeuds.
Definition ItemTypes.h:167
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
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
std::int32_t Int32
Type entier signé sur 32 bits.