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

 ==> Download Software
 nextnano³ documentation

 Copyright notice
 About us
 Useful Links
 Publications
 
 * password protected

 

 
 

Densities, derivatives of densities, dopant densities

1. Densities

2. Derivatives of Densities

3. Dopant densities

 

1. Densities

All densities are calculated via densities:

Density provides for a point i on Stefan's grid (i.e. i=1,...,lengvecV) the specified carrier density:
chargeC='el' --> electrons
chargeC='hl' --> holes
The Fermi levels in MODULE fermi_level are assumed to be valid.
On input the electric potential on point i must be given in phi [V].

Note: When solving the nonlinear Poisson equation within the framework of Schrödinger-Poisson by means of the predictor-corrector approach, the energy levels of the bound states are shifted according to (phi-phi_old).
This shift is reached by dphi (=phi-phi_old) [phi_old is the potential for which the Schrödinger equation has been solved]. If one wants to solve the pure density, dphi must be set to 0.0d0.

optionC is optional.
If present and optionC='class' the density is calculated within the Thomas-Fermi approach regardless of the specifications in the quantum regions.

The density is calculated in SI units, i.e. [C/m3], and has the correct sign (- for electrons, + for holes).

 

  • FUNCTION density(i,phi,dphi,chargeC,optionC) RESULT(dens)
    ---------------------------------------------------------
    Calculates for point number i (=1..lengvecV) on Stefan's grid for given phi
    the density (if dphi =0.0d0, otherwise dphi for predictor-corrector approach)
    chargeC = 'el'
    or 'hl'

    optionC
    is optional
     
    If optionC='class' the pure classical density is calculated.

    Fermi levels are taken from MODULE fermi_level.

    density
    (= charge density, with correct sign) returned in SI units [C/m^3]
    ---------------------------------------------------------
    ...

select case(chargeC)

 case('el')

  !--------------------------------------------------------------
  ! electron density
  !--------------------------------------------------------------

   IF (present(optionC)) then                                                                   ! if optionC = 'class'  --> pure classical density

    IF (optionC=='class') then
     call calculate_class_dens_el
    else
     stop 'error density: optionC can only be "class"'
    END IF

   ELSE

    pos_x = phys_gridM(i,1)                                                                 !  i   -->  (pos_x,pos_y,pos_z)
    pos_y = phys_gridM(i,2)                                                                 ! Stefan's grid --> physical grid
    pos_z = phys_gridM(i,3)
    num_qr = quantum_gridM(pos_x,pos_y,pos_z)                                   ! num_qr ... number of quantum region

    if (num_qr == 0) then                          ! pure classical region
    !---------------------------------------------
    ! classical density
    !---------------------------------------------

     call calculate_class_dens_el                                                             ! classical density if outside quantum region

    else

     dens=0.0d0
     kpL=.false.
     material=mat_numberV(i)
     num_mat=map_qr_to_materialV(material,num_qr)                             ! num_mat is the number of the material according to the material numbering
                                                                                                          ! within that region
     num_cond=def_quantum_modelsM(num_qr)%num_cond(num_mat)     ! num_cond ... number of conduction bands within that quantum region
     if (num_cond_bands3DV(i)/=num_cond)                                       &     ! consistency check
                     stop 'error densities3D: internal incocnsistency'
     num_sg=0

     do n_cond=1,num_cond                                                                            ! loop through all bands

      treat_elC=def_quantum_modelsM(num_qr)%treat_elC(num_mat,n_cond)    ! treat_elC says for each band how to treat the density

      select case(treat_elC)
      case('kp_8b')
       stop 'error densities3D: kp for electrons not yet implemented'
      case('class')
       dens=dens+calculate_class_dens_el_band(n_cond,i)                                  ! classical treatment
      case('sg_1b')
       num_sg=num_sg+1                                                                                  ! num_sg_el says how many bands are treated within effective-mass
       if (num_sg>def_quantum_modelsM(num_qr)%num_sg_el)          &             ! Schrödinger density
                     stop 'error densities3D: internal incocnsistency'
       iqr=quantumreg_numM(pos_x,pos_y,pos_z)                                            ! iqr  is the position within the quantum region without counting multiple points
       idble=quantumreg_num_dbleV(i)                                                                  ! idble is the position within the quantum region with multiple points
       dens=dens+sg_dens_el(num_qr,num_sg,iqr,idble,num_mat,dphi)               ! call to Schrödinger-density
 
       E_edge=sgChargeV(1)%qcV(num_qr)%data_deg_sgM(num_sg)%energy_edge -dphi  !-- eV --
       E_edge=E_edge*abs(electron_charge)                                                       ! transform to Joule
       dens=dens+class_dens_el_from_edge_band(n_cond,E_edge,i)

      case default
       stop 'error densities3D: treat_elC ill-defined'
      end select

     end do

    end if

   END IF                                                                                          ! Note:  up to now, densities were calculated in [C/m^3]
                                                                                                       !           but with positive sign
   dens=(-1.0d0)*dens

  case('hl')

        ......      now the same for holes
 

