Arcane  v3.15.0.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:149
Implémentation d'un tampon pour la sérialisation.
Collection de variables.
void allocateBuffer() override
Alloue la mémoire du sérialiseur.
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.
void reserve(eBasicDataType dt, Int64 n) override
Réserve de la mémoire pour n objets de type dt.
Chaîne de caractères unicode.
Int32 Integer
Type représentant un entier.