Phoebe developer's documentation  1.1.0
Phonon and Electron Boltzmann Equations
PhScatteringMatrix Class Reference

class representing the phonon scattering matrix. More...

#include <ph_scattering_matrix.h>

Inheritance diagram for PhScatteringMatrix:
Collaboration diagram for PhScatteringMatrix:

Public Member Functions

 PhScatteringMatrix (Context &context_, StatisticsSweep &statisticsSweep_, BaseBandStructure &innerBandStructure_, BaseBandStructure &outerBandStructure_, PhononH0 *phononH0_=nullptr)
 Default constructor. More...
 
- Public Member Functions inherited from BasePhScatteringMatrix
 BasePhScatteringMatrix (Context &context_, StatisticsSweep &statisticsSweep_, BaseBandStructure &innerBandStructure_, BaseBandStructure &outerBandStructure_)
 Constructor that just calls the constructor of scattering matrix.
 
- Public Member Functions inherited from ScatteringMatrix
 ScatteringMatrix (Context &context_, StatisticsSweep &statisticsSweep_, BaseBandStructure &innerBandStructure_, BaseBandStructure &outerBandStructure_)
 Scattering matrix constructor. More...
 
 ScatteringMatrix ()
 Default constructor.
 
void setup ()
 This method needs to be called right after the constructor. More...
 
VectorBTE diagonal ()
 Returns the diagonal matrix elements. More...
 
double & operator() (const int &row, const int &col)
 Get and set operator. More...
 
VectorBTE offDiagonalDot (VectorBTE &inPopulation)
 Computes the product A*f - diagonal(A)*f where A is the scattering matrix and f is the vector of quasiparticle populations.
 
std::vector< VectorBTEoffDiagonalDot (std::vector< VectorBTE > &inPopulations)
 
VectorBTE dot (VectorBTE &inPopulation)
 Computes the product A*f where A is the scattering matrix and f is the vector of quasiparticle populations.
 
std::vector< VectorBTEdot (std::vector< VectorBTE > &inPopulations)
 
VectorBTE getSingleModeTimes ()
 Call to obtain the single-particle relaxation times of the systems. More...
 
VectorBTE getLinewidths ()
 Converts symmetrized internal scattering matrix diagonal to linewidths and returns the result. More...
 
void setLinewidths (VectorBTE &linewidths)
 Call to set the single-particle linewidths. More...
 
VectorBTE getSingleModeTimes (const VectorBTE &anyInternalDiagonal)
 Call to obtain the single-particle relaxation times of the systems given any internal diagonal like object – (basically, the linewidths but potentially scaled by some symmetrization factor) More...
 
VectorBTE getLinewidths (const VectorBTE &anyInternalDiagonal)
 Call to obtain the single-particle linewidths. More...
 
void a2Omega ()
 Converts the scattering matrix from the form A to the symmetrised Omega. More...
 
void omega2A ()
 The inverse of a2Omega, converts the matrix Omega to A.
 
std::tuple< Eigen::VectorXd, ParallelMatrix< double > > diagonalize (int numEigenvalues=0)
 Diagonalize the scattering matrix. More...
 
int getSMatrixIndex (BteIndex &bteIndex, CartIndex &cartIndex)
 Function to combine a BTE index and a cartesian index into one index of the scattering matrix. More...
 
std::tuple< BteIndex, CartIndexgetSMatrixIndex (const int &iMat)
 Function to split a scattering matrix index (on rows/columns of S) into a BTE index and a cartesian index. More...
 
void symmetrize ()
 Reinforce the condition that the matrix is symmetric.
 
void relaxonsToJSON (const std::string &fileName, const Eigen::VectorXd &eigenvalues)
 Output relaxons scattering matrix quantities to file (particularly the tau values) Jenny's note: However, I have a feeling this should be elsewhere, as we're actually passing the eigenvalues back into this function. More...
 
std::vector< std::tuple< int, int > > getAllLocalStates ()
 Call the underlying PMatrix function to return the iterator of all elements of the matrix which are local. More...
 
void outputToHDF5 (const std::string &outFileName)
 Outputs the matrix to an hdf5 file. More...
 

Protected Member Functions

