Phoebe developer's documentation  1.1.0
Phonon and Electron Boltzmann Equations
phonon_h0.h
1 #ifndef PHONON_H0_H
2 #define PHONON_H0_H
3 
4 #include <cmath>
5 
6 #include "bandstructure.h"
7 #include "constants.h"
8 #include "crystal.h"
9 #include "eigen.h"
10 #include "harmonic.h"
11 #include "particle.h"
12 #include "points.h"
13 #include "common_kokkos.h"
14 
21 class PhononH0 : public HarmonicHamiltonian {
22 
23  public:
32  PhononH0(Crystal &crystal,
33  Eigen::Tensor<double, 5> &forceConstants_,
34  Eigen::Vector3i& qCoarseGrid,
35  const Eigen::MatrixXd& bravaisVectors_,
36  const Eigen::VectorXd& weights_, const int fcRangeType);
37 
40  PhononH0(const PhononH0 &that);
41 
44  PhononH0 &operator=(const PhononH0 &that);
45 
48  ~PhononH0();
49 
52  int getNumBands() override;
53 
56  Particle getParticle() override;
57 
66  std::tuple<Eigen::VectorXd, Eigen::MatrixXcd> diagonalize(Point &point) override;
67 
78  std::tuple<Eigen::VectorXd, Eigen::MatrixXcd> diagonalizeFromCoordinates(
79  Eigen::Vector3d &q, const bool &withMassScaling);
80  std::tuple<Eigen::VectorXd, Eigen::MatrixXcd> diagonalizeFromCoordinates(
81  Eigen::Vector3d &q) override;
82 
88  Eigen::Tensor<std::complex<double>, 3> diagonalizeVelocity(Point &point) override;
89  Eigen::Tensor<std::complex<double>, 3> diagonalizeVelocityFromCoordinates(
90  Eigen::Vector3d &coordinates) override;
91 
99  FullBandStructure populate(Points &points, const bool &withVelocities,
100  const bool &withEigenvectors,
101  const bool isDistributed = false) override;
102  FullBandStructure cpuPopulate(Points &points, const bool &withVelocities,
103  const bool &withEigenvectors, bool isDistributed = false);
104  FullBandStructure kokkosPopulate(Points &points, const bool &withVelocities,
105  const bool &withEigenvectors, const bool isDistributed = false);
106  StridedComplexView3D kokkosBatchedBuildBlochHamiltonian(
107  const DoubleView2D &cartesianCoordinates) override;
108  std::tuple<DoubleView2D, StridedComplexView3D> kokkosBatchedDiagonalizeFromCoordinates(
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);
114 
119  Eigen::Vector3i getCoarseGrid();
120 
127  int getIndexEigenvector(const int &iAt, const int &iPol) const;
128 
132  static int getIndexEigenvector(const int &iAt, const int &iPol, const int &nAtoms);
133 
137  Eigen::Matrix3d getDielectricMatrix();
138 
142  Eigen::Tensor<double, 3> getBornCharges();
143 
151  int estimateBatchSize(const bool& withVelocity) override;
152 
157  void printDynToHDF5(Eigen::Vector3d& qCrys);
158 
159  // we want to designate these as medium or short range
160  // "medium" range are fcs that come from finite difference codes
161  // "short" range are fcs coming from q2r
162  static const int mediumRange = 0;
163  static const int shortRange = 1;
164 
165 protected:
166 
167  Particle particle;
168  Crystal &crystal;
169 
170  bool hasDielectric = false;
171  int numAtoms;
172  int numBands;
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;
181  int dimensionality;
182  int fcRangeType; // medium or short
183 
184  // TODO -- when long range correction for dim=2 has been really well checked,
185  // uncomment this to activate it
186  bool longRange2d = false;
187  double alpha;
188  double alat;
189 
190  // the R vectors on the WS cell used in the Fourier transform
191  int numBravaisVectors = 0;
192  Eigen::MatrixXd bravaisVectors;
193  Eigen::VectorXd weights;
194 
195  // container to store the D(R) matrix/the harmonic force constants
196  Eigen::Tensor<double,5> mat2R;
197 
198  Eigen::MatrixXd gVectors;
199  Eigen::Tensor<double,3> longRangeCorrection1;
200  const double gMax = 14.; // cutoff for ewald summation
201  const double e2 = 4;
202 
203  // kokkos members:
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;
213 
214  // private methods, used to diagonalize the Dyn matrix
215 
219  Eigen::Tensor<double, 5> wsInit(const Eigen::MatrixXd &unitCell,
220  const Eigen::Matrix3d &directUnitCell,
221  const int& nr1Big,
222  const int& nr2Big,
223  const int& nr3Big);
224 
225 
231  void addLongRangeTerm(Eigen::Tensor<std::complex<double>, 4> &dyn,
232  const Eigen::VectorXd &q);
233 
239  void shortRangeTerm(Eigen::Tensor<std::complex<double>, 4> &dyn,
240  const Eigen::VectorXd &q);
241 
248  void addMediumRangeTerm(Eigen::Tensor<std::complex<double>, 4> &dyn,
249  const Eigen::VectorXd &q);
250 
255  std::tuple<Eigen::VectorXd, Eigen::MatrixXcd> dynDiagonalize(
256  Eigen::Tensor<std::complex<double>, 4> &dyn);
257 
264  void correctMediumRangeIFCs(Eigen::Tensor<double, 4> &fq, const Eigen::VectorXd &q);
265 
270  double getDeviceMemoryUsage();
271 
272 };
273 
274 // utility functions which are related but not necessarily connected to the class
275 
285 void setAcousticSumRule(const std::string &sumRule, Crystal& crystal,
286  const Eigen::Vector3i& qCoarseGrid,
287  Eigen::Tensor<double, 7>& forceConstants);
288 
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);
304 
308 double wsWeight(const Eigen::VectorXd &r, const Eigen::MatrixXd &rws);
309 
310 #endif
311 
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