A self-consistent solution of Schrodinger-Poisson equations
Poisson Equations
The fundamental equations in electromagnetism is
combinated the two equations, then we obtain
where is the dielectric constant, is the electrostatic potential. More specifically,
where denote the ionized donor and acceptor densities, denote the electron and hole densities, these quantities are positive.
Basic Equations
The one-dimensional, one-electron schrodinger equation is
where is the wave function, is the energy, is the potential energy, is Plack's constant divided by , and is the effective mass.
For a simple -type materilas, the one-dimensional Poisson equation is
To find the electron distribution in the condution band, one may set the potential energy to be equal to the conduction-band energy. In a quantum well of arbitrary potential energy profile, the potential energy is related to the electrostatic potential as follows:
where is the pseudopotential energy due to the band offset at the heterointerface. The wave function and the electron density are related by
where is the number of bound states, and is the electron occupation for each state. The electron concentration for each state are be expressed by
where is the eigenenergy.
Newton's method
Since the electron density is determined by solutions of the schrodinger equation which are in turn determined by the potential , the electron density is actually a functional by . The one dimensional Poisson's equation can be written as
Let us denote the exact solution by . For a given trial function (or the initial guess), our task is to find the correction so that
Then, we obtain
Defining: , then
Note that the left-band side is the error in Poisson's equation for the trivial function which can be easily calculated. Assuming the is small, from (2.4) and (3.4), can be expressed as
where
THe relevant numerical experience indicates that the first term on the right-hand side of Eq.(3.5) is usually much smaller than the second one. Dropping the first term and expressing in terms of .
Therefore,
For the typical quantum transport,
Final, we can get
Matlab Code
The code is copied from the Supriyo Datta's textbook.
点击查看代码
%Fig.3.1
clear all
%Constants (all MKS, except energy which is in eV)
hbar=1.06e-34;q=1.6e-19;epsil=10*8.85E-12;kT=.025; m=.25*9.1e-31;
n0=2*m*kT*q/(2*pi*(hbar^2));
%inputs
a=3e-10;t=(hbar^2)/(2*m*(a^2)*q);beta=q*a*a/epsil;
Ns=15;Nc=70;Np=Ns+Nc+Ns;XX=a*1e9*[1:1:Np];
mu=.318;Fn=mu*ones(Np,1);
Nd=2*((n0/2)^1.5)*Fhalf(mu/kT)
Nd=Nd*[ones(Ns,1);.5*ones(Nc,1);ones(Ns,1)];
%d2/dx2 matrix for Poisson solution
D2=-(2*diag(ones(1,Np)))+(diag(ones(1,Np-1),1))+...
(diag(ones(1,Np-1),-1));
%D2(1,1)=-1;D2(Np,Np)=-1;%zero field condition
%Hamiltonian matrix
T=(2*t*diag(ones(1,Np)))-(t*diag(ones(1,Np-1),1))-(t*diag(ones(1,Np-1),-1));
%energy grid
NE=501;E=linspace(-.25,.5,NE);dE=E(2)-E(1);zplus=1i*1e-20;
f0=n0*log(1+exp((mu-E)./kT));
%self-consistent calculation
U=[zeros(Ns,1);.2*ones(Nc,1);zeros(Ns,1)];%guess for U
dU=0;ind=10;
while ind>0.001
%from U to n
sig1=zeros(Np);sig2=zeros(Np);n=zeros(Np,1);
for k=1:NE
ck=1-((E(k)+zplus-U(1))/(2*t));ka=acos(ck);
sig1(1,1)=-t*exp(1i*ka);gam1=1i*(sig1-sig1');
ck=1-((E(k)+zplus-U(Np))/(2*t));ka=acos(ck);
sig2(Np,Np)=-t*exp(1i*ka);gam2=1i*(sig2-sig2');
G=inv(((E(k)+zplus)*eye(Np))-T-diag(U)-sig1-sig2);
A=1i*(G-G');rhoE=f0(k)*diag(A)./(2*pi);
n=n+((dE/a)*real(rhoE));
end
%correction dU from Poisson
D=zeros(Np,1);
for k=1:Np
z=(Fn(k)+U(k))/kT;
D(k)=2*((n0/2)^1.5)*((Fhalf(z+.1)-Fhalf(z))/.1)/kT;
end
dN=n-Nd+((1/beta)*D2*U);
dU=(-beta)*(inv(D2-(beta*diag(D))))*dN;U=U+dU;
%check for convergence
ind=(max(max(abs(dN))))/(max(max(Nd)))
end
%plot(XX,n)
%plot(XX,U)
%plot(XX,F,':')
save fig31
figure
hold on
h=plot(XX,U);
grid on
set(h,'linewidth',[2.0])
set(gca,'Fontsize',[24])
xlabel(' x (nm)', 'Interpreter', 'latex')
ylabel('U (eV)', 'Interpreter', 'latex')
figure
hold on
h=plot(XX,n);
grid on
set(h,'linewidth',[2.0])
set(gca,'Fontsize',[24])
xlabel(' x (nm)', 'Interpreter', 'latex')
ylabel('n electron density', 'Interpreter', 'latex')
%For periodic boundary conditions, add
% T(1,Np)=-t;T(Np,1)=-t;
%and replace section entitled "from U to n" with
%from U to n
%[P,D]=eig(T+diag(U));D=diag(D);
%rho=log(1+exp((Fn-D)./kT));rho=P*diag(rho)*P';
%n=n0*diag(rho);n=n./a;
点击查看代码(Direclet边界条件)
clear all
tic
%Constants (all MKS, except energy which is in eV)
hbar=1.06e-34;q=1.6e-19;epsil=10*8.85E-12;kT=.025;
m=.25*9.1e-31;n0=2*m*kT*q/(2*pi*(hbar^2));
%inputs
a=3e-10;t=(hbar^2)/(2*m*(a^2)*q);beta=q*a*a/epsil;
Ns=15;Nc=70;Np=Ns+Nc+Ns;XX=a*1e9*[1:1:Np];
mu=.318;Fn=mu*ones(Np,1);
Nd=2*((n0/2)^1.5)*Fhalf(mu/kT);
Nd=Nd*[ones(Ns,1);0.5*ones(Nc,1);ones(Ns,1)];
%Nd=zeros(Np,1);
%d2/dx2 matrix for Poisson solution
D2=-(2*diag(ones(1,Np)))+(diag(ones(1,Np-1),1))+(diag(ones(1,Np-1),-1));
% D2(1,1)=-1;D2(Np,Np)=-1;%zero field condition
iD2 = inv(D2);
U0 = iD2*[0;zeros(Np-2,1);0];
%U0 = iD2*zeros(Np,1);
%Hamiltonian matrix
T=(2*t*diag(ones(1,Np)))-(t*diag(ones(1,Np-1),1))-(t*diag(ones(1,Np-1),-1));
%energy grid
NE=301;E=linspace(-.25,.5,NE);dE=E(2)-E(1);zplus=1i*1e-12;
f0=n0*log(1+exp((mu-E)./kT));
%self-consistent calculation
U=[zeros(Ns,1);.2*ones(Nc,1);zeros(Ns,1)];%guess for U
ind=10;
while ind>0.01
%from U to n
sig1=zeros(Np);sig2=zeros(Np);n=zeros(Np,1);
for k=1:NE
sig1=zeros(Np);sig2=zeros(Np);
ck=1-((E(k)+zplus-U(1))/(2*t));ka=acos(ck);
sig1(1,1)=-t*exp(1i*ka);gam1=1i*(sig1-sig1');
ck=1-((E(k)+zplus-U(Np))/(2*t));ka=acos(ck);
sig2(Np,Np)=-t*exp(1i*ka);gam2=1i*(sig2-sig2');
G=inv(((E(k)+zplus)*eye(Np))-T-diag(U)-sig1-sig2);
A=1i*(G-G');rhoE=f0(k)*diag(A)./(2*pi);
n=n+((dE/a)*real(rhoE));
end
UU = U0 + iD2*beta*(Nd-n);
ind = max(max(abs(UU-U)));
k = 0.001;
U = k*UU + (1-k)*U;
% U = U + 0.001*(UU-U);
end
figure;
plot(XX,n) ;
xlabel('nm')
ylabel('Electron density')
figure;
plot(XX,U);
xlabel('nm')
ylabel('Potential Profile')
toc
save fig31
hold on
点击查看代码
%test Ec = 1.12/2;
clear
tic
%Constants (all MKS, except energy which is in eV)
hbar=1.054571817e-34;
q=1.602176634e-19; %C
epsil=10*8.854187817E-12;%F/m
kT=0.025852; %300K, eV
m=0.25*9.1093837015e-31;%kg
n0= m*kT*q/(2*pi*(hbar^2));
Ec = 1.12/2;
%inputs
a=3e-10;
t=(hbar^2)/(2*m*(a^2)*q);
beta=q*a*a/epsil;
NL=30;NC=90;NR=NL;
Np=NL+NC+NR;XX=a*1e9*[1:1:Np];
mu=Ec + 0.31251598;Fn=mu*ones(Np,1);
%mu=.0;Fn=mu*ones(Np,1);
Nd = 2*(n0^1.5)*Fhalf((mu-Ec)/kT);
Nd = Nd*[ones(NL,1);0.0000*ones(NC,1);ones(NL,1)];
%Nd=zeros(Np,1);
%mu=Ec + 0.15251598;Fn=mu*ones(Np,1);
%d2/dx2 matrix for Poisson solution
D2=-(2*diag(ones(1,Np)))+(diag(ones(1,Np-1),1))+(diag(ones(1,Np-1),-1));
D2(1,1)=-1;D2(Np,Np)=-1;%zero field condition
% Boundary conditions (Neumann homogeneous)
%D2(1,2)=2; D2(Np,Np-1)=2;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Initial H00 H01 %%%%%%%%%%%%%%%%%%%%%%%%%%%%
W = 1;
H00 = zeros(W,W);
H01 = zeros(W,W);
for j = 1:W
H00(j,j) = 2*t + Ec;
H01(j,j) = -t;
if j < W
H00(j,j+1) = -t;
H00(j+1,j) = -t;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%% Band of each slice %%%%%%%%%%%%%%%%%%%%%%%%%%%%
Nk = 200;
i_E = linspace(-pi,pi,Nk);
res = zeros(Nk,W);
for i = 1:Nk
Ham = H00 + H01*exp(1j*i_E(i)) + H01'*exp(-1j*i_E(i));
val = eig(Ham);
res(i,:) = val';
end
figure;
plot(i_E,res);
%ylim([0,1]);
xlim([-pi,pi]);
xlabel('k');
ylabel('Energy [t]')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%% Initial Ham Full matrix %%%%%%%%%%%%%%%%%%%%%%%%%
L = Np;
Ham = zeros(W*L,W*L);
for j = 1:L
Ham(j*W-W+1:j*W,j*W-W+1:j*W) = H00;
if j < L
Ham(j*W-W+1:j*W,j*W+1:j*W+W) = H01;
Ham(j*W+1:j*W+W,j*W-W+1:j*W) = H01';
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Hamiltonian matrix
%T=(2*t*diag(ones(1,Np)))-(t*diag(ones(1,Np-1),1))-(t*diag(ones(1,Np-1),-1));
%energy grid
N_E=501;
E = linspace(-0.6+mu,0.6+mu,N_E);
dE = E(2)-E(1);
eta = 1e-8;
%self-consistent calculation
U=[zeros(NL,1);.2*ones(NC,1);zeros(NR,1)];%guess for U
dU=0;
LDOS = zeros(N_E,Np);
change = 10;
while change > 0.001
%from U to n
SigmaL=zeros(Np);SigmaR=zeros(Np);
n = zeros(Np,1);
for i_E = 1:N_E
f0 = 2*n0*log(1+exp((mu-E(i_E))/kT));
ck=1-((E(i_E)+1j*eta-U(1)-Ec)/(2*t));ka=acos(ck);
SigmaL(1,1)=-t*exp(1i*ka);%gam1=1i*(SigmaL-SigmaL');
ck=1-((E(i_E)+1j*eta-U(Np)-Ec)/(2*t));ka=acos(ck);
SigmaR(Np,Np)=-t*exp(1i*ka);%gam2=1i*(SigmaR-SigmaR');
G = inv(((E(i_E)+1j*eta)*eye(Np))- Ham - diag(U)-SigmaL-SigmaR);
A=1i*(G-G');
rhoE = f0*diag(A)/(2*pi);
n = n + ((dE/a)*real(rhoE));
LDOS(i_E,:) = diag(A)/(2*pi);
end
%correction dU from Poisson
D=zeros(Np,1);
for i_E = 1:Np
z =(Fn(i_E)-U(i_E) - Ec)/kT;
D(i_E,1)=2*(n0^1.5)*((Fhalf(z+.1)-Fhalf(z))/.1)/kT;
end
dN = n - Nd + ((1/beta)*D2*U);
dU = (-beta)*(inv(D2-(beta*diag(D))))*dN;
U = U + 1*dU;
%check for convergence
%ind=(max(max(abs(dN))))/(max(max(Nd)));
change = max(max(abs(dU)))
end
figure
plot(XX,n)
xlabel('position (nm)', 'Interpreter', 'latex');
ylabel('n ($m^{-3}$)', 'Interpreter', 'latex');
title('Electron density', 'Interpreter', 'latex');
set(gca,'Fontsize',12)
figure;
plot(XX,U)
xlabel('position (nm)', 'Interpreter', 'latex');
ylabel('U (eV)', 'Interpreter', 'latex');
figure;
imagesc(XX,E,LDOS);
xlabel('position (nm)', 'Interpreter', 'latex');
ylabel('Energy');
title('Projected density of states');
axis xy
colormap('hot');
colorbar
toc
save fig31
hold on
Reference
[1] IH. Tan, G. L. Snider, L. D. Chang, and E. L. Hu. A selfconsistent solution of Schrödinger–Poisson equations using a
nonuniform mesh. J. Appl. Phys. 68, 4071 (1990); (main refs)
[2] Zhibin Ren Phdthesis.
[3] www.nanohub.org
[4] Supriyo Datta. Nanoscale device modeling: the Green's function method. Superlattices and Microstructures, Vol. 28, No. 4, 2000.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现