Phoebe developer's documentation  1.1.0
Phonon and Electron Boltzmann Equations
electron_h0_fourier.h
1 #ifndef H0FOURIER_H
2 #define H0FOURIER_H
3 
4 #include <string>
5 
6 #include "bandstructure.h"
7 #include "harmonic.h"
8 #include "points.h"
9 #include "context.h"
10 #include "common_kokkos.h"
11 
18  public:
19 
32  ElectronH0Fourier(Crystal &crystal_, const Points& coarsePoints_,
33  const FullBandStructure& coarseBandStructure_, double cutoff);
34 
37  Particle getParticle() override;
38 
42  int getNumBands() override;
43 
53  std::tuple<Eigen::VectorXd, Eigen::MatrixXcd> diagonalize(Point &point) override;
54 
55  std::tuple<Eigen::VectorXd, Eigen::MatrixXcd> diagonalizeFromCoordinates(
56  Eigen::Vector3d &wavevector) override;
57 
65  Eigen::Tensor<std::complex<double>, 3> diagonalizeVelocity(Point &point) override;
66  Eigen::Tensor<std::complex<double>, 3> diagonalizeVelocityFromCoordinates(
67  Eigen::Vector3d &coordinates) override;
68 
77  FullBandStructure populate(Points &fullPoints, const bool &withVelocities,
78  const bool &withEigenvectors,
79  const bool isDistributed=false) override;
80 
81  void trimBands(Context &context, const double &minEn, const double &maxEn);
82  virtual StridedComplexView3D kokkosBatchedBuildBlochHamiltonian(
83  const DoubleView2D &cartesianCoordinates) override;
84  virtual std::tuple<DoubleView2D, StridedComplexView3D, ComplexView4D>
85  kokkosBatchedDiagonalizeWithVelocities(
86  const DoubleView2D &cartesianCoordinates) override;
87  std::tuple<DoubleView2D, StridedComplexView3D>
88  kokkosBatchedDiagonalizeFromCoordinates(
89  const DoubleView2D &cartesianCoordinates, const bool withMassScaling=true) override;
90  protected:
91  Crystal &crystal;
92  FullBandStructure coarseBandStructure;
93  Points coarsePoints;
94  Particle particle;
95 
96  Eigen::MatrixXcd expansionCoefficients;
97 
98  int numBands;
99  double cutoff;
100  int numDataPoints;
101  int numPositionVectors = 0;
102  double minDistance = 10.;
103  Eigen::VectorXd positionDegeneracies;
104  Eigen::MatrixXd positionVectors;
105  Eigen::Vector3d refWavevector;
106 
107  void setPositionVectors();
108  Eigen::VectorXcd getLagrangeMultipliers(Eigen::VectorXd energies);
109  Eigen::VectorXcd getCoefficients(Eigen::VectorXd energies);
110  std::complex<double> getStarFunction(Eigen::Vector3d &wavevector, int &iR);
111  Eigen::Vector3cd getDerivativeStarFunction(Eigen::Vector3d &wavevector,
112  int &iR);
113  double getRoughnessFunction(const Eigen::Vector3d &position) const;
114  const double coefficient1 = 0.75; // 3/4
115  const double coefficient2 = 0.75;
116  double getEnergyFromCoordinates(Eigen::Vector3d &wavevector, int &bandIndex);
117  Eigen::Vector3d getGroupVelocityFromCoordinates(Eigen::Vector3d &wavevector,
118  int &bandIndex);
119 };
120 
121 #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
Class for a Fourier-like interpolation of an electronic band structure.
Definition: electron_h0_fourier.h:17
std::tuple< Eigen::VectorXd, Eigen::MatrixXcd > diagonalize(Point &point) override
get the electronic energies (in Ry) at a single k-point.
Definition: electron_h0_fourier.cpp:82
Particle getParticle() override
Method to return that the underlying is that of an electronic Fermion.
Definition: electron_h0_fourier.cpp:77
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_fourier.cpp:103
std::tuple< Eigen::VectorXd, Eigen::MatrixXcd > diagonalizeFromCoordinates(Eigen::Vector3d &wavevector) override
Diagonalize the Harmonic Hamiltonian at an arbitrary wavevector.
Definition: electron_h0_fourier.cpp:92
int getNumBands() override
Get the total number of bands available at ech wavevector.
Definition: electron_h0_fourier.cpp:79
ElectronH0Fourier(Crystal &crystal_, const Points &coarsePoints_, const FullBandStructure &coarseBandStructure_, double cutoff)
Constructor of the Fourier interpolation This class stores a copy of the electronic band structure on...
Definition: electron_h0_fourier.cpp:45
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_fourier.cpp:123
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