|
| |
Densities, derivatives of densities, dopant densities
1. Densities
2. Derivatives of Densities
3. Dopant 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).
SUBROUTINE calculate_class_dens_el
--> Calculates full classical density by
successively calling calculate_class_dens_el_band.
SUBROUTINE calculate_class_dens_hl
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
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)
FUNCTION class_dens_el_0
--> Calculates classical density of a band
without parabolicities.
FUNCTION class_dens_hl_0
FUNCTION class_dens_el_1
--> Calculates correction for nonparabolicities.
FUNCTION class_dens_hl_1
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)
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)
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:
SUBROUTINE calculate_class_dens_el
--> Calculates full classical density by
successively calling calculate_class_dens_el_band.
SUBROUTINE calculate_class_dens_hl
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
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)
FUNCTION class_dens_el_0
--> Calculates classical density of a band
without parabolicities.
FUNCTION class_dens_hl_0
FUNCTION class_dens_el_1
--> Calculates correction for nonparabolicities.
FUNCTION class_dens_hl_1
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)
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).
The density caused by doping is calculated in SUBROUTINE
dopant_density.
|