oILAB
Loading...
Searching...
No Matches
LatticeVector.h
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#ifndef gbLAB_LatticeVector_h_
7#define gbLAB_LatticeVector_h_
8
9#include <LatticeModule.h>
10
11namespace gbLAB
12{
17 template <int dim>
18 class LatticeVector: public Eigen::Matrix<typename LatticeCore<dim>::IntScalarType,dim,1>
19 {
20 typedef Eigen::Matrix<typename LatticeCore<dim>::IntScalarType,dim,1> BaseType;
21 BaseType& base();
22 const BaseType& base() const;
23
24 public:
25
26// static constexpr double roundTol=FLT_EPSILON;
32
34
35 LatticeVector(const Lattice<dim>& lat) ;
36 LatticeVector(const VectorDimD& d, const Lattice<dim>& lat) ;
37 LatticeVector(const VectorDimI& d, const Lattice<dim>& lat) ;
38 LatticeVector(const LatticeVector<dim>& other) = default;
40
47 LatticeVector<dim> operator*(const IntScalarType& scalar) const;
48
51 VectorDimD cartesian() const;
52
53 template<int dm=dim>
54 typename std::enable_if<dm==2,ReciprocalLatticeDirection<dm>>::type
55 cross(const LatticeVector<dm>& other) const
56 {
57 assert(&lattice == &other.lattice && "LatticeVectors belong to different Lattices.");
59 }
60 template<int dm=dim>
61 typename std::enable_if<dm==3,ReciprocalLatticeDirection<dm>>::type
62 cross(const LatticeVector<dm>& other) const
63 {
64 assert(&lattice == &other.lattice && "LatticeVectors belong to different Lattices.");
65 return ReciprocalLatticeDirection<dm>(ReciprocalLatticeVector<dm>(static_cast<VectorDimI>(*this).cross(static_cast<VectorDimI>(other)), lattice));
66 }
67
68 template<int dm=dim>
69 typename std::enable_if<dm==2,ReciprocalLatticeDirection<dm>>::type
70 cross() const
71 {
72 return ReciprocalLatticeDirection<dm>(ReciprocalLatticeVector<dm>((VectorDimI() << -(*this)(1),(*this)(0)).finished(), lattice));
73 }
74 template<int dm=dim>
75 typename std::enable_if<dm==3,ReciprocalLatticeDirection<dm>>::type
76 cross() const
77 {
78 return ReciprocalLatticeDirection<dm>(ReciprocalLatticeVector<dm>((VectorDimI() << -(*this)(1),(*this)(0),0).finished(), lattice));
79 }
80
81 template<int dm=dim>
82 typename std::enable_if<dm==2,void>::type
83 static modulo(LatticeVector<dim>& input, const std::vector<LatticeVector<dim>>& basis, const VectorDimD& shift= VectorDimD::Zero());
84
85 template<int dm=dim>
86 typename std::enable_if<dm==2,void>::type
87 static modulo(VectorDimD& input, const std::vector<LatticeVector<dim>>& basis, const VectorDimD& shift= VectorDimD::Zero());
88
89 template<int dm=dim>
90 typename std::enable_if<dm==3,void>::type
91 static modulo(LatticeVector<dim>& input, const std::vector<LatticeVector<dim>>& basis, const VectorDimD& shift= VectorDimD::Zero());
92
93 template<int dm=dim>
94 typename std::enable_if<dm==3,void>::type
95 static modulo(VectorDimD& input, const std::vector<LatticeVector<dim>>& basis, const VectorDimD& shift= VectorDimD ::Zero());
96
97 };
98
99 template<int dim>
101
102 template<int dim>
103 LatticeVector<dim> operator*(const int& scalar, const LatticeVector<dim>& L);
104} // end namespace
105#endif
Lattice class.
Definition Lattice.h:34
LatticeVector class.
VectorDimD cartesian() const
static std::enable_if< dm==3, void >::type modulo(VectorDimD &input, const std::vector< LatticeVector< dim > > &basis, const VectorDimD &shift=VectorDimD ::Zero())
LatticeCore< dim >::MatrixDimD MatrixDimD
static std::enable_if< dm==2, void >::type modulo(LatticeVector< dim > &input, const std::vector< LatticeVector< dim > > &basis, const VectorDimD &shift=VectorDimD::Zero())
std::enable_if< dm==3, ReciprocalLatticeDirection< dm > >::type cross() const
LatticeCore< dim >::MatrixDimI MatrixDimI
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)
static std::enable_if< dm==3, void >::type modulo(LatticeVector< dim > &input, const std::vector< LatticeVector< dim > > &basis, const VectorDimD &shift=VectorDimD::Zero())
std::enable_if< dm==2, ReciprocalLatticeDirection< dm > >::type cross(const LatticeVector< dm > &other) const
IntScalarType dot(const ReciprocalLatticeVector< dim > &other) const
LatticeCore< dim >::VectorDimI VectorDimI
LatticeVector(const LatticeVector< dim > &other)=default
std::enable_if< dm==2, ReciprocalLatticeDirection< dm > >::type cross() const
LatticeCore< dim >::IntScalarType IntScalarType
LatticeVector(LatticeVector< dim > &&other)=default
std::enable_if< dm==3, ReciprocalLatticeDirection< dm > >::type cross(const LatticeVector< dm > &other) const
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)
Eigen::Matrix< double, dim, dim > MatrixDimD
Definition LatticeCore.h:25
Eigen::Matrix< IntScalarType, dim, dim > MatrixDimI
Definition LatticeCore.h:28
Eigen::Matrix< double, dim, 1 > VectorDimD
Definition LatticeCore.h:24
long long int IntScalarType
Definition LatticeCore.h:26
Eigen::Matrix< IntScalarType, dim, 1 > VectorDimI
Definition LatticeCore.h:27