# quantum{}¶

Specifications that define quantum models, i.e. how the Schrödinger equation should be solved.

```
quantum{
debuglevel = 1
allow_overlapping_regions = no
#----------------
# Quantum regions
#----------------
region{
name = "qr1"
quantize_x{}
quantize_y{}
quantize_z{}
no_density = yes
x = [10.0, 20.0]
y = [10.0, 20.0]
z = [10.0, 20.0]
# Boundary conditions
#--------------------
boundary{
x = dirichlet
y = dirichlet
z = neumann
classical_boundary_x = no
classical_boundary_y = no
classical_boundary_z = no
num_classical_x = [1,1]
num_classical_y = [1,1]
num_classical_z = [1,1]
}
# Output definitions
#-------------------
output_wavefunctions{
max_num = 10
all_k_points = yes/no
structured = no
amplitudes = "S_X_Y_Z CB_HH_LH_SO"
probabilities = "yes CB_HH_LH_SO"
scale = 0.7
in_one_file = yes
energy_shift = both
include_energies_in_shifted_files = yes
}
output_subband_densities{
max_num = 10
in_one_file = yes
}
output_sparse_matrix{
type = all
structured = no
}
output_rotated_inverse_mass_tensor{
boxes = yes
structured = no
}
# Quantum models and solver definitions
#--------------------------------------
Gamma{
num_ev = 10
# Eigensolvers (choose one)
lapack{}
arpack{}
accuracy = 1e-6
iterations = 200
preconditioner = chebyshev
cutoff = 0.3
abs_cutoff = 2.5
order_chebyshev = 20
# Dispersion
#-----------
dispersion{
path{
name = "100"
point{
k = [1.0, 0.0, 0.0]
k = [1.0, 1.0, 0.0]
}
spacing = 0.5
num_points = 10
}
lines{
name = "lines"
spacing = 0.5
k_max = 1.0
}
full{
name = "3D"
kxgrid{
line{
pos = -1
spacing = 0.02
}
}
kygrid{
line{
pos = -1
spacing = 0.02
}
}
kzgrid{
line{
pos = -1
spacing = 0.02
}
}
}
superlattice{
name = "superlattice"
num_points_x = 10
num_points_y = 15
num_points_z = 20
num_points = 20
}
}
}
L{
... (same as Gamma)
}
X{
... (same as Gamma)
}
Delta{
... (same as Gamma)
}
HH{
... (same as Gamma)
}
LH{
... (same as Gamma)
}
SO{
... (same as Gamma)
}
kp_6band{
... (same as Gamma)
kp_parameters{
use_Luttinger_parameters = no
approximate_kappa = no
}
lapack{}
#arpack{}
k_integration{
relative_size = 0.2
num_points = 5
num_subpoints = 2
max_symmetry = no
force_k0_subspace = yes
}
}
kp_8band{
num_electrons = 6
num_holes = 12
accuracy = 1e-8
iterations = 200
kp_parameters{
use_Luttinger_parameters = no
from_6band_parameters = no
approximate_kappa = no
evaluate_S = no
rescale_S_to = 1.0
}
k_integration{
... (same as kp_6band)
}
lapack{}
#arpack_inv{}
shift_window = 0
shift = 0.2
abs_shift = 2.5
linear_solver{
iterations = 500
abs_accuracy = 1e-9
rel_accuracy = 1e-9
use_cscg = no
force_diagonal_preconditioner = no
}
#advanced settings for 8-band k.p quantum density
shift_min_CB = 0.0
shift_max_VB = 0.0
tunneling = yes
classify_kspace = 0
threshold_classification = 0.5
full_band_density = no
}
#Matrix elements definitions
#---------------------------
interband_matrix_elements{
KP6_Gamma{
direction = [1,1,0]
}
HH_Gamma{ ... } # < HH_i | Gamma_j >
LH_Gamma{ ... } # < LH_i | Gamma_j >
SO_Gamma{ ... } # < SO_i | Gamma_j >
HH_Delta{ ... } # < HH_i | Delta_j >
LH_Delta{ ... } # < LH_i | Delta_j >
SO_Delta{ ... } # < SO_i | Delta_j >
HH_X{ ... } # < HH_i | X_j >
LH_X{ ... } # < LH_i | X_j >
SO_X{ ... } # < SO_i | X_j >
HH_L{ ... } # < HH_i | L_j >
LH_L{ ... } # < LH_i | L_j >
SO_L{ ... } # < SO_i | L_j >
output_matrix_elements = yes
output_transition_energies = yes/no #
}
intraband_matrix_elements{
Gamma{
direction = [1,1,0]
}
Delta{ ... }
X{ ... }
L{ ... }
HH{ ... }
LH{ ... }
SO{ ... }
KP6{ ... }
KP8{ ... }
output_matrix_elements = yes/no output_transition_energies = yes/no
output_oscillator_strengths = yes/no
}
dipole_moment_matrix_elements{
Gamma{
direction = [1,1,0]
}
Delta{ ... }
X{ ... }
L{ ... }
HH{ ... }
LH{ ... }
SO{ ... }
KP6{ ... }
KP8{ ... }
output_matrix_elements = yes
output_transition_energies = yes
output_oscillator_strengths = yes
}
transition_energies{
Gamma{}
KP6_Gamma{}
HH_Gamma{}
LH_Gamma{}
SO_Gamma{}
Delta{}
HH_Delta{}
LH_Delta{}
SO_Delta{}
X{}
HH_X{}
LH_X{}
SO_X{}
L{}
HH_L{}
LH_L{}
SO_L{}
HH{}
LH{}
SO{}
KP6{}
KP8{}
}
calculate_lifetime{
phonon_energy = 0.036
}
bulk_dispersion{
path{
name = "from_Gamma_to_L"
position{
x = 5.5
y = 10.0
z = -1.1
}
shift_holes_to_zero = yes
point{
k = [1.0, 0.0, 0.0]
}
...
spacing = 0.5
num_points = 10
}
lines{
name = "lines"
position{
x = 5.5
y = 10.0
z = -1.1
}
shift_holes_to_zero = yes
spacing = 0.5
k_max = 1.0
}
full{
name = "3D"
position{
x = 5.5
y = 10.0
z = -1.1
}
shift_holes_to_zero = yes
kxgrid{
line{
pos = -1
spacing = 0.02
}
line{
pos = 1
spacing = 0.02
}
...
}
kygrid{
...
}
kzgrid{
...
}
}
output_bulk_dispersions{}
output_masses{}
} # end: bulk_dispersion{}
} # end: region{}
#Many body effects
#-----------------
exchange_correlation{
type = lda
initial_spin_pol = 1.0
output_spin_polarization{}
output_exchange_correlation{}
}
}
```

