11#include <LatticeModule.h>
24 const typename DSCL<dim>::LatticeType &
A,
25 const typename DSCL<dim>::LatticeType &
B,
54 MatrixInt
M(MatrixInt::Identity());
55 MatrixInt
N(MatrixInt::Identity());
56 for (
int i = 0;
i <
dim; ++
i)
58 const IntValueType &dii = sd.matrixD()(
i,
i);
59 M(
i,
i) = dii / rm.gcd(rm.sigma, dii);
60 N(
i,
i) = rm.sigma / rm.gcd(rm.sigma, dii);
63 const MatrixDimD D1 =
A.latticeBasis * sd.matrixX().template cast<double>() *
N.template cast<double>().inverse();
64 const MatrixDimD D2 =
B.latticeBasis * sd.matrixV().template cast<double>() *
M.template cast<double>().inverse();
65 assert((D1 - D2).norm() < FLT_EPSILON &&
"DSCL calculation failed.");
73 return 0.5 * (D1 + D2);
80 const typename DSCL<dim>::LatticeType& B_in,
81 const bool& useRLLL) :
83 ,
Lattice<dim>(getLatticeBasis(*this,A_in,B_in,useRLLL),MatrixDimD::Identity())
91 assert((tempA - tempA.array().round().matrix()).norm() < FLT_EPSILON &&
"A is not a multiple of DSCL");
94 assert((tempB - tempB.array().round().matrix()).norm() < FLT_EPSILON &&
"B is not a multiple of DSCL");
DSCL(const LatticeType &A_in, const LatticeType &B_in, const bool &useRLLL=true)
const MatrixDimD latticeBasis
Lattice(const MatrixDimD &A, const MatrixDimD &Q)
const MatrixDimD reciprocalBasis
const MatrixType & reducedBasis() const
initial point of the source segment B
function infiniteDisplacement syms Ax Ay Az Bx By Bz qx qy qz u L x y z real A
LatticeTransitionMatrix(const LatticeType &A_in, const LatticeType &B_in)