matlab 磷烯Hubbard自洽平均场计算程序完善版本

设置四种磁性构型

FM

function [Nupavg,Ndownavg]=Initialization_1D_FM(m,Ny)
% m 为原子总数
% Ny 为y方向原子个数
Nupavg=0.5*ones(m,1);   % 将所有的<Nupi>取为1作初始值,自旋向上
Ndownavg=0.5*ones(m,1); % 将所有的<Ndowni>取为1作初始值,自旋向下
Nupavg(1:Ny:m,1)=   0.8; %上边界上自旋电子密度
Ndownavg(1:Ny:m,1)= 0.2; %上边界下自旋电子密度
Nupavg(Ny:Ny:m,1)=  0.8; %下边界上自旋电子密度
Ndownavg(Ny:Ny:m,1)=0.2; %下边界下自旋电子密度
Nupavg=diag(Nupavg);
Ndownavg=diag(Ndownavg);

AFM1

function [Nupavg,Ndownavg]=Initialization_1D_AM(m,Ny)
% m 为原子总数
% Ny 为y方向原子个数
Nupavg=0.5*ones(m,1);   % 将所有的<Nupi>取为1作初始值,自旋向上
Ndownavg=0.5*ones(m,1); % 将所有的<Ndowni>取为1作初始值,自旋向下
Nupavg(1:Ny:m,1)=   0.8; %上边界上自旋电子密度
Ndownavg(1:Ny:m,1)= 0.2; %上边界下自旋电子密度
Nupavg(Ny:Ny:m,1)=  0.2; %下边界上自旋电子密度
Ndownavg(Ny:Ny:m,1)=0.8; %下边界下自旋电子密度
Nupavg=diag(Nupavg);
Ndownavg=diag(Ndownavg);

AFM2

function [Nupavg,Ndownavg]=Initialization_1D_AM2(m,Ny)
% m 为原子总数
% Ny 为y方向原子个数
Nupavg=0.5*ones(m,1);   % 将所有的<Nupi>取为1作初始值,自旋向上
Ndownavg=0.5*ones(m,1); % 将所有的<Ndowni>取为1作初始值,自旋向下
Ndownavg(1:2*Ny:m,1)=0.2; %上边界前半段下自旋电子密度
Nupavg(Ny+1:2*Ny:m,1)=0.2; %上边界后半段上自旋电子密度
Ndownavg(Ny+1:2*Ny:m,1)=0.8; %上边界后半段下自旋电子密度
Nupavg(Ny:2*Ny:m,1)=0.8; %下边界前半段上自旋电子密度
Ndownavg(Ny:2*Ny:m,1)=0.2; %下边界前半段下自旋电子密度
Nupavg(2*Ny:2*Ny:m,1)=0.2; %下边界后半段上自旋电子密度
Ndownavg(2*Ny:2*Ny:m,1)=0.8; %下边界后半段下自旋电子密度
Nupavg=diag(Nupavg);
Ndownavg=diag(Ndownavg);

AFM3

function [Nupavg,Ndownavg]=Initialization_1D_AM3(m,Ny)
% m 为原子总数
% Ny 为y方向原子个数
Nupavg=0.5*ones(m,1);   % 将所有的<Nupi>取为1作初始值,自旋向上
Ndownavg=0.5*ones(m,1); % 将所有的<Ndowni>取为1作初始值,自旋向下
Ndownavg(1:2*Ny:m,1)=0.2; %上边界前半段下自旋电子密度
Nupavg(Ny+1:2*Ny:m,1)=0.2; %上边界后半段上自旋电子密度
Ndownavg(Ny+1:2*Ny:m,1)=0.8; %上边界后半段下自旋电子密度
Nupavg(Ny:2*Ny:m,1)=0.2; %下边界前半段上自旋电子密度
Ndownavg(Ny:2*Ny:m,1)=0.8; %下边界前半段下自旋电子密度
Nupavg(2*Ny:2*Ny:m,1)=0.8; %下边界后半段上自旋电子密度
Ndownavg(2*Ny:2*Ny:m,1)=0.2; %下边界后半段下自旋电子密度
Nupavg=diag(Nupavg);
Ndownavg=diag(Ndownavg);

