CASM
AClustersApproachtoStatisticalMechanics
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules
PrimGrid.hh
Go to the documentation of this file.
1 #ifndef PRIMGRID_HH
2 #define PRIMGRID_HH
3 
4 
5 #include <iostream>
6 #include <cmath>
7 #include <cassert>
8 
11 
12 
13 namespace CASM {
14 
15  class Lattice;
16  class UnitCell;
17  class UnitCellCoord;
18  class Coordinate;
19  class SymGroupRepID;
20  class SymOp;
21  class SymGroup;
22 
23  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
24  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25 
30  class PrimGrid {
31  private:
32  typedef Eigen::Matrix<long, 3, 3> matrix_type;
33  typedef Eigen::Matrix<long, 3, 1> vector_type;
35  Lattice const *m_lat[2];
36 
38  long int m_N_vol;
39 
41  long int m_NB;
42 
46  matrix_type m_plane_mat, m_trans_mat;
47 
49  matrix_type m_U, m_invU;
50 
53 
84 
85  // stride maps canonical 3d index (m,n,p) onto linear index -- l = m + n*stride[0] + p*stride[1]
86  // S is diagonals of smith normal form S matrix
87  int m_stride[2];
88  Eigen::Matrix<long, 3, 1> m_S;
89 
90 
93  UnitCellCoord to_canonical(const UnitCellCoord &bijk) const;
94 
97  UnitCellCoord from_canonical(const UnitCellCoord &bmnp) const;
98 
99 
100  public:
101  PrimGrid(const Lattice &p_lat, const Lattice &s_lat, Index NB = 1);
102  PrimGrid(const Lattice &p_lat,
103  const Lattice &s_lat,
104  const Eigen::Ref<const PrimGrid::matrix_type> &U,
105  const Eigen::Ref<const PrimGrid::matrix_type> &Smat,
106  Index NB);
107 
108  Index size() const {
109  return m_N_vol;
110  }
111 
112  const matrix_type &matrixU()const {
113  return m_U;
114  };
115  const matrix_type &invU()const {
116  return m_invU;
117  };
118 
119  const Eigen::DiagonalWrapper<const PrimGrid::vector_type> matrixS()const;
120 
121  int S(Index i) const {
122  return m_S[i];
123  };
124 
125  // find linear index that is translational equivalent to Coordinate or UnitCellCoord
126  Index find(const Coordinate &_coord) const;
127  Index find(const UnitCell &_unitcell) const;
128  Index find(const UnitCellCoord &_coord) const;
129  Index find_cart(const Eigen::Ref<const Eigen::Vector3d> &_cart_coord) const;
130 
131  // map a UnitCellCoord inside the supercell
132  UnitCellCoord get_within(const UnitCellCoord &_uccoord)const;
133 
134  // get Coordinate or UnitCellCoord from linear index
135  Coordinate coord(Index l, CELL_TYPE lat_mode)const;
136  Coordinate coord(const UnitCellCoord &bijk, CELL_TYPE lat_mode)const;
137  UnitCell unitcell(Index i)const;
138  UnitCellCoord uccoord(Index i)const;
139 
140  SymGroupRepID make_permutation_representation(const SymGroup &group, SymGroupRepID basis_permute_rep)const;
141 
142  // Returns Array of permutations. Permutation 'l' describes the effect of translating PrimGrid site 'l'
143  // to the origin. NB is the number of primitive-cell basis sites. -- keep public for now
145 
148 
149  if(m_trans_permutations.size() != m_N_vol) {
150  if(m_trans_permutations.size() > 0) {
151  throw std::runtime_error("***CASM has calculated the wrong number of translation permutations for a PrimGrid. This should never happen. Something is very wrong.\n");
152  }
153  m_trans_permutations = make_translation_permutations(m_NB);
154 
155  }
156  return m_trans_permutations;
157  }
158 
160  return translation_permutations()[i];
161  }
162 
163  SymOp sym_op(Index l) const;
164  };
165 
167 }
168 #endif
int m_stride[2]
Definition: PrimGrid.hh:87
Eigen::Matrix< long, 3, 1 > vector_type
Definition: PrimGrid.hh:33
long int m_N_vol
Number of primgrid lattice points in the supercell.
Definition: PrimGrid.hh:38
Index size() const
Definition: Array.hh:145
Type-safe ID object for communicating and accessing Symmetry representation info. ...
long int m_NB
Number of basis atoms in the primitive cell.
Definition: PrimGrid.hh:41
matrix_type m_U
The Smith Normal Form decomposition is: trans_mat = U*S*V, with det(U)=det(V)=1; S is diagonal...
Definition: PrimGrid.hh:49
UnitCellCoord to_canonical(const UnitCellCoord &bijk) const
Definition: PrimGrid.cc:348
matrix_type m_plane_mat
Definition: PrimGrid.hh:46
Unit Cell Coordinates.
Eigen::Matrix< long, 3, 1 > m_S
Definition: PrimGrid.hh:88
Lattice const * m_lat[2]
m_lat[PRIM] is primitive lattice, lat[SCEL] is super lattice
Definition: PrimGrid.hh:35
Main CASM namespace.
Definition: complete.cpp:8
Unit Cell Indices.
const matrix_type & matrixU() const
Definition: PrimGrid.hh:112
const Eigen::DiagonalWrapper< const PrimGrid::vector_type > matrixS() const
Definition: PrimGrid.cc:140
Index find(const Coordinate &_coord) const
Definition: PrimGrid.cc:144
Array< Permutation > m_trans_permutations
Permutations that describe how translation permutes sites of the supercell.
Definition: PrimGrid.hh:52
SymGroup is a collection of symmetry operations that satisfy the group property The symmetry operatio...
Definition: SymGroup.hh:33
SymOp is the Coordinate representation of a symmetry operation it keeps fraction (FRAC) and Cartesian...
Definition: SymOp.hh:28
Represents cartesian and fractional coordinates.
Definition: Coordinate.hh:34
SymGroupRepID make_permutation_representation(const SymGroup &group, SymGroupRepID basis_permute_rep) const
Definition: PrimGrid.cc:247
UnitCellCoord get_within(const UnitCellCoord &_uccoord) const
Definition: PrimGrid.cc:200
const matrix_type & invU() const
Definition: PrimGrid.hh:115
EigenIndex Index
For long integer indexing:
Index size() const
Definition: PrimGrid.hh:108
SymOp sym_op(Index l) const
Definition: PrimGrid.cc:375
ReturnArray< Permutation > make_translation_permutations(Index NB) const
Definition: PrimGrid.cc:308
Eigen::Matrix< long, 3, 3 > matrix_type
Definition: PrimGrid.hh:32
const Array< Permutation > & translation_permutations() const
const access to m_trans_permutations. Generates permutations if they don't already exist...
Definition: PrimGrid.hh:147
matrix_type m_trans_mat
Definition: PrimGrid.hh:46
PrimGrid(const Lattice &p_lat, const Lattice &s_lat, Index NB=1)
Definition: PrimGrid.cc:16
UnitCellCoord uccoord(Index i) const
Definition: PrimGrid.cc:235
Coordinate coord(Index l, CELL_TYPE lat_mode) const
Definition: PrimGrid.cc:223
UnitCell unitcell(Index i) const
Definition: PrimGrid.cc:229
const Permutation & translation_permutation(Index i) const
Definition: PrimGrid.hh:159
int S(Index i) const
Definition: PrimGrid.hh:121
matrix_type m_invU
Definition: PrimGrid.hh:49
Index find_cart(const Eigen::Ref< const Eigen::Vector3d > &_cart_coord) const
Definition: PrimGrid.cc:171
Basic std::vector like container (deprecated)
UnitCellCoord from_canonical(const UnitCellCoord &bmnp) const
Definition: PrimGrid.cc:364