diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index df9c24703..783d5a4ae 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -80,6 +80,8 @@ add_subdirectory (Expression) add_subdirectory (Types) add_subdirectory (Partition) add_subdirectory (Stream) +add_subdirectory (Stream/HDF5) +add_subdirectory (Stream/Format) if (ENABLE_SOLVERS) diff --git a/src/Stream/CMakeLists.txt b/src/Stream/CMakeLists.txt index ee1dc78dc..cdf274855 100644 --- a/src/Stream/CMakeLists.txt +++ b/src/Stream/CMakeLists.txt @@ -5,8 +5,6 @@ set (_SRCS set (_HDRS BasicStreams.h BasicFileStream.h - StreamFormat.h - OpenPMD.h ) include_DIRECTORIES ( @@ -18,6 +16,7 @@ add_ippl_headers (${_HDRS}) install (FILES ${_HDRS} DESTINATION include/Stream) + # vi: set et ts=4 sw=4 sts=4: # Local Variables: diff --git a/src/Stream/Format/CMakeLists.txt b/src/Stream/Format/CMakeLists.txt index 6ca040293..9bbba90c4 100644 --- a/src/Stream/Format/CMakeLists.txt +++ b/src/Stream/Format/CMakeLists.txt @@ -1,4 +1,5 @@ set (_SRCS + OpenPMD.cpp ) set (_HDRS diff --git a/src/Stream/Format/Format.h b/src/Stream/Format/Format.h index fead6fbe2..6e2d312f8 100644 --- a/src/Stream/Format/Format.h +++ b/src/Stream/Format/Format.h @@ -1,5 +1,5 @@ -#ifndef IPPL_IOS_STANDARD_H -#define IPPL_IOS_STANDARD_H +#ifndef IPPL_STREAM_FORMAT_H +#define IPPL_STREAM_FORMAT_H #include "Utility/ParameterList.h" diff --git a/src/Stream/Format/OpenPMD.cpp b/src/Stream/Format/OpenPMD.cpp new file mode 100644 index 000000000..c16e0aa37 --- /dev/null +++ b/src/Stream/Format/OpenPMD.cpp @@ -0,0 +1,31 @@ +#include "Stream/Format/OpenPMD.h" + +namespace ippl { + + void OpenPMD::header(ParameterList* param) const { + // default parameter list + ParameterList pl; + pl.add("version", version); + pl.add("author", "none"); + pl.add("software", "none"); + pl.add("softwareVersion", "none"); + pl.add("softwareDependencies", "none"); + pl.add("date", this->date()); + pl.add("machine", "none"); + pl.add("comment", "none"); + + if (param != nullptr) { + pl.merge(*param); + } + + *param = pl; + } + + std::string OpenPMD::date() const { + std::time_t time = std::time({}); + char timeString[std::size("YYYY-MM-DD HH:mm:ss zzzzz")]; + std::strftime(std::data(timeString), std::size(timeString), "%F %T %z", + std::localtime(&time)); + return timeString; + } +} // namespace ippl diff --git a/src/Stream/Format/OpenPMD.h b/src/Stream/Format/OpenPMD.h index 7596efc6f..ca6312295 100644 --- a/src/Stream/Format/OpenPMD.h +++ b/src/Stream/Format/OpenPMD.h @@ -6,6 +6,9 @@ #ifndef IPPL_STREAM_FORMAT_OPEN_PMD_H #define IPPL_STREAM_FORMAT_OPEN_PMD_H +#include +#include + #include "Stream/Format/Format.h" namespace ippl { @@ -14,17 +17,12 @@ namespace ippl { public: OpenPMD() = default; - void header(ParameterList* param) const override { - std::cout << "This file is written in OpenPMD standard." << std::endl; - - param->add("version", "1.1.0"); - param->add("author", "none"); - param->add("software", "Ippl"); - param->add("softwareVersion", "2.1.0"); - param->add("data", "YYYY-MM-DD HH:mm:ss tz"); - param->add("machine", "machine"); - param->add("comment", ""); - } + void header(ParameterList* param) const override; + + private: + const std::string version = "1.1.0"; + + std::string date() const; }; } // namespace ippl diff --git a/src/Stream/HDF5/CMakeLists.txt b/src/Stream/HDF5/CMakeLists.txt new file mode 100644 index 000000000..546a16cfc --- /dev/null +++ b/src/Stream/HDF5/CMakeLists.txt @@ -0,0 +1,26 @@ +set (_SRCS + ) + +set (_HDRS + Stream.h + ParticleStream.h + ParticleStream.hpp + ) + +include_DIRECTORIES ( + ${CMAKE_CURRENT_SOURCE_DIR} + ) + +add_ippl_sources (${_SRCS}) +add_ippl_headers (${_HDRS}) + +install (FILES ${_HDRS} DESTINATION include/Stream/HDF5) + +# vi: set et ts=4 sw=4 sts=4: + +# Local Variables: +# mode: cmake +# cmake-tab-width: 4 +# indent-tabs-mode: nil +# require-final-newline: nil +# End: diff --git a/src/Stream/HDF5/Stream.h b/src/Stream/HDF5/Stream.h index 4732e0b1b..dd0485981 100644 --- a/src/Stream/HDF5/Stream.h +++ b/src/Stream/HDF5/Stream.h @@ -131,7 +131,7 @@ namespace ippl { const T& value = pair.second; H5::DataSpace dspace(H5S_SCALAR); // FIXME We might also write arrays etc. - std::cout << "key " << key << std::endl; + H5::DataType type = core::get_hdf5_type(value); H5::Attribute attr = this->h5file_m.createAttribute(key, type, dspace);