void builder (std::shared_ptr< VectorBTE > linewidth, std::vector< VectorBTE > &inPopulations, std::vector< VectorBTE > &outPopulations) override
 Method that actually computes the scattering matrix. More...
 
- Protected Member Functions inherited from ScatteringMatrix
std::vector< std::tuple< std::vector< int >, int > > getIteratorWavevectorPairs (const bool &rowMajor=false)
 Returns a vector of pairs of wavevector indices to iterate over during the construction of the scattering matrix. More...
 
void degeneracyAveragingLinewidths (std::shared_ptr< VectorBTE > linewidth)
 Performs an average of the linewidths over degenerate states. More...
 
Eigen::MatrixXd precomputeOccupations (BaseBandStructure &bandStructure)
 Function to precompute particle populations before scattering rates are calculated. More...
 
std::vector< int > getExcludeIndices (BaseBandStructure &bandStructure)
 Method which for a phonon bandstructure returns the indices to be discarded in a phonon calculation due to very low phonon frequencies. More...
 
void setMatrixCase (std::shared_ptr< VectorBTE > linewidth, std::vector< VectorBTE > &inPopulations, std::vector< VectorBTE > &outPopulations)
 
void addRateToMatrix (const Context &context, double linewidthRate, double matrixRate, int iCalc, int is1, int is2Irr, int iBte1, int iBte2, const Particle &p1, const Particle &p2, const Eigen::Matrix3d &rotation, std::shared_ptr< VectorBTE > linewidth, const std::vector< VectorBTE > &inPopulations, std::vector< VectorBTE > &outPopulations)
 Method to add scattering rate to matrix and linewidth containers. More...
 
void enforceDetailedBalance ()
 A function to fix the linewidths to agree with the off diagonal elements, to enforce finding the special eigenvectors.
 
void replaceMatrixLinewidths ()
 Replace the linewidths of the scatterng matrix with the supplied VectorBTE values.
 
std::tuple< BaseBandStructure *, BaseBandStructure * > getStateBandStructures (const BteIndex &iBte1, const BteIndex &iBte2)
 Returns a tuple of final and initial particles for a give state. More...
 
std::tuple< int, int > coupledToBandStructureIndices (const int &iBte1, const int &iBte2, const Particle &p1, const Particle &p2)
 If we have a coupled scattering matrix, we need to shift the matrix element indices back to those associated with ph and el bandstructures before accessing their quantities. More...
 
template<size_t n>
void addUNRates (int iCalc, int iBte, double rate, const std::array< Point, n > &crysPoints, auto momentumConsExpr)
 Generic function to add UN times to their containers. More...
 

Protected Attributes

PhononH0phononH0
 
- Protected Attributes inherited from ScatteringMatrix
Contextcontext
 
StatisticsSweepstatisticsSweep
 
BaseBandStructureinnerBandStructure
 
BaseBandStructureouterBandStructure
 
enum MatrixCase matrixCase
 
bool constantRTA = false
 
bool highMemory = true
 
bool outputUNTimes = false
 
double boundaryLength
 
bool doBoundary
 
bool isMatrixOmega = false
 
bool isCoupled = false
 
std::function< std::tuple< long, long >long, long, const Particle &, const Particle &)> shiftToCoupledIndices
 
std::shared_ptr< VectorBTEinternalDiagonal
 
std::shared_ptr< VectorBTEinternalDiagonalUmklapp
 
std::shared_ptr< VectorBTEinternalDiagonalNormal
 
ParallelMatrix< double > theMatrix
 
int numStates
 
int numCalculations
 
int dimensionality_
 
int numElStates = 0
 
std::vector< int > excludeIndices
 

Friends

void addPhPhScattering (BasePhScatteringMatrix &matrix, Context &context, std::vector< VectorBTE > &inPopulations, std::vector< VectorBTE > &outPopulations, std::vector< std::tuple< std::vector< int >, int >> qPairIterator, Eigen::MatrixXd &innerBose, Eigen::MatrixXd &outerBose, BaseBandStructure &innerBandStructure, BaseBandStructure &outerBandStructure, PhononH0 &phononH0, Interaction3Ph &coupling3Ph, std::shared_ptr< VectorBTE > linewidth)
 
