Class GammaTable

Inheritance Relationships

Base Type

Class Documentation

class brille::GammaTable : public brille::RotateTable

A convenient store for (F₀(k,R), ⃗rₖ - R ⃗rₗ) pairs.

The application of a symmetry operation to a crystal strcture leaves its total energy unchanged. The same is true for the total potential energy of the crystal. The force constant matrix, howerever, which is the combination of all forces acting on atom k for a displacement of atom l, is not invariant but instead the atom labels are permuted and individual-pairs are transformed as tensors.

The dynamical matrix is the mass noramalised form of the Fourier transform of the force constant matrix. In addition to the atom label permutation application of a symmetry operation to the dynamical matrix appends a per-equivalent-atom-pair phase factor due to the possibility that the operation moves equivalent atoms in one unit cell into different unit cells.

Phonons are the solutions to the equations of motion described by the dynamical matrix. The solutions make use of the dynamical matrix eigenvectors_ which also acquire a per-atom phase factor upon operation of a symmetry element. The phase factor is exp[i ⃗Q⋅( ⃗rₖ - R ⃗rₗ )] = exp[i R ⃗q ⋅ ( ⃗rₗ - R ⃗rₖ)] = exp[i ⃗q ⋅ (R⁻¹ ⃗rₗ - ⃗rₖ)] where l is the equivalent atom which R transforms k to l = F₀(k,R)

brille uses only the point group operations to find equivalent qᵢᵣ to q = Q - τ A pointgroup never contains more than 48 elements, and for each the permutation and vector are unique. This class is designed to hold the Nₚ × Nₐ values of F₀(k,R) and (R⁻¹ ⃗rₖ - ⃗rₗ) where there are Nₚ pointgroup operations and Nₐ atoms in the Basis.

Rather than storing a 2D array of F₀(k,R) and a 2D array of (R⁻¹ ⃗rₖ - ⃗rₗ), let the standard template library do the heavy lifting. If k ∈ {0, Nₐ-1} and r ∈ {0, Nₚ-1} index a std::map with keys that are the pairs (k,r); and use the values to store (N₀(k,Rᵣ), v) where v is an index into a LDVec of the (R⁻¹ ⃗rₗ - ⃗rₖ).

The LDVec could contain only unique (R⁻¹ ⃗rₗ - ⃗rₖ) values, but this is left for a future exercise if it becomes necessary.

Public Types

using ind_t = unsigned

Public Functions

GammaTable()

element v is (Rᵣ⁻¹ ⃗rₖ - ⃗rₗ)

GammaTable(const Direct &dlat, const int time_reversal = 0)
bool construct(const Direct &dlat, const int time_reversal = 0)
template<class Ik, class Ir>
ind_t F0(Ik k, Ir r) const
const bArray<double> &vectors() const
template<class Ik, class Ir>
ind_t vector_index(Ik k, Ir r) const
template<class Ik, class Ir>
bArray<double> vector(Ik k, Ir r) const
template<class Ik, class Ir>
LDVec<double> ldvector(Ik k, Ir r) const
const Direct &lattice() const