diff --git a/include/openPMD/IO/HDF5/HDF5IOHandlerImpl.hpp b/include/openPMD/IO/HDF5/HDF5IOHandlerImpl.hpp index 300b3f19f3..734c762983 100644 --- a/include/openPMD/IO/HDF5/HDF5IOHandlerImpl.hpp +++ b/include/openPMD/IO/HDF5/HDF5IOHandlerImpl.hpp @@ -113,6 +113,7 @@ class HDF5IOHandlerImpl : public AbstractIOHandlerImpl */ std::optional m_communicator; #endif + bool m_writeAttributesFromThisRank = true; private: json::TracingJSON m_config; diff --git a/src/IO/HDF5/ParallelHDF5IOHandler.cpp b/src/IO/HDF5/ParallelHDF5IOHandler.cpp index 47a7764480..6186bf4069 100644 --- a/src/IO/HDF5/ParallelHDF5IOHandler.cpp +++ b/src/IO/HDF5/ParallelHDF5IOHandler.cpp @@ -61,7 +61,7 @@ std::future ParallelHDF5IOHandler::flush(internal::ParsedFlushParams &) ParallelHDF5IOHandlerImpl::ParallelHDF5IOHandlerImpl( AbstractIOHandler *handler, MPI_Comm comm, json::TracingJSON config) - : HDF5IOHandlerImpl{handler, std::move(config)} + : HDF5IOHandlerImpl{handler, config} , m_mpiComm{comm} , m_mpiInfo{MPI_INFO_NULL} /* MPI 3.0+: MPI_INFO_ENV */ { @@ -72,6 +72,44 @@ ParallelHDF5IOHandlerImpl::ParallelHDF5IOHandlerImpl( m_fileAccessProperty = H5Pcreate(H5P_FILE_ACCESS); m_fileCreateProperty = H5Pcreate(H5P_FILE_CREATE); + if (config.json().contains("attribute_writing_ranks")) + { + auto const &attribute_writing_ranks = + config["attribute_writing_ranks"].json(); + int rank = 0; + MPI_Comm_rank(comm, &rank); + auto throw_error = []() { + throw error::BackendConfigSchema( + {"attribute_writing_ranks"}, + "Type must be either an integer or an array of integers."); + }; + if (attribute_writing_ranks.is_array()) + { + m_writeAttributesFromThisRank = false; + for (auto const &val : attribute_writing_ranks) + { + if (!val.is_number()) + { + throw_error(); + } + if (val.get() == rank) + { + m_writeAttributesFromThisRank = true; + break; + } + } + } + else if (attribute_writing_ranks.is_number()) + { + m_writeAttributesFromThisRank = + attribute_writing_ranks.get() == rank; + } + else + { + throw_error(); + } + } + #if H5_VERSION_GE(1, 10, 1) auto const hdf5_spaced_allocation = auxiliary::getEnvString("OPENPMD_HDF5_PAGED_ALLOCATION", "ON");