一些小修改,应该不影响结果

This commit is contained in:
2026-01-08 11:30:27 +08:00
parent 19736049c9
commit cb7dd54e7f

View File

@@ -11,15 +11,17 @@ void ufo::fold(std::string config_file)
auto fold = []
(
Eigen::Vector3d qpoint_in_reciprocal_primitive_cell_by_reciprocal_primitive_cell,
Eigen::Matrix3d super_cell_transformation
Eigen::Matrix3d super_cell_deformation,
Eigen::Vector3i super_cell_multiplier,
Eigen::Vector3d qpoint_in_reciprocal_primitive_cell_by_reciprocal_primitive_cell
) -> Eigen::Vector3d
{
/*
首先需要将 q 点坐标的单位转换为 ModifiedSuperCell 的格矢,可知:
QpointByReciprocalModifiedSuperCell = SuperCellMultiplier * QpointByReciprocalPrimitiveCell;
QpointByReciprocalModifiedSuperCell =
SuperCellMultiplier.cast<double>().asDiagonal() * QpointByReciprocalPrimitiveCell;
接下来考虑将 q 点坐标的单位转换为 SuperCell 的格矢
ModifiedSuperCell = SuperCellMultiplier * PrimativeCell;
ModifiedSuperCell = SuperCellMultiplier.transpose() * PrimativeCell;
SuperCell = SuperCellDeformation * ModifiedSuperCell;
ReciprocalModifiedSuperCell = ModifiedSuperCell.inverse().transpose();
ReciprocalSuperCell = SuperCell.inverse().transpose();
@@ -28,17 +30,20 @@ void ufo::fold(std::string config_file)
整理可以得到:
QpointByReciprocalSuperCell = SuperCellDeformation * QpointByReciprocalModifiedSuperCell;
两个式子结合,可以得到:
QpointByReciprocalSuperCell = SuperCellDeformation * SuperCellMultiplier * QpointByReciprocalPrimitiveCell;
QpointByReciprocalSuperCell =
SuperCellDeformation * SuperCellMultiplier.cast<double>().asDiagonal() * QpointByReciprocalPrimitiveCell;
*/
auto qpoint_by_reciprocal_super_cell =
auto qpoint_in_reciprocal_primitive_cell_by_reciprocal_super_cell =
(
super_cell_transformation * qpoint_in_reciprocal_primitive_cell_by_reciprocal_primitive_cell
super_cell_deformation * super_cell_multiplier.cast<double>().asDiagonal()
* qpoint_in_reciprocal_primitive_cell_by_reciprocal_primitive_cell
).eval();
/*
到目前为止,我们还没有移动过 q 点的坐标。现在,我们将它移动整数个 ReciprocalSuperCell直到它落在超胞的倒格子中。
这等价于直接取 QpointByReciprocalSuperCell - QpointByReciprocalSuperCell.floor()。
*/
return (qpoint_by_reciprocal_super_cell.array() - qpoint_by_reciprocal_super_cell.array().floor()).matrix();
return (qpoint_in_reciprocal_primitive_cell_by_reciprocal_super_cell.array()
- qpoint_in_reciprocal_primitive_cell_by_reciprocal_super_cell.array().floor()).matrix();
};
biu::Logger::Guard log(config_file);
@@ -46,7 +51,6 @@ void ufo::fold(std::string config_file)
for (const auto& qpoint : input.Qpoints) log.info("{} -> {}"_f
(
qpoint,
fold(qpoint,
input.SuperCellDeformation * input.SuperCellMultiplier.cast<double>().asDiagonal())
fold(input.SuperCellDeformation, input.SuperCellMultiplier, qpoint)
));
}