Simulation flow control
This keyword tells the program what to calculate
(program flow) and in which
order.
First,
Then the selfconsistent cycle starts.
flowscheme = 2
==> More details on flowscheme =

The classical nonlinear Poisson equation is solved
to determine the builtin 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
selfconsistent solution has been found taking into account both classically
and quantum mechanically calculated charge densities. (This can be switched off.)

Then the DriftDiffusion Current equation is
solved to determine the quasiFermi energies of the electrons and holes. (This can be
switched off.)

Then the SchrödingerPoisson equation is iterated with
the DriftDiffusion Current equation until a selfconsistent solution has
been found. (This can be
switched off.)
The selfconsistent solution is uniquely determined by the electrostatic
potential (Poisson equation) and the quasiFermi energies
(DriftDiffusion Current equation).
Some knobs allow the modification of this order, e.g.
previously calculated data could be read in.
raw... = ...
==> More details on raw...
=
!!
$simulationflowcontrol
required !
!
flowscheme
integer
required ! Suggestion: Use flowscheme = 2
!
straincalculation
character
required !
!
rawdirectoryin
character
optional ! Previously calculated binary data
(unformatted raw data) can be read it.
rawpotentialin
character
optional !
rawfermilevelsin
character
optional !
rawkpeigenstatesin
character
optional !
rawsweepindexin
integer
optional !
!
$end_simulationflowcontrol
required !
!!
Syntax
By choosing the flow scheme you can actually tell the program which program
flow should be executed. In most cases, flowscheme =
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
straincalculation
= nostrain .
 Then the classical (i.e. without quantum mechanics) Poisson equation is solved
once to determine the electrostatic potential, unless
zeropotential =
yes ($numericcontrol ),
or an electrostatic potential is read in or specified via
initialpotential = ... [V] .
 Then the actual flow scheme is executed.
First, we list a short summary of the flowscheme
numbers. A detailed explanation of these numbers can be found
further below.
flowscheme = 0 !
Do
nothing. This flowscheme implicitly uses zeropotential =
yes .
=
2 !
==> recommended
(selfconsistent SchrödingerPoissoncurrent)  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. nonselfconsistent solution
! (By default, the initial Poisson equation is solved in equilibrium. This can be
avoided using the $numericcontrol
flag zeropotential = yes
! which sets the electrostatic potential to 0 V, or
alternatively one can use
potentialfromfunction = "..." ).
=
20 ! for electric field,
The SchrödingerPoisson equation is solved selfconsistently, 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 zeropotential = yes ,
then an electric field is applied, then the Schrödinger equation is solved for
the tilted potential.
The following flowschemes 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 !
selfconsistent currentPoisson, then selfconsistent SchrödingerPoisson
=
10 ! CBR method
=
40 ! (for NEGF only)
=
41 ! (for NEGF only)
=
13 ! (for temperature sweep T)
=
130 ! (for temperature sweep T)
 selfconsistent SchrödingerPoisson
=
14 ! (for temperature sweep 1000/T)
=
140 ! (for temperature sweep 1000/T) 
selfconsistent SchrödingerPoisson
=
30 ! (for electrolyte only)
=
32 ! (for electrolyte only)
=
33 ! (for electrolyte only, i.e. for
buffer only)
=
60 ! (for bulk
tightbinding only, sp3s*)
=
70 ! (for pseudopotential
band structure of bulk materials)
=
222 ! (for bulk tightbinding
only, 'tighten')
=
200 ! (for superlattice
tightbinding only, 'superlatticetighten')
=
100 ! (to output all material parameters)
=
50 ! (for gas sensors only)
=
1 ! (process automatic
test routines)
flowscheme = 0
This flowscheme does nothing special, i.e. inside the main program, the
flowscheme part is skipped
This flowscheme is useful if you want to e.g. calculate strain only or test
the layout of your material geometry.
flowscheme = 2 !
recommended (because this flowscheme is very general)
Selfconsistent solution of Poisson, Schrödinger and driftdiffusion
current equations.
First, the nonlinear PoissonSchrödinger equation is solved
selfconsistently
to get a start value for the electrostatic potential,
then the Poisson, Schrödinger and current equations are solved
selfconsistently.
If no current cluster is specified (or current
cluster is deactivated), only the nonlinear Poisson
and the Schrödinger equations are solved selfconsistently.
If no quantum cluster is specified (or quantum cluster is deactivated), only the nonlinear Poisson and the
current equations are solved
selfconsistently.
If neither a current cluster or quantum cluster is specified (and both of
them are deactivated), only the nonlinear Poisson equation is solved.
flowscheme = 3 !
recommended (because this flowscheme 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 flowscheme unless you use:
$numericcontrol
...
zeropotential = 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 selfconsistency 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 (zeropotential = yes ;
$numericcontrol ),
 set to a fixed constant value (initialpotential =
0.5 ;
$numericcontrol ),
 specified via an analytic function (potentialfromfunction =
... ;
$numericcontrol ).
 taken from a previously calculated input file, i.e. it is read in (==> More details on raw... ),
 an arbitrary electrostatic potential should be imported ($importdataonmaterialgrid ),
Consequently, we solved the Schrödinger equation only once for
a fixed electrostatic potential.
flowscheme = 4 ! same as
2 but without Schrödinger, i.e. quantum
mechanics is switched off
Selfconsistent solution of Poisson and driftdiffusion 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 selfconsistently.
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 flowscheme =
2 if no quantum cluster is defined or if
quantum cluster is deactivated.
flowscheme = 1
1) Selfconsistent solution of Poisson and driftdiffusion current
equations.
The Poisson and current equations are solved
selfconsistently (Note: No quantum mechanics!) to determine
 the electrostatic potential and
 the quasiFermi levels of the electrons and holes.
