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;
}
class Hdf5File
class Hdf5file
{
public:
inline Hdf5File(std::string filename) : File_(filename, HighFive::File::ReadWrite
| HighFive::File::Create | HighFive::File::Truncate) {}
template <typename T> inline Hdf5File& read(T& object, std::string name)
inline Hdf5file& open_for_read(std::string filename)
{
object = File_.getDataSet(name).read<std::remove_cvref_t<decltype(object)>>();
File_ = HighFive::File(filename, HighFive::File::ReadOnly);
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;
}
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 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")

View File

@ -135,7 +135,7 @@ namespace ufo
{
std::vector<std::vector<std::vector<double>>> frequency, path;
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(path, "/path");
std::vector size = { frequency.size(), frequency[0].size(), frequency[0][0].size() };
@ -247,7 +247,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");