EffectiveBandstructure

class EffectiveBandstructure(configuration, primitive_configuration, route=None, points_per_segment=None, kpoints=None, energies=None, bands_above_fermi_level=None, projections=None, symmetrize=None, primitive_cell_matching_tolerance=None, processes_per_kpoint=None)

Analysis class for calculating the effective band structure of a bulk supercell configuration.

Parameters:
  • configuration (BulkConfiguration) – The configuration of the supercell with attached calculator for which to calculate the effective band structure.

  • primitive_configuration (BulkConfiguration) – The primitive cell configuration of the underlying crystal for which the band structure should be calculated for.

  • route (list of str) – The route to take through the Brillouin zone of the primitive cell as a list of symmetry points identifiers, e.g. ['G', 'X', 'G']. This option is mutually exclusive to kpoints.
    Default: Unit cell dependent route.

  • points_per_segment (int) – The number of points per segment of the route.
    Default: 20.

  • kpoints (list) – A list of fractional coordinates of 3-dimensional k-points at which to calculate the effective band structure, e.g. [[0.0, 0.0, 0.0], [0.0, 0.0, 0.1], ...]. The shape should be (K, 3) where K is the number of k-points. This option is mutually exclusive to route, and points_per_segment.
    Default: Unit cell dependent route.

  • energies (PhysicalQuantity) – The energies where the spectral function should be be evaluated.
    Default: A list of 501 regularly spaced energies from -10 eV to 10 eV.

  • bands_above_fermi_level (int | All) – The number of bands above the Fermi level (of the supercell configuration) to include in the effective band structure. If All the number of bands will be taken as that used in the ground state calculation.
    Default: All

  • projections (list of Projection | Projection | ProjectionGenerator | NoProjection) – The projections used for calculating the weights.
    Default: NoProjection.

  • symmetrize (bool) – Whether to calculate the symmetrized effective band structure. If True the effective band structure will be calculated for all symmetry equivalent k-points and the end result will be averaged. The symmetries used are those of the primitive configuration. If False the effective band structure will not be symmetrized and it may thus depend on the specific k-point path chosen.
    Default: False

  • primitive_cell_matching_tolerance (float) – Tolerance for the transformation matrix between the primitive configuration and the supercell configuration.
    Default: 1e-3

  • processes_per_kpoint (int) – The number of processes to use per k-point. If None the same number of processes per k-point as used for the ground state calculation will be used.
    Default: None

allBandEnergies(spin=None)
Parameters:

spin (Spin.All | Spin.Up | Spin.Down) – The spin the bandstructure should be returned for.
Default: Spin.All

Returns:

The band energies of the (super cell) configuration for a given spin. The shape is (K, B) where K is the number of k-points and B is the number of bands.

Return type:

PhysicalQuantity of type energy

energies()
Returns:

The energies at which the effective bandstructure is calculated.

Return type:

PhysicalQuantity of type energy

energyZero()

The energy zero. It is set to the spin-averaged FermiLevel.

Returns:

The energy zero.

Return type:

PhysicalQuantity of type energy

evaluate(spin=None)
Parameters:

spin (Spin.All | Spin.Up | Spin.Down) – The spin the effective bandstructure should be returned for.
Default: Spin.All

Returns:

The effective bandstructure as a band density for a given spin. The shape is (K, E) or (S, K, E) where S is the number of spins, K is the number of k-points, and E is the number of energies.

Return type:

numpy.array

fermiLevel(spin=None)
Parameters:

spin (Spin.Up | Spin.Down | Spin.All) – The spin the Fermi level should be returned for. Must be either Spin.Up, Spin.Down, or Spin.All. Only when the band structure is calculated with a fixed spin moment will the Fermi level depend on spin.
Default: Spin.All

Returns:

The Fermi level in absolute energy.

Return type:

PhysicalQuantity of type energy

fermiTemperature()
Returns:

The Fermi temperature used in the calculation of the effective bandstructure.

Return type:

PhysicalQuantity of type temperature

kpoints()
Returns:

The list of 3-dimensional fractional k-points at which the energies of the bands are calculated. The shape is (K, 3) where K is the number of k-points.

Return type:

list of lists of floats

metatext()
Returns:

The metatext of the object or None if no metatext is present.

Return type:

str | None

nlprint(stream=None)

Print a string containing an ASCII table useful for plotting the AnalysisSpin object.

Parameters:

stream (python stream) – The stream the table should be written to.
Default: NLPrintLogger()

primitiveConfiguration()
Returns:

The primitive configuration which defines the band path.

Return type:

BulkConfiguration

projectedEffectiveBandstructures(spin=None)
Parameters:

