Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
VariableUtilities.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/* VariableUtilities.cc (C) 2000-2015 */
9/* */
10/* Fonctions utilitaires sur les variables. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/Array.h"
15#include "arcane/utils/Iostream.h"
16#include "arcane/utils/String.h"
17
18#include "arcane/impl/VariableUtilities.h"
19
20#include "arcane/IVariable.h"
21#include "arcane/IParallelMng.h"
22#include "arcane/IVariableMng.h"
23#include "arcane/VariableDependInfo.h"
24#include "arcane/VariableCollection.h"
25#include "arcane/SerializeBuffer.h"
26
27#include <map>
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32ARCANE_BEGIN_NAMESPACE
33
34/*---------------------------------------------------------------------------*/
35/*---------------------------------------------------------------------------*/
36
37VariableUtilities::
38VariableUtilities(IVariableMng* vm)
39: TraceAccessor(vm->traceMng())
40, m_variable_mng(vm)
41{
42}
43
44/*---------------------------------------------------------------------------*/
45/*---------------------------------------------------------------------------*/
46
47VariableUtilities::
48~VariableUtilities()
49{
50}
51
52/*---------------------------------------------------------------------------*/
53/*---------------------------------------------------------------------------*/
54
55/*---------------------------------------------------------------------------*/
56/*---------------------------------------------------------------------------*/
57
58void VariableUtilities::
59dumpAllVariableDependencies(std::ostream& ostr,bool is_recursive)
60{
61 VariableCollection used_variables = m_variable_mng->usedVariables();
63 IVariable* var = *ivar;
64 dumpDependencies(var,ostr,is_recursive);
65 }
66}
67
68/*---------------------------------------------------------------------------*/
69/*---------------------------------------------------------------------------*/
70
71void VariableUtilities::
72dumpDependencies(IVariable* var,std::ostream& ostr,bool is_recursive)
73{
74 // Ensemble des variables déjà traitées pour éviter les récursions infinies
75 _dumpDependencies(var,ostr,is_recursive);
76}
77
78/*---------------------------------------------------------------------------*/
79/*---------------------------------------------------------------------------*/
80
81void VariableUtilities::
82_dumpDependencies(IVariable* var,std::ostream& ostr,bool is_recursive)
83{
84 std::set<IVariable*> done_vars;
85 done_vars.insert(var);
86
88 var->dependInfos(depends);
89 Integer nb_depend = depends.size();
90 if (nb_depend==0)
91 return;
92
93 ostr << var->fullName()
94 << " time=" << var->modifiedTime()
95 << " nb_depend=" << nb_depend
96 << '\n';
97
98 if (nb_depend!=0){
99 ostr << "{\n";
100 for( Integer i=0; i<nb_depend; ++i ){
101 _dumpDependencies(depends[i],ostr,is_recursive,done_vars,2);
102 }
103 ostr << "}\n";
104 }
105}
106
107/*---------------------------------------------------------------------------*/
108/*---------------------------------------------------------------------------*/
109
110void VariableUtilities::
111_dumpDependencies(VariableDependInfo& vdi,std::ostream& ostr,bool is_recursive,
112 std::set<IVariable*>& done_vars,Integer indent_level)
113{
114 IVariable* var = vdi.variable();
115 bool no_cycle = done_vars.find(var)==done_vars.end();
116 bool do_depend = no_cycle;
117 if (!is_recursive)
118 do_depend = false;
119 done_vars.insert(var);
120
121 std::string indent_str;
122 for( Integer i=0; i<indent_level; ++i )
123 indent_str.push_back(' ');
124
125 UniqueArray<VariableDependInfo> depends;
126 var->dependInfos(depends);
127 Integer nb_depend = depends.size();
128
129 ostr << indent_str
130 << var->fullName()
131 << " time=" << var->modifiedTime()
132 << " nb_depend=" << nb_depend
133 << " trace_info=" << vdi.traceInfo();
134 if (!no_cycle)
135 ostr << " (cycle)";
136 ostr << '\n';
137
138 if (do_depend && nb_depend!=0){
139 ostr << indent_str << "{\n";
140 for( Integer i=0; i<nb_depend; ++i ){
141 _dumpDependencies(depends[i],ostr,true,done_vars,indent_level+2);
142 }
143 ostr << indent_str << "}\n";
144 }
145}
146
147/*---------------------------------------------------------------------------*/
148/*---------------------------------------------------------------------------*/
159VariableCollection VariableUtilities::
160filterCommonVariables(IParallelMng* pm,const VariableCollection input_variables,
161 bool dump_not_common)
162{
165 vars_to_check.add(*i);
166
167 Integer nb_var = vars_to_check.size();
168 info(4) << "CHECK: nb_variable_to_compare=" << nb_var;
169
170 // Créé un buffer pour sérialiser les noms des variables dont on dispose
171 SerializeBuffer send_buf;
172 send_buf.setMode(ISerializer::ModeReserve);
173 send_buf.reserveInteger(1);
174 for( Integer i=0; i<nb_var; ++i ){
175 send_buf.reserve(vars_to_check[i]->fullName());
176 }
177
178 send_buf.allocateBuffer();
179 send_buf.setMode(ISerializer::ModePut);
180 send_buf.putInteger(nb_var);
181 for( Integer i=0; i<nb_var; ++i ){
182 send_buf.put(vars_to_check[i]->fullName());
183 }
184
185 // Récupère les infos des autres PE.
186 SerializeBuffer recv_buf;
187 pm->allGather(&send_buf,&recv_buf);
188
189 std::map<String,Int32> var_occurences;
190
191 Int32 nb_rank = pm->commSize();
192 recv_buf.setMode(ISerializer::ModeGet);
193 for( Integer i=0; i<nb_rank; ++i ){
194 Integer nb_var_rank = recv_buf.getInteger();
195 info(5) << "String recv_nb_var_rank rank=" << i << " n=" << nb_var_rank;
196 for( Integer z=0; z<nb_var_rank; ++z ){
197 String x;
198 recv_buf.get(x);
199 std::map<String,Int32>::iterator vo = var_occurences.find(x);
200 if (vo==var_occurences.end())
201 var_occurences.insert(std::make_pair(x,1));
202 else
203 vo->second = vo->second + 1;
204 //info() << "String rank=" << i << " z=" << z << " name=" << x;
205 }
206 }
207
208 // Parcours la liste des variables et range dans \a common_vars
209 // celles qui sont disponibles sur tous les rangs de \a pm
210 std::map<String,IVariable*> common_vars;
211 {
212 std::map<String,Int32>::const_iterator end_var = var_occurences.end();
213 for( Integer i=0; i<nb_var; ++i ){
215 std::map<String,Int32>::const_iterator i_var = var_occurences.find(var->fullName());
216 if (i_var==end_var)
217 // Ne devrait pas arriver
218 continue;
219 if (i_var->second!=nb_rank){
220 if (dump_not_common)
221 info() << "ERROR: can not compare variable '" << var->fullName()
222 << "' because it is not defined on all replica nb_define=" << i_var->second;
223 continue;
224 }
225 common_vars.insert(std::make_pair(var->fullName(),var));
226 }
227 }
228
229 // Créé la liste finale en itérant sur la map \a common_vars
230 // et range les valeurs dans \a sorted_common_vars. Comme la map
231 // est triée par ordre alphabétique, ce sera aussi le cas de
232 // \a sorted_common_vars;
234 {
235 std::map<String,IVariable*>::const_iterator end_var = common_vars.end();
236 std::map<String,IVariable*>::const_iterator i_var = common_vars.begin();
237 for( ; i_var!=end_var; ++i_var ){
238 sorted_common_vars.add(i_var->second);
239 }
240 }
241
242 return sorted_common_vars;
243}
244
245/*---------------------------------------------------------------------------*/
246/*---------------------------------------------------------------------------*/
247
248ARCANE_END_NAMESPACE
249
250/*---------------------------------------------------------------------------*/
251/*---------------------------------------------------------------------------*/
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual void allGather(ConstArrayView< char > send_buf, ArrayView< char > recv_buf)=0
Effectue un regroupement sur tous les processeurs. Il s'agit d'une opération collective....
Interface d'une variable.
Definition IVariable.h:54
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Implémentation d'un tampon pour la sérialisation.
Collection de variables.
void allocateBuffer() override
Alloue la mémoire du sérialiseur.
void reserve(eDataType dt, Int64 n) override
Réserve de la mémoire pour n objets de type dt.
Integer getInteger() override
Récupère une taille.
void put(Span< const Real > values) override
Ajoute le tableau values.
void setMode(eMode new_mode) override
Positionne le fonctionnement actuel.
void putInteger(Integer value) override
Ajoute l'entier value.
void get(RealArrayView values) override
Récupère le tableau values.
Chaîne de caractères unicode.
Int32 Integer
Type représentant un entier.