void addIsotopeScattering (BasePhScatteringMatrix &matrix, Context &context, std::vector< VectorBTE > &inPopulations, std::vector< VectorBTE > &outPopulations, std::vector< std::tuple< std::vector< int >, int >> qPairIterator, Eigen::MatrixXd &innerBose, Eigen::MatrixXd &outerBose, BaseBandStructure &innerBandStructure, BaseBandStructure &outerBandStructure, std::shared_ptr< VectorBTE > linewidth)
 
void addPhElScattering (BasePhScatteringMatrix &matrix, Context &context, std::vector< VectorBTE > &inPopulations, std::vector< VectorBTE > &outPopulations, BaseBandStructure &phBandStructure, BaseBandStructure &elBandStructure, StatisticsSweep &statisticsSweep, InteractionElPhWan &couplingElPhWan, std::shared_ptr< VectorBTE > linewidth)
 

Additional Inherited Members

- Static Public Member Functions inherited from ScatteringMatrix
static void symmetrizeCoupling (Eigen::Tensor< double, 3 > &coupling, const Eigen::VectorXd &energies1, const Eigen::VectorXd &energies2, const Eigen::VectorXd &energies3)
 Average the coupling for degenerate states. More...
 

Detailed Description

This class contains the logic to compute the phonon scattering matrix. The parent class ScatteringMatrix instead contains the logic for managing the operations with phonon distribution vectors.

Constructor & Destructor Documentation

◆ PhScatteringMatrix()

PhScatteringMatrix::PhScatteringMatrix ( Context context_,
StatisticsSweep statisticsSweep_,
BaseBandStructure innerBandStructure_,
BaseBandStructure outerBandStructure_,
PhononH0 phononH0_ = nullptr 
)
Parameters
contextthe user-initialized variables.
statisticsSweepthe object containing the information on the temperatures to be used in the calculation.
innerBandStructurethis is the band structure object used for integrating the sum over q2 wavevectors.
outerBandStructurethis is the bandStructure object used for integrating the sum over q1 wavevectors.
h0the object used for constructing phonon energies.

Note: inner and outer band structures may be different, for example, if we want to compute the phonon linewidths on a path, the outer band structure contains the phonon dispersion relation along high symmetry lines, whereas the inner band structure contains the dispersion relation on a full grid of wavevectors. For transport calculations instead, inner=outer. Especially in the case of computing linewidths on a path, it might be necessary to compute phonon energies on a wavevector q3=q1+q2: for this reason, we need to pass also the phonon h0 object.

Member Function Documentation

◆ builder()

void PhScatteringMatrix::builder ( std::shared_ptr< VectorBTE linewidth,
std::vector< VectorBTE > &  inPopulations,
std::vector< VectorBTE > &  outPopulations 
)
overrideprotectedvirtual

Pure virtual function: needs an implementation in every subclass.

Implements ScatteringMatrix.

Here is the call graph for this function:

Friends And Related Function Documentation

◆ addPhPhScattering

void addPhPhScattering ( BasePhScatteringMatrix matrix,
Context context,
std::vector< VectorBTE > &  inPopulations,
std::vector< VectorBTE > &  outPopulations,
std::vector< std::tuple< std::vector< int >, int >>  qPairIterator,
Eigen::MatrixXd &  innerBose,
Eigen::MatrixXd &  outerBose,
BaseBandStructure innerBandStructure,
BaseBandStructure outerBandStructure,
PhononH0 phononH0,
Interaction3Ph coupling3Ph,
std::shared_ptr< VectorBTE linewidth 
)
friend

Very important: the code must be executed with a loop over q2 outside and a loop over q1 inside. This is because the 3-ph coupling must compute the Fourier transform on q1 and q2. The 3-ph class splits the Fourier transform in two parts, recycling the FT over q2 for more values of q1. Thus, we have some speed when executing in this order. PointHelper too assumes that order of loop execution.

Very important: the code must be executed with a loop over q2 outside and a loop over q1 inside. This is because the 3-ph coupling must compute the Fourier transform on q1 and q2. The 3-ph class splits the Fourier transform in two parts, recycling the FT over q2 for more values of q1. Thus, we have some speed when executing in this order. PointHelper too assumes that order of loop execution.