BandDiagramExtraction

class BandDiagramExtraction(configuration, layer_indices=[])

Perform first principle calculations for a multilayer system and corresponding single layer systems. Properties including effective potential, chemical potential, fat bandstructure and projected density of states will be calculated by first principle calculation. Band diagrams, work functions will be extracted.

Parameters:
  • configuration (BulkConfiguration) – The configuration object.
  • layer_indices (list of integer list) – list of indices of single layers.
    Default:: None
evaluate(layer_index, property_name, method='singlelayer')

Extract averaged band diagram properties from first principle calculations. The band diagram properties can be Extracted either from the single layer calculations or from the multilayer calculations. When calculating the averaged band diagram, the atoms near the interfaces/surfaces will be avoided.

Parameters:
  • layer_index (int) – Index of the layer.
  • property_name (string) – Name of the property. Can be ‘vacuum’,’work_function’,’chemical_potential’, ‘pdos_conduction_band’,’pdos_valence_bandedge’,’pdos_band_gap’,’fatband_conduction_band’, ‘fatband_valence_bandedge’,’fatband_band_gap’.
  • method (string) – Method of calculating the property. Can be ‘singlelayer’ or ‘multilayer’.
    Default:: ‘singlelayer’

Usage Example

Use the BandDiagramExtraction object to extract band diagram from a silver-magnesium oxide gate stack:

from SMW import *

# Set up lattice
vector_a = [2.88903, 0.0, 0.0]*Angstrom
vector_b = [0.0, 2.88903, 0.0]*Angstrom
vector_c = [0.0, 0.0, 120.969]*Angstrom
lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
elements = [Silver, Silver, Silver, Silver, Silver, Silver, Silver, Silver,
            Silver, Silver, Silver, Silver, Silver, Silver, Oxygen, Magnesium,
            Magnesium, Oxygen, Oxygen, Magnesium, Magnesium, Oxygen, Oxygen,
            Magnesium, Magnesium, Oxygen, Oxygen, Magnesium, Magnesium, Oxygen,
            Oxygen, Magnesium, Magnesium, Oxygen, Oxygen, Magnesium, Magnesium,
            Oxygen, Oxygen, Magnesium, Magnesium, Oxygen]

# Define coordinates
fractional_coordinates = [[ 0.749999669084,  0.749999669084,  0.266833031603],
                          [ 0.250000330916,  0.250000330916,  0.283720415974],
                          [ 0.749999669084,  0.749999669084,  0.300607800346],
                          [ 0.250000330916,  0.250000330916,  0.317495184717],
                          [ 0.749999669084,  0.749999669084,  0.334382569088],
                          [ 0.250000330916,  0.250000330916,  0.351269953459],
                          [ 0.749999669084,  0.749999669084,  0.36815733783 ],
                          [ 0.250000330916,  0.250000330916,  0.385044722202],
                          [ 0.749999669084,  0.749999669084,  0.401932106573],
                          [ 0.250000330916,  0.250000330916,  0.418819490944],
                          [ 0.749999669084,  0.749999669084,  0.435706875315],
                          [ 0.250000330916,  0.250000330916,  0.452594259686],
                          [ 0.749999669084,  0.749999669084,  0.469481644058],
                          [ 0.250000330916,  0.250000330916,  0.486369028429],
                          [ 0.250000330916,  0.250000330916,  0.503775140739],
                          [ 0.749999669084,  0.749999669084,  0.503775140739],
                          [ 0.250000330916,  0.250000330916,  0.521181253048],
                          [ 0.749999669084,  0.749999669084,  0.521181253048],
                          [ 0.250000330916,  0.250000330916,  0.538587365358],
                          [ 0.749999669084,  0.749999669084,  0.538587365358],
                          [ 0.250000330916,  0.250000330916,  0.555993477668],
                          [ 0.749999669084,  0.749999669084,  0.555993477668],
                          [ 0.250000330916,  0.250000330916,  0.573399589978],
                          [ 0.749999669084,  0.749999669084,  0.573399589978],
                          [ 0.250000330916,  0.250000330916,  0.590805702287],
                          [ 0.749999669084,  0.749999669084,  0.590805702287],
                          [ 0.250000330916,  0.250000330916,  0.608211814597],
                          [ 0.749999669084,  0.749999669084,  0.608211814597],
                          [ 0.250000330916,  0.250000330916,  0.625617926907],
                          [ 0.749999669084,  0.749999669084,  0.625617926907],
                          [ 0.250000330916,  0.250000330916,  0.643024039217],
                          [ 0.749999669084,  0.749999669084,  0.643024039217],
                          [ 0.250000330916,  0.250000330916,  0.660430151526],
                          [ 0.749999669084,  0.749999669084,  0.660430151526],
                          [ 0.250000330916,  0.250000330916,  0.677836263836],
                          [ 0.749999669084,  0.749999669084,  0.677836263836],
                          [ 0.250000330916,  0.250000330916,  0.695242376146],
                          [ 0.749999669084,  0.749999669084,  0.695242376146],
                          [ 0.250000330916,  0.250000330916,  0.712648488456],
                          [ 0.749999669084,  0.749999669084,  0.712648488456],
                          [ 0.250000330916,  0.250000330916,  0.730054600765],
                          [ 0.749999669084,  0.749999669084,  0.730054600765]]

