diff --git a/include/ufo/unfold.hpp b/include/ufo/unfold.hpp index 6c21285..edf7d84 100644 --- a/include/ufo/unfold.hpp +++ b/include/ufo/unfold.hpp @@ -159,7 +159,6 @@ namespace ufo OutputType construct_output ( - const decltype(InputType::PrimativeCell)& primative_cell, const decltype(InputType::SuperCellMultiplier)& super_cell_multiplier, const decltype(InputType::SuperCellDeformation)& super_cell_deformation, const std::vector().asDiagonal() * primative_cell).inverse().transpose(); - // sub qpoint 的坐标,单位为埃^-1 - auto sub_qpoint = ((xyz_of_diff_of_sub_qpoint_by_reciprocal_modified_super_cell.cast() - + qpoint_by_reciprocal_modified_super_cell_in_modified_reciprocal_super_cell) - .transpose() * reciprocal_modified_super_cell).transpose(); - // 将坐标转换为相对于单胞的倒格矢的坐标并写入 - // 由 sub_qpoint.transpose() = sub_qpoint_by_reciprocal_primative_cell.transpose() - // * PrimativeCell.transpose().inverse() - // 得到 sub_qpoint_by_reciprocal_primative_cell = PrimativeCell * sub_qpoint - _.QPoint = primative_cell * sub_qpoint; + /* + SubQpointByReciprocalModifiedSuperCell = XyzOfDiffOfSubQpointByReciprocalModifiedSuperCell + + QpointInReciprocalModifiedSuperCellByReciprocalModifiedSuperCell; + SubQpoint = SubQpointByReciprocalModifiedSuperCell.transpose() * ReciprocalModifiedSuperCell; + SubQpoint = SubQpointByReciprocalPrimativeCell.transpose() * ReciprocalPrimativeCell; + ReciprocalModifiedSuperCell = ModifiedSuperCell.inverse().transpose(); + ReciprocalPrimativeCell = PrimativeCell.inverse().transpose(); + ModifiedSuperCell = SuperCellMultiplier.asDiagonal() * PrimativeCell; + 整理可以得到: + SubQpointByReciprocalPrimativeCell = SuperCellMultiplier.asDiagonal().inverse() * + (XyzOfDiffOfSubQpointByReciprocalModifiedSuperCell + + QpointInReciprocalModifiedSuperCellByReciprocalModifiedSuperCell); + */ + _.QPoint = super_cell_multiplier.cast().cwiseInverse().asDiagonal() + * (xyz_of_diff_of_sub_qpoint_by_reciprocal_modified_super_cell.cast() + + qpoint_by_reciprocal_modified_super_cell_in_reciprocal_modified_super_cell); _.Source = qpoint[i_of_qpoint]; _.SourceIndex_ = i_of_qpoint; for (unsigned i_of_mode = 0; i_of_mode < frequency[i_of_qpoint].size(); i_of_mode++)