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>
43class Hdf5ItemVariableInfo
44:
public Hdf5VariableInfoBase
49 VariableType& trueVariable() {
return m_variable; }
50 virtual IVariable* variable()
const {
return m_variable.variable(); }
61 VariableType m_variable;
67template<
typename VariableType,
typename DataType>
68class Hdf5ScalarVariableInfo
69:
public Hdf5VariableInfoBase
74 VariableType& trueVariable() {
return m_variable; }
75 virtual IVariable* variable()
const {
return m_variable.variable(); }
87 VariableType m_variable;
96 IItemFamily* family = mesh->findItemFamily(family_name,
true);
98 return Hdf5VariableInfoBase::create(var);
104Hdf5VariableInfoBase* Hdf5VariableInfoBase::
107 _checkValidVariable(var);
108 Hdf5VariableInfoBase* var_info = 0;
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());
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){
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){
288 if (nb_node>max_nb_node)
289 max_nb_node = nb_node;
294 ENUMERATE_ITEMWITHNODES(iitem,enumerate_group){
298 for( NodeLocalId inode : item.
nodeIds() ){
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::
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>
389template<
typename VariableType,
typename DataType>
void
394 ARCANE_UNUSED(ids_hpath);
397 var_data = variable()->data();
403 const char* n =
typeid(var_data).name();
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()){
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());
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
470 const String& ids_hpath,hid_t file_id,
473 ARCANE_UNUSED(ids_hpath);
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
522 values.write(st,buffer);
528template<
typename VariableType,
typename DataType>
void
537 ItemGroup group = m_variable.itemGroup();
540 enumerate_group = group;
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();
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
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
672 values.write(st,buffer);
678template<
typename VariableType,
typename DataType>
void
686 bool is_master = pm->isMasterIO();
689 Integer size = var_values.size();
691 for(
Integer i=0; i<size; ++i )
692 values[i] = var_values[i];
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.
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.
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)
const String & path() const
Chemin dans le fichier Hdf5 contenant la valeur de la variable.
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 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.
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é
Classe de base d'un élément de maillage.
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.
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.
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.
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.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
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.
double Real
Type représentant un réel.
@ 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.
Array< Real3 > Real3Array
Tableau dynamique à une dimension de vecteurs de rang 3.