MATLAB-wannier90_hr.dat后处理以及紧束缚能带拟合(晶体规范)

初次接触vasp,在学习的过程中发现没有完整的关于wannier画能带的Matlab程序,经过三周的学习编写了后处理wannier90_hr.dat的Matlab代码。在这里参考了Supriyo Datta的《Quantum Transport: Atom to Transistor》一书,内容很丰富,有例子有具体的代码。参考了微信公众号“拾梦的星星”《Mathematica处理wannier90_hr.dat文件并画图》一文,增加了对代码框架理解,同时改进了倒空间高对称K点路径的设置,在提取wannier90_hr.dat数据过程中参考了MATLAB脚本:从wannier90_hr文件提取指定格点哈密顿量 - 哔哩哔哩  Wannier90是一款强大的开源代码,可以生成局域wannier函数,并使用它们来高效精确地计算材料的电子性质。通过wannier90,我们可以获取基于wannier function basis的哈密顿量矩阵,并将其利用于紧束缚模型近似的计算当中。但是程序默认输出的文件内容比较庞大,可以通过设计一些简单的程序帮助我们筛选想要获取的重要信息。这里,本文将使用MATALB脚本(要求版本号大于R2019a)来提取指定多个格点的全部哈密顿量,并将它们各自保存成表格形式,大大方便了数据的处理过程。先贴https://www.bilibili.com/read/cv9005579

同时感谢王老师对代码构思的建议(自己一开始忽略了每个R点的简并值)

利用晶体规范倒空间的哈密顿矩阵为:

{H}_{mn}(\mathbf{k})\equiv\left\langle\tilde{\chi}_m^{\mathbf{k}}\mid\hat{H}\mid\tilde{\chi}_n^{\mathbf{k}}\right\rangle=\sum\limits_{\mathbf{R}}e^{i\mathbf{k}\cdot\mathbf{R}}H_{mn}(\mathbf{R})

README:将wannier90_hr.dat与.m(此文章代码)放在同一文件夹下执行就可,需要改动的地方只有费米能和晶格基矢坐标改变。(创作不易,欢迎转发)

%%%2023/4/18_wnw_hebust

% $$\begin{aligned}
% h(\vec{k})=\sum_mH_{nm}\text{e}^{\text{i}\vec{k}\cdot(\vec{d}_m-\vec{d}_n)}
% \end{aligned}$$

clear all

efermi=0;  %费米能 在求解能带时grep fermi OUTCAR 

%在POSCAR 读取晶格矢量a1,a2,a3    
a1=[3.1858999729000002    0.0000000000000000    0.0000000000000000];           
a2=[-1.5929499865000001    2.7590703104999998    0.0000000000000000];            
a3=[0.0000000000000000    0.0000000000000000   26.0000000000000000];

b1=2*pi*cross(a2,a3)/dot(a1,cross(a2,a3));  %%%倒空间晶格矢量b1,三维
b2=2*pi*cross(a3,a1)/dot(a2,cross(a3,a1));  %%%倒格矢b2

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 正格矢和倒格矢由三维变成二维
a1=a1(1:2);                     %晶格矢量a1 二维
a2=a2(1:2);                     %晶格矢量a2

b1=b1(1:2);                     %%%倒空间晶格矢量b1,二维
b2=b2(1:2);                     %%%倒格矢b2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
gamma=[0,0];                    %%%高对称点gamma 
M=1/2*b1;                       %%%高对称点M    
K=1/3*b1+1/3*b2;                %%%高对称点K    


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
kn=150;     %两个高对称点之间分成有kn个点
% Gamma-M段  每个高对称点都有两个 150和151都是M点
kx(1:kn)=linspace(gamma(1),M(1),kn);
ky(1:kn)=linspace(gamma(2),M(2),kn);
% M-K段
kx(kn+1:2*kn)=linspace(M(1),K(1),kn);
ky(kn+1:2*kn)=linspace(M(2),K(2),kn);
% K-Gamma段
kx(2*kn+1:3*kn)=linspace(K(1),0,kn);
ky(2*kn+1:3*kn)=linspace(K(2),0,kn);
k=zeros(3*kn,2);
k(:,1)=kx;                            %%存储kx
k(:,2)=ky;                            %%存储ky 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%读取'wannier90_hr.dat'文件
S = importdata('wannier90_hr.dat');  %将wannier90_hr.dat放入此代码的同一文件夹内
Data = S.data;                 %按照7个为一组进行排列,竖排。
Nw = Data(1);                  %num_wannier=22
Data(1) = [];                  %这个命令表示从数组Data中删除第一个元素。
Nrpts = Data(1);               %共取了331个R点,存在简并
Data(1) = [];                  %这个命令表示从数组Data中删除第一个元素。
Ndegen = Data(1:Nrpts)';       %提取每个R点的简并
Data(1:Nrpts)=[];              %将每个R点的简并值删掉
H = reshape(Data,7,[])';       % 则 reshape(A,2,2,[]) 将 Data 重构为一个 [[],7] 的数组
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
k_new=zeros(1,3*kn);    %%%为了沿着高对称点画出能带需要将k做调整,按照路径的模长走
energy=zeros(Nw,kn);    %%存放本征值

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i = 1:3*kn 
    if i<=kn
        kv=[kx(i)-gamma(1),ky(i)-gamma(2)];
        k_new(i)=norm(kv);                        %gamma->M      
    elseif i>kn && i<=2*kn
        kv=[kx(i)-M(1),ky(i)-M(2)];
        k_new(i)=norm(M-gamma)+norm(kv);           %M->K 
    else 
        kv=[kx(i)-K(1),ky(i)-K(2)];
        k_new(i)=norm(kv)+norm(M-gamma)+norm(K-M); %%%K->gamma 
    end
   h=zeros(Nw);
   %%%%%%%%%%%%%%a1,a2,a3的系数范围R=l*a1+m*a2+n*a3,n3=0;
