Arcane  v3.16.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Hdf5VariableInfoBase.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/* Hdf5ItemVariableInfo.cc (C) 2000-2023 */
9/* */
10/* Lecture de variables au format HDF5. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ITraceMng.h"
15#include "arcane/utils/StringBuilder.h"
16#include "arcane/utils/HashTableMap.h"
17#include "arcane/utils/NotImplementedException.h"
18#include "arcane/utils/NotSupportedException.h"
19#include "arcane/utils/ArgumentException.h"
20
21#include "arcane/hdf5/Hdf5VariableInfoBase.h"
22
23#include "arcane/core/MeshVariable.h"
24#include "arcane/core/IItemFamily.h"
25#include "arcane/core/IMesh.h"
26#include "arcane/core/IMeshSubMeshTransition.h"
27#include "arcane/core/IVariable.h"
28#include "arcane/core/IVariableMng.h"
29#include "arcane/core/IParallelMng.h"
30
31#include <typeinfo>
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36namespace Arcane
37{
38
39/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
41
42template<typename VariableType,typename DataType>
43class Hdf5ItemVariableInfo
44: public Hdf5VariableInfoBase
45{
46 public:
47 Hdf5ItemVariableInfo(IMesh* mesh,IVariable* v);
48 public:
49 VariableType& trueVariable() { return m_variable; }
50 virtual IVariable* variable() const { return m_variable.variable(); }
51 public:
52 virtual void readVariable(Hdf5Utils::HFile& hfile,const String& filename,
53 Hdf5Utils::StandardTypes& st,const String& ids_hpath,IData* data);
55
56 private:
57 void _readStandardArray(Array<DataType>& buffer,Array<Int64>& unique_ids,const String& ids_hpath,
58 hid_t file_id,Hdf5Utils::StandardTypes& st);
59 void _writeStandardArray(Array<DataType>& buffer,hid_t file_id,Hdf5Utils::StandardTypes& st);
60 private:
61 VariableType m_variable;
62};
63
64/*---------------------------------------------------------------------------*/
65/*---------------------------------------------------------------------------*/
66
67template<typename VariableType,typename DataType>
68class Hdf5ScalarVariableInfo
69: public Hdf5VariableInfoBase
70{
71 public:
72 Hdf5ScalarVariableInfo(IVariable* v);
73 public:
74 VariableType& trueVariable() { return m_variable; }
75 virtual IVariable* variable() const { return m_variable.variable(); }
76 public:
77 virtual void readVariable(Hdf5Utils::HFile& hfile,const String& filename,
78 Hdf5Utils::StandardTypes& st,const String& ids_hpath,
79 IData* data);
80 virtual void writeVariable(Hdf5Utils::HFile& hfile,Hdf5Utils::StandardTypes& st);
81
82 private:
83 void _readStandardArray(Array<DataType>& buffer,
84 hid_t file_id,Hdf5Utils::StandardTypes& st);
85 void _writeStandardArray(Array<DataType>& buffer,hid_t file_id,Hdf5Utils::StandardTypes& st);
86 private:
87 VariableType m_variable;
88};
89
90/*---------------------------------------------------------------------------*/
91/*---------------------------------------------------------------------------*/
92
93Hdf5VariableInfoBase* Hdf5VariableInfoBase::
94create(IMesh* mesh,const String& name,const String& family_name)
95{
96 IItemFamily* family = mesh->findItemFamily(family_name,true);
97 IVariable* var = family->findVariable(name,true);
98 return Hdf5VariableInfoBase::create(var);
99}
100
101/*---------------------------------------------------------------------------*/
102/*---------------------------------------------------------------------------*/
103
104Hdf5VariableInfoBase* Hdf5VariableInfoBase::
105create(IVariable* var)
106{
107 _checkValidVariable(var);
108 Hdf5VariableInfoBase* var_info = 0;
109 IItemFamily* item_family = var->itemFamily();
110 if (item_family){
111 IMesh* mesh = item_family->mesh();
112 if (var->isPartial()){
113 switch(var->dataType()){
114 case DT_Real:
116 break;
117 case DT_Real2:
119 break;
120 case DT_Real2x2:
122 break;
123 case DT_Real3:
125 break;
126 case DT_Real3x3:
128 break;
129 case DT_Byte:
131 break;
132 case DT_Int32:
134 break;
135 case DT_Int64:
137 break;
138 default:
139 throw FatalErrorException(A_FUNCINFO,"Bad variable type");
140 break;
141 }
142 }
143 else{
144 switch(var->dataType()){
145 case DT_Real:
146 var_info = new Hdf5ItemVariableInfo<VariableItemReal,Real>(mesh,var);
147 break;
148 case DT_Real2:
149 var_info = new Hdf5ItemVariableInfo<VariableItemReal2,Real2>(mesh,var);
150 break;
151 case DT_Real2x2:
153 break;
154 case DT_Real3:
155 var_info = new Hdf5ItemVariableInfo<VariableItemReal3,Real3>(mesh,var);
156 break;
157 case DT_Real3x3:
159 break;
160 case DT_Byte:
161 var_info = new Hdf5ItemVariableInfo<VariableItemByte,Byte>(mesh,var);
162 break;
163 case DT_Int32:
164 var_info = new Hdf5ItemVariableInfo<VariableItemInt32,Int32>(mesh,var);
165 break;
166 case DT_Int64:
167 var_info = new Hdf5ItemVariableInfo<VariableItemInt64,Int64>(mesh,var);
168 break;
169 default:
170 throw FatalErrorException(A_FUNCINFO,"Bad variable type");
171 break;
172 }
173 }
174 }
175 else{
176 if (var->dimension()==0){
177 switch(var->dataType()){
178 case DT_Real:
180 break;
181 case DT_Real2:
183 break;
184 case DT_Real2x2:
186 break;
187 case DT_Real3:
189 break;
190 case DT_Real3x3:
192 break;
193 case DT_Byte:
195 break;
196 case DT_Int32:
198 break;
199 case DT_Int64:
201 break;
202 default:
203 throw FatalErrorException(A_FUNCINFO,"Bad variable type");
204 break;
205 }
206 }
207 }
208 if (!var_info)
209 throw NotSupportedException(A_FUNCINFO,
210 String::format("IData for variable '{0}'",var->fullName()));
211 return var_info;
212}
213
214/*---------------------------------------------------------------------------*/
215/*---------------------------------------------------------------------------*/
216
217void Hdf5VariableInfoBase::
218_checkValidVariable(IVariable* var)
219{
220 IItemFamily* item_family = var->itemFamily();
221 if (item_family){
222 if (var->dimension()==1)
223 return;
224 }
225 else{
226 if (var->dimension()==0)
227 return;
228 }
229
230 ARCANE_FATAL("Bad variable '{0}'. Variable has to be an item variable and have dimension"
231 "'1' or be a scalar variable",var->fullName());
232}
233
234/*---------------------------------------------------------------------------*/
235/*---------------------------------------------------------------------------*/
236
239 const String& hdf_path,Integer save_type)
240{
241 IVariable* var = variable();
242 ItemGroup group = var->itemGroup();
243 IParallelMng* pm = group.mesh()->parallelMng();
244 ItemGroup enumerate_group = group.own();
245 Integer nb_item = enumerate_group.size();
246 ITraceMng* tm = pm->traceMng();
247
248 // Pour l'instant la méthode parallèle créé un tampon
249 // du nombre total d'éléments du tableau
250 ///TODO a optimiser
251 Int64UniqueArray unique_ids(nb_item);
252 {
253 Integer index = 0;
254 ENUMERATE_ITEM(iitem,enumerate_group){
255 unique_ids[index] = (*iitem).uniqueId();
256 ++index;
257 }
258 }
259
260 if (save_type & SAVE_IDS){
261 Hdf5Utils::StandardArrayT<Int64> ids_writer(hfile.id(),hdf_path+"_Ids");
262 ids_writer.parallelWrite(pm,st,unique_ids,unique_ids);
263 }
264
265 // Pour l'instant, on ne peut sauver que des tableaux 2D dont le nombre
266 // d'éléments dans la 2ème dimension est identique. Cela pose problème
267 // si toutes les entités n'ont pas le même nombre de noeuds. Pour
268 // éviter ce problème, on calcule le nombre max de noeud possible et on
269 // utilise cette valeur. Pour les entités qui ont moins de noeuds, on
270 // ajoute comme coordonnées des NaN. Cela n'est pas optimum notamment
271 // si une seule entité a beaucoup plus de noeuds que les autres mais
272 // cela fonctionne dans tous les cas.
273 if (save_type & SAVE_COORDS){
274 IMesh* mesh = enumerate_group.mesh();
275 VariableNodeReal3& nodes_coords(mesh->toPrimaryMesh()->nodesCoordinates());
276 eItemKind item_kind = enumerate_group.itemKind();
277 if (item_kind==IK_Edge || item_kind==IK_Face || item_kind==IK_Cell){
278 Integer index = 0;
279 Real3UniqueArray coords;
280 Real3UniqueArray centers;
281 Integer max_nb_node = 0;
282 const Real nan_value = std::numeric_limits<Real>::quiet_NaN();
283 const Real3 real3_nan = Real3(nan_value,nan_value,nan_value);
284 {
285 ENUMERATE_ITEMWITHNODES(iitem,enumerate_group){
286 ItemWithNodes item = (*iitem).toItemWithNodes();
287 Integer nb_node = item.nbNode();
288 if (nb_node>max_nb_node)
289 max_nb_node = nb_node;
290 }
291 max_nb_node = pm->reduce(Parallel::ReduceMax,max_nb_node);
292 }
293 Int32UniqueArray items_type(nb_item);
294 ENUMERATE_ITEMWITHNODES(iitem,enumerate_group){
295 ItemWithNodes item = (*iitem).toItemWithNodes();
296 Integer nb_node = item.nbNode();
297 Real3 item_center;
298 for( NodeLocalId inode : item.nodeIds() ){
299 coords.add(nodes_coords[inode]);
300 item_center += nodes_coords[inode];
301 }
302 item_center /= nb_node;
303 // Ajoute des NaN pour les coordonnées restantes
304 for( Integer k=nb_node; k<max_nb_node; ++k )
305 coords.add(real3_nan);
306 centers.add(item_center);
307 items_type[index] = item.typeInfo()->typeId();
308 ++index;
309 }
310 Hdf5Utils::StandardArrayT<Real3> coords_writer(hfile.id(),hdf_path+"_Coords");
311 coords_writer.parallelWrite(pm,st,coords,unique_ids);
312 Hdf5Utils::StandardArrayT<Real3> centers_writer(hfile.id(),hdf_path+"_Center");
313 centers_writer.parallelWrite(pm,st,centers,unique_ids);
314 Hdf5Utils::StandardArrayT<Int32> types_writer(hfile.id(),hdf_path+"_Types");
315 types_writer.parallelWrite(pm,st,items_type,unique_ids);
316 }
317 else if (item_kind==IK_Node){
318 Real3UniqueArray coords;
319 ENUMERATE_NODE(iitem,enumerate_group){
320 coords.add(nodes_coords[iitem]);
321 }
322 Hdf5Utils::StandardArrayT<Real3> coords_writer(hfile.id(),hdf_path+"_Center");
323 coords_writer.parallelWrite(pm,st,coords,unique_ids);
324 }
325 else
326 tm->pwarning() << "Can not save coordinates for family name="
327 << enumerate_group.itemFamily()->name();
328 }
329
330}
331
332/*---------------------------------------------------------------------------*/
333/*---------------------------------------------------------------------------*/
334
335void Hdf5VariableInfoBase::
336readGroupInfo(Hdf5Utils::HFile& hfile,Hdf5Utils::StandardTypes& st,
337 const String& hdf_path,Int64Array& uids,Real3Array& centers)
338{
339 IVariable* var = variable();
340 ItemGroup group = var->itemGroup();
341 IParallelMng* pm = group.mesh()->parallelMng();
342 ItemGroup enumerate_group = group;
343 ITraceMng* tm = pm->traceMng();
344 bool is_master = pm->isMasterIO();
345
346 // Lit les unique ids sauvegardés
347 Int64UniqueArray dummy_uids;
348 Int64UniqueArray saved_unique_ids;
349 Hdf5Utils::StandardArrayT<Int64> ids_reader(hfile.id(),hdf_path+"_Ids");
350 Integer nb_old_item = 0;
351 if (is_master){
352 ids_reader.readDim();
353 nb_old_item = arcaneCheckArraySize(ids_reader.dimensions()[0]);
354 tm->info() << "NB_OLD_ITEM nb=" << nb_old_item;
355 saved_unique_ids.resize(nb_old_item);
356 dummy_uids.resize(nb_old_item);
357 }
358 ids_reader.parallelRead(pm,st,saved_unique_ids,dummy_uids);
359
360 Real3UniqueArray saved_centers(nb_old_item);
361 Hdf5Utils::StandardArrayT<Real3> centers_reader(hfile.id(),hdf_path+"_Center");
362 if (is_master)
363 centers_reader.readDim();
364 centers_reader.parallelRead(pm,st,saved_centers,dummy_uids);
365 tm->info() << "READ SAVED CENTERS nb=" << saved_centers.size();
366
367 uids.copy(saved_unique_ids);
368 centers.copy(saved_centers);
369}
370
371/*---------------------------------------------------------------------------*/
372/*---------------------------------------------------------------------------*/
373
374/*---------------------------------------------------------------------------*/
375/*---------------------------------------------------------------------------*/
376
377template<typename VariableType,typename DataType>
381, m_variable(v)
382{
383 ARCANE_UNUSED(mesh);
384}
385
386/*---------------------------------------------------------------------------*/
387/*---------------------------------------------------------------------------*/
388
389template<typename VariableType,typename DataType> void
391readVariable(Hdf5Utils::HFile& hfile,const String& filename,
392 Hdf5Utils::StandardTypes& st,const String& ids_hpath,IData* var_data)
393{
394 ARCANE_UNUSED(ids_hpath);
395
396 if (!var_data)
397 var_data = variable()->data();
398 if (!var_data)
399 throw ArgumentException(A_FUNCINFO,"Null var_data");
401 IArrayDataT<DataType>* data_array = dynamic_cast<IArrayDataT<DataType>*>(var_data);
402 if (!data_array){
403 const char* n = typeid(var_data).name();
404 throw FatalErrorException(A_FUNCINFO,String::format("Bad type for IData '{0}'",n));
405 }
406 ArrayView<DataType> var_value = data_array->view();
407 IVariable* var = m_variable.variable();
408 IVariableMng* vm = var->variableMng();
409 ITraceMng* tm = vm->traceMng();
410 IParallelMng* pm = vm->parallelMng();
411 bool is_master = pm->isMasterIO();
412 //Integer master_rank = pm->masterIORank();
413 if (is_master){
414 if (hfile.id()<0)
415 hfile.openRead(filename);
416 }
417
418 Int64UniqueArray unique_ids;
419 _readStandardArray(buffer,unique_ids,ids_hpath,hfile.id(),st);
420
421 Integer buf_size = buffer.size();
422 //ArrayView<DataType> var_value = m_variable.asArray();
423 Integer nb_var_value = var_value.size();
424 if (var->isPartial()){
425 // Dans le cas d'une variables partielle, il faut d'abord
426 // mettre dans une table de hashage la valeur pour chaque uid,
427 // puis parcourir le groupe de la variable et remplir
428 // la valeur pour chaque uid.
429 HashTableMapT<Int64,DataType> values_from_uid(buf_size,true);
430 for( Integer z=0; z<buf_size; ++z ){
431 values_from_uid.add(unique_ids[z],buffer[z]);
432 }
433 ItemGroup var_group = m_variable.itemGroup();
434 ENUMERATE_ITEM(iitem,var_group){
435 Item item = *iitem;
436 Int64 uid = item.uniqueId();
437 if (m_correspondance_functor){
438 uid = m_correspondance_functor->getOldUniqueId(uid,iitem.index());
439 }
440 typename HashTableMapT<Int64,DataType>::Data* data = values_from_uid.lookup(uid);
441 if (!data)
442 throw FatalErrorException(A_FUNCINFO,
443 String::format("Can not find item uid='{0}' reading variable '{1}'",
444 uid,var->fullName()));
445 DataType value = data->value();
446 var_value[iitem.index()] = value;
447 }
448 }
449 else{
450 Int32UniqueArray local_ids(buf_size);
451 var->itemFamily()->itemsUniqueIdToLocalId(local_ids,unique_ids,false);
452 for( Integer z=0; z<buf_size; ++z ){
453 Integer lid = local_ids[z];
454 if (lid==NULL_ITEM_LOCAL_ID)
455 continue;
456 if (lid>nb_var_value)
457 throw FatalErrorException(A_FUNCINFO,String::format("Bad item index '{0}' max={1}",lid,nb_var_value));
458 var_value[lid] = buffer[z];
459 }
460 }
461 tm->info(4) << "End of read for variable '" << var->fullName() << "'";
462}
463
464/*---------------------------------------------------------------------------*/
465/*---------------------------------------------------------------------------*/
466
467template<typename VariableType,typename DataType> void
470 const String& ids_hpath,hid_t file_id,
472{
473 ARCANE_UNUSED(ids_hpath);
474
475 IVariable* var = m_variable.variable();
476 IVariableMng* vm = var->variableMng();
477 ITraceMng* tm = vm->traceMng();
478 IParallelMng* pm = vm->parallelMng();
479 bool is_master = pm->isMasterIO();
480
481 Hdf5Utils::StandardArrayT<DataType> values(file_id,path());
482
483 if (is_master){
484 if (!ids_hpath.null())
485 values.setIdsPath(ids_hpath);
486 values.readDim();
487 Int64ConstArrayView dims(values.dimensions());
488 Integer nb_dim = dims.size();
489 if (nb_dim!=1)
490 tm->fatal() << "Only one-dimension array are allowed "
491 << " dim=" << nb_dim << " var_name=" << var->fullName() << " path=" << path();
492 Integer nb_item = arcaneCheckArraySize(dims[0]);
493 tm->info(4) << "NB_ITEM: nb_item=" << nb_item;
494 buffer.resize(nb_item);
495 unique_ids.resize(nb_item);
496 }
497 values.parallelRead(pm,st,buffer,unique_ids);
498#if 0
499 {
500 Integer index=0;
501 Integer nb_item = buffer.size();
502 for( Integer i=0; i<nb_item; ++i ){
503 ++index;
504 tm->info() << " VAR_VAL i=" << i << " value=" << buffer[i] << " uid=" << unique_ids[i];
505 if (index>20)
506 break;
507 }
508 }
509#endif
510}
511
512/*---------------------------------------------------------------------------*/
513/*---------------------------------------------------------------------------*/
514
515template<typename VariableType,typename DataType> void
518{
519 Hdf5Utils::StandardArrayT<DataType> values(file_id,path());
520 //ITraceMng* tm = m_mesh->traceMng();
521 //tm->info() << "WRITE STANDARD ARRAY N=" << buffer.size();
522 values.write(st,buffer);
523}
524
525/*---------------------------------------------------------------------------*/
526/*---------------------------------------------------------------------------*/
527
528template<typename VariableType,typename DataType> void
531{
532 IVariable* var = m_variable.variable();
533 IVariableMng* vm = var->variableMng();
534 IParallelMng* pm = vm->parallelMng();
535 ITraceMng* tm = vm->traceMng();
536
537 ItemGroup group = m_variable.itemGroup();
538 ItemGroup enumerate_group = group.own();
539 if (var->isPartial())
540 enumerate_group = group;
541
542 Integer nb_item = enumerate_group.size();
543
544 UniqueArray<DataType> values(nb_item);
545 Int64UniqueArray unique_ids(nb_item);
546 tm->info(4) << "WRITE VARIABLE name=" << m_variable.name()
547 << " is_partial=" << m_variable.variable()->isPartial();
548
549 {
550 Integer index = 0;
551 ENUMERATE_ITEM(iitem,enumerate_group){
552 if (iitem->isOwn()){
553 values[index] = m_variable[iitem];
554 unique_ids[index] = iitem->uniqueId();
555 //tm->info() << "WRITE uid=" << iitem->uniqueId()
556 // << " value=" << m_variable[iitem];
557 ++index;
558 }
559 }
560 values.resize(index);
561 unique_ids.resize(index);
562 }
563 // Pour l'instant la méthode parallèle créé un tampon
564 // du nombre total d'éléments du tableau
565 ///TODO a optimiser
566 {
567 Hdf5Utils::StandardArrayT<DataType> values_writer(hfile.id(),path());
568 values_writer.parallelWrite(pm,st,values,unique_ids);
569 }
570}
571
572/*---------------------------------------------------------------------------*/
573/*---------------------------------------------------------------------------*/
574
575/*---------------------------------------------------------------------------*/
576/*---------------------------------------------------------------------------*/
577
578template<typename VariableType,typename DataType>
582, m_variable(v)
583{
584}
585
586/*---------------------------------------------------------------------------*/
587/*---------------------------------------------------------------------------*/
588
589template<typename VariableType,typename DataType> void
590Hdf5ScalarVariableInfo<VariableType,DataType>::
591readVariable(Hdf5Utils::HFile& hfile,const String& filename,
592 Hdf5Utils::StandardTypes& st,const String& ids_hpath,IData* data)
593{
594 ARCANE_UNUSED(ids_hpath);
595
596 UniqueArray<DataType> buffer;
597 IVariable* var = m_variable.variable();
598 IVariableMng* vm = var->variableMng();
599 ITraceMng* tm = vm->traceMng();
600 IParallelMng* pm = vm->parallelMng();
601 bool is_master = pm->isMasterIO();
602 //Integer master_rank = pm->masterIORank();
603 if (is_master){
604 if (hfile.id()<0)
605 hfile.openRead(filename);
606 }
607
608 Int64UniqueArray unique_ids;
609 _readStandardArray(buffer,hfile.id(),st);
610
611 Integer buf_size = buffer.size();
612 if (!data)
613 data = m_variable.variable()->data();
614 IArrayDataT<DataType>* true_data = dynamic_cast<IArrayDataT<DataType>*>(data);
615 if (!true_data)
616 throw FatalErrorException("Can not convert IData to IArrayDataT");
617 ArrayView<DataType> var_value = m_variable.asArray();
618 for( Integer z=0; z<buf_size; ++z )
619 var_value[z] = buffer[z];
620 tm->info(4) << "End of read for variable '" << var->fullName() << "'";
621}
622
623/*---------------------------------------------------------------------------*/
624/*---------------------------------------------------------------------------*/
625
626template<typename VariableType,typename DataType> void
629{
630 IVariable* var = m_variable.variable();
631 IVariableMng* vm = var->variableMng();
632 ITraceMng* tm = vm->traceMng();
633 IParallelMng* pm = vm->parallelMng();
634 bool is_master = pm->isMasterIO();
635
636 Hdf5Utils::StandardArrayT<DataType> values(file_id,path());
637
638 if (is_master){
639 values.readDim();
640 Int64ConstArrayView dims(values.dimensions());
641 Integer nb_dim = dims.size();
642 if (nb_dim!=1)
643 tm->fatal() << "Only one-dimension array are allowed "
644 << " dim=" << nb_dim << " var_name=" << var->fullName() << " path=" << path();
645 Integer nb_item = arcaneCheckArraySize(dims[0]);
646 tm->info(4) << "NB_ITEM: nb_item=" << nb_item;
647 buffer.resize(nb_item);
648 }
649 values.read(st,buffer);
650#if 0
651 {
652 Integer index=0;
653 Integer nb_item = buffer.size();
654 for( Integer i=0; i<nb_item; ++i ){
655 ++index;
656 tm->info() << " VAR_VAL i=" << i << " value=" << buffer[i];
657 if (index>20)
658 break;
659 }
660 }
661#endif
662}
663
664/*---------------------------------------------------------------------------*/
665/*---------------------------------------------------------------------------*/
666
667template<typename VariableType,typename DataType> void
670{
671 Hdf5Utils::StandardArrayT<DataType> values(file_id,path());
672 values.write(st,buffer);
673}
674
675/*---------------------------------------------------------------------------*/
676/*---------------------------------------------------------------------------*/
677
678template<typename VariableType,typename DataType> void
681{
682 IVariable* var = m_variable.variable();
683 IVariableMng* vm = var->variableMng();
684 IParallelMng* pm = vm->parallelMng();
685 ITraceMng* tm = vm->traceMng();
686 bool is_master = pm->isMasterIO();
687
688 ConstArrayView<DataType> var_values = m_variable.asArray();
689 Integer size = var_values.size();
690 UniqueArray<DataType> values(size);
691 for( Integer i=0; i<size; ++i )
692 values[i] = var_values[i];
693
694 // Comme il s'agit d'une variable scalaire, on considère que tous
695 // les processeurs ont la même valeur. Donc seul le processeur
696 // maitre écrit.
697 if (is_master){
698 //{
699 Int64UniqueArray unique_ids;
700 Hdf5Utils::StandardArrayT<DataType> values_writer(hfile.id(),path());
701 tm->info(4) << "WRITE SCALAR VARIABLE name=" << m_variable.variable()->fullName();
702 values_writer.write(st,values);
703 //values_writer.parallelWrite(pm,st,values,unique_ids);
704 }
705}
706
707/*---------------------------------------------------------------------------*/
708/*---------------------------------------------------------------------------*/
709
710} // End namespace Arcane
711
712/*---------------------------------------------------------------------------*/
713/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ENUMERATE_ITEM(name, group)
Enumérateur générique d'un groupe de noeuds.
#define ENUMERATE_NODE(name, group)
Enumérateur générique d'un groupe de noeuds.
Exception lorsqu'un argument est invalide.
Vue modifiable d'un tableau d'un type T.
Classe de base des vecteurs 1D de données.
void resize(Int64 s)
Change le nombre d'éléments du tableau à s.
void copy(Span< const T > rhs)
Copie les valeurs de rhs dans l'instance.
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.
virtual void writeVariable(Hdf5Utils::HFile &hfile, Hdf5Utils::StandardTypes &st)
Encapsule un hid_t pour un fichier.
Definition Hdf5Utils.h:208
Encapsule un dataset simple d'un fichier HDF5 qui représente un tableau.
Definition Hdf5Utils.h:788
Définition des types standards Arcane pour hdf5.
Definition Hdf5Utils.h:560
void writeGroup(Hdf5Utils::HFile &hfile, Hdf5Utils::StandardTypes &st, const String &hdf_path, Integer save_type)
const String & path() const
Chemin dans le fichier Hdf5 contenant la valeur de la variable.
Interface d'une donnée.
Definition IData.h:33
Interface d'une famille d'entités.
Definition IItemFamily.h:84
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 IMesh * mesh() const =0
Maillage associé
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual ITraceMng * traceMng() const =0
Gestionnaire de traces.
virtual bool isMasterIO() const =0
true si l'instance est un gestionnaire maître des entrées/sorties.
virtual char reduce(eReduceType rt, char v)=0
Effectue la réduction de type rt sur le réel v et retourne la valeur.
Interface du gestionnaire de traces.
virtual TraceMessage pwarning()=0
Flot pour un message d'avertissement parallèle.
virtual TraceMessage info()=0
Flot pour un message d'information.
Interface du gestionnaire de variables.
virtual IParallelMng * parallelMng() const =0
Gestionnaire de parallélisme associé
virtual ITraceMng * traceMng()=0
Gestionnaire de messages.
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)
virtual bool isPartial() const =0
Indique si la variable est partielle.
virtual Integer dimension() const =0
Dimension de la variable.
virtual ItemGroup itemGroup() const =0
Groupe du maillage associé.
virtual IItemFamily * itemFamily() const =0
Famille d'entité associée.
virtual IVariableMng * variableMng() const =0
Gestionnaire de variable associé à la variable.
Groupe d'entités de maillage.
Definition ItemGroup.h:49
Integer size() const
Nombre d'éléments du groupe.
Definition ItemGroup.h:88
IItemFamily * itemFamily() const
Famille d'entité à laquelle appartient ce groupe (0 pour le group nul)
Definition ItemGroup.h:123
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
ItemGroup own() const
Groupe équivalent à celui-ci mais contenant uniquement les éléments propres au sous-domaine.
Definition ItemGroup.cc:189
Int16 typeId() const
Numéro du type.
Elément de maillage s'appuyant sur des noeuds (Edge,Face,Cell).
Definition Item.h:724
Int32 nbNode() const
Nombre de noeuds de l'entité
Definition Item.h:776
NodeLocalIdView nodeIds() const
Liste des noeuds de l'entité
Definition Item.h:785
Classe de base d'un élément de maillage.
Definition Item.h:83
const ItemTypeInfo * typeInfo() const
Infos sur le type de l'entité.
Definition Item.h:386
ItemWithNodes toItemWithNodes() const
Converti l'entité en le genre ItemWithNodes.
Definition Item.h:1642
Classe gérant un vecteur de réel de dimension 3.
Definition Real3.h:132
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
MeshVariableScalarRefT< Node, Real3 > VariableNodeReal3
Grandeur au noeud de type coordonnées.
@ ReduceMax
Maximum des valeurs.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Array< Int64 > Int64Array
Tableau dynamique à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:212
Integer arcaneCheckArraySize(unsigned long long size)
Vérifie que size peut être converti dans un 'Integer' pour servir de taille à un tableau....
UniqueArray< Int64 > Int64UniqueArray
Tableau dynamique à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:426
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
UniqueArray< Real3 > Real3UniqueArray
Tableau dynamique à une dimension de vecteurs de rang 3.
Definition UtilsTypes.h:450
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:567
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
Definition UtilsTypes.h:428
eItemKind
Genre d'entité de maillage.
@ IK_Node
Entité de maillage de genre noeud.
@ IK_Cell
Entité de maillage de genre maille.
@ IK_Face
Entité de maillage de genre face.
@ IK_Edge
Entité de maillage de genre arête.
double Real
Type représentant un réel.
@ DT_Real2x2
Donnée de type tenseur 3x3.
Definition DataTypes.h:48
@ DT_Real3x3
Donnée de type tenseur 3x3.
Definition DataTypes.h:49
@ DT_Int32
Donnée de type entier 32 bits.
Definition DataTypes.h:43
@ DT_Real3
Donnée de type vecteur 3.
Definition DataTypes.h:47
@ DT_Int64
Donnée de type entier 64 bits.
Definition DataTypes.h:44
@ DT_Real2
Donnée de type vecteur 2.
Definition DataTypes.h:46
@ DT_Real
Donnée de type réel.
Definition DataTypes.h:41
@ DT_Byte
Donnée de type octet.
Definition DataTypes.h:40
Array< Real3 > Real3Array
Tableau dynamique à une dimension de vecteurs de rang 3.
Definition UtilsTypes.h:236