14#include "arcane/core/VerifierService.h"
16#include "arcane/utils/List.h"
17#include "arcane/utils/ITraceMng.h"
18#include "arcane/utils/OStringStream.h"
20#include "arcane/core/ServiceBuildInfo.h"
21#include "arcane/core/ISubDomain.h"
22#include "arcane/core/IVariable.h"
23#include "arcane/core/IParallelMng.h"
24#include "arcane/core/IVariableMng.h"
25#include "arcane/core/ArcaneException.h"
26#include "arcane/core/CommonVariables.h"
27#include "arcane/core/SerializeBuffer.h"
28#include "arcane/core/VariableCollection.h"
29#include "arcane/core/IMesh.h"
30#include "arcane/core/VariableComparer.h"
46, m_sub_domain(sbi.subDomain())
47, m_service_info(sbi.serviceInfo())
72 for( VariableCollection::Enumerator i(used_vars); ++i; ){
74 if (parallel_sequential){
87 if (
mesh->parallelMng()!=pm_sd)
93 variables.add(variable);
100template<
typename ReaderType>
void VerifierService::
101_doVerif2(ReaderType reader,
const VariableList& variables,
bool compare_ghost)
111 typedef std::map<String,DiffInfo> MapDiffInfos;
112 typedef std::map<String,DiffInfo>::value_type MapDiffInfosValues;
113 MapDiffInfos diff_infos;
117 compare_args.setComputeDifferenceMethod(m_compute_diff_method);
120 for( VariableList::Enumerator i(variables); ++i; ){
127 nb_diff = r.nbDifference();
130 catch(
const ReaderWriterException& rw)
134 trace->
pinfo() <<
"Impossible to compare the variable '" << var_name <<
"'\n"
135 <<
"(Exception: " << ostr.str() <<
")";
136 not_compared_str() <<
' ' << var_name;
139 diff_infos.insert(MapDiffInfosValues(var_name,DiffInfo(var_name,nb_diff)));
142 if (nb_not_compared!=0){
143 trace->
warning() <<
"Impossible to compare " << nb_not_compared <<
" variable(s): "
144 << not_compared_str.str();
147 trace->
pfatal() <<
"No variable has been compared";
150 Int32 nb_sub_domain = pm->
commSize();
151 bool is_master = sid==0;
155 for( Integer i=0; i<nb_sub_domain; ++i ){
158 SerializeBuffer sbuf;
159 pm->recvSerializer(&sbuf,i);
160 sbuf.setMode(ISerializer::ModeGet);
163 Int64 n = sbuf.getInt64();
165 for( Integer z=0; z<n; ++z ){
166 Int64 nb_var_diff = sbuf.getInt64();
168 String uvar_name(var_name);
169 trace->
debug() <<
"RECEIVE: "
170 <<
" varname=" << var_name
171 <<
" nbdiff=" << nb_var_diff;
172 auto i_map = diff_infos.find(uvar_name);
173 if (i_map==diff_infos.end()){
174 diff_infos.insert(MapDiffInfosValues(uvar_name,DiffInfo(uvar_name,nb_var_diff)));
177 i_map->second.m_nb_diff += nb_var_diff;
183 SerializeBuffer sbuf;
184 Int64 nb_diff = diff_infos.size();
185 sbuf.setMode(ISerializer::ModeReserve);
186 sbuf.reserve(DT_Int64,1);
187 for (
auto& i_map : diff_infos) {
188 const DiffInfo& diff_info = i_map.second;
189 sbuf.reserve(DT_Int64,1);
190 sbuf.reserve(diff_info.m_variable_name);
192 sbuf.allocateBuffer();
193 sbuf.setMode(ISerializer::ModePut);
194 sbuf.putInt64(nb_diff);
195 for (
auto& i_map : diff_infos) {
196 const DiffInfo& diff_info = i_map.second;
197 Int64 n = diff_info.m_nb_diff;
199 sbuf.put(diff_info.m_variable_name);
201 pm->sendSerializer(&sbuf,0);
207 Int64 total_nb_diff = 0;
208 for (
auto& diff_info : diff_infos)
209 total_nb_diff += diff_info.second.m_nb_diff;
211 if (!m_result_file_name.empty()){
212 const CommonVariables& vc = subDomain()->commonVariables();
213 std::ofstream result_file(m_result_file_name.localstr());
214 result_file <<
"<?xml version='1.0'?>\n";
215 result_file <<
"<compare-results"
217 <<
" total-nb-diff='" << total_nb_diff <<
"'"
218 <<
" global-iteration='" << vc.globalIteration() <<
"'"
219 <<
" global-time='" << vc.globalTime() <<
"'"
221 for (
auto& i_map : diff_infos) {
222 const DiffInfo& diff_info = i_map.second;
223 result_file <<
" <variable>\n"
224 <<
" <name>" << diff_info.m_variable_name <<
"</name>\n"
225 <<
" <nb-diff>" << diff_info.m_nb_diff <<
"</nb-diff>\n"
228 result_file <<
"</compare-results>\n";
230 if (total_nb_diff!=0){
231 trace->
error() <<
"Some differences exist (N=" << total_nb_diff <<
") with the reference file";
234 trace->
info() <<
"No difference with the reference !";
243void VerifierService::
244_doVerif(IDataReader* reader,
const VariableList& variables,
bool compare_ghost)
246 _doVerif2(reader,variables,compare_ghost);
Classe de base d'un service.
Interface de la classe de base des objets principaux arcane.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual Int32 commSize() const =0
Nombre d'instance dans le communicateur.
virtual void barrier()=0
Effectue une barière.
Interface du gestionnaire d'un sous-domaine.
virtual IParallelMng * parallelMng()=0
Retourne le gestionnaire de parallélisme.
virtual IVariableMng * variableMng()=0
Retourne le gestionnaire de variables.
Interface du gestionnaire de traces.
virtual TraceMessage warning()=0
Flot pour un message d'avertissement.
virtual TraceMessage pfatal()=0
Flot pour un message d'erreur fatale parallèle.
virtual TraceMessage pinfo()=0
Flot pour un message d'information parallèle.
virtual TraceMessage error()=0
Flot pour un message d'erreur.
virtual TraceMessage info()=0
Flot pour un message d'information.
virtual TraceMessageDbg debug(Trace::eDebugLevel=Trace::Medium)=0
Flot pour un message de debug.
Interface du gestionnaire de variables.
virtual VariableCollection usedVariables()=0
Liste des variables utilisées.
Interface d'une variable.
@ PSubDomainDepend
Indique que la valeur de la variable est dépendante du sous-domaine.
@ PExecutionDepend
Indique que la valeur de la variable est dépendante de l'exécution.
virtual int property() const =0
Retourne les propriétés de la variable.
virtual eItemKind itemKind() const =0
Type des entités du maillage sur lequel repose la variable.
virtual MeshHandle meshHandle() const =0
Maillage auquel est associé la variable.
virtual String name() const =0
Nom de la variable.
bool hasMesh() const
Indique si le maillage associé a déjà été créé (i.e: mesh() est valide)
IMesh * mesh() const
Maillage associé.
Flot de sortie lié à une String.
Structure contenant les informations pour créer un service.
Chaîne de caractères unicode.
Arguments des méthodes de VariableComparer.
void setMaxPrint(Int32 v)
Positionne le nombre d'erreurs à afficher dans le listing.
void setCompareGhost(bool v)
Indique sur quelles entités on fait la comparaison.
Résultats d'une opération de comparaison.
Classe pour effectuer des comparaisons entre les variables.
VariableComparerResults apply(IVariable *var, const VariableComparerArgs &compare_args)
Applique la comparaison compare_args à la variable var.
VariableComparerArgs buildForCheckIfSame(IDataReader *data_reader)
Créé une comparaison pour vérifie qu'une variable est identique à une valeur de référence.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Int32 Integer
Type représentant un entier.
@ IK_Unknown
Entité de maillage de genre inconnu ou non initialisé