## debuglevel¶

- value
any integer between -1 and 3

- default
1

The higher this integer number, the more information on the numerical solver is printed to the screen output. Increasing the respective debuglevel to 2 or more significantly increases the volume of the diagnostic output displayed in next**nano**mat (or a shell window). As result of the additional I/O load, particularly 1D simulations will slow down correspondingly (especially for `current{ }`

and `poisson{ }`

).

## allow_overlapping_regions¶

- value

`yes`

or`no`

- default

`no`

Overlapping quantum regions computing the same band(s) are not allowed. Note that, in case such overlap is allowed, the quantum densities of the respective regions are added in the overlap region and a too high density will be computed. Thus, please only allow such overlap when the quantum densities are known to be extremely small in the overlap region.

## region{ }¶

Inside the quantum region, the Schrödinger equation is solved.

- name

- value
“string”

Provides the name of the quantum region.

- quantize_x{}
In 2D or 3D simulation, the Schrödinger equation is solved within the slices perpendicular to x-direction. This results in the reduction of the calculation time.

For example, if a 2D simulatin has 100 grids in x-direction and 50 grids in y-direction, the normal calculation solves the eigenvalue problem of a (100x50) x (100x50) matrix. When

`quantize_x{}`

is specified, on the other hand, nn++ solves the 1D Schroedinger equations along y-direction at each grid point in x-direction so 100 eigenvalue problems of 50x50 matrixes are solved. Thus the runtime of the eigenvalue solver could be roughly estimated as (number of x-grids)\(^{-1}\) times, but we should note that the runtime also depends on the number of eigenvalues to be calculated.Currently, only one-band (Gamma, X, Delta, LH, HH, etc.) without k-integration and without magnetic field is supported, and QM output is limited to local spectra and occupations. If strain is enabled, deformation potentials are ignored. Similarly, quantum boundary conditions are always Neumann or periodic, irrespective of what is specified in the input file. And quantum decomposition regions cannot be used for CBR or optics.

Only one quantization direction (x, y, z) can be simultaneously specified when quantum decomposition is used. Typically, the quantization direction is the growth direction.

Note that a similar number of states should be requested as for a corresponding 1D simulation (i.e. much less than normally needed in 2D or 3D), and that lateral (i.e. orthogonal to the quantization direction) grid spacings can be much larger than for “normal” quantum simulation, as the density from quantum decomposition is NOT affected by wide lateral grid spacings.

- quantize_y{}
The same as

`quantize_x{}`

, but the slices are in y-direction.- quantize_z{}
The same as

`quantize_x{}`

, but the slices are in z-direction.- no_density

- value

`yes`

or`no`

- default

`no`

Tells if to not calculate quantum mechanical charge density.

- x

- value
2D float vector

Provides the extension of quantum region in x direction in nanometers (nm)

- y

- value
2D float vector

Provides the extension of quantum region in y direction in nanometers (nm). To be used for 2D or 3D calculations only.

- z

- value
2D float vector

Provides the extension of quantum region in x direction in nanometers (nm). To be used for 3D calculation only.

- boundary{ }
Specifies the boundary condition for Schrödinger equation along various axis dimensions. In general, Dirichlet boundary conditions correspond to \(f = \mathrm{constant}\) and Neumann boundary conditions correspond to \(df/ dx = \mathrm{constant}\). Quantum densities may exhibit pathological density values on the boundary (e.g. 0 in the case of Dirichlet boundary conditions). Using

`classical_boundary_x`

,`classical_boundary_y`

,`classical_boundary_z`

, the computation of a classical density can be enforced on the respective boundary points for the respective band(s). (The quantum calculation itself and respective results such as wavefunctions are not affected by this setting). Using`num_classical_x`

,`num_classical_y`

,`num_classical_z`

you can explicitly specify the number of points to be cut at each side.

- x

- value
dirichlet/neumann/cbr

- default
neumann

- y

- value
dirichlet/neumann/cbr

- default
neumann

- z

- value
dirichlet/neumann/cbr

- default
neumann

- classical_boundary_x

