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;
79 const String& sub_group_name,
81 eOpenMode open_mode,[[maybe_unused]]
bool do_verif)
83, m_parallel_mng(sd->parallelMng())
84, m_open_mode(open_mode)
86, m_sub_group_name(sub_group_name)
87, m_is_initialized(false)
88, m_io_timer(sd,
"Hdf5Timer",
Timer::TimerReal)
90, m_my_rank(m_parallel_mng->commRank())
91, m_send_rank(m_my_rank)
92, m_last_recv_rank(m_my_rank)
93, m_fileset_size(fileset_size)
94, m_index_write(currentIndex)
95, m_index_modulo(index_modulo)
98 if (m_fileset_size!=1 && m_parallel_mng->isParallel()){
100 Integer nb_rank = m_parallel_mng->commSize();
101 if (m_fileset_size==0){
103 m_last_recv_rank = nb_rank;
106 m_send_rank = (m_my_rank / m_fileset_size) * m_fileset_size;
107 m_last_recv_rank = m_send_rank + m_fileset_size;
108 if (m_last_recv_rank>nb_rank)
109 m_last_recv_rank = nb_rank;
113 sd->
traceMng()->info() <<
" INFOS PARALLEL: my_rank=" << m_my_rank
114 <<
" send_rank=" << m_send_rank
115 <<
" last_recv_rank=" << m_last_recv_rank
116 <<
" filename=" << filename;
122void Hdf5ReaderWriter::
125 if (m_is_initialized)
127 m_is_initialized =
true;
129 info() <<
"INIT HDF5 READER/WRITER";
134 ::H5get_libversion(&vmajor,&vminor,&vrel);
135 info() <<
"HDF5 version = " << vmajor <<
'.' << vminor <<
'.' << vrel;
137 info() <<
"SubGroup is '" << m_sub_group_name <<
"'";
138 if (m_open_mode==OpenModeRead){
139 m_file_id.openRead(m_filename);
140 m_sub_group_id.recursiveOpen(m_file_id,m_sub_group_name);
144 if (m_send_rank!=m_my_rank)
146 if (m_open_mode==OpenModeTruncate){
147 hid_t plist_id = H5Pcreate(H5P_FILE_ACCESS);
148#ifdef ARCANE_TEST_HDF5MPI
149 void* arcane_comm = subDomain()->parallelMng()->getMPICommunicator();
152 MPI_Comm mpi_comm = *((MPI_Comm*)arcane_comm);
153 MPI_Info mpi_info = MPI_INFO_NULL;
155 H5Pset_fapl_mpio(plist_id, mpi_comm, MPI_INFO_NULL);
156 H5Pset_fclose_degree(plist_id,H5F_CLOSE_STRONG);
162 herr_t r = H5Pget_cache(plist_id,&mdc_nelmts,&rdcc_nelmts,&rdcc_nbytes,&rdcc_w0);
163 info() <<
" CACHE SIZE r=" << r <<
" mdc=" << mdc_nelmts
164 <<
" rdcc=" << rdcc_nelmts <<
" rdcc_bytes=" << rdcc_nbytes <<
" w0=" << rdcc_w0;
167 rdcc_nbytes = 10000000;
168 r = H5Pset_cache(plist_id,mdc_nelmts,rdcc_nelmts,rdcc_nbytes,rdcc_w0);
169 info() <<
" SET CACHE SIZE R1=" << r;
172 hsize_t sieve_buf = (1024 << 12);
173 r = H5Pset_sieve_buf_size(plist_id,sieve_buf);
174 info() <<
" SIEVE_BUF=" << sieve_buf <<
" r=" << r;
175 hsize_t small_block_size = 0;
176 r = H5Pget_small_data_block_size(plist_id,&small_block_size);
177 info() <<
" SMALL BLOCK SIZE=" << small_block_size;
178 small_block_size <<= 10;
179 r = H5Pset_small_data_block_size(plist_id,small_block_size);
180 info() <<
" SET SMALL BLOCK SIZE s=" << small_block_size <<
" r=" << r;
182 m_file_id.openTruncate(m_filename,plist_id);
184 else if (m_open_mode==OpenModeAppend){
185 m_file_id.openAppend(m_filename);
187 if (m_sub_group_name!=
"/"){
188 m_sub_group_id.checkDelete(m_file_id,m_sub_group_name);
189 m_sub_group_id.recursiveCreate(m_file_id,m_sub_group_name);
192 m_sub_group_id.open(m_file_id,m_sub_group_name);
194 if (m_file_id.isBad())
195 ARCANE_THROW(ReaderWriterException,
"Unable to open file '{0}'",m_filename);
197 if (m_sub_group_id.isBad())
198 ARCANE_THROW(ReaderWriterException,
"HDF5 group '{0}' not found",m_sub_group_name);
200 if (m_open_mode==OpenModeRead){
203 H5Giterate(m_file_id.id(),m_sub_group_name.localstr(),&index,_Hdf5ReaderWriterIterateMe,
this);
219void Hdf5ReaderWriter::
222 if (m_is_initialized)
224 fatal() <<
"Use of a Hdf5ReaderWriter instance not initialized";
230String Hdf5ReaderWriter::
231_variableGroupName(IVariable* var)
233 return var->fullName();
243void Hdf5ReaderWriter::
244_writeValParallel(IVariable* v,
const ISerializedData* sdata)
247 sb.setMode(ISerializer::ModeReserve);
248 sb.reserve(DT_Int32,1);
249 sb.reserve(v->fullName());
250 sb.reserve(m_sub_group_name);
251 sb.reserve(DT_Int32,1);
252 sdata->serialize(&sb);
254 sb.setMode(ISerializer::ModePut);
256 sb.put(v->fullName());
257 sb.put(m_sub_group_name);
259 sdata->serialize(&sb);
260 m_parallel_mng->sendSerializer(&sb,m_send_rank);
266void Hdf5ReaderWriter::
267_directReadVal(IVariable* v,IData* data)
270 info(4) <<
"DIRECT READ VAL v=" << v->name();
277void Hdf5ReaderWriter::
278_directWriteVal(IVariable* v,IData* data)
281 Ref<ISerializedData> sdata(data->createSerializedDataRef(
false));
282 if (m_is_parallel && m_send_rank!=m_my_rank){
283 _writeValParallel(v,sdata.get());
286 _writeVal(v->fullName(),m_sub_group_name,sdata.get());
294_Hdf5ReaderWriterIterateMe(hid_t g,
const char* mn,
void* ptr)
296 Hdf5ReaderWriter* rw =
reinterpret_cast<Hdf5ReaderWriter*
>(ptr);
297 return rw->iterateMe(g,mn);
303herr_t Hdf5ReaderWriter::
304iterateMe(hid_t group_id,
const char* member_name)
306 ARCANE_UNUSED(group_id);
307 m_variables_name.add(StringView(member_name));
314void Hdf5ReaderWriter::
315_writeVal(
const String& var_group_name,
316 const String& sub_group_name,
317 const ISerializedData* sdata,
318 const Int32 from_rank)
320 const bool hits_modulo=(m_index_modulo!=0) && (m_index_write!=0) && ((m_index_write%m_index_modulo)==0);
321 Timer::Sentry ts(&m_io_timer);
323 info(4) <<
" SDATA name=" << var_group_name <<
" nb_element=" << sdata->nbElement()
324 <<
" dim=" << sdata->nbDimension() <<
" datatype=" << sdata->baseDataType()
325 <<
" nb_basic_element=" << sdata->nbBaseElement()
326 <<
" is_multi=" << sdata->isMultiSize()
327 <<
" dimensions_size=" << sdata->extents().size()
328 <<
" memory_size=" << sdata->memorySize()
329 <<
" bytes_size=" << sdata->constBytes().size()
330 <<
" shape=" << sdata->shape().dimensions();
332 Integer nb_dimension = sdata->nbDimension();
335 hid_t save_typeid = m_types.saveType(sdata->baseDataType());
336 hid_t trueid = m_types.nativeType(sdata->baseDataType());
337 const void* ptr = sdata->constBytes().
data();
338 Int64 nb_base_element = sdata->nbBaseElement();
340 HGroup var_base_group;
341 var_base_group.recursiveCreate(m_file_id,sub_group_name);
345 group_id.recursiveCreate(var_base_group,var_group_name);
346 if (group_id.isBad())
347 ARCANE_THROW(ReaderWriterException,
"HDF5 group '{0}' not found",var_group_name);
349 Int64 nb_element = sdata->nbElement();
350 bool is_multi_size = sdata->isMultiSize();
353 if (nb_dimension==2 && !is_multi_size){
354 dim1_size = dimensions[0];
355 dim2_size = dimensions[1];
357 Integer dimension_array_size = dimensions.size();
362 att_dims[0] = VARIABLE_INFO_SIZE;
364 space_id.createSimple(1,att_dims);
365 std::array<Int64,VARIABLE_INFO_SIZE> dim_val_buf;
366 SmallSpan<Int64> dim_val(dim_val_buf);
369 dim_val[0] = nb_dimension;
370 dim_val[1] = dim1_size;
371 dim_val[2] = dim2_size;
372 dim_val[3] = nb_element;
373 dim_val[4] = nb_base_element;
374 dim_val[5] = dimension_array_size;
375 dim_val[6] = is_multi_size ? 1 : 0;
376 dim_val[7] = sdata->baseDataType();
377 dim_val[8] = sdata->memorySize();
379 ArrayShape shape = sdata->shape();
380 Int32 shape_nb_dim = shape.nbDimension();
381 auto shape_dims = shape.dimensions();
382 dim_val[9] = shape_nb_dim;
383 for (Integer i=0; i<shape_nb_dim; ++i )
384 dim_val[10+i] = shape_dims[i];
387 if (m_is_parallel && hits_modulo && (from_rank!=0))
388 att_id.remove(group_id,
"Dims");
389 att_id.create(group_id,
"Dims",m_types.saveType(dim1_size),space_id);
390 herr_t herr = att_id.write(m_types.nativeType(dim2_size),dim_val.data());
392 ARCANE_THROW(ReaderWriterException,
"Wrong dimensions written for variable '{0}'",var_group_name);
397 if (dimension_array_size!=0){
399 att_dims[0] = dimension_array_size;
402 space_id.createSimple(1,att_dims);
403 array_id.recursiveCreate(group_id,
"Dim2",m_types.saveType(dim1_size),space_id,H5P_DEFAULT);
404 herr_t herr = array_id.write(m_types.nativeType(dim1_size),dimensions.data());
406 ARCANE_THROW(ReaderWriterException,
"Wrong dimensions written for variable '{0}'",var_group_name);
410 if (nb_base_element!=0 && ptr!=
nullptr){
411 debug(Trace::High) <<
"Variable " << var_group_name <<
" begin dumped (nb_base_element=" << nb_base_element <<
").";
413 dims[0] = nb_base_element;
415 space_id.createSimple(1,dims);
416 if (space_id.isBad())
417 ARCANE_THROW(ReaderWriterException,
"Wrong dataspace for variable '{0}'",var_group_name);
420 hid_t plist_id = H5P_DEFAULT;
423 if (nb_element>=10000){
424 plist_id = H5Pcreate(H5P_DATASET_CREATE);
425 hsize_t chunk_dim[1];
426 chunk_dim[0] = (4096 << 1);
427 herr_t r = H5Pset_chunk(plist_id,1,chunk_dim);
428 info() <<
" SET CHUNK FOR " << var_group_name <<
" s=" << nb_element;
431 dataset_id.recursiveCreate(group_id,
"Values",save_typeid,space_id,plist_id);
432 if (dataset_id.isBad())
433 ARCANE_THROW(ReaderWriterException,
"Wrong dataset for variable '{0}'",var_group_name);
435 herr_t herr = dataset_id.write(trueid,ptr);
437 ARCANE_THROW(ReaderWriterException,
"Wrong dataset written for variable '{0}'",var_group_name);
444Ref<ISerializedData> Hdf5ReaderWriter::
445_readDim2(IVariable* var)
447 const int max_dim = 256;
448 String vname = _variableGroupName(var);
449 info(4) <<
" READ DIM name=" << vname;
450 Int64 dimension_array_size = 0;
451 Int64 nb_element = 0;
457 bool is_found =
false;
458 for( StringList::Enumerator i(m_variables_name); ++i; )
464 ARCANE_THROW(ReaderWriterException,
"No HDF5 group named '{0} exists",vname);
470 group_id.open(m_sub_group_id,vname);
471 if (group_id.isBad())
472 ARCANE_THROW(ReaderWriterException,
"HDF5 group '{0}' not found",vname);
474 bool is_multi_size =
false;
476 Int64 memory_size = 0;
477 Int64 nb_base_element = 0;
480 UniqueArray<Int64> dims;
481 ArrayShape data_shape;
486 att_id.open(group_id,
"Dims");
487 HSpace space_id = att_id.getSpace();
491 hsize_t hdf_dims[max_dim];
492 hsize_t max_dims[max_dim];
493 H5Sget_simple_extent_dims(space_id.id(),hdf_dims,max_dims);
495 if (hdf_dims[0]!=VARIABLE_INFO_SIZE)
496 ARCANE_THROW(ReaderWriterException,
"Wrong dimensions for variable '{0}' (found={1} expected={2})",
497 vname, hdf_dims[0], VARIABLE_INFO_SIZE);
499 std::array<Int64,VARIABLE_INFO_SIZE> dim_val_buf;
500 att_id.read(m_types.nativeType(Int64()),dim_val_buf.data());
502 SmallSpan<const Int64> dim_val(dim_val_buf);
504 nb_dimension = CheckedConvert::toInteger(dim_val[0]);
505 dim1_size = dim_val[1];
506 dim2_size = dim_val[2];
507 nb_element = dim_val[3];
508 nb_base_element = dim_val[4];
509 dimension_array_size = dim_val[5];
510 is_multi_size = dim_val[6]!=0;
512 memory_size = dim_val[8];
513 Int32 shape_nb_dim = CheckedConvert::toInt32(dim_val[9]);
514 data_shape.setNbDimension(shape_nb_dim);
515 for (Integer i=0; i<shape_nb_dim; ++i )
516 data_shape.setDimension(i,CheckedConvert::toInt32(dim_val[10+i]));
519 info(4) <<
" READ DIM name=" << vname
520 <<
" nb_dim=" << nb_dimension <<
" dim1_size=" << dim1_size
521 <<
" dim2_size=" << dim2_size <<
" nb_element=" << nb_element
522 <<
" dimension_size=" << dimension_array_size
523 <<
" is_multi_size=" << is_multi_size
524 <<
" data_type" << data_type
525 <<
" shape=" << data_shape.dimensions();
527 if (dimension_array_size>0){
529 array_id.open(group_id,
"Dim2");
530 if (array_id.isBad())
531 ARCANE_THROW(ReaderWriterException,
"Wrong dataset for variable '{0}'",vname);
533 HSpace space_id = array_id.getSpace();
534 if (space_id.isBad())
535 ARCANE_THROW(ReaderWriterException,
"Wrong dataspace for variable '{0}'",vname);
537 hsize_t hdf_dims[max_dim];
538 hsize_t max_dims[max_dim];
539 H5Sget_simple_extent_dims(space_id.id(),hdf_dims,max_dims);
542 if ((Int64)hdf_dims[0]!=dimension_array_size){
543 ARCANE_THROW(ReaderWriterException,
"Wrong number of elements in 'Dim2' for variable '{0}' (found={1} expected={2})",
544 vname, hdf_dims[0], dimension_array_size);
548 dims.resize(dimension_array_size);
549 herr_t herr = array_id.read(m_types.nativeType(Int64()),dims.data());
551 ARCANE_THROW(ReaderWriterException,
"Wrong dataset read for variable '{0}'",vname);
554 nb_base_element,is_multi_size,dims,data_shape);
564void Hdf5ReaderWriter::
567 _directWriteVal(v,data);
573void Hdf5ReaderWriter::
576 String var_group_name = _variableGroupName(v);
577 info(4) <<
" TRY TO READ var_group=" << var_group_name;
579 Int64 storage_size = sd->memorySize();
580 info(4) <<
" READ DATA n=" << storage_size;
582 if (storage_size!=0){
586 group_id.open(m_sub_group_id,var_group_name);
587 if (group_id.isBad())
590 dataset_id.open(group_id,
"Values");
591 if (dataset_id.isBad())
593 void* ptr = sd->writableBytes().data();
594 info() <<
"READ Variable " << var_group_name <<
" ptr=" << ptr;;
595 hid_t trueid = m_types.nativeType(sd->baseDataType());
596 dataset_id.read(trueid,ptr);
605void Hdf5ReaderWriter::
608 _directReadVal(var,data);
614void Hdf5ReaderWriter::
615setMetaData(
const String& meta_data)
620 if (m_send_rank!=m_my_rank){
623 sb.
setMode(ISerializer::ModeReserve);
628 sb.
put(m_sub_group_name);
630 m_parallel_mng->sendSerializer(&sb,m_send_rank);
633 _setMetaData(meta_data,m_sub_group_name);
634 for(
Integer i=m_send_rank+1; i<=m_last_recv_rank; ++i ){
636 pm->recvSerializer(&sb,i);
640 sb.
get(remote_group_name);
641 sb.
get(remote_meta_data);
642 _setMetaData(remote_meta_data,remote_group_name);
647 _setMetaData(meta_data,m_sub_group_name);
653void Hdf5ReaderWriter::
654_setMetaData(
const String& meta_data,
const String& sub_group_name)
656 const bool hits_modulo=(m_index_modulo!=0) && (m_index_write!=0) && ((m_index_write%m_index_modulo)==0);
659 base_group.recursiveOpen(m_file_id,sub_group_name);
661 base_group.recursiveCreate(m_file_id,sub_group_name);
664 const Byte* _meta_data = meta_data_utf8.
data();
666 dims[0] = meta_data_utf8.
size() + 1;
669 space_id.createSimple(1,dims);
670 if (space_id.isBad())
675 dataset_id.recursiveCreate(base_group,
"MetaData", m_types.nativeType(
Byte()), space_id, H5P_DEFAULT);
677 dataset_id.create(base_group,
"MetaData", m_types.nativeType(
Byte()), space_id, H5P_DEFAULT);
678 if (dataset_id.isBad())
681 herr_t herr = dataset_id.write(m_types.nativeType(
Byte()),_meta_data);
693 dataset_id.open(m_sub_group_id,
"MetaData");
694 if (dataset_id.isBad()){
697 HSpace space_id = dataset_id.getSpace();
698 if (space_id.isBad()){
701 const int max_dim = 256;
702 hsize_t hdf_dims[max_dim];
703 hsize_t max_dims[max_dim];
704 H5Sget_simple_extent_dims(space_id.id(),hdf_dims,max_dims);
709 dataset_id.read(m_types.nativeType(
Byte()),uchars.
data());
717void Hdf5ReaderWriter::
721 if (m_my_rank==m_send_rank){
722 _receiveRemoteVariables();
727 sb.setMode(ISerializer::ModeReserve);
728 sb.reserve(DT_Int32,1);
730 sb.setMode(ISerializer::ModePut);
732 m_parallel_mng->sendSerializer(&sb,m_send_rank);
736 info() <<
" Hdf5Timer: nb_activated=" << m_io_timer.nbActivated()
737 <<
" time=" << m_io_timer.totalTime();
744void Hdf5ReaderWriter::
745_receiveRemoteVariables()
747 IParallelMng* pm = m_parallel_mng;
748 Integer nb_remaining = m_last_recv_rank - m_send_rank;
749 info() <<
"NB REMAINING = " << nb_remaining;
750 Ref<ISerializeMessageList> m_messages(pm->createSerializeMessageListRef());
751 while(nb_remaining>0){
752 ScopedPtrT<ISerializeMessage> sm(
new SerializeMessage(m_my_rank,NULL_SUB_DOMAIN_ID,ISerializeMessage::MT_Recv));
753 m_messages->addMessage(sm.get());
754 m_messages->processPendingMessages();
755 m_messages->waitMessages(Parallel::WaitAll);
756 ISerializer* sb = sm->serializer();
757 sb->setMode(ISerializer::ModeGet);
758 Int32
id = sb->getInt32();
762 _writeRemoteVariable(sb);
769void Hdf5ReaderWriter::
770_writeRemoteVariable(ISerializer* sb)
776 Int32 rank = sb->getInt32();
779 sb->setReadMode(ISerializer::ReadReplace);
780 sdata->serialize(sb);
781 _writeVal(var_name,group_name,sdata.get(),rank);
792class ArcaneHdf5CheckpointService2
793:
public ArcaneHdf5ReaderWriterObject
797 : ArcaneHdf5ReaderWriterObject(sbi),
804 virtual IDataWriter* dataWriter() {
return m_writer; }
805 virtual IDataReader* dataReader() {
return m_reader; }
807 virtual void notifyBeginWrite();
808 virtual void notifyEndWrite();
809 virtual void notifyBeginRead();
810 virtual void notifyEndRead();
811 virtual void close() {}
812 virtual String readerServiceName()
const {
return "ArcaneHdf5CheckpointReader2"; }
826 info() <<
"USE DEFAULT FILE NAME";
834 if (m_fileset_size!=0)
835 file_id = (rank / m_fileset_size) * m_fileset_size;
857 void _parseMetaData(
String meta_data);
863void ArcaneHdf5CheckpointService2::
864_parseMetaData(
String meta_data)
866 IIOMng* io_mng = subDomain()->ioMng();
875 if (fileset_size<0) fileset_size = 0;
876 m_fileset_size = fileset_size;
880 if (index_modulo<0) index_modulo = 0;
881 m_index_modulo=index_modulo;
883 info() <<
" FileSet size=" << m_fileset_size;
884 info() <<
" Index modulo=" << m_index_modulo;
890void ArcaneHdf5CheckpointService2::
893 String meta_data = readerMetaData();
894 _parseMetaData(meta_data);
896 info() <<
" GET META DATA READER " << readerMetaData()
897 <<
" filename=" << fileName();
899 if (fileName().null()){
900 Directory dump_dir(_defaultDirectory());
901 setFileName(dump_dir.file(_defaultFileName()));
903 info() <<
" READ CHECKPOINT FILENAME = " << fileName();
904 StringBuilder sub_group;
905 sub_group =
"SubDomain";
906 sub_group += subDomain()->subDomainId();
907 sub_group +=
"/Index";
909 Integer index = currentIndex();
910 if (m_index_modulo!=0)
911 index %= m_index_modulo;
914 m_reader =
new Hdf5ReaderWriter(subDomain(),
916 sub_group.toString(),
920 Hdf5ReaderWriter::OpenModeRead);
921 m_reader->initialize();
927void ArcaneHdf5CheckpointService2::
937void ArcaneHdf5CheckpointService2::
942 m_fileset_size = options()->filesetSize();
944 m_index_modulo = options()->indexModulo();
947 if (fileName().null()){
948 Directory dump_dir(_defaultDirectory());
949 setFileName(dump_dir.file(_defaultFileName()));
951 Hdf5ReaderWriter::eOpenMode open_mode = Hdf5ReaderWriter::OpenModeAppend;
952 Integer write_index = checkpointTimes().size();
956 open_mode = Hdf5ReaderWriter::OpenModeTruncate;
959 if (m_index_modulo!=0)
960 write_index%=m_index_modulo;
962 StringBuilder sub_group;
963 sub_group =
"SubDomain";
964 sub_group += subDomain()->parallelMng()->commRank();
965 sub_group +=
"/Index";
966 sub_group += write_index;
968 m_writer =
new Hdf5ReaderWriter(subDomain(),
972 checkpointTimes().size()-1,
975 m_writer->initialize();
982void ArcaneHdf5CheckpointService2::
986 ostr() <<
"<infos version='1'>\n";
987 ostr() <<
" <fileset-size>" << m_fileset_size <<
"</fileset-size>\n";
988 ostr() <<
" <index-modulo>" << m_index_modulo <<
"</index-modulo>\n";
989 ostr() <<
"</infos>\n";
990 setReaderMetaData(ostr.str());
1000 ServiceProperty(
"ArcaneHdf5CheckpointReader2",ST_SubDomain),
1004 ServiceProperty(
"ArcaneHdf5CheckpointWriter2",ST_SubDomain),
1007ARCANE_REGISTER_SERVICE_HDF5READERWRITER(ArcaneHdf5Checkpoint2,
1008 ArcaneHdf5CheckpointService2);
#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.
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 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.
constexpr const_pointer data() const noexcept
Pointeur sur la mémoire allouée.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Classe gérant un répertoire.
Lecture/Ecriture au format HDF5.
Encapsule un hid_t pour un dataset.
Encapsule un hid_t pour un groupe.
Encapsule un hid_t pour un dataspace.
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 des entrées sorties.
virtual IXmlDocumentHolder * parseXmlBuffer(Span< const Byte > buffer, const String &name)=0
Lit et analyse le fichier XML contenu dans le buffer buffer.
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.
Informations sur la réplication des sous-domaines en parallèle.
virtual bool hasReplication() const =0
Indique si la réplication est active.
virtual Int32 replicationRank() const =0
Rang dans la réplication (de 0 à nbReplication()-1)
@ ModePut
Le sérialiseur attend des reserve()
@ ModeGet
Le sérialiseur attend des get()
Interface du gestionnaire d'un sous-domaine.
Référence à une instance.
Encapsulation d'un pointeur qui se détruit automatiquement.
Structure contenant les informations pour créer un service.
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.
ByteConstArrayView utf8() const
Retourne la conversion de l'instance dans l'encodage UTF-8.
Classe d'accès aux traces.
ITraceMng * traceMng() const
Gestionnaire de trace.
XmlNode attr(const String &name, bool throw_exception=false) const
Retourne l'attribut de nom name.
XmlNode documentElement() const
Retourne le noeud élément du document.
XmlNode child(const String &name) const
Noeud fils de celui-ci de nom name.
Integer valueAsInteger(bool throw_exception=false) const
Valeur du noeud convertie en entier.
#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.
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.
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.
unsigned char Byte
Type d'un octet.
eDataType
Type d'une donnée.
@ DT_Unknown
Donnée de type inconnue ou non initialisée.
std::int32_t Int32
Type entier signé sur 32 bits.