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.
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 TIdentifies 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 totruefor 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) Iftrue(default), the function computesdispvusing the mass-weighted polarization vectors. Iffalse, it computesdispvusing the unweighted polarization vectors.buffer: (Optional) ABumper.jlbuffer for allocating the temporarydispvvector to avoid allocations.