|
| |
Density of single-band Schrödinger states
To obtain the charge density of the quantum
states, they are populated according to the Fermi distribution.
The densites of the eigenstates calculated with the
one-band Schrödinger equation are calculated in MODULE
sg_densities.
These functions provide the density with
positive sign in SI units [C/m³].
For details, please confer Appendix D (p. 170ff)
of Stefan Hackenbuchner's PhD thesis.
3D:
!---------------------------------------------------------------------
FUNCTION
sg_dens_el(num_qr,num_sg,iqr,idble,num_mat,dphi) result(dens)
!---------------------------------------------------------------------
! calculates sg-density for given eigenvalues and
wavefunctions
! num_qr ... number of quantum region
! num_sg ... number of schroedinger equation
! iqr ... position within quantum-region
(1..dim_qrV(num_qr))
! idble ... position within quantum-region
including multiple points
!
(1..dim_qr_dbleV)
! num_mat ... number of material in this region
! note: each quantum region conatins a certain number of different materials
! dphi ... for predictor corrector approach (=phi_new-phi_old)
! num_mat refers to this
numbering !
!
for pure density: dphi=0.0 (given in V)
! dphi = 0 for simple calculation of density,
!
! dphi is used within the predictor-corrector approach for Schrödinger-Poisson
! density in C/m^3 (with positive sign)
! dphi == (phi-phi_old) [used to shift the
energies acoording to first order perturbation theory
!---------------------------------------------------------------------!
eigenstates remain constant
USE
gitter,only:num_qr_regions,dim_qrV,dim_qr_dbleV
USE
quantum_solutions,only:sgChargeV(1)%qcV
USE
quantum_models,only:def_quantum_modelsM
USE
fermi_level,only:fermi_sg_elV
USE
physical_data,only:beta
USE
mod_physical_constants,only:electron_charge,electron_mass
implicit none
integer,intent(in) ::
num_qr,num_sg,iqr,idble,num_mat
real(8),intent(in) :: dphi
real(8) :: dens
integer :: num_deg,n_deg,num_ev,n_ev
real(8) ::
E_edge,E_n,psi,psi_squared,fermi,weight
!---------------------------------------
if ((num_qr<1).or.(num_qr>num_qr_regions))
&
stop 'error sg_dens_el: num_qr out of range'
if ((iqr<1).or.(iqr>dim_qrV(num_qr)))
&
stop 'error sg_dens_el: iqr out of range'
if ((num_sg<1).or.(num_sg>sgChargeV(1)%qcV(num_qr)%num_sg_diff_en))
&
stop 'error sg_dens_el: num_sg out of range'
if ((idble<1).or.(idble>dim_qr_dbleV(num_qr)))
&
stop 'error sg_dens_el: idble out of range'
if ((num_mat<1).or.(num_mat>def_quantum_modelsM(num_qr)%num_diff_mat))
&
stop 'error sg_dens_el: num_mat out of range'
!---------------------------------------------------------------------
dens=0.0d0
num_deg=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%num_deg
num_ev=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%number_of_ev
E_edge=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%energy_edge
-dphi !-- eV --
E_edge=E_edge*abs(electron_charge)
! E_edge --> J
do n_deg=1,num_deg
do n_ev=1,num_ev
E_n=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%eigenvaluesV(n_deg,n_ev)-dphi
! eigenvalue shifted according to dphi
!-- eV --
psi=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%eigenfunctionsM(n_deg,n_ev,iqr)
psi_squared=psi*psi
!--- 1/AA^3 -----
weight=def_quantum_modelsM(num_qr)%data_sg_elM(num_sg)%degeneracy(n_deg,num_mat)
! weight contains spin and valley degeneracy
fermi=fermi_sg_elV(num_qr)%fermi_sgM(num_sg)%fermiM(n_deg,n_ev,iqr)
!-- J -
E_n=E_n*abs(electron_charge)
! E_n --> J
psi_squared=psi_squared*1d30
! psi_squared --> 1/m^3
if (E_n<=E_edge) &
dens =
dens+dens_subband_el_exact3D(psi_squared,E_n,beta,fermi,weight)
! note: eigenstates only contribute to density if they lie energetically
! separation energy E_edge
end do
end do
dens=dens*abs(electron_charge)
! dens from 1/m^3 --> C/m^3
CONTAINS
!------------------------------------------------------------------------------
FUNCTION
dens_subband_el_exact3D(phi_squared,E_n,beta,fermi,weight) result(dens)
!------------------------------------------------------------------------------
!
! calculates charge density for subband n
quantummechanically
!
!------------------------------------------------------------------------------
USE
control_numeric,only:mode_fermiC
USE control_numeric,ONLY:FermiFunctionPrecision3D
USE fermi_functions,only:fermi1_2
IMPLICIT NONE
real(8),intent(in) ::phi_squared,E_n,beta,fermi,weight
real(8) :: dens
real(8) :: relerr
character(len=1) :: ch
!-------------------------------
relerr = FermiFunctionPrecision3D
ch = mode_fermiC
dens = weight*phi_squared*fermi1_2(beta*(fermi-E_n),ch,relerr)
END FUNCTION dens_subband_el_exact3D
END FUNCTION sg_dens_el
!---------------------------------------------------------------------------
2D:
!---------------------------------------------------------------------
FUNCTION
sg_dens_el(num_qr,num_sg,iqr,idble,num_mat,dphi) result(dens)
!---------------------------------------------------------------------
! calculates sg-density for given eigenvalues and
wavefunctions
! num_qr ... number of quantum region
! num_sg ... number of schroedinger equation
! iqr ... position within quantum-region
(1..dim_qrV(num_qr))
! idble ... position within quantum-region
including multiple points
!
(1..dim_qr_dbleV)
! num_mat ... number of material in this region
! dphi ... for predictor corrector approach (=phi_new-phi_old)
!
for pure density: dphi=0.0 (given in V)
!
! density in C/m^3 (with positive sign)
!---------------------------------------------------------------------
USE
gitter,only:num_qr_regions,dim_qrV,dim_qr_dbleV
USE
quantum_solutions,only:sgChargeV(1)%qcV
USE
quantum_models,only:def_quantum_modelsM
USE
fermi_level,only:fermi_sg_elV
USE
physical_data,only:beta
USE
mod_physical_constants,only:electron_charge,electron_mass
implicit none
integer,intent(in) ::
num_qr,num_sg,iqr,idble,num_mat
real(8),intent(in) :: dphi
real(8) :: dens
integer :: num_deg,n_deg,num_ev,n_ev
real(8) ::
E_edge,E_n,psi,psi_squared,fermi,weight,m_par
!---------------------------------------
if ((num_qr<1).or.(num_qr>num_qr_regions))
&
stop 'error sg_dens_el: num_qr out of range'
if ((iqr<1).or.(iqr>dim_qrV(num_qr)))
&
stop 'error sg_dens_el: iqr out of range'
if ((num_sg<1).or.(num_sg>sgChargeV(1)%qcV(num_qr)%num_sg_diff_en))
&
stop 'error sg_dens_el: num_sg out of range'
if ((idble<1).or.(idble>dim_qr_dbleV(num_qr)))
&
stop 'error sg_dens_el: idble out of range'
if ((num_mat<1).or.(num_mat>def_quantum_modelsM(num_qr)%num_diff_mat))
&
stop 'error sg_dens_el: num_mat out of range'
!---------------------------------------------------------------------
dens=0.0d0
num_deg=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%num_deg
num_ev=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%number_of_ev
E_edge=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%energy_edge
-dphi !-- eV --
E_edge=E_edge*abs(electron_charge)
do n_deg=1,num_deg
do n_ev=1,num_ev
E_n=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%eigenvaluesV(n_deg,n_ev)-dphi
!-- eV --
psi=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%eigenfunctionsM(n_deg,n_ev,iqr)
psi_squared=psi*psi
!--- 1/AA^2 -----
m_par=def_quantum_modelsM(num_qr)%data_sg_elM(num_sg)%m_parV(n_deg,idble)
!-- electron mass --
weight=def_quantum_modelsM(num_qr)%data_sg_elM(num_sg)%degeneracy(n_deg,num_mat)
fermi=fermi_sg_elV(num_qr)%fermi_sgM(num_sg)%fermiM(n_deg,n_ev,iqr)
!-- J -
E_n=E_n*abs(electron_charge)
psi_squared=psi_squared*1d20
! note: 2D wavefunctions have unit 1/m^2
if (E_n<=E_edge) &
dens =
dens+dens_subband_el2D(m_par,psi_squared,E_n,E_edge,beta,fermi,weight)
end do
end do
dens=dens*abs(electron_charge)
CONTAINS
!------------------------------------------------------------------------------
FUNCTION
dens_subband_el2D(m_par,phi_squared,E_n,E_edge,beta,fermi,weight) result(dens)
!------------------------------------------------------------------------------
!
! calculates charge density for subband n
quantummechanically
!
!------------------------------------------------------------------------------
USE
control_numeric,only:mode_fermiC
USE control_numeric,ONLY:FermiFunctionPrecision3D
USE fermi_functions,only:fermi_min_1_2 USE derived_constants,only:h2b2m_Jm2
IMPLICIT NONE
real(8),intent(in) ::m_par,phi_squared,E_n,E_edge,beta,fermi,weight
real(8) :: dens
real(8) :: relerr,arg,fdi,ierr
character(len=1) :: ch
!----------------------------------------
relerr = FermiFunctionPrecision2D
ch = mode_fermiC
arg=max(E_edge-E_n,0.0d0)
IF (arg==0.0d0) THEN
dens=0.0d0
ELSE
IF (ierr/=0) THEN
write(6,*) 'error in
dens_subband_el2D , ierr =',ierr
stop
END IF
dens = weight*0.5d0*dsqrt(m_par/(4d0*pi*beta*h2b2m_Jm2))
*
& ! see script about densities
for that formula
phi_squared*(fermi_min_1_2(beta*(fermi-E_n),ch,relerr)-fdi)
END IF
END FUNCTION dens_subband_el2D
!---------------------------------------------------------------------------
END FUNCTION sg_dens_el
!---------------------------------------------------------------------------
1D:
!---------------------------------------------------------------------
FUNCTION
sg_dens_el(num_qr,num_sg,iqr,idble,num_mat,dphi) result(dens)
!---------------------------------------------------------------------
! calculates sg-density for given eigenvalues and
wavefunctions
! num_qr ... number of quantum region
! num_sg ... number of schroedinger equation
! iqr ... position within quantum-region
(1..dim_qrV(num_qr))
! idble ... position within quantum-region
including multiple points
!
(1..dim_qr_dbleV)
! num_mat ... number of material in this region
! dphi ... for predictor corrector approach (=phi_new-phi_old)
!
for pure density: dphi=0.0 (given in V)
!
! density in C/m^3 (with positive sign)
!---------------------------------------------------------------------
USE
gitter1D,only:num_qr_regions,dim_qrV,dim_qr_dbleV
USE
quantum_solutions,only:sgChargeV(1)%qcV
USE
quantum_models,only:def_quantum_modelsM
USE
fermi_level,only:fermi_sg_elV
USE
physical_data,only:beta
USE mod_physical_constants,only:electron_charge ,electron_mass
implicit none
integer,intent(in) ::
num_qr,num_sg,iqr,idble,num_mat
real(8),intent(in) :: dphi
real(8) :: dens
integer ::
num_K_z,num_deg,n_K_z,n_deg,num_ev,n_ev
real(8) ::
E_edge,E_n,psi,psi_squared,m_el,weight,fermi,weight_k_z
!---------------------------------------
if ((num_qr<1).or.(num_qr>num_qr_regions))
&
stop 'error sg_dens_el: num_qr out of range'
if ((iqr<1).or.(iqr>dim_qrV(num_qr)))
&
stop 'error sg_dens_el: iqr out of range'
if
((num_sg<1).or.(num_sg>sgChargeV(1)%qcV(num_qr)%num_sg_diff_en))
&
stop 'error sg_dens_el: num_sg out of range'
if ((idble<1).or.(idble>dim_qr_dbleV(num_qr)))
&
stop 'error sg_dens_el: idble out of range'
if
((num_mat<1).or.(num_mat>def_quantum_modelsM(num_qr)%num_diff_mat)) &
stop 'error sg_dens_el: num_mat out of range'
!---------------------------------------------------------------------
dens=0.0d0
num_K_z=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%num_K_z
num_deg=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%num_deg
num_ev=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%number_of_ev
if (num_K_z==1) then
! here we have additionally to take into account superlattice vectors
E_edge=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%energy_edge -dphi !-- eV --
E_edge=E_edge*abs(electron_charge)
do n_deg=1,num_deg
do n_ev=1,num_ev
E_n=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%eigenvaluesV(n_deg,1,n_ev)-dphi
!-- eV --
psi=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%eigenfunctionsM(n_deg,1,n_ev,iqr)
psi_squared=psi*psi
!--- 1/AA -----
m_el=def_quantum_modelsM(num_qr)%data_sg_elM(num_sg)%m_parV(n_deg,idble)
!-- electron mass --
weight=def_quantum_modelsM(num_qr)%data_sg_elM(num_sg)%degeneracy(n_deg,num_mat)
fermi=fermi_sg_elV(num_qr)%fermi_sgM(num_sg)%fermiM(n_deg,n_ev,iqr) !-- J -
E_n=E_n*abs(electron_charge)
m_el=m_el*electron_mass
psi_squared=psi_squared*1d-10
! 1D --> psi_squared has units 1/m
if (E_n<=E_edge) &
dens =
dens+dens_subband_el1D(m_el,psi_squared,E_n,E_edge,beta,fermi,weight)
end do
end do
else if (num_K_z>1) then
E_edge=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%energy_edge -dphi !-- eV --
E_edge=E_edge*abs(electron_charge)
do n_deg=1,num_deg
do n_ev=1,num_ev
do n_K_z=1,num_K_z
E_n=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%eigenvaluesV(n_deg,n_K_z,n_ev)-dphi
!-- eV --
psi=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%eigenfunctionsM(n_deg,n_K_z,n_ev,iqr)
psi_squared=psi*psi
!--- 1/AA -----
m_el=def_quantum_modelsM(num_qr)%data_sg_elM(num_sg)%m_parV(n_deg,idble)
!-- electron mass --
weight=def_quantum_modelsM(num_qr)%data_sg_elM(num_sg)%degeneracy(n_deg,num_mat)
fermi=fermi_sg_elV(num_qr)%fermi_sgM(num_sg)%fermiM(n_deg,n_ev,iqr) !-- J -
weight_k_z=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%K_zV(n_K_z)
E_n=E_n*abs(electron_charge)
m_el=m_el*electron_mass
! note : mass given in kg here
psi_squared=psi_squared*1d10
if (E_n<=E_edge) dens = dens+
&
dens_subband_el1D(m_el,psi_squared,E_n,E_edge,beta,fermi,weight)*weight_k_z
! for calculation of superlattice densities see script about kp
end do
end do
end do
else
stop 'error sg_dens_el: internal error'
end if
dens=dens*abs(electron_charge)
contains
!------------------------------------------------------------------------------
FUNCTION
dens_subband_el1D(mass,phi_squared,E_n,SeparationEnergyEdge,beta,fermi,weight)
&
result(dens)
!------------------------------------------------------------------------------
!
! calculates charge density for subband n
quantummechanically
! weight includes spin
! mass,E_n,SeparationEnergyEdge,beta,fermi in SI
!
! return in e/m^3
!
!------------------------------------------------------------------------------
USE math_constants, only: pi
USE
mod_physical_constants,only:reduced_planck_constant
USE exponent_function
IMPLICIT NONE
real(8),intent(in) ::
mass,phi_squared,E_n,SeparationEnergyEdge,beta,fermi,weight
real(8) :: dens
real(8),dimension(1) ::
vec1V,vec2V,vec3V,vec4V
real(8) :: h2b2m
!-----------------------------------------------
h2b2m=reduced_planck_constant**2/2d0
! note: in contrast to 2D and 3D the mass is here given in SI [kg]
vec1V(1) = beta*(-E_n+fermi)
vec2V(1) = beta*(-SeparationEnergyEdge+fermi)
vec3V = exponentV(vec1V,'exp')
vec4V = exponentV(vec2V,'exp')
dens =
weight*mass/beta/pi/h2b2m/4d0*phi_squared* &
! see script about densities for that formula
log((1.0d0+vec3V(1))/(1.0d0+vec4V(1)))
END FUNCTION dens_subband_el1D
!---------------------------------------------------------------------
END FUNCTION sg_dens_el
!---------------------------------------------------------------------
|