Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
Lattices_NEW/Lattice.cpp
Go to the documentation of this file.
1/* This file is part of model.
2 *
3 * MoDELib is distributed without any warranty under the MIT License.
4 */
5
6
7#ifndef model_Lattice_cpp_
8#define model_Lattice_cpp_
9
10#include <Eigen/Eigenvalues>
11
12#include <LatticeModule.h>
13#include <GramMatrix.h>
14#include <iomanip>
15
16namespace model
17{
18
19
20 /**********************************************************************/
21 template <int dim>
23 {
24
25 // Check that Q is orthogonal
26 const MatrixDimD QQT(Q * Q.transpose());
27 const double QQTerror((QQT - MatrixDimD::Identity()).norm());
28 if (QQTerror > 10.0 * DBL_EPSILON * dim * dim)
29 {
30 throw std::runtime_error("The rotation matrix Q is not orthogonal: norm(Q*Q^T-I)="+std::to_string(QQTerror)+"\n");
31 }
32
33 const double Qdet(Q.determinant());
34 if (std::fabs(Q.determinant() - 1.0)>FLT_EPSILON)
35 {
36 throw std::runtime_error("The rotation matrix is not proper: det(Q)="+std::to_string(Qdet)+"\n");
37 }
38
39 return Q * A;
40 }
41
42
43 /**********************************************************************/
44 /**********************************************************************/
45 template <int dim>
47 /* init */ latticeBasis(getLatticeBasis(A,Q))
48 /* init */,reciprocalBasis(latticeBasis.inverse().transpose())
49 /* init */,C2G(Q)
50 {
51
52 }
53
54 /**********************************************************************/
55 template <int dim>
56 LatticeDirection<dim> Lattice<dim>::latticeDirection(const VectorDimD &d) const
57 {
58 const VectorDimD nd(reciprocalBasis.transpose()*d);
59 const LatticeVector<dim> temp(LatticeCore<dim>::rationalApproximation(nd),*this);
60 const GramMatrix<double,2> G(std::array<VectorDimD,2>{temp.cartesian().normalized(),d.normalized()});
61 const double crossNorm(sqrt(G.determinant()));
62 if(crossNorm>FLT_EPSILON)
63 {
64 std::cout<<"input direction="<<d.normalized().transpose()<<std::endl;
65 std::cout<<"lattice direction="<<temp.cartesian().normalized().transpose()<<std::endl;
66 std::cout<<"cross product norm="<<std::setprecision(15)<<std::scientific<<crossNorm<<std::endl;
67 throw std::runtime_error("LATTICE DIRECTION NOT FOUND\n");
68 }
69 return LatticeDirection<dim>(temp);
70 }
71
72 /**********************************************************************/
73 template <int dim>
74 ReciprocalLatticeDirection<dim> Lattice<dim>::reciprocalLatticeDirection(const VectorDimD &d) const
75 {
76 const VectorDimD nd(latticeBasis.transpose()*d);
77 const ReciprocalLatticeVector<dim> temp(LatticeCore<dim>::rationalApproximation(nd),*this);
78 const GramMatrix<double,2> G(std::array<VectorDimD,2>{temp.cartesian().normalized(),d.normalized()});
79 const double crossNorm(sqrt(G.determinant()));
80 if(crossNorm>FLT_EPSILON)
81 {
82 std::cout<<"input direction="<<std::setprecision(15)<<std::scientific<<d.normalized().transpose()<<std::endl;
83 std::cout<<"reciprocal lattice direction="<<std::setprecision(15)<<std::scientific<<temp.cartesian().normalized().transpose()<<std::endl;
84 std::cout<<"cross product norm="<<std::setprecision(15)<<std::scientific<<crossNorm<<std::endl;
85 throw std::runtime_error("RECIPROCAL LATTICE DIRECTION NOT FOUND\n");
86 }
87 return ReciprocalLatticeDirection<dim>(temp);
88 }
89
90 /**********************************************************************/
91 template <int dim>
92 RationalLatticeDirection<dim> Lattice<dim>::rationalLatticeDirection(const VectorDimD &d,
93 const typename BestRationalApproximation::LongIntType &maxDen ) const
94 {
95 const LatticeDirection<dim> ld(latticeDirection(d));
96 const BestRationalApproximation bra(d.norm() / ld.cartesian().norm(), maxDen);
97 const Rational rat(bra.num, bra.den);
98 const RationalLatticeDirection<dim> rld(rat, ld);
99 if ((rld.cartesian() - d).squaredNorm() > FLT_EPSILON)
100 {
101 std::cout << "input vector=" << d.transpose() << std::endl;
102 std::cout << "lattice direction=" << ld.cartesian().transpose() << std::endl;
103 std::cout << "rational=" << rat << std::endl;
104 std::cout << "d.norm()/ld.cartesian().norm()=" << d.norm() / ld.norm() << std::endl;
105 throw std::runtime_error("Rational Lattice DirectionType NOT FOUND\n");
106 }
107 return rld;
108 }
109
110 /**********************************************************************/
111 template <int dim>
112 LatticeVector<dim> Lattice<dim>::latticeVector(const VectorDimD &p) const
113 {
114 return LatticeVector<dim>(p, *this);
115 }
116
117 /**********************************************************************/
118 template <int dim>
119 ReciprocalLatticeVector<dim> Lattice<dim>::reciprocalLatticeVector(const VectorDimD &p) const
120 {
121 return ReciprocalLatticeVector<dim>(p, *this);
122 }
123
124
125
126 template class Lattice<1>;
127 template class Lattice<2>;
128 template class Lattice<3>;
129}
130#endif
Eigen::Matrix< double, dim, dim > MatrixDimD
Lattice(const MatrixDimD &A, const MatrixDimD &Q)
static MatrixDimD getLatticeBasis(const MatrixDimD &A, const MatrixDimD &Q)
function infiniteDisplacement syms Ax Ay Az Bx By Bz qx qy qz u L x y z real A
Q
vertex p[3]
vertex temp