nextnano.com
 nextnano³
 Download | SearchCopyright | Publications
 * password protected

 

nextnano³ software

 

  simulation-flow-control

 

 

 
Up
 

Simulation flow control

This keyword tells the program what to calculate (program flow) and in which order.

First,

Then the self-consistent cycle starts.
     flow-scheme = 2            ==>  More details on flow-scheme =

  • The classical nonlinear Poisson equation is solved to determine the built-in electrostatic potential from the charge densities. (This can be switched off.)

  • Then the Schrödinger equations are solved to calculate the energy levels and the wave functions. (This can be switched off.)

  • Then the Schrödinger and Poisson equations are iterated until a self-consistent solution has been found taking into account both classically and quantum mechanically calculated charge densities. (This can be switched off.)

  • Then the Drift-Diffusion Current equation is solved to determine the quasi-Fermi energies of the electrons and holes. (This can be switched off.)

  • Then the Schrödinger-Poisson equation is iterated with the Drift-Diffusion Current equation until a self-consistent solution has been found. (This can be switched off.)
    The self-consistent solution is uniquely determined by the electrostatic potential (Poisson equation) and the quasi-Fermi energies (Drift-Diffusion Current equation).

Some knobs allow the modification of this order, e.g. previously calculated data could be read in.
     raw-... = ...              ==>  More details on raw-... =

!---------------------------------------------------------!
$simulation-flow-control                         required !
                                                          !
 
flow-scheme                   integer           required !
Suggestion: Use flow-scheme = 2
                                                          !
 
strain-calculation            character         required !
                                                          !
 
raw-directory-in              character         optional !
Previously calculated binary data (unformatted raw data) can be read it.
 raw-potential-in              character         optional !
 raw-fermi-levels-in           character         optional !
 raw-kp-eigenstates-in         character         optional !
 raw-sweep-index-in            integer           optional !
                                                          !
$end_simulation-flow-control                     required !

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

 

Syntax

Flow scheme

By choosing the flow scheme you can actually tell the program which program flow should be executed. In most cases, flow-scheme = 2 will do the job.
Each flow scheme has a different algorithm.

  • In all cases, the strain is calculated before any of the flow schemes is applied unless strain calculation is switched off using strain-calculation = no-strain.
  • Then the classical (i.e. without quantum mechanics) Poisson equation is solved once to determine the electrostatic potential, unless zero-potential = yes ($numeric-control), or an electrostatic potential is read in or specified via initial-potential = ... [V].
  • Then the actual flow scheme is executed.

First, we list a short summary of the flow-scheme numbers. A detailed explanation of these numbers can be found further below.

flow-scheme = 0     ! Do nothing. This flow-scheme implicitly uses zero-potential = yes.

          
 = 2     !
==> recommended (self-consistent Schrödinger-Poisson-current) - This is the standard option that works in all cases.
            = 4     ! same as 2 but without Schrödinger, i.e. quantum mechanics is switched off

          
 = 3     ! solve Poisson, then solve Schrödinger, i.e. nonself-consistent solution
                    ! (By default, the initial Poisson equation is solved in equilibrium. This can be avoided using the $numeric-control flag zero-potential = yes
                    ! which sets the electrostatic potential to 0 V, or alternatively one can use potential-from-function = "...").

            = 20    ! for electric field, The Schrödinger-Poisson equation is solved self-consistently, then an electric field is applied, and finally the Schrödinger equation is solved for the tilted potential.
          
 = 21    !
for electric field: First, the initial Poisson equation is solved unless zero-potential = yes, then an electric field is applied, then the Schrödinger equation is solved for the tilted potential.


The following flow-schemes are only for specialized calculations. So usually you don't need them. They are only for "experts".
          
 = 5     ! (do nothing, quantum mechanical flag is switched on)
            = 6     ! solve Poisson classically (also in nonequilibrium), then Schrödinger

          
 = 1     !
self-consistent current-Poisson, then self-consistent Schrödinger-Poisson

          
 = 10    !