Hubbard-HF自洽计算,最后一次输出结果

function [band_up,band_down,Energy_up,Energy_down,updensity,downdensity]=solve_1D_Hubbard_HF(HD,HDL,HDR,Nupavg,Ndownavg,dk,k,a,u,U,T,Ncc)
% HD,HDL,HDR是一维模型的三部分哈密顿量
% Nupavg是上自旋平均电子密度矩阵
% Ndownavg是下自旋平均电子密度矩阵
% k是布里渊区采样点
% a是所计算一维周期晶格常数
% u是费米面
% U是hubbard系数
% Ncc是HF自洽计算次数
% T是温度
m=length(HD);             % 体系总的原子个数
nk=length(k);             % 布里渊区离散点个数
updensity=zeros(Ncc,m);   %储存每一步迭代上自旋电子密度,观察是否收敛
downdensity=zeros(Ncc,m); % 储存每一步迭代下自旋电子密度,观察是否收敛
band_up=zeros(m,nk);      % 记录最后自旋向上的能带
band_down=zeros(m,nk);    % 记录最后自旋向下的能带
Energy_up=0;              % 上自旋占据态的能带
Energy_down=0;            % 下自旋占据态的能带
for nc=1:Ncc
    Nupavg0=zeros(m,m);   %初始化Nupavg的临时变量用于k空间的积分
    Ndownavg0=zeros(m,m); %初始化Ndownavg的临时变量用于k空间的积分
    for i=1:nk
        Hk=HD+HDL*exp(-1i*k(i)*a)+HDR*exp(1i*k(i)*a);
        [Adown,Edown]=eig(Hk+U*Nupavg-0.5*U*eye(m,m)); %通过Nupavg求解出Adown,Adown为down波函数系数向量
        [Aup,Eup]=eig(Hk+U*Ndownavg-0.5*U*eye(m,m)); %通过Ndownavg求解出Aup,Aup为up波函数系数向量        
        % 求电子密度的向量化写法
        f_up=Fermi_funtion(diag(Eup),u,T)';
        f_down=Fermi_funtion(diag(Edown),u,T)';
        fermi_up = f_up(ones(m,1),:);
        fermi_down = f_down(ones(m,1),:);
        Nup = sum(Aup.*conj(Aup).*fermi_up,2);
        Ndown = sum(Adown.*conj(Adown).*fermi_down,2);
        Nupavg0=Nupavg0+diag(Nup)*dk;
        Ndownavg0=Ndownavg0+diag(Ndown)*dk;
        if nc==Ncc
             Energy_up=Energy_up+sum(diag(Eup).*f_up');
             Energy_down=Energy_down+sum(diag(Edown).*f_down');
             band_up(:,i) = diag(Eup);
             band_down(:,i) = diag(Edown);
        end
    end
    Nupavg=Nupavg0/(2*pi/a); %更新Nupavg
    Ndownavg=Ndownavg0/(2*pi/a); %更新Ndownavg
    updensity(nc,:)=diag(Nupavg);
    downdensity(nc,:)=diag(Ndownavg);
    if mod(nc,10)==0
%         fprintf('已完成第%d次迭代\n',nc)
    end
end
Energy_up=Energy_up/nk/m;
Energy_down=Energy_down/nk/m;

画自旋密度极化函数

function plot_spin_density(x,y,Nupavg,Ndownavg,du,dv,sigma)
% x,y是原子传入的晶格坐标
% Nupavg和Ndownavg 自旋密度
% du,dv是x,y方向采样间隔
% sigma是原子坐标参数
m=length(x);
local_density=diag(Nupavg)-diag(Ndownavg);
Zs=0;  % 总的局域电子密度
% sigma=0.5;  % 高斯函数的标准差
% du=0.01; % x方向采样间隔
% dv=0.01; % y方向采样间隔
dx=2;  % x方向画图边界
dy=2;  % y方向画图边界
u=min(x)-dx:du:max(x)+dx;
v=min(y)-dy:dv:max(y)+dy;
[X,Y]=meshgrid(u,v);
 for i=1:m
     Z=real(local_density(i))*exp(-((X-x(i))/sigma).^2-((Y-y(i))/sigma).^2);
     Zs=Z+Zs;     
 end
mesh(X,Y,Zs)
set(gca,'YLim',[min(y)-dy max(y)+dy]);
set(gca,'XLim',[min(x)-dx max(x)+dx]);

最后调用主函数,变化化学势或者宽度

T=0.006;                % 温度
% u=-0.25;                 % 费米能级
Ncc=20;                 % 迭代次数
U=1.5;                    % Hubbard系数
nx=6;                   % x方向元胞数
a=nx/3;                 % 晶格常数
dk=0.005*2*pi/a;        % 布里渊区步长
k=-pi/a:dk:pi/a;        % 布里渊区路径
Energy_FM=[];
Energy_AM=[];
Energy_AM2=[];
Energy_AM3=[];
ny=5
    n=4*nx*ny;
    Ny=4*ny;
    [x,y,z]=zigzag_pho(nx,ny);
    %plot3(x,y,z,'.','MarkerSize',20);
    H=Hamiltonian_NN_sp_phos(x,y,z);
    HD=H(n/3+1:2/3*n,n/3+1:2/3*n);
    HDL=H(n/3+1:2/3*n,1:n/3);
    HDR=H(n/3+1:2/3*n,2*n/3+1:n);
    x=x(1,n/3+1:2/3*n);
    y=y(1,n/3+1:2/3*n);
    m=length(HD);           % 体系总的原子个数
 for u=-0.75:0.01:-0.65
   [Nupavg,Ndownavg]=Initialization_1D_FM(m,Ny);
   [~,~,Energy_up,Energy_down,~,~]=solve_1D_Hubbard_HF(HD,HDL,HDR,Nupavg,Ndownavg,dk,k,a,u,U,T,Ncc);
   Energy_FM=[Energy_FM,Energy_up+Energy_down];
   [Nupavg,Ndownavg]=Initialization_1D_AM(m,Ny);
   [~,~,Energy_up,Energy_down,~,~]=solve_1D_Hubbard_HF(HD,HDL,HDR,Nupavg,Ndownavg,dk,k,a,u,U,T,Ncc);
   Energy_AM=[Energy_AM,Energy_up+Energy_down];
   [Nupavg,Ndownavg]=Initialization_1D_AM2(m,Ny);
   [~,~,Energy_up,Energy_down,~,~]=solve_1D_Hubbard_HF(HD,HDL,HDR,Nupavg,Ndownavg,dk,k,a,u,U,T,Ncc);
   Energy_AM2=[Energy_AM2,Energy_up+Energy_down];
   [Nupavg,Ndownavg]=Initialization_1D_AM3(m,Ny);
   [~,~,Energy_up,Energy_down,~,~]=solve_1D_Hubbard_HF(HD,HDL,HDR,Nupavg,Ndownavg,dk,k,a,u,U,T,Ncc);
   Energy_AM3=[Energy_AM3,Energy_up+Energy_down];
   fprintf('已计算宽度为%d的体系\n',u)
end
u=-0.75:0.01:-0.65
plot(u,Energy_FM-Energy_AM2,'b')
hold on
plot(u,Energy_AM-Energy_AM2,'r')
hold on
% plot(Energy_AM2,'y')
plot(u,Energy_AM3-Energy_AM2,'g')

猜你喜欢

转载自blog.csdn.net/wwxy1995/article/details/82846797