14#include "arcane/utils/ITraceMng.h"
15#include "arcane/utils/FatalErrorException.h"
16#include "arcane/utils/PlatformUtils.h"
17#include "arcane/utils/StringBuilder.h"
18#include "arcane/utils/ValueConvert.h"
20#include "arcane/core/IParallelMng.h"
21#include "arcane/core/VariableCollection.h"
22#include "arcane/core/IVariableUtilities.h"
23#include "arcane/core/VerifierService.h"
24#include "arcane/core/ItemGroup.h"
25#include "arcane/core/IVariableMng.h"
26#include "arcane/core/IVariable.h"
27#include "arcane/core/ISubDomain.h"
29#include "arcane/core/IData.h"
30#include "arcane/core/internal/IVariableInternal.h"
32#include "arcane/std/internal/BasicReader.h"
33#include "arcane/std/internal/BasicWriter.h"
40using namespace Arcane::impl;
45class ArcaneBasicVerifierService
46:
public VerifierService
59 IVariable* var = m_variable_mng->findVariableFullyQualified(full_name);
73 : VerifierService(sbi)
85 void _setFormatVersion(
Int32 v)
87 m_wanted_format_version = v;
93 Int32 m_wanted_format_version = 1;
97 void _computeFullFileName(
bool is_read)
99 ARCANE_UNUSED(is_read);
103 if (!sub_dir.
empty()) {
107 m_full_file_name = s;
109 void _doVerifHash(BasicReader* reader,
const VariableCollection& variables);
110 void _writeReferenceFile(
const String& file_name);
116void ArcaneBasicVerifierService::
117_writeReferenceFile(
const String& file_name)
119 ISubDomain* sd = subDomain();
122 auto open_mode = BasicReaderWriterCommon::OpenModeTruncate;
126 Int32 version = m_wanted_format_version;
128 ScopedPtrT<BasicWriter> verif(
new BasicWriter(sd->
application(), pm, file_name,
129 open_mode, version, want_parallel));
131 verif->setSaveValues(
false);
140 bool dump_not_common =
true;
155 _computeFullFileName(
false);
158 _writeReferenceFile(m_full_file_name);
171 _computeFullFileName(
true);
174 reader->initialize();
176 reader->setItemGroupFinder(&group_finder);
178 VariableList read_variables;
186 bool dump_not_common =
true;
188 read_variables = filtered_variables;
191 tm->
info() <<
"Checking (" << m_full_file_name <<
")";
192 reader->beginRead(read_variables);
194 _doVerif(reader.
get(), read_variables, compare_ghost);
196 _doVerifHash(reader.
get(), read_variables);
205 _getHashValueOrNull(
const std::map<String, String>& comparison_hash_map,
const String& name)
207 auto x = comparison_hash_map.find(name);
208 if (x != comparison_hash_map.end())
214void ArcaneBasicVerifierService::
217 ISubDomain* sd = subDomain();
222 info() <<
"Check Verif Hash";
224 IHashAlgorithm* ref_compare_hash_algo = ref_reader->comparisonHashAlgorithm();
225 if (!ref_compare_hash_algo)
230 std::map<String, String> current_comparison_hash_map;
231 ParallelDataWriterList parallel_data_writers;
232 info() <<
"DoVerifHash";
233 for (VariableCollection::Enumerator ivar(variables); ++ivar;) {
234 IVariable* var = *ivar;
235 Ref<IData> allocated_data;
236 IData* data = var->
data();
247 Ref<ParallelDataWriter> writer = parallel_data_writers.getOrCreateWriter(group);
248 allocated_data = writer->getSortedValues(data);
249 data = allocated_data.
get();
252 if (!hash_string.
empty())
253 current_comparison_hash_map.try_emplace(var->
fullName(), hash_string);
256 std::map<String, String> ref_comparison_hash_map;
259 Int32 nb_variable = 0;
260 Int32 nb_compared = 0;
261 Int32 nb_different = 0;
262 for (VariableCollection::Enumerator ivar(variables); ++ivar;) {
263 IVariable* var = *ivar;
264 String var_full_name = var->
fullName();
266 String ref_hash = _getHashValueOrNull(ref_comparison_hash_map, var_full_name);
267 String current_hash = _getHashValueOrNull(current_comparison_hash_map, var_full_name);
268 if (!ref_hash.
empty() && !current_hash.
empty()) {
270 if (ref_hash != current_hash) {
271 info() <<
"Different hash ref_hash=" << ref_hash <<
" current=" << current_hash
272 <<
" var=" << var_full_name;
276 info(4) <<
"Found Hash hash=" << ref_hash <<
" var=" << var_full_name;
279 info() <<
"NbVariable=" << nb_variable <<
" nb_compared=" << nb_compared <<
" nb_different=" << nb_different;
289class ArcaneBasicVerifierService2
290:
public ArcaneBasicVerifierService
295 : ArcaneBasicVerifierService(sbi)
303class ArcaneBasicVerifierServiceV3
304:
public ArcaneBasicVerifierService
309 : ArcaneBasicVerifierService(sbi)
311 _setFormatVersion(3);
313 bool use_hash = (v.value() != 0);
314 info() <<
"ArcaneBasicVerifierServiceV3: using hash?=" << use_hash;
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Ce fichier contient les différentes fabriques de services et macro pour enregistrer les services.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro pour déclarer une interface lors de l'enregistrement d'un service.
void build() override
Construction de niveau build du service.
void doVerifFromReferenceFile(bool parallel_sequential, bool compare_ghost) override
Effectue la vérification à partir du fichier référence.
void writeReferenceFile() override
Ecrit le fichier référence.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual bool isMasterIO() const =0
true si l'instance est un gestionnaire maître des entrées/sorties.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
Interface du gestionnaire d'un sous-domaine.
virtual IApplication * application()=0
Application.
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 info()=0
Flot pour un message d'information.
virtual String computeComparisonHashCollective(IHashAlgorithm *hash_algo, IData *sorted_data)=0
Calcule de Hash de comparaison pour la variable.
Interface du gestionnaire de variables.
virtual IVariableUtilities * utilities() const =0
Interface des fonctions utilitaires associées.
virtual VariableCollection usedVariables()=0
Liste des variables utilisées.
virtual void writeVariables(IDataWriter *writer, IVariableFilter *filter=0)=0
Ecrit les variables.
virtual VariableCollection filterCommonVariables(IParallelMng *pm, const VariableCollection input_variables, bool dump_not_common)=0
Filtre les variables communes entre plusieurs rangs.
Interface d'une variable.
virtual String fullName() const =0
Nom complet de la variable (avec le préfixe de la famille)
virtual IData * data()=0
Données associées à la variable.
virtual ItemGroup itemGroup() const =0
Groupe du maillage associé.
virtual IVariableInternal * _internalApi()=0
API interne à Arcane.
Interface du service de vérification des données entre deux exécutions.
@ Values
Compare toutes les valeurs.
@ HashOnly
Compare uniquement les hash des valeurs.
Groupe d'entités de maillage.
bool null() const
true is le groupe est le groupe nul
Référence à une instance.
InstanceType * get() const
Instance associée ou nullptr si aucune.
Structure contenant les informations pour créer un service.
Propriétés de création d'un service.
Constructeur de chaîne de caractère unicode.
Chaîne de caractères unicode.
bool empty() const
Vrai si la chaîne est vide (nulle ou "")
TraceMessage info() const
Flot pour un message d'information.
String fileName() const override
Nom du fichier contenant les valeurs de référence.
virtual void _getVariables(VariableList variables, bool parallel_sequential)
Remplit dans variables la liste des variables devant être relues.
void setCompareMode(eCompareMode v) override
Type de comparaison souhaité
String subDir() const override
Nom du fichier contenant les valeurs de référence.
Interface pour retrouver le groupe associée à une variable à partir de ces meta-données.
void fillComparisonHash(std::map< String, String > &comparison_hash_map)
Remplit l'argument avec des couples (nom_de_variable,valeur du hash).
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro pour enregistrer un service.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
@ ST_SubDomain
Le service s'utilise au niveau du sous-domaine.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.
std::int32_t Int32
Type entier signé sur 32 bits.