# Can you calculate fat ("projected") phonon dispersion bands with Quantum Espresso?

I would like to calculate the fat phonon bands for a chosen material (for simplicity, suppose GaAs), similarily as in Fig. 3 of reference [1]:

This is effectively the analogue of projected band structure for phonon dispersion: information about which atoms contribute the specific modes to what degree. (Please also let me know if there's a more widely used term for this).

I was searching how to obtain such a "projected phonon-band" structure using Quantum Espresso, but I couldn't find anything. Is there a way? If not, is it possible to get at least some information regarding the atomic contributions to the phonon bands? Are there 3rd-party post-QE codes that I could use to obtain such info?

[1] Ha, V.-A., Yu, G., Ricci, F., Dahliah, D., van Setten, M. J., Giantomassi, M., Rignanese, G.-M., & Hautier, G. (2019). Computationally driven high-throughput identification of CaTe and Li3Sb as promising candidates for high-mobility p-type transparent conducting materials. In Physical Review Materials (Vol. 3, Issue 3). American Physical Society (APS). https://doi.org/10.1103/physrevmaterials.3.034601

These "projected phonon bandstructure" can be obtained using phonon eigenvectors. The coefficients (which determine the width of the lines on the plot) should just be the amplitude of the eigenvectors on each atom.

Taking a close look at the figure provided, we see that light elements dominate the higher-frequency region. This suggests that the authors did not remove the mass dependence from the eigenvectors (remember the dynamical matrix is scaled by the atomic mass).

Such a plot can be generated using Phonopy1 by setting EIGENVECTORS=.TRUE. in band.conf (for how to use Phonopy to plot phonon band structure, see example https://phonopy.github.io/phonopy/examples.html#band-structure).

Once the eigenvectors are obtained, you can use my Python code to obtain the projected phonon band structure:

import yaml
import numpy as np

with open('band.yaml','r') as file:

# get some basic quantities
num_kpt = len(data['phonon'])
num_bnd = len(data['phonon'][0]['band'])
num_atm = len(data['phonon'][0]['band'][0]['eigenvector'])

# initialize array
phonon_freq = np.zeros([num_kpt,num_bnd])
phonon_eigv = np.zeros([num_kpt,num_bnd,num_atm])
band_distance = []

# store data
for ikpt in range(num_kpt):
band_distance.append(data['phonon'][ikpt]['distance'])
for ibnd in range(num_bnd):
root = data['phonon'][ikpt]['band'][ibnd]
phonon_freq[ikpt, ibnd] = root['frequency']
for iatm in range(num_atm):
root_eigv = root['eigenvector'][iatm]
vec = np.matrix(root_eigv)
vec = vec[...,0] + vec[...,1]*1j
result = np.dot(vec.H, vec)
phonon_eigv[ikpt, ibnd, iatm] = np.real(result)

# plot
import matplotlib.pyplot as plt

for ibnd in range(num_bnd):
plt.plot(band_distance,phonon_freq[:,ibnd],color='red')
# plotting fat band for Na
atom2proj = 1
plt.scatter(band_distance,phonon_freq[:,ibnd],\
s=400*phonon_eigv[:,ibnd,atom2proj],\
color='red',alpha=0.3)
# plotting fat band for Cl
atom2proj = 4
plt.scatter(band_distance,phonon_freq[:,ibnd],\
s=400*phonon_eigv[:,ibnd,atom2proj],\
color='blue',alpha=0.3)
plt.savefig('proj_phonon.png')

I have tested this on the CaTe system (https://materialsproject.org/materials/mp-1519?formula=CaTe). The results are shown below:

• the image you have in this answer is now exhibited on the MMSE Art Gallery here ! Great job ðŸ˜Š May 23, 2023 at 8:41