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*);
71 constexpr 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;
138void Hdf5ReaderWriter::
141 if (m_is_initialized)
143 m_is_initialized =
true;
146 HInit::useMutex(m_parallel_mng->isThreadImplementation(), m_parallel_mng);
148 info() <<
"INIT HDF5 READER/WRITER";
154 ::H5get_libversion(&vmajor, &vminor, &vrel);
155 info() <<
"HDF5 version = " << vmajor <<
'.' << vminor <<
'.' << vrel;
157 info() <<
"SubGroup is '" << m_sub_group_name <<
"'";
158 if (m_open_mode == OpenModeRead) {
159 m_file_id.openRead(m_filename);
160 m_sub_group_id.recursiveOpen(m_file_id, m_sub_group_name);
164 if (m_send_rank != m_my_rank)
166 if (m_open_mode == OpenModeTruncate) {
170 plist_id = H5Pcreate(H5P_FILE_ACCESS);
171#ifdef ARCANE_TEST_HDF5MPI
172 void* arcane_comm = subDomain()->parallelMng()->getMPICommunicator();
175 MPI_Comm mpi_comm = *((MPI_Comm*)arcane_comm);
176 MPI_Info mpi_info = MPI_INFO_NULL;
178 H5Pset_fapl_mpio(plist_id, mpi_comm, MPI_INFO_NULL);
179 H5Pset_fclose_degree(plist_id, H5F_CLOSE_STRONG);
185 herr_t r = H5Pget_cache(plist_id, &mdc_nelmts, &rdcc_nelmts, &rdcc_nbytes, &rdcc_w0);
186 info() <<
" CACHE SIZE r=" << r <<
" mdc=" << mdc_nelmts
187 <<
" rdcc=" << rdcc_nelmts <<
" rdcc_bytes=" << rdcc_nbytes <<
" w0=" << rdcc_w0;
190 rdcc_nbytes = 10000000;
191 r = H5Pset_cache(plist_id, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0);
192 info() <<
" SET CACHE SIZE R1=" << r;
195 hsize_t sieve_buf = (1024 << 12);
196 r = H5Pset_sieve_buf_size(plist_id, sieve_buf);
197 info() <<
" SIEVE_BUF=" << sieve_buf <<
" r=" << r;
198 hsize_t small_block_size = 0;
199 r = H5Pget_small_data_block_size(plist_id, &small_block_size);
200 info() <<
" SMALL BLOCK SIZE=" << small_block_size;
201 small_block_size <<= 10;
202 r = H5Pset_small_data_block_size(plist_id, small_block_size);
203 info() <<
" SET SMALL BLOCK SIZE s=" << small_block_size <<
" r=" << r;
206 m_file_id.openTruncate(m_filename, plist_id);
208 else if (m_open_mode == OpenModeAppend) {
209 m_file_id.openAppend(m_filename);
211 if (m_sub_group_name !=
"/") {
212 m_sub_group_id.checkDelete(m_file_id, m_sub_group_name);
213 m_sub_group_id.recursiveCreate(m_file_id, m_sub_group_name);
216 m_sub_group_id.open(m_file_id, m_sub_group_name);
218 if (m_file_id.isBad())
219 ARCANE_THROW(ReaderWriterException,
"Unable to open file '{0}'", m_filename);
221 if (m_sub_group_id.isBad())
222 ARCANE_THROW(ReaderWriterException,
"HDF5 group '{0}' not found", m_sub_group_name);
224 if (m_open_mode == OpenModeRead) {
228 H5Giterate(m_file_id.id(), m_sub_group_name.localstr(), &index, _Hdf5ReaderWriterIterateMe,
this);
243void Hdf5ReaderWriter::
246 if (m_is_initialized)
248 fatal() <<
"Use of a Hdf5ReaderWriter instance not initialized";
254String Hdf5ReaderWriter::
255_variableGroupName(IVariable* var)
257 return var->fullName();
267void Hdf5ReaderWriter::
271 sb.
setMode(ISerializer::ModeReserve);
290void Hdf5ReaderWriter::
294 info(4) <<
"DIRECT READ VAL v=" << v->
name();
301void Hdf5ReaderWriter::
302_directWriteVal(IVariable* v, IData* data)
305 Ref<ISerializedData> sdata(data->createSerializedDataRef(
false));
306 if (m_is_parallel && m_send_rank != m_my_rank) {
307 _writeValParallel(v, sdata.get());
310 _writeVal(v->fullName(), m_sub_group_name, sdata.get());
318_Hdf5ReaderWriterIterateMe(hid_t g,
const char* mn,
void* ptr)
320 Hdf5ReaderWriter* rw =
reinterpret_cast<Hdf5ReaderWriter*
>(ptr);
321 return rw->iterateMe(g, mn);
327herr_t Hdf5ReaderWriter::
328iterateMe(hid_t group_id,
const char* member_name)
330 ARCANE_UNUSED(group_id);
331 m_variables_name.add(StringView(member_name));
338void Hdf5ReaderWriter::
339_writeVal(
const String& var_group_name,
340 const String& sub_group_name,
341 const ISerializedData* sdata,
342 const Int32 from_rank)
344 const bool hits_modulo = (m_index_modulo != 0) && (m_index_write != 0) && ((m_index_write % m_index_modulo) == 0);
345 Timer::Sentry ts(&m_io_timer);
347 info(4) <<
" SDATA name=" << var_group_name <<
" nb_element=" << sdata->nbElement()
348 <<
" dim=" << sdata->nbDimension() <<
" datatype=" << sdata->baseDataType()
349 <<
" nb_basic_element=" << sdata->nbBaseElement()
350 <<
" is_multi=" << sdata->isMultiSize()
351 <<
" dimensions_size=" << sdata->extents().size()
352 <<
" memory_size=" << sdata->memorySize()
353 <<
" bytes_size=" << sdata->constBytes().size()
354 <<
" shape=" << sdata->shape().dimensions();
356 Integer nb_dimension = sdata->nbDimension();
359 hid_t save_typeid = m_types.saveType(sdata->baseDataType());
360 hid_t trueid = m_types.nativeType(sdata->baseDataType());
361 const void* ptr = sdata->constBytes().
data();
362 Int64 nb_base_element = sdata->nbBaseElement();
364 HGroup var_base_group;
365 var_base_group.recursiveCreate(m_file_id, sub_group_name);
369 group_id.recursiveCreate(var_base_group, var_group_name);
370 if (group_id.isBad())
371 ARCANE_THROW(ReaderWriterException,
"HDF5 group '{0}' not found", var_group_name);
373 Int64 nb_element = sdata->nbElement();
374 bool is_multi_size = sdata->isMultiSize();
377 if (nb_dimension == 2 && !is_multi_size) {
378 dim1_size = dimensions[0];
379 dim2_size = dimensions[1];
381 Integer dimension_array_size = dimensions.size();
386 att_dims[0] = VARIABLE_INFO_SIZE;
388 space_id.createSimple(1, att_dims);
389 std::array<Int64, VARIABLE_INFO_SIZE> dim_val_buf;
390 SmallSpan<Int64> dim_val(dim_val_buf);
393 dim_val[0] = nb_dimension;
394 dim_val[1] = dim1_size;
395 dim_val[2] = dim2_size;
396 dim_val[3] = nb_element;
397 dim_val[4] = nb_base_element;
398 dim_val[5] = dimension_array_size;
399 dim_val[6] = is_multi_size ? 1 : 0;
400 dim_val[7] = sdata->baseDataType();
401 dim_val[8] = sdata->memorySize();
403 ArrayShape shape = sdata->shape();
404 Int32 shape_nb_dim = shape.nbDimension();
405 auto shape_dims = shape.dimensions();
406 dim_val[9] = shape_nb_dim;
407 for (Integer i = 0; i < shape_nb_dim; ++i)
408 dim_val[10 + i] = shape_dims[i];
411 if (m_is_parallel && hits_modulo && (from_rank != 0))
412 att_id.remove(group_id,
"Dims");
413 att_id.create(group_id,
"Dims", m_types.saveType(dim1_size), space_id);
414 herr_t herr = att_id.write(m_types.nativeType(dim2_size), dim_val.data());
416 ARCANE_THROW(ReaderWriterException,
"Wrong dimensions written for variable '{0}'", var_group_name);
421 if (dimension_array_size != 0) {
423 att_dims[0] = dimension_array_size;
426 space_id.createSimple(1, att_dims);
427 array_id.recursiveCreate(group_id,
"Dim2", m_types.saveType(dim1_size), space_id, H5P_DEFAULT);
428 herr_t herr = array_id.write(m_types.nativeType(dim1_size), dimensions.data());
430 ARCANE_THROW(ReaderWriterException,
"Wrong dimensions written for variable '{0}'", var_group_name);
434 if (nb_base_element != 0 && ptr !=
nullptr) {
435 debug(Trace::High) <<
"Variable " << var_group_name <<
" begin dumped (nb_base_element=" << nb_base_element <<
").";
437 dims[0] = nb_base_element;
439 space_id.createSimple(1, dims);
440 if (space_id.isBad())
441 ARCANE_THROW(ReaderWriterException,
"Wrong dataspace for variable '{0}'", var_group_name);
444 hid_t plist_id = H5P_DEFAULT;
447 if (nb_element>=10000){
449 plist_id = H5Pcreate(H5P_DATASET_CREATE);
450 hsize_t chunk_dim[1];
451 chunk_dim[0] = (4096 << 1);
452 herr_t r = H5Pset_chunk(plist_id,1,chunk_dim);
453 info() <<
" SET CHUNK FOR " << var_group_name <<
" s=" << nb_element;
456 dataset_id.recursiveCreate(group_id,
"Values", save_typeid, space_id, plist_id);
457 if (dataset_id.isBad())
458 ARCANE_THROW(ReaderWriterException,
"Wrong dataset for variable '{0}'", var_group_name);
460 herr_t herr = dataset_id.write(trueid, ptr);
462 ARCANE_THROW(ReaderWriterException,
"Wrong dataset written for variable '{0}'", var_group_name);
469Ref<ISerializedData> Hdf5ReaderWriter::
470_readDim2(IVariable* var)
472 const int max_dim = 256;
473 String vname = _variableGroupName(var);
474 info(4) <<
" READ DIM name=" << vname;
475 Int64 dimension_array_size = 0;
476 Int64 nb_element = 0;
482 bool is_found =
false;
483 for (StringList::Enumerator i(m_variables_name); ++i;)
489 ARCANE_THROW(ReaderWriterException,
"No HDF5 group named '{0} exists", vname);
495 group_id.open(m_sub_group_id, vname);
496 if (group_id.isBad())
497 ARCANE_THROW(ReaderWriterException,
"HDF5 group '{0}' not found", vname);
499 bool is_multi_size =
false;
501 Int64 memory_size = 0;
502 Int64 nb_base_element = 0;
505 UniqueArray<Int64> dims;
506 ArrayShape data_shape;
511 att_id.open(group_id,
"Dims");
512 HSpace space_id = att_id.getSpace();
516 hsize_t hdf_dims[max_dim];
517 hsize_t max_dims[max_dim];
520 H5Sget_simple_extent_dims(space_id.id(), hdf_dims, max_dims);
523 if (hdf_dims[0] != VARIABLE_INFO_SIZE)
524 ARCANE_THROW(ReaderWriterException,
"Wrong dimensions for variable '{0}' (found={1} expected={2})",
525 vname, hdf_dims[0], VARIABLE_INFO_SIZE);
527 std::array<Int64, VARIABLE_INFO_SIZE> dim_val_buf;
528 att_id.read(m_types.nativeType(Int64()), dim_val_buf.data());
530 SmallSpan<const Int64> dim_val(dim_val_buf);
532 nb_dimension = CheckedConvert::toInteger(dim_val[0]);
533 dim1_size = dim_val[1];
534 dim2_size = dim_val[2];
535 nb_element = dim_val[3];
536 nb_base_element = dim_val[4];
537 dimension_array_size = dim_val[5];
538 is_multi_size = dim_val[6] != 0;
540 memory_size = dim_val[8];
541 Int32 shape_nb_dim = CheckedConvert::toInt32(dim_val[9]);
542 data_shape.setNbDimension(shape_nb_dim);
543 for (Integer i = 0; i < shape_nb_dim; ++i)
544 data_shape.setDimension(i, CheckedConvert::toInt32(dim_val[10 + i]));
547 info(4) <<
" READ DIM name=" << vname
548 <<
" nb_dim=" << nb_dimension <<
" dim1_size=" << dim1_size
549 <<
" dim2_size=" << dim2_size <<
" nb_element=" << nb_element
550 <<
" dimension_size=" << dimension_array_size
551 <<
" is_multi_size=" << is_multi_size
552 <<
" data_type" << data_type
553 <<
" shape=" << data_shape.dimensions();
555 if (dimension_array_size > 0) {
557 array_id.open(group_id,
"Dim2");
558 if (array_id.isBad())
559 ARCANE_THROW(ReaderWriterException,
"Wrong dataset for variable '{0}'", vname);
561 HSpace space_id = array_id.getSpace();
562 if (space_id.isBad())
563 ARCANE_THROW(ReaderWriterException,
"Wrong dataspace for variable '{0}'", vname);
565 hsize_t hdf_dims[max_dim];
566 hsize_t max_dims[max_dim];
569 H5Sget_simple_extent_dims(space_id.id(), hdf_dims, max_dims);
573 if ((Int64)hdf_dims[0] != dimension_array_size) {
574 ARCANE_THROW(ReaderWriterException,
"Wrong number of elements in 'Dim2' for variable '{0}' (found={1} expected={2})",
575 vname, hdf_dims[0], dimension_array_size);
578 dims.resize(dimension_array_size);
579 herr_t herr = array_id.read(m_types.nativeType(Int64()), dims.data());
581 ARCANE_THROW(ReaderWriterException,
"Wrong dataset read for variable '{0}'", vname);
584 nb_base_element, is_multi_size, dims, data_shape);
594void Hdf5ReaderWriter::
597 _directWriteVal(v, data);
603void Hdf5ReaderWriter::
606 String var_group_name = _variableGroupName(v);
607 info(4) <<
" TRY TO READ var_group=" << var_group_name;
609 Int64 storage_size = sd->memorySize();
610 info(4) <<
" READ DATA n=" << storage_size;
612 if (storage_size != 0) {
616 group_id.open(m_sub_group_id, var_group_name);
617 if (group_id.isBad())
620 dataset_id.open(group_id,
"Values");
621 if (dataset_id.isBad())
623 void* ptr = sd->writableBytes().data();
624 info() <<
"READ Variable " << var_group_name <<
" ptr=" << ptr;
626 hid_t trueid = m_types.nativeType(sd->baseDataType());
627 dataset_id.read(trueid, ptr);
635void Hdf5ReaderWriter::
638 _directReadVal(var, data);
644void Hdf5ReaderWriter::
645setMetaData(
const String& meta_data)
650 if (m_send_rank != m_my_rank) {
653 sb.
setMode(ISerializer::ModeReserve);
664 for (
Integer i = m_send_rank + 1; i <= m_last_recv_rank; ++i) {
666 pm->recvSerializer(&sb, i);
670 sb.
get(remote_group_name);
671 sb.
get(remote_meta_data);
672 _setMetaData(remote_meta_data, remote_group_name);
683void Hdf5ReaderWriter::
684_setMetaData(
const String& meta_data,
const String& sub_group_name)
686 const bool hits_modulo = (m_index_modulo != 0) && (m_index_write != 0) && ((m_index_write % m_index_modulo) == 0);
689 base_group.recursiveOpen(m_file_id, sub_group_name);
691 base_group.recursiveCreate(m_file_id, sub_group_name);
694 const Byte* _meta_data = meta_data_bytes.
data();
696 dims[0] = meta_data_bytes.
size();
699 space_id.createSimple(1, dims);
700 if (space_id.isBad())
705 dataset_id.recursiveCreate(base_group,
"MetaData", m_types.nativeType(
Byte()), space_id, H5P_DEFAULT);
707 dataset_id.create(base_group,
"MetaData", m_types.nativeType(
Byte()), space_id, H5P_DEFAULT);
708 if (dataset_id.isBad())
711 herr_t herr = dataset_id.write(m_types.nativeType(
Byte()), _meta_data);
724 if (dataset_id.isBad()) {
727 HSpace space_id = dataset_id.getSpace();
728 if (space_id.isBad()) {
731 const int max_dim = 256;
732 hsize_t hdf_dims[max_dim];
733 hsize_t max_dims[max_dim];
736 H5Sget_simple_extent_dims(space_id.id(), hdf_dims, max_dims);
738 if (hdf_dims[0] <= 0)
742 dataset_id.read(m_types.nativeType(
Byte()), uchars.
data());
750void Hdf5ReaderWriter::
754 if (m_my_rank == m_send_rank) {
755 _receiveRemoteVariables();
760 sb.setMode(ISerializer::ModeReserve);
761 sb.reserve(DT_Int32, 1);
763 sb.setMode(ISerializer::ModePut);
765 m_parallel_mng->sendSerializer(&sb, m_send_rank);
769 info() <<
" Hdf5Timer: nb_activated=" << m_io_timer.nbActivated()
770 <<
" time=" << m_io_timer.totalTime();
777void Hdf5ReaderWriter::
778_receiveRemoteVariables()
780 IParallelMng* pm = m_parallel_mng;
781 Integer nb_remaining = m_last_recv_rank - m_send_rank;
782 info() <<
"NB REMAINING = " << nb_remaining;
783 Ref<ISerializeMessageList> m_messages(pm->createSerializeMessageListRef());
784 while (nb_remaining > 0) {
785 ScopedPtrT<ISerializeMessage> sm(
new SerializeMessage(m_my_rank, NULL_SUB_DOMAIN_ID, ISerializeMessage::MT_Recv));
786 m_messages->addMessage(sm.get());
787 m_messages->processPendingMessages();
788 m_messages->waitMessages(Parallel::WaitAll);
789 ISerializer* sb = sm->serializer();
790 sb->setMode(ISerializer::ModeGet);
791 Int32
id = sb->getInt32();
795 _writeRemoteVariable(sb);
802void Hdf5ReaderWriter::
803_writeRemoteVariable(ISerializer* sb)
809 Int32 rank = sb->getInt32();
812 sb->setReadMode(ISerializer::ReadReplace);
813 sdata->serialize(sb);
814 _writeVal(var_name, group_name, sdata.get(), rank);
825class ArcaneHdf5CheckpointService2
842 virtual void notifyBeginWrite();
843 virtual void notifyEndWrite();
844 virtual void notifyBeginRead();
845 virtual void notifyEndRead();
861 info() <<
"USE DEFAULT FILE NAME";
869 if (m_fileset_size != 0)
870 file_id = (rank / m_fileset_size) * m_fileset_size;
879 IParallelReplication* pr = subDomain()->parallelMng()->replication();
880 if (pr->hasReplication()) {
882 buf += pr->replicationRank();
889 Directory _defaultDirectory()
891 return Directory(baseDirectoryName());
893 void _parseMetaData(String meta_data);
899void ArcaneHdf5CheckpointService2::
900_parseMetaData(String meta_data)
902 IIOMng* io_mng = subDomain()->ioMng();
903 ScopedPtrT<IXmlDocumentHolder> xml_doc(io_mng->parseXmlBuffer(meta_data.utf8(),
"MetaData"));
904 XmlNode root = xml_doc->documentNode().documentElement();
905 Integer version = root.attr(
"version").valueAsInteger();
907 throw ReaderWriterException(A_FUNCINFO,
"Bad version (expected 1)");
910 Integer fileset_size = root.child(
"fileset-size").valueAsInteger();
911 if (fileset_size < 0)
913 m_fileset_size = fileset_size;
916 Integer index_modulo = root.child(
"index-modulo").valueAsInteger();
917 if (index_modulo < 0)
919 m_index_modulo = index_modulo;
921 info() <<
" FileSet size=" << m_fileset_size;
922 info() <<
" Index modulo=" << m_index_modulo;
928void ArcaneHdf5CheckpointService2::
932 _parseMetaData(meta_data);
943 sub_group =
"SubDomain";
944 sub_group += subDomain()->subDomainId();
945 sub_group +=
"/Index";
947 Integer index = currentIndex();
948 if (m_index_modulo != 0)
949 index %= m_index_modulo;
958 Hdf5ReaderWriter::OpenModeRead);
959 m_reader->initialize();
965void ArcaneHdf5CheckpointService2::
975void ArcaneHdf5CheckpointService2::
980 m_fileset_size =
options()->filesetSize();
982 m_index_modulo =
options()->indexModulo();
989 Hdf5ReaderWriter::eOpenMode open_mode = Hdf5ReaderWriter::OpenModeAppend;
993 if (write_index == 0)
994 open_mode = Hdf5ReaderWriter::OpenModeTruncate;
997 if (m_index_modulo != 0)
998 write_index %= m_index_modulo;
1001 sub_group =
"SubDomain";
1002 sub_group += subDomain()->parallelMng()->commRank();
1003 sub_group +=
"/Index";
1004 sub_group += write_index;
1013 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 for throwing an exception with formatting.
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
#define ARCANE_SERVICE_INTERFACE(ainterface)
Macro to declare an interface when registering a service.
Protection/reprise au format ArcaneHdf5.
virtual IDataReader * dataReader()
Returns the associated reader.
virtual String readerServiceName() const
Name of the reader service associated with this writer.
virtual IDataWriter * dataWriter()
Returns the associated writer.
virtual void close()
Closes the checkpoints.
CaseOptionsHdf5ReaderWriter * options() const
Options du jeu de données du service.
ArcaneHdf5ReaderWriterObject(const Arcane::ServiceBuildInfo &sbi)
Constructeur.
const T * data() const
Access to the root of the array without any protection.
void put(Span< const Real > values) override
Add the array values.
void reserve(eBasicDataType dt, Int64 n) override
Reserves memory for n objects of type dt.
void putInt32(Int32 value) override
Add the integer value.
void allocateBuffer() override
Allocates the serializer memory.
void get(ArrayView< Real > values) override
Retrieve the array values.
void setMode(eMode new_mode) override
Sets the current mode.
String readerMetaData() const override
Metadata for the reader associated with this writer.
void setReaderMetaData(const String &s) override
Metadata associated with this reader.
void setFileName(const String &file_name) override
Sets the name of the checkpoint file.
RealConstArrayView checkpointTimes() const override
Checkpoint times.
String fileName() const override
Name of the checkpoint file.
constexpr const_pointer data() const noexcept
Pointer to the allocated memory.
Class managing a directory.
String file(const String &file_name) const override
Returns the full path of the file file_name in the directory.
Reading/Writing in HDF5 format.
bool m_is_parallel
Active parallel mode: WARNING: for testing only.
String m_sub_group_name
Subgroup name.
IParallelMng * m_parallel_mng
Parallelism manager;.
Hdf5Utils::HGroup m_sub_group_id
HDF group identifier containing the protection.
Encapsulates a hid_t for a dataset.
Encapsulates a hid_t for a group.
Encapsulates a hid_t for a dataspace.
Interface for the protection/recovery reading service.
Interface of the checkpoint/recovery write service.
Interface for reading variable data.
Interface for writing variable data.
Interface of a data item.
virtual void allocateBufferForSerializedData(ISerializedData *sdata)=0
Allocate memory to read the serialized values sdata.
virtual void assignSerializedData(const ISerializedData *sdata)=0
Assign the serialized values sdata to the data.
Interface of the parallelism manager for a subdomain.
virtual Int32 commRank() const =0
Rank of this instance in the communicator.
virtual bool isParallel() const =0
Returns true if the execution is parallel.
Interface of a serialized data.
virtual void serialize(ISerializer *buffer)=0
Serialize the data for reading or writing.
@ ModePut
The serializer expects reserve().
@ ModeGet
The serializer expects get().
Interface of the subdomain manager.
virtual String fullName() const =0
Full variable name (with family prefix).
virtual String name() const =0
Variable name.
Output stream linked to a String.
Exception in a reader or writer.
Reference to an instance.
Implementation of a buffer for serialization.
Structure containing the information to create a service.
Service creation properties.
constexpr __host__ __device__ pointer data() const noexcept
Pointer to the start of the view.
constexpr __host__ __device__ SizeType size() const noexcept
Returns the size of the array.
View of an array of elements of type T.
Unicode character string constructor.
String toString() const
Returns the constructed character string.
Unicode character string.
Span< const Byte > bytes() const
Returns the conversion of the instance into UTF-8 encoding.
TraceMessage info() const
Flow for an information message.
ITraceMng * traceMng() const
Trace manager.
#define ARCANE_REGISTER_SERVICE(aclass, a_service_property,...)
Macro for registering a service.
Utility functions for 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)
Creates serialized data.
std::int64_t Int64
Signed integer type of 64 bits.
Int32 Integer
Type representing an integer.
@ ST_SubDomain
The service is used at the subdomain level.
ConstArrayView< Int64 > Int64ConstArrayView
C equivalent of a 1D array of 64-bit integers.
UniqueArray< Byte > ByteUniqueArray
Dynamic 1D array of characters.
Ref< ISerializedData > arcaneCreateEmptySerializedDataRef()
Creates serialized data.
unsigned char Byte
Type of a byte.
@ DT_Int32
32-bit integer data type
@ DT_Unknown
Unknown or uninitialized data type.
std::int32_t Int32
Signed integer type of 32 bits.