2) Calculate nonlinear Poisson equation quantum mechanically,
i.e. selfconsistent PoissonSchrödinger equations while
holding the quasiFermi levels of 1) fixed.
If no current cluster is specified, only the nonlinear Poisson and the
Schrödinger equations are solved selfconsistently.
If no quantum cluster is specified, only the nonlinear Poisson and the
current equations are solved selfconsistently.
flowscheme = 13 (for temperature sweep T)
=
130 (for temperature sweep T)
 selfconsistent PoissonSchrödinger
=
14 (for temperature sweep 1000/T)
=
140 (for temperature sweep 1000/T) 
selfconsistent PoissonSchrödinger
Note: For a temperature sweep, rather than using these flowscheme
numbers, it is recommended to use flowscheme =
2 and temperaturesweepactive =
yes instead, see
$globalparameters .
Electric field
flowscheme = 20
1. First, the initial classical (i.e. without quantum mechanics) Poisson
equation is solved unless zeropotential = yes
to obtain a starting value for the electrostatic potential.
2. Then the SchrödingerPoisson equation is solved
selfconsistently without electric field to obtain the electrostatic
potential.
3. Then an electric field is applied as specified in the input file ($electricfield ),
i.e. the electric field is added to the electrostatic potential, conduction
and valence band edges, and Fermi levels.
4. Then the SchrödingerPoisson equation is solved selfconsistently 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 flowscheme = 21 but with
solving SchrödingerPoisson equation selfconsistently.
flowscheme = 21
Same as flowscheme = 20 but
without solving the SchrödingerPoisson equation selfconsistently,
i.e. without 2. and 4.
CHECK: How about adding a flowscheme similar as
20 but omitting step 4?
Ballistic CBR method
flowscheme = 10
CBR method: Solve Poisson equation classically, and then use the
resulting electrostatic potential as
 (fixed) input to the CBR transmission calculation (selfconsistentCBR
= no ) or
 initial guess for the electrostatic potential of the selfconsistent CBR