for ii=1:Nw^2:length(H(:,1))  %%H的行数
    l=H(ii,1);           %第一列l
    m=H(ii,2);           %第一列m
    temp= find(H(:,1)==l & H(:,2)==m);   %%%查找符合的行号l,m,n==0;
    Htemp= H(min(temp):max(temp),:);     %%%将符合的行写入临时变量Htemp
    Htemp(:,6:7)=Htemp(:,6:7)/Ndegen(max(temp)/Nw^2);%%%将hoping项除以R的简并数
    Hmat = reshape(Htemp(:,6),[Nw,Nw]);              %将每个R点的hopping 实步改成num_wannier^2的矩阵
    h=h+exp(1i*dot(k(i,:),(l*a1+m*a2)))*Hmat;        %倒空间的哈密顿量表示
    
end 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[V,D] = eig(h);             %%%计算 A 的特征值D和右特征向量。%https://ww2.mathworks.cn/help/matlab/ref/eig.html
[d,ind]=sort(diag(real(D)));%使用 diag(D) 从 D 的对角线上提取特征值,然后按升序对得到的向量进行排序。
                            % sort 的第二个输出返回索引的置换向量。
Vs = V(:,ind);              %%%对本征矢量进行排序,本征值是一列一列的。
Ds = D(ind,ind);            %使用 ind 对 D 的对角线元素进行重新排序。
                            % 由于 D 中的特征值对应于 V 的各列中的特征向量,因此您还必须使用相同的索引对 V 的列进行重新排序。
energy(:,i)=d;
end

%%%%%%%plot 画图
for m=1:Nw                                 %%%  原胞中有几个轨道就有几条能带
    plot(k_new,energy(m,:)-efermi,'color','r','LineWidth',1)  %%
    hold on
end


%%%%设置xticks布里渊区高对称点
xticks([k_new(1) k_new(kn+1)  k_new(2*kn+1)  k_new(3*kn)]);
xticklabels({'\Gamma','M','K','\Gamma'})

%%%辅助线
xline(k_new(kn+1),'--');
xline(k_new(2*kn+1),'--');
yline(0,'--');
%grid on

%%%
xlim([k_new(1) k_new(3*kn)])
ylim([-6,6])
ylabel("Energy")
box on

%参考书:Quantum Transport: Atom to Transistor
%https://www.bilibili.com/read/cv9005579
%https://mp.weixin.qq.com/s/Z11-JGATuS0n1CmKswV2yA  强烈建议关注

第一张是wannier90和DFT拟合结果,第三张是MATLAB紧束缚拟合结果

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
平面波展开法是计算周期性结构(如晶体能带结构的一种常用方法。对于声子晶体,可以将其看作具有周期性结构的介质,因此也可以使用平面波展开法来计算其带隙特性。 在二维声子晶体中,声波的传播方向被限制在平面内,因此只需要考虑平面波在二维平面内的展开。假设晶体的基元周期为$a$,则可以将平面波表示为: $$ e^{i\vec{k}\cdot\vec{r}}=e^{ik_xx}e^{ik_yy} $$ 其中$\vec{k}$为波矢,$x$和$y$为晶体平面内的坐标。将平面波代入声子晶体的动力学方程中,可以得到一个本征值问题,其解给出了声子晶体能带结构。 在实际计算中,需要对波矢$\vec{k}$进行离散化,即将其分解为$k_x=2\pi n_x/L_x$和$k_y=2\pi n_y/L_y$,其中$L_x$和$L_y$为晶体的尺寸,$n_x$和$n_y$为整数。然后,可以将平面波展开为: $$ e^{i\vec{k}\cdot\vec{r}}=\sum_{n_x,n_y}c_{n_x,n_y}e^{i\frac{2\pi}{L_x}n_xx}e^{i\frac{2\pi}{L_y}n_yy} $$ 其中$c_{n_x,n_y}$为系数,需要通过求解本征值问题来确定。将展开后的平面波代入动力学方程中,可以得到一个矩阵本征值问题,其解给出了声子晶体能带结构和带隙特性。 需要注意的是,由于离散化导致的误差和计算量的增加,平面波展开法在计算大尺寸的声子晶体时可能会遇到困难。因此,一些改进方法,如Wannier函数和投影算子方法,已经被提出来用于加速计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值