直接使用系数的平方而不开方
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,5 +1,7 @@
|
||||
.vscode
|
||||
.direnv
|
||||
test/*.yaml
|
||||
test/*.dat
|
||||
main
|
||||
plot
|
||||
out.yaml
|
||||
|
||||
4
main.cpp
4
main.cpp
@@ -149,10 +149,10 @@ int main(int argc, const char** argv)
|
||||
i_of_basis_in_primary_cell++
|
||||
)
|
||||
coefficient_at_mode[i_of_unfolded_qpoint] +=
|
||||
std::sqrt((
|
||||
(
|
||||
basis[i_of_unfolded_qpoint][i_of_basis_in_primary_cell].transpose()
|
||||
* 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.);
|
||||
|
||||
56
plot.cpp
Normal file
56
plot.cpp
Normal 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";
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user