- value

`yes`

or`no`

- default
no

- classical_boundary_y

- value

`yes`

or`no`

- default
no

- classical_boundary_z

- value

`yes`

or`no`

- default
no

- num_classical_x

- value
2D integer vector

- default
[1 , 1]

- num_classical_y

- value
2D integer vector

- default
[1 , 1]

- num_classical_z

- value
2D integer vector

- default
[1 , 1]

Note

Periodic boundary conditions along the appropriate direction(s) are taken automatically if

`global { ... periodic{ x/y/z = yes} }`

is specifiedandif the quantum region extends over the whole simulation region along the appropriate direction. In this case, the`dirichlet`

or`neumann`

specifications under`quantum{ ... {region{ ... boundary{...} } }`

are ignored along the appropriate direction(s).

- output_wavefunctions{ }
Provides options for output of wavefunction data

- max_num

- value
any integer between 1 and 9999

- default
1.0

- all_k_points

- value

`yes`

or`no`

- default
false

Prints out the wavefunctions for all \(k_{||}\) points (1D: \(k_{||} = (k_y,k_z)\), 2D: \(k_{||} = k_z\)) that are used in the

`k_integration{ }`

or`dispersion{ }`

. Enabling this option can produce a large number of output files.

- structured

- value

`yes`

or`no`

- default

`no`

The whole output for

`quantum{ }`

is written in subdirectory Quantum/. If enabled, additional subdirectories are created in subdirectory Quantum/ to organize the structure of the output files in a meaningful way. It is recommended to set this parameter to yes if a lot of output files are created, e.g. in case`all_k_points = yes`

, and both`amplitudes`

and`probabilities`

are printed out.

- amplitudes

- value
string

- default
” no “

Prints out the wavefunctions \(\psi\) in units of 1D: \(\mathrm{nm}^{-1/2}\), 2D: \(\mathrm{nm}^{-1}\), 3D: \(\mathrm{nm}^{-3/2}\).

- options

” yes “: fork.pit is equivalent to S_X_Y_Z

” no “: no output is done for amplitudes.

” S_X_Y_Z “: prints out the wavefunctions (psi) with respect to the basis (k.ponly) \(| S+ \rangle | S- \rangle | X+ \rangle | Y+ \rangle | Z+ \rangle | X- \rangle | Y- \rangle | Z- \rangle\). \(| X+ \rangle | Y+ \rangle | Z+ \rangle\) correspond to the x, y, z of the simulation coordinate system (and not crystal coordinate system) and + and - correspond to the spin projection along the z axis of the crystal system.

” CB_HH_LH_SO “: prints out the wavefunctions (psi) with respect to the basis (k.ponly) \(| cb+ \rangle | cb- \rangle | hh+ \rangle | lh+ \rangle | lh- \rangle | hh- \rangle | so+ \rangle | so- \rangle\). This basis is the same as used in L. C. Lew Yan Voon, M. Willatzen, The k.p method`(2009) (Table 3.4); G. Bastard, `Wave Mechanics Applied to Semiconductor Heterostructures (1988) and B. A. Foreman, PRB 48, 4964 (1993).If multiple choices are required type them together inside a string like

amplitudes = " S_X_Y_Z CB_HH_LH_SO "

- probabilities

- value
string

- default

`yes`

Prints out the wavefunctions \(|\psi|^2\) in units of 1D: \(\mathrm{nm}^{-1}\), 2D: \(\mathrm{nm}^{-2}\), 3D: \(\mathrm{nm}^{-3}\).

- options

yes: fork.pit is the sum of the squares of all components of a spinorno: no output

S_X_Y_Z: same as for the amplitudes (k.p only)

CB_HH_LH_SO: same as for the amplitudes (k.p only)If multiple choices are required type them together inside a string like

probabilities = " yes CB_HH_LH_SO "

- scale

- value
float

- default
1.0

scale factor for output of amplitudes and probabilities

- in_one_file

- value

`yes`

or`no`

- default

`yes`

Prints out the amplitudes into one file and the probabilities into one file. If no is chosen, for each eigenvalue a separate file is written out.

- energy_shift

- value
string

- default
both

- options

shifted: prints out the amplitudes and the probabilities shifted by the energy.

not_shifted: prints out the amplitudes and the probabilities as they are (an integral over volume is equal to 1).

both: prints out the amplitudes and the probabilities with and without energy shift.- include_energies_in_shifted_files

- value

`yes`

or`no`

- default

`yes`

Selects if the energy levels are added in output of shifted amplitudes and probabilities or not. If no is selected a separate file with energy levels is written out.

Note

The energy spectrum (i.e. the eigenvalues) are always written into the files energy_spectrum_*.dat. The projections of the eigenfunctions on the basis states of the bulk Hamiltonian are written into the files spinor_composition_*.dat.

- output_subband_densities{ }
Provides options for output of subband densities.

- max_num

- value
any integer between 0 and 9999

- default
1

number of subband densities to be printed out. If

`max_num`

is not present, the subband density is written out for each eigenvalue.

- in_one_file

- value

`yes`

or`no`

- default

`yes`

Prints out the subband densities into one file. If no is chosen, for each subband density a separate file is written out. This feature only makes sense for 1D simulations.

- output_sparse_matrix{ }
Provides options for output of sparse matrix, used in Schroedinger equation solver, in .mtx format

- type

- value
string

- default
values

- options

