12 const double &bhalfMax)
13 : gb(gb), axis(axis), gbCslVectors(gbCslVectors),
14 bShiftPairs(getbShiftPairs(gb, gbCslVectors, bhalfMax)) {
15 std::cout <<
"--------------------GBShifts class construction "
16 "---------------------------"
18 std::cout <<
"GB CSL vectors = " << std::endl;
20 std::cout << elem.cartesian().transpose() << std::endl;
21 std::cout << std::endl;
23 std::cout <<
"GB reciprocal CSL vectors = " << std::endl;
24 Eigen::Matrix<double, dim, dim - 1> gbCslBasis;
25 for (
int i = 0; i < dim - 1; ++i)
27 Eigen::Matrix<double, dim, dim - 1> gbCslReciprocalBasis =
28 gbCslBasis.completeOrthogonalDecomposition().pseudoInverse().transpose();
29 std::cout << gbCslReciprocalBasis.transpose() << std::endl;
30 std::cout << std::endl;
32 std::cout <<
"Maximum b < "
33 << 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;
44 std::cout <<
"b = " << b.cartesian().transpose();
45 std::cout <<
"; s = " << s.transpose() << std::endl;
47 if (abs(s.dot(normal)) > 1e-6)
48 throw std::runtime_error(
49 "GBShifts construction failed - shifts are not parallel to the GB.");
51 Eigen::MatrixXd shiftCoordinates = gbCslReciprocalBasis.transpose() * s;
52 if ((shiftCoordinates.array() < -FLT_EPSILON).any() ||
53 (shiftCoordinates.array() > 1 + FLT_EPSILON).any()) {
54 std::cout <<
"Shift coordinates = " << shiftCoordinates.transpose()
56 throw std::runtime_error(
57 "GB shifts are not in the area spanned by the GB CSL vectors.");
60 std::cout <<
"----------------------------" << std::endl;
61 std::cout << std::endl;
68 const double& bhalfMax)
70 std::vector<std::pair<LatticeVector<dim>,
VectorDimD>> output;
72 assert(gbCslVectors.size()==dim-1);
73 auto nC= gb.
bc.getReciprocalLatticeDirectionInC(gb.
nB.reciprocalLatticeVector());
76 auto gbPlaneParallelCslBasis= gb.
bc.csl.planeParallelLatticeBasis(nC,
true);
77 std::vector<LatticeVector<dim>> cslSubLatticeVectors;
78 cslSubLatticeVectors.push_back(gbPlaneParallelCslBasis[0].latticeVector());
79 cslSubLatticeVectors.push_back(gbCslVectors[0]);
80 cslSubLatticeVectors.push_back(gbCslVectors[1]);
81 auto cslPoints= gb.
bc.csl.box(cslSubLatticeVectors);
85 auto planeParallelBasisT= gb.
T.planeParallelLatticeBasis(nT,
true);
86 std::vector<LatticeVector<dim>> latticeVectorsT;
88 double latticeConstant= gb.
bc.A.latticeBasis.col(0).norm();
89 for(
int i=0; i<dim; ++i)
93 int factor= floor(35*bhalfMax*latticeConstant/planeParallelBasisT[i].latticeVector().cartesian().norm()+FLT_EPSILON);
94 factor= (factor>0 ? factor : 1);
95 latticeVectorsT.push_back(factor * planeParallelBasisT[i].latticeVector());
97 auto points= gb.
T.box(latticeVectorsT,
"T.txt");
101 shiftT << -0.5, -0.5, -0.5;
102 shiftC << -0.5, -FLT_EPSILON, -FLT_EPSILON;
103 for(
auto& point : points) {
107 if (point.cartesian().norm() > bhalfMax*gb.
bc.A.latticeBasis.col(0).norm())
110 for(
const auto& cslPoint : cslPoints) {
112 if (gb.
bc.getLatticeVectorInA(cslPoint).dot(gb.
nA)!=0)
continue;
113 VectorDimD cslShiftCentered = cslShift.cartesian() + cslPoint.cartesian() - point.cartesian() / 2;
115 output.push_back(std::make_pair(point, cslShiftCentered));