Determine range for k||
k.p dispersion in 1D
The 2D Brillouin zone is discretized in order to
calculate the k.p density.
Note: If the energy exceeds a certain value
the Fermi distribution function becomes zero, so this k_parallel is
no longer valid for the density calculation.
The aim of subroutine
get_range_k
is to determine this k_parallel:
!---------------------------------------------------------------- SUBROUTINE
get_range_k(num_qr,chargeC,en_level,SeparationEnergyEdge,range_k)
!----------------------------------------------------------------
calculates range of k|| vectors (range_k
in [1/AA])
en-level is the lowest eigenvalue for k_par = 0
(given in [eV]) chargeC = 'el' or 'hl'
SeparationEnergyEdge
is the maximum energy which contributes to
the quantum mechanical density [eV].
Therefore the discretized k.p Hamiltonian is
diagonalized for k_parallel=0 and this energy is given as
input in en_level. In
SeparationEnergyEdge
there is the maximum energy (on absolute scale).
The program proceeds as follows:
1) fermi --> the maximum Fermi level
(electrons, for holes: minimum) is calculated [eV] [get_fermi_kp]
2) energy --> energy such that
Fermi[(energy-fermi)/kT] <= bnd_fermi
[bnd_fermi in MODULE
parameters_for_kpar_max]
--> SELECT CASE(chargeC)
CASE('el')
energy =
min(energy,SeparationEnergyEdge)
CASE('hl')
energy =
max(energy,SeparationEnergyEdge)
END SELECT
3) determine extremous energy such that
!-------------------------------------------------------------
! extremous_energy + en_level
>= energy
for electrons
!
<= energy
for holes
!-------------------------------------------------------------
starts with k_beg_min, k_beg_max [MODULE
parameters_for_kpar_max]
does maxit iterations
FUNCTION extremous_energy(k_par)
provides for given |k_parallel| extremous energy, i.e. it diagonalizes the bulk Hamiltonian in three
directions (kx, ky, and between) [quantization in z-direction] and
takes the extremous energies of them. This is done for every point within the
quantum cluster.
Then k_b and k_e are
adjusted accordingly.
The loop is exited, if |k_e-k_b| < max_diff_k.
The minimum value for range_k is
range_k_min:
IF (range_k < range_k_min) THEN
WRITE(*,*) 'range_k = ',range_k,' [1/Angstrom]'
WRITE(*,*) 'Warning: range_k too small!'
WRITE(*,*) '
range_k is set to range_k_min = ',range_k_min
range_k = range_k_min
END IF
See also in:
!------------------------------
MODULE
parameters_for_kpar_max
!------------------------------
contains parameters that are used in MODULE
determine_range_for_kpar
bnd_fermi --> k_parmax is determined
such that
Fermi[(E_kparmax-fermi)/kT] <= bnd_fermi --> energy [eV]
delta_energy --> The energy calculated above
is increased/decreased by
delta_energy [eV] [security buffer, may be set to zero]
starts with minimum and maximum value for
k_parallel : k_beg_min,k_beg_max
in [1/AA]
maxit --> maximum number of iterations
max_diff_k --> loop stops for |k_low-k_up| < max_diff_k
[1/AA]
range_k_min --> minimum value of
range_k that is returned
must be >= 0.0d0 [1/AA]
--------------------------------------------------------------
to determine energy for shift inverse
shift_energy_param -->
E_separate = E_cond - shift_energy_param*(E_cond-E_val)
for electrons
E_separate = E_val + shift_energy_param*(E_cond-E_val)
for holes
accessed in subroutine
update_kp
must be within [0,1]
This is now a
$numeric-control variable: separation-energy-shift
k.p dispersion in 2D
Here one only has to discretize a one-dimensional
Brillouin zone.
The maximum value for k_parallel is determined the
same way as in 1D:
SUBROUTINE
get_range_k, MODULE
parameters_for_kpar_max.
|