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);
112 if (
var->isPartial()){
113 switch(
var->dataType()){
144 switch(
var->dataType()){
176 if (
var->dimension()==0){
177 switch(
var->dataType()){
210 String::format(
"IData for variable '{0}'",
var->fullName()));
217void Hdf5VariableInfoBase::
222 if (
var->dimension()==1)
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());
282 const Real
nan_value = std::numeric_limits<Real>::quiet_NaN();
326 tm->
pwarning() <<
"Can not save coordinates for family name="
335void Hdf5VariableInfoBase::
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();
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();
539 if (
var->isPartial())
546 tm->
info(4) <<
"WRITE VARIABLE name=" << m_variable.name()
547 <<
" is_partial=" << m_variable.variable()->isPartial();
553 values[index] = m_variable[
iitem];
560 values.resize(index);
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();
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();
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();
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.
Tableau d'items de types quelconques.
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.
Classe de base pour lire ou écrire une variables.
void writeGroup(Hdf5Utils::HFile &hfile, Hdf5Utils::StandardTypes &st, const String &hdf_path, Integer save_type)
Interface d'une famille d'entités.
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.
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.
Interface du gestionnaire de variables.
Interface d'une variable.
virtual String fullName() const =0
Nom complet de la variable (avec le préfixe de la famille)
virtual Integer dimension() const =0
Dimension de la variable.
virtual IVariableMng * variableMng() const =0
Gestionnaire de variable associé à la variable.
Groupe d'entités de maillage.
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.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Classe gérant un vecteur de réel de dimension 3.
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.
Exception lorsqu'une opération n'est pas supportée.
Chaîne de caractères unicode.
TraceMessage pwarning() const
ITraceMng * traceMng() const
Gestionnaire de trace.
TraceMessage info() const
Flot pour un message d'information.
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.