[ Home ] [ News ] [ Contact ] [ Search ]

 ==> Download Software
 nextnano³ documentation

 Copyright notice
 About us
 Useful Links
 Publications
 
 * password protected

 

 
 

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
!---------------------------------------------------------------------

   
Last modified: 09-Jun-2011