oILAB
Loading...
Searching...
No Matches
LatticeVector.cpp
Go to the documentation of this file.
1/* This file is part of gbLAB.
2 *
3 * gbLAB is distributed without any warranty under the MIT License.
4 */
5
6
7#ifndef gbLAB_LatticeVector_cpp_
8#define gbLAB_LatticeVector_cpp_
9
10#include "../../include/Lattices/LatticeModule.h"
11
12namespace oILAB {
13
14/**********************************************************************/
15template <int dim>
17 return *this;
18 }
19
20 /**********************************************************************/
21 template <int dim>
23 {
24 return *this;
25 }
26
27
28 /**********************************************************************/
29 template <int dim>
31 /* init */ BaseType(VectorDimI::Zero()),
32 /* init */ lattice(lat)
33 {
34 }
35
36 /**********************************************************************/
37 template <int dim>
39 const Lattice<dim> &lat) :
40 /* init */ BaseType(LatticeCore<dim>::integerCoordinates(d,lat.reciprocalBasis.transpose())),
41 /* init */ lattice(lat)
42 {
45 }
46
47 /**********************************************************************/
48 template<int dim>
50 /* init base */ BaseType(other),
51 /* init */ lattice(lat)
52 { }
53
54 /**********************************************************************/
55 template <int dim>
57 {
58 assert(&lattice == &other.lattice && "LatticeVectors belong to different Lattices.");
59 base() = other.base();
60 return *this;
61 }
62 /**********************************************************************/
63 template <int dim>
65 {
66 assert(&lattice == &other.lattice && "LatticeVectors belong to different Lattices.");
67 base() = other.base();
68 return *this;
69 }
70
71 /**********************************************************************/
72 template <int dim>
74 {
75 assert(&lattice == &other.lattice && "LatticeVectors belong to different Lattices.");
76 VectorDimI temp= static_cast<VectorDimI>(*this) + static_cast<VectorDimI>(other);
77 return LatticeVector<dim>(temp, lattice);
78 }
79
80 /**********************************************************************/
81 template <int dim>
83 {
84 assert(&lattice == &other.lattice && "LatticeVectors belong to different Lattices.");
85 base() += other.base();
86 return *this;
87 }
88
89 /**********************************************************************/
90 template <int dim>
92 {
93 assert(&lattice == &other.lattice && "LatticeVectors belong to different Lattices.");
94 VectorDimI temp= static_cast<VectorDimI>(*this) - static_cast<VectorDimI>(other);
95 return LatticeVector<dim>(temp, lattice);
96 }
97
98 /**********************************************************************/
99 template <int dim>
101 {
102 assert(&lattice == &other.lattice && "LatticeVectors belong to different Lattices.");
103 base() -= other.base();
104 return *this;
105 }
106
107 /**********************************************************************/
108 template<int dim>
110 {
111 VectorDimI temp= static_cast<VectorDimI>(*this) * scalar;
112 return LatticeVector<dim>(temp, lattice);
113 }
114 /**********************************************************************/
115 template <int dim>
117 {
118 assert(&lattice == &other.lattice && "LatticeVectors belong to different Lattices.");
119 return static_cast<VectorDimI>(*this).dot(static_cast<VectorDimI>(other));
120 }
121
122 /**********************************************************************/
123 template <int dim>
125 {
126 assert(&lattice == &other.lattice && "LatticeVectors belong to different Lattices.");
127 return dot(other.reciprocalLatticeVector());
128 }
129
130 /**********************************************************************/
131 template <int dim>
133 {
134 return lattice.latticeBasis * this->template cast<double>();
135 }
136
137 /**********************************************************************/
138 template<int dim>
140 {
141 return L*scalar;
142 }
143
144 template<int dim>
146 {
147 return L*scalar;
148 }
149
150
151 template<int dim> template<int dm>
152 typename std::enable_if<dm==3,void>::type
153 LatticeVector<dim>::modulo(LatticeVector<dim>& input, const std::vector<LatticeVector<dim>>& basis, const VectorDimD& shift)
154 {
155 double det= (basis[0].cross(basis[1])).dot(basis[2]);
156 assert( abs(det) > FLT_EPSILON );
157 auto normal= basis[1].cross(basis[2]);
158 input= input - floor( (double)input.dot(normal)/basis[0].dot(normal)-shift(0) ) * basis[0];
159 assert((double)(input.dot(normal))/basis[0].dot(normal)<= shift(0)+1.0 &&
160 (double)(input.dot(normal))/basis[0].dot(normal)>= shift(0));
161 normal= basis[2].cross(basis[0]);
162 input= input - floor( (double)input.dot(normal)/basis[1].dot(normal)-shift(1) ) * basis[1];
163 assert((double)(input.dot(normal))/basis[1].dot(normal)<= shift(1)+1.0 &&
164 (double)(input.dot(normal))/basis[1].dot(normal)>= shift(1));
165 normal= basis[0].cross(basis[1]);
166 input= input - floor( (double)input.dot(normal)/basis[2].dot(normal)-shift(2) ) * basis[2];
167 assert((double)(input.dot(normal))/basis[2].dot(normal)<= shift(2)+1.0 &&
168 (double)(input.dot(normal))/basis[2].dot(normal)>= shift(2));
169 }
170
171 template<int dim> template<int dm>
172 typename std::enable_if<dm==3,void>::type
173 LatticeVector<dim>::modulo(VectorDimD& input, const std::vector<LatticeVector<dim>>& basis, const VectorDimD& shift)
174 {
175 Eigen::Matrix3d L;
176 L.col(0)= basis[0].cartesian();
177 L.col(1)= basis[1].cartesian();
178 L.col(2)= basis[2].cartesian();
179
180 Eigen::Vector3d inputCoordinates= ((L.inverse()*input).array()-shift.array()).floor();
181 input= input - L*inputCoordinates;
182 }
183
184
185 template<int dim> template<int dm>
186 typename std::enable_if<dm==2,void>::type
187 LatticeVector<dim>::modulo(LatticeVector<dim>& input, const std::vector<LatticeVector<dim>>& basis, const VectorDimD& shift)
188 {
189 auto normal= basis[1].cross();
190 input= input - input.dot(normal)/basis[0].dot(normal) * basis[0];
191 normal= basis[0].cross();
192 input= input - input.dot(normal)/basis[1].dot(normal) * basis[1];
193 }
194
195 template<int dim> template<int dm>
196 typename std::enable_if<dm==2,void>::type
197 LatticeVector<dim>::modulo(VectorDimD& input, const std::vector<LatticeVector<dim>>& basis, const VectorDimD& shift)
198 {
199 }
200
201
202 template class LatticeVector<1>;
204 template LatticeVector<1>operator*(const int& scalar, const LatticeVector<1>& L);
205
206 template class LatticeVector<2>;
208 template LatticeVector<2>operator*(const int& scalar, const LatticeVector<2>& L);
209 template void LatticeVector<2>::modulo<2>(LatticeVector<2>& input, const std::vector<LatticeVector<2>>& basis, const Eigen::Vector2d& shift);
210 template void LatticeVector<2>::modulo<2>(Eigen::Vector2d& input, const std::vector<LatticeVector<2>>& basis, const Eigen::Vector2d& shift);
211
212 template class LatticeVector<3>;
214 template LatticeVector<3>operator*(const int& scalar, const LatticeVector<3>& L);
215 template void LatticeVector<3>::modulo<3>(LatticeVector<3>& input, const std::vector<LatticeVector<3>>& basis, const Eigen::Vector3d& shift);
216 template void LatticeVector<3>::modulo<3>(Eigen::Vector3d& input, const std::vector<LatticeVector<3>>& basis, const Eigen::Vector3d& shift);
217
218 template class LatticeVector<4>;
220 template LatticeVector<4>operator*(const int& scalar, const LatticeVector<4>& L);
221
222 template class LatticeVector<5>;
224 template LatticeVector<5>operator*(const int& scalar, const LatticeVector<5>& L);
225 } // namespace oILAB
226#endif
Lattice class.
Definition Lattice.h:31
LatticeVector class.
const Lattice< dim > & lattice
Eigen::Matrix< typename LatticeCore< dim >::IntScalarType, dim, 1 > BaseType
IntScalarType dot(const ReciprocalLatticeVector< dim > &other) const
LatticeCore< dim >::VectorDimI VectorDimI
LatticeVector< dim > & operator-=(const LatticeVector< dim > &other)
static std::enable_if< dm==2, void >::type modulo(LatticeVector< dim > &input, const std::vector< LatticeVector< dim > > &basis, const VectorDimD &shift=VectorDimD::Zero())
LatticeCore< dim >::IntScalarType IntScalarType
LatticeCore< dim >::VectorDimD VectorDimD
LatticeVector(const Lattice< dim > &lat)
LatticeVector< dim > & operator+=(const LatticeVector< dim > &other)
LatticeVector< dim > operator-(const LatticeVector< dim > &other) const
LatticeVector< dim > operator*(const IntScalarType &scalar) const
LatticeVector< dim > operator+(const LatticeVector< dim > &other) const
LatticeVector< dim > & operator=(const LatticeVector< dim > &other)
VectorDimD cartesian() const
LatticeVector< dim > operator*(const typename LatticeVector< dim >::IntScalarType &scalar, const LatticeVector< dim > &L)
const ReciprocalLatticeVector< dim > & reciprocalLatticeVector() const
Returns a constant reference to the base class (ReciprocalLatticeVector)