contacts{}¶
What are contacts in nextnano++¶
Boundary conditions for the Current and Poisson equations are defined in nextnano++ within this group. These conditions can be assigned to specific regions by referring to assigned attribute name. We use the name contacts for these boundary conditions since typically they are chosen as the most outer regions of the structures aiming at simulating real contacts of some devices. It is, however, important to remember that whether these regions correspond to any contact in a real device or not depends on how semiconductors behave near the contact at specific conditions. To model the contacts properly, some knowledge about physics around contacts, specifically about Fermi levels and (or) electric potential, in the modeled device is required and should be applied as the boundary conditions for our solver.
Attributes¶
- vacuum_level
Energy of vacuum level \(E_{vac}\), used for contacts{ schottky{} }.
- type:
real
- unit:
eV
- default:
6.3
- long_directory_names
An attribute allowing to use longer names for bias subdirectories, dependent on the number of defined contacts.
- type:
choice
- values:
yes, no
- default:
no
Available boundary conditions¶
All available groups for specifying boundary conditions for the Current and Poisson equations are described below. It is important to remember that, on top of them, the global boundary conditions are applied to the electrostatic potential \(\phi(x)\) at the boundaries of the entire simulation. These are either, default, Neumann boundary conditions \(\frac{{\text d}}{{\text d} x}\phi(x) = 0\) or periodic boundary conditions.
contacts{ schottky{} }¶
This keyword applies Dirichlet boundary conditions to the Fermi levels \(E_{F,e}(x)\) and \(E_{F,h}(x)\)
where \(q\) is the elementary charge and \(U\) is an explicitly defined bias, and Dirichlet boundary conditions to the electrostatic potential \(\phi(x)\)
\[\phi(x) = \phi_0,\]
where \(\phi_0\) is determined numerically by requiring that the difference of the conduction band edge \(E_c^{\Gamma}(x)\) and the Fermi level \(E_F\) is equal to the value of given Schottky barrier \(B\),
\[E_c^{\Gamma}(x) - E_F = B,\]
or by requiring that the difference of the vacuum level \(E_{vac}\) and the Fermi level \(E_F\) is equal to the value of given work function \(W\),
\[E_{vac} - E_F = W.\]
- name
A name of the contact for referencing it in structure{ region{ contact{} } }
- type:
string
- bias
Explicitly defined bias \(U\)
- type:
real vector
- steps (optional)
Number of biases between consecutive bias points
- type:
integer
- barrier (conditional)
A Schottky barrier \(B\) - a difference between conduction band minimum and the Fermi level
- type:
real number
- work_function (conditional)
Work function \(W\) - a difference between vacuum level and the Fermi level
- type:
real number
Tip
You can check the section about Band Offsets to estimate the energy of vacuum level in respect to band extrema of materials in your simulation.
Tip
This keyword can be successfully used to model the effect of Fermi level pinning due to surface states.
Caution
(conditional) – One of attributes barrier or work_function is required to be specified to define boundary conditions for Fermi levels.
contacts{ charge_neutral{} }¶
This keyword applies Dirichlet boundary conditions to the electrostatic potential \(\phi(x)\)
where \(\phi_0\) determined numerically by requiring local charge neutrality for each grid point of the contact, and Dirichlet boundary conditions to the Fermi levels \(E_{F,e}(x)\) and \(E_{F,h}(x)\)
where \(q\) is the elementary charge and \(U\) is an explicitly defined bias.
- name
A name of the contact for referencing it in structure{ region{ contact{} } }
- type:
string
- bias
Explicitly defined bias \(U\)
- type:
real vector
- steps (optional)
Number of biases between consecutive bias points
- type:
integer
Tip
You may find this keyword useful to calculate the energy levels in a quantum well (QW) or quantum cascade laser (QCL) as a function of applied bias.
contacts{ ohmic{} }¶
This keyword applies Dirichlet boundary conditions to the electrostatic potential \(\phi(x)\)
where \(\phi_0\) is determined numerically by requiring local charge neutrality for each grid point of the contact if the shift parameter \(\Delta U = 0\), and Dirichlet boundary conditions to the Fermi levels \(E_{F,e}(x)\) and \(E_{F,h}(x)\)
where \(q\) is the elementary charge and \(U\) is an explicitly defined bias. If \(\Delta U \ne 0\) then, after the procedure described above, band edges are moved by the value \(-q\Delta U\) and \(\phi_0\) is recalculated.
- name
A name of the contact for referencing it in structure{ region{ contact{} } }
- type:
string
- bias
Explicitly defined bias \(U\)
- type:
real vector
- steps (optional)
Number of biases between consecutive bias points
- type:
integer
- shift (optional)
Shift potential of the bands \(\Delta U\)
- type:
real
Tip
You may find this keyword useful to calculate the energy levels in a quantum well (QW) or quantum cascade laser (QCL) as a function of applied bias.
contacts{ zero_field{} }¶
This keyword applies Neumann boundary conditions to the electrostatic potential \(\phi(x)\)
and Dirichlet boundary conditions to the Fermi levels \(E_{F,e}(x)\) and \(E_{F,h}(x)\)
where \(q\) is the elementary charge and \(U\) is an explicitly defined bias.
- name
A name of the contact for referencing it in structure{ region{ contact{} } }
- type:
string
- bias
Explicitly defined bias \(U\)
- type:
real vector
- steps (optional)
Number of biases between consecutive bias points
- type:
integer
Caution
Use of this group is typically not recommended. Quantum regions extending into zero field contacts will cause carrier densities higher than those in metals and Fermi levels in the range of keV. The cause of this is a nonphysical way in which zero field contacts are calculated, by enforcing a Neumann zero-field condition at the contact.
contacts{ fermi{} }¶
This keyword applies only Dirichlet boundary conditions to the Fermi levels \(E_{F,e}(x)\) and \(E_{F,h}(x)\)
where \(q\) is the elementary charge and \(U\) is an explicitly defined bias. No boundary conditions are specified for the electrostatic potential \(\phi(x)\).
- name
A name of the contact for referencing it in structure{ region{ contact{} } }
- type:
string
- bias
Explicitly defined bias \(U\)
- type:
real vector
- steps (optional)
Number of biases between consecutive bias points
- type:
integer
Caution
When triggered, both Poisson and Schrödinger equations are solved in the regions with these boundary conditions.
contacts{ fermi_electron{} }¶
This keyword applies only Dirichlet boundary conditions to the quasi-Fermi level for electrons \(E_{F,e}(x)\)
where \(q\) is the elementary charge and \(U\) is an explicitly defined bias. No boundary conditions are specified for the electrostatic potential \(\phi(x)\) and for quasi-Fermi level for holes \(E_{F,h}(x)\)
- name
A name of the contact for referencing it in structure{ region{ contact{} } }
- type:
string
- bias
Explicitly defined bias \(U\)
- type:
real vector
- steps (optional)
Number of biases between consecutive bias points
- type:
integer
Caution
As quasi-Fermi level for holes \(E_{F,h}(x)\) is not defined within this group, other contacts are necessary to do so.
Caution
When triggered, both Poisson and Schrödinger equations are solved in the regions with these boundary conditions.
contacts{ fermi_hole{} }¶
This keyword applies only Dirichlet boundary conditions to the quasi-Fermi level for holes \(E_{F,h}(x)\)
where \(q\) is the elementary charge and \(U\) is an explicitly defined bias. No boundary conditions are specified for the electrostatic potential \(\phi(x)\) and for quasi-Fermi level for electrons \(E_{F,e}(x)\)
- name
A name of the contact for referencing it in structure{ region{ contact{} } }
- type:
string
- bias
Explicitly defined bias \(U\)
- type:
real vector
- steps (optional)
Number of biases between consecutive bias points
- type:
integer
Caution
As quasi-Fermi level for electrons \(E_{F,e}(x)\) is not defined within this group, other contacts are necessary to do so.
Caution
When triggered, both Poisson and Schrödinger equations are solved in the regions with these boundary conditions.
Summary and Additional Remarks¶
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.
Attention
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.
Examples¶
Note
This section will be moved and converted into set of tutorials.
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.
schottky{
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.
charge_neutral{
name = "charge_neutral"
bias = 0.0 # [V]
}
Contact no. 3: Specify ohmic contacts.
ohmic{
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.)
zero_field{
name = "source" # name of contact
bias = 0.0 # [V]
}
contact no. 5: Specify Fermi levels.
fermi{
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.
fermi_electron{
name = "fermi_el"
bias = 0.7 # [V]
}
contact no. 7 Specify Fermi level for holes.
fermi_hole{
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.