Phoebe developer's documentation  1.1.0
Phonon and Electron Boltzmann Equations
elph_qe_to_phoebe_app.h
1 #ifndef EL_PH_BLOCH_TO_WAN_APP_H
2 #define EL_PH_BLOCH_TO_WAN_APP_H
3 
4 #include "app.h"
5 #include "electron_h0_wannier.h"
6 #include "phonon_h0.h"
7 
10 class ElPhQeToPhoebeApp : public App {
11 public:
14  void run(Context &context) override;
15 
18  void checkRequirements(Context &context) override;
19 
20  // these are public because need testing
40  static std::tuple<Eigen::Vector3i, Eigen::Vector3i, Eigen::MatrixXd,
41  Eigen::MatrixXd, Eigen::MatrixXd, int, int, int, int>
42  readQEPhoebeHeader(Crystal &crystal, const std::string &phoebePrefixQE);
43 
64  Context &context, Crystal &crystal, PhononH0 &phononH0, Points &kPoints,
65  Points &qPoints, int numQEBands, int numModes, int numIrrQPoints,
66  int numElectrons, int numSpin, const Eigen::MatrixXd &energies,
67  const Eigen::MatrixXd &kGridFull, const Eigen::Vector3i &kMesh,
68  const Eigen::Vector3i &qMesh, bool runTests = false);
69 
70 protected:
102  Eigen::Tensor<std::complex<double>, 5> static blochToWannier(
103  const Eigen::MatrixXd &elBravaisVectors,
104  const Eigen::MatrixXd &phBravaisVectors,
105  Eigen::Tensor<std::complex<double>, 5> &gFull,
106  const Eigen::Tensor<std::complex<double>, 3> &uMatrices,
107  const Eigen::Tensor<std::complex<double>, 3> &phEigenvectors,
108  Points &kPoints, Points &qPoints, Crystal &crystal, PhononH0 &phononH0);
109 
110  Eigen::Tensor<std::complex<double>, 5> BlochToWannierEfficient(
111  Context &context, const Eigen::MatrixXd &energies,
112  const Eigen::MatrixXd &kGridFull, const int &numIrrQPoints,
113  const int &numQEBands, const Eigen::MatrixXd &elBravaisVectors,
114  const Eigen::MatrixXd &phBravaisVectors,
115  const Eigen::Tensor<std::complex<double>, 3> &uMatrices, Points &kPoints,
116  Points &qPoints, Crystal &crystal, PhononH0 &phononH0);
117 
130  static Eigen::Tensor<std::complex<double>, 3>
131  setupRotationMatrices(const std::string &wannierPrefix, Points &fullPoints);
132 
161  std::tuple<Eigen::Tensor<std::complex<double>, 5>,
162  Eigen::Tensor<std::complex<double>, 3>, Eigen::MatrixXd>
163  readGFromQEFile(Context &context, const int &numModes, const int &numBands,
164  const int &numWannier, Points &kPoints, Points &qPoints,
165  const Eigen::MatrixXd &kGridFull, const int &numIrrQPoints,
166  const int &numQEBands, const Eigen::MatrixXd &energies);
167 
168  std::tuple<Eigen::Tensor<std::complex<double>, 5>,
169  Eigen::Tensor<std::complex<double>, 3>, Eigen::MatrixXd,
170  Eigen::MatrixXd>
171  readChunkGFromQE(const int &iqIrr, Context &context, Points &kPoints,
172  const int &numModes, const int &numQEBands,
173  const Eigen::VectorXi &ikMap);
174 
179  static int computeOffset(const Eigen::MatrixXd &energies,
180  const std::string &wannierPrefix);
181 
182  // valid choices of interpolation, either "wannier" or "epa"
183  std::vector<std::string> choices;
184 
187  void epaPostProcessing(Context &context, Eigen::MatrixXd &elEnergies,
188  Points &kPoints, Points &qPoints,
189  const int &numElectrons, const int &numSpin,
190  const int &numModes, const int &numIrrQPoints,
191  const int &numQEBands,
192  const Eigen::MatrixXd &kGridFull);
193 
197  static void testElectronicTransform(
198  Points &kPoints, const std::string &wannierPrefix,
199  const Eigen::MatrixXd &elBravaisVectors,
200  const Eigen::Tensor<std::complex<double>, 3> &uMatrices,
201  const Eigen::VectorXd &elDegeneracies, ElectronH0Wannier &electronH0);
202 
206  static void testPhononTransform(
207  Crystal &crystal, PhononH0 &phononH0, Points &qPoints,
208  const Eigen::Tensor<std::complex<double>, 3> &phEigenvectors,
209  const Eigen::MatrixXd &phBravaisVectors,
210  const Eigen::VectorXd &phDegeneracies, const Eigen::MatrixXd &phEnergies);
211 
216  static void testBackTransform(Context &context, PhononH0 &phononH0,
217  Points &kPoints, Points &qPoints,
218  ElectronH0Wannier &electronH0, Crystal &crystal,
219  Eigen::Tensor<std::complex<double>, 5> &gFull);
220 
235  static void writeWannierCoupling(
236  Context &context, Eigen::Tensor<std::complex<double>, 5> &gWannier,
237  const int &numFilledWannier, const int &numSpin, const int &numModes,
238  const int &numWannier, const Eigen::VectorXd &phDegeneracies,
239  const Eigen::VectorXd &elDegeneracies,
240  const Eigen::MatrixXd &phBravaisVectors,
241  const Eigen::MatrixXd &elBravaisVectors, const Eigen::Vector3i &qMesh,
242  const Eigen::Vector3i &kMesh);
243 };
244 
245 #endif
Base class for launching apps.
Definition: app.h:22
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
Main driver for the transport calculation.
Definition: elph_qe_to_phoebe_app.h:10
static int computeOffset(const Eigen::MatrixXd &energies, const std::string &wannierPrefix)
This method compares the energies computed by qe2wannier90 and the energies of quantum espresso pw....
Definition: qe_to_phoebe_wannier.cpp:936
void postProcessingWannier(Context &context, Crystal &crystal, PhononH0 &phononH0, Points &kPoints, Points &qPoints, int numQEBands, int numModes, int numIrrQPoints, int numElectrons, int numSpin, const Eigen::MatrixXd &energies, const Eigen::MatrixXd &kGridFull, const Eigen::Vector3i &kMesh, const Eigen::Vector3i &qMesh, bool runTests=false)
This is the driver for converting QE data to Phoebe data for Wannier interpolation of the el-ph coupl...
Definition: qe_to_phoebe_wannier.cpp:1012
std::tuple< Eigen::Tensor< std::complex< double >, 5 >, Eigen::Tensor< std::complex< double >, 3 >, Eigen::MatrixXd > readGFromQEFile(Context &context, const int &numModes, const int &numBands, const int &numWannier, Points &kPoints, Points &qPoints, const Eigen::MatrixXd &kGridFull, const int &numIrrQPoints, const int &numQEBands, const Eigen::MatrixXd &energies)
Reads the electron-phonon coupling computed by QE on a coarse grid.
Definition: elph_qe_to_phoebe_app.cpp:176
static void testBackTransform(Context &context, PhononH0 &phononH0, Points &kPoints, Points &qPoints, ElectronH0Wannier &electronH0, Crystal &crystal, Eigen::Tensor< std::complex< double >, 5 > &gFull)
Test that the transform Wannier To Bloch of the electron-phonon coupling returns the original results...
Definition: qe_to_phoebe_utils.cpp:295
static Eigen::Tensor< std::complex< double >, 5 > blochToWannier(const Eigen::MatrixXd &elBravaisVectors, const Eigen::MatrixXd &phBravaisVectors, Eigen::Tensor< std::complex< double >, 5 > &gFull, const Eigen::Tensor< std::complex< double >, 3 > &uMatrices, const Eigen::Tensor< std::complex< double >, 3 > &phEigenvectors, Points &kPoints, Points &qPoints, Crystal &crystal, PhononH0 &phononH0)
Transform the electron-phonon coupling computed by QE from the Bloch to the Wannier representation.
Definition: qe_to_phoebe_wannier.cpp:450
void epaPostProcessing(Context &context, Eigen::MatrixXd &elEnergies, Points &kPoints, Points &qPoints, const int &numElectrons, const int &numSpin, const int &numModes, const int &numIrrQPoints, const int &numQEBands, const Eigen::MatrixXd &kGridFull)
Main driver for generating the EPA coupling.
Definition: qe_to_phoebe_epa.cpp:10
static void writeWannierCoupling(Context &context, Eigen::Tensor< std::complex< double >, 5 > &gWannier, const int &numFilledWannier, const int &numSpin, const int &numModes, const int &numWannier, const Eigen::VectorXd &phDegeneracies, const Eigen::VectorXd &elDegeneracies, const Eigen::MatrixXd &phBravaisVectors, const Eigen::MatrixXd &elBravaisVectors, const Eigen::Vector3i &qMesh, const Eigen::Vector3i &kMesh)
This function writes the el-ph coupling to file.
Definition: qe_to_phoebe_utils.cpp:839
static std::tuple< Eigen::Vector3i, Eigen::Vector3i, Eigen::MatrixXd, Eigen::MatrixXd, Eigen::MatrixXd, int, int, int, int > readQEPhoebeHeader(Crystal &crystal, const std::string &phoebePrefixQE)
In this function, we read the header file produced by the patched QE version.
Definition: elph_qe_to_phoebe_app.cpp:288
static Eigen::Tensor< std::complex< double >, 3 > setupRotationMatrices(const std::string &wannierPrefix, Points &fullPoints)
Returns the rotation that moves the wave-function from the (entangled) Bloch representation to the di...
Definition: qe_to_phoebe_wannier.cpp:810
void checkRequirements(Context &context) override
Check that user provided all necessary input.
Definition: elph_qe_to_phoebe_app.cpp:47
static void testElectronicTransform(Points &kPoints, const std::string &wannierPrefix, const Eigen::MatrixXd &elBravaisVectors, const Eigen::Tensor< std::complex< double >, 3 > &uMatrices, const Eigen::VectorXd &elDegeneracies, ElectronH0Wannier &electronH0)
Test that the transform Wannier To Bloch of the electronic Hamiltonian returns the original results c...
Definition: qe_to_phoebe_utils.cpp:17
void run(Context &context) override
Executes the program contained in this class.
Definition: elph_qe_to_phoebe_app.cpp:10
static void testPhononTransform(Crystal &crystal, PhononH0 &phononH0, Points &qPoints, const Eigen::Tensor< std::complex< double >, 3 > &phEigenvectors, const Eigen::MatrixXd &phBravaisVectors, const Eigen::VectorXd &phDegeneracies, const Eigen::MatrixXd &phEnergies)
Test that the transform Wannier To Bloch of the phonon harmonic Hamiltonian returns the original resu...
Definition: qe_to_phoebe_utils.cpp:134
Class for diagonalizing electronic energies with the Wannier interpolation The object is built passin...
Definition: electron_h0_wannier.h:17
class that computes phonon energies, velocities and eigenvectors.
Definition: phonon_h0.h:21
Base class for storing wavevectors in the Brillouin zone.
Definition: points.h:73