Acoustic sum rule

One fundamental aspect of symmetries of phonons is the so called acoustic sum rule. This properties stems from the invariance of physical properties to global translations, and it is reflected to the fact that acoustic phonons, at the center of the Brilluin zone, have a vaninshing energy.

Therefore, the force constant matrix in real space, has always a kernel of dimension equal to the number of acoustic phonons: i.e. the number of operations under which the system is completely invariant.

The application of the acoustic sum rule depends on the dimensionality of the system, as well as the number of dimension. AtomicSymmetries.jl implements acoustic sum rules via defining a set of rules to compute it.

The standard acoustic sum rule is imposed by defining a structure ASRConstraint! which contains the dimension of the system. Then, the structure can act as a method to vectors and force constant matrices imposing the ASR condition on them.

AtomicSymmetries.ASRConstraint!Type

ASRConstraint!

Apply the ASR constraint to a rank-rank tensor of dimension dimension. The application works as

my_asr! = ASRconstraint!(dimension, 2)
my_tensor = rand(nat * dimension, nat * dimension)
my_asr!(my_tensor)

This will apply the ASR constraint to the tensor my_tensor in place.

source

It is possible to automatically identify translational modes with translation_mask! subroutine, which returns false to modes that are purely translational. This is very important to selectively optimize only a subset of modes.

AtomicSymmetries.translation_mask!Function
translation_mask!(mask::Vector{Bool}, pols::Matrix{T}, masses::Vector{T}, n_dims :: Int; multiply :: Bool =true; buffer=default_buffer()) where T

Identifies translational modes by checking if the crystal's center of mass moves.

The function updates the mask in-place, setting mask[i] = true for any mode i that does move the center of mass.

Arguments

  • mask::Vector{Bool}: The boolean mask to be updated in-place. mask[i] will be set to true for translational modes.
  • pols::Matrix{T}: The matrix of mass-weighted polarization eigenvectors, with modes as columns. Must have size (Ndims * Natoms, Nmodes).
  • masses::Vector{T}: A vector of the atomic masses for each atom, with size (Natoms).
  • n_dims :: Int : The number of spatial dimensions (e.g., 3 for 3D systems).
  • multiply: (Optional) If true (default), the function computes dispv using the mass-weighted polarization vectors. If false, it computes dispv using the unweighted polarization vectors.
  • buffer: (Optional) A Bumper.jl buffer for allocating the temporary dispv vector to avoid allocations.
source