8#ifndef model_LatticePlane_cpp_
9#define model_LatticePlane_cpp_
11#include <LatticeModule.h>
21 for (
int k = 0;
k <
dim; ++
k)
34 return (LongIntType(0) < val) - (val < LongIntType(0));
41 assert(
r.squaredNorm() > 0 &&
"zero direction cannot be used as LatticePlaneKey");
42 for (
int d = 0; d <
dim; ++d)
44 const int sgnrd(sgn(
r(d)));
52 return hr2array(r,
h, latticeID);
60 const LongIntType& latticeID) :
61 array(correct_h_sign(
r,
h,latticeID))
67 LatticePlaneKey<dim>::LatticePlaneKey(
const VectorDimD& P,
68 const ReciprocalLatticeDirection<dim>& r) :
69 LatticePlaneKey(
r,
r.planeIndexOfPoint(P),
r.
lattice.sID)
76 LatticePlaneKey<dim>::LatticePlaneKey(
const LatticeVector<dim>& L,
77 const ReciprocalLatticeDirection<dim>& r) :
78 LatticePlaneKey(
r,
r.planeIndexOfPoint(L),
r.
lattice.sID)
85 LatticePlaneKey<dim>::LatticePlaneKey(
const long int& hin,
86 const ReciprocalLatticeDirection<dim>& r) :
93 Eigen::Map<const typename LatticePlaneKey<dim>::VectorDimI> LatticePlaneKey<dim>::reciprocalDirectionComponents()
const
95 return Eigen::Map<const VectorDimI>(&array.data()[0]);
99 const typename LatticePlaneKey<dim>::LongIntType& LatticePlaneKey<dim>::planeIndex()
const
105 const typename LatticePlaneKey<dim>::LongIntType& LatticePlaneKey<dim>::latticeID()
const
107 return array[
dim + 1];
111 bool LatticePlaneKey<dim>::operator<(
const LatticePlaneKey<dim> &other)
const
113 return array < other.array;
116 template struct LatticePlaneKey<3>;
120 std::pair<bool, long int> LatticePlane::computeHeight(
const ReciprocalLatticeDirection<dim> &r,
124 assert(
r.squaredNorm() > 0 &&
"A zero normal cannot be used as valid GlidePlane normal");
125 const double hd(P.dot(
r.cartesian()));
126 const long int h(std::lround(hd));
127 return std::make_pair(fabs(hd -
h) < FLT_EPSILON,
h);
131 std::pair<bool, long int> LatticePlane::computeHeight(
const ReciprocalLatticeDirection<dim> &r,
132 const LatticeVector<dim> &L)
135 assert(
r.squaredNorm() > 0 &&
"A zero normal cannot be used as valid GlidePlane normal");
136 return std::make_pair(
true, L.dot(r));
140 LatticePlane::LatticePlane(
const VectorDimD& P,
141 const ReciprocalLatticeDirection<dim>& r) :
143 ,
n(ReciprocalLatticeVector<
dim>(
key.reciprocalDirectionComponents(),
r.
lattice))
144 ,planeIndex(
key.planeIndex())
149 LatticePlane::LatticePlane(
const LatticeVector<dim>& L,
150 const ReciprocalLatticeDirection<dim>& r) :
152 ,
n(ReciprocalLatticeVector<
dim>(
key.reciprocalDirectionComponents(),
r.
lattice))
153 ,planeIndex(
key.planeIndex())
159 LatticePlane::LatticePlane(
const long int& hin,
160 const ReciprocalLatticeDirection<dim>& r) :
162 ,
n(ReciprocalLatticeVector<
dim>(
key.reciprocalDirectionComponents(),
r.
lattice))
163 ,planeIndex(
key.planeIndex())
168 typename LatticePlane::VectorDimD LatticePlane::planeOrigin()
const
170 return planeIndex *
n.planeSpacing() *
n.cartesian().normalized();
static int sgn(const LongIntType &val)
static ArrayType hr2array(const VectorDimI &r, const LongIntType &h, const LongIntType &latticeID)
LatticePlaneKey(const VectorDimI &r, const LongIntType &h, const LongIntType &latticeID)
std::array< LongIntType, dim+2 > ArrayType
static ArrayType correct_h_sign(VectorDimI r, LongIntType h, const LongIntType &latticeID)