===========================================================================

The routine contains the following internal subroutines:
- We distinguish between nonparabolicities (_1) and without nonparabolicities (_0).

  1. SUBROUTINE calculate_class_dens_el
     --> Calculates full classical density by successively calling calculate_class_dens_el_band.
    SUBROUTINE calculate_class_dens_hl
     
  2. FUNCTION   calculate_class_dens_el_band
     --> Calculates density of one band by calling class_dens_el_0 and class_dens_el_1.
    FUNCTION   calculate_class_dens_hl_band
     
  3. FUNCTION   class_dens_el_from_edge_band
    --> Calculates classical density of one band for continuous states which lie above energy edge by calling class_dens_el_0_from_edge and class_dens_el_1_from_edge.
    FUNCTION   class_dens_hl_from_edge_band (for holes: below energy edge)
     
  4. FUNCTION   class_dens_el_0
    --> Calculates classical density of a band without parabolicities.
    FUNCTION   class_dens_hl_0
     
  5. FUNCTION   class_dens_el_1
    --> Calculates correction for nonparabolicities.
    FUNCTION   class_dens_hl_1
     
  6. FUNCTION   class_dens_el_0_from_edge
    --> Calculates classical density of a band without parabolicities for states above energy edge.
    FUNCTION   class_dens_hl_0_from_edge (for holes: below energy edge)
     
  7. FUNCTION   class_dens_el_1_from_edge
    --> Calculates correction for nonparabolicities for states above energy edge.
    FUNCTION   class_dens_hl_1_from_edge (for holes: below energy edge)

 

 

2. Derivatives of Densities

In order to calculate the Newton correction (for the nonlinear Poisson equation), the derivatives of the densities with respect to the potential are required. They are calculated in FUNCTION deriv_density. [These functions provide the negative derivatives with respect to the potential.]
In principal these subroutines have the same structure as density.

Note: The only difference is in the internal subroutines:

  1. SUBROUTINE calculate_class_dens_el
    --> Calculates full classical density by successively calling calculate_class_dens_el_band.
    SUBROUTINE calculate_class_dens_hl
     
  2. FUNCTION   calculate_class_dens_el_band
    --> Calculates density of one band by calling class_dens_el_0 and class_dens_el_1.
    FUNCTION   calculate_class_dens_hl_band
     
  3. FUNCTION   class_dens_el_from_edge_band
    -->
    Calculates classical density of one band for continuous states which lie above energy edge by calling class_dens_el_0_from_edge and class_dens_el_1_from_edge.
    FUNCTION   class_dens_hl_from_edge_band
    (for holes: below energy edge)
     
  4. FUNCTION   class_dens_el_0
    --> Calculates classical density of a band without parabolicities.
    FUNCTION   class_dens_hl_0
     
  5. FUNCTION   class_dens_el_1
    --> Calculates correction for nonparabolicities.
    FUNCTION   class_dens_hl_1
     
  6. FUNCTION   class_dens_el_0_from_edge
    --> Calculates classical density of a band without parabolicities for states above energy edge.
    FUNCTION   class_dens_hl_0_from_edge (for holes: below energy edge)
     
  7. FUNCTION   class_dens_el_1_from_edge
    --> Calculates correction for nonparabolicities for states above energy edge.
    FUNCTION   class_dens_hl_1_from_edge (for holes: below energy edge)

Here the  derivatives of the densities are calculated.
Note: Since  E=beta(E_c-e*pot)  one gets a prefactor  e*beta (e positive elementary charge) --> e_beta
For details of differentials see S. Hackenbuchner's PhD thesis (chapter about densities).

 

 

3. Dopant densities

