设置四种磁性构型
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')