Phoebe developer's documentation  1.1.0
Phonon and Electron Boltzmann Equations
crystal.h
1 #ifndef CRYSTAL_H
2 #define CRYSTAL_H
3 
4 #include "eigen.h"
5 #include <string>
6 #include <vector>
7 #include "context.h"
8 
10  Eigen::Matrix3d rotation;
11  Eigen::Vector3d translation;
12 };
13 
18 class Crystal {
19 protected:
22  static Eigen::Matrix3d calcReciprocalCell(const Eigen::Matrix3d &directUnitCell);
23 
26  void setDirectUnitCell(const Eigen::Matrix3d &directUnitCell_);
27 
36  Eigen::Matrix3d directUnitCell;
37  Eigen::Matrix3d reciprocalUnitCell;
38  double volumeUnitCell;
39  int numAtoms;
40  int numSpecies;
41  int dimensionality;
42 
43  // these vectors/matrices running over the number of atoms
44  Eigen::MatrixXd atomicPositions; // size (numAtoms,3)
45  Eigen::VectorXi atomicSpecies; // size (numAtoms)
46  std::vector<std::string> atomicNames; // size (numAtoms)
47  Eigen::VectorXd atomicMasses; // size (numAtoms)
48  Eigen::VectorXd atomicIsotopeCouplings; // size (numAtoms)
49  Eigen::Tensor<double, 3> bornCharges; // size (numAtoms,3,3)
50  Eigen::Matrix3d dielectricMatrix; // size (3,3)
51 
52  // vectors running over the number of species
53  std::vector<std::string> speciesNames; // size (numSpecies)
54  Eigen::VectorXd speciesMasses; // size (numSpecies)
55  Eigen::VectorXd speciesIsotopeCouplings; // size (numSpecies)
56 
57  // Untested for now
58  std::vector<SymmetryOperation> symmetryOperations;
59  int numSymmetries;
60 
61 public:
76  Crystal(Context &context, Eigen::Matrix3d &directUnitCell_, Eigen::MatrixXd &atomicPositions_,
77  Eigen::VectorXi &atomicSpecies_,
78  std::vector<std::string> &speciesNames_,
79  Eigen::VectorXd &speciesMasses_, Eigen::Tensor<double, 3>& bornCharges_,
80  Eigen::Matrix3d &dielectricMatrix);
81 
84  Crystal();
85 
88  Crystal(const Crystal &obj);
89 
92  Crystal &operator=(const Crystal &obj);
93 
95  void print() const;
96 
97  // Setter and getter for all the variables above
98 
102  const Eigen::Matrix3d &getDirectUnitCell();
103 
108  const Eigen::Matrix3d &getReciprocalUnitCell();
109 
113  const int &getNumAtoms();
114 
118  const Eigen::Tensor<double, 3> getBornEffectiveCharges();
119 
123  const inline Eigen::Matrix3d getDielectricMatrix() { return dielectricMatrix; }
124 
130  double getVolumeUnitCell(int dimensionality_ = 3) const;
131 
138  const std::vector<SymmetryOperation> &getSymmetryOperations();
139 
144  int getNumSymmetries() const;
145 
149  const Eigen::MatrixXd &getAtomicPositions();
150 
155  const Eigen::VectorXi &getAtomicSpecies();
156 
160  const std::vector<std::string> &getAtomicNames();
161 
165  const Eigen::VectorXd &getAtomicMasses();
166 
170  const std::vector<std::string> &getSpeciesNames();
171 
175  const Eigen::VectorXd &getSpeciesMasses();
176 
179  int getDimensionality() const;
180 
183  int getNumSpecies() const;
184 
185  const Eigen::VectorXd &getAtomicIsotopeCouplings();
186 
191  Eigen::Vector3d crystalToCartesian(const Eigen::Vector3d &point);
192 
197  Eigen::Vector3d cartesianToCrystal(const Eigen::Vector3d &point);
198 
211  std::tuple<Eigen::MatrixXd, Eigen::VectorXd>
212  buildWignerSeitzVectors(const Eigen::Vector3i &grid,
213  const int &superCellFactor = 2);
214 
238  std::tuple<Eigen::MatrixXd, Eigen::Tensor<double, 3>>
239  buildWignerSeitzVectorsWithShift(const Eigen::Vector3i &grid,
240  const Eigen::MatrixXd &shift,
241  const int &superCellFactor = 2);
242 
245  void generateSymmetryInformation(Context &context);
246 
247 
248 };
249 
250 #endif
Class containing the user input variables.
Definition: context.h:15
Object to store the information on the crystal unit cell, such as atomic positions,...
Definition: crystal.h:18
const Eigen::VectorXd & getSpeciesMasses()
get the vector of masses of atomic species, in rydberg the vector has size (numSpecies)
Definition: crystal.cpp:343
Eigen::Matrix3d directUnitCell
These are the internal quantities used to store.
Definition: crystal.h:36
const Eigen::Tensor< double, 3 > getBornEffectiveCharges()
Return the born effective charges for the crystal object.
Definition: crystal.cpp:317
const Eigen::Matrix3d & getDirectUnitCell()
Returns the crystal unit cell in real space, in Bohr.
Definition: crystal.cpp:309
std::tuple< Eigen::MatrixXd, Eigen::Tensor< double, 3 > > buildWignerSeitzVectorsWithShift(const Eigen::Vector3i &grid, const Eigen::MatrixXd &shift, const int &superCellFactor=2)
Similar to buildWignerSeitzVectors, we build the list of Bravais lattice vectors (real space) that li...
Definition: crystal.cpp:460
int getDimensionality() const
return the dimensionality of the crystal, i.e.
Definition: crystal.cpp:348
void print() const
Print the crystal information.
Definition: crystal.cpp:274
int getNumSpecies() const
Return the number of atomic species present in the crystal.
Definition: crystal.cpp:349
int getNumSymmetries() const
get the number of symmetries operations that are used by phoebe.
Definition: crystal.cpp:347
const Eigen::Matrix3d & getReciprocalUnitCell()
Returns the reciprocal lattice vectors, in units of Bohr^-1/tpi.
Definition: crystal.cpp:310
Crystal()
Empty constructor.
Definition: crystal.cpp:219
double getVolumeUnitCell(int dimensionality_=3) const
get the volume of the crystal unit cell in Bohr^3
Definition: crystal.cpp:318
const Eigen::Matrix3d getDielectricMatrix()
Return the dielectric matrix for the crystal object.
Definition: crystal.h:123
const std::vector< std::string > & getAtomicNames()
get the vector of atomic names vector has size (numAtoms)
Definition: crystal.cpp:333
const Eigen::MatrixXd & getAtomicPositions()
get the atomic positions, in cartesian coordinates we return an array of size (numAtoms,...
Definition: crystal.cpp:331
const std::vector< std::string > & getSpeciesNames()
get the vector of names of atomic species the vector has size (numSpecies)
Definition: crystal.cpp:340
void generateSymmetryInformation(Context &context)
A function to set up the symmetry rotation matrices for a crystal, which are then stored in this obje...
Definition: crystal.cpp:128
const Eigen::VectorXi & getAtomicSpecies()
get the species of each atom in the unit cell.
Definition: crystal.cpp:332
const std::vector< SymmetryOperation > & getSymmetryOperations()
get the symmetry operations of the crystal, in cartesian coordinates.
Definition: crystal.cpp:344
Eigen::Vector3d crystalToCartesian(const Eigen::Vector3d &point)
Change of basis method to convert crystal wavevector to cartesian coordinates.
Definition: crystal.cpp:640
Eigen::Vector3d cartesianToCrystal(const Eigen::Vector3d &point)
Change of basis method to convert crystal wavevector to cartesian coordinates.
Definition: crystal.cpp:644
Crystal & operator=(const Crystal &obj)
Copy assignment operator.
Definition: crystal.cpp:250
std::tuple< Eigen::MatrixXd, Eigen::VectorXd > buildWignerSeitzVectors(const Eigen::Vector3i &grid, const int &superCellFactor=2)
Build the list of Bravais lattice vectors (real space) that live within the Wigner Seitz zone of a su...
Definition: crystal.cpp:352
const int & getNumAtoms()
get the number of atoms in the unit cell
Definition: crystal.cpp:316
void setDirectUnitCell(const Eigen::Matrix3d &directUnitCell_)
Internal utility to set the crystal unit cell and the reciprocal cell.
Definition: crystal.cpp:304
static Eigen::Matrix3d calcReciprocalCell(const Eigen::Matrix3d &directUnitCell)
utility function to invert the direct unit cell
Definition: crystal.cpp:299
const Eigen::VectorXd & getAtomicMasses()
get the vector of atomic masses the vector has size (numAtoms)
Definition: crystal.cpp:336
Definition: crystal.h:9