6 #include "bandstructure.h"
11 #include "common_kokkos.h"
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);
65 std::tuple<Eigen::VectorXd, Eigen::MatrixXcd>
diagonalize(
Point &point)
override;
68 Eigen::Vector3d &k)
override;
77 std::tuple<std::vector<Eigen::VectorXd>, std::vector<Eigen::MatrixXcd>>
88 std::vector<Eigen::Vector3d>& cartesianWavevectors);
100 const DoubleView2D &cartesianCoordinates)
override;
112 const DoubleView2D &cartesianCoordinates,
const bool withMassScaling=
true)
override;
121 std::tuple<DoubleView2D, StridedComplexView3D, ComplexView4D>
123 const DoubleView2D &cartesianCoordinates)
override;
131 Eigen::Tensor<std::complex<double>, 3> diagonalizeVelocityFromCoordinates(
132 Eigen::Vector3d &coordinates)
override;
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);
156 const bool &withEigenvectors,
157 const bool isDistributed=
false)
override;
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);
176 const bool &withEigenvectors,
177 const bool isDistributed=
false);
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);
204 Eigen::Tensor<double,5> vectorsShifts_);
220 Eigen::MatrixXd bravaisVectors;
222 Eigen::VectorXd vectorsDegeneracies;
223 Eigen::Matrix3d directUnitCell;
225 Eigen::Tensor<std::complex<double>, 3> h0R;
227 Eigen::Tensor<std::complex<double>, 4> rMatrix;
232 Eigen::Tensor<double,3> degeneracyShifts;
233 Eigen::Tensor<double,5> vectorsShifts;
234 bool hasShiftedVectors =
false;
237 DoubleView3D degeneracyShifts_d;
238 DoubleView5D vectorsShifts_d;
239 DoubleView1D vectorsDegeneracies_d;
240 DoubleView2D bravaisVectors_d;
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