values: output sparse matrix as it is (also imaginary part, if sparse matrix is complex valued).

zero_nonzero: output matrix containing ‘0’ and ‘1’ for zero and non-zero entries of sparse matrix (same for imaginary part, if sparse matrix is complex valued)

zero_nonzero_absolute: output matrix containing ‘0’ and ‘1’ for zero and non-zero absolute values of entries of sparse matrix

all: output all types listed above- structured

- value

`yes`

or`no`

- default

`no`

Whole output is written in subdirectory Quantum/. IF yes is selected additional subdirectories are created in subdirectory Quantum/ to organize the structure of the output files in a meaningful way.

- Gamma{ }
Solves single-band effective mass Schrödinger equation for the Gamma conduction band.

- num_ev

- value
integer >= 0

- default
0

Provides the number of eigenvalues to be calculated.

- force_complex_solver

- value

`yes`

or`no`

- default
no

Set flag to

`yes`

, when optics{} is complaining about real-valued quantum solvers.

- lapack{ }
LAPACK eigensolver is used to solve dense matrix problem (should be used for 1D and small 2D systems). For 1D simulations without periodic boundary conditions a tridiagonal LAPACK solver is used for the single-band Hamiltonian as default.

- arpack{ }
ARPACK eigensolver is used to solve eigenvalue problem using sparse matrix routines. It ARPACK should be faster for large matrices (N > 1000) where only a few eigenvalues are sought (~5-30). Memory usage of arpack (and also arpack_inv) only depends on the number of eigenvectors requested, and is not influenced by the type of preconditioner used. Essentially, for each requested eigenvector (i.e. wave function), additional temporary space corresponding to 2.5 eigenvectors is needed during runtime. Among the preconditioners, chebyshev preconditioning and legendre preconditioning are comparably fast, but require both the specification of a cutoff energy under (above) which all eigenvalues of interest are assumed to be located. If this assumption is violated, only spurious parts of the energy spectrum will be computed. On the other hand, setting the cutoff energy too generous will slow down convergence. Since the energy spectrum often shifts during the Quantum-Poisson iteration, a more generous initial cutoff energy is also needed for the first Quantum-Poisson iteration step. If this initial cutoff energy is not provided, much slower but more predictable polynomial preconditioning will be used for the first Quantum-Poisson iteration step instead of the specified chebyshev / legendre preconditioner. Alternatively, this slower polynomial preconditioning can also be used for the entire Quantum-Poisson iteration. In this case, no cutoff energies need to be specified at all. Generally, it is advisable to use polynomial preconditioning when simulating a new structure until the distribution of the eigenvalues, the location of the Fermi level(s), and the required numbers of eigenvalues are better known. Performance of all preconditioners can be further tuned by changing the order of the respective polynomial used, with optimal values typically lying between 10 and 30. arpack will terminate once the desired accuracy has been reached or the specified number of iterations has been exceeded. In the latter case, not all requested eigenvectors may have been calculated, or convergence may be incomplete.

- accuracy

- value
any float > 0

- default
1e-10 for LAPACK 1e-7 for ARPACK

accuracy of eigenvalue

- iterations

- value
any integer > 1

- default
500

number of iterations for eigenvalue solver

- preconditioner

- value
0 or polynomial, 1 or chebyshev, 2 or legendre

- default
1 or chebyshev

Polynomial preconditioner is the slowest but does not require to specify cutoff energy whereas chebyshev or legendre preconditioner requires you to specifiy cutoff energy.

- order_polynomial

- value
any integer > 1

- default
15

order of the polynomial used for polynomial preconditioning

- order_chebychev

- value
any integer > 1

- default
20

order of the polynomial used for Chebyshev preconditioning

- order_legendre

- value
any integer > 1

- default
20

order of the polynomial used for Legendre preconditioning

- cutoff

- value
any float >= 0.001

- default

`0.3`

#`[eV]`

- abs_cutoff

- value
any float >= 0.001

- default

`0.0`

#`[eV]`

Note

The default behaviour of ARPACK eigensolver is the following: When the Schrödinger equation is solved for the first time, the polynomial preconditioner is used, because there is no suitable cutoff energy known. In all later Quantum-Poisson iterations the chebyshev preconditioner will be used (up to two times faster) with a cutoff energy slightly above the highest eigenvalue, which was calculated in the last iteration.

- dispersion{ … }
calculate the \(\mathbf{k_{||}}\) and \(\mathbf{k_{\tiny{superlattice}}}\) (if applicable) dispersion. The energy dispersion E(

k) along the specified paths and for the specifiedkspace resolutions are completely independent from thekspace resolution that was used within the self-consistent cycle where the k.p density has been calculated. The latter is specified in`k_integration{ }`

. For more details, see dispersion{}.

- L{ }
solves single-band Schrödinger equation for the

Lconduction band. The options are the same as Gamma{ }.

- X{ }
solves single-band Schrödinger equation for the

Xconduction band. The options are the same as Gamma{ }.

- Delta{ }
solves single-band Schrödinger equation for the

Deltaconduction band. The options are the same as Gamma{ }.

- HH{ }
solves single-band Schrödinger equation for the

heavy holevalence band. The options are the same as Gamma{ }.

- LH{ }
solves single-band Schrödinger equation for the

light holevalence band. The options are the same as Gamma{ }.

- SO{ }
solves single-band Schrödinger equation for the

