Arcane  v3.14.10.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-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.cc (C) 2000-2024 */
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
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29namespace Arcane
30{
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
126/*---------------------------------------------------------------------------*/
127/*---------------------------------------------------------------------------*/
128
131: m_impl(grp)
132{
133 // Si \a grp est nul, le remplace par le groupe nul.
134 // Cela est fait (version 2.3) pour des raisons de compatibilité.
135 // A terme, ce constructeur sera explicite et dans ce cas il
136 // faudra faire:
137 // ARCANE_CHECK_POINTER(grp);
138 if (!grp){
139 std::cerr << "Creating group with null pointer is not allowed\n";
140 m_impl = ItemGroupImpl::checkSharedNull();
141 }
142}
143
144/*---------------------------------------------------------------------------*/
145/*---------------------------------------------------------------------------*/
146
148ItemGroup()
149: m_impl(ItemGroupImpl::checkSharedNull())
150{
151}
152
153/*---------------------------------------------------------------------------*/
154/*---------------------------------------------------------------------------*/
155
157isOwn() const
158{
159 if (null())
160 return true;
161
162 return m_impl->isOwn();
163}
164
165/*---------------------------------------------------------------------------*/
166/*---------------------------------------------------------------------------*/
167
169setOwn(bool v)
170{
171 if (!null())
172 m_impl->setOwn(v);
173}
174
175/*---------------------------------------------------------------------------*/
176/*---------------------------------------------------------------------------*/
189own() const
190{
191 if (null() || isOwn())
192 return (*this);
193 m_impl->checkNeedUpdate();
194 return ItemGroup(m_impl->ownGroup());
195}
196
197/*---------------------------------------------------------------------------*/
198/*---------------------------------------------------------------------------*/
199
200// group of items owned by the subdomain
201ItemGroup ItemGroup::
202ghost() const
203{
204 if (null())
205 return ItemGroup();
206 m_impl->checkNeedUpdate();
207 return ItemGroup(m_impl->ghostGroup());
208}
209
210/*---------------------------------------------------------------------------*/
211/*---------------------------------------------------------------------------*/
212
213// Items in the group lying on the boundary between two subdomains
214// Implemented for faces only
215ItemGroup ItemGroup::
216interface() const
217{
218 if (null())
219 return ItemGroup();
220 m_impl->checkNeedUpdate();
221 return ItemGroup(m_impl->interfaceGroup());
222}
223
224// GERER PLANTAGE SORTED
225/*---------------------------------------------------------------------------*/
226/*---------------------------------------------------------------------------*/
227
229nodeGroup() const
230{
231 if (null())
232 return ItemGroup();
233 m_impl->checkNeedUpdate();
234 return NodeGroup(m_impl->nodeGroup());
235}
236
237/*---------------------------------------------------------------------------*/
238/*---------------------------------------------------------------------------*/
239
241edgeGroup() const
242{
243 if (null())
244 return ItemGroup();
245 m_impl->checkNeedUpdate();
246 return EdgeGroup(m_impl->edgeGroup());
247}
248
249/*---------------------------------------------------------------------------*/
250/*---------------------------------------------------------------------------*/
251
253faceGroup() const
254{
255 if (null())
256 return ItemGroup();
257 m_impl->checkNeedUpdate();
258 return FaceGroup(m_impl->faceGroup());
259}
260
261/*---------------------------------------------------------------------------*/
262/*---------------------------------------------------------------------------*/
263
265cellGroup() const
266{
267 if (null())
268 return ItemGroup();
269 m_impl->checkNeedUpdate();
270 return CellGroup(m_impl->cellGroup());
271}
272
273/*---------------------------------------------------------------------------*/
274/*---------------------------------------------------------------------------*/
275
277innerFaceGroup() const
278{
279 if (null())
280 return ItemGroup();
281 m_impl->checkNeedUpdate();
282 return FaceGroup(m_impl->innerFaceGroup());
283}
284
285/*---------------------------------------------------------------------------*/
286/*---------------------------------------------------------------------------*/
287
289outerFaceGroup() const
290{
291 if (null())
292 return ItemGroup();
293 m_impl->checkNeedUpdate();
294 return FaceGroup(m_impl->outerFaceGroup());
295}
296
297/*---------------------------------------------------------------------------*/
298/*---------------------------------------------------------------------------*/
300/*---------------------------------------------------------------------------*/
301/*---------------------------------------------------------------------------*/
302
304activeCellGroup() const
305{
306 if (null())
307 return ItemGroup();
308 m_impl->checkNeedUpdate();
309 return CellGroup(m_impl->activeCellGroup());
310}
311
312/*---------------------------------------------------------------------------*/
313/*---------------------------------------------------------------------------*/
314
316ownActiveCellGroup() const
317{
318 if (null())
319 return ItemGroup();
320 m_impl->checkNeedUpdate();
321 return CellGroup(m_impl->ownActiveCellGroup());
322}
323
324/*---------------------------------------------------------------------------*/
325/*---------------------------------------------------------------------------*/
326
328levelCellGroup(const Integer& level) const
329{
330 if (null())
331 return ItemGroup();
332 m_impl->checkNeedUpdate();
333 return CellGroup(m_impl->levelCellGroup(level));
334}
335
336/*---------------------------------------------------------------------------*/
337/*---------------------------------------------------------------------------*/
338
340ownLevelCellGroup(const Integer& level) const
341{
342 if (null())
343 return ItemGroup();
344 m_impl->checkNeedUpdate();
345 return CellGroup(m_impl->ownLevelCellGroup(level));
346}
347/*---------------------------------------------------------------------------*/
348/*---------------------------------------------------------------------------*/
349
351activeFaceGroup() const
352{
353 if (null())
354 return ItemGroup();
355 m_impl->checkNeedUpdate();
356 return FaceGroup(m_impl->activeFaceGroup());
357}
358
359/*---------------------------------------------------------------------------*/
360/*---------------------------------------------------------------------------*/
361
363ownActiveFaceGroup() const
364{
365 if (null())
366 return ItemGroup();
367 m_impl->checkNeedUpdate();
368 return FaceGroup(m_impl->ownActiveFaceGroup());
369}
370
371/*---------------------------------------------------------------------------*/
372/*---------------------------------------------------------------------------*/
373
374/*---------------------------------------------------------------------------*/
375/*---------------------------------------------------------------------------*/
376
379{
380 if (null())
381 return ItemGroup();
382 m_impl->checkNeedUpdate();
383 return FaceGroup(m_impl->innerActiveFaceGroup());
384}
385
386/*---------------------------------------------------------------------------*/
387/*---------------------------------------------------------------------------*/
388
391{
392 if (null())
393 return ItemGroup();
394 m_impl->checkNeedUpdate();
395 return FaceGroup(m_impl->outerActiveFaceGroup());
396}
397
398/*---------------------------------------------------------------------------*/
399/*---------------------------------------------------------------------------*/
400
401/*---------------------------------------------------------------------------*/
402/*---------------------------------------------------------------------------*/
403
405createSubGroup(const String & suffix, IItemFamily * family, ItemGroupComputeFunctor * functor) const
406{
407 if (null())
408 return ItemGroup();
409 m_impl->checkNeedUpdate();
410 return ItemGroup(m_impl->createSubGroup(suffix,family,functor));
411}
412
413/*---------------------------------------------------------------------------*/
414/*---------------------------------------------------------------------------*/
415
417findSubGroup(const String & suffix) const
418{
419 if (null())
420 return ItemGroup();
421 return ItemGroup(m_impl->findSubGroup(suffix));
422}
423
424/*---------------------------------------------------------------------------*/
425/*---------------------------------------------------------------------------*/
426
428clear()
429{
430 m_impl->clear();
431}
432
433/*---------------------------------------------------------------------------*/
434/*---------------------------------------------------------------------------*/
446{
447 if (null())
448 throw ArgumentException(A_FUNCINFO,"Can not addItems() to null group");
449 if (isAllItems())
450 throw ArgumentException(A_FUNCINFO,"Can not addItems() to all-items group");
451 m_impl->_checkNeedUpdateNoPadding();
453}
454
455/*---------------------------------------------------------------------------*/
456/*---------------------------------------------------------------------------*/
468{
469 if (null())
470 throw ArgumentException(A_FUNCINFO,"Can not removeItems() to null group");
471 if (isAllItems())
472 throw ArgumentException(A_FUNCINFO,"Can not removeItems() to all-items group");
473 m_impl->_checkNeedUpdateNoPadding();
475}
476
477/*---------------------------------------------------------------------------*/
478/*---------------------------------------------------------------------------*/
489{
490 if (null())
491 throw ArgumentException(A_FUNCINFO,"Can not setItems() to null group");
492 m_impl->setItems(items_local_id);
493}
494
495/*---------------------------------------------------------------------------*/
496/*---------------------------------------------------------------------------*/
509{
510 if (null())
511 throw ArgumentException(A_FUNCINFO,"Can not setItems() to null group");
512 m_impl->setItems(items_local_id,do_sort);
513}
514
515/*---------------------------------------------------------------------------*/
516/*---------------------------------------------------------------------------*/
522{
523 m_impl->checkValid();
524}
525
526/*---------------------------------------------------------------------------*/
527/*---------------------------------------------------------------------------*/
528
531{
532 if (null())
533 return;
534 m_impl->checkNeedUpdate();
535 m_impl->applyOperation(operation);
536}
537
538/*---------------------------------------------------------------------------*/
539/*---------------------------------------------------------------------------*/
540
542enumerator() const
543{
544 if (null())
545 return ItemEnumerator();
546 m_impl->_checkNeedUpdateNoPadding();
547 return ItemEnumerator(m_impl->itemInfoListView(),m_impl->itemsLocalId(),m_impl.get());
548}
549
550/*---------------------------------------------------------------------------*/
551/*---------------------------------------------------------------------------*/
552
554_simdEnumerator() const
555{
556 if (null())
557 return ItemEnumerator();
558 m_impl->_checkNeedUpdateWithPadding();
559 return ItemEnumerator(m_impl->itemInfoListView(),m_impl->itemsLocalId(),m_impl.get());
560}
561
562/*---------------------------------------------------------------------------*/
563/*---------------------------------------------------------------------------*/
564
565ItemVectorView ItemGroup::
566_view(bool do_padding) const
567{
568 if (null())
569 return ItemVectorView();
570 m_impl->_checkNeedUpdate(do_padding);
571 Int32 flags = 0;
572 if (m_impl->isContigousLocalIds())
574 // TODO: gérer l'offset
575 return ItemVectorView(m_impl->itemFamily(),ItemIndexArrayView(m_impl->itemsLocalId(),0,flags));
576}
577
578/*---------------------------------------------------------------------------*/
579/*---------------------------------------------------------------------------*/
580
582view() const
583{
584 return _view(true);
585}
586
587/*---------------------------------------------------------------------------*/
588/*---------------------------------------------------------------------------*/
589
591_paddedView() const
592{
593 return _view(true);
594}
595
596/*---------------------------------------------------------------------------*/
597/*---------------------------------------------------------------------------*/
598
600_unpaddedView() const
601{
602 return _view(false);
603}
604
605/*---------------------------------------------------------------------------*/
606/*---------------------------------------------------------------------------*/
607
609isAllItems() const
610{
611 return m_impl->isAllItems();
612}
613
614/*---------------------------------------------------------------------------*/
615/*---------------------------------------------------------------------------*/
616
618synchronizer() const
619{
620 return m_impl->synchronizer();
621}
622
623/*---------------------------------------------------------------------------*/
624/*---------------------------------------------------------------------------*/
625
627isAutoComputed() const
628{
629 return m_impl->hasComputeFunctor();
630}
631
632/*---------------------------------------------------------------------------*/
633/*---------------------------------------------------------------------------*/
634
636hasSynchronizer() const
637{
638 return m_impl->hasSynchronizer();
639}
640
641/*---------------------------------------------------------------------------*/
642/*---------------------------------------------------------------------------*/
643
645_internalApi() const
646{
647 return m_impl->_internalApi();
648}
649
650/*---------------------------------------------------------------------------*/
651/*---------------------------------------------------------------------------*/
652
654checkIsSorted() const
655{
656 return m_impl->checkIsSorted();
657}
658
659/*---------------------------------------------------------------------------*/
660/*---------------------------------------------------------------------------*/
661
662extern ARCANE_CORE_EXPORT bool
663_caseOptionConvert(const CaseOptionBase& co,const String& name,ItemGroup& obj)
664{
665 IMesh* mesh = co.parentOptionList()->meshHandle().mesh();
666 obj = mesh->findGroup(name);
667 return obj.null();
668}
669
670extern ARCANE_CORE_EXPORT bool
671_caseOptionConvert(const CaseOptionBase& co,const String& name,NodeGroup& obj)
672{
673 IMesh* mesh = co.parentOptionList()->meshHandle().mesh();
674 obj = mesh->nodeFamily()->findGroup(name);
675 return obj.null();
676}
677
678extern ARCANE_CORE_EXPORT bool
679_caseOptionConvert(const CaseOptionBase& co,const String& name,EdgeGroup& obj)
680{
681 IMesh* mesh = co.parentOptionList()->meshHandle().mesh();
682 obj = mesh->edgeFamily()->findGroup(name);
683 return obj.null();
684}
685
686extern ARCANE_CORE_EXPORT bool
687_caseOptionConvert(const CaseOptionBase& co,const String& name,FaceGroup& obj)
688{
689 IMesh* mesh = co.parentOptionList()->meshHandle().mesh();
690 obj = mesh->faceFamily()->findGroup(name);
691 return obj.null();
692}
693
694extern ARCANE_CORE_EXPORT bool
695_caseOptionConvert(const CaseOptionBase& co,const String& name,CellGroup& obj)
696{
697 IMesh* mesh = co.parentOptionList()->meshHandle().mesh();
698 obj = mesh->cellFamily()->findGroup(name);
699 return obj.null();
700}
701
702/*---------------------------------------------------------------------------*/
703/*---------------------------------------------------------------------------*/
704
705} // End namespace Arcane
706
707/*---------------------------------------------------------------------------*/
708/*---------------------------------------------------------------------------*/
Classe de base d'une option du jeu de donnée.
Interface d'une famille d'entités.
Interface d'un opérateur sur des entités rangées par type.
virtual IItemFamily * nodeFamily()=0
Retourne la famille des noeuds.
virtual ItemGroup findGroup(const String &name)=0
Retourne le groupe de nom name ou le groupe nul s'il n'y en a pas.
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:542
bool checkIsSorted() const
Vérifie et retourne si le groupe est trié par uniqueId() croissants.
Definition ItemGroup.cc:654
void clear()
Supprime les entités du groupe.
Definition ItemGroup.cc:428
ItemGroup findSubGroup(const String &suffix) const
Accès à un sous-groupe.
Definition ItemGroup.cc:417
ItemGroup createSubGroup(const String &suffix, IItemFamily *family, ItemGroupComputeFunctor *functor) const
Crée un sous-groupe calculé
Definition ItemGroup.cc:405
IVariableSynchronizer * synchronizer() const
Synchronizer du groupe.
Definition ItemGroup.cc:618
NodeGroup nodeGroup() const
Groupe des noeuds des éléments de ce groupe.
Definition ItemGroup.cc:229
bool isAutoComputed() const
Vrai s'il s'agit d'un groupe calculé automatiquement.
Definition ItemGroup.cc:627
FaceGroup faceGroup() const
Groupe des faces des éléments de ce groupe.
Definition ItemGroup.cc:253
bool isOwn() const
Retourne si le groupe contient uniquement des éléments propres au sous-domaine.
Definition ItemGroup.cc:157
void removeItems(Int32ConstArrayView items_local_id, bool check_if_present=true)
Supprime des entités.
Definition ItemGroup.cc:467
FaceGroup activeFaceGroup() const
Groupe des faces actives.
Definition ItemGroup.cc:351
FaceGroup innerActiveFaceGroup() const
Groupe des faces internes des éléments de ce groupe.
Definition ItemGroup.cc:378
ItemVectorView view() const
Vue sur les entités du groupe.
Definition ItemGroup.cc:582
void setItems(Int32ConstArrayView items_local_id)
Positionne les entités du groupe.
Definition ItemGroup.cc:488
FaceGroup ownActiveFaceGroup() const
Groupe des faces actives propres au domaine des éléments de ce groupe.
Definition ItemGroup.cc:363
CellGroup cellGroup() const
Groupe des mailles des éléments de ce groupe.
Definition ItemGroup.cc:265
void applyOperation(IItemOperationByBasicType *operation) const
Applique l'opération operation sur les entités du groupe.
Definition ItemGroup.cc:530
AutoRefT< ItemGroupImpl > m_impl
Représentation interne du groupe.
Definition ItemGroup.h:340
CellGroup levelCellGroup(const Integer &level) const
Groupe des mailles de niveau l des éléments de ce groupe.
Definition ItemGroup.cc:328
void addItems(Int32ConstArrayView items_local_id, bool check_if_present=true)
Ajoute des entités.
Definition ItemGroup.cc:445
FaceGroup innerFaceGroup() const
Groupe des faces internes des éléments de ce groupe.
Definition ItemGroup.cc:277
ItemGroupImplInternal * _internalApi() const
API interne à Arcane.
Definition ItemGroup.cc:645
ItemEnumerator _simdEnumerator() const
Enumérateur sur les entités du groupe pour la vectorisation.
Definition ItemGroup.cc:554
ItemVectorView _paddedView() const
Vue sur les entités du groupe avec padding pour la vectorisation.
Definition ItemGroup.cc:591
bool hasSynchronizer() const
Indique si le groupe possède un synchroniser actif.
Definition ItemGroup.cc:636
bool isAllItems() const
Indique si le groupe est celui de toutes les entités.
Definition ItemGroup.cc:609
ItemVectorView _unpaddedView() const
Vue sur les entités du groupe sans padding pour la vectorisation.
Definition ItemGroup.cc:600
EdgeGroup edgeGroup() const
Groupe des arêtes des éléments de ce groupe.
Definition ItemGroup.cc:241
CellGroup ownActiveCellGroup() const
Groupe des mailles propres actives des éléments de ce groupe.
Definition ItemGroup.cc:316
void checkValid()
Vérification interne de la validité du groupe.
Definition ItemGroup.cc:521
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:169
CellGroup ownLevelCellGroup(const Integer &level) const
Groupe des mailles propres de niveau l des éléments de ce groupe.
Definition ItemGroup.cc:340
ItemGroup()
Construit un groupe nul.
Definition ItemGroup.cc:148
FaceGroup outerActiveFaceGroup() const
Groupe des faces externes actives des éléments de ce groupe.
Definition ItemGroup.cc:390
ItemGroup own() const
Groupe équivalent à celui-ci mais contenant uniquement les éléments propres au sous-domaine.
Definition ItemGroup.cc:189
CellGroup activeCellGroup() const
AMR.
Definition ItemGroup.cc:304
FaceGroup outerFaceGroup() const
Groupe des faces externes des éléments de ce groupe.
Definition ItemGroup.cc:289
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.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Exception lorsqu'un argument est invalide.
Vue constante d'un tableau de type T.
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 -*-