# Set up configuration
bulk_configuration = BulkConfiguration(
    bravais_lattice=lattice,
    elements=elements,
    fractional_coordinates=fractional_coordinates
    )

# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------
k_point_sampling = MonkhorstPackGrid(
    na=9,
    nb=9,
    )
numerical_accuracy_parameters = NumericalAccuracyParameters(
    density_mesh_cutoff=125.0*Hartree,
    k_point_sampling=k_point_sampling,
    )

poisson_solver = MultigridSolver(
    boundary_conditions=[[PeriodicBoundaryCondition(),PeriodicBoundaryCondition()],
                         [PeriodicBoundaryCondition(),PeriodicBoundaryCondition()],
                         [DirichletBoundaryCondition(),NeumannBoundaryCondition()]]
    )

calculator = LCAOCalculator(
    numerical_accuracy_parameters=numerical_accuracy_parameters,
    poisson_solver=poisson_solver,
    )

bulk_configuration.setCalculator(calculator)
bulk_configuration.update()

# ----------------------------------------------------------------------------------------------
# Band Diagram Extraction
# ----------------------------------------------------------------------------------------------
# Define layer infomation, just an example.
layers = [[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13],
          [14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
           36, 37, 38, 39, 40, 41]]

# Initialization, with a max iteration = 20.
band_diagram = BandDiagramExtraction(bulk_configuration,layers)

# Extract band diagram properties.
metal_work_function = band_diagram.evaluate(0, 'work_function')
semiconductor_conduction_band = band_diagram.evaluate(1,'fatband_conduction_band')

nlsave('banddiagram_extract', band_diagram)

print('metal_work_function',metal_work_function)
print('semiconductor_conduction_band',semiconductor_conduction_band)

print(band_diagram._band_diagram)

print(band_diagram._layer_band_diagram)

band_diagram_extraction_example.py

The expected results are

metal work function: {'left_work_function': 4.3521727285593919, 'right_work_function': 4.3595367854728195}

semiconductor conduction bandedge: 7.1642304336 eV.

Notes

The BandDiagramExtraction class is designed to extract band diagram parameters from first principle calculations of multilayer nanoslabs. Here the multilayers nanoslabs must contain vacuum in both sides. The band diagram extraction is done in three major steps.

1. Generate single layer Configurations from the multilayer configuration according to the layer layer indices users provided.

  1. Standard first principle calculation of the multilayer slab and single layer slabs.

3. Extract the band diagram related properties such as vacuum energies, averaged conduction/valence bandedges and band gaps in each layer from either single layer slab calculations or multilayer slab calculation.