软模找相变

一.通过扩胞把其他点的虚频折射到Gamma点

  1. 进行primitive cell的计算时,往往会出现虚频

    • 一般可以对unit cell进行扩胞来消除虚频(削弱周期性边界条件的影响),或者虚频会被折射到\Gamma
  2. 扩胞计算声子谱,查看\Gamma点声子谱

    • 运行命令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参数来移动出现虚频的原子

比如,j点处的原子的移动公式为:
\frac{A}{\sqrt{N_am_j}}R_e[exp(i\phi)\pmb{e}_jexp(\pmb q \cdot \pmb r_{jl})]
这里A是amplitude,\phi是phase,N_a是超胞中的原子数,m_j是第j个原子的质量,\pmb q是指定的\pmb q点,\pmb r_{jl}是第l个unit cell中的第j个原子的位置,\pmb e_j是第j个原子部分的本征矢量。

三.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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。