# poisson{}¶

Specifications for the Poisson equation.

## charge_neutral¶

- value

`yes`

or`no`

- default

`yes`

The initial electrostatic potential \(\phi\) entering the Newton solver is determined by requiring local charge neutrality. It is determined using the bisection algorithm. If `charge_neutral = no`

is set and neither a potential is imported nor a fixed electric field is set, then the potential is set at non-Dirichlet points to the Fermi level(s) (both Fermi levels are equal at the beginning).

## newton_solver{ }¶

The Newton solver is used for solving the nonlinear Poisson equation. It is solved with a Newton iteration using inexact line search.The Poisson equation is nonlinear because the charge carrier density \(\rho\) depends on the electrostatic potential \(\phi\), i.e. \(\rho(\phi)\). For each Newton step a system of linear equations, \(A \cdot x = b\), is solved with a linear solver, in order to obtain a gradient. This gradient is used for the inexact line search. Generally, low temperature simulations make the Poisson equation extremely nonlinear at the beginning of the iteration and thus require more line search steps than usual. Using `debuglevel = 2`

displays information on the line searchs steps (search_steps): In the .log file of your simulation, you can find more information on the convergence of the Newton solver.Parameters for solver of nonlinear poisson equation are as follows:

- iterations

- value
any integer > 1

- default
40

Number of iterations for Newton solver

- search_steps

- value
any integer between 1 and 50

- default
30

- residual

- value
any float

- default
1e3 cm

^{-2}(1D)1e1 cm

^{-1}(2D)1e-4 [dimensionless] (3D)

- gradient_shift

- value
any float between the interval -1e6 and 1e-6

- default
1e-13

## linear_solver{ }¶

Parameters for linear equation solver in Newton algorithm.

- iterations

- value
any integer > 1

- default
1000

number of iterations for linear equation solver

- abs_accuracy

- value
any float > 0

- default
1e1 cm

^{-2}(1D)1e-3 cm

^{-1}(2D)1e-8 [dimensionless] (3D)

- rel_accuracy

- value
any float between 0.0 and 0.01

- default
1e-13

- dkr_value

- value
any float < 0.5

- default
0.0

(“magic parameter” to speed up calculations, affects preconditioning. Negative values are ignored but will switch to a slightly slower but more stable preconditioner.

- use_cscg

- value

`yes`

or`no`

- default

`no`

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`

Forces the use of a slower but more robust diagonal preconditioner. Should be used only for debugging purposes, enabling will make code much slower or prevent convergence. Try setting it to yes in case preconditioning fails or the linear solver diverges. If set to yes, iterations may have to be further increased.

- force_iteration

- value

`yes`

or`no`

- default

`no`

Only for debugging purposes, enabling will make code much slower or prevent

## bisection{ }¶

Parameters for bisection search. Used for the initial solution of the Poisson equation when `charge_neutral = yes`

is set. Bisection is performed in order to achieve local charge neutrality at each grid point:

Thus, a true classical charge neutrality is computed for classical carrier and doping situations. Additionally, bisection is also used to determine the electrostatic potential at which contacts become charge neutral, which is also needed for e.g. ohmic contacts and Schottky contacts using Schottky barriers, but not for Fermi contacts as inside them the electrostatic potential is initialized exactly the same way as specified outside/between of contacts. The bisection for contacts is performed in any case, i.e. independently from the bisection used when `charge_neutral = yes`

is set. The bisection method is a well known algorithm for finding the root of a function. The delta is the so-called convergence tolerance parameter. Specifically in next**nano**++ we use this method to find the initial solution of the Poisson equation that generally converges very fast using the default parameters and no extra tuning is required.

- delta

- value
any float > 0.0

- default
10 #

`[eV]`

Range of bisection search.

- iterations

- value
any integer > 1

- default
40

- residual

- value
any integer > 1

- default
1e3 cm

^{-3}For the other bisection used for contacts, the values from the input file are internally modified in that iterations is always increased to be at least 40 and residual is reduced to be at most 1e3 cm

^{-3}, i.e. the contact setup ignores bisection definitions which are weaker than these default settings. Note: In GaN, the intrinsic density at T=300 K is of the order 1e-10 cm-3, in AlN even smaller, so the residual needs to be adjusted in some cases. Making the default values smaller may result in significantly longer initialization times, especially in 3D, and will provide no benefit for other materials than wide band gap semiconductors (e.g. nitrides). Also note that low temperatures cause low densities.

## import_potential{ }¶

Import electrostatic potential from file or analytic function and use it as initial guess for solving the Poisson equation. If no Poisson equation is solved, the imported data determines the electrostatic potential that is used throughout the simulation, i.e. in this case an electrostatic potential can be read in that is fixed during the rest of the simulation and is used as input to the Schrödinger equation and for the calculation of the densities. The solution obtained from a problem solved previously using a different meshing is accepted.

- import_from

- value
path string

Reference to imported data in import{}. The data may have more than one component (e.g. vector field).

- component_number

- value
integer

- default
1

If imported data is a vector field, one may want to specify the component.

## electric_field{ }¶

- strength

- value
any float

- default
0.0 V/m

Defines a constant electric field in the structure. If electric_field is defined, and the absolute value is larger than zero, then it is being used for the electrostatic potential calculation.

- direction

- value
3D float vector

- default
[1.0, 0.0, 0.0]

Orientation of electric field vector with respect to \((x,y,z)\) simulation coordinate system. For 1D simulations, the direction can be omitted and in this case the default will be used.

## reference_potential¶

- value
any float

- default
0.0

If `electric_field{ }`

is defined, this value in units of [V] is being added to the electrostatic potential.

## 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{ }`

)

## output_potential{ }¶

Prints out the electrostatic potential in `[eV]`

.

## output_electric_field{ }¶

Prints out the electric field in kv/cm.

## output_electric_displacement{ }¶

Prints out the output electric displacement

## output_electric_polarization{ }¶

Prints out the output electric polarization

## output_dielectric_tensor{ }¶

Prints out the output dielectric tensor in simulation coordinate system, as it is used while setting up the sparse matrix for the Poisson solver.

- boxes

- value

`yes`

or`no`

- default

`no`

For each grid point, in 1D two points are printed out to mimic abrupt discontinuities at interfaces (in 2D four points, in 3D eight points)

## output_sparse_matrix{ }¶

Prints out the output sparse matrix used in Poisson solver.

- type

- value
string list

- defalut
values

Options for the string value list are as follows
* **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