diff --git a/src/kg/include/kg/io/Engine.inl b/src/kg/include/kg/io/Engine.inl index 00092d894..1a6808fa5 100644 --- a/src/kg/include/kg/io/Engine.inl +++ b/src/kg/include/kg/io/Engine.inl @@ -15,15 +15,9 @@ inline Engine::Engine(File&& file, MPI_Comm comm) : file_{std::move(file)} MPI_Comm_size(comm, &mpi_size_); } -inline void Engine::beginStep(StepMode mode) -{ - file_.beginStep(mode); -} +inline void Engine::beginStep(StepMode mode) { file_.beginStep(mode); } -inline void Engine::endStep() -{ - file_.endStep(); -} +inline void Engine::endStep() { file_.endStep(); } // ---------------------------------------------------------------------- // put @@ -78,18 +72,12 @@ inline void Engine::get(const std::string& pfx, T& datum, Args&&... args) // ---------------------------------------------------------------------- // performPuts -inline void Engine::performPuts() -{ - file_.performPuts(); -} +inline void Engine::performPuts() { file_.performPuts(); } // ---------------------------------------------------------------------- // performGets -inline void Engine::performGets() -{ - file_.performGets(); -} +inline void Engine::performGets() { file_.performGets(); } // ---------------------------------------------------------------------- // internal @@ -105,7 +93,7 @@ inline void Engine::putVariable(const T* data, const Mode launch, template inline void Engine::putAttribute(const T& datum) { - file_.putAttribute(prefix(), &datum, 1); + file_.putAttribute(prefix(), datum); } template @@ -150,20 +138,11 @@ inline Dims Engine::variableShape() // ---------------------------------------------------------------------- // close -inline void Engine::close() -{ - file_.close(); -} +inline void Engine::close() { file_.close(); } -inline int Engine::mpiRank() const -{ - return mpi_rank_; -} +inline int Engine::mpiRank() const { return mpi_rank_; } -inline int Engine::mpiSize() const -{ - return mpi_size_; -} +inline int Engine::mpiSize() const { return mpi_size_; } } // namespace io } // namespace kg diff --git a/src/kg/include/kg/io/File.h b/src/kg/include/kg/io/File.h index 20d1661e9..b1d81b746 100644 --- a/src/kg/include/kg/io/File.h +++ b/src/kg/include/kg/io/File.h @@ -41,6 +41,9 @@ class File template void getAttribute(const std::string& name, T* data); + template + void putAttribute(const std::string& name, const T& datum); + template void putAttribute(const std::string& name, const T* data, size_t size); diff --git a/src/kg/include/kg/io/File.inl b/src/kg/include/kg/io/File.inl index e15b5e7e9..873208e8e 100644 --- a/src/kg/include/kg/io/File.inl +++ b/src/kg/include/kg/io/File.inl @@ -6,25 +6,13 @@ namespace io inline File::File(FileBase* impl) : impl_{impl} {} -inline File::~File() -{ - close(); -} +inline File::~File() { close(); } -inline void File::close() -{ - impl_.reset(); -} +inline void File::close() { impl_.reset(); } -inline void File::beginStep(StepMode mode) -{ - impl_->beginStep(mode); -} +inline void File::beginStep(StepMode mode) { impl_->beginStep(mode); } -inline void File::endStep() -{ - impl_->endStep(); -} +inline void File::endStep() { impl_->endStep(); } inline void File::performPuts() { @@ -73,6 +61,14 @@ inline void File::getAttribute(const std::string& name, T* data) impl_->getAttribute(name, dataVar); } +template +inline void File::putAttribute(const std::string& name, const T& datum) +{ + assert(impl_); + FileBase::Type datumVar = datum; + impl_->putAttribute(name, datumVar); +} + template inline void File::putAttribute(const std::string& name, const T* data, size_t size) diff --git a/src/kg/include/kg/io/FileAdios2.h b/src/kg/include/kg/io/FileAdios2.h index 22da36303..81c59ac51 100644 --- a/src/kg/include/kg/io/FileAdios2.h +++ b/src/kg/include/kg/io/FileAdios2.h @@ -35,6 +35,7 @@ class FileAdios2 : public FileBase Dims shapeVariable(const std::string& name) const override; void getAttribute(const std::string& name, TypePointer data) override; + void putAttribute(const std::string& name, const Type& datum) override; void putAttribute(const std::string& name, TypeConstPointer data, size_t size) override; size_t sizeAttribute(const std::string& name) const override; @@ -44,6 +45,7 @@ class FileAdios2 : public FileBase struct GetVariable; struct GetAttribute; struct PutAttribute; + struct PutAttributeScalar; template void putVariable(const std::string& name, const T* data, Mode launch, @@ -57,6 +59,9 @@ class FileAdios2 : public FileBase template void getAttribute(const std::string& name, T* data); + template + void putAttribute(const std::string& name, const T& datum); + template void putAttribute(const std::string& name, const T* data, size_t size); diff --git a/src/kg/include/kg/io/FileAdios2.inl b/src/kg/include/kg/io/FileAdios2.inl index dda3c0e48..1926d9678 100644 --- a/src/kg/include/kg/io/FileAdios2.inl +++ b/src/kg/include/kg/io/FileAdios2.inl @@ -21,6 +21,7 @@ inline FileAdios2::FileAdios2(adios2::ADIOS& ad, const std::string& name, io_name_ = io_name; } io_ = ad.DeclareIO(io_name_); + // io_.SetEngine("BP4"); adios2::Mode adios2_mode; if (mode == Mode::Read) { adios2_mode = adios2::Mode::Read; @@ -179,6 +180,21 @@ inline Dims FileAdios2::shapeVariable(const std::string& name) const std::abort(); } +template +inline void FileAdios2::putAttribute(const std::string& name, const T& datum) +{ + // if (mpiRank() != 0) { // FIXME, should we do this? + // return; + // } + auto attr = io_.InquireAttribute(name); + if (attr) { + mprintf("attr '%s' already exists -- ignoring it!\n", name.c_str()); + } else { + // FIXME? we're never using "single value", just an array of size 1 + io_.DefineAttribute(name, datum); + } +} + template inline void FileAdios2::putAttribute(const std::string& name, const T* data, size_t size) @@ -224,6 +240,27 @@ inline void FileAdios2::getAttribute(const std::string& name, TypePointer data) mpark::visit(GetAttribute{*this, name}, data); } +struct FileAdios2::PutAttributeScalar +{ + PutAttributeScalar(FileAdios2& self, const std::string& name) + : self{self}, name{name} + {} + + template + void operator()(const T& datum) + { + self.putAttribute(name, datum); + } + + FileAdios2& self; + const std::string& name; +}; + +inline void FileAdios2::putAttribute(const std::string& name, const Type& datum) +{ + mpark::visit(PutAttributeScalar{*this, name}, datum); +} + struct FileAdios2::PutAttribute { PutAttribute(FileAdios2& self, const std::string& name, size_t size) diff --git a/src/kg/include/kg/io/FileBase.h b/src/kg/include/kg/io/FileBase.h index a9388cd77..a9d4d95ed 100644 --- a/src/kg/include/kg/io/FileBase.h +++ b/src/kg/include/kg/io/FileBase.h @@ -14,6 +14,8 @@ namespace io class FileBase { public: + using Type = mpark::variant; using TypePointer = mpark::variant; @@ -41,6 +43,7 @@ class FileBase virtual Dims shapeVariable(const std::string& name) const = 0; virtual void getAttribute(const std::string& name, TypePointer data) = 0; + virtual void putAttribute(const std::string& name, const Type& datum) = 0; virtual void putAttribute(const std::string& name, TypeConstPointer data, size_t size) = 0; virtual size_t sizeAttribute(const std::string& name) const = 0; diff --git a/src/kg/testing/io/TestIOAdios2.cxx b/src/kg/testing/io/TestIOAdios2.cxx index 927e06e7d..8ef6c2b33 100644 --- a/src/kg/testing/io/TestIOAdios2.cxx +++ b/src/kg/testing/io/TestIOAdios2.cxx @@ -8,7 +8,7 @@ TEST(IOAdios2, CtorDtor) { auto io = kg::io::IOAdios2{}; } TEST(IOAdios2, OpenWrite) { auto io = kg::io::IOAdios2{}; - auto file = io.openFile("test1", kg::io::Mode::Write); + auto file = io.openFile("test1.bp", kg::io::Mode::Write); } TEST(IOAdios2, OpenReadMissingFile) @@ -76,6 +76,8 @@ TEST(IOAdios2, FilePutGetAttribute) file.beginStep(kg::io::StepMode::Append); auto dbl = std::vector{1., 2., 3., 4., 5.}; file.putAttribute("attr_dbl", dbl.data(), dbl.size()); + double val = 99.; + file.putAttribute("attr_dbl_scalar", val); file.endStep(); } { @@ -84,7 +86,10 @@ TEST(IOAdios2, FilePutGetAttribute) auto size = file.sizeAttribute("attr_dbl"); auto dbl = std::vector(size); file.getAttribute("attr_dbl", dbl.data()); + double val; + file.getAttribute("attr_dbl_scalar", &val); EXPECT_EQ(dbl, (std::vector{1., 2., 3., 4., 5.})); + EXPECT_EQ(val, 99.); file.endStep(); } }