EPWpy教程:一个脚本完成能带、声子、电声耦合、弛豫时间计算

EPWpy 是一个开源 python 代码,它包装了 EPW 代码以进行自动计算,可使用 Quantum Espresso 和 EPW 自动执行 DFT+EPW 计算。同时还提供了一系列可视化实用程序,用于绘制各种数据和结果输出。

EPWpy安装可参考已有教程

EPWpy 安装教程

官网:https://epwpy.org

本文参考:https://epwpy.org/doc/notebooks/transport-v1.2.html

在本文中,使用从头开始玻尔兹曼输运方程(BTE)计算硅的声子有限载流子迁移率。基于jupyter notebook进行代码的分部步进运行,如需一次运行,请将全部代码和操作指令整合为单一脚本后运行。

定义环境。需配置MaterialsProjec API

复制代码
import numpy as npimport matplotlib.pyplot as pltfrom matplotlib import rcimport time, sys, osimport  pymatgen#from pymatgen.ext.matproj import MPResterfrom mp_api.client import MPRestermpr = MPRester("  ")import EPWpyfrom EPWpy import EPWpyfrom EPWpy.plotting import plot_bandsimport plotly.ioQE='/home/software/qe-7.1/bin'

定义基本函数

复制代码
plotly.io.renderers.default = "sphinx_gallery"silicon=EPWpy.EPWpy({'prefix':'si',                     'calculation':'\'scf\'',                     'structure_mp':"mp-149",                     'ecutwfc':'40',                     'celldm(1)':'10.262',                     'pseudo_auto':True,                    },                    code=QE,env='mpirun')silicon.run_serial=True# Summary
pseudopot=silicon.__dict__['pw_atomic_species']['pseudo'][0]print('Pseudopotential:', silicon.__dict__['pw_atomic_species']['pseudo'][0])print('Pseudopotential directory:', silicon.__dict__['pw_control']['pseudo_dir'])print('Prefix:',silicon.__dict__['prefix'])
#app = silicon.display_lattice(supercell=[3,3,2],bond_length = 3.5,view={'in_notebook':True,'backend':'png'})
#app

自洽(SCF) 计算

自洽计算,得到硅在基态下的电子电荷密度。计算包括三个独立的步骤:

1、指定siicon上SCF 计算的运行时参数。

2、根据步骤 1 中定义的属性以及 EPWpy 中默认设置的其他属性,创建 QE 所需的输入文件。

3、执行 SCF 计算

复制代码
silicon.scf(name='scf',kpoints={'kpoints':[[6,6,6]]})silicon.prepare(1,type_run='scf')silicon.run(4)silicon.pw_util = silicon.PW_utilities()

能带结构计算

在这一步中沿着布里渊区的一些高对称线计算硅的能带结构。

复制代码
silicon.scf(control={'calculation':'\'bands\''},            system={'nbnd':12},            kpoints={'kpoints':[                                ['0.5','0.50','0.50','20'],                                ['0.0','0.00','0.00','20'],                                ['0.5','0.25','0.75','20']                               ],                     'kpoints_type':'{crystal_b}'                    },            name='bs')silicon.prepare(type_run='bs')silicon.run(4,type_run='bs')

能带结构图

现在绘制了在上一步中计算的电子能带结构。能量轴的零点设置为通过 手动指定的值ef0

复制代码
ef_from_file = silicon.pw_util.efermi
Band=plot_bands.plot_band_scf(f'./{silicon.prefix}/bs/bs.out')plot_bands.plot_band_prod(Band,                          ef0=ef_from_file,                          xticks=['X','$\Gamma$','L'],                          xlabel = 'Wavevector',                          ylabel = 'Energy (eV)'                         )

声子谱

计算声子有限的移动率,我们需要确定振动频率和特征模态。

第 1 步:均匀布里渊区网格上的声子计算

复制代码
silicon.ph(phonons={'fildyn':'\'si.dyn\'',                    'nq1':3,'nq2':3,'nq3':3,'fildvscf':'\'dvscf\''}          )silicon.prepare(type_run='ph')silicon.run(6,type_run='ph')

第 2 步:生成 IFC

复制代码
silicon.q2r(name='q2r')silicon.prepare(type_run='q2r')silicon.run(1,type_run='q2r')

第 3 步:声子谱

调用执行matdyn.x

复制代码
silicon.matdyn(name='matdyn',               kpoints={'kpoints':[                                   ['0.5','0.50','0.50','20'],                                   ['0.0','0.00','0.00','20'],                                   ['0.5','0.25','0.75','20']                                 ],                        'kpoints_type':'{crystal_b}'                       },
              )silicon.prepare(type_run='matdyn')silicon.run(1,type_run='matdyn')

绘图

复制代码
Band=plot_bands.plot_band_eig(f'./{silicon.prefix}/ph/si.freq')plot_bands.plot_band_freq(Band,ylabel='E (meV)',ef0=0,xticks=['L','$\Gamma$','X'],color='royalblue')

用EPW将电子和声子转化为Wannier基

在均匀布里渊区网格上计算Kohn-Sham方程

复制代码
silicon.nscf(system={'nbnd':8},             kpoints={'grid':[6,6,6],'kpoints_type': 'crystal'})silicon.prepare(type_run='nscf')silicon.run(4,type_run='nscf')

Bloch 转化为Wannier表象并保存

复制代码
# File with k-path for sanity checks


