6 #include "bandstructure.h"
13 #include "common_kokkos.h"
33 Eigen::Tensor<double, 5> &forceConstants_,
34 Eigen::Vector3i& qCoarseGrid,
35 const Eigen::MatrixXd& bravaisVectors_,
36 const Eigen::VectorXd& weights_,
const int fcRangeType);
66 std::tuple<Eigen::VectorXd, Eigen::MatrixXcd>
diagonalize(
Point &point)
override;
79 Eigen::Vector3d &q,
const bool &withMassScaling);
81 Eigen::Vector3d &q)
override;
89 Eigen::Tensor<std::complex<double>, 3> diagonalizeVelocityFromCoordinates(
90 Eigen::Vector3d &coordinates)
override;
100 const bool &withEigenvectors,
101 const bool isDistributed =
false)
override;
103 const bool &withEigenvectors,
bool isDistributed =
false);
105 const bool &withEigenvectors,
const bool isDistributed =
false);
107 const DoubleView2D &cartesianCoordinates)
override;
109 const DoubleView2D &cartesianCoordinates,
const bool withMassScaling =
true)
override;
110 std::tuple<DoubleView2D, StridedComplexView3D, ComplexView4D>
112 const DoubleView2D &cartesianCoordinates)
override;
113 void kokkosBatchedScaleEigenvectors(StridedComplexView3D& eigenvectors);
162 static const int mediumRange = 0;
163 static const int shortRange = 1;
170 bool hasDielectric =
false;
173 double volumeUnitCell;
174 Eigen::MatrixXi atomicSpecies;
175 Eigen::VectorXd speciesMasses;
176 Eigen::MatrixXd atomicPositions;
177 Eigen::Matrix3d dielectricMatrix;
178 Eigen::Tensor<double, 3> bornCharges;
179 Eigen::Vector3i qCoarseGrid;
180 Eigen::Matrix3d directUnitCell;
186 bool longRange2d =
false;
191 int numBravaisVectors = 0;
192 Eigen::MatrixXd bravaisVectors;
193 Eigen::VectorXd weights;
196 Eigen::Tensor<double,5> mat2R;
198 Eigen::MatrixXd gVectors;
199 Eigen::Tensor<double,3> longRangeCorrection1;
200 const double gMax = 14.;
204 DoubleView1D atomicMasses_d;
205 DoubleView3D longRangeCorrection1_d;
206 DoubleView2D gVectors_d;
207 DoubleView2D dielectricMatrix_d;
208 DoubleView3D bornCharges_d;
209 DoubleView2D atomicPositions_d;
210 DoubleView2D bravaisVectors_d;
211 DoubleView1D weights_d;
212 DoubleView3D mat2R_d;
219 Eigen::Tensor<double, 5>
wsInit(
const Eigen::MatrixXd &unitCell,
220 const Eigen::Matrix3d &directUnitCell,
232 const Eigen::VectorXd &q);
240 const Eigen::VectorXd &q);
249 const Eigen::VectorXd &q);
256 Eigen::Tensor<std::complex<double>, 4> &dyn);
285 void setAcousticSumRule(
const std::string &sumRule,
Crystal& crystal,
286 const Eigen::Vector3i& qCoarseGrid,
287 Eigen::Tensor<double, 7>& forceConstants);
300 std::tuple<Eigen::Tensor<double, 5>,Eigen::MatrixXd,Eigen::VectorXd>
301 reorderHarmonicForceConstants(
Crystal& crystal,
302 const Eigen::Tensor<double, 7>& forceConstants,
303 Eigen::Vector3i& qCoarseGrid);
308 double wsWeight(
const Eigen::VectorXd &r,
const Eigen::MatrixXd &rws);
Object to store the information on the crystal unit cell, such as atomic positions,...
Definition: crystal.h:18
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 that computes phonon energies, velocities and eigenvectors.
Definition: phonon_h0.h:21
std::tuple< Eigen::VectorXd, Eigen::MatrixXcd > diagonalizeFromCoordinates(Eigen::Vector3d &q, const bool &withMassScaling)
Equivalent to diagonalize() computes phonon eigenValues/Vectors given the wavevector,...
Definition: phonon_h0.cpp:360
FullBandStructure kokkosPopulate(Points &points, const bool &withVelocities, const bool &withEigenvectors, const bool isDistributed=false)
Make a bandstructure for all the k-points.
Definition: phonon_h0_kokkos.cpp:249
Eigen::Tensor< std::complex< double >, 3 > diagonalizeVelocity(Point &point) override
get the phonon velocities (in atomic units) at a single q-point.
Definition: phonon_h0.cpp:636
void shortRangeTerm(Eigen::Tensor< std::complex< double >, 4 > &dyn, const Eigen::VectorXd &q)
This part computes the short-range part of the dynamical matrix, which is the Fourier transform of th...
Definition: phonon_h0.cpp:541
std::tuple< DoubleView2D, StridedComplexView3D > kokkosBatchedDiagonalizeFromCoordinates(const DoubleView2D &cartesianCoordinates, const bool withMassScaling=true) override
Create and diagonalize Hamiltonians for a batch of k-points.
Definition: phonon_h0_kokkos.cpp:173
std::tuple< Eigen::VectorXd, Eigen::MatrixXcd > dynDiagonalize(Eigen::Tensor< std::complex< double >, 4 > &dyn)
dynDiagonalize diagonalizes the dynamical matrix and returns eigenvalues and eigenvectors.
Definition: phonon_h0.cpp:579
Eigen::Vector3i getCoarseGrid()
Returns the size of the q-point coarse grid on which the force constants have been computed.
Definition: phonon_h0.cpp:771
PhononH0 & operator=(const PhononH0 &that)
Copy assignment operator.
Definition: phonon_h0.cpp:283
StridedComplexView3D kokkosBatchedBuildBlochHamiltonian(const DoubleView2D &cartesianCoordinates) override
Build the Hamiltonian matrix for a batch of q-points.
Definition: phonon_h0_kokkos.cpp:6
int getNumBands() override
Returns the number of phonon bands for the crystal in consideration.
Definition: phonon_h0.cpp:338
FullBandStructure populate(Points &points, const bool &withVelocities, const bool &withEigenvectors, const bool isDistributed=false) override
This method constructs a phonon band structure.
Definition: phonon_h0.cpp:408
Eigen::Matrix3d getDielectricMatrix()
Get the static dielectric constant matrix.
Definition: phonon_h0.cpp:773
void correctMediumRangeIFCs(Eigen::Tensor< double, 4 > &fq, const Eigen::VectorXd &q)
Function analogous to nonanal_ifc in QE's matdyn – returns f_of_q, which is a correction to be applie...
Definition: phonon_h0.cpp:860
~PhononH0()
Destructor.
Definition: phonon_h0.cpp:324
Eigen::Tensor< double, 5 > wsInit(const Eigen::MatrixXd &unitCell, const Eigen::Matrix3d &directUnitCell, const int &nr1Big, const int &nr2Big, const int &nr3Big)
In wsInit, starting from the primitive crystal unit cell, we build the list of bravais lattice vector...
int getIndexEigenvector(const int &iAt, const int &iPol) const
Utility to convert the indices of atom basis and polarization into the index that has to be used with...
Definition: phonon_h0.cpp:777
void addMediumRangeTerm(Eigen::Tensor< std::complex< double >, 4 > &dyn, const Eigen::VectorXd &q)
This part computes the "medium"-range part of the dynamical matrix, which is needed for the polar cor...
Definition: phonon_h0.cpp:895
void printDynToHDF5(Eigen::Vector3d &qCrys)
Helper function to print the dynamical matrix file to HDF5, for developer testing purposes.
Definition: phonon_h0.cpp:786
void addLongRangeTerm(Eigen::Tensor< std::complex< double >, 4 > &dyn, const Eigen::VectorXd &q)
Adds the long range correction to the dynamical matrix due to dipole-ion interaction.
Definition: phonon_h0.cpp:446
Particle getParticle() override
Returns the underlying phonon-boson particle.
Definition: phonon_h0.cpp:340
PhononH0(Crystal &crystal, Eigen::Tensor< double, 5 > &forceConstants_, Eigen::Vector3i &qCoarseGrid, const Eigen::MatrixXd &bravaisVectors_, const Eigen::VectorXd &weights_, const int fcRangeType)
Constructor, which stores all input data.
Definition: phonon_h0.cpp:17
Eigen::Tensor< double, 3 > getBornCharges()
Get the Born effective charges for the ions in the unit cell.
Definition: phonon_h0.cpp:775
double getDeviceMemoryUsage()
Checks the size of Device-allocated views.
Definition: phonon_h0_kokkos.cpp:214
std::tuple< DoubleView2D, StridedComplexView3D, ComplexView4D > kokkosBatchedDiagonalizeWithVelocities(const DoubleView2D &cartesianCoordinates) override
Create and diagonalize Hamiltonians for a batch of k-points, with velocities Returns the energies (nk...
Definition: phonon_h0_kokkos.cpp:371
int estimateBatchSize(const bool &withVelocity) override
Estimate how many k-points we can compute on the GPU in one batch.
Definition: phonon_h0_kokkos.cpp:223
std::tuple< Eigen::VectorXd, Eigen::MatrixXcd > diagonalize(Point &point) override
get the phonon energies (in Ry) at a single q-point.
Definition: phonon_h0.cpp:343
Class used to pass a single wavevector.
Definition: points.h:18
Base class for storing wavevectors in the Brillouin zone.
Definition: points.h:73