14#include "arcane/core/ItemGroupImpl.h"
16#include "arcane/utils/String.h"
17#include "arcane/utils/ITraceMng.h"
18#include "arcane/utils/ArgumentException.h"
20#include "arcane/core/ItemGroupObserver.h"
21#include "arcane/core/IItemFamily.h"
22#include "arcane/core/ItemGroup.h"
23#include "arcane/core/IMesh.h"
24#include "arcane/core/MeshPartInfo.h"
25#include "arcane/core/MeshKind.h"
26#include "arcane/core/ItemPrinter.h"
27#include "arcane/core/IItemOperationByBasicType.h"
28#include "arcane/core/ItemGroupComputeFunctor.h"
29#include "arcane/core/IVariableSynchronizer.h"
30#include "arcane/core/ParallelMngUtils.h"
31#include "arcane/core/internal/ItemGroupInternal.h"
58 const String& fullName()
const {
return m_name; }
79ItemGroupImpl* ItemGroupImpl::shared_null= 0;
102 (m_parent->*m_function)();
114ItemGroupImpl* ItemGroupImpl::
176 return m_p->fullName();
185 return m_p->itemsLocalId().
size();
203 return m_p->itemsLocalId();
229 m_p->notifyInvalidateObservers();
244 ARCANE_FATAL(
"Direct access for computed group in only available during a transaction");
247 return m_p->mutableItemsLocalId();
256 return m_p->m_parent;
370 return checkSharedNull();
450 return checkSharedNull();
467 return checkSharedNull();
487 return checkSharedNull();
505 return checkSharedNull();
523 return checkSharedNull();
541 return checkSharedNull();
560 return checkSharedNull();
577 return checkSharedNull();
593 return checkSharedNull();
610 return checkSharedNull();
628 ARCANE_FATAL(
"Cannot create already existing sub-group ({0}) in group ({1})",
633 ii->setComputeFunctor(functor);
634 functor->setGroup(
ii);
639 ii->invalidate(
false);
652 return finder->second.get();
656 return checkSharedNull();
669 <<
name() <<
" : skip computed group";
682 m_p->notifyInvalidateObservers();
687 for( Integer i=0, is=
items_lid.size(); i<is; ++i ){
692 m_p->updateTimestamp();
705 m_p->notifyCompactObservers(
nullptr);
719 <<
" name=" <<
name();
723 m_p->updateTimestamp();
724 m_p->setNeedRecompute();
727 m_p->notifyInvalidateObservers();
745 return m_p->itemInfoListView();
773 (
"Operation on invalid group"));
792 m_p->m_items_index_in_all_group.
resize(
m_p->maxLocalId());
804 for( Integer i=0, is=
items_lid.size(); i<is; ++i ){
827 trace->
info(5) <<
"ItemGroupImpl::addItems() group <" <<
name() <<
"> "
836 m_p->updateTimestamp();
860 (
"Operation on invalid group"));
867 if (
isOwn() &&
amesh->meshPartInfo().nbPart()!=1){
878 m_p->m_items_index_in_all_group.
resize(
m_p->maxLocalId());
882 Int32 local_id =
internals[i]->localId();
884 m_p->m_items_index_in_all_group[local_id] = i;
892 Int32 local_id = item->
localId();
894 m_p->m_items_index_in_all_group[local_id] = index;
899 ARCANE_FATAL(
"Inconsistent number of elements in the generation of the group '{0}' expected={1} present={2}",
905 m_p->updateTimestamp();
913 trace->
info(5) <<
"ItemGroupImpl::removeAddItems() group <" <<
name() <<
"> "
915 <<
" new_size=" <<
size()
935 m_p->updateTimestamp();
940 <<
" size=" <<
size();
946 m_p->notifyInvalidateObservers();
963 bool operator()(Int32
lid1,Int32
lid2)
const
1018 return m_items[
item_lid]->isSuppressed();
1034 trace->
debug(
Trace::High) <<
"ItemGroupImpl::removeSuppressedItems on " <<
name() <<
" : skip computed group";
1045 trace->
fatal() <<
"ItemGroupImpl::removeSuppressedItems(): bad range "
1046 <<
" name=" <<
name()
1047 <<
" i=" << i <<
" lid=" <<
items_lid[i]
1062 if (!items[
items_lid[i]]->isSuppressed()){
1092 m_p->updateTimestamp();
1130 m_p->notifyInvalidateObservers();
1132 has_recompute =
true;
1135 _checkUpdateSimdPadding();
1136 return has_recompute;
1143_checkNeedUpdateNoPadding()
1145 return _checkNeedUpdate(
false);
1152_checkNeedUpdateWithPadding()
1154 return _checkNeedUpdate(
true);
1163 return _checkNeedUpdate(
false);
1170_checkUpdateSimdPadding()
1184 m_p->updateTimestamp();
1189 m_p->notifyInvalidateObservers();
1210 bool is_verbose =
m_p->m_is_debug_apply_operation;
1214 tm->
info() <<
"applyOperation name=" <<
name() <<
" nb_item=" <<
size();
1215 if (
m_p->isUseV2ForApplyOperation()){
1219 Int64
t =
m_p->timestamp();
1237#define APPLY_OPERATION_ON_TYPE(ITEM_TYPE) \
1238 if (m_p->isUseV2ForApplyOperation()){\
1239 Int16 type_id = IT_##ITEM_TYPE;\
1240 Int32ConstArrayView sub_ids = m_p->m_children_by_type_ids[type_id]; \
1241 if (has_only_one_type && type_id==m_p->m_unique_children_type)\
1242 sub_ids = itemsLocalId(); \
1243 if (is_verbose && sub_ids.size()>0) \
1244 tm->info() << "Type=" << (int)IT_##ITEM_TYPE << " nb=" << sub_ids.size(); \
1245 if (sub_ids.size()!=0){\
1246 operation->apply##ITEM_TYPE(family->view(sub_ids)); \
1250 ItemGroup group(m_p->m_children_by_type[IT_##ITEM_TYPE]); \
1251 if (!group.empty()) \
1252 operation->apply##ITEM_TYPE(group.view()); \
1255 APPLY_OPERATION_ON_TYPE(Vertex);
1256 APPLY_OPERATION_ON_TYPE(Line2);
1257 APPLY_OPERATION_ON_TYPE(Triangle3);
1258 APPLY_OPERATION_ON_TYPE(Quad4);
1259 APPLY_OPERATION_ON_TYPE(Pentagon5);
1260 APPLY_OPERATION_ON_TYPE(Hexagon6);
1261 APPLY_OPERATION_ON_TYPE(Tetraedron4);
1262 APPLY_OPERATION_ON_TYPE(Pyramid5);
1263 APPLY_OPERATION_ON_TYPE(Pentaedron6);
1264 APPLY_OPERATION_ON_TYPE(Hexaedron8);
1265 APPLY_OPERATION_ON_TYPE(Heptaedron10);
1266 APPLY_OPERATION_ON_TYPE(Octaedron12);
1278 APPLY_OPERATION_ON_TYPE(Link);
1280#undef APPLY_OPERATION_ON_TYPE
1300 return m_p->timestamp();
1342 for( ; i != end ; ++i ) {
1410 bool is_verbose =
m_p->m_is_debug_apply_operation;
1412 m_p->mesh()->
traceMng()->
info() <<
"ItemGroupImpl::_initChildrenByTypeV2() name=" <<
name();
1441 Integer item_type = item.
type();
1464 bool is_verbose =
m_p->m_is_debug_apply_operation;
1466 trace->
info() <<
"ItemGroupImpl::_computeChildrenByTypeV2 for " <<
name();
1482 Int16 item_type = item.
type();
1495 trace->
info() <<
"ItemGroupImpl::_computeChildrenByTypeV2 for " <<
name()
1496 <<
" type=" <<
type_mng->typeName(i) <<
" nb=" << n;
1499 trace->
info() <<
"ItemGroupImpl::_computeChildrenByTypeV2 for " <<
name()
1509 trace->
info() <<
"ItemGroupImpl::_computeChildrenByTypeV2 for " <<
name()
1516 Integer item_type = item.
type();
1531 ARCANE_UNUSED(info);
1534 m_p->notifyInvalidateObservers();
1543 ARCANE_UNUSED(info);
1546 m_p->notifyInvalidateObservers();
1555 ARCANE_UNUSED(info);
1558 m_p->notifyInvalidateObservers();
1567 m_p->setNeedRecompute();
1568 m_p->notifyInvalidateObservers();
1606 m_p->setNeedRecompute();
1611 i.second->_forceInvalidate(
true);
1623 std::vector<const void*>
ptrs;
1625 ptrs.push_back(i.first);
1626 for(
const void* i :
ptrs )
1633 m_p->resetSubGroups();
1701 for( Integer i=1; i<
nb_item; ++i ){
1718 if (
this==shared_null){
1719 shared_null =
nullptr;
1732 shared_null->addRef();
1745 shared_null->removeRef();
1754 return m_p->isContigous();
1785 m_p->mutableItemsLocalId().clear();
1788 if (
m_p->variableItemsLocalid())
1791 m_p->mutableItemsLocalId().shrink();
1802 return &
m_p->m_internal_api;
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Tableau d'items de types quelconques.
Classe de base d'une table de hachage entre les items d'un groupe et leurs positions dans la table.
Interface d'une famille d'entités.
virtual ItemGroup createGroup(const String &name, Int32ConstArrayView local_ids, bool do_override=false)=0
Créé un groupe d'entités de nom name contenant les entités local_ids.
virtual ItemInfoListView itemInfoListView()=0
Vue sur la liste d'informations sur les entités.
virtual IMesh * mesh() const =0
Maillage associé
virtual Integer nbItem() const =0
Nombre d'entités.
Interface d'un opérateur sur des entités rangées par type.
virtual ITraceMng * traceMng()=0
Gestionnaire de message associé
virtual IItemFamily * nodeFamily()=0
Retourne la famille des noeuds.
virtual IItemFamily * edgeFamily()=0
Retourne la famille des arêtes.
virtual IItemFamily * faceFamily()=0
Retourne la famille des faces.
virtual IItemFamily * cellFamily()=0
Retourne la famille des mailles.
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
virtual const MeshKind meshKind() const =0
Caractéristiques du maillage.
virtual ItemTypeMng * itemTypeMng() const =0
Gestionnaire de types d'entités associé
Interface du gestionnaire de parallélisme pour un sous-domaine.
Interface d'un service de synchronisation de variable.
virtual void shrinkMemory()=0
Libère l'éventuelle mémoire supplémentaire allouée pour les données.
bool isSuppressed() const
Vrai si l'entité est supprimée.
Int32 localId() const
Numéro local (au sous-domaine) de l'entité
ARCCORE_HOST_DEVICE ItemUniqueId uniqueId(Int32 local_id) const
uniqueId() de l'entité de numéro local local_id
Fonctor pour le calcul des éléments d'un groupe.
API interne à Arcane de ItemGroupImpl.
void executeFunctor() override
Exécute la méthode associé
const String & name() const
Retourne le nom du groupe.
virtual ~ItemGroupImplNull()
Libére les ressources.
Implémentation d'un groupe d'entités de maillage.
void removeItems(Int32ConstArrayView items_local_id, bool check_if_present)
Supprime les entités items_local_id du groupe.
bool checkNeedUpdate()
Réactualise le groupe si nécessaire.
ItemGroupImpl * activeCellGroup()
AMR.
void removeAddItems(Int32ConstArrayView removed_local_id, Int32ConstArrayView added_local_id, bool check_if_present)
Supprime et ajoute les entités removed_local_id et added_local_id du groupe.
ItemGroupImplInternal * _internalApi() const
API interne à Arcane.
void setItems(Int32ConstArrayView items_local_id)
Positionne les entités du groupe à items_local_id.
void setOwn(bool v)
Positionne la propriété de groupe local ou non.
Int64 timestamp() const
Retourne le temps du groupe. Ce temps est incrémenté après chaque modification.
ItemInternalList itemsInternal() const
Liste des entités sur lesquelles s'appuie le groupe.
void endTransaction()
Termine une transaction.
void invalidate(bool force_recompute)
Invalide le groupe.
ItemGroupImpl * nodeGroup()
Groupe des noeuds des éléments de ce groupe.
void addItems(Int32ConstArrayView items_local_id, bool check_if_present)
Ajoute les entités de numéros locaux items_local_id.
bool isAllItems() const
Indique si le groupe est celui de toutes les entités.
void _executeExtend(const Int32ConstArrayView *info)
Invalidation des sous-groupes.
ItemGroupImpl * parent() const
Groupe parent (0 si aucun)
Int32Array & unguardedItemsLocalId(const bool self_invalidate=true)
Liste des numéros locaux des entités de ce groupe.
ItemGroupImpl * cellGroup()
Groupe des mailles des éléments de ce groupe.
ItemGroupImpl * innerFaceGroup()
Groupe des faces internes des éléments de ce groupe.
eItemKind itemKind() const
Genre du groupe. Il s'agit du genre de ses éléments.
ItemGroupImpl * createSubGroup(const String &suffix, IItemFamily *family, ItemGroupComputeFunctor *functor)
Crée un sous-groupe calculé
virtual ~ItemGroupImpl()
Libère les ressources.
ItemGroupImpl * edgeGroup()
Groupe des arêtes des éléments de ce groupe.
bool null() const
Retourne true si le groupe est nul.
void clear()
Supprime les entités du groupe.
ItemGroupImpl * faceGroup()
Groupe des faces des éléments de ce groupe.
void destroy()
Détruit le groupe. Après cet appel, le groupe devient un groupe nul.
void setLocalToSubDomain(bool v)
Positionne le booléen indiquant si le groupe est local au sous-domaine.
void setIsAllItems()
Indique à ce groupe qu'il s'agit du groupe de toutes les entités de la famille.
void _executeReduce(const Int32ConstArrayView *info)
Invalidation des sous-groupes.
void removeSuppressedItems()
Supprime du groupe les entités dont le flag isSuppressed() est vrai.
const String & fullName() const
Nom complet du groupe (avec maillage + famille)
void _computeChildrenByTypeV2()
Méthode de calcul des sous-groupes par type.
ItemGroupImpl * ownGroup()
Groupe des entité propres des entités de ce groupe.
void _updateNeedInfoFlag(const bool flag)
Mise à jour forcée du flag d'information de restructuration.
IMesh * mesh() const
Maillage auquel appartient le groupe (0 pour le groupe nul).
bool checkIsSorted() const
Vérifie et retourne si le groupe est trié par uniqueId() croissants.
void checkValid()
Vérifie que le groupe est valide.
void _initChildrenByType()
Initialisation des sous-groupes par types.
IVariableSynchronizer * synchronizer()
Synchronizer du groupe.
Integer size() const
Nombre d'entités du groupe.
Int32ConstArrayView itemsLocalId() const
Liste des numéros locaux des entités de ce groupe.
bool needSynchronization() const
Indique si le groupe a structurellement besoin d'une synchro parallèle.
ItemGroupImpl * ownActiveCellGroup()
Groupe des mailles propres actives de ce groupe.
SharedPtrT< GroupIndexTable > localIdToIndex()
Table des local ids vers une position pour toutes les entités du groupe.
ItemInfoListView itemInfoListView() const
Liste des entités sur lesquelles s'appuie le groupe.
void attachObserver(const void *ref, IItemGroupObserver *obs)
Attache un observer.
ItemGroupImpl * outerActiveFaceGroup()
Groupe des faces externes actives des éléments de ce groupe.
void detachObserver(const void *ref)
Détache un observer.
IItemFamily * itemFamily() const
Familly à laquelle appartient le groupe (ou 0 si aucune)
void _executeInvalidate()
Invalidation des sous-groupes.
virtual void deleteMe()
Notification de SharedReference indiquant qu'il faut détruire l'instance.
void _executeCompact(const Int32ConstArrayView *info)
Invalidation des sous-groupes.
bool isLocalToSubDomain() const
AMR OFF.
ItemGroupImpl * ghostGroup()
Items in the group not owned by the subdomain.
ItemGroupImpl * ownLevelCellGroup(const Integer &level)
Groupe des mailles propres actives de ce groupe.
Int64 capacity() const
Nombre d'éléments alloués.
void checkLocalIdsAreContigous() const
Vérifie si les entités du groupe ont des localIds() contigüs.
static void _buildSharedNull()
ItemGroupImpl * innerActiveFaceGroup()
Groupe des faces internes actives des éléments de ce groupe.
void applyOperation(IItemOperationByBasicType *operation)
Applique l'opération operation sur les entités du groupe.
bool isContigousLocalIds() const
Indique si les entités du groupe ont des localIds() contigüs.
void beginTransaction()
Débute une transaction.
ItemGroupImpl * levelCellGroup(const Integer &level)
Groupe des mailles actives de ce groupe.
bool hasComputeFunctor() const
Indique si le groupe est calculé
bool hasSynchronizer()
Indique si ce groupe possède un synchroniser.
bool hasInfoObserver() const
Indique si le contenu de ce groupe est observé.
void _initChildrenByTypeV2()
Initialisation des sous-groupes par types.
void setComputeFunctor(IFunctor *functor)
Définit une fonction de calcul de groupe.
ItemGroupImpl * ownActiveFaceGroup()
Groupe des faces externes actives des éléments de ce groupe.
bool isOwn() const
Retourne si le groupe contient uniquement des éléments propres au sous-domaine.
ItemGroupImpl()
Construit un groupe nul.
ItemGroup parentGroup()
Groupe parent.
bool empty() const
Vrai si le groupe est vide.
void _forceInvalidate(const bool self_invalidate)
Invalidate forcée récursive.
ItemGroupInternal * m_p
Implémentation du groupe.
static void _destroySharedNull()
ItemGroupImpl * activeFaceGroup()
Groupe des faces actives propres au domaine.
const String & name() const
Nom du groupe.
void _computeChildrenByType()
Méthode de calcul des sous-groupes par type.
ItemGroupImpl * outerFaceGroup()
Groupe des faces externes des éléments de ce groupe.
void shrinkMemory()
Limite au maximum la mémoire utilisée par le groupe.
ItemGroupImpl * findSubGroup(const String &suffix)
Accède à un sous-groupe calculé
void changeIds(Int32ConstArrayView old_to_new_ids)
Change les indices des entités du groupe.
Implémentation de la classe ItemGroupImpl.
ItemGroupImpl * m_node_group
Groupe des noeuds.
std::map< Integer, ItemGroupImpl * > m_own_level_cell_group
Groupe des mailles propres de niveau.
IMesh * m_mesh
Gestionnare de groupe associé
UniqueArray< ItemGroupImpl * > m_children_by_type
Liste des fils de ce groupe par type d'entité
SharedPtrT< GroupIndexTable > m_group_index_table
Table de hachage du local id des items vers leur position en enumeration.
ItemGroupImpl * m_interface_group
Items on the boundary of two subdomains.
UniqueArray< UniqueArray< Int32 > > m_children_by_type_ids
Liste des localId() par type d'entité.
bool m_need_invalidate_on_recompute
Vrai si l'on doit activer les invalidate observers en cas de recalcul.
void checkIsContigous()
Vérifie que les localIds() sont contigüs.
bool m_need_recompute
Vrai si le groupe doit être recalculé
ItemGroupImpl * m_inner_face_group
Groupe des faces internes.
std::map< String, AutoRefT< ItemGroupImpl > > m_sub_groups
Ensemble de tous les sous-groupes.
bool m_transaction_mode
Vrai si le groupe est en mode de transaction directe.
bool m_is_own
true si groupe local.
Ref< IVariableSynchronizer > m_synchronizer
Synchronizer du groupe.
void checkUpdateSimdPadding()
Remplit les derniers éléments du groupe pour avoir un vecteur SIMD complet.
bool m_observer_need_info
Synthése de besoin de observers en informations de transition.
void applySimdPadding()
Applique le padding pour la vectorisation.
ItemGroupImpl * m_ghost_group
Items not owned by the subdomain.
bool m_is_local_to_sub_domain
Vrai si le groupe est local au sous-domaine.
bool m_is_all_items
Indique s'il s'agit du groupe de toutes les entités.
ItemGroupImpl * m_own_group
Items owned by the subdomain.
ItemTypeId m_unique_children_type
Indique le type des entités du groupe.
IItemFamily * m_item_family
Famille associée.
ItemGroupImpl * m_edge_group
Groupe des arêtes.
ItemGroupImpl * m_face_group
Groupe des faces.
std::map< Integer, ItemGroupImpl * > m_level_cell_group
Groupe des mailles de niveau.
std::map< const void *, IItemGroupObserver * > m_observers
localids -> index (UNIQUEMENT ALLITEMS)
Int64 m_children_by_type_ids_computed_timestamp
Timestamp indiquant quand a été calculé la liste des ids des enfants.
IFunctor * m_compute_functor
Fonction de calcul du groupe.
ItemGroupImpl * m_outer_face_group
ItemGroupImpl * m_inner_active_face_group
Groupe des faces internes actives.
ItemGroupImpl * m_own_active_cell_group
Groupe des mailles propres actives.
ItemGroupImpl * m_cell_group
Groupe des mailles.
ItemGroupImpl * m_active_cell_group
AMR.
ItemGroupImpl * m_own_active_face_group
Groupe des faces actives propres.
ItemGroupImpl * m_active_face_group
Groupe des faces actives.
ItemGroupImpl * m_outer_active_face_group
Groupe des faces externes actives.
String m_name
Nom du groupe.
Groupe d'entités de maillage.
Vue sur une liste pour obtenir des informations sur les entités.
Structure interne d'une entité de maillage.
Type d'une entité (Item).
Gestionnaire des types d'entités de maillage.
static Integer nbBasicItemType()
nombre de types disponibles
Identifiant unique d'une entité.
Classe de base d'un élément de maillage.
Int16 type() const
Type de l'entité
Lecteur des fichiers de maillage via la bibliothèque LIMA.
IVariable * variable() const
Variable associée.
Exception lorsqu'un argument est invalide.
Vue modifiable d'un tableau d'un type T.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
constexpr bool empty() const noexcept
Retourne true si le tableau est vide (dimension nulle)
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
virtual void executeFunctor()=0
Exécute la méthode associé
Interface du gestionnaire de traces.
virtual TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium)=0
Flot pour un message de debug.
virtual TraceMessage info()=0
Flot pour un message d'information.
virtual TraceMessage fatal()=0
Flot pour un message d'erreur fatale.
Exception lorsqu'une opération n'est pas supportée.
Chaîne de caractères unicode.
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
ItemGroupT< Cell > CellGroup
Groupe de mailles.
ItemGroupT< Face > FaceGroup
Groupe de faces.
ItemGroupT< Edge > EdgeGroup
Groupe d'arêtes.
ItemGroupT< Node > NodeGroup
Groupe de noeuds.
Ref< IVariableSynchronizer > createSynchronizerRef(IParallelMng *pm, IItemFamily *family)
Retourne une interface pour synchroniser des variables sur le groupe de la famille family.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
bool arcaneIsCheck()
Vrai si on est en mode vérification.
ConstArrayView< Int32 > Int32ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 32 bits.
eItemKind
Genre d'entité de maillage.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Face
Entité de maillage de genre face.
@ IK_Edge
Entité de maillage de genre arête.
IItemGroupObserver * newItemGroupObserverT(T *object, typename IItemGroupObserver::FuncTraits< T >::FuncPtr funcptr)
Utilitaire pour création simplifié de ItemGroupObserverT.
@ Medium
Niveau moyen (défaut)