本文详细介绍 VASP 官方 wiki《DFT+DMFT calculation》内容。VASP可通过接口与外部DMFT代码(如TRIQS/solid_dmft)协同工作通过求解杂质模型获得自能,进行电荷自洽的CSC DFT+DMFT循环,输出可经最大熵方法解析延拓至实频得到局域谱函数。
前置准备
VASP 6.5.1
TRIQS 大于3.0.0
通过conda安装
conda create -n triqsconda activate triqsconda install -c conda-forge triqs
或借助mamba
conda install -c conda-forge mambamamba install -c conda-forge triqs
DFTTools
CTHYB
MaxEnt
Soild-dmf
conda install -c conda-forge triqs_dft_tool triqs_cthybpip3 install solid_dmf triqs-maxen
Wannier90 3.1.0
VASP 基态 SCF
输入文件准备
IPOSCAR、
NiO4.170.0000000000 0.5000000000 0.50000000000.5000000000 0.0000000000 0.50000000000.5000000000 0.5000000000 0.0000000000Ni O11Direct0.0000000000 0.0000000000 0.00000000000.5000000000 0.5000000000 0.5000000000
INCAR
SYSTEM = NiOISMEAR = -5 # 四面体展宽法SIGMA = 0.01EDIFF = 1.E-10 # 严格收敛标准NELMIN = 35NBANDS = 32 # 略多于默认值LORBIT = 14 # 优化投影器LMAXMIX = 4# 绘制 DOS 用的能量范围EMIN = -6EMAX = 18NEDOS = 5001# 投影到 Ni d 轨道和 O p 轨道LOCPROJ = 1 : d : Pr # 关键标签:为 Ni 创建 d 轨道投影
KPOINTS:金属体系至少 12×12×12,绝缘体 8×8×8,必须做收敛测试
执行VASP计算后,投影会存储在文件vaspgamma.h5和LOCPROJ中。
将VASP输出转换为TRIQS输入
准备一个配置文件plo.cfg:
[General]DOSMESH = -10103001[Group 1]SHELLS = 1EWINDOW = -1010BANDS = 514[Shell 1] # Ni d shellLSHELL = 2IONS = 1CORR = TrueTRANSFORM = 1.0 0.0 0.0 0.0 0.00.0 1.0 0.0 0.0 0.00.0 0.0 1.0 0.0 0.00.0 0.0 0.0 1.0 0.00.0 0.0 0.0 0.0 1.0
转换脚本converter.py
from triqs_dft_tools.converters.vasp import VaspConverterimport triqs_dft_tools.converters.plovasp.converter as plo_converter# Generate and store PLOsplo_converter.generate_and_output_as_text('plo.cfg', vasp_dir='./')# run the converterConverter = VaspConverter(filename = 'vasp')Converter.convert_dft_input()
直接运行python converter.py 运行python脚本,会生成可用于DMFT计算的输入文件vasp.h5。
使用py4vasp 绘制 VASP 的 DFT DOS 与 VASP 投影轨道的 DOS 图:
import py4vaspimport matplotlib.pyplot as pltimport numpy as np# get VASP DOScalc = py4vasp.Calculation.from_file('scf/vaspout.h5')dft_dos = calc.dos.to_dict()# load projector (PLO) DOS from TRIQSplo_dos_Ni = np.loadtxt('scf/pdos_0_0.dat')fig = plt.figure(figsize=(7,4), dpi=150)plt.plot(dft_dos['energies'], dft_dos['total'], label=r'VASP total DOS')# sum PLO DOS for all orbitalsplt.plot(plo_dos_Ni[:,0],np.sum(plo_dos_Ni[:,1:],axis=1), label=r'PLO Ni$_{d}$')plt.xlim(-10,4)plt.ylim(0,12)plt.xlabel(r'$\epsilon - {\text{E}_\text{F}}$ (eV)')plt.ylabel(r'states/eV')plt.legend()plt.show()
DMFT计算
准备dmft_config.toml文件:
[general]seedname = "vasp" # 对应 vasp.h5jobname = "dmft_os"beta = 20 # 电子温度:1/eV,对应室温一半U = 8.0 # Hubbard U (eV)J = 1.0 # Hund 交换 (eV)dc = true # 开启双计数修正n_iter_dmft = 20[solver]solver = "ctseg" # CT-QMC 分段求解器length_cycle = 500n_warmup_cycles = 1e+4n_cycles_tot = 1e+7 # 总蒙特卡洛步数perform_tail_fit = true # 高频尾巴拟合fit_max_moment = 4fit_min_w = 20fit_max_w = 30[advanced]dc_fixed_value = 59.0
运行 solid_dmft
mpirun -n 32 solid_dmft
计算完成后,会生成以jobname命名的结果目录,核心看两个文件:
-
observables_imp0.dat:每轮迭代的关键可观测量,重点看G(beta/2),该值趋近于 0,说明体系打开能隙,符合 NiO 莫特绝缘体的特性
-
conv_obs0.dat:收敛判据,重点看δGimp,该值持续下降并稳定在 1e-4 以下,说明 DMFT 迭代收敛
收敛后的自能会保存在结果目录的vasp.h5文件中,为后续 CSC 计算提供初始猜解。
绘制结果
import numpy as npimport matplotlib.pyplot as pltfrom h5 import HDFArchivefrom triqs.gf import *# ---------- 工具函数 ----------def mesh_to_np_arr(mesh):from triqs.gf import MeshImTime, MeshReFreq, MeshImFreqifisinstance(mesh, MeshReFreq):mesh_arr = np.linspace(mesh.w_min, mesh.w_max, len(mesh))elif isinstance(mesh, MeshImFreq):mesh_arr = np.linspace(mesh(mesh.first_index()).imag, mesh(mesh.last_index()).imag, len(mesh))elif isinstance(mesh, MeshImTime):mesh_arr = np.linspace(0, mesh.beta, len(mesh))else:raise AttributeError('input mesh must be either MeshReFreq, MeshImFreq, or MeshImTime')return mesh_arrdef plot_sigma_iw(S_iw, ax, color, label='', marker='-o', subtract=True):mesh = mesh_to_np_arr(S_iw.mesh)mid = len(mesh)//2if subtract:ax[0].plot(mesh[mid:], S_iw.data[mid:,0,0].real-S_iw.data[-1,0,0].real, marker, color=color, label=label)else:ax[0].plot(mesh[mid:], S_iw.data[mid:,0,0].real, marker, color=color, label=label)ax[1].plot(mesh[mid:], -1*S_iw.data[mid:,0,0].imag, marker, color=color, label=label)ax[0].set_xlabel(r"$i \omega_n$ (eV)")ax[1].set_xlabel(r"$i \omega_n$ (eV)")ax[0].set_ylabel(r"$Re \Sigma (i \omega_n)$ (eV)")ax[1].set_ylabel(r"$- Im \Sigma (i \omega_n)$ (eV)")# ---------- 读取数据并画图 ----------with HDFArchive('./vasp.h5', 'r') as ar:S_iw = ar['DMFT_results/last_iter/Sigma_freq_0']fig, ax = plt.subplots(1, 2, figsize=(14, 5), dpi=100)# 画出 up_0 和 up_2 轨道plot_sigma_iw(S_iw['up_0'], ax, color='C0', label='t2g')plot_sigma_iw(S_iw['up_2'], ax, color='C1', label='eg')ax[0].legend()plt.tight_layout()plt.savefig('sigma_iw.png', dpi=150)plt.show()
官网结果
CSC DFT+DMFT循环
准备新的文件夹和NCAR、POSCAR、KPOINTS、POTCAR、plo.cfg、CHGCAR、WAVECAR和dmft_config.toml。
在dmft_config.toml中添加
[dft]plo_cfg = "plo.cfg"dft_code = "vasp"projector_type = "plo"n_iter = 4n_cores = 32mpi_env = "default"mpi_exe = "/path/to/mpirun"dft_exec = "/path/to/bin/vasp_std"
在[general部分修改
csc = truen_iter_dmft_first = 2n_iter_dmft_per = 2n_iter_dmft = 20load_sigma = truepath_to_sigma = "/path/to/dmft-os/U8.0-J1.0-beta20-qmc1e+7/vasp.h5"
在INCAR中添加
ICHARG = 5AMIX = 0.08LSYNCH5 = True
用于读入hdf5文件,并设置环境允许同时读写 h5 文件
export HDF5_USE_FILE_LOCKING=FALSE
然后继续运行solid_dmft即可,可实现VASP的调用。
Ni-d 从 MaxEnt 投影的局部谱函数