Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Hdf5VariableReader.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 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/* Hdf5VariableReader.cc (C) 2000-2023 */
9/* */
10/* Lecture de variables au format HDF5. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ScopedPtr.h"
15#include "arcane/utils/StringBuilder.h"
16#include "arcane/utils/ITraceMng.h"
17#include "arcane/utils/HashTableMap.h"
18#include "arcane/utils/PlatformUtils.h"
19#include "arcane/utils/NotSupportedException.h"
20
21#include "arcane/AbstractService.h"
22#include "arcane/IVariableReader.h"
23#include "arcane/BasicTimeLoopService.h"
24#include "arcane/IXmlDocumentHolder.h"
25#include "arcane/IIOMng.h"
26#include "arcane/IMesh.h"
27#include "arcane/IItemFamily.h"
28#include "arcane/IParallelMng.h"
29#include "arcane/ISubDomain.h"
30#include "arcane/CommonVariables.h"
31#include "arcane/IVariableAccessor.h"
32#include "arcane/Directory.h"
33#include "arcane/VariableCollection.h"
34#include "arcane/IMeshMng.h"
35
36#include "arcane/hdf5/Hdf5VariableReader_axl.h"
37#include "arcane/hdf5/Hdf5Utils.h"
38#include "arcane/hdf5/Hdf5VariableInfoBase.h"
39
40#include <map>
41
42/*---------------------------------------------------------------------------*/
43/*---------------------------------------------------------------------------*/
44
45namespace Arcane
46{
47
48/*---------------------------------------------------------------------------*/
49/*---------------------------------------------------------------------------*/
50
51using namespace Hdf5Utils;
52
53/*---------------------------------------------------------------------------*/
54/*---------------------------------------------------------------------------*/
55
57: public TraceAccessor
58{
59 protected:
60
62 {
63 public:
65 : m_time(0.0) {}
66 TimePathPair(Real vtime,const String& path)
67 : m_time(vtime), m_path(path) {}
68 public:
69 Real timeValue() const { return m_time; }
70 const String& path() const { return m_path; }
71 private:
72 Real m_time;
73 String m_path;
74 };
75
76 public:
77
79 : TraceAccessor(mesh->traceMng()), m_mesh(mesh), m_is_verbose(false)
80 {
81 if (!platform::getEnvironmentVariable("ARCANE_DEBUG_HDF5VARIABLE").null())
82 m_is_verbose = true;
83 }
84
85 protected:
86
87 IMesh* m_mesh;
89 String m_hdf5_file_name;
90 bool m_is_verbose;
91
92 protected:
93
94 void _readStandardArray(IVariable* var,RealArray& buffer,hid_t file_id,const String& path);
95 void _readVariable(IVariable* var,RealArray& buffer,HFile& hfile,const String& path);
96 void _checkValidVariable(IVariable* var);
97};
98
99/*---------------------------------------------------------------------------*/
100/*---------------------------------------------------------------------------*/
101
102void Hdf5VariableReaderHelperBase::
103_readStandardArray(IVariable* var,RealArray& buffer,hid_t file_id,const String& path)
104{
105 Hdf5Utils::StandardArrayT<Real> values(file_id,path);
106 values.readDim();
107 Int64ConstArrayView dims(values.dimensions());
108 Integer nb_dim = dims.size();
109 if (nb_dim!=1)
110 fatal() << "Only one-dimension array are allowed "
111 << " dim=" << nb_dim << " var_name=" << var->fullName() << " path=" << path;
112 Integer nb_item = arcaneCheckArraySize(dims[0]);
113 info(4) << "NB_ITEM: nb_item=" << nb_item;
114#if 0
115 if (nb_item!=family->nbItem())
116 fatal() << "Bad number of items in file n=" << nb_item
117 << " expected=" << family->nbItem()
118 << " var_name=" << var_name << " path=" << var_path
119 << " family=" << var_family;
120#endif
121 buffer.resize(nb_item);
122 values.read(m_types,buffer);
123#if 0
124 {
125 Integer index=0;
126 for( Integer i=0; i<nb_item; ++i ){
127 if (buffer[i]>0.0){
128 ++index;
129 info() << " VAR_VAL i=" << i << " value=" << buffer[i];
130 }
131 if (index>20)
132 break;
133 }
134 }
135#endif
136}
137
138/*---------------------------------------------------------------------------*/
139/*---------------------------------------------------------------------------*/
140
141void Hdf5VariableReaderHelperBase::
142_readVariable(IVariable* var,RealArray& buffer,HFile& hfile,const String& path)
143{
144 IParallelMng* pm = m_mesh->parallelMng();
145 bool is_master = pm->isMasterIO();
146 //Integer rank = pm->commRank();
147 Integer master_rank = pm->masterIORank();
148 Integer buf_size = 0;
149
150 if (is_master){
151 if (hfile.id()<0){
152 info() << "Hdf5VariableReaderHelper::OPEN FILE " << m_hdf5_file_name;
153 hfile.openRead(m_hdf5_file_name);
154 }
155 _readStandardArray(var,buffer,hfile.id(),path);
156 buf_size = buffer.size();
157 IntegerArrayView iav(1,&buf_size);
158 pm->broadcast(iav,master_rank);
159 pm->broadcast(buffer,master_rank);
160 }
161 else{
162 IntegerArrayView iav(1,&buf_size);
163 pm->broadcast(iav,master_rank);
164 buffer.resize(buf_size);
165 pm->broadcast(buffer,master_rank);
166 }
167
168 Int64UniqueArray unique_ids(buf_size);
169 Int32UniqueArray local_ids(buf_size);
170 IData* var_data = var->data();
171 auto* var_true_data = dynamic_cast< IArrayDataT<Real>* >(var_data);
172 if (!var_true_data)
173 throw FatalErrorException(A_FUNCINFO,"Variable is not an array of Real");
174 RealArrayView var_value(var_true_data->view());
175 Integer nb_var_value = var_value.size();
176 for( Integer z=0; z<buf_size; ++z )
177 unique_ids[z] = z;
178 var->itemFamily()->itemsUniqueIdToLocalId(local_ids,unique_ids,false);
179 for( Integer z=0; z<buf_size; ++z ){
180 Integer lid = local_ids[z];
181 if (lid==NULL_ITEM_LOCAL_ID)
182 continue;
183 if (lid>nb_var_value)
184 throw FatalErrorException(A_FUNCINFO,"Bad variable");
185 var_value[lid] = buffer[z];
186 }
187 info(4) << "End of read for variable '" << var->fullName()
188 << "' path=" << path;
189}
190
191
192/*---------------------------------------------------------------------------*/
193/*---------------------------------------------------------------------------*/
194
195void Hdf5VariableReaderHelperBase::
196_checkValidVariable(IVariable* var)
197{
198 if (var->dataType()==DT_Real && (var->dimension()==1) && var->itemFamily())
199 return;
200 throw FatalErrorException(A_FUNCINFO,
201 String::format("Bad variable '{0}'. Variable must be an item variable,"
202 " have datatype 'Real' and dimension '1'",
203 var->fullName()));
204}
205
206/*---------------------------------------------------------------------------*/
207/*---------------------------------------------------------------------------*/
208
209/*---------------------------------------------------------------------------*/
210/*---------------------------------------------------------------------------*/
211/*!
212 * \brief Lecture de variables au format HDF5.
213 */
216{
217 public:
218 /*!
219 * \todo permettre autre chose que 'Real' comme type de variable.
220 */
222 {
223 public:
225 : m_variable(var),
226 m_begin_variable(VariableBuildInfo(var.itemGroup().mesh(),String("Hdf5TimeVariableBegin")+var.name(),
227 IVariable::PNoDump),var.itemGroup().itemKind()),
228 m_end_variable(VariableBuildInfo(var.itemGroup().mesh(),String("Hdf5TimeVariableEnd")+var.name(),
229 IVariable::PNoDump),var.itemGroup().itemKind()),
231 {
232 }
233 public:
234 VariableItemReal& variable(){ return m_variable; }
235 private:
236 VariableItemReal m_variable;
237 public:
238 UniqueArray<TimePathPair> m_time_path_values;
239 VariableItemReal m_begin_variable;
240 VariableItemReal m_end_variable;
241
242 /*!
243 * \brief Contient l'indice dans le tableau des temps du temps actuellement lu.
244 *
245 * Cet indice vaut (-1) si aucun temps n'a été lu.
246 */
248 //! Temps du maillage auquel on a lu cet index.
250 };
251
252
253 public:
254
255 Hdf5VariableReaderHelper(IMesh* mesh,const String& xml_file_name);
257
258 public:
259
260 /*!
261 * \brief Ouvre le fichier contenant les informations de lecture.
262 *
263 * \a is_start est vrai lors du démarrage d'un cas. Si ce n'est pas le cas,
264 * il n'y a pas besoin de lire les variables d'initialisation.
265 */
266 void open(bool is_start);
267
268 //! Lit les informations
269 void readInit();
270
271 //! Lecture et mise à jour des variables
272 void readAndUpdateTimeVariables(Real wanted_time);
273
274 //! Notification d'un retout-arrière
275 void notifyRestore();
276
277
278 private:
279
280 String m_xml_file_name;
281
282 ScopedPtrT<IXmlDocumentHolder> m_xml_document_holder;
283 UniqueArray<Hdf5VariableInfoBase*> m_init_variables;
284 UniqueArray<TimeVariableInfoBase*> m_time_variables;
285
286 private:
287
288 //void _checkValidVariable(IVariable* var);
289 //void _readVariable(IVariable* var,RealUniqueArray buffer,HFile& hfile,const String& path);
290 void _readAndUpdateVariable(TimeVariableInfoBase* vi,Real wanted_time,HFile& hfile);
291
292 private:
293};
294
295/*---------------------------------------------------------------------------*/
296/*---------------------------------------------------------------------------*/
297
298Hdf5VariableReaderHelper::
299Hdf5VariableReaderHelper(IMesh* mesh,const String& xml_file_name)
301, m_xml_file_name(xml_file_name)
302{
303}
304
305/*---------------------------------------------------------------------------*/
306/*---------------------------------------------------------------------------*/
307
308Hdf5VariableReaderHelper::
309~Hdf5VariableReaderHelper()
310{
311 for( Integer i=0, n=m_init_variables.size(); i<n; ++i )
312 delete m_init_variables[i];
313 m_init_variables.clear();
314 for( Integer i=0, n=m_time_variables.size(); i<n; ++i )
315 delete m_time_variables[i];
316 m_time_variables.clear();
317}
318
319/*---------------------------------------------------------------------------*/
320/*---------------------------------------------------------------------------*/
321
323open(bool is_start)
324{
325 if (m_xml_file_name.null())
326 ARCANE_FATAL("No xml file specified");
327 IIOMng* io_mng = m_mesh->parallelMng()->ioMng();
328 m_xml_document_holder = io_mng->parseXmlFile(m_xml_file_name);
329 if (!m_xml_document_holder.get())
330 ARCANE_FATAL("Can not read file '{0}'",m_xml_file_name);
331
332 XmlNode root_element = m_xml_document_holder->documentNode().documentElement();
333 m_hdf5_file_name = root_element.attrValue("file-name",true);
334
335 // Lecture des variables pour l'initialisation
336 if (is_start){
337 XmlNodeList variables_elem = root_element.children("init-variable");
338 for( XmlNode elem : variables_elem ){
339 String var_name = elem.attrValue("name",true);
340 String var_family = elem.attrValue("family",true);
341 String var_path = elem.attrValue("path",true);
342 info() << "INIT_VARIABLE: name=" << var_name << " path=" << var_path
343 << " family=" << var_family;
344 Hdf5VariableInfoBase* var_info = Hdf5VariableInfoBase::create(m_mesh,var_name,var_family);
345 var_info->setPath(var_path);
346 m_init_variables.add(var_info);
347 }
348 }
349
350
351 XmlNodeList variables_elem = root_element.children("time-variable");
352 for( XmlNode elem : variables_elem ){
353 String var_name = elem.attrValue("name",true);
354 String var_family = elem.attrValue("family",true);
355 info() << "TIME_VARIABLE: name=" << var_name << " family=" << var_family;
356 IItemFamily* family = m_mesh->findItemFamily(var_family,true);
357 IVariable* var = family->findVariable(var_name,false);
358 if (!var){
359 warning() << "TEMPORARY: Create variable from hdf5 file";
360 VariableCellReal* vcr = new VariableCellReal(VariableBuildInfo(m_mesh,var_name));
361 var = vcr->variable();
362 }
363 _checkValidVariable(var);
364 VariableItemReal vir(VariableBuildInfo(m_mesh,var->name(),var->itemFamily()->name()),var->itemKind());
365 TimeVariableInfoBase* var_info = new TimeVariableInfoBase(vir);
366
367 XmlNodeList times_elem = elem.children("time-value");
368 Real last_var_time = -1.0;
369 for( XmlNode time_elem : times_elem ){
370 String var_path = time_elem.attrValue("path",true);
371 XmlNode var_time_node = time_elem.attr("global-time",true);
372 Real var_time = var_time_node.valueAsReal(true);
373 if (var_time<=last_var_time){
374 fatal() << "Bad value for " << var_time_node.xpathFullName()
375 << " current=" << var_time << " previous=" << last_var_time
376 << ". current value should be greater than previous time.";
377 }
378 last_var_time = var_time;
379 var_info->m_time_path_values.add(TimePathPair(var_time,var_path));
380 }
381
382 m_time_variables.add(var_info);
383 }
384}
385
386/*---------------------------------------------------------------------------*/
387/*---------------------------------------------------------------------------*/
388
390readInit()
391{
392 //TODO lancer exception en cas d'erreur.
393 HFile hfile;
394
395 for( Integer iz=0, izs=m_init_variables.size(); iz<izs; ++iz ){
396 Hdf5VariableInfoBase* vi = m_init_variables[iz];
397 IVariable* var = vi->variable();
398 info() << "Hdf5VariableReader: init for variable name=" << var->fullName();
399 vi->readVariable(hfile,m_hdf5_file_name,m_types,String(),var->data());
400 }
401}
402
403/*---------------------------------------------------------------------------*/
404/*---------------------------------------------------------------------------*/
405
406void Hdf5VariableReaderHelper::
407_readAndUpdateVariable(TimeVariableInfoBase* vi,Real wanted_time,HFile& hfile)
408{
409 VariableItemReal& var = vi->variable();
410
411 ConstArrayView<TimePathPair> time_path_values(vi->m_time_path_values.view());
412 Integer current_index = -1;
413 Real begin_time = 0.0;
414 Real end_time = 0.0;
415 Integer nb_value = time_path_values.size();
416 for( Integer i=0; i<nb_value; ++i ){
417 begin_time = time_path_values[i].timeValue();
418 if (wanted_time<begin_time){
419 break;
420 }
421 current_index = i;
422 if ((i+1)==nb_value){
423 break;
424 }
425 if (math::isEqual(begin_time,wanted_time)){
426 break;
427 }
428 end_time = time_path_values[i+1].timeValue();
429 if (wanted_time>begin_time && wanted_time<end_time){
430 break;
431 }
432 }
433 // Ne fait rien si on n'est pas dans la table
434 if (current_index<0)
435 return;
436 info(4) << " FIND TIME: var=" << var.variable()->fullName() << " current=" << wanted_time
437 << " begin=" << begin_time << " end=" << end_time
438 << " index=" << current_index;
439 Int64 mesh_timestamp = var.variable()->meshHandle().mesh()->timestamp();
440 bool need_read = current_index!=vi->m_current_index || vi->m_mesh_timestamp!=mesh_timestamp;
441 if (nb_value==1 || (current_index+1)==nb_value){
442 // On est à la fin de la table.
443 // Dans ce cas, prend la valeur correspondant au dernier index sans faire
444 // d'interpolation.
445 if (need_read){
446 RealUniqueArray buffer;
447 String begin_path = vi->m_time_path_values[current_index].path();
448 info() << "Hdf5VariableReaderHelper:: PATH=" << begin_path;
449 _readVariable(vi->m_begin_variable.variable(),buffer,hfile,begin_path);
450 vi->m_current_index = current_index;
451 vi->m_mesh_timestamp = mesh_timestamp;
452 }
453
454 begin_time = vi->m_time_path_values[current_index].timeValue();
455 VariableItemReal& begin_variable = vi->m_begin_variable;
456
457 ENUMERATE_ITEM(iitem,var.itemGroup()){
458 Real begin_value = begin_variable[iitem];
459 var[iitem] = begin_value;
460 if (m_is_verbose)
461 info() << "Value for cell=" << (*iitem).uniqueId() << " var_value=" << var[iitem];
462 }
463 }
464 else{
465 if (need_read){
466 RealUniqueArray buffer;
467 String begin_path = vi->m_time_path_values[current_index].path();
468 String end_path = vi->m_time_path_values[current_index+1].path();
469 info(4) << "Hdf5VariableReaderHelper:: BEGIN_PATH=" << begin_path << " END_PATH=" << end_path;
470 _readVariable(vi->m_begin_variable.variable(),buffer,hfile,begin_path);
471 _readVariable(vi->m_end_variable.variable(),buffer,hfile,end_path);
472 vi->m_current_index = current_index;
473 vi->m_mesh_timestamp = mesh_timestamp;
474 }
475
476 begin_time = vi->m_time_path_values[current_index].timeValue();
477 end_time = vi->m_time_path_values[current_index+1].timeValue();
478 if (math::isEqual(begin_time,end_time))
479 fatal() << "Hdf5VariableReaderHelper::_readAndUpdateVariable() "
480 << " same value for begin and end time (value=" << begin_time << ")";
481 Real ratio = (wanted_time - begin_time) / (end_time - begin_time);
482 info(4) << " RATIO = " << ratio;
483 VariableItemReal& begin_variable = vi->m_begin_variable;
484 VariableItemReal& end_variable = vi->m_end_variable;
485
486 ENUMERATE_ITEM(iitem,var.itemGroup()){
487 Real begin_value = begin_variable[iitem];
488 Real end_value = end_variable[iitem];
489 var[iitem] = (end_value-begin_value)*ratio + begin_value;
490 if (m_is_verbose){
491 info() << "Value for cell=" << (*iitem).uniqueId()
492 << " begin=" << begin_value << " end_value=" << end_value
493 << " var_value=" << var[iitem];
494 }
495 }
496 }
497}
498
499/*---------------------------------------------------------------------------*/
500/*---------------------------------------------------------------------------*/
501
503readAndUpdateTimeVariables(Real wanted_time)
504{
505 HFile hfile;
506
507 for( Integer iz=0, izs=m_time_variables.size(); iz<izs; ++iz ){
508 TimeVariableInfoBase* vi = m_time_variables[iz];
509 _readAndUpdateVariable(vi,wanted_time,hfile);
510 }
511}
512
513/*---------------------------------------------------------------------------*/
514/*---------------------------------------------------------------------------*/
515
518{
519 // Pour les variables qui dépendent du temps, indique que le temps
520 // courant est invalide et qu'il faut le recharger
521 for( Integer iz=0, izs=m_time_variables.size(); iz<izs; ++iz ){
522 TimeVariableInfoBase* vi = m_time_variables[iz];
523 vi->m_current_index = -1;
524 }
525}
526
527/*---------------------------------------------------------------------------*/
528/*---------------------------------------------------------------------------*/
529
530/*---------------------------------------------------------------------------*/
531/*---------------------------------------------------------------------------*/
532/*!
533 * \brief Lecture de variables au format HDF5.
534 */
537{
538 public:
539 /*!
540 * Nouveau format permettant de relire n'importe quelle variable
541 * (mais pour l'instant uniquement avec le type 'Real'...)
542 * //TODO: traiter changement de maillage.
543 */
545 {
546 public:
548 : m_hdf5_var_info(var), m_current_index(-1), m_mesh_timestamp(-1)
549 {
550 }
552 {
553 }
554
555 public:
556 IVariable* variable(){ return m_hdf5_var_info->variable(); }
557 Hdf5VariableInfoBase* hdf5Info(){ return m_hdf5_var_info; }
558 Real2 timeInterval() const
559 {
560 Integer n = m_time_path_values.size();
561 if (n==0)
562 return Real2(0.0,0.0);
563 Real x = m_time_path_values[0].timeValue();
564 Real y = m_time_path_values[n-1].timeValue();
565 return Real2(x,y);
566 }
567 void rebuildData()
568 {
569 IVariable* v = variable();
570 m_begin_data = v->data()->cloneRef();
571 m_end_data = v->data()->cloneRef();
572 }
573 private:
574 Hdf5VariableInfoBase* m_hdf5_var_info;
575 public:
576 UniqueArray<TimePathPair> m_time_path_values;
577 Ref<IData> m_begin_data;
578 Ref<IData> m_end_data;
579
580 /*!
581 * \brief Contient l'indice dans le tableau des temps du temps actuellement lu.
582 *
583 * Cet indice vaut (-1) si aucun temps n'a été lu.
584 */
586 //! Temps du maillage auquel on a lu cet index.
588 };
589
590 /*!
591 * \brief Infos de correspondance entre les uids sauvés et ceux
592 * du maillage courant pour le groupe \a group.
593 */
595 {
596 public:
597 CorrespondanceInfo(const ItemGroup& group)
598 : m_group(group),
599 m_corresponding_uids(VariableBuildInfo(group.mesh(),String("CorrespondingUids_")+group.fullName(),IVariable::PNoRestore)),
600 m_corresponding_hash(512,true)
601 {
602 }
603 public:
604 virtual Int64 getOldUniqueId(Int64 uid,Integer index)
605 {
606 ARCANE_UNUSED(index);
607 HashTableMapT<Int64,Int64>::Data* uid_data = m_corresponding_hash.lookup(uid);
608 if (!uid_data)
609 throw FatalErrorException(A_FUNCINFO,
610 String::format("Can not find corresponding uid item='{0}' group={1}",
611 uid,m_group.fullName()));
612 Int64 old_uid = uid_data->value();
613 return old_uid;
614 }
615 public:
616 void updateHashMap()
617 {
618 m_corresponding_hash.clear();
619 Integer nb_pair = m_corresponding_uids.size() / 2;
620 for( Integer z=0; z<nb_pair; ++z )
621 m_corresponding_hash.add(m_corresponding_uids[z*2],m_corresponding_uids[(z*2)+1]);
622 }
623 public:
624 ItemGroup m_group;
625 VariableArrayInt64 m_corresponding_uids;
626 HashTableMapT<Int64,Int64> m_corresponding_hash;
627 };
628
629 public:
630
631 Hdf5VariableReaderHelper2(IMesh* mesh,const String& hdf5_file_name);
633
634 public:
635
636 /*!
637 * \brief Spécifie les variables qu'on souhaite relire.
638 *
639 * Cette méthode doit être appelée avant open(). Si cette méthode n'est
640 * pas appelée, on essaie de relire toutes les variables sauvegardées dans
641 * le fichier.
642 */
644 {
645 m_wanted_vars = vars;
646 }
647
648 /*!
649 * \brief Ouvre le fichier contenant les informations de lecture.
650 *
651 * \a is_start est vrai lors du démarrage d'un cas. Si ce n'est pas le cas,
652 * il n'y a pas besoin de lire les variables d'initialisation.
653 */
654 void open(bool is_start);
655
656 //! Lecture et mise à jour des variables
657 void readAndUpdateTimeVariables(Real wanted_time);
658
659 //! Notification d'un retout-arrière
660 void notifyRestore();
661
662 Real2 timeInterval(IVariable* var)
663 {
664 for( Integer i=0, n=m_time_variables.size(); i<n; ++i ){
665 TimeVariableInfoBase* vinfo = m_time_variables[i];
666 if (vinfo->variable()==var)
667 return vinfo->timeInterval();
668 }
669 return Real2(0.0,0.0);
670 }
671
672 protected:
673
674 private:
675
676 UniqueArray<IVariable*> m_wanted_vars;
677 ScopedPtrT<IXmlDocumentHolder> m_xml_document_holder;
678 UniqueArray<TimeVariableInfoBase*> m_time_variables;
679 std::map<String,CorrespondanceInfo*> m_correspondance_map;
680
681 private:
682
683 template <typename DataType>
684 void _readAndUpdateVariable(TimeVariableInfoBase* vi,Real wanted_time,HFile& hfile);
685 bool _isWanted(const String& var_name,const String& var_family);
686 void _checkCreateCorrespondance(Hdf5VariableInfoBase* var,HFile& file_id,const String& group_path,bool is_start);
687 void _createCorrespondance(IVariable* var,CorrespondanceInfo* ci,Int64ConstArrayView saved_uids,Real3ConstArrayView saved_centers);
688
689 private:
690};
691
692/*---------------------------------------------------------------------------*/
693/*---------------------------------------------------------------------------*/
694
695Hdf5VariableReaderHelper2::
696Hdf5VariableReaderHelper2(IMesh* mesh,const String& hdf5_file_name)
697: Hdf5VariableReaderHelperBase(mesh)
698{
699 m_hdf5_file_name = hdf5_file_name;
700}
701
702/*---------------------------------------------------------------------------*/
703/*---------------------------------------------------------------------------*/
704
705Hdf5VariableReaderHelper2::
706~Hdf5VariableReaderHelper2()
707{
708 for( Integer i=0, n=m_time_variables.size(); i<n; ++i )
709 delete m_time_variables[i];
710 m_time_variables.clear();
711}
712
713/*---------------------------------------------------------------------------*/
714/*---------------------------------------------------------------------------*/
715
717open(bool is_start)
718{
719 if (m_hdf5_file_name.null())
720 throw FatalErrorException(A_FUNCINFO,"No hdf5 file specified");
721
722 HFile file_id;
723 IParallelMng* pm = m_mesh->parallelMng();
724 bool is_master = pm->isMasterIO();
725 ByteUniqueArray xml_bytes;
726 if (is_master){
727 file_id.openRead(m_hdf5_file_name);
728 Hdf5Utils::StandardArrayT<Byte> v(file_id.id(),"Infos");
729 v.directRead(m_types,xml_bytes);
730 }
731 info(5) << "XML_DATA len=" << xml_bytes.size() << " data=" << xml_bytes << "__EOF";
732 pm->broadcastMemoryBuffer(xml_bytes,pm->masterIORank());
733
734 IIOMng* io_mng = m_mesh->parallelMng()->ioMng();
735 m_xml_document_holder = io_mng->parseXmlBuffer(xml_bytes,m_hdf5_file_name);
736 if (!m_xml_document_holder.get())
737 ARCANE_FATAL("Can not XML data from file '{0}'",m_hdf5_file_name);
738
739 XmlNode root_element = m_xml_document_holder->documentNode().documentElement();
740 //m_hdf5_file_name = root_element.attrValue("file-name",true);
741
742 XmlNodeList variables_elem = root_element.children("time-variable");
743 for( const auto& elem : variables_elem ){
744 String var_name = elem.attrValue("name",true);
745 String var_family = elem.attrValue("family",true);
746 info(4) << "TIME_VARIABLE: name=" << var_name << " family=" << var_family;
747 if (!_isWanted(var_name,var_family))
748 continue;
749 //TODO: creer la variable si elle n'existe pas ou faire quelque chose (exception...)
750 Hdf5VariableInfoBase* var_info = Hdf5VariableInfoBase::create(m_mesh,var_name,var_family);
751 //TODO: tmp
752 String group_name = var_info->variable()->itemGroupName();
753 String index_path = String("Index") + 1;
754 String group_path = index_path + "/Groups/" + group_name;
755 _checkCreateCorrespondance(var_info,file_id,group_path,is_start);
756
757 TimeVariableInfoBase* time_var_info = new TimeVariableInfoBase(var_info);
758
759 XmlNodeList times_elem = elem.children("time-value");
760 Real last_var_time = -1.0;
761 for( const auto& time_elem : times_elem ){
762 String var_path = time_elem.attrValue("path",true);
763 XmlNode var_time_node = time_elem.attr("global-time",true);
764 Real var_time = var_time_node.valueAsReal(true);
765 if (var_time<=last_var_time){
766 fatal() << "Bad value for " << var_time_node.xpathFullName()
767 << " current=" << var_time << " previous=" << last_var_time
768 << ". current value should be greater than previous time.";
769 }
770 last_var_time = var_time;
771 time_var_info->m_time_path_values.add(TimePathPair(var_time,var_path));
772 }
773
774 m_time_variables.add(time_var_info);
775 }
776}
777
778/*---------------------------------------------------------------------------*/
779/*---------------------------------------------------------------------------*/
780
781void Hdf5VariableReaderHelper2::
782_checkCreateCorrespondance(Hdf5VariableInfoBase* var_info,HFile& file_id,const String& group_path,bool is_start)
783{
784 IVariable* var = var_info->variable();
785 // Vérifie si la correspondance existe déjà.
786 ItemGroup group = var->itemGroup();
787 CorrespondanceInfo* ci = 0;
788 std::map<String,CorrespondanceInfo*>::const_iterator iter = m_correspondance_map.find(group.fullName());
789 if (iter==m_correspondance_map.end()){
790 ci = new CorrespondanceInfo(group);
791 if (is_start){
792 Int64UniqueArray saved_uids;
793 Real3UniqueArray saved_centers;
794 var_info->readGroupInfo(file_id,m_types,group_path,saved_uids,saved_centers);
795 _createCorrespondance(var,ci,saved_uids,saved_centers);
796 }
797 ci->updateHashMap();
798 m_correspondance_map.insert(std::make_pair(group.fullName(),ci));
799 }
800 else
801 ci = iter->second;
802 var_info->setCorrespondanceFunctor(ci);
803}
804
805/*---------------------------------------------------------------------------*/
806/*---------------------------------------------------------------------------*/
807/*!
808 * \brief Recherche à quel entité du maillage sauvegardé correspondant
809 * une entité du maillage actuel.
810 *
811 * Lorsqu'on relit les valeurs des variables d'un fichier, on supporte le fait
812 * que le maillage actuel n'est pas forcément le même que le maillage
813 * sauvegardé. Dans ce cas, les uniqueId des entités ne correspondent pas.
814 * Il faut donc chercher à quel entité sauvée correspondant chaque entité
815 * du maillage actuel. Pour savoir laquelle utiliser, on prend celle
816 * du maillage d'origine la plus proche de celle du maillage actuel.
817 * Comme seules les coordonnées initiales sont sauvées, cela ne fonctionne
818 * correctement que lors de l'initialisation. Il ne faut pas faire
819 * ce traitement en reprise. On sauvegarde donc cette information dans
820 * une variable.
821 * TODO: Il faudrait pouvoir utiliser un autre algorithme que juste
822 * l'entité la plus proche.
823 */
824void Hdf5VariableReaderHelper2::
825_createCorrespondance(IVariable* var,CorrespondanceInfo* ci,Int64ConstArrayView saved_uids,
826 Real3ConstArrayView saved_centers)
827{
828 IMesh* mesh = var->meshHandle().mesh();
829 ItemGroup group = var->itemGroup();
830 IParallelMng* pm = mesh->parallelMng();
831
832 Int64UniqueArray corresponding_uids;
833 Integer nb_orig_item = saved_uids.size();
834 VariableNodeReal3& nodes_coords(mesh->nodesCoordinates());
835 ENUMERATE_ITEM(iitem,group){
836 Real3 item_center;
837 ItemUniqueId item_uid = (*iitem).uniqueId();
838 if ((*iitem).isItemWithNodes()){
839 ItemWithNodes item = (*iitem).toItemWithNodes();
840 if (!item.isOwn())
841 continue;
842 Integer nb_node = item.nbNode();
843 for( NodeLocalId inode : item.nodeIds() ){
844 item_center += nodes_coords[inode];
845 }
846 item_center /= nb_node;
847 }
848 else{
849 Node node = (*iitem).toNode();
850 item_center = nodes_coords[node];
851 }
852
853 // Recherche l'entité la plus proche.
854 Real min_dist = FloatInfo<Real>::maxValue();
855 Integer min_index = -1;
856 for( Integer z=0; z<nb_orig_item; ++z ){
857 Real d = (item_center - saved_centers[z]).squareNormL2();
858 if (d<min_dist){
859 min_dist = d;
860 min_index = z;
861 }
862 }
863 if (min_index==(-1))
864 throw FatalErrorException(A_FUNCINFO,"Can not find old unique id");
865 info() << "FIND NEAREST my_uid=" << item_uid << " orig_uid=" << saved_uids[min_index]
866 << " d^2=" << min_dist;
867 corresponding_uids.add(item_uid);
868 corresponding_uids.add(saved_uids[min_index]);
869 }
870
871 // Pour l'instant et pour se simplifier la vie en cas de repartitionnement
872 // de maillage, on récupère toutes les infos des autres sous-domaine.
873 // Ce n'est pas idéal car cela duplique les infos chez tout le monde,
874 // mais cela permet de ne pas avoir à gérer le repartitionnement.
875 // A terme, il faudrait répartir ces infos sur chaque proc et les
876 // regrouper au moment de mettre à jour la table de hashage lors
877 // d'un changement de maillage.
878 Int64UniqueArray global_uids;
879 pm->allGatherVariable(corresponding_uids,global_uids);
880 ci->m_corresponding_uids.resize(global_uids.size());
881 ci->m_corresponding_uids.copy(global_uids);
882}
883
884/*---------------------------------------------------------------------------*/
885/*---------------------------------------------------------------------------*/
886
887bool Hdf5VariableReaderHelper2::
888_isWanted(const String& var_name,const String& var_family)
889{
890 Integer nb_var = m_wanted_vars.size();
891 if (nb_var==0)
892 return true;
893 for( Integer i=0, n=m_wanted_vars.size(); i<n; ++i ){
894 IVariable* v = m_wanted_vars[i];
895 if (v->name()==var_name && v->itemFamilyName()==var_family)
896 return true;
897 }
898 return false;
899}
900
901/*---------------------------------------------------------------------------*/
902/*---------------------------------------------------------------------------*/
903
904template <typename DataType>
905void Hdf5VariableReaderHelper2::
906_readAndUpdateVariable(TimeVariableInfoBase* vi,Real wanted_time,HFile& hfile)
907{
908 //VariableItemReal& var = vi->variable();
909
910 ConstArrayView<TimePathPair> time_path_values(vi->m_time_path_values.view());
911 Integer current_index = -1;
912 Real begin_time = 0.0;
913 Real end_time = 0.0;
914 Integer nb_value = time_path_values.size();
915 for( Integer i=0; i<nb_value; ++i ){
916 begin_time = time_path_values[i].timeValue();
917 if (wanted_time<begin_time){
918 break;
919 }
920 current_index = i;
921 if ((i+1)==nb_value){
922 // Atteint la fin de la table. Ne fait rien.
923 current_index = -1;
924 break;
925 }
926 if (math::isEqual(begin_time,wanted_time)){
927 break;
928 }
929 end_time = time_path_values[i+1].timeValue();
930 if (wanted_time>begin_time && wanted_time<end_time){
931 break;
932 }
933 }
934 // Ne fait rien si on n'est pas dans la table
935 if (current_index<0)
936 return;
937
938 //TODO utiliser le modifiedTime du groupe de la variable plutot que du maillage
939 IVariable* variable = vi->variable();
940 Int64 mesh_timestamp = variable->meshHandle().mesh()->timestamp();
941
942 // Il faut relire les infos si on change d'indice dans la table
943 // ou si le maillage change
944 bool need_read = current_index!=vi->m_current_index || vi->m_mesh_timestamp!=mesh_timestamp;
945 if (need_read)
946 vi->rebuildData();
947
948 String ids_hpath = String("Index1/Groups/") + variable->itemGroupName() + "_Ids";
949 info(4) << " FIND TIME: current=" << wanted_time << " begin=" << begin_time << " end=" << end_time
950 << " index=" << current_index << "ids_path=" << ids_hpath << " var=" << variable->fullName();
951 Hdf5VariableInfoBase* var_info = vi->hdf5Info();
952 IArrayDataT<DataType>* true_begin_data = dynamic_cast<IArrayDataT<DataType>*>(vi->m_begin_data.get());
953 IArrayDataT<DataType>* true_end_data = dynamic_cast<IArrayDataT<DataType>*>(vi->m_end_data.get());
954 IArrayDataT<DataType>* true_data = dynamic_cast<IArrayDataT<DataType>*>(variable->data());
955 info(4) << "DATA: begin=" << vi->m_begin_data.get() << " end=" << vi->m_end_data.get() << " current=" << variable->data();
956 info(4) << "TRUEDATA: begin=" << true_begin_data << " end=" << true_end_data << " current=" << true_data;
957 if (!true_data || !true_end_data || !true_begin_data){
958 throw FatalErrorException(A_FUNCINFO,"variable data can not be cast to type IArrayDataT");
959 }
960 bool is_partial = variable->isPartial();
961
962 if (need_read){
963 String begin_path = vi->m_time_path_values[current_index].path();
964 String end_path = vi->m_time_path_values[current_index+1].path();
965 info(4) << "Hdf5VariableReaderHelper2:: Reading new index BEGIN_PATH=" << begin_path << " END_PATH=" << end_path;
966 var_info->setPath(begin_path);
967 var_info->readVariable(hfile,m_hdf5_file_name,m_types,ids_hpath,vi->m_begin_data.get());
968 var_info->setPath(end_path);
969 var_info->readVariable(hfile,m_hdf5_file_name,m_types,ids_hpath,vi->m_end_data.get());
970 }
971
972 vi->m_current_index = current_index;
973 vi->m_mesh_timestamp = mesh_timestamp;
974
975 begin_time = vi->m_time_path_values[current_index].timeValue();
976 end_time = vi->m_time_path_values[current_index+1].timeValue();
977 if (math::isEqual(begin_time,end_time))
978 throw FatalErrorException(A_FUNCINFO,
979 String::format("same value for begin and end time (value={0})",
980 begin_time));
981 Real ratio = (wanted_time - begin_time) / (end_time - begin_time);
982 info(4) << " BeginTime=" << begin_time << " wanted=" << wanted_time << " end_time=" << end_time
983 << " ratio = " << ratio;
984 {
985 ConstArrayView<DataType> begin_values_view = true_begin_data->view();
986 ConstArrayView<DataType> end_values_view = true_end_data->view();
987 ArrayView<DataType> values_view = true_data->view();
988 ENUMERATE_ITEM(iitem,variable->itemGroup()){
989 Int32 lid = (is_partial) ? iitem.index() : iitem.itemLocalId();
990 DataType begin_value = begin_values_view[lid];
991 DataType end_value = end_values_view[lid];
992 values_view[lid] = (end_value-begin_value)*ratio + begin_value;
993 if (m_is_verbose){
994 info() << "Value for cell=" << (*iitem).uniqueId()
995 << " begin=" << begin_value << " end_value=" << end_value
996 << " var_value=" << values_view[lid];
997 }
998 }
999 }
1000}
1001
1002
1003/*---------------------------------------------------------------------------*/
1004/*---------------------------------------------------------------------------*/
1005
1007readAndUpdateTimeVariables(Real wanted_time)
1008{
1009 HFile hfile;
1010
1011 for( Integer iz=0, izs=m_time_variables.size(); iz<izs; ++iz ){
1012 TimeVariableInfoBase* vi = m_time_variables[iz];
1013 IVariable* variable=vi->variable();
1014 switch (variable->dataType()) {
1015 case DT_Real:
1016 _readAndUpdateVariable<Real>(vi,wanted_time,hfile);
1017 break;
1018 case DT_Real3:
1019 _readAndUpdateVariable<Real3>(vi,wanted_time,hfile);
1020 break;
1021 default:
1022 throw NotSupportedException(A_FUNCINFO,"Bad variable datatype (only Real and Real3 are supported)");
1023 }
1024 }
1025}
1026
1027/*---------------------------------------------------------------------------*/
1028/*---------------------------------------------------------------------------*/
1029
1032{
1033 // Pour les variables qui dépendent du temps, indique que le temps
1034 // courant est invalide et qu'il faut le recharger
1035 for( Integer iz=0, izs=m_time_variables.size(); iz<izs; ++iz ){
1036 TimeVariableInfoBase* vi = m_time_variables[iz];
1037 vi->m_current_index = -1;
1038 }
1039}
1040
1041/*---------------------------------------------------------------------------*/
1042/*---------------------------------------------------------------------------*/
1043
1044/*---------------------------------------------------------------------------*/
1045/*---------------------------------------------------------------------------*/
1046/*!
1047 * \brief Lecture de variables au format HDF5.
1048 */
1050: public ArcaneHdf5VariableReaderObject
1051{
1052 public:
1053
1054 explicit Hdf5VariableReader(const ServiceBuildInfo& sbi);
1055 ~Hdf5VariableReader() override;
1056
1057 public:
1058
1059 void build() override
1060 {
1061 }
1062
1063 void onTimeLoopStartInit() override
1064 {
1065 _load(true);
1066 for( Integer i=0, is=m_readers.size(); i<is; ++i ){
1067 m_readers[i]->readInit();
1068 }
1069 }
1070 void onTimeLoopContinueInit() override
1071 {
1072 // En reprise, il faut charger les variables mais pas les relire
1073 _load(false);
1074 }
1075 void onTimeLoopEndLoop() override {}
1076 void onTimeLoopRestore() override
1077 {
1078 for( Integer i=0, is=m_readers.size(); i<is; ++i ){
1079 m_readers[i]->notifyRestore();
1080 }
1081 }
1082 void onTimeLoopBeginLoop() override
1083 {
1084 Real current_time = subDomain()->commonVariables().globalTime();
1085 for( Integer i=0, is=m_readers.size(); i<is; ++i ){
1086 m_readers[i]->readAndUpdateTimeVariables(current_time);
1087 }
1088 }
1089
1090 private:
1091
1092 void _load(bool is_start)
1093 {
1094 IMeshMng* mm = subDomain()->meshMng();
1095 for( Integer i=0, is=options()->read.size(); i<is; ++i ){
1096 String file_name = options()->read[i]->fileName();
1097 String mesh_name = options()->read[i]->meshName();
1098 info() << "Hdf5VariableReader: FILE_INFO: mesh=" << mesh_name << " file_name=" << file_name;
1099 {
1100 IMesh* mesh = mm->findMeshHandle(mesh_name).mesh();
1101 Hdf5VariableReaderHelper* sd = new Hdf5VariableReaderHelper(mesh,file_name);
1102 m_readers.add(sd);
1103 }
1104 }
1105 info() << "Hdf5VariableReader: Nb reader =" << m_readers.size();
1106 for( Integer i=0, is=m_readers.size(); i<is; ++i ){
1107 m_readers[i]->open(is_start);
1108 }
1109 }
1110
1111 private:
1113};
1114
1115/*---------------------------------------------------------------------------*/
1116/*---------------------------------------------------------------------------*/
1117
1118Hdf5VariableReader::
1119Hdf5VariableReader(const ServiceBuildInfo& sbi)
1120: ArcaneHdf5VariableReaderObject(sbi)
1121{
1122}
1123
1124/*---------------------------------------------------------------------------*/
1125/*---------------------------------------------------------------------------*/
1126
1127Hdf5VariableReader::
1128~Hdf5VariableReader()
1129{
1130 for( Integer i=0, is=m_readers.size(); i<is; ++i )
1131 delete m_readers[i];
1132 m_readers.clear();
1133}
1134
1135/*---------------------------------------------------------------------------*/
1136/*---------------------------------------------------------------------------*/
1137
1138/*---------------------------------------------------------------------------*/
1139/*---------------------------------------------------------------------------*/
1140/*!
1141 * \brief Lecture de variables au format HDF5.
1142 */
1144: public BasicService
1145, public IVariableReader
1146{
1147 public:
1148
1151
1152 public:
1153
1154 virtual void build()
1155 {
1156 }
1157
1158 virtual void read(IVariable* var)
1159 {
1160 ARCANE_UNUSED(var);
1161 }
1162
1163 virtual void initialize(bool is_start)
1164 {
1165 pwarning() << "Reading variable from HDF5 file does not work with mesh load balancing";
1166 if (m_base_file_name.null())
1167 m_base_file_name = "data";
1168 String file_name = m_base_file_name + ".h5";
1169 Directory dir(m_directory_name);
1170 String full_file_name = dir.file(file_name);
1171 m_helper = new Hdf5VariableReaderHelper2(mesh(),full_file_name);
1172 m_helper->setVariables(m_variables);
1173 m_helper->open(is_start);
1174 }
1175
1176 virtual void updateVariables(Real wanted_time)
1177 {
1178 m_helper->readAndUpdateTimeVariables(wanted_time);
1179 }
1180
1181 virtual void setBaseDirectoryName(const String& path)
1182 {
1183 m_directory_name = path;
1184 }
1185
1186 virtual void setBaseFileName(const String& path)
1187 {
1188 m_base_file_name = path;
1189 }
1190
1192 {
1193 for( VariableCollection::Enumerator ivar(vars); ++ivar; )
1194 m_variables.add(*ivar);
1195 }
1197 {
1198 arcaneCheckNull(m_helper);
1199 arcaneCheckNull(var);
1200 return m_helper->timeInterval(var);
1201 }
1202
1203 public:
1204 Hdf5VariableReaderHelper2* m_helper;
1205 String m_directory_name;
1206 String m_base_file_name;
1207 UniqueArray<IVariable*> m_variables;
1208};
1209
1210/*---------------------------------------------------------------------------*/
1211/*---------------------------------------------------------------------------*/
1212
1213ManualHdf5VariableReader::
1214ManualHdf5VariableReader(const ServiceBuildInfo& sbi)
1215: BasicService(sbi)
1216, m_helper(0)
1217, m_directory_name(".")
1218, m_base_file_name("data")
1219{
1220}
1221
1222/*---------------------------------------------------------------------------*/
1223/*---------------------------------------------------------------------------*/
1224
1225ManualHdf5VariableReader::
1226~ManualHdf5VariableReader()
1227{
1228 delete m_helper;
1229}
1230
1231/*---------------------------------------------------------------------------*/
1232/*---------------------------------------------------------------------------*/
1233/*!
1234 * \brief Lecture de variables au format HDF5 via un descripteur XML
1235 */
1237: public BasicService
1238, public IVariableReader
1239{
1240 public:
1241
1243 : BasicService(sbi), m_reader(nullptr){}
1245 {
1246 delete m_reader;
1247 }
1248
1249 public:
1250
1251 virtual void build()
1252 {
1253 }
1254
1255 public:
1256
1257 virtual void read(IVariable* var)
1258 {
1259 ARCANE_UNUSED(var);
1260 throw NotSupportedException(A_FUNCINFO);
1261 }
1262
1263 virtual void initialize(bool is_start)
1264 {
1265 _load(is_start);
1266 }
1267
1268 virtual void updateVariables(Real wanted_time)
1269 {
1270 m_reader->readAndUpdateTimeVariables(wanted_time);
1271 }
1272
1273 virtual void setBaseDirectoryName(const String& path)
1274 {
1275 m_directory_name = path;
1276 }
1277
1278 virtual void setBaseFileName(const String& path)
1279 {
1280 m_base_file_name = path;
1281 }
1282
1284 {
1285 ARCANE_UNUSED(vars);
1286 throw NotSupportedException(A_FUNCINFO);
1287 }
1288
1290 {
1291 ARCANE_UNUSED(var);
1292 throw NotSupportedException(A_FUNCINFO);
1293 }
1294
1295 private:
1296
1297 void _load(bool is_start)
1298 {
1299 ARCANE_UNUSED(is_start);
1300
1301 Directory dir(m_directory_name);
1302 String file_name = dir.file(m_base_file_name);
1303
1304 info() << "OldManualHdf5VariableReader: FILE_INFO: file_name=" << file_name;
1305 IMesh* mesh = subDomain()->defaultMesh();
1306 Hdf5VariableReaderHelper* sd = new Hdf5VariableReaderHelper(mesh,file_name);
1307 m_reader = sd;
1308 }
1309
1310 private:
1311 Hdf5VariableReaderHelper* m_reader;
1312 String m_directory_name;
1313 String m_base_file_name;
1314};
1315
1316/*---------------------------------------------------------------------------*/
1317/*---------------------------------------------------------------------------*/
1318
1319
1320ARCANE_REGISTER_SERVICE_HDF5VARIABLEREADER(Hdf5VariableReader,
1321 Hdf5VariableReader);
1322
1323ARCANE_REGISTER_SERVICE(ManualHdf5VariableReader,
1324 ServiceProperty("Hdf5VariableReader",ST_SubDomain),
1325 ARCANE_SERVICE_INTERFACE(IVariableReader));
1326
1327ARCANE_REGISTER_SERVICE(OldManualHdf5VariableReader,
1328 ServiceProperty("OldManualHdf5VariableReader",ST_SubDomain),
1329 ARCANE_SERVICE_INTERFACE(IVariableReader));
1330
1331/*---------------------------------------------------------------------------*/
1332/*---------------------------------------------------------------------------*/
1333
1334} // End namespace Arcane
1335
1336/*---------------------------------------------------------------------------*/
1337/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ENUMERATE_ITEM(name, group)
Enumérateur générique d'un groupe de noeuds.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro pour déclarer une interface lors de l'enregistrement d'un service.
Classe de base de service lié à un sous-domaine.
Classe gérant un répertoire.
Definition Directory.h:33
virtual String file(const String &file_name) const
Retourne le chemin complet du fichier file_name dans le répertoire.
Definition Directory.cc:138
Encapsule un hid_t pour un fichier.
Definition Hdf5Utils.h:210
Encapsule un dataset simple d'un fichier HDF5 qui représente un tableau.
Definition Hdf5Utils.h:777
void directRead(StandardTypes &st, Array< DataType > &buffer)
Lit le dataset d'un tableau 1D.
Definition Hdf5Utils.cc:977
Définition des types standards Arcane pour hdf5.
Definition Hdf5Utils.h:562
Fonctor pour faire la correspondance entre une entité du maillage courant et celle du maillage sauveg...
void setPath(const String &path)
Positionne le chemin dans le fichier Hdf5 contenant la valeur de la variable.
Infos de correspondance entre les uids sauvés et ceux du maillage courant pour le groupe group.
Int64 m_mesh_timestamp
Temps du maillage auquel on a lu cet index.
Integer m_current_index
Contient l'indice dans le tableau des temps du temps actuellement lu.
Lecture de variables au format HDF5.
void readAndUpdateTimeVariables(Real wanted_time)
Lecture et mise à jour des variables.
void setVariables(ConstArrayView< IVariable * > vars)
Spécifie les variables qu'on souhaite relire.
void notifyRestore()
Notification d'un retout-arrière.
void open(bool is_start)
Ouvre le fichier contenant les informations de lecture.
Integer m_current_index
Contient l'indice dans le tableau des temps du temps actuellement lu.
Int64 m_mesh_timestamp
Temps du maillage auquel on a lu cet index.
Lecture de variables au format HDF5.
void notifyRestore()
Notification d'un retout-arrière.
void readInit()
Lit les informations.
void open(bool is_start)
Ouvre le fichier contenant les informations de lecture.
void readAndUpdateTimeVariables(Real wanted_time)
Lecture et mise à jour des variables.
Lecture de variables au format HDF5.
virtual Ref< IData > cloneRef()=0
Clone la donnée.
Interface du gestionnaire des entrées sorties.
Definition IIOMng.h:42
virtual IXmlDocumentHolder * parseXmlFile(const String &filename, const String &schemaname=String())=0
Lit et analyse le fichier XML filename.
virtual IXmlDocumentHolder * parseXmlBuffer(Span< const Byte > buffer, const String &name)=0
Lit et analyse le fichier XML contenu dans le buffer buffer.
Interface d'une famille d'entités.
virtual String name() const =0
Nom de la famille.
virtual IVariable * findVariable(const String &name, bool throw_exception=false)=0
Recherche la variable de nom name associée à cette famille.
virtual IItemFamily * findItemFamily(eItemKind ik, const String &name, bool create_if_needed=false, bool register_modifier_if_created=false)=0
Retourne la famille de nom name.
Interface du gestionnaire des maillages.
Definition IMeshMng.h:40
virtual MeshHandle * findMeshHandle(const String &name, bool throw_exception)=0
Recherche le maillage de nom name.
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
virtual Int64 timestamp()=0
Compteur indiquant le temps de dernière modification du maillage.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual void broadcastMemoryBuffer(ByteArray &bytes, Int32 rank)=0
Effectue un broadcast d'une zone mémoire.
virtual bool isMasterIO() const =0
true si l'instance est un gestionnaire maître des entrées/sorties.
virtual IIOMng * ioMng() const =0
Gestionnaire des entrées/sorties.
virtual Integer masterIORank() const =0
Rang de l'instance gérant les entrées/sorties (pour laquelle isMasterIO() est vrai)
virtual IMesh * defaultMesh()=0
Maillage par défaut.
virtual eDataType dataType() const =0
Type de la donnée gérée par la variable (Real, Integer, ...)
virtual String fullName() const =0
Nom complet de la variable (avec le préfixe de la famille)
@ PNoDump
Indique que la variable ne doit pas être sauvegardée.
Definition IVariable.h:72
virtual eItemKind itemKind() const =0
Type des entités du maillage sur lequel repose la variable.
virtual IData * data()=0
Données associées à la variable.
virtual ItemGroup itemGroup() const =0
Groupe du maillage associé.
virtual IItemFamily * itemFamily() const =0
Famille d'entité associée.
virtual String itemGroupName() const =0
Nom du groupe d'entité associée.
virtual MeshHandle meshHandle() const =0
Maillage auquel est associé la variable.
virtual String name() const =0
Nom de la variable.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
const String & fullName() const
Nom du groupe.
Definition ItemGroup.h:82
eItemKind itemKind() const
Genre du groupe. Il s'agit du genre de ses éléments.
Definition ItemGroup.h:109
IMesh * mesh() const
Maillage auquel appartient ce groupe (0 pour le group nul)
Definition ItemGroup.h:126
Lecture de variables au format HDF5.
virtual void updateVariables(Real wanted_time)
Mise à jour des variables pour le temps wanted_time.
virtual void setBaseFileName(const String &path)
Positionne le nom du fichier contenant les données.
virtual void setBaseDirectoryName(const String &path)
Positionne le chemin du répertoire contenant les données.
virtual void setVariables(VariableCollection vars)
.Positionne la liste des variables qu'on souhaite relire. Cet appel doit avoir lieu avant initialize(...
virtual void initialize(bool is_start)
Initialise le lecteur.
virtual Real2 timeInterval(IVariable *var)
Interval de temps des valeurs pour la variable var. Les données de la variable var existent pour les ...
virtual void build()
Construction de niveau build du service.
IMesh * mesh() const
Maillage associé.
Lecture de variables au format HDF5 via un descripteur XML.
virtual void build()
Construction de niveau build du service.
virtual void setBaseDirectoryName(const String &path)
Positionne le chemin du répertoire contenant les données.
virtual void setVariables(VariableCollection vars)
.Positionne la liste des variables qu'on souhaite relire. Cet appel doit avoir lieu avant initialize(...
virtual void updateVariables(Real wanted_time)
Mise à jour des variables pour le temps wanted_time.
virtual void setBaseFileName(const String &path)
Positionne le nom du fichier contenant les données.
virtual void initialize(bool is_start)
Initialise le lecteur.
virtual Real2 timeInterval(IVariable *var)
Interval de temps des valeurs pour la variable var. Les données de la variable var existent pour les ...
Classe gérant un vecteur de réel de dimension 2.
Definition Real2.h:121
Encapsulation d'un pointeur qui se détruit automatiquement.
Definition ScopedPtr.h:44
Structure contenant les informations pour créer un service.
Paramètres nécessaires à la construction d'une variable.
Collection de variables.
IVariable * variable() const
Variable associée.
String name() const
Nom de la variable.
Liste de noeuds d'un arbre DOM.
Definition XmlNodeList.h:33
Noeud d'un arbre DOM.
Definition XmlNode.h:51
XmlNode attr(const String &name, bool throw_exception=false) const
Retourne l'attribut de nom name.
Definition XmlNode.cc:248
String xpathFullName() const
Nom XPath du noeud avec ces ancêtres.
Definition XmlNode.cc:143
String attrValue(const String &name, bool throw_exception=false) const
Valeur de l'attribut name.
Definition XmlNode.cc:225
Real valueAsReal(bool throw_exception=false) const
Valeur du noeud convertie en réel. Si la conversion échoue, si throw_exception vaut false retourne 0....
Definition XmlNode.cc:464
XmlNodeList children(const String &name) const
Ensemble des noeuds fils de ce noeud ayant pour nom name.
Definition XmlNode.cc:93
Integer size() const
Nombre d'éléments du vecteur.
Classe de base des vecteurs 1D de données.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
Vue constante d'un tableau de type T.
Exception lorsqu'une erreur fatale est survenue.
Chaîne de caractères unicode.
bool null() const
Retourne true si la chaîne est nulle.
Definition String.cc:304
TraceMessage fatal() const
Flot pour un message d'erreur fatale.
TraceMessage warning() const
Flot pour un message d'avertissement.
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessage info() const
Flot pour un message d'information.
TraceMessage pwarning() const
Vecteur 1D de données avec sémantique par valeur (style STL).
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro pour enregistrer un service.
MeshVariableScalarRefT< Cell, Real > VariableCellReal
Grandeur au centre des mailles de type réel.
ItemVariableScalarRefT< Real > VariableItemReal
Grandeur de type réel.
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
constexpr __host__ __device__ bool isEqual(const _Type &a, const _Type &b)
Teste l'égalité bit à bit entre deux valeurs.
Definition Numeric.h:253
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
ConstArrayView< Real3 > Real3ConstArrayView
Equivalent C d'un tableau à une dimension de Real3.
Definition UtilsTypes.h:654
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:513
ArrayView< Integer > IntegerArrayView
Equivalent C d'un tableau à une dimension d'entiers.
Definition UtilsTypes.h:615
@ ST_SubDomain
Le service s'utilise au niveau du sous-domaine.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:515
UniqueArray< Real > RealUniqueArray
Tableau dynamique à une dimension de réels.
Definition UtilsTypes.h:521
Array< Real > RealArray
Tableau dynamique à une dimension de réels.
Definition UtilsTypes.h:333
@ DT_Real3
Donnée de type vecteur 3.
Definition DataTypes.h:47
@ DT_Real
Donnée de type réel.
Definition DataTypes.h:41
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:638
ArrayView< Real > RealArrayView
Equivalent C d'un tableau à une dimension de réels.
Definition UtilsTypes.h:617
double Real
Type représentant un réel.
Int32 Integer
Type représentant un entier.