11/*
2- * A2AMatrix.hpp, part of Hadrons (https://github.com/aportelli/Hadrons )
2+ * A2AMatrix.hpp, part of Hadrons ()
33 *
44 * Copyright (C) 2015 - 2020
55 *
4545#define HADRONS_A2AM_IO_TYPE ComplexF
4646#endif
4747
48+ #ifndef DISTIL_NT_CHUNK_SIZE
49+ #define DISTIL_NT_CHUNK_SIZE 1
50+ #endif
51+
4852#define HADRONS_A2AM_PARALLEL_IO
4953
5054BEGIN_HADRONS_NAMESPACE
@@ -104,11 +108,22 @@ class A2AMatrixIo
104108 void initFile (const MetadataType &d, const unsigned int chunkSize);
105109 // block I/O
106110 void saveBlock (const T *data, const unsigned int i, const unsigned int j,
107- const unsigned int blockSizei, const unsigned int blockSizej);
111+ const unsigned int blockSizei, const unsigned int blockSizej, std::string datasetName= " " );
108112 void saveBlock (const A2AMatrixSet<T> &m, const unsigned int ext, const unsigned int str,
109113 const unsigned int i, const unsigned int j);
114+ // distillation overloads and new methods
115+ template <typename MetadataType>
116+ void initFile (const MetadataType &d);
117+ void createDilutionBlock (std::string datasetName, const unsigned int chunkSize, const std::vector<unsigned int > timeSlices);
118+ void saveBlock (const A2AMatrixSet<T> &m,
119+ const unsigned int ext, const unsigned int str,
120+ const unsigned int i, const unsigned int j, std::string datasetName,
121+ const std::vector<unsigned int > timeSlices, const unsigned int chunkSize);
122+ void saveBlock (const A2AMatrixSet<T> &m, const unsigned int ext, const unsigned int str,
123+ const unsigned int i, const unsigned int j,
124+ std::string datasetName);
110125 template <template <class > class Vec , typename VecT>
111- void load (Vec<VecT> &v, double *tRead = nullptr , GridBase *grid = nullptr );
126+ void load (Vec<VecT> &v, double *tRead = nullptr , GridBase *grid = nullptr , std::string datasetName= " " );
112127private:
113128 std::string filename_{" " }, dataname_{" " };
114129 unsigned int nt_{0 }, ni_{0 }, nj_{0 };
@@ -460,13 +475,28 @@ void A2AMatrixIo<T>::initFile(const MetadataType &d, const unsigned int chunkSiz
460475#endif
461476}
462477
478+ // distillation overloads
479+ template <typename T>
480+ template <typename MetadataType>
481+ void A2AMatrixIo<T>::initFile(const MetadataType &d)
482+ {
483+ #ifdef HAVE_HDF5
484+ Hdf5Writer writer (filename_);
485+ push (writer, dataname_); // creates main h5 group
486+ write (writer, " Metadata" , d);
487+ #else
488+ HADRONS_ERROR (Implementation, " all-to-all matrix I/O needs HDF5 library" );
489+ #endif
490+ }
491+
463492// block I/O ///////////////////////////////////////////////////////////////////
464493template <typename T>
465494void A2AMatrixIo<T>::saveBlock(const T *data,
466495 const unsigned int i,
467496 const unsigned int j,
468497 const unsigned int blockSizei,
469- const unsigned int blockSizej)
498+ const unsigned int blockSizej,
499+ std::string datasetName)
470500{
471501#ifdef HAVE_HDF5
472502 Hdf5Reader reader (filename_, false );
@@ -479,9 +509,13 @@ void A2AMatrixIo<T>::saveBlock(const T *data,
479509 H5NS::DataSet dataset;
480510 // size_t shift;
481511
512+ if (datasetName.empty ()){
513+ datasetName = HADRONS_A2AM_NAME;
514+ }
515+
482516 push (reader, dataname_);
483517 auto &group = reader.getGroup ();
484- dataset = group.openDataSet (HADRONS_A2AM_NAME );
518+ dataset = group.openDataSet (datasetName );
485519 dataspace = dataset.getSpace ();
486520 dataspace.selectHyperslab (H5S_SELECT_SET, count.data (), offset.data (),
487521 stride.data (), block.data ());
@@ -504,22 +538,90 @@ void A2AMatrixIo<T>::saveBlock(const A2AMatrixSet<T> &m,
504538 saveBlock (m.data () + offset, i, j, blockSizei, blockSizej);
505539}
506540
541+ // distillation overloads and new methods
542+ template <typename T>
543+ void A2AMatrixIo<T>::createDilutionBlock(std::string datasetName, const unsigned int chunkSize, const std::vector<unsigned int > timeSlices)
544+ {
545+ #ifdef HAVE_HDF5
546+ Hdf5Reader reader (filename_, false );
547+ H5NS::DataSpace dataspace;
548+ H5NS::DataSet dataset;
549+
550+ push (reader, dataname_);
551+ auto &group = reader.getGroup ();
552+ unsigned int ntchunk = (nt_ > DISTIL_NT_CHUNK_SIZE) ? DISTIL_NT_CHUNK_SIZE : nt_;
553+
554+ // creates new dataset with custom name and certain chunk
555+ std::vector<hsize_t > dim = {static_cast <hsize_t >(nt_),
556+ static_cast <hsize_t >(ni_),
557+ static_cast <hsize_t >(nj_)},
558+ chunk = {static_cast <hsize_t >(ntchunk),
559+ static_cast <hsize_t >(chunkSize),
560+ static_cast <hsize_t >(chunkSize)};
561+ dataspace.setExtentSimple (dim.size (), dim.data ());
562+ H5NS::DSetCreatPropList plist;
563+ plist.setChunk (chunk.size (), chunk.data ());
564+ plist.setFletcher32 ();
565+ dataset = group.createDataSet (datasetName, Hdf5Type<T>::type (), dataspace, plist);
566+
567+ // save timeslice metadata
568+ hsize_t attrDim = timeSlices.size ();
569+ H5NS::DataSpace attrSpace (1 , &attrDim);
570+ H5NS::Attribute attr = dataset.createAttribute (" TimeSlices" , Hdf5Type<unsigned int >::type (), attrSpace);
571+ attr.write (Hdf5Type<unsigned int >::type (), timeSlices.data ());
572+ #else
573+ HADRONS_ERROR (Implementation, " all-to-all matrix I/O needs HDF5 library" );
574+ #endif
575+ }
576+
577+ template <typename T>
578+ void A2AMatrixIo<T>::saveBlock(const A2AMatrixSet<T> &m,
579+ const unsigned int ext, const unsigned int str,
580+ const unsigned int i, const unsigned int j, std::string datasetName,
581+ const std::vector<unsigned int > timeSlices, const unsigned int chunkSize)
582+ {
583+ unsigned int blockSizei = m.dimension (3 );
584+ unsigned int blockSizej = m.dimension (4 );
585+ unsigned int nstr = m.dimension (1 );
586+ size_t offset = (ext*nstr + str)*nt_*blockSizei*blockSizej;
587+
588+ createDilutionBlock (datasetName, chunkSize, timeSlices);
589+ saveBlock (m.data () + offset, i, j, blockSizei, blockSizej, datasetName);
590+ }
591+
592+ template <typename T>
593+ void A2AMatrixIo<T>::saveBlock(const A2AMatrixSet<T> &m,
594+ const unsigned int ext, const unsigned int str,
595+ const unsigned int i, const unsigned int j, std::string datasetName)
596+ {
597+ unsigned int blockSizei = m.dimension (3 );
598+ unsigned int blockSizej = m.dimension (4 );
599+ unsigned int nstr = m.dimension (1 );
600+ size_t offset = (ext*nstr + str)*nt_*blockSizei*blockSizej;
601+
602+ saveBlock (m.data () + offset, i, j, blockSizei, blockSizej, datasetName);
603+ }
604+
507605template <typename T>
508606template <template <class > class Vec , typename VecT>
509- void A2AMatrixIo<T>::load(Vec<VecT> &v, double *tRead, GridBase *grid)
607+ void A2AMatrixIo<T>::load(Vec<VecT> &v, double *tRead, GridBase *grid, std::string datasetName )
510608{
511609#ifdef HAVE_HDF5
512610 std::vector<hsize_t > hdim;
513611 H5NS::DataSet dataset;
514612 H5NS::DataSpace dataspace;
515613 H5NS::CompType datatype;
516614
615+ if (datasetName.empty ()){
616+ datasetName = HADRONS_A2AM_NAME;
617+ }
618+
517619 if (!(grid) || grid->IsBoss ())
518620 {
519621 Hdf5Reader reader (filename_);
520622 push (reader, dataname_);
521623 auto &group = reader.getGroup ();
522- dataset = group.openDataSet (HADRONS_A2AM_NAME );
624+ dataset = group.openDataSet (datasetName );
523625 datatype = dataset.getCompType ();
524626 dataspace = dataset.getSpace ();
525627 hdim.resize (dataspace.getSimpleExtentNdims ());
0 commit comments