silicon.epw(epwin={'wdata':['guiding_centres = .true.',                            'dis_num_iter = 500',                            'num_print_cycles  = 10',                            'dis_mix_ratio = 1',                            'use_ws_distance = T'],                   'proj':['\'Si : sp3\''],                   'band_plot':'.true.',                   'filkf':silicon.filkf_file,                   'filqf':silicon.filkf_file,                   'etf_mem':0,                   'fsthick':12.0,                   'wannierize':'.true.',                   'elph':'.true.',                   'num_iter':500                  },            name='epw1')silicon.filkf_file = 'LGX.txt'silicon.filkf(path=[[0.5,0.5,0.5],                    [0.0,0.0,0.0],                    [0.5,0.25,0.75]],              length=[51,51],             )silicon.prepare(type_run='epw1')silicon.run(8,type_run='epw1')

EPW 插值能带和声子,并绘图检查

复制代码
# Electrons
Band_EPW=plot_bands.plot_band_eig(f'./{silicon.prefix}/epw/band.eig')Band_QE=plot_bands.plot_band_scf(f'./{silicon.prefix}/bs/bs.out')
plot_bands.plot_band_prod(Band_EPW,                          ef0=ef_from_file,                          xlabel='Wavevector',                          ylabel='Electron energy (eV)',                          xticks=['L','$\Gamma$','X'],linestyle='--',color_c='b',color_v='b',first = True)plot_bands.plot_band_prod(Band_QE,                          ef0=ef_from_file,                          xlabel='Wavevector',                          ylabel='Electron energy (eV)',                          xticks=['L','$\Gamma$','X'],first = False) # False controls ifthis is the first set of plots
# Phonons
PH_epw=plot_bands.plot_band_eig(f'./{silicon.prefix}/epw/phband.freq')PH_matdyn=plot_bands.plot_band_eig(f'./{silicon.prefix}/ph/si.freq')PH_matdyn=PH_matdyn*0.124

plot_bands.plot_band_freq(PH_epw,                          xlabel='Wavevector',                          ylabel='Phonon energy (meV)',                          ef0=0,                          xticks=['L','$\Gamma$','X'],linestyle='--',first = True,color='blue')
plot_bands.plot_band_freq(PH_matdyn,                          xlabel='Wavevector',                          ylabel='Phonon energy (meV)',                          ef0=0,                          xticks=['L','$\Gamma$','X'],first = False)

载流子迁移率计算

复制代码
#silicon.reset()silicon.epw(epwin={'elph':'.true.',                   'etf_mem': '3',                   'nkf1':40,                   'nkf2':40,                   'nkf3':40,                   'nqf1':40,                   'nqf2':40,                   'nqf3':40,                   'mp_mesh_k':'.true.',                   'efermi_read':'.true.',                   'fsthick': 0.3,                   'fermi_energy':6.5,                   'temps':'300 250 200 150 100',                   'degaussw':0.0,                   'scattering':'.true.',                   'int_mob':'.false.',                   'carrier':'.true.',                   'ncarrier' :'1E13',                   'iterative_bte':'.true.',                   'nstemp': 5,                   'clean_transport':None},            name='epw2')silicon.prepare(type_run='epw2')silicon.run(6,type_run='epw2')

绘制迁移率结果

复制代码
print(os.getcwd())silicon.reset()silicon.epw_fold = 'epw'silicon.epw_file = 'epw2'temps=[300, 250, 200, 150, 100]mob=[]font=16for T in temps:    silicon.epw_params['temps']=T    print(silicon.ibte_mobility_e[0,0],T)    mob.append(silicon.ibte_mobility_e[1,1])    plt.scatter(T,silicon.ibte_mobility_e[1,1], color = 'crimson')    plt.scatter(T,silicon.serta_mobility_e[1,1], color = 'royalblue')print(mob)plt.plot(temps[::-1],mob[::-1], color = 'crimson')plt.xticks([100,150,200,250,300],fontsize=font)plt.yticks([1000,3000,5000,8000],fontsize=font)plt.xlabel('Temperature (K)',fontsize=16)plt.ylabel('$\mu$ (cm$^2$V$^{-1}$s$^{-1}$)',fontsize=16)plt.xticks(fontsize=16)plt.yticks(fontsize=16)plt.show()

计算位移电流

复制代码
E=np.linspace(0,1,50)*1e6 # V/cmn=1e15# cm^-3e = 1.6*10**-19 # CoulombJ = []
for mu in mob:    J.append(e*n*mu*E)   # Ampere/cm^2for i,T in enumerate(temps):    print(T)    plt.plot(E,J[i])    plt.text(E[-15],J[i][-15],str(T)+' K')plt.xlabel('$F \\rm (V/cm)$',fontsize=20)plt.ylabel('$J \\rm (A/cm^2)$',fontsize=20)


plt.show()

绘制弛豫时间

复制代码
silicon.temp=400
tau_inv=silicon.inv_taucb
plt.scatter(tau_inv[:,3]-6.6,tau_inv[:,4])plt.yscale('log')plt.xlabel('Energy eV')plt.ylabel('$\\tau$ (ps$^{-1}$)')
plt.axis([0,0.2,1e-2,1e3])plt.show()
相关推荐
秋难降41 分钟前
优雅的代码是什么样的?🫣
java·python·代码规范
二闹1 小时前
聊天怕被老板发现?摩斯密码来帮你
后端·python
mit6.8241 小时前
[RestGPT] OpenAPI规范(OAS)
人工智能·python
360安全应急响应中心2 小时前
Python代码保护之重置操作码映射的攻与防探究(一)
python·逆向
码界奇点2 小时前
Python内置函数全解析:30个核心函数语法、案例与最佳实践指南
linux·服务器·python
dreams_dream2 小时前
django错误记录
后端·python·django
MC皮蛋侠客3 小时前
使用Python实现DLT645-2007智能电表协议
python·网络协议·tcp/ip·能源
中等生3 小时前
Python 的循环引入问题
python
站大爷IP4 小时前
Python字符串全解析:从基础操作到高级技巧
python
中等生4 小时前
FastAPI vs Flask 性能对比:异步的真正优势在哪里?
python