This examples demonstrates the construction of a grain boundary in a 3D bicrystal. We will construct a [111] tilt \(\Sigma 273\) - STGB (5 6 -11) and an ATGB (17 23 -40)(145 136 -281).
#include "../../include/IO/TextFileParser.h"
#include "../../include/Lattices/LatticeModule.h"
#include <numbers>
const int dim = 3;
Eigen::Matrix3d A;
A << 0.0, 0.5, 0.5, 0.5, 0.0, 0.5, 0.5, 0.5, 0.0;
Eigen::Vector3d axis;
axis << 1, 1, 1;
double angle = 6.0089831977661480877 * std::numbers::pi / 180;
Eigen::AngleAxisd rotation(angle, axis.normalized());
try {
std::cout <<
"Sigma = " << bc.
sigma << std::endl;
normal << 17, 23, -40;
std::cout << "Miller indices w.r.t A: ";
std::cout << gb.
nA << std::endl;
std::cout << "Miller indices w.r.t B: ";
std::cout << gb.
nB << std::endl;
rv.
cross(gb.
nA.reciprocalLatticeVector()).latticeVector());
auto basis = bc.
csl.planeParallelLatticeBasis(
gb.
bc.getReciprocalLatticeDirectionInC(gb.
nA.reciprocalLatticeVector()),
true);
bc.
A.latticeDirection(rv.
cartesian()).latticeVector());
std::vector<LatticeVector<dim>> boxVectors;
boxVectors.push_back(nonParallelC);
boxVectors.push_back(periodC);
boxVectors.push_back(vectorAlongAxisC);
std::cout << "Input box vectors = " << std::endl;
std::cout << boxVectors[0].cartesian().transpose() << std::endl;
std::cout << boxVectors[1].cartesian().transpose() << std::endl;
std::cout << boxVectors[2].cartesian().transpose() << std::endl;
gb.
box(boxVectors, 0.5, 2,
"gb.txt",
true);
std::cout << "Output box vectors = " << std::endl;
std::cout << boxVectors[0].cartesian().transpose() << std::endl;
std::cout << boxVectors[1].cartesian().transpose() << std::endl;
std::cout << boxVectors[2].cartesian().transpose() << std::endl;
} catch (std::runtime_error &e) {
std::cout << e.what() << std::endl;
return -1;
}
return 0;
}
LatticeDirection< dim > getLatticeDirectionInC(const LatticeVector< dim > &v) const
const Lattice< dim > csl
CSL lattice .
const ReciprocalLatticeDirection< dim > nB
const ReciprocalLatticeDirection< dim > nA
const BiCrystal< dim > & bc
std::enable_if< dm==2||dm==3, std::vector< LatticeVector< dim > > >::type box(std::vector< LatticeVector< dim > > &boxVectors, const double &orthogonality, const int &dsclFactor, std::string filename="", bool orient=false) const
ReciprocalLatticeDirection< dim > reciprocalLatticeDirection(const VectorDimD &d, const double &tol=FLT_EPSILON) const
Returns the reciprocal lattice direction along a vector.
VectorDimD cartesian() const
std::enable_if< dm==2, LatticeDirection< dim > >::type cross(const ReciprocalLatticeVector< dim > &other) const
int main(int argc, char **argv)