CBR method
            = 40    ! (for NEGF only)
            = 41    ! (for NEGF only)

          
 = 13    ! (for temperature sweep T)
          
 = 130   !
(for temperature sweep T)         - self-consistent Schrödinger-Poisson
          
 = 14    !
(for temperature sweep 1000/T)
          
 = 140   !
(for temperature sweep 1000/T) - self-consistent Schrödinger-Poisson

          
 = 30    !
(for electrolyte only)
          
 = 32    !
(for electrolyte only)
            = 33    ! (for electrolyte only, i.e. for buffer only)

          
 = 60    !
(for bulk tight-binding only, sp3s*)
            = 70    ! (for pseudopotential band structure of bulk materials)
            = 222   ! (for bulk tight-binding only, 'tighten')
          
 = 200   !
(for superlattice tight-binding only, 'superlattice-tighten')

          
 = 100   !
(to output all material parameters)

            = 50    ! (for gas sensors only)

            = -1    ! (process automatic test routines)

 

flow-scheme = 0

This flow-scheme does nothing special, i.e. inside the main program, the flow-scheme part is skipped
This flow-scheme is useful if you want to e.g. calculate strain only or test the layout of your material geometry.

flow-scheme = ! recommended (because this flow-scheme is very general)

Self-consistent solution of Poisson, Schrödinger and drift-diffusion current equations.
First, the nonlinear Poisson-Schrödinger equation is solved self-consistently to get a start value for the electrostatic potential,
then the Poisson, Schrödinger and current equations are solved self-consistently.
If no current    cluster is specified (or current   cluster is deactivated), only the nonlinear Poisson and the Schrödinger equations are solved self-consistently.
If no quantum cluster is specified (or quantum cluster is deactivated), only the nonlinear Poisson and the current         equations are solved self-consistently.
If neither a current cluster or quantum cluster is specified (and both of them are deactivated), only the nonlinear Poisson equation is solved.
 

flow-scheme = ! recommended (because this flow-scheme is very useful if one wants to calculate the eigenstates of an arbitrary potential profile)

First:
The classical (i.e. no quantum mechanics is taken into account) nonlinear Poisson equation is solved within this flow-scheme unless you use:
 $numeric-control
  ...
  zero-potential = yes

Then:
Solve Schrödinger equations, i.e. calculate eigenstates and wave functions (if a quantum cluster is specified and not deactivated) for an arbitrary potential profile.
Note: This is without self-consistency of Poisson and Schrödinger equations. This is justifiable if there is no charge redistribution, e.g. in the absence of doping.

This flow scheme is useful if the electrostatic potential is not calculated but
- set to zero (zero-potential = yes; $numeric-control),
- set to a fixed constant value (initial-potential = -0.5; $numeric-control),
- specified via an analytic function (potential-from-function = ...; $numeric-control).
- taken from a previously calculated input file, i.e. it is read in (==> More details on raw-...),
- an arbitrary electrostatic potential should be imported ($import-data-on-material-grid),
Consequently, we solved the Schrödinger equation only once for a fixed electrostatic potential.

flow-scheme = ! same as 2 but without Schrödinger, i.e. quantum mechanics is switched off

Self-consistent solution of Poisson and drift-diffusion current equations.
First, the nonlinear Poisson equation is solved to get a start value for the electrostatic potential,
then the Poisson and current equations are solved self-consistently.
If no current cluster is specified (or current cluster is deactivated), only the nonlinear Poisson equation is solved.
Note: No quantum mechanics! Only classical density! Equivalent to flow-scheme = 2 if no quantum cluster is defined or if quantum cluster is deactivated.

flow-scheme = 1

1) Self-consistent solution of Poisson and drift-diffusion current equations.
    The Poisson and current equations are solved self-consistently (Note: No quantum mechanics!) to determine
    - the electrostatic potential and
    - the quasi-Fermi levels of the electrons and holes.
2) Calculate nonlinear Poisson equation quantum mechanically,
    i.e. self-consistent Poisson-Schrödinger equations while holding the quasi-Fermi levels of 1) fixed.

