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 tokpoints
. 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 toroute
, andpoints_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. IfAll
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. IfFalse
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 eitherSpin.Up
,Spin.Down
, orSpin.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:
- 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:
- 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.