The density caused by doping is calculated in SUBROUTINE dopant_density.

  • SUBROUTINE dopant_density(phiV,densV)
    !------------------------------------

    Calculates for given Fermi level in MODULE fermi_level (fermi_nV for donors and fermi_pV for acceptors: --> so the Fermi level of the continuum carriers is valid) and given potential phiV (defined on Stefan's grid, i.e. 1..lengvecV) the space charge density of ionized dopants in SI units [C/m3] with correct sign.

    densV=0.0d0          ! initial value for the space charge density

    DO i=1,lengvecV      ! Loop through all grid points of Stefan's grid.

    !------------------------------

    ! donors
    !------------------------------

     fermi     = fermi_nV(i)              !
    Fermi level on point i

     num_bands = num_cond_bands3DV(i)     ! number of conduction bands
                                          ! Note: In case there are no conduction bands (i.e. vacuum, ...)
     IF (num_bands>0) THEN                !           no space charge is calculated at all.
     
      E_c = minval(E_cM(1:num_bands,i)) - phiV(i)*ABS(electron_charge) ! bandedge in J
      number_of_don = dopingV(i)%num_donors   ! Note: Ionization energy is given relative to band edge,
                                                    i.e. relative to LOWEST of conduction bands!

      DO k=1,number_of_don                ! Loop through all donors present on this point.

       num_don  = dopingV(i)%par_donV(k)  ! All dopants (donors, acceptors and traps) are
                                          ! numbered from 1...num_dopants and par_donV contains

       dop      = dopingV(i)%conc_donV(k) ! the corresponding number of donor k (on point i).

       CALL donor_or_acceptor_dens(beta,E_c,fermi,num_don,dop,-1,dens)  ! Density provided in particles/m3.
       densV(i) = densV(i)+dens
      END DO

     END IF

    !------------------------------

    ! acceptors                           ! in analogy to donors
    !------------------------------

     fermi     = fermi_pV(i)

     num_bands = num_val_bands3DV(i)

     IF (num_bands>0) THEN

      Ev = maxval(E_vM(1:num_bands,i)) - phiV(i)*ABS(electron_charge)
      number_of_acc = dopingV(i)%num_acceptors
      DO k=1,number_of_acc
       num_acc  = dopingV(i)%par_accV(k)
       dop      = dopingV(i)%conc_accV(k)
       CALL donor_or_acceptor_dens(beta,Ev,fermi,num_acc,dop,1,dens)
       densV(i) = densV(i)-dens         !
    Note: Acceptors have negative charge.

      END DO

     END IF

    END DO
    !-----------------------
    densV = densV*ABS(electron_charge) ! -->
    charge in SI units, i.e. C/m3
    !-----------------------

    !--------------------------------------------------------------
    SUBROUTINE donor_or_acceptor_dens(beta,E_c,fermi,num_don,dop,sign,dens) 
    !--------------------------------------------------------------
    !
    !
    Calculates for number of dopant num_dopant (num_don or num_acc), Fermi level (in J),
    !
    band edge (in J) and doping concentration dop[1/m3] the charge density
    !
    in [particles/m3] with positive sign.
    !
    !
    The routine is valid for both donors and acceptors:
    !   sign              -1       1
    !   E_band            E_c      E_v
    !   num_dopant        num_don  num_acc
    !   E_dopant          E_don    E_acc
    !
    !--------------------------------------------------------------
       USE exponent_function,ONLY:fermi_trap_levelV  !
    for donors and acceptors

       USE doping           ,ONLY:g_V,E_V,num_levelsV

       REAL(8),INTENT(in)   :: beta,E_band,fermi,dop
       INTEGER,INTENT(in)   :: num_dopant
       INTEGER,INTENT(in)   :: sign
       REAL(8),INTENT(out)  :: dens

       REAL(8),dimension(1) :: ergV,argV,gV
       REAL(8)              :: E_dopant
       INTEGER              :: n
      !----------------------------------
     
      dens = 0.0d0
     
      DO n=1,num_levelsV(num_dopant)
       E_dopant = E_V(num_dopant,n)
       gV(1)    = g_V(num_dopant,n)
       argV(1) = sign * beta * (E_band + (sign*E_dopant) - fermi)
                    ! - beta * (E_c    -       E_don     - fermi) !
    for donors
                    !   beta * (E_v    +       E_acc     - fermi) !
    for acceptors
       ergV     = fermi_trap_levelV(argV,gV,'fc') !
    calculates 1/(1+gV*exp(argV))  for option 'fc'

       dens     = dens + dop*ergV(1)
      END DO

    !------------------------------------------------------------
    END SUBROUTINE donor_or_acceptor_dens
    !------------------------------------------------------------

    For the calculation of the Newton correction for the nonlinear Poisson equation the derivative of the density with respect to the potential is needed for all kind of densities which depend on the potential:
    For the dopant density this is done in SUBROUTINE deriv_dopant_density.

   
Last modified: 09-Jun-2011