Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ItemGroupsSynchronize.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* ItemGroupsSynchronize.cc (C) 2000-2021 */
9/* */
10/* Synchronisations des groupes. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/mesh/ItemGroupsSynchronize.h"
15
16#include "arcane/utils/ITraceMng.h"
17
18#include "arcane/ItemEnumerator.h"
19#include "arcane/IMesh.h"
20#include "arcane/IItemFamily.h"
21#include "arcane/VariableBuildInfo.h"
22#include "arcane/ItemPrinter.h"
23
24#include "arcane/mesh/CommonItemGroupFilterer.h"
25
26/*---------------------------------------------------------------------------*/
27/*---------------------------------------------------------------------------*/
28
29namespace Arcane::mesh
30{
31
32/*---------------------------------------------------------------------------*/
33/*---------------------------------------------------------------------------*/
34
37: TraceAccessor(item_family->traceMng())
38, m_item_family(item_family)
39, m_var(VariableBuildInfo(item_family,"MeshItemGroupSynchronize",
40 IVariable::PNoDump|IVariable::PNoRestore),
41 item_family->itemKind())
42{
43 _setGroups();
44}
45
46/*---------------------------------------------------------------------------*/
47/*---------------------------------------------------------------------------*/
48
51: TraceAccessor(item_family->traceMng())
52, m_item_family(item_family)
53, m_var(VariableBuildInfo(item_family,"MeshItemGroupSynchronize",
54 IVariable::PNoDump|IVariable::PNoRestore),
55 item_family->itemKind())
56, m_groups(groups)
57{
58}
59
60/*---------------------------------------------------------------------------*/
61/*---------------------------------------------------------------------------*/
62
63ItemGroupsSynchronize::
64~ItemGroupsSynchronize()
65{
66}
67
68/*---------------------------------------------------------------------------*/
69/*---------------------------------------------------------------------------*/
70
71void ItemGroupsSynchronize::
72_setGroups()
73{
74 m_groups.clear();
75 for( const ItemGroup& group : m_item_family->groups() ){
76 if (!group.internal()->needSynchronization())
77 continue;
78 m_groups.add(group);
79 }
80}
81
82/*---------------------------------------------------------------------------*/
83/*---------------------------------------------------------------------------*/
84
87{
88 ItemGroup all_items = m_item_family->allItems();
89
90 // Construction de la liste des groupes
92 CommonItemGroupFilterer group_filterer(m_item_family);
93 for( ItemGroup group : m_groups ){
94 ARCANE_ASSERT((!group.null()),("Null group in ItemGroupsSynchronize"));
95 groups.add(group);
96 group_filterer.addGroupToFilter(group);
97 }
98 // TODO: regarder s'il ne faudrait pas le faire à chaque fois
99 // Comme cela on serait certains que les groupes sont bien triés
100 if (arcaneIsCheck())
101 group_filterer.applyFiltering();
102
103 Int32UniqueArray group_items; // Tableau stockant les listes d'items en évolution
104 group_items.reserve(m_item_family->maxLocalId());
105
106 const Integer max_aggregate_size =
107 sizeof(IntAggregator)*8-1; // Pour rester dans l'espace des entiers positifs
108 const Integer aggregate_count =
109 (groups.size() / max_aggregate_size) +
110 ((groups.size() % max_aggregate_size)?1:0);
111
115 groups.size()-first_group);
116 m_var.fill(0); // Initialisation du tableau parallèle
118 const IntAggregator current_mask = static_cast<IntAggregator>(1)<<i_group;
119 ItemGroup group = groups[first_group+i_group];
120 ENUMERATE_ITEM(iitem,group){
121 m_var[iitem] |= current_mask;
122 }
123 }
124
125 // Partage des infos de contenu des groupes sur l'aggrégat
126 m_var.synchronize();
127
129 const IntAggregator current_mask = static_cast<IntAggregator>(1)<<i_group;
130 ItemGroup group = groups[first_group+i_group];
131 const Integer current_size = group.size();
132 if (group.internal()->hasInfoObserver()) {
133 // Passage en mode incrémental
134 // Recherche des items disparus
135 group_items.clear();
136 ENUMERATE_ITEM(iitem, group) {
137 if ((m_var[iitem] & current_mask) == 0) {
138 group_items.add(iitem.itemLocalId());
139 } else {
140 m_var[iitem] &= ~current_mask; // marque comme déjà existant dans le groupe
141 }
142 }
143 Integer removed_size = group_items.size();
145 // Recherche des nouveaux items
146 group_items.clear();
148 if ((m_var[iitem] & current_mask) != 0) {
149 group_items.add(iitem.itemLocalId());
150 }
151 }
152 group.addItems(group_items);
153 debug() << "Incremental synchronization for the group <" << group.name() << ">"
154 << " old=" << current_size << " new=" << group.size()
155 << " added=" << group_items.size() << " removed=" << removed_size;
156 }
157 else {
158 // On utilise le mode d'affectation direct des groupes
159 group_items.clear();
161 if ((m_var[iitem] & current_mask) != 0) {
162 group_items.add(iitem.itemLocalId());
163 }
164 }
165 // Préservation du précédent comportement : utilise createGroup et non findGroup + setItems
166 group.setItems(group_items);
167 debug() << "Direct synchronization for the group <" << group.name() << ">"
168 << " old=" << current_size << " new=" << group.size();
169 }
170 }
171 }
172}
173
174/*---------------------------------------------------------------------------*/
175/*---------------------------------------------------------------------------*/
176
179{
180 // TODO: vérifier que tous les sous-domaines ont les mêmes groupes.
181 Integer nb_diff = 0;
182 for( const ItemGroup& group : m_item_family->groups() ){
183 m_var.fill(0);
184 ENUMERATE_ITEM(i_item,group){
185 m_var[*i_item] = 1;
186 }
187 Integer diff = m_var.checkIfSync(10);
188 if (diff!=0){
189 error() << "Group is not in sync (name=" << group.name()
190 << ", nb_diff=" << nb_diff << ")";
191 }
192 nb_diff += diff;
193 }
194 return nb_diff;
195}
196
197/*---------------------------------------------------------------------------*/
198/*---------------------------------------------------------------------------*/
199
200} // End namespace Arcane::mesh
201
202/*---------------------------------------------------------------------------*/
203/*---------------------------------------------------------------------------*/
#define ENUMERATE_ITEM(name, group)
Enumérateur générique d'un groupe de noeuds.
void clear()
Supprime tous les éléments de la collection.
Definition Collection.h:68
Interface d'une famille d'entités.
virtual ItemGroupCollection groups() const =0
Liste des groupes de cette famille.
virtual ItemGroup allItems() const =0
Groupe de toutes les entités.
virtual Int32 maxLocalId() const =0
Interface d'une variable.
Definition IVariable.h:54
bool hasInfoObserver() const
Indique si le contenu de ce groupe est observé.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
ItemGroupImpl * internal() const
Retourne l'implémentation du groupe.
Definition ItemGroup.h:120
const String & name() const
Nom du groupe.
Definition ItemGroup.h:76
void removeItems(Int32ConstArrayView items_local_id, bool check_if_present=true)
Supprime des entités.
Definition ItemGroup.cc:467
Integer size() const
Nombre d'éléments du groupe.
Definition ItemGroup.h:88
void setItems(Int32ConstArrayView items_local_id)
Positionne les entités du groupe.
Definition ItemGroup.cc:488
void addItems(Int32ConstArrayView items_local_id, bool check_if_present=true)
Ajoute des entités.
Definition ItemGroup.cc:445
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.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Paramètres nécessaires à la construction d'une variable.
virtual Integer checkIfSync(int max_print=0)
Vérifie si la variable est bien synchronisée.
TraceMessage error() const
Flot pour un message d'erreur.
TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium) const
Flot pour un message de debug.
Vecteur 1D de données avec sémantique par valeur (style STL).
ARCCORE_HOST_DEVICE Real2 min(Real2 a, Real2 b)
Retourne le minimum de deux Real2.
Definition MathUtils.h:336
bool arcaneIsCheck()
Vrai si on est en mode vérification.
Definition Misc.cc:151