fix hdf5 read/write bug

This commit is contained in:
陈浩南 2023-10-12 12:11:44 +08:00
parent 7cf384bf6c
commit 9721976e4c
3 changed files with 20 additions and 11 deletions

View File

@ -104,23 +104,32 @@ namespace ufo
return output; return output;
} }
class Hdf5File class Hdf5file
{ {
public: public:
inline Hdf5File(std::string filename) : File_(filename, HighFive::File::ReadWrite inline Hdf5file& open_for_read(std::string filename)
| HighFive::File::Create | HighFive::File::Truncate) {}
template <typename T> inline Hdf5File& read(T& object, std::string name)
{ {
object = File_.getDataSet(name).read<std::remove_cvref_t<decltype(object)>>(); File_ = HighFive::File(filename, HighFive::File::ReadOnly);
return *this; return *this;
} }
template <typename T> 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 <typename T> inline Hdf5file& read(T& object, std::string name)
{
object = File_->getDataSet(name).read<std::remove_cvref_t<decltype(object)>>();
return *this;
}
template <typename T> inline Hdf5file& write(const T& object, std::string name)
{
File_->createDataSet(name, object);
return *this; return *this;
} }
protected: protected:
HighFive::File File_; std::optional<HighFive::File> File_;
}; };
}; };
} }

View File

@ -60,7 +60,7 @@ namespace ufo
{ {
std::vector resolution{ Resolution.first, Resolution.second }; std::vector resolution{ Resolution.first, Resolution.second };
std::vector range{ Range.first, Range.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(XTicks, "XTicks")
.write(YTicks, "YTicks") .write(YTicks, "YTicks")
.write(resolution, "Resolution") .write(resolution, "Resolution")

View File

@ -135,7 +135,7 @@ namespace ufo
{ {
std::vector<std::vector<std::vector<double>>> frequency, path; std::vector<std::vector<std::vector<double>>> frequency, path;
std::vector<std::vector<std::vector<std::vector<PhonopyComplex>>>> eigenvector_vector; std::vector<std::vector<std::vector<std::vector<PhonopyComplex>>>> eigenvector_vector;
Hdf5File(QpointDataInputFile.FileName).read(frequency, "/frequency") Hdf5file{}.open_for_read(QpointDataInputFile.FileName).read(frequency, "/frequency")
.read(eigenvector_vector, "/eigenvector") .read(eigenvector_vector, "/eigenvector")
.read(path, "/path"); .read(path, "/path");
std::vector size = { frequency.size(), frequency[0].size(), frequency[0][0].size() }; std::vector size = { frequency.size(), frequency[0].size(), frequency[0][0].size() };
@ -247,7 +247,7 @@ namespace ufo
Weight.back().push_back(mode.Weight); Weight.back().push_back(mode.Weight);
} }
} }
Hdf5File(filename).write(Qpoint, "/Qpoint") Hdf5file{}.open_for_write(filename).write(Qpoint, "/Qpoint")
.write(Source, "/Source") .write(Source, "/Source")
.write(Frequency, "/Frequency") .write(Frequency, "/Frequency")
.write(Weight, "/Weight"); .write(Weight, "/Weight");