split-off holevalence band. The options are the same as Gamma{ }.kp_6band{ }

solves 6-band

k.pSchrödinger equation for the ** heavy, light and split-off hole** valence band. The options are the same as Gamma{ } with some additional options, which are

kp_parameters{ }

advanced manipulation of

k.pparameters from the database.

- use_Luttinger_parameters

- value

`yes`

or`no`

- default

`no`

By default the solver uses the DKK (Dresselhaus-Kip-Kittel) parameters (L, M, N). If enabled then it uses Luttinger parameters (\(\gamma_1\), \(\gamma_2\), \(\gamma_3\)) instead.

- approximate_kappa

- value

`yes`

or`no`

- default

`no`

By default the \(\kappa\) for zinc blende crystal structure is taken from the database or input file. If this is enabled then the solver is forced to approximate kappa through others 6-band

k.pparameters, even though kappa is given in database or input file.

- lapack{}
LAPACK eigensolver: solves dense matrix problem (for 1D and small 2D systems only)

- arpack{}
ARPACK eigensolver (default) ARPACK should be faster for large matrices (N > 1000) where only a few eigenvalues are sought (~5-30).

k_integration{ }

Provides options for integration over \(\mathbf{k_{||}}\) space for

k.pdensity calculations (for 1D and 2D only). By default the quantum mechanical charge density is calculated (`no_density = no`

). Therefore,`k_integration{ }`

is required. If you do not need a quantum mechanical density, e.g. because you are not interested in a self-consistent simulation, the calculation is much faster if you use (`no_density = yes`

). Then you can omit`k_integration{ }`

and only the eigenstates for \(\mathbf{k_{||}} = (k_y,k_z) = (0,0) = 0\) are calculated.

- relative_size

- value
float between 0.0 and 1.0

- default
1.0

Range of \(\mathbf{k_{||}}\) integration relative to size of Brillouin zone. Often a value between 0.1-0.2 is sufficient.

- num_points

- value
integer > 1

- default
10

number of \(\mathbf{k_{||}}\) points, where Schrödinger equation has to be solved (in one direction). In 1D, the number of Schrödinger equations that have to be solved depends quadratically on

`num_points`

. In 2D, the number of Schrödinger equations that have to be solved depends linearly on`num_points`

.

- num_subpoints

- value
integer > 1

- default
5

number of points between two \(\mathbf{k_{||}}\) points, where wavefunctions and eigenvalues will be interpolated.

- max_symmetry

- value
1 or no 2 or C2 3 or full

- default
full

`no`

does not use symmetry of Brillouin zone to reduce number of \(\mathbf{k_{||}}\) points.

`C2`

uses up to \(C_2\) symmetry of Brillouin zone to reduce number of \(\mathbf{k_{||}}\) points.

`full`

uses full symmetry of Brillouin zone to reduce number of \(\mathbf{k_{||}}\) points. For example for a cubic k space the 1/8th of the zone.

- force_k0_subspace

- value

`yes`

or`no`

- default

`no`

If set to

`yes`

, \(k_\parallel\) integration in quantum{} is modified in that only states for point \(k=0\) are computed exactly, whereas all other k points are computed in the subspace of the \(k=0\) wavefunctions. As a result of this approximation, computational speed is much improved (you may even be able to also enlarge the number of eigenvalues). In case you are planning to use this approximation for final results, please make sure to check whether the resulting loss of accuracy in density is acceptable.

- kp_8band{ }
It solves 8-band

k.pSchrödinger equation for the Gamma conduction band and the heavy, light and split-off hole valence bands.

- num_electrons

- value
integer >= 0

- default
0

number of electron eigenvalues

- num_holes

- value
integer >= 0

- default
0

number of hole eigenvalues

- accuracy

- value
any float > 0

- default
1e-7

accuracy of eigenvalue

- iterations

- value
any integer > 1

- default
500

number of iterations for eigenvalue solver

kp_parameters{ }

Provides options for advanced manipulation of k.p parameters from database.

- use_Luttinger_parameters

- value

`yes`

or`no`

- default

`no`

By default the solver uses the DKK (Dresselhaus-Kip-Kittel) parameters (L, M, N). If enabled then it uses Luttinger parameters (\(\gamma_1\), \(\gamma_2\), \(\gamma_3\)) instead.

- from_6band_parameters

- value

`yes`

or`no`

- default

`no`

By default the 8-band

k.pparameters are taken from database or input file. If enabled then it evaluates the 8-bandk.pparameters from 6-bandk.pparameters, Kane parameter \(E_P\) and temperature dependent band gap \(E_g\).

- approximate_kappa

- value

`yes`

or`no`

- default

`no`

By default the \(\kappa\) for zinc blende crystal structure is taken from the database or input file. If this is enabled then the solver is forced to approximate kappa through others 8-band

k.pparameters, even though kappa is given in database or input file.

- evaluate_S

- value

`yes`

or`no`

- default

`no`

By default \(S\) (\(S_1\), \(S_2\) for wurtzite)

k.pparameter(s) is (are) taken from database or input file. If enabled it evaluates \(S\) (\(S_1\), \(S_2\) for wurtzite)k.pparameter(s) from effective mass \(m_e\) (\(m_{e,par}\), \(m_{e,perp}\) for wurtzite), Kane parameter(s), spin-orbit coupling(s) and temperature dependent band gap.

- rescale_S_to

- value
float for zinc blende crystal structure

