Definition of the contacts

At simulation boundaries, a Neumann boundary condition is applied to the Poisson equation, \(\frac{{\text d} \phi}{{\text d} x} = 0\).

Five types of contacts are possible:

  • Schottky

    A Schottky contact requires the specification of a Schottky barrier. A Schottky contact implies

    • Dirichlet boundary conditions for the electrostatic potential (Poisson equation)

    • Dirichlet boundary conditions for the Fermi levels

    The Dirichlet value for the potential within the contact is determined by requiring that the energetic distance between the Fermi level and the conduction band edge is equal to the value of the Schottky barrier. Note: A Schottky contact can also be used to model the effect of Fermi level pinning due to surface states.

  • Charge neutral

    As for the Schottky contact a charge neutral contact implies

    • Dirichlet boundary conditions for the electrostatic potential (Poisson equation)

    • Dirichlet boundary conditions for the Fermi levels

    The Dirichlet value for the potential within the contact is determined by requiring local charge neutrality for each grid point of the contact. Note: For instance, this contact model can be used to calculate the energy levels in a quantum well or quantum cascade laser (QCL) as a function of applied bias.

  • Ohmic

    From 2019-01-23 on, we changed the definition of ohmic. Ohmic contacts now behave per default like charge_neutral contacts but additionally have a shift parameter.

  • Zero field (was called ohmic before) – not recommended

    A zero field contact implies

    • Neumann boundary conditions for the Poisson equation (i.e. zero electric field, or more precisely \({\mathbf D}=0\) where \({\mathbf D}\) is the dielectric displacement)

    • Dirichlet boundary conditions for the Fermi levels in the current equation.

    Note: Quantum regions extending into zero field contacts will cause carrier densities higher than those in metals and Fermi levels in the keV range. The cause of this is the nonphysical way zero field contacts are calculated. (Essentially, by enforcing a Neumann zero-field condition at the contact.) Note: Until 2019-01-23, zero_field was called ohmic.

  • Fermi

    A Fermi contact implies Dirichlet boundary conditions for the Fermi levels. Fermi contacts are boundary conditions to the current equations only. Fermi contacts are “invisible” for the Poisson and Schrödinger equation, i.e. the Poisson and Schrödinger equations are solved in the Fermi contact region with the material parameters that are defined in this region. No boundary conditions are imposed on the electrostatic potential, i.e. Neumann is used for the Poisson equation (default).

Please note the following important computational limitation: For almost all types of contacts involving the Poisson equation (ohmic, schottky with barrier defined, charge_neutral, zero_field), the material under the contact is used as reference for computing charge neutrality conditions, ohmic properties, or barrier heights, not the material adjacent to the contact. Thus, please make sure that an appropriate material is defined under the contact to be available as reference. The only exceptions to this behavior are fermi contacts, since these contacts are only involved the current equations, and schottky contacts with defined work_function, since then no reference material is needed.

The bias affects the value of the Fermi levels as it determines the Dirichlet value of the Fermi levels within the contacts. For example, by specifying a bias of 0.7 V, the Fermi level in the corresponding contact is set to a value of -0.7 [eV].


Contact no. 1: Specify “Schottky barrier” to model Fermi level pinning due to surface states: For Schottky contacts, it is also possible to define the vacuum work function of the contact materials instead of the Schottky barrier. In this case, the Schottky-Mott rule will be used to determine the barrier height of the contact. However, please note that, due to Fermi level pinning, experimentally measured Schottky barrier heights may be quite different. The corresponding vacuum energy level () for all Schottky contacts is predefined as 6.3 [eV] in correspondence to the band offsets in the database, but can be modified as well if necessary.

   name          = "air"
   bias          = 0.0      # [V]

   barrier       = 0.7      # [eV] Specify either barrier or work_function but not both.
   work_function = 0.7      # [eV] (optional)
vacuum_level = 6.3           # [eV] (optional, relevant for work_function only) (default = 6.3 eV, estimated from Si affinity of 4.05 eV and Si band offset in database)

Contact no. 2: Specify charge neutral contact.

    name    = "charge_neutral"
    bias    = 0.0                    # [V]

Contact no. 3: Specify ohmic contacts.

    name    = "source"               # name of contact
    bias    = 0.0                    # [V]
    shift   = 0.0                    # [eV] (optional, default = 0.0) Can be used to shift the band structure up (or down) in order to increase (or decrease) the ohmic behavior of the contact.
                                     # Warning: The effect of shift can be very large, best start with ±1 kBT for p-doped/n-doped material (that is ±0.025 eV at 300 K) and check the result.

contact no. 4: Specify zero field contacts (was called ohmic before 2019): (We are not sure whether there is a physical scenario for zero_field contacts, but we leave them in the code in case somebody wants them. In any case, users should keep in mind that they may induce huge space charges which often result into convergence problems.)

    name    = "source"               # name of contact
    bias    = 0.0                    # [V]

contact no. 5: Specify Fermi levels.

    name    = "fermi_1"
    bias    = 0.7                    # [V]

It is possible to define Dirichlet regions for the electron or the hole quasi-Fermi level only (as compared to type fermi{} which always creates a Dirichlet region for both). This feature may be used to e.g. fix the quasi-Fermi level of majority carriers in a region while leaving the quasi-Fermi level of the minority carriers free to float there, as for instance in a bipolar device. Note that overlapping contact regions still cannot be defined, thus also no overlapping e.g. fermi_electron{} and fermi_hole{} contact regions with different bias. Each contact definition will replace (overwrite) previously defined contact region definitions at each respective grid point.

contact no. 6: Specify Fermi level for electrons.

    name    = "fermi_el"
    bias    = 0.7                    # [V]

contact no. 7 Specify Fermi level for holes.

    name    = "fermi_hl"
    bias    = 0.7                    # [V]

Directory names

long_directory_names = no # yes/no (default: no)

no: bias subdirectories are enumerated as bias_***** independently of the numbers of contacts defined.

yes: bias subdirectories are named bias_000_001_***_... which, for inputs with a large number of contacts, could result in issues with too long file paths.

See file bias_points.log in each subdirectory for the actual bias values used.


Each contact (ohmic, schottky, fermi, charge_neutral, zero_field) can contain an optional bias sweep.

Instead of specifying

bias  = 0.5         # [V]

one can alternatively define a voltage sweep (e.g. 0.0, 0.1, 0.2, …, 2.0)

bias  = [0.0, 2.0]  # start and end bias in [V]
steps = 20          # (optional) number of voltage sweep
                    # steps, integer between 1 and 999

or one can alternatively define a sequence of bias points for each contact:

bias  = [0.0, 1.8, 1.9, 2.0] # sequence of biases [V]
                             # (up to 100 bias points)
steps = 1                    # (optional) number of voltage
                             # sweep steps between
                             # consecutive bias points
                             # (default is 1)

If step is defined to be greater than 1, the space between the consecutive bias points is also subdivided correspondingly. Consecutive identical bias points are skipped. A reversal in the direction of the change in bias is allowed but currently probably not useful. If bias is defined as a scalar (or vector of length 1), only one bias value is calculated (and the value of steps is ignored).

The output file bias_points.log contains the mapping between bias values and bias index for all bias points. It is possible to define a bias sweep at several contacts.

At each grid point, only one type of contact can exist. For overlapping contact regions, the last defined contact on this grid point is used.