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 oILAB {
16template <int dim>
18 : public Eigen::Matrix<typename LatticeCore<dim>::IntScalarType, dim, 1> {
19 typedef Eigen::Matrix<typename LatticeCore<dim>::IntScalarType, dim, 1>
21 BaseType &base();
22 const BaseType &base() const;
23
24public:
25 // static constexpr double roundTol=FLT_EPSILON;
31
33
34 LatticeVector(const Lattice<dim> &lat);
35 LatticeVector(const VectorDimD &d, const Lattice<dim> &lat);
36 LatticeVector(const VectorDimI &d, const Lattice<dim> &lat);
37 LatticeVector(const LatticeVector<dim> &other) = default;
39
46 LatticeVector<dim> operator*(const IntScalarType &scalar) const;
47
50 VectorDimD cartesian() const;
51
52 template <int dm = dim>
53 typename std::enable_if<dm == 2, ReciprocalLatticeDirection<dm>>::type
54 cross(const LatticeVector<dm> &other) const {
55 assert(&lattice == &other.lattice &&
56 "LatticeVectors belong to different Lattices.");
58 (VectorDimI() << 0, 0).finished(), lattice));
59 }
60 template <int dm = dim>
61 typename std::enable_if<dm == 3, ReciprocalLatticeDirection<dm>>::type
62 cross(const LatticeVector<dm> &other) const {
63 assert(&lattice == &other.lattice &&
64 "LatticeVectors belong to different Lattices.");
66 static_cast<VectorDimI>(*this).cross(static_cast<VectorDimI>(other)),
67 lattice));
68 }
69
70 template <int dm = dim>
71 typename std::enable_if<dm == 2, ReciprocalLatticeDirection<dm>>::type
72 cross() const {
74 (VectorDimI() << -(*this)(1), (*this)(0)).finished(), lattice));
75 }
76 template <int dm = dim>
77 typename std::enable_if<dm == 3, ReciprocalLatticeDirection<dm>>::type
78 cross() const {
80 (VectorDimI() << -(*this)(1), (*this)(0), 0).finished(), lattice));
81 }
82
83 template <int dm = dim>
84 typename std::enable_if<dm == 2, void>::type static modulo(
85 LatticeVector<dim> &input, const std::vector<LatticeVector<dim>> &basis,
86 const VectorDimD &shift = VectorDimD::Zero());
87
88 template <int dm = dim>
89 typename std::enable_if<dm == 2, void>::type static modulo(
90 VectorDimD &input, const std::vector<LatticeVector<dim>> &basis,
91 const VectorDimD &shift = VectorDimD::Zero());
92
93 template <int dm = dim>
94 typename std::enable_if<dm == 3, void>::type static modulo(
95 LatticeVector<dim> &input, const std::vector<LatticeVector<dim>> &basis,
96 const VectorDimD &shift = VectorDimD::Zero());
97
98 template <int dm = dim>
99 typename std::enable_if<dm == 3, void>::type static modulo(
100 VectorDimD &input, const std::vector<LatticeVector<dim>> &basis,
101 const VectorDimD &shift = VectorDimD ::Zero());
102
103 };
104
105 template<int dim>
107
108 template<int dim>
109 LatticeVector<dim> operator*(const int& scalar, const LatticeVector<dim>& L);
110 } // namespace oILAB
111#endif
Lattice class.
Definition Lattice.h:31
LatticeVector class.
const Lattice< dim > & lattice
LatticeVector(LatticeVector< dim > &&other)=default
std::enable_if< dm==3, ReciprocalLatticeDirection< dm > >::type cross() const
Eigen::Matrix< typename LatticeCore< dim >::IntScalarType, dim, 1 > BaseType
IntScalarType dot(const ReciprocalLatticeVector< dim > &other) const
LatticeCore< dim >::VectorDimI VectorDimI
LatticeCore< dim >::MatrixDimI MatrixDimI
std::enable_if< dm==2, ReciprocalLatticeDirection< dm > >::type cross(const LatticeVector< dm > &other) const
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())
std::enable_if< dm==2, ReciprocalLatticeDirection< dm > >::type cross() const
LatticeVector(const LatticeVector< dim > &other)=default
LatticeCore< dim >::IntScalarType IntScalarType
std::enable_if< dm==3, ReciprocalLatticeDirection< dm > >::type cross(const LatticeVector< dm > &other) const
LatticeCore< dim >::MatrixDimD MatrixDimD
static std::enable_if< dm==3, void >::type modulo(VectorDimD &input, const std::vector< LatticeVector< dim > > &basis, const VectorDimD &shift=VectorDimD ::Zero())
LatticeCore< dim >::VectorDimD VectorDimD
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
static std::enable_if< dm==3, void >::type modulo(LatticeVector< dim > &input, const std::vector< LatticeVector< dim > > &basis, const VectorDimD &shift=VectorDimD::Zero())
LatticeVector< dim > & operator=(const LatticeVector< dim > &other)
VectorDimD cartesian() const
LatticeVector< dim > operator*(const typename LatticeVector< dim >::IntScalarType &scalar, const LatticeVector< dim > &L)
Eigen::Matrix< IntScalarType, dim, 1 > VectorDimI
Definition LatticeCore.h:23
long long int IntScalarType
Definition LatticeCore.h:22
Eigen::Matrix< IntScalarType, dim, dim > MatrixDimI
Definition LatticeCore.h:24
Eigen::Matrix< double, dim, 1 > VectorDimD
Definition LatticeCore.h:20
Eigen::Matrix< double, dim, dim > MatrixDimD
Definition LatticeCore.h:21