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::
268_writeValParallel(IVariable* v,
const ISerializedData* sdata)
271 sb.setMode(ISerializer::ModeReserve);
272 sb.reserve(DT_Int32, 1);
273 sb.reserve(v->fullName());
274 sb.reserve(m_sub_group_name);
275 sb.reserve(DT_Int32, 1);
276 sdata->serialize(&sb);
278 sb.setMode(ISerializer::ModePut);
280 sb.put(v->fullName());
281 sb.put(m_sub_group_name);
283 sdata->serialize(&sb);
284 m_parallel_mng->sendSerializer(&sb, m_send_rank);
290void Hdf5ReaderWriter::
291_directReadVal(IVariable* v, IData* data)
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);
658 sb.
put(m_sub_group_name);
660 m_parallel_mng->sendSerializer(&sb, m_send_rank);
663 _setMetaData(meta_data, m_sub_group_name);
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);
677 _setMetaData(meta_data, m_sub_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);
723 dataset_id.open(m_sub_group_id,
"MetaData");
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
826:
public ArcaneHdf5ReaderWriterObject
831 : ArcaneHdf5ReaderWriterObject(sbi)
839 virtual IDataWriter* dataWriter() {
return m_writer; }
840 virtual IDataReader* dataReader() {
return m_reader; }
842 virtual void notifyBeginWrite();
843 virtual void notifyEndWrite();
844 virtual void notifyBeginRead();
845 virtual void notifyEndRead();
846 virtual void close() {}
847 virtual String readerServiceName()
const {
return "ArcaneHdf5CheckpointReader2"; }
861 info() <<
"USE DEFAULT FILE NAME";
869 if (m_fileset_size != 0)
870 file_id = (rank / m_fileset_size) * m_fileset_size;
893 void _parseMetaData(
String meta_data);
899void ArcaneHdf5CheckpointService2::
900_parseMetaData(
String meta_data)
902 IIOMng* io_mng = subDomain()->ioMng();
911 if (fileset_size < 0)
913 m_fileset_size = fileset_size;
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::
931 String meta_data = readerMetaData();
932 _parseMetaData(meta_data);
934 info() <<
" GET META DATA READER " << readerMetaData()
935 <<
" filename=" << fileName();
937 if (fileName().null()) {
938 Directory dump_dir(_defaultDirectory());
939 setFileName(dump_dir.file(_defaultFileName()));
941 info() <<
" READ CHECKPOINT FILENAME = " << fileName();
942 StringBuilder sub_group;
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;
952 m_reader =
new Hdf5ReaderWriter(subDomain(),
954 sub_group.toString(),
958 Hdf5ReaderWriter::OpenModeRead);
959 m_reader->initialize();
965void ArcaneHdf5CheckpointService2::
975void ArcaneHdf5CheckpointService2::
980 m_fileset_size = options()->filesetSize();
982 m_index_modulo = options()->indexModulo();
985 if (fileName().null()) {
986 Directory dump_dir(_defaultDirectory());
987 setFileName(dump_dir.file(_defaultFileName()));
989 Hdf5ReaderWriter::eOpenMode open_mode = Hdf5ReaderWriter::OpenModeAppend;
990 Integer write_index = checkpointTimes().size();
993 if (write_index == 0)
994 open_mode = Hdf5ReaderWriter::OpenModeTruncate;
997 if (m_index_modulo != 0)
998 write_index %= m_index_modulo;
1000 StringBuilder sub_group;
1001 sub_group =
"SubDomain";
1002 sub_group += subDomain()->parallelMng()->commRank();
1003 sub_group +=
"/Index";
1004 sub_group += write_index;
1006 m_writer =
new Hdf5ReaderWriter(subDomain(),
1010 checkpointTimes().size() - 1,
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";
1027 setReaderMetaData(ostr.str());
1037 ServiceProperty(
"ArcaneHdf5CheckpointReader2", ST_SubDomain),
1041 ServiceProperty(
"ArcaneHdf5CheckpointWriter2", ST_SubDomain),
1044ARCANE_REGISTER_SERVICE_HDF5READERWRITER(ArcaneHdf5Checkpoint2,
1045 ArcaneHdf5CheckpointService2);
#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.
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 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.
constexpr const_pointer data() const noexcept
Pointer to the allocated memory.
Class managing a directory.
Reading/Writing in HDF5 format.
Encapsulates a hid_t for a dataset.
Encapsulates a hid_t for a group.
Encapsulates a hid_t for a dataspace.
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 input/output manager.
virtual IXmlDocumentHolder * parseXmlBuffer(Span< const Byte > buffer, const String &name)=0
Reads and parses the XML file contained in the buffer buffer.
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.
Brief information on parallel subdomain replication.
virtual bool hasReplication() const =0
Indicates if replication is active.
virtual Int32 replicationRank() const =0
Rank in the replication (from 0 to nbReplication()-1).
@ ModePut
The serializer expects reserve().
@ ModeGet
The serializer expects get().
Interface of the subdomain manager.
Reference to an instance.
Encapsulation of an automatically destructing pointer.
Structure containing the information to create a service.
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.
ByteConstArrayView utf8() const
Returns the conversion of the instance into UTF-8 encoding.
Span< const Byte > bytes() const
Returns the conversion of the instance into UTF-8 encoding.
ITraceMng * traceMng() const
Trace manager.
XmlNode attr(const String &name, bool throw_exception=false) const
Returns the attribute of name name.
XmlNode documentElement() const
Returns the document element.
XmlNode child(const String &name) const
Child node of this node with name name.
Integer valueAsInteger(bool throw_exception=false) const
Node value converted to integer.
#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.
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_Unknown
Unknown or uninitialized data type.
std::int32_t Int32
Signed integer type of 32 bits.