plot 完成模式的查找

This commit is contained in:
2023-09-26 18:54:11 +08:00
parent 312dbd0529
commit e042ae4c15
5 changed files with 127 additions and 93 deletions

View File

@@ -29,7 +29,9 @@ HIGHFIVE_REGISTER_TYPE(PhonopyComplex, create_compound_complex)
namespace Eigen
{
constexpr inline auto serialize(auto & archive, Eigen::Matrix3d& matrix)
{ return archive(std::span<double, 9>(matrix.data(), 9)); }
{ return archive(std::span(matrix.data(), matrix.size())); }
constexpr inline auto serialize(auto & archive, Eigen::Vector3d& vector)
{ return archive(std::span(vector.data(), vector.size())); }
}
// 在相位中, 约定为使用 $\exp (2 \pi i \vec{q} \cdot \vec{r})$ 来表示原子的运动状态
@@ -56,6 +58,19 @@ struct Input
std::optional<Eigen::Matrix<double, 3, 3>> SuperCellDeformation;
// 在单胞内取几个平面波的基矢
Eigen::Vector<unsigned, 3> PrimativeCellBasisNumber;
struct InputOutputFile_
{
std::string FileName;
std::string Format;
std::map<std::string, std::any> ExtraParameters;
};
// 从哪个文件读入 AtomPosition, 以及这个文件的格式, 格式可选值包括 "yaml"
InputOutputFile_ AtomPositionInputFile;
// 从哪个文件读入 QPointData, 以及这个文件的格式, 格式可选值包括 "yaml" 和 "hdf5"
InputOutputFile_ QPointDataInputFile;
// 超胞中原子的坐标,每行表示一个原子的坐标,单位为埃
Eigen::MatrixX3d AtomPosition;
// 关于各个 Q 点的数据
@@ -79,18 +94,6 @@ struct Input
};
std::vector<QPointDataType_> QPointData;
struct InputOutputFile_
{
std::string FileName;
std::string Format;
std::map<std::string, std::any> ExtraParameters;
};
// 从哪个文件读入 AtomPosition, 以及这个文件的格式, 格式可选值包括 "yaml"
InputOutputFile_ AtomPositionInputFile;
// 从哪个文件读入 QPointData, 以及这个文件的格式, 格式可选值包括 "yaml" 和 "hdf5"
InputOutputFile_ QPointDataInputFile;
// 输出到哪些文件, 以及使用怎样的格式, 格式可选值包括:
// yaml: 使用 yaml 格式输出
// yaml-human-readable: 使用 yaml 格式输出, 但是输出的结果更适合人类阅读, 包括合并相近的模式, 去除权重过小的模式, 限制输出的小数位数.
@@ -138,6 +141,8 @@ struct Output
void write(std::string filename, std::string format, unsigned percision = 10);
Output() = default;
Output(std::string filename);
using serialize = zpp::bits::members<1>;
};
concurrencpp::generator<std::pair<Eigen::Vector<unsigned, 3>, unsigned>>

View File

@@ -193,11 +193,20 @@ inline void Output::write(std::string filename, std::string format, unsigned per
else if (format == "zpp")
{
auto [data, out] = zpp::bits::data_out();
out(*this).or_throw();
std::basic_ofstream<std::byte>(filename, std::ios::binary)
<< std::basic_string_view{data.data(), data.size()};
}
}
inline Output::Output(std::string filename)
{
auto [data, in] = zpp::bits::data_in();
auto input = std::basic_ifstream<std::byte>(filename, std::ios::binary);
data.assign(std::istreambuf_iterator<std::byte>(input), {});
in(*this).or_throw();
}
inline concurrencpp::generator<std::pair<Eigen::Vector<unsigned, 3>, unsigned>>
triplet_sequence(Eigen::Vector<unsigned, 3> range)
{