If no current cluster is specified, only the nonlinear Poisson and the Schrödinger equations are solved self-consistently.
If no quantum cluster is specified, only the nonlinear Poisson and the current equations are solved self-consistently.

flow-scheme = 13   (for temperature sweep T)
          
 = 130 
(for temperature sweep T)         - self-consistent Poisson-Schrödinger
          
 = 14  
(for temperature sweep 1000/T)
          
 = 140 
(for temperature sweep 1000/T) - self-consistent Poisson-Schrödinger
Note: For a temperature sweep, rather than using these flow-scheme numbers, it is recommended to use flow-scheme = 2 and temperature-sweep-active = yes instead, see $global-parameters.

 

Electric field

flow-scheme = 20

1. First, the initial classical (i.e. without quantum mechanics) Poisson equation is solved unless zero-potential = yes to obtain a starting value for the electrostatic potential.
2. Then the Schrödinger-Poisson equation is solved self-consistently without electric field to obtain the electrostatic potential.
3. Then an electric field is applied as specified in the input file ($electric-field), i.e. the electric field is added to the electrostatic potential, conduction and valence band edges, and Fermi levels.
4. Then the Schrödinger-Poisson equation is solved self-consistently for the tilted Fermi levels to obtain the new electrostatic potential.
5. Then the energy levels and wave functions are calculated by solving Schrödinger's equation for this tilted band profile.

Same as flow-scheme = 21 but with solving Schrödinger-Poisson equation self-consistently.

flow-scheme = 21


Same as flow-scheme = 20 but without solving the Schrödinger-Poisson equation self-consistently, i.e. without 2. and 4.

CHECK: How about adding a flow-scheme similar as 20 but omitting step 4?

 

Ballistic CBR method

flow-scheme = 10

CBR method: Solve Poisson equation classically, and then use the resulting electrostatic potential as
- (fixed) input to the CBR transmission calculation (self-consistent-CBR = no) or
- initial guess for the electrostatic potential of the self-consistent CBR calculation (density and transmission are calculated by the CBR method)  (self-consistent-CBR = yes) .

Note: Instead of solving the first Poisson equation classically, one can also read in a previously calculated electrostatic potential, or omit this initial Poisson equation by using zero-potential = yes.

 

NEGF method

flow-scheme = 40 ! Schrödinger only before NEGF starts
flow-scheme = 41 !
Schrödinger-Poisson before NEGF starts

NEGF (nonequilibrium Green's function) method

 

 

Electrolyte

flow-scheme = 30 (for electrolyte only including buffers, ...)

 1. Electrolyte: Solve Poisson-Boltzmann equation for the specified pH value (optional: sweep over pH value).
 2. If a site binding model is specified we output the interface density and
     the interface potential for the pH value into files
 
 band_structure/potential_for_all_pH1D.dat
 
 InterfacePotentialDensity_vs_pH1D.dat.

flow-scheme = 32 (for electrolyte only including buffers, ...)

 1. If a site binding model is specified we calculate the interface charge for different interface potentials.
     Here we loop over the potentials from PotentialMin to PotentialMax in steps of PotentialStep.
   InterfaceDensity_vs_Potential1D.dat.

 

flow-scheme = 33 (for electrolyte only, special feature for buffers.)

should be used together with zero-potential = yes
!-------------------------------------------------------!
! This flow-scheme is for the buffer only.
!-------------------------------------------------------!
! Loop over pH values.
! ====================
! 1. Electrolyte
! 2. Output concentration of buffer ions
!-------------------------------------------------------!

 

Material parameters

flow-scheme = 100 (to output all material parameters)
Note: A special input file is needed for this purpose (1Dmaterial_parameters_binary_zincblende.in) which contains all binary zinc blende materials where each material consists of exactly one grid point only.

This flow scheme generates a file called database_materials_zincblende.csv. The file looks like this.
;material ;a ;a ;a ;c11 ;c12 ;c44 ; e14 ;eps_static_a ;eps_static_a ;eps_static_a ;eps_optic_a ;LO_phonon ;L ;M ;N ;Delta_so ;L' ;M' ;N' ;B ;E_P ;S ;m_e_Gamma ;m_e_Gamma ;m_e_Gamma ;m_e_l_L ;m_e_t_L ;m_e_t_L ;m_e_l_X ;m_e_t_X ;m_e_t_X ;m_hh ;m_hh ;m_hh ;m_lh ;m_lh ;m_lh ;m_so ;m_so ;m_so ;a_c_Gamma ;a_c_L ;a_c_X ;a_v ;u_c_Gamma ;u_c_L ;u_c_X ;b ;d ;band_gap_Gamma;band_gap_L ;band_gap_X ;
; ;[nm] ;[nm] ;[nm] ;[GPa] ;[GPa] ;[GPa] ; ; ;[C/m^2] ;[] ;[] ;[] ;[] ;[eV] ;[hbar^2/2m] ;[hbar^2/2m] ;[hbar^2/2m] ;[eV] ;[hbar^2/2m] ;[hbar^2/2m] ;[hbar^2/2m] ;[hbar^2/2m] ;[eV] ;[] ;[m0] ;[m0] ;[m0] ;[m0] ;[m0] ;[m0] ;[m0] ;[m0] ;[m0] ;[m0] ;[m0] ;[m0] ;[m0] ;[m0] ;[m0] ;[m0] ;[m0] ;[m0] ;[eV] ;[eV] ;[eV] ;[eV] ;[eV] ;[eV] ;[eV] ;[eV] ;[eV] ;[eV] ;[eV] ;[eV] ;
; AlP; 0.546720000; 0.546720000; 0.546720000; 133.000000000; 63.000000000; 61.500000000; 0.059000000; 9.800000000; 9.800000000; 9.800000000; 7.538500000; 0.062000000; -7.190000000; -2.930000000; -7.380000000; 0.070000000; -2.345000000; -2.930000000; -2.535000000; 0.000000000; 17.700000000; -0.300000000; 0.220000000; 0.220000000; 0.220000000; 1.000000000; 0.100000000; 0.100000000; 2.680000000; 0.155000000; 0.155000000; 0.630000000; 0.630000000; 0.630000000; 0.200000000; 0.200000000; 0.200000000; 0.300000000; 0.300000000; 0.300000000; -5.700000000; -1.740000000; 3.980000000; 3.000000000; 0.000000000; 11.350000000; 6.750000000; -1.500000000; -4.600000000; 3.630000000; 3.570000000; 2.520000000;
; AlP; 0.546720000; 0.546720000; 0.546720000; 133.000000000; 63.000000000; 61.500000000; 0.059000000; 9.800000000; 9.800000000; 9.800000000; 7.538500000; 0.062000000; -7.190000000; -2.930000000; -7.380000000; 0.070000000; -2.345000000; -2.930000000; -2.535000000; 0.000000000; 17.700000000; -0.300000000; 0.220000000; 0.220000000; 0.220000000; 1.000000000; 0.100000000; 0.100000000; 2.680000000; 0.155000000; 0.155000000; 0.630000000; 0.630000000; 0.630000000; 0.200000000; 0.200000000; 0.200000000; 0.300000000; 0.300000000; 0.300000000; -5.700000000; -1.740000000; 3.980000000; 3.000000000; 0.000000000; 11.350000000; 6.750000000; -1.500000000; -4.600000000; 3.630000000; 3.570000000; 2.520000000;
The purpose is to generate a semicolon-delimited file, i.e. a CSV file, that can be read in by a script to automatically generate a database_nn3.in file or to display material parameters on the nextnano website.
The procedure is as follows: nextnano3 reads in an input file that contains all zinc blende materials, e.g. 1Dmaterial_parameters_binary_zincblende.in.
 nextnano3 then generates the file database_materials_zincblende.csv.

Notes: This feature is intended for binaries, not for ternaries. It works only for zinc blende materials so far and not for wurtzite.

flow-scheme = 50  (for gas sensors only, preliminary)

 

Why does one want to modify the flow-scheme?

Good question. The idea is to provide a lot of flexibility to the user.

E.g. it is possible to determine the quasi-Fermi levels by a classical calculation and then solve the Schrödinger-Poisson equation self-consistently with these quasi-Fermi levels to be held fixed.
Another option would be to solve the system of equations self-consistently with the 1-band Schrödinger equation and then to determine the k.p states for this fixed potential.
To handle these options flexibly, you will have to specify the desired simulation flow (variable flow-scheme) in the input file.

 

 

Strain

strain-calculation = no-strain                     ! Do not take into account strain at all. (equivalent to zero-strain-amorphous)
                   = zero-strain-amorphous         !
Do not take into account strain at all. (equivalent to no-strain)

                   = homogeneous-strain            !
1D: Not recommended for 2D/3D but still useful for certain applications (e.g. a 1D well (along the x direction) that is homogeneous in the (y,z) plane).
                   = homogeneous-strain-sim-system !
1D: Not recommended for 2D/3D but still useful for certain applications (e.g. a 1D well (along the x direction) that is homogeneous in the (y,z) plane).
                                                   ! homogeneous-strain (a)
and homogeneous-strain-sim-system (b) must lead to the same results.
                                                   !
Internally, analytic equations are used that were derived for the (a) crystal coordinate system or (b) simulation coordinate system.

                  
= strain-minimization           !
2D/3D: numerical algorithm for minimization of the elastic energy
                   = strain-minimization-new       !
1D/2D/3D: new numerical algorithm for minimization of the elastic energy
                                                   !
For a 1D simulation, strain-minimization-new and homogeneous-strain (or homogeneous-strain-sim-system) must lead to the same result,
                                                   !
i.e. the numerical result must be equivalent to the analytical result.

                   =
raw-strain-in                 !
Read in a previously calculated strain tensor profile. Very useful for 2D and 3D to save CPU time.

                   = import-strain-simulation-coordinate-system !
A strain tensor profile can be imported. The filename has to be specified here: $import-data-on-material-grid
                   = import-strain-crystal-coordinate-system    ! A strain tensor profile can be imported. The filename has to be specified here: $import-data-on-material-grid

                  
= hydrostatic-strain            ! Corresponds to a hydrostatic pressure from all three directions (see Tutorial "Strain:
                                                   ! Band shifts and splittings due to conduction and valence band deformation potentials") - should be used with care.

 

Specify how to calculate the strain
- Don't use strain at all (no-strain). Here, the strain tensor is set to zero.
- pseudomorphically (appropriate in 1D and for homogeneous layers only -> homogeneous-strain), analytical solution
- use the
strain-minimization option (2D/3D) to minimize the elastic energy numerically,
- use the
strain-minimization-new option (1D/2D/3D) to minimize the elastic energy numerically,
- read in strain from the raw data of a previous calculations (
raw-strain-in)
- import a strain tensor profile

 

Homogeneous strain

If using homogeneous-strain, you will have to supply a substrate material that must be specified under the keyword $domain-coordinates. You should be careful when using homogeneous-strain in 2D or 3D simulations (only appropriate for certain types of layers, e.g. quantum well structures but not quantum wires or quantum dots).

The difference between homogeneous-strain and homogeneous-strain-sim-system is the following:
 homogeneous-strain
:                       For the strain calculation analytical equations are used that were derived by J. Majewski for the crystal coordinate system, see PhD thesis of T. Andlauer, Appendix C.
 
homogeneous-strain-sim-system: For the strain calculation analytical equations are used that were derived by S. Birner for the simulation coordinate system, see PhD thesis of S. Birner, Appendix C.
                                                              (For the latter, the implementation for wurtzite has not been done yet (Is this really true? This should be checked.)
It is recommended to use homogeneous-strain by default. homogeneous-strain-sim-system is used for testing the other routine.

 

Strain minimization

If using strain-minimization or strain-minimization-new you must include the keyword $strain-minimization-model to specify substrate (i.e. the unstrained region) and boundary conditions.
The minimization of the elastic energy is needed to find the equilibrium positions of the 'atoms'. With 'atoms' we mean 'material grid points' of our discretized grid. It does not make sense to talk about 'atoms' as our strain model is a continuum elasticity model and not an atomistic approach like the valence force field (VFF) model for instance.

If using
raw-strain-in you should have a brief look at the Tip "How to read in strain data from previous simulations" described below.
(See also $output-raw-data).

homogeneous-strain (pseudomorphic strain): The deformation of the unit cell of the strained layer is fixed along two spatial directions with respect to the substrate material (pseudomorphic growth condition). Example: In a 1D simulation along the x direction the deformations of the units cell of the strained layer are fixed in the (y,z) plane. The unit cell is allowed to deform along the x direction only.
strain-minimization (3D simulation): The unit cell of the strained materials are allowed to deform along all three spatial directions in order to minimize the elastic energy (e.g. quantum dots) with respect to a special region in the device called the "substrate" which is unstrained.
strain-minimization (2D simulation in the (x,y) plane): The unit cell of the strained materials are allowed to deform along all two spatial directions (x and y) in order to minimize the elastic energy (e.g. quantum wires)  with respect to a special region in the device called the "substrate" which is unstrained. The strain (or unit cell deformation) along the z direction is fixed due to the "pseudomorphic growth condition" similar to the homogeneous-strain case.

 

Importing a strain tensor profile

import-strain-simulation-coordinate-system
import-strain-crystal-coordinate-system

A strain tensor profile can also be imported from a file. The strain tensor must be defined either with respect to the simulation coordinate system or crystal coordinate system.
For more documentation, see
  $import-data-on-material-grid
   filename-strain = ...

 

 

Tip: How to read in strain data from previous simulations.

  1. In Input file, specify to write out strain data in raw data format.
    !-----------------------------------------!
    $output-raw-data                          !
    More Information: $output-raw-data
     destination-directory    = raw_data/     !
     strain                   = yes           !
    $end_output-raw-data                      !
    !-----------------------------------------!
    After the strain has been calculated, the data is immediately written to the file strain_store_eps3D.raw (or *2D.raw or *1D.raw for a 2D or 1D simulation).
  2. In the next simulation run you can specify to read in this strain data. Note that the simulated devices must have an identical grid, of couse.
    !-----------------------------------------!
    $simulation-flow-control                  !
     flow-scheme              = 2             !
    (any integer number is possible)
     raw-directory-in         = raw_data/     !
     strain-calculation       = raw-strain-in !
    $end_simulation-flow-control              !

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

(See also $output-raw-data).

 

 

Specifiers for reading in previously calculated binary data

This keyword also controls the read in of raw data. This is binary data from former calculations which is stored unformatted with the keyword: $output-raw-data. Since the file names are fixed, you have to provide the directory name only.

As output you can always choose under 'raw-data' to save the electrostatic potential or the quasi-Fermi levels unformatted in order to read them in later with flow-scheme = 3.
More information is available in the SiGe tutorial.

raw-directory-in      = raw_data/
                
     = your_directory/
                
     = "H:\My Documents\My nextnano inputfiles\input file name\raw_data\"

Directory containing the raw data files from former calculations. Do not forget the slash (\ for DOS, / for UNIX).
(See also $output-raw-data).

 

raw-potential-in      = yes / no

Flag whether to read in unformatted electrostatic potential data.
(See also $output-raw-data).

 

raw-fermi-levels-in   = yes / no       !

Flag whether to read in unformatted electron and hole Fermi level data.
(See also $output-raw-data).

 

raw-kp-eigenstates-in = yes / no

Flag whether to read in unformatted electron and/or hole k.p eigenstates and wave functions.
(See also $output-raw-data).

 

raw-sweep-index-in = 0
                   = 1
                   = 2
                   = ...
With this specifier it is possible to read in raw data from a specific voltage sweep index (voltage step).
(See also $output-raw-data).