13 const double& bhalfMax):
16 gbCslVectors(gbCslVectors),
17 bShiftPairs(getbShiftPairs(gb,gbCslVectors,bhalfMax))
19 std::cout <<
"--------------------GBShifts class construction ---------------------------" << std::endl;
20 std::cout <<
"GB CSL vectors = " << std::endl;
22 std::cout << elem.cartesian().transpose() << std::endl;
23 std::cout << std::endl;
25 std::cout <<
"GB reciprocal CSL vectors = " << std::endl;
26 Eigen::Matrix<double,dim,dim-1> gbCslBasis;
27 for(
int i=0; i<dim-1; ++i)
29 Eigen::Matrix<double,dim,dim-1> gbCslReciprocalBasis= gbCslBasis.completeOrthogonalDecomposition().pseudoInverse().transpose();
30 std::cout << gbCslReciprocalBasis.transpose() << std::endl;
31 std::cout << std::endl;
33 std::cout <<
"Maximum b < " << 2*bhalfMax*
gb.bc.A.latticeBasis.col(0).norm() << std::endl;
34 std::cout << std::endl;
40 normal=
gbCslVectors[0].cross().cartesian().normalized();
42 std::cout <<
"Exploring the following translation-shift pairs:" << std::endl;
45 std::cout <<
"b = " << b.cartesian().transpose();
46 std::cout <<
"; s = " << s.transpose() << std::endl;
48 if (abs(s.dot(normal)) > 1e-6)
49 throw std::runtime_error(
"GBShifts construction failed - shifts are not parallel to the GB.");
51 Eigen::MatrixXd shiftCoordinates= gbCslReciprocalBasis.transpose()*s;
52 if( (shiftCoordinates.array() < -FLT_EPSILON).any() || (shiftCoordinates.array() > 1+FLT_EPSILON).any()) {
53 std::cout <<
"Shift coordinates = " << shiftCoordinates.transpose() << std::endl;
54 throw std::runtime_error(
"GB shifts are not in the area spanned by the GB CSL vectors.");
58 std::cout <<
"----------------------------" << std::endl;
59 std::cout << std::endl;
66 const double& bhalfMax)
68 std::vector<std::pair<LatticeVector<dim>,
VectorDimD>> output;
70 assert(gbCslVectors.size()==dim-1);
71 auto nC= gb.
bc.getReciprocalLatticeDirectionInC(gb.
nB.reciprocalLatticeVector());
74 auto gbPlaneParallelCslBasis= gb.
bc.csl.planeParallelLatticeBasis(nC,
true);
75 std::vector<LatticeVector<dim>> cslSubLatticeVectors;
76 cslSubLatticeVectors.push_back(gbPlaneParallelCslBasis[0].latticeVector());
77 cslSubLatticeVectors.push_back(gbCslVectors[0]);
78 cslSubLatticeVectors.push_back(gbCslVectors[1]);
79 auto cslPoints= gb.
bc.csl.box(cslSubLatticeVectors);
83 auto planeParallelBasisT= gb.
T.planeParallelLatticeBasis(nT,
true);
84 std::vector<LatticeVector<dim>> latticeVectorsT;
86 double latticeConstant= gb.
bc.A.latticeBasis.col(0).norm();
87 for(
int i=0; i<dim; ++i)
91 int factor= floor(35*bhalfMax*latticeConstant/planeParallelBasisT[i].latticeVector().cartesian().norm()+FLT_EPSILON);
92 factor= (factor>0 ? factor : 1);
93 latticeVectorsT.push_back(factor * planeParallelBasisT[i].latticeVector());
95 auto points= gb.
T.box(latticeVectorsT,
"T.txt");
99 shiftT << -0.5, -0.5, -0.5;
100 shiftC << -0.5, -FLT_EPSILON, -FLT_EPSILON;
101 for(
auto& point : points) {
105 if (point.cartesian().norm() > bhalfMax*gb.
bc.A.latticeBasis.col(0).norm())
108 for(
const auto& cslPoint : cslPoints) {
110 if (gb.
bc.getLatticeVectorInA(cslPoint).dot(gb.
nA)!=0)
continue;
111 VectorDimD cslShiftCentered = cslShift.cartesian() + cslPoint.cartesian() - point.cartesian() / 2;
113 output.push_back(std::make_pair(point, cslShiftCentered));