Current block (solve current problem)
When treating the current problem, the electrostatic potential is considered as fixed. For
this electrostatic potential the quasi-Fermi level for electrons EF,n and for holes
EF,p are calculated anew.
This is done in subroutine
solve_current_problem.
The following steps are carried out for electrons and holes (chargeC='el'/'hl'):
CALL
define_current_clusters
Defines the current clusters (i.e. information on contact regions and the
corresponding boundary conditions).
CALL
currentmatrix3D(chargeC) Define current matrix.
CALL
set_dirichlet_current
Overwrite Neumann boundary conditions with Dirichlet values.
CALL
scale_current
Scale the problem with a factor (currently 1.0d0).
See comment in MODULE
numeric_control.
Now solve the 'linear' current equations for the Fermi levels.
a) current-problem = integrate-current
=> CALL
calculate_new_fermi_int_current(chargeC,fermiV)
In 1D, by default, the
transport equation is solved by integration rather than using a conjugate gradient
algorithm.
b) current-problem = solve-for-fermi-lapack
=> CALL
calculate_new_fermi_disc_fermi(chargeC)
Now solve the linear equation with
LAPACK (1D).
c) current-problem = solve-for-fermi-cg
Now solve the linear equation with
a conjugate gradient
method (1D/2D/3D).
CALL
SetNewFermiLevel(fermiV,chargeC)
Note: To be more flexible each wavefunction has its own position-dependent
Fermi level. Up to now we assume, however, that all electron wavefunctions only
have one common Fermi level. Also, all hole wavefunctions have a common Fermi
level. So the Fermi levels of the wavefunctions have to be
matched with the new Fermi level. This is done in SUBROUTINE
SetNewFermiLevel.
CALL
deallocate_current
Deallocate current matrix.
Note: In the setup of the current matrix the density is used which in turn
depends on the Fermi level (which is to be calculated). So one has to iterate
this cycle several times until convergence is reached.
Finally the current clusters are deallocated.
Current through a contact
The current through the contacts is stored in current_through_contactsV
in MODULE
current:
current_through_contactsV(1..num_contacts,3) contains in (i,1) electron current through contact i (i,2) hole
current through contact i (i,3) applied voltage
of contact i in [V]
num_contacts = num_current_clusters
current_through_contactsV is allocated in
SUBROUTINE
allocate_one
and
never deallocated again,
num_contacts = 0 at the beginning.
In order to calculate the current through a contact, one has to call
SUBROUTINE
current_through_contact
contained in MODULE
current_functions:
SUBROUTINE current_through_contact(n_current,chargeC,currentS)
Calculates current through the current contact n_current.
INPUT
n_current: number of contact ("Poisson-cluster")
chargeC: 'el' or 'hl'
OUTPUT
currentS
1D:
current in [A/m²] 2D:
current in [A/m] 3D: current in [A]
Searches all points where there is an interface current region n_current
to any other material.
Calculates the currents through all octants which are not within this current region
n_current
and simply adds them.
Thus one gets the flux through the surface of the contact region:
When one simply adds the currents, the currents -->
and <-- cancel out, so the net current is the current through the contact.
----------------------
The program loops through all points of the current cluster (on the material grid).
It gets the coordinates of the adjoining points (i,j,k) on the physical grid and for each point the information in which octants there is current
cluster n_current. If all octants are not within that current cluster, the point is added to a list (in case it is not yet contained in that list).
Then the list contains all points (i,j,k) on the boundary of the current cluster.
|