2D float vector for wurtzite crystal structure

set \(S\) for zinc blende crystal structure to specified value and rescale \(E_P\), \(L'\), \(N^{+}\) in order to preserve electron’s effective mass.

set \(S_1\), \(S_2\) for wurtzite crystal structure to specified values respectively and rescale \(E_{P1}\), \(E_{P2}\), \(L_{1}'\), \(L_{2}'\), \(N^+_1\), \(N^+_2\) in order to preserve electron’s effective masses.

- k_integration{ }
Provides options for integration over \(\mathbf{k_{||}}\) space for

k.pdensity calculations (for 1D and 2D only) same as kp_6band{ k_integration{ }}

- lapack{ }
LAPACK eigensolver: solves dense matrix problem (for 1D and small 2D systems only)

- arpack_inv{ }
ARPACK shift invert eigensolver. ARPACK should be faster for large matrices (N > 1000) where only a few eigenvalues are sought (~5-30).

- shift_window

- value
integer

- default
0

When LAPACK is used, shifts the window of computed states by the specified number of states up (for positive integers) or down (for negative integers). Adjust when the computed states are not centered around the band gap.

- shift

- value
float >=0

- default

`0.1`

#`[eV]`

energy shift relative to band edges in

`arpack_inv`

.

- abs_shift

- value
float >=0

- default

`0.0`

#`[eV]`

energy shift on an absolute energy scale in

`arpack_inv`

.

linear_solver{ }

Provides parameters for linear equation solver in

`arpack_inv`

shift invert preconditioner

- iterations

- value
integer > 1

- default
10000

number of iterations in

`arpack_inv`

. Occasionally, using even larger values than 10000 may be necessary to avoid diagonalization failure.

- abs_accuracy

- value
float between 0.0 and 0.01

- default
1e-8

absolute accuracy in

`arpack_inv`

.

- rel_accuracy

- value
float between 0.0 and 0.01

- default
1e-8

relative accuracy in

`arpack_inv`

.

- use_cscg

- value

`yes`

or`no`

- default

`no`

When

`arpack_inv`

is used, forces the slower but occasionally more robust CSCG (Composite Step Conjugate Gradient ) linear solver to be used rather than the cg (Conjugate Gradient) linear solver. May occasionally prevent a diagonalization failure.

- force_diagonal_preconditioner

- value

`yes`

or`no`

- default

`no`

When

`arpack_inv`

is used, forces the use of a slower but more robust diagonal preconditioner. As result, total runtime and stability of the arpack_inv solver may actually become much better and diagonalization failures may be avoided.

- shift_min_CB

- value
float

- default
0.0

(relevant only if

`classify_kspace = 0`

) Shifts the minimum of the conduction band to manipulate cutoff energy and thereby the quantum density classification.

- shift_max_VB

- value
float

- default
0.0

(relevant only if

`classify_kspace = 0`

) Shifts the maximum of the valence band to manipulate cutoff energy and thereby the quantum density classification.

- tunneling

- value

`yes`

or`no`

- default

`yes`

(relevant only if

`classify_kspace = 0`

) Choice of the (position-dependent) cutoff energy.`yes`

defines the cutoff energy at max((minimum of the conduction band in the structure), (position-dependent valence band edge)), while`no`

sets it to min((maximum of the valence band in the structure), (position-dependent conduction band edge)).

- classify_kspace

- value
0, 1, 2, or 3

- default
0

Choice of the classification method in the 8-band k.p quantum density calculation.

`classify_kspace = 0`

: Eigenstates are classified by comparing the zone-center eigenvalues with the (possibly position-dependent) cutoff energies. For the definition of cutoff energies, see`shift_min_CB`

,`shift_max_VB`

, and`tunneling`

.

`classify_kspace = 1`

: Eigenstates are classified by comparing the zone-center spinor composition with`threshold_classification`

.

`classify_kspace = 2`

: Eigenstates are classified at each in-plane k vector (1D simulation) and at each k value (2D simulation) using spinor composition averaged with the neighbouring k points.

`classify_kspace = 3`

: Eigenstates are classified at each in-plane k vector (1D simulation) and at each k value (2D simulation) using spinor composition averaged with the neighbouring k points, but skipping the average if any of the neighbouring k points has the opposite sign of charge. The resulting quantum density will be different from the case`classify_kspace = 2`

if electron-hole hybridization occurs (e.g. type-II broken-gap superlattices).- threshold_classification

- value
0.0 <= float <= 1.0

- default
0.5

(relevant only if

`classify_kspace >= 1`

) Classify states to electrons if the electron spinor composition is greater than this threshold and otherwise to holes.

- full_band_density

- value

`yes`

or`no`

- default

`no`

Calculate density by filling all states above Fermi level with holes and subtracting a negative background charge (

`lapack`

only). This ignores`classify_kspace`

.

- spurious_handling

- value
six dimensional double vector

- default
[0.0, 1.0, -1.0, 1.0, 0.0, 0.0]

`first component:`

If value > 0, forward-/backward differences are used for the first derivative discretization of the P material parameter (Kane parameter) in the 8-band k.p Hamiltonian. Default is 0 (= FALSE), i.e. centered differences are used instead. This parameter might affect spurious solutions of the wavefunctions. See eq. (1.50) and eq. (1.51) of PhD thesis T. Andlauer.

`second component:`

farband contribution to electrons = value - 1.0 (conduction band g factor, should be a material parameter but it is not) (default is: 1.0) S = 1 + farband contribution, by default farband contribution = 0. This corresponds to setting S=1. It can be useful to set this value to 0.0 (farband contribution = -1). Then it corresponds to setting S=0. Otherwise the default is rescaling to that S=1.

`third component:`

correction for electron g factor [eV] (default is: -1.0)

`fourth component:`

If value > 0, rescale everywhere (default is: 1 = TRUE)

`fifth component:`

If value > 0, upwinding is TRUE (default is: 0 = FALSE) ==> It seems that upwinding is not used at all.

`sixth component:`

If value > 0, avoid spurious solutions. (default is: 0 = FALSE)To avoid spurious solutions, an example configuration could be given by

`spurious_handling = [0.0, 1.0, -1.0, 1.0, 0.0, 1.0]`

.

- interband_matrix_elements{ }
Provides the option to calculate interband matrix elements between wave functions of two different bands.

- KP6_Gamma{ }
\(\sum_k \langle kp6_{k,i} | \Gamma_j \rangle\) , with k = 1 .. 6 indexing the component of the six-component

k.pwave function and \(i\), \(j\) indexing the wave function numbers.`kp_6band{ }`

and`Gamma{ }`

calculation must be present.- HH_Gamma{ }
Matrix element of the transition between the heavy hole valence band and the gamma conduction band \(\langle HH_{i} | \Gamma_j \rangle\)

- LH_Gamma{ }
Matrix element of the transition between the light hole valence band and the gamma conduction band \(\langle LH_{i} | \Gamma_j \rangle\)

- SO_Gamma{ }
Matrix element of the transition between the split-off hole valence band and the gamma conduction band \(\langle SO_{i} | \Gamma_j \rangle\)

- HH_Delta{ }
Matrix element of the transition between the heavy hole valence band and the Delta conduction band \(\langle LH_{i} | \Delta_j \rangle\)

- LH_Delta{ }
Matrix element of the transition between the light hole valence band and the Delta conduction band \(\langle LH_{i} | \Delta_j \rangle\)

- SO_Delta{ }
Matrix element of the transition between the split-off hole valence band and the Delta conduction band \(\langle SO_{i} | \Delta_j \rangle\)

- HH_X{ }
Matrix element of the transition between the heavy hole valence band and the X conduction band \(\langle HH_{i} | X_j \rangle\)

- LH_X{ }
Matrix element of the transition between the light hole valence band and the X conduction band \(\langle LH_{i} | X_j \rangle\)

- SO_X{ }
Matrix element of the transition between the split-off valence band and the X conduction band \(\langle SO_{i} | X_j \rangle\)

- HH_L{ }
Matrix element of the transition between the heavy hole valence band and the L conduction band \(\langle HH_{i} | L_j \rangle\)

- LH_L{ }
Matrix element of the transition between the light hole valence band and the L conduction band \(\langle LH_{i} | L_j \rangle\)

- SO_L{ }
Matrix element of the transition between the split-off valence band and the L conduction band \(\langle SO_{i} | L_j \rangle\)

- output_matrix_elements = yes/no
Output matrix elements.

- output_transition_energies = yes/no
Output transition energies.

- intraband_matrix_elements{ }
Calculate intraband matrix elements \(\langle i | \epsilon\cdot\hat{\mathbf{p}} | j \rangle\) for wave functions within one band. The light polarization direction \(\epsilon\) is automatically normalized in the program. \(\hat{\mathbf{p}} = i\hbar\nabla\) is the momentum vector.

For further reading: J. H. Davies,

The Physics of Low-Dimensional Semiconductors. An Introduction, 2006, Chapters 10 and 8.

- Gamma{ }
Calculates the matrix element \(\langle \Gamma_i | \epsilon\cdot\hat{\mathbf{p}} | \Gamma_j \rangle\).

- direction

- value
3D integer vector

- default
[1 , 0 , 0]

It defines the polarization direction \(\epsilon\). From it a vector of unit length is calculated, which enters the calculation. In 1D simulation it can be omitted and [1,0,0] is then assumed.

- Delta{ }
Calculates the matrix element \(\langle \Delta_i | \epsilon\cdot\hat{\mathbf{p}} | \Delta_j \rangle\). See

`Gamma{ ... }`

for direction option.- X{ }
Calculates the matrix element \(\langle X_i | \epsilon\cdot\hat{\mathbf{p}} | X_j \rangle\). See

`Gamma{ ... }`

for direction option.- L{ }
Calculates the matrix element \(\langle L_i | \epsilon\cdot\hat{\mathbf{p}} | L_j \rangle\). See

`Gamma{ ... }`

for direction option.- HH{ }
Calculates the matrix element \(\langle HH_i | \epsilon\cdot\hat{\mathbf{p}} | HH_j \rangle\). See

`Gamma{ ... }`

for direction option.- LH{ }
Calculates the matrix element \(\langle LH_i | \epsilon\cdot\hat{\mathbf{p}} | LH_j \rangle\). See

`Gamma{ ... }`

for direction option.- SO{ }
Calculates the matrix element \(\langle SO_i | \epsilon\cdot\hat{\mathbf{p}} | SO_j \rangle\). See

`Gamma{ ... }`

for direction option.- KP6{ }
Calculates the matrix element \(\sum_k \langle kp6_{k,i} | \epsilon\cdot\hat{\mathbf{p}} | kp6_{k,j} \rangle\), \(k\) = 1,…,6. See

`Gamma{ ... }`

for direction option.- KP8{ }
Calculates the matrix element \(\sum_k \langle kp8_{k,i} | \epsilon\cdot\hat{\mathbf{p}} | kp8_{k,j} \rangle\), \(k\) = 1,…,8. See

`Gamma{ ... }`

for direction option.- output_matrix_elements = yes/no
Output matrix elements.

- output_transition_energies = yes/no
Output transition energies.

- output_oscillator_strengths = yes/no
Output oscillator strengths. Currently, only a simple formula is used, i.e. the free electron mass is used and not the

realeffective mass one.

- dipole_moment_matrix_elements{ }
Calculate dipole moment matrix elements \(\langle i | \epsilon\cdot\hat{\mathbf{d}} | j \rangle\) for wave functions within one band. The light polarization direction \(\epsilon\) is automatically normalized in the program. \(\hat{\mathbf{d}} = e\hat{\mathbf{r}}\) is the dipole moment vector.

For further reading: J. H. Davies,

The Physics of Low-Dimensional Semiconductors. An Introduction, 2006, Chapters 10 and 8.

- Gamma{ }
Calculates the matrix element \(\langle \Gamma_i | \epsilon\cdot\hat{\mathbf{d}} | \Gamma_j \rangle\).

- direction

- value
3D integer vector

- default
[1 , 0 , 0]

It defines the polarization direction \(\epsilon\). From it a vector of unit length is calculated, which enters the calculation. In 1D simulation it can be omitted and [1,0,0] is then assumed.

- Delta{ }
Calculates the matrix element \(\langle \Delta_i | \epsilon\cdot\hat{\mathbf{d}} | \Delta_j \rangle\). See

`Gamma{ ... }`

for direction option.- X{ }
Calculates the matrix element \(\langle X_i | \epsilon\cdot\hat{\mathbf{d}} | X_j \rangle\). See

`Gamma{ ... }`

for direction option.- L{ }
Calculates the matrix element \(\langle L_i | \epsilon\cdot\hat{\mathbf{d}} | L_j \rangle\). See

`Gamma{ ... }`

for direction option.- HH{ }
Calculates the matrix element \(\langle HH_i | \epsilon\cdot\hat{\mathbf{d}} | HH_j \rangle\). See

`Gamma{ ... }`

for direction option.- LH{ }
Calculates the matrix element \(\langle LH_i | \epsilon\cdot\hat{\mathbf{d}} | LH_j \rangle\). See

`Gamma{ ... }`

for direction option.- SO{ }
Calculates the matrix element \(\langle SO_i | \epsilon\cdot\hat{\mathbf{d}} | SO_j \rangle\). See

`Gamma{ ... }`

for direction option.- KP6{ }
Calculates the matrix element \(\sum_k \langle kp6_{k,i} | \epsilon\cdot\hat{\mathbf{d}} | kp6_{k,j} \rangle\), \(k\) = 1,…,6. See

`Gamma{ ... }`

for direction option.- KP8{ }
Calculates the matrix element \(\sum_k \langle kp8_{k,i} | \epsilon\cdot\hat{\mathbf{d}} | kp8_{k,j} \rangle\), \(k\) = 1,…,8. See

`Gamma{ ... }`

for direction option.- output_matrix_elements = yes/no
Output matrix elements.

- output_transition_energies = yes/no
Output transition energies.

- output_oscillator_strengths = yes/no
Output oscillator strengths. Currently, only a simple formula is used, i.e. the free electron mass is used and not the

realeffective mass one.

- transition_energies{ }
Calculate transition energies (energy difference) between two states in certain bands. Use this if you want to calculate transition energies but but do not want to calculate the matrix elements. Note that the matrix elements defined above also include specifiers for transition energies:

`output_transition_energies = yes``

.

Gamma{ }

KP6_Gamma{ }

HH_Gamma{ }

LH_Gamma{ }

SO_Gamma{ }

Delta{ }

HH_Delta{ }

LH_Delta{ }

SO_Delta{ }

X{ }

HH_X{ }

LH_X{ }

SO_X{ }

L{ }

HH_L{ }

LH_L{ }

SO_L{ }

HH{ }

LH{ }

SO{ }

KP6{ }

KP8{ }

- calculate_lifetime{ }
Calculate the lifetimes of the state due to LO phonon scattering. For more information check R. Ferreira, G. Bastard, PRB 40, 1074 (1989) and Section 2.1.3 of the PhD thesis of G. Scarpa, Technische Universität München.

- phonon_energy

- value
any float > 0.0

- default
0.01

LO phonon energy

- bulk_dispersion{ … }
Calculate bulk

k.pdispersion of the material at a specific position in the simulation domain. For more details, see bulk_dispersion{}.

## exchange_correlation{ }¶

Provides options to calculate exchange-correlation effects. This is not calculated by default.

- type

- value
string

- options

lda: Include exchange-correlation effects in the LDA approximation (Local Density Approximation)

lsda: Include exchange-correlation effects in the LSDA approximation (Local Spin Density Approximation)- initial_spin_pol

- value
float between 0.0 and 1.0

- default
0.0

Breaks spin up/down symmetry if no magnetic field is present.

- output_spin_polarization{}
output spin polarization [dimensionless]

- output_exchange_correlation{}
output exchange correlation potentials in

`[eV]`

.