calculation (density and transmission are calculated by the CBR method)
(selfconsistentCBR = 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 zeropotential =
yes .
NEGF method
flowscheme = 40 ! Schrödinger
only before NEGF starts
flowscheme = 41 !
SchrödingerPoisson before NEGF starts
NEGF (nonequilibrium Green's function) method
Electrolyte
flowscheme = 30 (for electrolyte
only including buffers, ...)
1. Electrolyte: Solve PoissonBoltzmann 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 .
flowscheme = 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 .
flowscheme = 33 (for electrolyte
only, special feature for buffers.)
should be used together with zeropotential =
yes
!!
! This flowscheme is for the buffer only.
!!
! Loop over pH values.
! ====================
! 1. Electrolyte
! 2. Output concentration of buffer ions
!!
Material parameters
flowscheme = 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 semicolondelimited 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: nextnano^{3} reads in an input
file that contains all zinc blende materials, e.g.
1Dmaterial_parameters_binary_zincblende.in .
nextnano^{3} 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.
flowscheme = 50 (for gas
sensors only, preliminary)
Why does one want to modify the flowscheme?
Good question. The idea is to provide a lot of flexibility to the user.
E.g. it is possible to determine the quasiFermi levels
by a classical calculation and then solve the SchrödingerPoisson equation
selfconsistently with these quasiFermi levels to be held fixed.
Another
option would be to solve the system of equations selfconsistently with the
1band 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 flowscheme ) in the input file.
straincalculation =
nostrain
! Do not take
into account
strain at all. (equivalent to
zerostrainamorphous )
= zerostrainamorphous !
Do not take into account
strain at all. (equivalent to nostrain )
= homogeneousstrain ! 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).
= homogeneousstrainsimsystem ! 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).
! homogeneousstrain (a)
and homogeneousstrainsimsystem (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.
= strainminimization
! 2D/3D: numerical algorithm for minimization of the elastic energy
= strainminimizationnew
! 1D/2D/3D: new numerical algorithm for minimization of the elastic
energy
! For a 1D simulation, strainminimizationnew
and homogeneousstrain (or
homogeneousstrainsimsystem ) must lead to
the same result,
! i.e. the numerical result must be equivalent to the analytical result.
= rawstrainin !
Read in a previously calculated strain tensor profile. Very useful for 2D and 3D to save CPU time.
= importstrainsimulationcoordinatesystem !
A strain tensor profile can be imported. The filename has to be specified here:
$importdataonmaterialgrid
= importstraincrystalcoordinatesystem !
A strain tensor profile can be imported. The filename has to be specified here:
$importdataonmaterialgrid
= hydrostaticstrain !
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 (nostrain ).
Here, the strain tensor is set to zero.
 pseudomorphically (appropriate in 1D and for homogeneous layers only
> homogeneousstrain ),
analytical solution
 use the
strainminimization option (2D/3D) to minimize the elastic
energy numerically,
 use the
strainminimizationnew option (1D/2D/3D) to minimize the elastic
energy numerically,
 read in strain from the raw data of a previous calculations (rawstrainin )
 import a strain tensor profile
Homogeneous strain
If using homogeneousstrain ,
you will have to supply a substrate material that must be specified under the
keyword $domaincoordinates . You should be careful when using
homogeneousstrain 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 homogeneousstrain
and homogeneousstrainsimsystem is
the following:
homogeneousstrain : 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.
homogeneousstrainsimsystem : 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 homogeneousstrain
by default. homogeneousstrainsimsystem
is used for testing the other routine.
Strain minimization
If using strainminimization
or strainminimizationnew
you must include the keyword
$strainminimizationmodel
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 rawstrainin
you should have a brief look at the Tip "How to read in strain data from
previous simulations" described below.
(See also $outputrawdata ).
homogeneousstrain
(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.
strainminimization (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.
strainminimization (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 homogeneousstrain
case.
Importing a strain tensor profile
importstrainsimulationcoordinatesystem
importstraincrystalcoordinatesystem
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
$importdataonmaterialgrid
filenamestrain = ...
Tip: How to read in strain data from previous simulations.

In Input file, specify to
write out strain data in raw data format.
!!
$outputrawdata !
More Information:
$outputrawdata destinationdirectory =
raw_data/ !
strain =
yes
! $end_outputrawdata ! !!
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.
!!
$simulationflowcontrol
! flowscheme = 2 !
(any integer number is possible)
rawdirectoryin =
raw_data/ !
straincalculation =
rawstrainin !
$end_simulationflowcontrol !
!!
(See also $outputrawdata ).
This keyword also
controls the read in of raw data. This is binary data from former calculations which is
stored unformatted with the keyword: $outputrawdata .
Since the file names are fixed, you have to provide the directory name
only.
As output you can always choose under 'rawdata ' to save the
electrostatic potential or the quasiFermi levels unformatted in order to read
them in later
with flowscheme = 3 .
More information is available in the
SiGe tutorial.
rawdirectoryin = 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 $outputrawdata ).
rawpotentialin = yes /
no
Flag whether to read in unformatted electrostatic potential data.
(See also $outputrawdata ).
rawfermilevelsin = yes / no
!
Flag whether to read in unformatted electron and
hole Fermi level data.
(See also $outputrawdata ).
rawkpeigenstatesin = yes / no
Flag whether to read in unformatted electron and/or
hole k.p eigenstates and wave functions.
(See also $outputrawdata ).
rawsweepindexin = 0 = 1
= 2
= ...
With this specifier
it is possible to read in raw data from a specific voltage sweep index (voltage step).
(See also $outputrawdata ).
