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<LatticeModule.h>
11
12namespace gbLAB
13{
14
15 /**********************************************************************/
16 template <int dim>
18 {
19 return *this;
20 }
21
22 /**********************************************************************/
23 template <int dim>
25 {
26 return *this;
27 }
28
29
30 /**********************************************************************/
31 template <int dim>
33 /* init */ BaseType(VectorDimI::Zero()),
34 /* init */ lattice(lat)
35 {
36 }
37
38 /**********************************************************************/
39 template <int dim>
41 const Lattice<dim> &lat) :
42 /* init */ BaseType(LatticeCore<dim>::integerCoordinates(d,lat.reciprocalBasis.transpose())),
43 /* init */ lattice(lat)
44 {
47 }
48
49 /**********************************************************************/
50 template<int dim>
52 /* init base */ BaseType(other),
53 /* init */ lattice(lat)
54 { }
55
56 /**********************************************************************/
57 template <int dim>
59 {
60 assert(&lattice == &other.lattice && "LatticeVectors belong to different Lattices.");
61 base() = other.base();
62 return *this;
63 }
64 /**********************************************************************/
65 template <int dim>
67 {
68 assert(&lattice == &other.lattice && "LatticeVectors belong to different Lattices.");
69 base() = other.base();
70 return *this;
71 }
72
73 /**********************************************************************/
74 template <int dim>
76 {
77 assert(&lattice == &other.lattice && "LatticeVectors belong to different Lattices.");
78 VectorDimI temp= static_cast<VectorDimI>(*this) + static_cast<VectorDimI>(other);
79 return LatticeVector<dim>(temp, lattice);
80 }
81
82 /**********************************************************************/
83 template <int dim>
85 {
86 assert(&lattice == &other.lattice && "LatticeVectors belong to different Lattices.");
87 base() += other.base();
88 return *this;
89 }
90
91 /**********************************************************************/
92 template <int dim>
94 {
95 assert(&lattice == &other.lattice && "LatticeVectors belong to different Lattices.");
96 VectorDimI temp= static_cast<VectorDimI>(*this) - static_cast<VectorDimI>(other);
97 return LatticeVector<dim>(temp, lattice);
98 }
99
100 /**********************************************************************/
101 template <int dim>
103 {
104 assert(&lattice == &other.lattice && "LatticeVectors belong to different Lattices.");
105 base() -= other.base();
106 return *this;
107 }
108
109 /**********************************************************************/
110 template<int dim>
112 {
113 VectorDimI temp= static_cast<VectorDimI>(*this) * scalar;
114 return LatticeVector<dim>(temp, lattice);
115 }
116 /**********************************************************************/
117 template <int dim>
119 {
120 assert(&lattice == &other.lattice && "LatticeVectors belong to different Lattices.");
121 return static_cast<VectorDimI>(*this).dot(static_cast<VectorDimI>(other));
122 }
123
124 /**********************************************************************/
125 template <int dim>
127 {
128 assert(&lattice == &other.lattice && "LatticeVectors belong to different Lattices.");
129 return dot(other.reciprocalLatticeVector());
130 }
131
132 /**********************************************************************/
133 template <int dim>
135 {
136 return lattice.latticeBasis * this->template cast<double>();
137 }
138
139 /**********************************************************************/
140 template<int dim>
142 {
143 return L*scalar;
144 }
145
146 template<int dim>
148 {
149 return L*scalar;
150 }
151
152
153 template<int dim> template<int dm>
154 typename std::enable_if<dm==3,void>::type
155 LatticeVector<dim>::modulo(LatticeVector<dim>& input, const std::vector<LatticeVector<dim>>& basis, const VectorDimD& shift)
156 {
157 double det= (basis[0].cross(basis[1])).dot(basis[2]);
158 assert( abs(det) > FLT_EPSILON );
159 auto normal= basis[1].cross(basis[2]);
160 input= input - floor( (double)input.dot(normal)/basis[0].dot(normal)-shift(0) ) * basis[0];
161 assert((double)(input.dot(normal))/basis[0].dot(normal)<= shift(0)+1.0 &&
162 (double)(input.dot(normal))/basis[0].dot(normal)>= shift(0));
163 normal= basis[2].cross(basis[0]);
164 input= input - floor( (double)input.dot(normal)/basis[1].dot(normal)-shift(1) ) * basis[1];
165 assert((double)(input.dot(normal))/basis[1].dot(normal)<= shift(1)+1.0 &&
166 (double)(input.dot(normal))/basis[1].dot(normal)>= shift(1));
167 normal= basis[0].cross(basis[1]);
168 input= input - floor( (double)input.dot(normal)/basis[2].dot(normal)-shift(2) ) * basis[2];
169 assert((double)(input.dot(normal))/basis[2].dot(normal)<= shift(2)+1.0 &&
170 (double)(input.dot(normal))/basis[2].dot(normal)>= shift(2));
171 }
172
173 template<int dim> template<int dm>
174 typename std::enable_if<dm==3,void>::type
175 LatticeVector<dim>::modulo(VectorDimD& input, const std::vector<LatticeVector<dim>>& basis, const VectorDimD& shift)
176 {
177 Eigen::Matrix3d L;
178 L.col(0)= basis[0].cartesian();
179 L.col(1)= basis[1].cartesian();
180 L.col(2)= basis[2].cartesian();
181
182 Eigen::Vector3d inputCoordinates= ((L.inverse()*input).array()-shift.array()).floor();
183 input= input - L*inputCoordinates;
184 }
185
186
187 template<int dim> template<int dm>
188 typename std::enable_if<dm==2,void>::type
189 LatticeVector<dim>::modulo(LatticeVector<dim>& input, const std::vector<LatticeVector<dim>>& basis, const VectorDimD& shift)
190 {
191 auto normal= basis[1].cross();
192 input= input - input.dot(normal)/basis[0].dot(normal) * basis[0];
193 normal= basis[0].cross();
194 input= input - input.dot(normal)/basis[1].dot(normal) * basis[1];
195 }
196
197 template<int dim> template<int dm>
198 typename std::enable_if<dm==2,void>::type
199 LatticeVector<dim>::modulo(VectorDimD& input, const std::vector<LatticeVector<dim>>& basis, const VectorDimD& shift)
200 {
201 }
202
203
204 template class LatticeVector<1>;
206 template LatticeVector<1>operator*(const int& scalar, const LatticeVector<1>& L);
207
208 template class LatticeVector<2>;
210 template LatticeVector<2>operator*(const int& scalar, const LatticeVector<2>& L);
211 template void LatticeVector<2>::modulo<2>(LatticeVector<2>& input, const std::vector<LatticeVector<2>>& basis, const Eigen::Vector2d& shift);
212 template void LatticeVector<2>::modulo<2>(Eigen::Vector2d& input, const std::vector<LatticeVector<2>>& basis, const Eigen::Vector2d& shift);
213
214 template class LatticeVector<3>;
216 template LatticeVector<3>operator*(const int& scalar, const LatticeVector<3>& L);
217 template void LatticeVector<3>::modulo<3>(LatticeVector<3>& input, const std::vector<LatticeVector<3>>& basis, const Eigen::Vector3d& shift);
218 template void LatticeVector<3>::modulo<3>(Eigen::Vector3d& input, const std::vector<LatticeVector<3>>& basis, const Eigen::Vector3d& shift);
219
220 template class LatticeVector<4>;
222 template LatticeVector<4>operator*(const int& scalar, const LatticeVector<4>& L);
223
224 template class LatticeVector<5>;
226 template LatticeVector<5>operator*(const int& scalar, const LatticeVector<5>& L);
227} // end namespace
228#endif
Lattice class.
Definition Lattice.h:34
LatticeVector class.
VectorDimD cartesian() const
static std::enable_if< dm==2, void >::type modulo(LatticeVector< dim > &input, const std::vector< LatticeVector< dim > > &basis, const VectorDimD &shift=VectorDimD::Zero())
const Lattice< dim > & lattice
LatticeVector< dim > & operator-=(const LatticeVector< dim > &other)
LatticeCore< dim >::VectorDimD VectorDimD
LatticeVector< dim > operator+(const LatticeVector< dim > &other) const
LatticeVector< dim > operator*(const IntScalarType &scalar) const
LatticeVector< dim > & operator+=(const LatticeVector< dim > &other)
IntScalarType dot(const ReciprocalLatticeVector< dim > &other) const
LatticeCore< dim >::VectorDimI VectorDimI
LatticeCore< dim >::IntScalarType IntScalarType
LatticeVector(const Lattice< dim > &lat)
LatticeVector< dim > & operator=(const LatticeVector< dim > &other)
LatticeVector< dim > operator-(const LatticeVector< dim > &other) const
Eigen::Matrix< typename LatticeCore< dim >::IntScalarType, dim, 1 > BaseType
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)