一.通过扩胞把其他点的虚频折射到Gamma点
-
进行primitive cell的计算时,往往会出现虚频
- 一般可以对unit cell进行扩胞来消除虚频(削弱周期性边界条件的影响),或者虚频会被折射到
点
- 一般可以对unit cell进行扩胞来消除虚频(削弱周期性边界条件的影响),或者虚频会被折射到
-
扩胞计算声子谱,查看
点声子谱
-
运行命令
phonopy band.conf
举个band.conf的栗子:
ATOM_NAME = Sn O2 DIM = 2 1 3 EIGNENVECTORS = .TRUE. #这个参数可以实现输出虚频的振动本征值 BAND = 0.0 0.0 0.0 ... -0.5 0.5 0.5 # BAND_LABELS = G Z T Y S X U R
-
- 在
band.yaml
文件中可以看到,振动对应的实部和虚部
实部和虚部
二.利用phonopy中的MODULATION参数来移动出现虚频的原子
比如,点处的原子的移动公式为:
这里是amplitude,
是phase,
是超胞中的原子数,
是第
个原子的质量,
是指定的
点,
是第
个unit cell中的第
个原子的位置,
是第
个原子部分的本征矢量。
三.conf的书写
ATOM_Name = SnO2
DIM = 2 1 3
SYMMETRY_TOLERANCE = 1e-3
MODULATION = 1 2 1,0 0.5 0 1 a
# MODULATION参数解释:
# 1 2 3参数:为unitcell的阔胞参数1 2 1,由于在0 0.5 0 方向上有虚频,所以在y轴方向上阔胞,,
# 4 5 6参数:出现虚频的q点
# 7 参数:虚频一般就是第一个band,所以我们这里用1
# 8 参数:振幅大小
# 9 参数:是弧度制的相因子,默认为0,可以不写
四.所用生成脚本
#!/usr/bin/env python
# coding=utf-8
import os
import shutil
def MODULATION(delta, fileNumber):
for i in range(0, fileNumber + 1):
displace = float(i * delta)
filename = 'modulation-' + str(displace)
conf = 'modulation-' + str(displace) + '.conf'
f = open(conf, 'w')
f.write('ATOM_Name = SnO2-' + str(displace) + '\n')
# 之前用于算声子谱的扩胞系数
f.write('DIM = 2 1 3\n')
# 阔胞时分析对称性的允许误差
f.write('SYMMETRY_TOLERANCE = 1e-3\n')
# 前三个为软膜找相变,将unitcell所阔的胞,由于在0 0.5 0 方向上有虚频,所以在y轴方向上阔胞
f.write('MODULATION = 1 2 1,0 0.5 0 1 ' + str(displace))
f.close()
os.system('phonopy ' + conf)
os.system('rm MPOSCAR-001')
os.system('mv MPOSCAR POSCAR-' + str(displace))
for i in range(0, fileNumber + 1):
displace = i * delta
foldname = 'Modulation-' + str(displace)
if not os.path.exists(foldname):
os.system('mkdir ' + foldname)
for file in ['INCAR', 'POTCAR', 'POSCAR-' + str(displace)]:
shutil.copy2(file, foldname)
os.chdir(foldname)
os.rename('POSCAR-' + str(displace), 'POSCAR')
os.chdir('..')
os.system('rm modulation-*')
os.system('rm POSCAR-*')
if __name__ == '__main__':
MODULATION(delta=1.0, fileNumber=20)