Name

Bandstructure — Class for calculating the bandstructure for a BulkConfiguration.

Synopsis

Namespace: NanoLanguage
Bandstructure(
configuration,
route,
points_per_segment,
kpoints,
bands_above_fermi_level,
projection_list
)

Description

Constructor for the bandstructure object.

Bandstructure Arguments

configuration

The BulkConfiguration for which the bandstructure should be calculated.

Type: A BulkConfiguration.

Default: None
route

The route to take through the Brillouin-zone.

Type: List of symmetry points of the unit cell, e.g. ['G','X','G'].

Default: None
points_per_segment

The number of points per segment of the route.

Type: A positive integer.

Default: 20.
kpoints

A list of kpoints in which the bandstructrure should be calculated. This options is mutually exclusive to route, and points_per_segment.

Type: A list of 3 dimensional fractional k-points, e.g. [[0.0,0.0,0.0],[0.0,0.0,0.1],...]

Default: None
bands_above_fermi_level

The number of bands above the Fermi level.

Type: A positive integer.

Default: None
projection_list

A projection list object defining a projection.

Type: A PprojectionList object.

Default: If no projection list is specified all orbitals will be used.

Bandstructure Methods

A Bandstructure object provides the following methods:

  • energyZero(): Return the energy zero

  • evaluate(spin): Return the bandstructure for a given spin

    spin

    The spin the bandstructure should be returned for. Must be either Spin.Up(default) or Spin.Down, or, for NONCOLLINEAR calculations Spin.All.

    Type: Spin.Up | Spin.Down | Spin.All

    Default: Spin.Up for POLARISED or UNPOLARIZED calculations, Spin.All for NONCOLLINEAR.
  • fermiLevel(): Return the Fermi level in absolute energy

  • fermiTemperature(): Return the Fermi_temperatures used in this bandstructure

  • kpoints(): Return the k-points used in this calculation

  • nlprint(stream): Print a string containing an ASCII table useful for plotting the bandstructure.

    stream

    The stream the bandstructure should be written to.

    Type: A stream that supports strings being written to using 'write'.

    Default: sys.stdout
  • route(): Return the route used in this calculation

Usage Examples

Calculate the bandstructure of silicon and save it to a file

# Setup a BulkConfiguration
bulk_configuration = BulkConfiguration(
    bravais_lattice=FaceCenteredCubic(5.4306*Angstrom),
    elements=[Silicon, Silicon],
    cartesian_coordinates=[[ 0.     ,  0.     ,  0.     ],
      [ 1.35765,  1.35765,  1.35765]]*Angstrom)

# Define a calculator
calculator = HuckelCalculator(
    basis_set = [CerdaHuckelParameters.Silicon_GW_diamond_Basis])
bulk_configuration.setCalculator(calculator)

# Calculate the bandstructure
bandstructure = Bandstructure(
    configuration=bulk_configuration,
    route=['G', 'X'],
    points_per_segment=40,
    bands_above_fermi_level=4
    )

# Determine indirect band gap
energies = bandstructure.evaluate()
e_valence_max = energies[0][3]
e_conduction_min = energies[0][4]
i_valence_max=0
i_conduction_min=0

# Locate extrema 
for i in range(energies.shape[0]):
    #find maximum of valence band
    if (energies[i][3] > e_valence_max):
        e_valence_max=energies[i][3]
        i_valence_max=i
    #find minimum of conduction band
    if (energies[i][4] < e_conduction_min):
        e_conduction_min=energies[i][4]
        i_conduction_min=i

# Print out results    
print 'Valence band maximum (eV) ',e_valence_max, 'at ', 
print bandstructure.kpoints()[i_valence_max]
print 'Conduction band minimum (eV)',e_conduction_min, 'at ', 
print bandstructure.kpoints()[i_conduction_min]
print 'Band gap = %7.4f eV ' % (e_conduction_min-e_valence_max)

si_band.py

Note that the k-points are giving in units of reciprocal vectors, and in these units  X = \frac{1}{2}{\bf b}_A + \frac{1}{2}{\bf b}_c .

Notes

  • To export the data of a bandstructure, use the method nlprint.

  • Symmetry points of the Brillouin zones can be found here BravaisLattice