# EffectiveBandstructure¶

class EffectiveBandstructure(configuration, primitive_configuration, route=None, points_per_segment=None, kpoints=None, energies=None, bands_above_fermi_level=None, symmetrize=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 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: True 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 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. PhysicalQuantity of type energy
energies()
Returns: The energies at which the effective bandstructure is calculated. PhysicalQuantity of type energy
energyZero()

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

Returns: The energy zero. 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 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. 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 The Fermi level in absolute energy. PhysicalQuantity of type energy
fermiTemperature()
Returns: The Fermi temperature used in the calculation of the effective bandstructure. 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. list of lists of floats
metatext()
Returns: The metatext of the object or None if no metatext is present. str | unicode | 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. BulkConfiguration
route()
Returns: The route through the Brillouin-zone as a list of symmetry points of the unit cell. list of str
setMetatext(metatext)

Set a given metatext string on the object.

Parameters: metatext (str | unicode | 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. BulkConfiguration

## 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 [PZ10], [PZ12] and Haverkort et al. [HES11]. 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.

 [HES11] M. W. Haverkort, I. S. Elfimov, and G. A. Sawatzky. Electronic structure and self energies of randomly substituted solids using density functional theory and model calculations. arXiv, pages 1109.4036, 2011. URL: http://arxiv.org/abs/1109.4036.
 [PZ10] V. Popescu and A. Zunger. Effective band structure of random alloys. Phys. Rev. Lett., 104:236403, Jun 2010. doi:10.1103/PhysRevLett.104.236403.
 [PZ12] V. Popescu and A. Zunger. Extracting e versus p k effective band structure from supercell calculations on alloys and impurities. Phys. Rev. B, 85:085201, Feb 2012. doi:10.1103/PhysRevB.85.085201.