直接使用系数的平方而不开方

This commit is contained in:
2023-09-08 08:57:10 +08:00
parent 9fd7d95735
commit 29ee854c75
3 changed files with 60 additions and 2 deletions

2
.gitignore vendored
View File

@@ -1,5 +1,7 @@
.vscode .vscode
.direnv .direnv
test/*.yaml test/*.yaml
test/*.dat
main main
plot
out.yaml out.yaml

View File

@@ -149,10 +149,10 @@ int main(int argc, const char** argv)
i_of_basis_in_primary_cell++ i_of_basis_in_primary_cell++
) )
coefficient_at_mode[i_of_unfolded_qpoint] += coefficient_at_mode[i_of_unfolded_qpoint] +=
std::sqrt(( (
basis[i_of_unfolded_qpoint][i_of_basis_in_primary_cell].transpose() basis[i_of_unfolded_qpoint][i_of_basis_in_primary_cell].transpose()
* input.QPointData[i_of_folded_qpoint].ModeData[i_of_mode].AtomMovement * input.QPointData[i_of_folded_qpoint].ModeData[i_of_mode].AtomMovement
).array().abs2().sum()); ).array().abs2().sum();
// 归一化 // 归一化
auto sum = std::accumulate(coefficient_at_mode.begin(), coefficient_at_mode.end(), 0.); auto sum = std::accumulate(coefficient_at_mode.begin(), coefficient_at_mode.end(), 0.);

56
plot.cpp Normal file
View File

@@ -0,0 +1,56 @@
# include <iostream>
# include <array>
# include <numbers>
# include <numeric>
# include <fstream>
# include <yaml-cpp/yaml.h>
using namespace std::literals;
// 一个临时的程序, 用于将数据导出画图
struct Output
{
struct QPointDataType_
{
std::vector<double> QPoint;
struct ModeDataType_
{
double Frequency;
double Weight;
};
std::vector<ModeDataType_> ModeData;
};
std::vector<QPointDataType_> QPointData;
};
int main()
{
YAML::Node root = YAML::LoadFile("out.yaml");
Output output;
output.QPointData.resize(root["QPointData"].size());
for (int i = 0; i < root["QPointData"].size(); i++)
{
output.QPointData[i].QPoint = root["QPointData"][i]["QPoint"].as<std::vector<double>>();
output.QPointData[i].ModeData.resize(root["QPointData"][i]["ModeData"].size());
for (int j = 0; j < root["QPointData"][i]["ModeData"].size(); j++)
{
output.QPointData[i].ModeData[j].Frequency
= root["QPointData"][i]["ModeData"][j]["Frequency"].as<double>();
output.QPointData[i].ModeData[j].Weight
= root["QPointData"][i]["ModeData"][j]["Weight"].as<double>();
}
}
std::ofstream os("out.dat");
for (int i = 0; i < output.QPointData.size(); i++)
for (int j = 0; j < output.QPointData[i].ModeData.size(); j++)
{
if (output.QPointData[i].QPoint[1] < 1e-3 && output.QPointData[i].QPoint[2] < 1e-3)
{
os << output.QPointData[i].QPoint[0] << "\t"
<< output.QPointData[i].ModeData[j].Frequency << "\t"
<< output.QPointData[i].ModeData[j].Weight << "\n";
}
}
}