14#include "arcane/mesh/ItemGroupsSynchronize.h"
16#include "arcane/utils/ITraceMng.h"
17#include "arcane/utils/Math.h"
20#include "arcane/core/IMesh.h"
21#include "arcane/core/IItemFamily.h"
22#include "arcane/core/VariableBuildInfo.h"
23#include "arcane/core/ItemPrinter.h"
25#include "arcane/mesh/CommonItemGroupFilterer.h"
39, m_item_family(item_family)
42 item_family->itemKind())
53, m_item_family(item_family)
56 item_family->itemKind())
64ItemGroupsSynchronize::
65~ItemGroupsSynchronize()
72void ItemGroupsSynchronize::
76 for(
const ItemGroup& group : m_item_family->
groups() ){
77 if (!group.internal()->needSynchronization())
89 ItemGroup all_items = m_item_family->allItems();
93 CommonItemGroupFilterer group_filterer(m_item_family);
95 ARCANE_ASSERT((!group.null()),(
"Null group in ItemGroupsSynchronize"));
97 group_filterer.addGroupToFilter(group);
102 group_filterer.applyFiltering();
105 group_items.
reserve(m_item_family->maxLocalId());
107 const Integer max_aggregate_size =
109 const Integer aggregate_count =
110 (groups.
size() / max_aggregate_size) +
111 ((groups.
size() % max_aggregate_size)?1:0);
113 for(
Integer i_aggregate=0; i_aggregate < aggregate_count; ++i_aggregate) {
114 const Integer first_group = i_aggregate * max_aggregate_size;
116 groups.
size()-first_group);
118 for(
Integer i_group=0;i_group<current_aggregate_size;++i_group) {
120 ItemGroup group = groups[first_group+i_group];
122 m_var[iitem] |= current_mask;
129 for(
Integer i_group=0;i_group<current_aggregate_size;++i_group) {
131 ItemGroup group = groups[first_group+i_group];
138 if ((m_var[iitem] & current_mask) == 0) {
139 group_items.
add(iitem.itemLocalId());
141 m_var[iitem] &= ~current_mask;
149 if ((m_var[iitem] & current_mask) != 0) {
150 group_items.
add(iitem.itemLocalId());
154 debug() <<
"Incremental synchronization for the group <" << group.
name() <<
">"
155 <<
" old=" << current_size <<
" new=" << group.
size()
156 <<
" added=" << group_items.
size() <<
" removed=" << removed_size;
162 if ((m_var[iitem] & current_mask) != 0) {
163 group_items.
add(iitem.itemLocalId());
168 debug() <<
"Direct synchronization for the group <" << group.
name() <<
">"
169 <<
" old=" << current_size <<
" new=" << group.
size();
183 for(
const ItemGroup& group : m_item_family->groups() ){
188 Integer diff = m_var.checkIfSync(10);
190 error() <<
"Group is not in sync (name=" << group.name()
191 <<
", nb_diff=" << nb_diff <<
")";
Integer size() const
Nombre d'éléments du vecteur.
void clear()
Supprime les éléments du tableau.
void reserve(Int64 new_capacity)
Réserve le mémoire pour new_capacity éléments.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
void clear()
Supprime tous les éléments de la collection.
Interface d'une famille d'entités.
virtual ItemGroupCollection groups() const =0
Liste des groupes de cette famille.
Interface d'une variable.
bool hasInfoObserver() const
Indique si le contenu de ce groupe est observé.
Groupe d'entités de maillage.
ItemGroupImpl * internal() const
Retourne l'implémentation du groupe.
const String & name() const
Nom du groupe.
void removeItems(Int32ConstArrayView items_local_id, bool check_if_present=true)
Supprime des entités.
Integer size() const
Nombre d'éléments du groupe.
void setItems(Int32ConstArrayView items_local_id)
Positionne les entités du groupe.
void addItems(Int32ConstArrayView items_local_id, bool check_if_present=true)
Ajoute des entités.
Integer checkSynchronize()
Vérifie si les groupes sont synchronisé.
ItemGroupsSynchronize(IItemFamily *item_family)
Créé une instance pour synchroniser tous les groupes de la famille item_family.
Int32 IntAggregator
Type employé pour l'aggrégation des communications de groupes.
void synchronize()
Synchronise les groupes.
TraceAccessor(ITraceMng *m)
Construit un accesseur via le gestionnaire de trace m.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
TraceMessage error() const
Flot pour un message d'erreur.
ITraceMng * traceMng() const
Gestionnaire de trace.
Vecteur 1D de données avec sémantique par valeur (style STL).
Paramètres nécessaires à la construction d'une variable.
__host__ __device__ Real2 min(Real2 a, Real2 b)
Retourne le minimum de deux Real2.
bool arcaneIsCheck()
Vrai si on est en mode vérification.
Collection< ItemGroup > ItemGroupCollection
Collection de groupes d'éléments du maillage.
Int32 Integer
Type représentant un entier.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.