Phoebe developer's documentation  1.1.0
Phonon and Electron Boltzmann Equations
electron_h0_wannier.h
1 #ifndef WANNIER_H0_H
2 #define WANNIER_H0_H
3 
4 #include <cmath>
5 
6 #include "bandstructure.h"
7 #include "constants.h"
8 #include "eigen.h"
9 #include "harmonic.h"
10 #include "points.h"
11 #include "common_kokkos.h"
12 
18  public:
19 
28  const Eigen::Matrix3d &directUnitCell_,
29  const Eigen::MatrixXd &bravaisVectors_,
30  const Eigen::VectorXd &vectorsDegeneracies_,
31  const Eigen::Tensor<std::complex<double>, 3> &h0R_,
32  const Eigen::Tensor<std::complex<double>, 4>* rMatrix_=nullptr);
33 
37 
41 
45 
48  Particle getParticle() override;
49 
53  int getNumBands() override;
54 
65  std::tuple<Eigen::VectorXd, Eigen::MatrixXcd> diagonalize(Point &point) override;
66 
67  std::tuple<Eigen::VectorXd, Eigen::MatrixXcd> diagonalizeFromCoordinates(
68  Eigen::Vector3d &k) override;
69 
77  std::tuple<std::vector<Eigen::VectorXd>, std::vector<Eigen::MatrixXcd>>
78  batchedDiagonalizeFromCoordinates(std::vector<Eigen::Vector3d>& cartesianWavevectors);
79 
87  std::vector<Eigen::MatrixXcd> batchedBuildHamiltonians(
88  std::vector<Eigen::Vector3d>& cartesianWavevectors);
89 
99  StridedComplexView3D kokkosBatchedBuildBlochHamiltonian(
100  const DoubleView2D &cartesianCoordinates) override;
101 
111  std::tuple<DoubleView2D, StridedComplexView3D> kokkosBatchedDiagonalizeFromCoordinates(
112  const DoubleView2D &cartesianCoordinates, const bool withMassScaling=true) override;
121  std::tuple<DoubleView2D, StridedComplexView3D, ComplexView4D>
123  const DoubleView2D &cartesianCoordinates) override;
124 
130  Eigen::Tensor<std::complex<double>, 3> diagonalizeVelocity(Point &point) override;
131  Eigen::Tensor<std::complex<double>, 3> diagonalizeVelocityFromCoordinates(
132  Eigen::Vector3d &coordinates) override;
133 
142  std::tuple<std::vector<Eigen::VectorXd>,
143  std::vector<Eigen::MatrixXcd>,
144  std::vector<Eigen::Tensor<std::complex<double>, 3>>>
146  std::vector<Eigen::Vector3d> cartesianCoordinates);
147 
155  FullBandStructure populate(Points &fullPoints, const bool &withVelocities,
156  const bool &withEigenvectors,
157  const bool isDistributed=false) override;
158 
168  std::tuple<std::vector<Eigen::VectorXd>, std::vector<Eigen::MatrixXcd>,
169  std::vector<Eigen::Tensor<std::complex<double>,3>>>
170  populate(const std::vector<Eigen::Vector3d>& cartesianCoordinates,
171  const bool &withVelocities,
172  const bool &withEigenvectors);
173 
175  FullBandStructure cpuPopulate(Points &fullPoints, const bool &withVelocities,
176  const bool &withEigenvectors,
177  const bool isDistributed=false);
178 
180  std::tuple<std::vector<Eigen::VectorXd>, std::vector<Eigen::MatrixXcd>,
181  std::vector<Eigen::Tensor<std::complex<double>,3>>>
182  kokkosPopulate(const std::vector<Eigen::Vector3d>& cartesianCoordinates,
183  const bool &withVelocities,
184  const bool &withEigenvectors, const std::vector<int>& iks);
185 
192  std::vector<Eigen::MatrixXcd> getBerryConnection(Point &point);
193 
203  void addShiftedVectors(Eigen::Tensor<double,3> degeneracyShifts_,
204  Eigen::Tensor<double,5> vectorsShifts_);
205 
213  int estimateBatchSize(const bool& withVelocity) override;
214 
215  protected:
216  Particle particle;
217 
218  // list of lattice vectors, used for the Fourier transform from real
219  // to reciprocal space
220  Eigen::MatrixXd bravaisVectors;
221  // count the vector degeneracies, to use symmetries
222  Eigen::VectorXd vectorsDegeneracies;
223  Eigen::Matrix3d directUnitCell;
224  // hamiltonian matrix in real space <0m|H|nR>
225  Eigen::Tensor<std::complex<double>, 3> h0R;
226  // position matrix elements <0m|r|nR>
227  Eigen::Tensor<std::complex<double>, 4> rMatrix;
228 
229  int numWannier;
230  int numVectors;
231 
232  Eigen::Tensor<double,3> degeneracyShifts;
233  Eigen::Tensor<double,5> vectorsShifts;
234  bool hasShiftedVectors = false;
235 
236  ComplexView3D h0R_d;
237  DoubleView3D degeneracyShifts_d;
238  DoubleView5D vectorsShifts_d;
239  DoubleView1D vectorsDegeneracies_d;
240  DoubleView2D bravaisVectors_d;
241 
246  double getDeviceMemoryUsage();
247 
248 };
249 
250 #endif
Class for diagonalizing electronic energies with the Wannier interpolation The object is built passin...
Definition: electron_h0_wannier.h:17
std::tuple< std::vector< Eigen::VectorXd >, std::vector< Eigen::MatrixXcd >, std::vector< Eigen::Tensor< std::complex< double >, 3 > > > batchedDiagonalizeWithVelocities(std::vector< Eigen::Vector3d > cartesianCoordinates)
Same as diagonalizeVelocityFromCoordinates, but constructs the velocity operator for a batch of wavev...
Definition: electron_h0_wannier.cpp:643
ElectronH0Wannier(const Eigen::Matrix3d &directUnitCell_, const Eigen::MatrixXd &bravaisVectors_, const Eigen::VectorXd &vectorsDegeneracies_, const Eigen::Tensor< std::complex< double >, 3 > &h0R_, const Eigen::Tensor< std::complex< double >, 4 > *rMatrix_=nullptr)
Constructor for the electronic Hamiltonian in the Wannier case.
Definition: electron_h0_wannier.cpp:6
int getNumBands() override
get the total number of bands.
Definition: electron_h0_wannier.cpp:137
FullBandStructure populate(Points &fullPoints, const bool &withVelocities, const bool &withEigenvectors, const bool isDistributed=false) override
This method constructs an electron band structure.
Definition: electron_h0_wannier.cpp:365
double getDeviceMemoryUsage()
Checks the size of Device-allocated views.
Definition: electron_h0_wannier.cpp:1011
void addShiftedVectors(Eigen::Tensor< double, 3 > degeneracyShifts_, Eigen::Tensor< double, 5 > vectorsShifts_)
Function used during parsing, to add the shifts used in the phases for the Fourier interpolation.
Definition: electron_h0_wannier.cpp:570
std::tuple< DoubleView2D, StridedComplexView3D > kokkosBatchedDiagonalizeFromCoordinates(const DoubleView2D &cartesianCoordinates, const bool withMassScaling=true) override
Computes energies and eigenvectors of electrons for a batch of nk wavevectors.
Definition: electron_h0_wannier.cpp:865
~ElectronH0Wannier()
Class destructor.
Definition: electron_h0_wannier.cpp:123
std::tuple< std::vector< Eigen::VectorXd >, std::vector< Eigen::MatrixXcd >, std::vector< Eigen::Tensor< std::complex< double >, 3 > > > kokkosPopulate(const std::vector< Eigen::Vector3d > &cartesianCoordinates, const bool &withVelocities, const bool &withEigenvectors, const std::vector< int > &iks)
Internal helper function for kokkos diag of electron H0.
Definition: electron_h0_wannier.cpp:259
std::vector< Eigen::MatrixXcd > getBerryConnection(Point &point)
compute the Berry connection <u_mk| nabla_k |u_nk> at arb.
Definition: electron_h0_wannier.cpp:526
std::vector< Eigen::MatrixXcd > batchedBuildHamiltonians(std::vector< Eigen::Vector3d > &cartesianWavevectors)
Computes the Fourier transform of the Wannier Hamiltonian at a batch of wavevectors.
Definition: electron_h0_wannier.cpp:164
int estimateBatchSize(const bool &withVelocity) override
Estimate how many k-points we can compute on the GPU in one batch.
Definition: electron_h0_wannier.cpp:1019
Eigen::Tensor< std::complex< double >, 3 > diagonalizeVelocity(Point &point) override
get the electron velocities (in atomic units) at a single k-point.
Definition: electron_h0_wannier.cpp:242
std::tuple< Eigen::VectorXd, Eigen::MatrixXcd > diagonalizeFromCoordinates(Eigen::Vector3d &k) override
Diagonalize the Harmonic Hamiltonian at an arbitrary wavevector.
Definition: electron_h0_wannier.cpp:154
ElectronH0Wannier & operator=(const ElectronH0Wannier &that)
Copy assignment.
Definition: electron_h0_wannier.cpp:99
StridedComplexView3D kokkosBatchedBuildBlochHamiltonian(const DoubleView2D &cartesianCoordinates) override
Computes the Fourier transform of the Wannier Hamiltonian at a batch of wavevectors.
Definition: electron_h0_wannier.cpp:787
std::tuple< DoubleView2D, StridedComplexView3D, ComplexView4D > kokkosBatchedDiagonalizeWithVelocities(const DoubleView2D &cartesianCoordinates) override
Using kokkos, computes the electronic properties of a batch of wavevectors.
Definition: electron_h0_wannier.cpp:898
Particle getParticle() override
Method to return that the underlying is that of an electronic Fermion.
Definition: electron_h0_wannier.cpp:135
FullBandStructure cpuPopulate(Points &fullPoints, const bool &withVelocities, const bool &withEigenvectors, const bool isDistributed=false)
Internal helper function for cpu diag of electron H0.
Definition: electron_h0_wannier.cpp:467
std::tuple< std::vector< Eigen::VectorXd >, std::vector< Eigen::MatrixXcd > > batchedDiagonalizeFromCoordinates(std::vector< Eigen::Vector3d > &cartesianWavevectors)
Computes energies and eigenvectors of electrons for a batch of nk wavevectors.
Definition: electron_h0_wannier.cpp:223
std::tuple< Eigen::VectorXd, Eigen::MatrixXcd > diagonalize(Point &point) override
get the electronic energies (in Ry) at a single k-point.
Definition: electron_h0_wannier.cpp:140
FullBandStructure is the class that stores the energies, velocities and eigenvectors of a quasipartic...
Definition: bandstructure.h:318
Virtual base class for Harmonic Hamiltonian.
Definition: harmonic.h:15
Determines whether we are dealing with phonons or electrons.
Definition: particle.h:17
Class used to pass a single wavevector.
Definition: points.h:18
Base class for storing wavevectors in the Brillouin zone.
Definition: points.h:73