6. Disorder
KITE's disorder implementation — general-purpose and user-friendly — is one of its main features. The inclusion of disorder in a given system follows a simple recipe: the user specifies one or more disorder patterns in the Python interface together with the desired disorder statistics. This information is passed on to KITEx and used to automatically perform the required modifications of on-site energies and hopping terms across the whole lattice on-the-fly.
Info
Disorder patterns are local modifications of the Hamiltonian that can be constricted to one unit cell or can connect neighboring unit cells.
KITE handles both standard uncorrelated disorder (e.g., random on-site energies) and realistic short-range disorder (e.g., vacancies or impurity scattering centers distributed randomly over the lattice sites with a specified concentration). KITE can handle multiple disorder patterns simultaneously.
Disorder implementation: After defining a regular lattice, disorder can be added to the system. KITE allows the user to select between on-site and structural disorder by choosing between predefined classes in the python interface. The interface provides two different classes of disorder:
kite.Disorder
- onsite disorder with two possible statistical distributionskite.StructuralDisorder
- multi-orbital impurities and defects (including bond disorder) with a given concentration
Onsite disorder¶
kite.Disorder
adds randomly generated on-site terms at the sites of a desired sublattice drawn from one of the two statistical distributions:
- Gaussian
- Uniform
One can select a sublattice type in which the disorder will appear, the mean
value and the standard deviation of the selected distribution.
To include on-site disorder, one builds the pb.lattice
and
use the following procedure:
# define an object based on the lattice
disorder = kite.Disorder(lattice)
# add Gaussian distributed disorder at all sites of a selected sublattice
disorder.add_disorder('A', 'Gaussian', mean, std)
In a single object it is possible to select multiple sublattices, each with its own disorder distribution
following the rule kite.Disorder.add_disorder('sublattice', 'type', mean, std)
. For example,
The final step consists of adding the disorder as an additional parameter into the
kite.config_system
function:
A complete example that calculates the average density of states of graphene with different on-site disorder distributions on each sublattice is given below:
Structural disorder¶
kite.StructuralDisorder
class adds the possibility of selecting between two different
short-range disorder types, i.e. vacancy defects, randomly distributed with a certain concentration over lattice sites on a selected sublattice,
and a more generic multi-orbital disorder which may combine of on-site and hopping terms
(also distributed with a certain concentration).
Example 1: Vacancy defects¶
To add vacancy defects with a given
concentration
on a single sublattice one uses the simple instruction:
struc_disorder = kite.StructuralDisorder(lattice, concentration=0.2)
struc_disorder.add_vacancy('B') # add a vacancy to a selected sublattice
Note
To distribute the vacancies on both sublattices (compensated or otherwise), one needs to treat each sublattice as a separate
object of the class kite.StructuralDisorder
Example 2: mixed on-site/bond disorder¶
The following example illustrates KITE's most general type of short-range disorder, which includes both atomic defects (vacancies)
and bond modifications.
This type of disorder can be added as an object of the class kite.StructuralDisorder
.
The procedure is analogous to adding a hopping term to the
Pybinding lattice object.
For the sake of clarity, let us first define sublattices that will compose the disorder. In this case we are not restricted to a single unit cell:
# define a node in a unit cell [i, j] selecting a single sublattice
node0 = [[+0, +0], 'A']
node1 = [[+0, +0], 'B']
node2 = [[+1, +0], 'A']
node3 = [[+0, +1], 'B']
node4 = [[+0, +1], 'A']
node5 = [[-1, +1], 'B']
After the definition of a parent kite.StructuralDisorder
object, we can define the desired pattern:
# define an object based on the lattice with a certain concentration
struc_disorder = kite.StructuralDisorder(lattice, concentration=0.2)
struc_disorder.add_structural_disorder(
# add bond disorder in the form
# [from unit cell], 'sublattice_from', [to_unit_cell], 'sublattice_to', value:
(*node0, *node1, 0.5),
(*node1, *node2, 0.1),
(*node2, *node3, 0.5),
(*node3, *node4, 0.3),
(*node4, *node5, 0.4),
(*node5, *node0, 0.8),
# in this way we can add onsite disorder in the form [unit cell], 'sublattice', value
([+0, +0], 'B', 0.1)
)
# It is possible to add multiple different disorder types which
# should be forwarded to the config_system function as a list.
another_struc_disorder = kite.StructuralDisorder(lattice, concentration=0.6)
another_struc_disorder.add_structural_disorder(
(*node0, *node1, 0.05),
(*node4, *node5, 0.4),
(*node5, *node0, 0.02),
([+0, +0], 'A', 0.3)
)
Before exporting the settings to the HDF5-file, it is possible to define multiple disorder realizations which will be superimposed to the clean system.
The following script has a minimal example of how to configure the structural disorder
with the resulting density of states: