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
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 = 2 !
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 = 3 !
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 = 4 ! 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-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.
-
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).
- 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 ).
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 ).
|