diff --git a/include/ufo/solver.hpp b/include/ufo/solver.hpp index 169c71a..d598ed6 100644 --- a/include/ufo/solver.hpp +++ b/include/ufo/solver.hpp @@ -104,23 +104,32 @@ namespace ufo return output; } - class Hdf5File + class Hdf5file { public: - inline Hdf5File(std::string filename) : File_(filename, HighFive::File::ReadWrite - | HighFive::File::Create | HighFive::File::Truncate) {} - template inline Hdf5File& read(T& object, std::string name) + inline Hdf5file& open_for_read(std::string filename) { - object = File_.getDataSet(name).read>(); + File_ = HighFive::File(filename, HighFive::File::ReadOnly); return *this; } - template inline Hdf5File& write(const T& object, std::string name) + inline Hdf5file& open_for_write(std::string filename) { - File_.createDataSet(name, object); + File_ = HighFive::File(filename, HighFive::File::ReadWrite | HighFive::File::Create + | HighFive::File::Truncate); + return *this; + } + template inline Hdf5file& read(T& object, std::string name) + { + object = File_->getDataSet(name).read>(); + return *this; + } + template inline Hdf5file& write(const T& object, std::string name) + { + File_->createDataSet(name, object); return *this; } protected: - HighFive::File File_; + std::optional File_; }; }; } diff --git a/src/plot.cpp b/src/plot.cpp index 81bd3a9..c0ec7b4 100644 --- a/src/plot.cpp +++ b/src/plot.cpp @@ -60,7 +60,7 @@ namespace ufo { std::vector resolution{ Resolution.first, Resolution.second }; std::vector range{ Range.first, Range.second }; - Hdf5File(filename).write(Values, "Values") + Hdf5file{}.open_for_write(filename).write(Values, "Values") .write(XTicks, "XTicks") .write(YTicks, "YTicks") .write(resolution, "Resolution") diff --git a/src/unfold.cpp b/src/unfold.cpp index 920933a..c0bbc13 100644 --- a/src/unfold.cpp +++ b/src/unfold.cpp @@ -26,11 +26,7 @@ namespace ufo PrimativeCellBasisNumber(i) = node["PrimativeCellBasisNumber"][i].as(); if (auto value = node["SelectedAtoms"]) - { - SelectedAtoms.emplace(); - for (unsigned i = 0; i < value.size(); i++) - (*SelectedAtoms)[i] = value[i].as(); - } + SelectedAtoms.emplace(value.as>()); auto read_file_config = [filename](YAML::Node source, InputOutputFile& config) { @@ -142,7 +138,7 @@ namespace ufo { std::vector>> frequency, path; std::vector>>> eigenvector_vector; - Hdf5File(QpointDataInputFile.FileName).read(frequency, "/frequency") + Hdf5file{}.open_for_read(QpointDataInputFile.FileName).read(frequency, "/frequency") .read(eigenvector_vector, "/eigenvector") .read(path, "/path"); std::vector size = { frequency.size(), frequency[0].size(), frequency[0][0].size() }; @@ -262,7 +258,7 @@ namespace ufo Weight.back().push_back(mode.Weight); } } - Hdf5File(filename).write(Qpoint, "/Qpoint") + Hdf5file{}.open_for_write(filename).write(Qpoint, "/Qpoint") .write(Source, "/Source") .write(Frequency, "/Frequency") .write(Weight, "/Weight");