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

 ==> Download Software
 nextnano³ documentation

 Copyright notice
 About us
 Useful Links
 Publications
 
 * password protected

 

 
 

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.

 

   
Last modified: 09-Jun-2011