7#ifndef gbLAB_Lattice_h_
8#define gbLAB_Lattice_h_
10#include "../Math/BestRationalApproximation.h"
11#include "../Math/Farey.h"
12#include "../Math/RLLL.h"
13#include "../Math/Rational.h"
14#include "../Math/RationalApproximations.h"
15#include "../Utilities/StaticID.h"
16#include "../Utilities/range.h"
23#include <unordered_map>
32 static constexpr double roundTol = FLT_EPSILON;
61 const double &tol = FLT_EPSILON)
const;
79 const double &tol = FLT_EPSILON)
const;
92 std::vector<ReciprocalLatticeDirection<dim>>
94 const bool &useRLLL =
false)
const;
99 const double &magnitudeTol,
100 const double &directionTol = FLT_EPSILON)
const;
104 const double &magnitudeTol,
105 const double &directionTol = FLT_EPSILON)
const;
118 std::vector<LatticeDirection<dim>>
120 const bool &useRLLL =
false)
const;
139 template <
int dm = dim>
140 typename std::enable_if<dm == 3, std::vector<MatrixDimD>>::type
142 const double &maxDen = 100,
143 const int &N = 100)
const;
149 template <
int dm = dim>
150 typename std::enable_if<dm == 2, std::vector<MatrixDimD>>::type
152 const int &N = 30)
const;
177 template <
int dm = dim>
178 typename std::enable_if<dm == 2, std::vector<MatrixDimD>>::type
180 const double &maxStrain,
const int &maxDen = 50,
181 const int &N = 30)
const;
192 template <
int dm = dim>
193 typename std::enable_if<dm == 3, std::vector<LatticeVector<dim>>>::type
195 const std::string &filename =
"")
const;
206 template <
int dm = dim>
207 typename std::enable_if<dm == 2, std::vector<LatticeVector<dim>>>::type
209 const std::string &filename =
"")
const;
long long int LongIntType
LatticeDirection< dim > latticeDirection(const VectorDimD &d, const double &tol=FLT_EPSILON) const
Returns the lattice direction along a vector.
typename LatticeCore< dim >::VectorDimD VectorDimD
typename LatticeCore< dim >::MatrixDimI MatrixDimI
std::enable_if< dm==3, std::vector< MatrixDimD > >::type generateCoincidentLattices(const ReciprocalLatticeDirection< dim > &rd, const double &maxDen=100, const int &N=100) const
ReciprocalLatticeDirection< dim > reciprocalLatticeDirection(const VectorDimD &d, const double &tol=FLT_EPSILON) const
Returns the reciprocal lattice direction along a vector.
std::vector< LatticeDirection< dim > > planeParallelLatticeBasis(const ReciprocalLatticeDirection< dim > &l, const bool &useRLLL=false) const
Given a reciprocal lattice direction , this function returns a plane-parallel lattice basis ,...
double interPlanarSpacing(const ReciprocalLatticeDirection< dim > &r) const
Computes the interplanar spacing.
LatticeVector< dim > latticeVector(const VectorDimD &p) const
Returns a lattice vector (in the current lattice) with Cartesian coordinates p.
typename LatticeCore< dim >::MatrixDimD MatrixDimD
RationalLatticeDirection< dim > rationalLatticeDirection(const VectorDimD &d, const typename BestRationalApproximation::LongIntType &maxDen, const double &magnitudeTol, const double &directionTol=FLT_EPSILON) const
ReciprocalLatticeVector< dim > reciprocalLatticeVector(const VectorDimD &p) const
Returns a reciprocal lattice vector (in the dual of the current lattice) with Cartesian coordinates p...
const MatrixDimD reciprocalBasis
std::vector< ReciprocalLatticeDirection< dim > > directionOrthogonalReciprocalLatticeBasis(const LatticeDirection< dim > &l, const bool &useRLLL=false) const
Given a lattice direction , this function returns a direction-orthogonal reciprocal lattice basis ,...
std::enable_if< dm==3, std::vector< LatticeVector< dim > > >::type box(const std::vector< LatticeVector< dim > > &boxVectors, const std::string &filename="") const
typename LatticeCore< dim >::IntScalarType IntScalarType
typename LatticeCore< dim >::VectorDimI VectorDimI
RationalReciprocalLatticeDirection< dim > rationalReciprocalLatticeDirection(const VectorDimD &d, const typename BestRationalApproximation::LongIntType &maxDen, const double &magnitudeTol, const double &directionTol=FLT_EPSILON) const
const MatrixDimD latticeBasis
static constexpr double roundTol
A class template that implements a counter of the number of instances of Derived type that are create...
Eigen::Matrix< IntScalarType, dim, 1 > VectorDimI
long long int IntScalarType
Eigen::Matrix< IntScalarType, dim, dim > MatrixDimI
Eigen::Matrix< double, dim, 1 > VectorDimD
Eigen::Matrix< double, dim, dim > MatrixDimD