spin (Spin.All | Spin.Up | Spin.Down | Spin.Sum) – The spin the effective bandstructure should be returned for.
Default: Spin.All

Returns:

The effective bandstructure as a band density for a given spin for each projection. The shape is (P, K, E) or (P, S, K, E) where P is the number of projections, S is the number of spins, K is the number of k-points, and E is the number of energies.

Return type:

numpy.array

projections()
Returns:

The projections.

Return type:

list of Projection

route()
Returns:

The route through the Brillouin-zone as a list of symmetry points of the unit cell.

Return type:

list of str

setMetatext(metatext)

Set a given metatext string on the object.

Parameters:

metatext (str | None) – The metatext string that should be set. A value of “None” can be given to remove the current metatext.

superCellConfiguration()
Returns:

The (super cell) configuration for which the effective bandstructure is calculated.

Return type:

BulkConfiguration

uniqueString()

Return a unique string representing the state of the object.

Usage Examples

Calculate the effective bandstructure of an InGaAs alloy.

from AddOns.AlloyPlugins.SubstitutionalAlloy.SubstitutionalAlloyWidget import substitutionalAlloy

# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------

#----------------------------------------
# Basis Set
#----------------------------------------

basis_set = [
    LDABasis.Gallium_SingleZetaPolarized,
    LDABasis.Arsenic_SingleZetaPolarized,
    LDABasis.Indium_SingleZetaPolarized,
    ]

#----------------------------------------
# Exchange-Correlation
#----------------------------------------

exchange_correlation = MGGA.TB09LDA(c=1.01)

numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=(3, 3, 3),
    )

calculator = LCAOCalculator(
    basis_set=basis_set,
    exchange_correlation=exchange_correlation,
    numerical_accuracy_parameters=numerical_accuracy_parameters,
    )

# Set up lattice with exp. lattice const. of In0.53Ga0.47As
lattice = FaceCenteredCubic(5.8687*Angstrom)

# Define elements
elements = [Indium, Arsenic]

# Define coordinates
fractional_coordinates = [[ 0.  ,  0.  ,  0.  ],
                          [ 0.25,  0.25,  0.25]]

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

# Attach calculator to primitive bulk configuration
primitive_configuration.setCalculator(calculator)

# Repeat InAs
super_inas = primitive_configuration.repeat(3,3,3)

# List of indices corresponding to Indium atoms
indium_indices = []
symbols = super_inas.symbols()

for index,atom in enumerate(symbols):
    if atom=='In':
        indium_indices.append(index)

# Call the substitutional alloy generator.
super_ingaas = substitutionalAlloy(super_inas, indium_indices, 'fixed_fraction', 47, Gallium)

# Set calculator and update.
super_ingaas.setCalculator(calculator)
super_ingaas.update()
nlsave('InGaAs_3x3x3.nc', super_ingaas)

# -------------------------------------------------------------
# EffectiveBandstructure
# -------------------------------------------------------------
effective_bandstructure = EffectiveBandstructure(
    super_ingaas,
    primitive_configuration,
    energies = numpy.linspace(-2,2.75,501)*eV,
    route=['L','G','X'],
    points_per_segment=101,
    )
nlsave('InGaAs_3x3x3.nc', effective_bandstructure)

Notes

The implementation of effective band structure in QuantumATK follows the works by Popescu and Zunger [1], [2] and Haverkort et al. [3]. From the bandstructure of a super cell containing many bands one can “unfold” the bandstructure to only contain the bands corresponding to the primitive cell. In the unfolding procedure, one calculates a spectral weight as \(|\langle e^{i\mathbf{k}\cdot\mathbf{r}}|\psi_{j,\mathbf{K}}\rangle|\) , with \(|\psi_{j,\mathbf{K}}\rangle\) being an eigenstate of the super cell at k-point \(K\) . If the super cell is simply a copy of a simple unit cell (e.g. a super cell of InAs) the spectral weights will either be 0 or 1, and the band unfolding can be done explicitly. However, in the case of a disordered alloy as e.g. In0.53Ga0.47As the band weights can be anywhere in the interval [0;1].

It is currently a requirement that the ‘configuration’ can be divided into an integer number of smaller unit cells with the size given by the ‘primitive_configuraiton’. Each of these smaller cells must have the same number of basis functions. It is currently thus not possible to e.g. replace some In atoms with Hydrogen atoms, both being described with e.g. a DoubleZetaPolarized basis set, since these will have a different number of basis functions. It is, however, possible to replace an Indium atom with a Gallium since they will have the same number of basis functions.

When calculating the effective band structure of a random alloy one should perform a sample average by calculating the effective bandstructure for many different configurations and averaging the results. This procedure is described in the tutorial Effective band structure of random alloy InGaAs.