14#include "arcane/utils/String.h"
15#include "arcane/utils/StringBuilder.h"
16#include "arcane/utils/OStringStream.h"
17#include "arcane/utils/ScopedPtr.h"
18#include "arcane/utils/List.h"
19#include "arcane/utils/ITraceMng.h"
20#include "arcane/utils/CheckedConvert.h"
21#include "arcane/utils/ArrayShape.h"
23#include "arcane/core/ISubDomain.h"
24#include "arcane/core/StdNum.h"
25#include "arcane/core/IVariable.h"
26#include "arcane/core/CheckpointService.h"
27#include "arcane/core/Directory.h"
28#include "arcane/core/IParallelMng.h"
29#include "arcane/core/IParallelReplication.h"
30#include "arcane/core/ArcaneException.h"
31#include "arcane/core/VerifierService.h"
32#include "arcane/core/IVariableMng.h"
33#include "arcane/core/FactoryService.h"
34#include "arcane/core/IData.h"
35#include "arcane/core/Timer.h"
36#include "arcane/core/ISerializedData.h"
37#include "arcane/core/IIOMng.h"
38#include "arcane/core/IXmlDocumentHolder.h"
40#include "arcane/datatype/DataTypeTraits.h"
42#include "arcane/core/SerializeBuffer.h"
43#include "arcane/core/ISerializeMessageList.h"
44#include "arcane/core/internal/SerializeMessage.h"
46#include "arcane/hdf5/Hdf5ReaderWriter.h"
48#include "arcane/hdf5/Hdf5ReaderWriter_axl.h"
64static herr_t _Hdf5ReaderWriterIterateMe(hid_t,
const char*,
void*);
71constexpr Int32 VARIABLE_INFO_SIZE = 10 + ArrayShape::MAX_NB_DIMENSION;
73#if (defined(H5_HAVE_THREADSAFE) || defined(H5_HAVE_CONCURRENCY))
74#define ARCANE_HDF5_MUTEX
80 _ArcaneHdf5UtilsMutex().lock();
84 _ArcaneHdf5UtilsMutex().unlock();
87#define ARCANE_HDF5_MUTEX ScopedMutex scoped_mutex
96 const String& sub_group_name,
98 eOpenMode open_mode,[[maybe_unused]]
bool do_verif)
100, m_parallel_mng(sd->parallelMng())
101, m_open_mode(open_mode)
102, m_filename(filename)
103, m_sub_group_name(sub_group_name)
104, m_is_initialized(false)
105, m_io_timer(sd,
"Hdf5Timer",
Timer::TimerReal)
106, m_is_parallel(false)
107, m_my_rank(m_parallel_mng->commRank())
108, m_send_rank(m_my_rank)
109, m_last_recv_rank(m_my_rank)
110, m_fileset_size(fileset_size)
111, m_index_write(currentIndex)
112, m_index_modulo(index_modulo)
115 if (m_fileset_size!=1 && m_parallel_mng->isParallel()){
116 m_is_parallel = true;
117 Integer nb_rank = m_parallel_mng->commSize();
118 if (m_fileset_size==0){
120 m_last_recv_rank = nb_rank;
123 m_send_rank = (m_my_rank / m_fileset_size) * m_fileset_size;
124 m_last_recv_rank = m_send_rank + m_fileset_size;
125 if (m_last_recv_rank>nb_rank)
126 m_last_recv_rank = nb_rank;
130 sd->
traceMng()->info() <<
" INFOS PARALLEL: my_rank=" << m_my_rank
131 <<
" send_rank=" << m_send_rank
132 <<
" last_recv_rank=" << m_last_recv_rank
133 <<
" filename=" << filename;
139void Hdf5ReaderWriter::
142 if (m_is_initialized)
144 m_is_initialized =
true;
147 HInit::useMutex(m_parallel_mng->isThreadImplementation(), m_parallel_mng);
149 info() <<
"INIT HDF5 READER/WRITER";
155 ::H5get_libversion(&vmajor,&vminor,&vrel);
156 info() <<
"HDF5 version = " << vmajor <<
'.' << vminor <<
'.' << vrel;
158 info() <<
"SubGroup is '" << m_sub_group_name <<
"'";
159 if (m_open_mode==OpenModeRead){
160 m_file_id.openRead(m_filename);
161 m_sub_group_id.recursiveOpen(m_file_id,m_sub_group_name);
165 if (m_send_rank!=m_my_rank)
167 if (m_open_mode == OpenModeTruncate) {
171 plist_id = H5Pcreate(H5P_FILE_ACCESS);
172#ifdef ARCANE_TEST_HDF5MPI
173 void* arcane_comm = subDomain()->parallelMng()->getMPICommunicator();
176 MPI_Comm mpi_comm = *((MPI_Comm*)arcane_comm);
177 MPI_Info mpi_info = MPI_INFO_NULL;
179 H5Pset_fapl_mpio(plist_id, mpi_comm, MPI_INFO_NULL);
180 H5Pset_fclose_degree(plist_id, H5F_CLOSE_STRONG);
186 herr_t r = H5Pget_cache(plist_id, &mdc_nelmts, &rdcc_nelmts, &rdcc_nbytes, &rdcc_w0);
187 info() <<
" CACHE SIZE r=" << r <<
" mdc=" << mdc_nelmts
188 <<
" rdcc=" << rdcc_nelmts <<
" rdcc_bytes=" << rdcc_nbytes <<
" w0=" << rdcc_w0;
191 rdcc_nbytes = 10000000;
192 r = H5Pset_cache(plist_id, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0);
193 info() <<
" SET CACHE SIZE R1=" << r;
196 hsize_t sieve_buf = (1024 << 12);
197 r = H5Pset_sieve_buf_size(plist_id, sieve_buf);
198 info() <<
" SIEVE_BUF=" << sieve_buf <<
" r=" << r;
199 hsize_t small_block_size = 0;
200 r = H5Pget_small_data_block_size(plist_id, &small_block_size);
201 info() <<
" SMALL BLOCK SIZE=" << small_block_size;
202 small_block_size <<= 10;
203 r = H5Pset_small_data_block_size(plist_id, small_block_size);
204 info() <<
" SET SMALL BLOCK SIZE s=" << small_block_size <<
" r=" << r;
207 m_file_id.openTruncate(m_filename,plist_id);
209 else if (m_open_mode==OpenModeAppend){
210 m_file_id.openAppend(m_filename);
212 if (m_sub_group_name!=
"/"){
213 m_sub_group_id.checkDelete(m_file_id,m_sub_group_name);
214 m_sub_group_id.recursiveCreate(m_file_id,m_sub_group_name);
217 m_sub_group_id.open(m_file_id,m_sub_group_name);
219 if (m_file_id.isBad())
220 ARCANE_THROW(ReaderWriterException,
"Unable to open file '{0}'",m_filename);
222 if (m_sub_group_id.isBad())
223 ARCANE_THROW(ReaderWriterException,
"HDF5 group '{0}' not found",m_sub_group_name);
225 if (m_open_mode==OpenModeRead){
229 H5Giterate(m_file_id.id(),m_sub_group_name.localstr(),&index,_Hdf5ReaderWriterIterateMe,
this);
245void Hdf5ReaderWriter::
248 if (m_is_initialized)
250 fatal() <<
"Use of a Hdf5ReaderWriter instance not initialized";
256String Hdf5ReaderWriter::
257_variableGroupName(IVariable* var)
259 return var->fullName();
269void Hdf5ReaderWriter::
273 sb.
setMode(ISerializer::ModeReserve);
292void Hdf5ReaderWriter::
296 info(4) <<
"DIRECT READ VAL v=" << v->
name();
303void Hdf5ReaderWriter::
304_directWriteVal(IVariable* v,IData* data)
307 Ref<ISerializedData> sdata(data->createSerializedDataRef(
false));
308 if (m_is_parallel && m_send_rank!=m_my_rank){
309 _writeValParallel(v,sdata.get());
312 _writeVal(v->fullName(),m_sub_group_name,sdata.get());
320_Hdf5ReaderWriterIterateMe(hid_t g,
const char* mn,
void* ptr)
322 Hdf5ReaderWriter* rw =
reinterpret_cast<Hdf5ReaderWriter*
>(ptr);
323 return rw->iterateMe(g,mn);
329herr_t Hdf5ReaderWriter::
330iterateMe(hid_t group_id,
const char* member_name)
332 ARCANE_UNUSED(group_id);
333 m_variables_name.add(StringView(member_name));
340void Hdf5ReaderWriter::
341_writeVal(
const String& var_group_name,
342 const String& sub_group_name,
343 const ISerializedData* sdata,
344 const Int32 from_rank)
346 const bool hits_modulo=(m_index_modulo!=0) && (m_index_write!=0) && ((m_index_write%m_index_modulo)==0);
347 Timer::Sentry ts(&m_io_timer);
349 info(4) <<
" SDATA name=" << var_group_name <<
" nb_element=" << sdata->nbElement()
350 <<
" dim=" << sdata->nbDimension() <<
" datatype=" << sdata->baseDataType()
351 <<
" nb_basic_element=" << sdata->nbBaseElement()
352 <<
" is_multi=" << sdata->isMultiSize()
353 <<
" dimensions_size=" << sdata->extents().size()
354 <<
" memory_size=" << sdata->memorySize()
355 <<
" bytes_size=" << sdata->constBytes().size()
356 <<
" shape=" << sdata->shape().dimensions();
358 Integer nb_dimension = sdata->nbDimension();
361 hid_t save_typeid = m_types.saveType(sdata->baseDataType());
362 hid_t trueid = m_types.nativeType(sdata->baseDataType());
363 const void* ptr = sdata->constBytes().
data();
364 Int64 nb_base_element = sdata->nbBaseElement();
366 HGroup var_base_group;
367 var_base_group.recursiveCreate(m_file_id,sub_group_name);
371 group_id.recursiveCreate(var_base_group,var_group_name);
372 if (group_id.isBad())
373 ARCANE_THROW(ReaderWriterException,
"HDF5 group '{0}' not found",var_group_name);
375 Int64 nb_element = sdata->nbElement();
376 bool is_multi_size = sdata->isMultiSize();
379 if (nb_dimension==2 && !is_multi_size){
380 dim1_size = dimensions[0];
381 dim2_size = dimensions[1];
383 Integer dimension_array_size = dimensions.size();
388 att_dims[0] = VARIABLE_INFO_SIZE;
390 space_id.createSimple(1,att_dims);
391 std::array<Int64,VARIABLE_INFO_SIZE> dim_val_buf;
392 SmallSpan<Int64> dim_val(dim_val_buf);
395 dim_val[0] = nb_dimension;
396 dim_val[1] = dim1_size;
397 dim_val[2] = dim2_size;
398 dim_val[3] = nb_element;
399 dim_val[4] = nb_base_element;
400 dim_val[5] = dimension_array_size;
401 dim_val[6] = is_multi_size ? 1 : 0;
402 dim_val[7] = sdata->baseDataType();
403 dim_val[8] = sdata->memorySize();
405 ArrayShape shape = sdata->shape();
406 Int32 shape_nb_dim = shape.nbDimension();
407 auto shape_dims = shape.dimensions();
408 dim_val[9] = shape_nb_dim;
409 for (Integer i=0; i<shape_nb_dim; ++i )
410 dim_val[10+i] = shape_dims[i];
413 if (m_is_parallel && hits_modulo && (from_rank!=0))
414 att_id.remove(group_id,
"Dims");
415 att_id.create(group_id,
"Dims",m_types.saveType(dim1_size),space_id);
416 herr_t herr = att_id.write(m_types.nativeType(dim2_size),dim_val.data());
418 ARCANE_THROW(ReaderWriterException,
"Wrong dimensions written for variable '{0}'",var_group_name);
423 if (dimension_array_size!=0){
425 att_dims[0] = dimension_array_size;
428 space_id.createSimple(1,att_dims);
429 array_id.recursiveCreate(group_id,
"Dim2",m_types.saveType(dim1_size),space_id,H5P_DEFAULT);
430 herr_t herr = array_id.write(m_types.nativeType(dim1_size),dimensions.data());
432 ARCANE_THROW(ReaderWriterException,
"Wrong dimensions written for variable '{0}'",var_group_name);
436 if (nb_base_element!=0 && ptr!=
nullptr){
437 debug(Trace::High) <<
"Variable " << var_group_name <<
" begin dumped (nb_base_element=" << nb_base_element <<
").";
439 dims[0] = nb_base_element;
441 space_id.createSimple(1,dims);
442 if (space_id.isBad())
443 ARCANE_THROW(ReaderWriterException,
"Wrong dataspace for variable '{0}'",var_group_name);
446 hid_t plist_id = H5P_DEFAULT;
449 if (nb_element>=10000){
451 plist_id = H5Pcreate(H5P_DATASET_CREATE);
452 hsize_t chunk_dim[1];
453 chunk_dim[0] = (4096 << 1);
454 herr_t r = H5Pset_chunk(plist_id,1,chunk_dim);
455 info() <<
" SET CHUNK FOR " << var_group_name <<
" s=" << nb_element;
458 dataset_id.recursiveCreate(group_id,
"Values",save_typeid,space_id,plist_id);
459 if (dataset_id.isBad())
460 ARCANE_THROW(ReaderWriterException,
"Wrong dataset for variable '{0}'",var_group_name);
462 herr_t herr = dataset_id.write(trueid,ptr);
464 ARCANE_THROW(ReaderWriterException,
"Wrong dataset written for variable '{0}'",var_group_name);
471Ref<ISerializedData> Hdf5ReaderWriter::
472_readDim2(IVariable* var)
474 const int max_dim = 256;
475 String vname = _variableGroupName(var);
476 info(4) <<
" READ DIM name=" << vname;
477 Int64 dimension_array_size = 0;
478 Int64 nb_element = 0;
484 bool is_found =
false;
485 for( StringList::Enumerator i(m_variables_name); ++i; )
491 ARCANE_THROW(ReaderWriterException,
"No HDF5 group named '{0} exists",vname);
497 group_id.open(m_sub_group_id,vname);
498 if (group_id.isBad())
499 ARCANE_THROW(ReaderWriterException,
"HDF5 group '{0}' not found",vname);
501 bool is_multi_size =
false;
503 Int64 memory_size = 0;
504 Int64 nb_base_element = 0;
507 UniqueArray<Int64> dims;
508 ArrayShape data_shape;
513 att_id.open(group_id,
"Dims");
514 HSpace space_id = att_id.getSpace();
518 hsize_t hdf_dims[max_dim];
519 hsize_t max_dims[max_dim];
522 H5Sget_simple_extent_dims(space_id.id(), hdf_dims, max_dims);
525 if (hdf_dims[0]!=VARIABLE_INFO_SIZE)
526 ARCANE_THROW(ReaderWriterException,
"Wrong dimensions for variable '{0}' (found={1} expected={2})",
527 vname, hdf_dims[0], VARIABLE_INFO_SIZE);
529 std::array<Int64,VARIABLE_INFO_SIZE> dim_val_buf;
530 att_id.read(m_types.nativeType(Int64()),dim_val_buf.data());
532 SmallSpan<const Int64> dim_val(dim_val_buf);
534 nb_dimension = CheckedConvert::toInteger(dim_val[0]);
535 dim1_size = dim_val[1];
536 dim2_size = dim_val[2];
537 nb_element = dim_val[3];
538 nb_base_element = dim_val[4];
539 dimension_array_size = dim_val[5];
540 is_multi_size = dim_val[6]!=0;
542 memory_size = dim_val[8];
543 Int32 shape_nb_dim = CheckedConvert::toInt32(dim_val[9]);
544 data_shape.setNbDimension(shape_nb_dim);
545 for (Integer i=0; i<shape_nb_dim; ++i )
546 data_shape.setDimension(i,CheckedConvert::toInt32(dim_val[10+i]));
549 info(4) <<
" READ DIM name=" << vname
550 <<
" nb_dim=" << nb_dimension <<
" dim1_size=" << dim1_size
551 <<
" dim2_size=" << dim2_size <<
" nb_element=" << nb_element
552 <<
" dimension_size=" << dimension_array_size
553 <<
" is_multi_size=" << is_multi_size
554 <<
" data_type" << data_type
555 <<
" shape=" << data_shape.dimensions();
557 if (dimension_array_size>0){
559 array_id.open(group_id,
"Dim2");
560 if (array_id.isBad())
561 ARCANE_THROW(ReaderWriterException,
"Wrong dataset for variable '{0}'",vname);
563 HSpace space_id = array_id.getSpace();
564 if (space_id.isBad())
565 ARCANE_THROW(ReaderWriterException,
"Wrong dataspace for variable '{0}'",vname);
567 hsize_t hdf_dims[max_dim];
568 hsize_t max_dims[max_dim];
571 H5Sget_simple_extent_dims(space_id.id(), hdf_dims, max_dims);
575 if ((Int64)hdf_dims[0]!=dimension_array_size){
576 ARCANE_THROW(ReaderWriterException,
"Wrong number of elements in 'Dim2' for variable '{0}' (found={1} expected={2})",
577 vname, hdf_dims[0], dimension_array_size);
581 dims.resize(dimension_array_size);
582 herr_t herr = array_id.read(m_types.nativeType(Int64()),dims.data());
584 ARCANE_THROW(ReaderWriterException,
"Wrong dataset read for variable '{0}'",vname);
587 nb_base_element,is_multi_size,dims,data_shape);
597void Hdf5ReaderWriter::
600 _directWriteVal(v,data);
606void Hdf5ReaderWriter::
609 String var_group_name = _variableGroupName(v);
610 info(4) <<
" TRY TO READ var_group=" << var_group_name;
612 Int64 storage_size = sd->memorySize();
613 info(4) <<
" READ DATA n=" << storage_size;
615 if (storage_size!=0){
619 group_id.open(m_sub_group_id,var_group_name);
620 if (group_id.isBad())
623 dataset_id.open(group_id,
"Values");
624 if (dataset_id.isBad())
626 void* ptr = sd->writableBytes().data();
627 info() <<
"READ Variable " << var_group_name <<
" ptr=" << ptr;;
628 hid_t trueid = m_types.nativeType(sd->baseDataType());
629 dataset_id.read(trueid,ptr);
638void Hdf5ReaderWriter::
641 _directReadVal(var,data);
647void Hdf5ReaderWriter::
648setMetaData(
const String& meta_data)
653 if (m_send_rank!=m_my_rank){
656 sb.
setMode(ISerializer::ModeReserve);
667 for(
Integer i=m_send_rank+1; i<=m_last_recv_rank; ++i ){
669 pm->recvSerializer(&sb,i);
673 sb.
get(remote_group_name);
674 sb.
get(remote_meta_data);
675 _setMetaData(remote_meta_data,remote_group_name);
686void Hdf5ReaderWriter::
687_setMetaData(
const String& meta_data,
const String& sub_group_name)
689 const bool hits_modulo=(m_index_modulo!=0) && (m_index_write!=0) && ((m_index_write%m_index_modulo)==0);
692 base_group.recursiveOpen(m_file_id,sub_group_name);
694 base_group.recursiveCreate(m_file_id,sub_group_name);
697 const Byte* _meta_data = meta_data_bytes.
data();
699 dims[0] = meta_data_bytes.
size();
702 space_id.createSimple(1,dims);
703 if (space_id.isBad())
708 dataset_id.recursiveCreate(base_group,
"MetaData", m_types.nativeType(
Byte()), space_id, H5P_DEFAULT);
710 dataset_id.create(base_group,
"MetaData", m_types.nativeType(
Byte()), space_id, H5P_DEFAULT);
711 if (dataset_id.isBad())
714 herr_t herr = dataset_id.write(m_types.nativeType(
Byte()),_meta_data);
727 if (dataset_id.isBad()){
730 HSpace space_id = dataset_id.getSpace();
731 if (space_id.isBad()){
734 const int max_dim = 256;
735 hsize_t hdf_dims[max_dim];
736 hsize_t max_dims[max_dim];
739 H5Sget_simple_extent_dims(space_id.id(), hdf_dims, max_dims);
745 dataset_id.read(m_types.nativeType(
Byte()),uchars.
data());
753void Hdf5ReaderWriter::
757 if (m_my_rank==m_send_rank){
758 _receiveRemoteVariables();
763 sb.setMode(ISerializer::ModeReserve);
764 sb.reserve(DT_Int32,1);
766 sb.setMode(ISerializer::ModePut);
768 m_parallel_mng->sendSerializer(&sb,m_send_rank);
772 info() <<
" Hdf5Timer: nb_activated=" << m_io_timer.nbActivated()
773 <<
" time=" << m_io_timer.totalTime();
780void Hdf5ReaderWriter::
781_receiveRemoteVariables()
783 IParallelMng* pm = m_parallel_mng;
784 Integer nb_remaining = m_last_recv_rank - m_send_rank;
785 info() <<
"NB REMAINING = " << nb_remaining;
786 Ref<ISerializeMessageList> m_messages(pm->createSerializeMessageListRef());
787 while(nb_remaining>0){
788 ScopedPtrT<ISerializeMessage> sm(
new SerializeMessage(m_my_rank,NULL_SUB_DOMAIN_ID,ISerializeMessage::MT_Recv));
789 m_messages->addMessage(sm.get());
790 m_messages->processPendingMessages();
791 m_messages->waitMessages(Parallel::WaitAll);
792 ISerializer* sb = sm->serializer();
793 sb->setMode(ISerializer::ModeGet);
794 Int32
id = sb->getInt32();
798 _writeRemoteVariable(sb);
805void Hdf5ReaderWriter::
806_writeRemoteVariable(ISerializer* sb)
812 Int32 rank = sb->getInt32();
815 sb->setReadMode(ISerializer::ReadReplace);
816 sdata->serialize(sb);
817 _writeVal(var_name,group_name,sdata.get(),rank);
828class ArcaneHdf5CheckpointService2
844 virtual void notifyBeginWrite();
845 virtual void notifyEndWrite();
846 virtual void notifyBeginRead();
847 virtual void notifyEndRead();
863 info() <<
"USE DEFAULT FILE NAME";
871 if (m_fileset_size!=0)
872 file_id = (rank / m_fileset_size) * m_fileset_size;
881 IParallelReplication* pr = subDomain()->parallelMng()->replication();
882 if (pr->hasReplication()){
884 buf += pr->replicationRank();
891 Directory _defaultDirectory(){
892 return Directory(baseDirectoryName());
894 void _parseMetaData(String meta_data);
900void ArcaneHdf5CheckpointService2::
901_parseMetaData(String meta_data)
903 IIOMng* io_mng = subDomain()->ioMng();
904 ScopedPtrT<IXmlDocumentHolder> xml_doc(io_mng->parseXmlBuffer(meta_data.utf8(),
"MetaData"));
905 XmlNode root = xml_doc->documentNode().documentElement();
906 Integer version = root.attr(
"version").valueAsInteger();
908 throw ReaderWriterException(A_FUNCINFO,
"Bad version (expected 1)");
911 Integer fileset_size = root.child(
"fileset-size").valueAsInteger();
912 if (fileset_size<0) fileset_size = 0;
913 m_fileset_size = fileset_size;
916 Integer index_modulo = root.child(
"index-modulo").valueAsInteger();
917 if (index_modulo<0) index_modulo = 0;
918 m_index_modulo=index_modulo;
920 info() <<
" FileSet size=" << m_fileset_size;
921 info() <<
" Index modulo=" << m_index_modulo;
927void ArcaneHdf5CheckpointService2::
931 _parseMetaData(meta_data);
942 sub_group =
"SubDomain";
943 sub_group += subDomain()->subDomainId();
944 sub_group +=
"/Index";
946 Integer index = currentIndex();
947 if (m_index_modulo!=0)
948 index %= m_index_modulo;
957 Hdf5ReaderWriter::OpenModeRead);
958 m_reader->initialize();
964void ArcaneHdf5CheckpointService2::
974void ArcaneHdf5CheckpointService2::
979 m_fileset_size =
options()->filesetSize();
981 m_index_modulo =
options()->indexModulo();
988 Hdf5ReaderWriter::eOpenMode open_mode = Hdf5ReaderWriter::OpenModeAppend;
993 open_mode = Hdf5ReaderWriter::OpenModeTruncate;
996 if (m_index_modulo!=0)
997 write_index%=m_index_modulo;
1000 sub_group =
"SubDomain";
1001 sub_group += subDomain()->parallelMng()->commRank();
1002 sub_group +=
"/Index";
1003 sub_group += write_index;
1012 m_writer->initialize();
1019void ArcaneHdf5CheckpointService2::
1023 ostr() <<
"<infos version='1'>\n";
1024 ostr() <<
" <fileset-size>" << m_fileset_size <<
"</fileset-size>\n";
1025 ostr() <<
" <index-modulo>" << m_index_modulo <<
"</index-modulo>\n";
1026 ostr() <<
"</infos>\n";
1044ARCANE_REGISTER_SERVICE_HDF5READERWRITER(ArcaneHdf5Checkpoint2,
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro pour déclarer une interface lors de l'enregistrement d'un service.
Protection/reprise au format ArcaneHdf5.
virtual IDataReader * dataReader()
Retourne le lecteur associé
virtual String readerServiceName() const
Nom du service du lecteur associé à cet écrivain.
virtual IDataWriter * dataWriter()
Retourne l'écrivain associé.
virtual void close()
Ferme les protections.
CaseOptionsHdf5ReaderWriter * options() const
Options du jeu de données du service.
ArcaneHdf5ReaderWriterObject(const Arcane::ServiceBuildInfo &sbi)
Constructeur.
const T * data() const
Accès à la racine du tableau hors toute protection.
void put(Span< const Real > values) override
Ajoute le tableau values.
void reserve(eBasicDataType dt, Int64 n) override
Réserve de la mémoire pour n objets de type dt.
void putInt32(Int32 value) override
Ajoute l'entier value.
void allocateBuffer() override
Alloue la mémoire du sérialiseur.
void get(ArrayView< Real > values) override
Récupère le tableau values.
void setMode(eMode new_mode) override
Positionne le fonctionnement actuel.
String readerMetaData() const override
Méta données pour le lecteur associé à cet écrivain.
void setReaderMetaData(const String &s) override
Méta données associées à ce lecteur.
void setFileName(const String &file_name) override
Positionne le nom du fichier de la protection.
RealConstArrayView checkpointTimes() const override
Temps des protections.
String fileName() const override
Nom du fichier de la protection.
constexpr const_pointer data() const noexcept
Pointeur sur la mémoire allouée.
Classe gérant un répertoire.
String file(const String &file_name) const override
Retourne le chemin complet du fichier file_name dans le répertoire.
Lecture/Ecriture au format HDF5.
bool m_is_parallel
Mode parallèle actif: ATTENTION: en cours de test uniquement.
String m_sub_group_name
Nom du fichier.
IParallelMng * m_parallel_mng
Gestionnaire du parallélisme;.
Hdf5Utils::HGroup m_sub_group_id
Identifiant HDF du groupe contenant la protection.
Encapsule un hid_t pour un dataset.
Encapsule un hid_t pour un groupe.
Encapsule un hid_t pour un dataspace.
Interface du service de lecture d'une protection/reprise.
Interface du service d'écriture d'une protection/reprise.
Interface de lecture des données d'une variable.
Interface d'écriture des données d'une variable.
virtual void allocateBufferForSerializedData(ISerializedData *sdata)=0
Alloue la mémoire pour lire les valeurs sérialisées sdata.
virtual void assignSerializedData(const ISerializedData *sdata)=0
Assigne à la donnée les valeurs sérialisées sdata.
Interface du gestionnaire de parallélisme pour un sous-domaine.
virtual Int32 commRank() const =0
Rang de cette instance dans le communicateur.
virtual bool isParallel() const =0
Retourne true si l'exécution est parallèle.
Interface d'une donnée sérialisée.
virtual void serialize(ISerializer *buffer)=0
Serialize en lecture ou écriture la donnée.
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
Interface du gestionnaire d'un sous-domaine.
Interface d'une variable.
virtual String fullName() const =0
Nom complet de la variable (avec le préfixe de la famille)
virtual String name() const =0
Nom de la variable.
Flot de sortie lié à une String.
Exception dans un lecteur ou écrivain.
Référence à une instance.
Implémentation d'un tampon pour la sérialisation.
Structure contenant les informations pour créer un service.
Propriétés de création d'un service.
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Vue d'un tableau d'éléments de type T.
Constructeur de chaîne de caractère unicode.
String toString() const
Retourne la chaîne de caractères construite.
Chaîne de caractères unicode.
Span< const Byte > bytes() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Classe d'accès aux traces.
TraceMessage info() const
Flot pour un message d'information.
ITraceMng * traceMng() const
Gestionnaire de trace.
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro pour enregistrer un service.
Fonctions utilitaires pour Hdf5.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Ref< ISerializedData > arcaneCreateSerializedDataRef(eDataType data_type, Int64 memory_size, Integer nb_dim, Int64 nb_element, Int64 nb_base_element, bool is_multi_size, Int64ConstArrayView dimensions)
Créé des données sérialisées.
std::int64_t Int64
Type entier signé sur 64 bits.
Int32 Integer
Type représentant un entier.
@ ST_SubDomain
Le service s'utilise au niveau du sous-domaine.
ConstArrayView< Int64 > Int64ConstArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
UniqueArray< Byte > ByteUniqueArray
Tableau dynamique à une dimension de caractères.
Ref< ISerializedData > arcaneCreateEmptySerializedDataRef()
Créé des données sérialisées.
unsigned char Byte
Type d'un octet.
eDataType
Type d'une donnée.
@ DT_Int32
Donnée de type entier 32 bits.
@ DT_Unknown
Donnée de type inconnue ou non initialisée.
std::int32_t Int32
Type entier signé sur 32 bits.