1 #ifndef EL_PH_BLOCH_TO_WAN_APP_H
2 #define EL_PH_BLOCH_TO_WAN_APP_H
5 #include "electron_h0_wannier.h"
40 static std::tuple<Eigen::Vector3i, Eigen::Vector3i, Eigen::MatrixXd,
41 Eigen::MatrixXd, Eigen::MatrixXd, int, int, int,
int>
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);
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,
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,
130 static Eigen::Tensor<std::complex<double>, 3>
161 std::tuple<Eigen::Tensor<std::complex<double>, 5>,
162 Eigen::Tensor<std::complex<double>, 3>, Eigen::MatrixXd>
164 const int &numWannier,
Points &kPoints,
Points &qPoints,
165 const Eigen::MatrixXd &kGridFull,
const int &numIrrQPoints,
166 const int &numQEBands,
const Eigen::MatrixXd &energies);
168 std::tuple<Eigen::Tensor<std::complex<double>, 5>,
169 Eigen::Tensor<std::complex<double>, 3>, Eigen::MatrixXd,
171 readChunkGFromQE(
const int &iqIrr,
Context &context,
Points &kPoints,
172 const int &numModes,
const int &numQEBands,
173 const Eigen::VectorXi &ikMap);
180 const std::string &wannierPrefix);
183 std::vector<std::string> choices;
189 const int &numElectrons,
const int &numSpin,
190 const int &numModes,
const int &numIrrQPoints,
191 const int &numQEBands,
192 const Eigen::MatrixXd &kGridFull);
198 Points &kPoints,
const std::string &wannierPrefix,
199 const Eigen::MatrixXd &elBravaisVectors,
200 const Eigen::Tensor<std::complex<double>, 3> &uMatrices,
208 const Eigen::Tensor<std::complex<double>, 3> &phEigenvectors,
209 const Eigen::MatrixXd &phBravaisVectors,
210 const Eigen::VectorXd &phDegeneracies,
const Eigen::MatrixXd &phEnergies);
219 Eigen::Tensor<std::complex<double>, 5> &gFull);
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);
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