oILAB
Loading...
Searching...
No Matches
GbShifts.cpp
Go to the documentation of this file.
1//
2// Created by Nikhil Chandra Admal on 2/4/24.
3//
4#include <GbShifts.h>
5#include <randomInteger.h>
6
7namespace gbLAB
8{
9 template<int dim>
12 const std::vector<LatticeVector<dim>>& gbCslVectors,
13 const double& bhalfMax):
14 gb(gb),
15 axis(axis),
16 gbCslVectors(gbCslVectors),
17 bShiftPairs(getbShiftPairs(gb,gbCslVectors,bhalfMax))
18 {
19 std::cout << "--------------------GBShifts class construction ---------------------------" << std::endl;
20 std::cout << "GB CSL vectors = " << std::endl;
21 for(const auto& elem : gbCslVectors)
22 std::cout << elem.cartesian().transpose() << std::endl;
23 std::cout << std::endl;
24
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)
28 gbCslBasis.col(i)= gbCslVectors[i].cartesian();
29 Eigen::Matrix<double,dim,dim-1> gbCslReciprocalBasis= gbCslBasis.completeOrthogonalDecomposition().pseudoInverse().transpose();
30 std::cout << gbCslReciprocalBasis.transpose() << std::endl;
31 std::cout << std::endl;
32
33 std::cout << "Maximum b < " << 2*bhalfMax*gb.bc.A.latticeBasis.col(0).norm() << std::endl;
34 std::cout << std::endl;
35
36 VectorDimD normal;
37 if (dim==3)
38 normal= gbCslVectors[0].cross(gbCslVectors[1]).cartesian().normalized();
39 else
40 normal= gbCslVectors[0].cross().cartesian().normalized();
41
42 std::cout << "Exploring the following translation-shift pairs:" << std::endl;
43 for(const auto& [b,s]: bShiftPairs)
44 {
45 std::cout << "b = " << b.cartesian().transpose();
46 std::cout << "; s = " << s.transpose() << std::endl;
47 //if (abs(s.dot(normal)) > FLT_EPSILON)
48 if (abs(s.dot(normal)) > 1e-6)
49 throw std::runtime_error("GBShifts construction failed - shifts are not parallel to the GB.");
50
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.");
55 }
56
57 }
58 std::cout << "----------------------------" << std::endl;
59 std::cout << std::endl;
60
61 }
62
63 template<int dim>
64 std::vector<std::pair<LatticeVector<dim>, typename GbShifts<dim>::VectorDimD>> GbShifts<dim>::getbShiftPairs(const Gb<dim>& gb,
65 const std::vector<LatticeVector<dim>>& gbCslVectors,
66 const double& bhalfMax)
67 {
68 std::vector<std::pair<LatticeVector<dim>, VectorDimD>> output;
69
70 assert(gbCslVectors.size()==dim-1);
71 auto nC= gb.bc.getReciprocalLatticeDirectionInC(gb.nB.reciprocalLatticeVector());
72
73 // form a CSL cell for modulo operations
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);
80
81 // form a T lattice cell for exploring translations
82 auto nT= gb.getReciprocalLatticeDirectionInT(gb.bc.getReciprocalLatticeDirectionInD(gb.nA.reciprocalLatticeVector()).reciprocalLatticeVector());
83 auto planeParallelBasisT= gb.T.planeParallelLatticeBasis(nT,true);
84 std::vector<LatticeVector<dim>> latticeVectorsT;
85
86 double latticeConstant= gb.bc.A.latticeBasis.col(0).norm();
87 for(int i=0; i<dim; ++i)
88 {
89 // scale the lattice vectors of T based on the bhalfMax parameter
90 //int factor= floor(bhalfMax*latticeConstant/planeParallelBasisT[i].latticeVector().cartesian().norm()+FLT_EPSILON);
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());
94 }
95 auto points= gb.T.box(latticeVectorsT,"T.txt");
96
97
98 VectorDimD shiftT, shiftC;
99 shiftT << -0.5, -0.5, -0.5;
100 shiftC << -0.5, -FLT_EPSILON, -FLT_EPSILON;
101 for(auto& point : points) {
102 //if (point.cartesian().norm() > bhalfMax*gb.bc.A.latticeBasis.col(0).norm())
103 // continue;
104 LatticeVector<dim>::modulo(point, latticeVectorsT, shiftT);
105 if (point.cartesian().norm() > bhalfMax*gb.bc.A.latticeBasis.col(0).norm())
106 continue;
107 auto cslShift = LatticeVector<dim>((gb.bc.LambdaA * gb.basisT * point).eval(), gb.bc.dscl);
108 for(const auto& cslPoint : cslPoints) {
109 // only for those CSL points on the boundary
110 if (gb.bc.getLatticeVectorInA(cslPoint).dot(gb.nA)!=0) continue;
111 VectorDimD cslShiftCentered = cslShift.cartesian() + cslPoint.cartesian() - point.cartesian() / 2;
112 LatticeVector<dim>::modulo(cslShiftCentered, cslSubLatticeVectors, shiftC);
113 output.push_back(std::make_pair(point, cslShiftCentered));
114 }
115 }
116 return output;
117 }
118 /*
119 template<int dim>
120 std::vector<LatticeVector<dim>> GbShifts<dim>::getGbCslVectors(const Gb<dim>& gb, const ReciprocalLatticeVector<dim>& axis)
121 {
122 std::vector<LatticeVector<dim>> output;
123 LatticeVector<dim> axisA(gb.bc.A.latticeDirection(axis.cartesian()).latticeVector());
124 LatticeVector<dim> axisC(gb.bc.getLatticeDirectionInC(axisA).latticeVector());
125 for(int i=0; i<dim-1; ++i) {
126 if (i==0) output.push_back(gb.getPeriodVector(axis));
127 if (i==1) output.push_back(axisC);
128 }
129 return output;
130 }
131 */
132
133 //template class GbShifts<2>;
134 template class GbShifts<3>;
135
136}
Definition Gb.h:16
const ReciprocalLatticeDirection< dim > nA
Definition Gb.h:33
ReciprocalLatticeDirection< dim > getReciprocalLatticeDirectionInT(const ReciprocalLatticeVector< dim > &v) const
Definition Gb.cpp:223
const MatrixDimI basisT
Definition Gb.h:41
const Lattice< dim > T
Definition Gb.h:39
const BiCrystal< dim > & bc
Definition Gb.h:29
const ReciprocalLatticeDirection< dim > nB
Definition Gb.h:37
typename LatticeCore< dim >::VectorDimD VectorDimD
Definition GbShifts.h:15
std::vector< std::pair< LatticeVector< dim >, VectorDimD > > bShiftPairs
Definition GbShifts.h:27
const Gb< dim > & gb
Definition GbShifts.h:24
GbShifts(const Gb< dim > &gb, const ReciprocalLatticeVector< dim > &axis, const std::vector< LatticeVector< dim > > &gbCslVectors, const double &bhalfMax=1)
Definition GbShifts.cpp:10
const std::vector< LatticeVector< dim > > gbCslVectors
Definition GbShifts.h:26
static std::vector< std::pair< LatticeVector< dim >, VectorDimD > > getbShiftPairs(const Gb< dim > &gb, const std::vector< LatticeVector< dim > > &gbCslVectors, const double &bhalfMax)
Definition GbShifts.cpp:64
LatticeVector class.
static std::enable_if< dm==2, void >::type modulo(LatticeVector< dim > &input, const std::vector< LatticeVector< dim > > &basis, const VectorDimD &shift=VectorDimD::Zero())