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"
21#include "arcane/hdf5/Hdf5VariableInfoBase.h"
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"
42template<
typename VariableType,
typename DataType>
49 VariableType& trueVariable() {
return m_variable; }
50 virtual IVariable* variable()
const {
return m_variable.variable(); }
61 VariableType m_variable;
67template<
typename VariableType,
typename DataType>
74 VariableType& trueVariable() {
return m_variable; }
75 virtual IVariable* variable()
const {
return m_variable.variable(); }
87 VariableType m_variable;
98 return Hdf5VariableInfoBase::create(var);
107 _checkValidVariable(var);
210 String::format(
"IData for variable '{0}'",var->
fullName()));
217void Hdf5VariableInfoBase::
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());
239 const String& hdf_path,Integer save_type)
245 Integer nb_item = enumerate_group.
size();
255 unique_ids[index] = (*iitem).uniqueId();
260 if (save_type & SAVE_IDS){
262 ids_writer.parallelWrite(pm,st,unique_ids,unique_ids);
273 if (save_type & SAVE_COORDS){
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);
285 ENUMERATE_ITEMWITHNODES(iitem,enumerate_group){
287 Integer nb_node = item.
nbNode();
288 if (nb_node>max_nb_node)
289 max_nb_node = nb_node;
291 max_nb_node = pm->
reduce(Parallel::ReduceMax,max_nb_node);
294 ENUMERATE_ITEMWITHNODES(iitem,enumerate_group){
296 Integer nb_node = item.
nbNode();
299 coords.
add(nodes_coords[inode]);
300 item_center += nodes_coords[inode];
302 item_center /= nb_node;
304 for( Integer k=nb_node; k<max_nb_node; ++k )
305 coords.
add(real3_nan);
306 centers.
add(item_center);
311 coords_writer.parallelWrite(pm,st,coords,unique_ids);
313 centers_writer.parallelWrite(pm,st,centers,unique_ids);
315 types_writer.parallelWrite(pm,st,items_type,unique_ids);
320 coords.
add(nodes_coords[iitem]);
323 coords_writer.parallelWrite(pm,st,coords,unique_ids);
326 tm->
pwarning() <<
"Can not save coordinates for family name="
335void Hdf5VariableInfoBase::
350 Integer nb_old_item = 0;
352 ids_reader.readDim();
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);
358 ids_reader.parallelRead(pm,st,saved_unique_ids,dummy_uids);
361 Hdf5Utils::StandardArrayT<Real3> centers_reader(hfile.id(),hdf_path+
"_Center");
363 centers_reader.readDim();
364 centers_reader.parallelRead(pm,st,saved_centers,dummy_uids);
365 tm->
info() <<
"READ SAVED CENTERS nb=" << saved_centers.size();
367 uids.
copy(saved_unique_ids);
368 centers.
copy(saved_centers);
377template<
typename VariableType,
typename DataType>
378Hdf5ItemVariableInfo<VariableType,DataType>::
379Hdf5ItemVariableInfo(IMesh* mesh,IVariable* v)
380: Hdf5VariableInfoBase()
389template<
typename VariableType,
typename DataType>
void
390Hdf5ItemVariableInfo<VariableType,DataType>::
391readVariable(Hdf5Utils::HFile& hfile,
const String& filename,
392 Hdf5Utils::StandardTypes& st,
const String& ids_hpath,IData* var_data)
394 ARCANE_UNUSED(ids_hpath);
397 var_data = variable()->data();
399 throw ArgumentException(A_FUNCINFO,
"Null var_data");
400 UniqueArray<DataType> buffer;
401 IArrayDataT<DataType>* data_array =
dynamic_cast<IArrayDataT<DataType>*
>(var_data);
403 const char* n =
typeid(var_data).name();
404 throw FatalErrorException(A_FUNCINFO,String::format(
"Bad type for IData '{0}'",n));
406 ArrayView<DataType> var_value = data_array->view();
407 IVariable* var = m_variable.variable();
409 ITraceMng* tm = vm->traceMng();
410 IParallelMng* pm = vm->parallelMng();
415 hfile.openRead(filename);
419 _readStandardArray(buffer,unique_ids,ids_hpath,hfile.id(),st);
421 Integer buf_size = buffer.size();
423 Integer nb_var_value = var_value.size();
424 if (var->isPartial()){
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]);
433 ItemGroup var_group = m_variable.itemGroup();
436 Int64 uid = item.uniqueId();
437 if (m_correspondance_functor){
438 uid = m_correspondance_functor->getOldUniqueId(uid,iitem.index());
440 typename HashTableMapT<Int64,DataType>::Data* data = values_from_uid.lookup(uid);
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;
451 var->itemFamily()->itemsUniqueIdToLocalId(local_ids,unique_ids,
false);
452 for( Integer z=0; z<buf_size; ++z ){
454 if (lid==NULL_ITEM_LOCAL_ID)
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];
461 tm->info(4) <<
"End of read for variable '" << var->fullName() <<
"'";
467template<
typename VariableType,
typename DataType>
void
468Hdf5ItemVariableInfo<VariableType,DataType>::
469_readStandardArray(Array<DataType>& buffer,
Int64Array& unique_ids,
470 const String& ids_hpath,hid_t file_id,
471 Hdf5Utils::StandardTypes& st)
473 ARCANE_UNUSED(ids_hpath);
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();
481 Hdf5Utils::StandardArrayT<DataType> values(file_id,path());
484 if (!ids_hpath.null())
485 values.setIdsPath(ids_hpath);
490 tm->fatal() <<
"Only one-dimension array are allowed "
491 <<
" dim=" << nb_dim <<
" var_name=" << var->fullName() <<
" path=" << path();
493 tm->info(4) <<
"NB_ITEM: nb_item=" << nb_item;
494 buffer.resize(nb_item);
495 unique_ids.resize(nb_item);
497 values.parallelRead(pm,st,buffer,unique_ids);
501 Integer nb_item = buffer.size();
502 for( Integer i=0; i<nb_item; ++i ){
504 tm->info() <<
" VAR_VAL i=" << i <<
" value=" << buffer[i] <<
" uid=" << unique_ids[i];
515template<
typename VariableType,
typename DataType>
void
516Hdf5ItemVariableInfo<VariableType,DataType>::
517_writeStandardArray(Array<DataType>& buffer,hid_t file_id,Hdf5Utils::StandardTypes& st)
519 Hdf5Utils::StandardArrayT<DataType> values(file_id,path());
522 values.write(st,buffer);
528template<
typename VariableType,
typename DataType>
void
537 ItemGroup group = m_variable.itemGroup();
540 enumerate_group = group;
542 Integer nb_item = enumerate_group.
size();
546 tm->
info(4) <<
"WRITE VARIABLE name=" << m_variable.name()
547 <<
" is_partial=" << m_variable.variable()->isPartial();
553 values[index] = m_variable[iitem];
554 unique_ids[index] = iitem->uniqueId();
568 values_writer.parallelWrite(pm,st,values,unique_ids);
578template<
typename VariableType,
typename DataType>
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)
594 ARCANE_UNUSED(ids_hpath);
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();
605 hfile.openRead(filename);
609 _readStandardArray(buffer,hfile.id(),st);
611 Integer buf_size = buffer.size();
613 data = m_variable.variable()->data();
614 IArrayDataT<DataType>* true_data =
dynamic_cast<IArrayDataT<DataType>*
>(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() <<
"'";
626template<
typename VariableType,
typename DataType>
void
627Hdf5ScalarVariableInfo<VariableType,DataType>::
628_readStandardArray(Array<DataType>& buffer,hid_t file_id,Hdf5Utils::StandardTypes& st)
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();
636 Hdf5Utils::StandardArrayT<DataType> values(file_id,path());
643 tm->fatal() <<
"Only one-dimension array are allowed "
644 <<
" dim=" << nb_dim <<
" var_name=" << var->fullName() <<
" path=" << path();
646 tm->info(4) <<
"NB_ITEM: nb_item=" << nb_item;
647 buffer.resize(nb_item);
649 values.read(st,buffer);
653 Integer nb_item = buffer.size();
654 for( Integer i=0; i<nb_item; ++i ){
656 tm->info() <<
" VAR_VAL i=" << i <<
" value=" << buffer[i];
667template<
typename VariableType,
typename DataType>
void
668Hdf5ScalarVariableInfo<VariableType,DataType>::
669_writeStandardArray(Array<DataType>& buffer,hid_t file_id,Hdf5Utils::StandardTypes& st)
671 Hdf5Utils::StandardArrayT<DataType> values(file_id,path());
672 values.write(st,buffer);
678template<
typename VariableType,
typename DataType>
void
679Hdf5ScalarVariableInfo<VariableType,DataType>::
680writeVariable(Hdf5Utils::HFile& hfile,Hdf5Utils::StandardTypes& st)
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();
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];
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);
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
virtual void writeVariable(Hdf5Utils::HFile &hfile, Hdf5Utils::StandardTypes &st)
Encapsule un hid_t pour un fichier.
Encapsule un dataset simple d'un fichier HDF5 qui représente un tableau.
Définition des types standards Arcane pour hdf5.
void writeGroup(Hdf5Utils::HFile &hfile, Hdf5Utils::StandardTypes &st, const String &hdf_path, Integer save_type)
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 IMesh * mesh() const =0
Maillage associé
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.
virtual IParallelMng * parallelMng()=0
Gestionnaire de parallèlisme.
virtual IPrimaryMesh * toPrimaryMesh()=0
Retourne l'instance sous la forme d'un IPrimaryMesh.
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.
virtual VariableNodeReal3 & nodesCoordinates()=0
Coordonnées des noeuds.
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.
Integer size() const
Nombre d'éléments du groupe.
IItemFamily * itemFamily() const
Famille d'entité à laquelle appartient ce groupe (0 pour le group nul)
eItemKind itemKind() const
Genre du groupe. Il s'agit du genre de ses éléments.
IMesh * mesh() const
Maillage auquel appartient ce groupe (0 pour le group nul)
ItemGroup own() const
Groupe équivalent à celui-ci mais contenant uniquement les éléments propres au sous-domaine.
Int16 typeId() const
Numéro du type.
Elément de maillage s'appuyant sur des noeuds (Edge,Face,Cell).
Int32 nbNode() const
Nombre de noeuds de l'entité
NodeLocalIdView nodeIds() const
Liste des noeuds de l'entité
const ItemTypeInfo * typeInfo() const
Infos sur le type de l'entité.
ItemWithNodes toItemWithNodes() const
Converti l'entité en le genre ItemWithNodes.
Classe gérant un vecteur de réel de dimension 3.
Classe de base des vecteurs 1D de données.
void copy(Span< const T > rhs)
Copie les valeurs de rhs dans l'instance.
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.
Exception lorsqu'une erreur fatale est survenue.
Interface du gestionnaire de traces.
virtual TraceMessage info()=0
Flot pour un message d'information.
virtual TraceMessage pwarning()=0
Flot pour un message d'avertissement parallèle.
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Array< Int64 > Int64Array
Tableau dynamique à une dimension d'entiers 64 bits.
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.
UniqueArray< Real3 > Real3UniqueArray
Tableau dynamique à une dimension de vecteurs de rang 3.
UniqueArray< Int32 > Int32UniqueArray
Tableau dynamique à une dimension d'entiers 32 bits.
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.
@ DT_Real2x2
Donnée de type tenseur 3x3.
@ DT_Real3x3
Donnée de type tenseur 3x3.
@ DT_Int32
Donnée de type entier 32 bits.
@ DT_Real3
Donnée de type vecteur 3.
@ DT_Int64
Donnée de type entier 64 bits.
@ DT_Real2
Donnée de type vecteur 2.
@ DT_Real
Donnée de type réel.
@ DT_Byte
Donnée de type octet.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Int32 Integer
Type représentant un entier.