ComplexBandstructure¶
- class ComplexBandstructure(configuration, energies=None, k_point=None, energy_zero_parameter=None)¶
Analysis class for calculating the complex bandstructure for a bulk configuration.
- Parameters:
configuration (
BulkConfiguration
) – The bulk configuration with an attached calculator for which to calculate the complex bandstructure.energies (
PhysicalQuantity
of type energy) – The energies for which to calculate the complex bandstructure. Note:energies
are relative toenergy_zero_parameter
. Default:numpy.linspace(-2, 2, 101) * eV
k_point (tuple of floats) – The 2-dimensional fractional k-point (in the kA-kB plane) for which to calculate the complex bandstructure. The k-point is given as a tuple of length 2. Default:
(0, 0)
energy_zero_parameter (
FermiLevel
|AbsoluteEnergy
) – The choice for the energy zero. Note: This also affects theenergies
parameter. Default:FermiLevel
- energies()¶
- Returns:
The energies for which the complex bandstructure is calculated.
- Return type:
PhysicalQuantity
of type energy
- energyZero()¶
- Returns:
The energy zero.
- Return type:
PhysicalQuantity
of type energy
- evaluate(spin=None)¶
Method for obtaining the complex bandstructure for a specific spin. The complex bandstructure has two components, propagating modes and decaying modes. Both types of modes can be characterized by a value k. For propagating modes k is real, giving the Bloch phase factor in the reciprocal C-direction, whereas decaying modes have a complex value of k.
- Parameters:
spin (
Spin.Up
|Spin.Down
|Spin.All
) – The spin to calculate for. Default:Spin.All
- Returns:
A tuple with two lists, the first corresponding to the propagating modes and the second corresponding to the decaying modes. The lists are ordered according to energy and each entry is a
PhysicalQuantity
with a (1/Angstrom) unit. The lists have different lengths (and can have zero length) corresponding to the number of modes at this energy.- Return type:
tuple of lists
- 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.
- Return type:
PhysicalQuantity
of type temperature
- kPoint()¶
- Returns:
The 2-dimensional fractional k-koint for which the complex bandstructure is calculated.
- Return type:
tuple of floats
- layerSeparation()¶
- Returns:
The distance between layers of the crystal in the transport direction. The transport direction is perpendicular to the AB-plane. This value is called ‘L’ in the GUI.
- Return type:
PhysicalQuantity
of type length
- 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()
- repetition()¶
Deprecated
- 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.
- spins()¶
- Returns:
The available spin components.
- Return type:
tuple of
Spin.Up
|Spin.Down
|Spin.All
- uniqueString()¶
Return a unique string representing the state of the object.
Usage Examples¶
Calculate the complex bandstructure of silicon in the (100) direction, using a fast semi-empirical method, and save it to a file:
# Set up a Si (100) minimal configuration
vector_a = [3.84001408591, 0.0, 0.0]*Angstrom
vector_b = [0.0, 3.84001408591, 0.0]*Angstrom
vector_c = [1.92000704296, 1.92000704296, 2.7153]*Angstrom
lattice = UnitCell(vector_a, vector_b, vector_c)
elements = [Silicon, Silicon]
fractional_coordinates = [[ 2.50000000e-01, 7.50000000e-01, 5.00000000e-01],
[ 3.33066907e-16, 2.22044605e-16, 1.00000000e+00]]
bulk_configuration = BulkConfiguration(
bravais_lattice=lattice,
elements=elements,
fractional_coordinates=fractional_coordinates
)
# Define calculator - fast Slater-Koster method
calculator = SlaterKosterCalculator(
basis_set=Vogl.Si_Basis,
numerical_accuracy_parameters=NumericalAccuracyParameters(
k_point_sampling=(4, 4, 2))
)
bulk_configuration.setCalculator(calculator)
# Calculate, save, and print the complex band structure
complex_bandstructure = ComplexBandstructure(
configuration=bulk_configuration,
energies=numpy.linspace(-2,5,501)*eV,
k_point=(0,0),
)
nlsave('si_100_cbs.hdf5', complex_bandstructure)
nlprint(complex_bandstructure)
Notes¶
The ComplexBandstructure is calculated for a specified energy, \(E\), and k-point, \(k_A, k_B\), in the plane spanned by the reciprocal A and B vectors. These are provided as input parameters for the calculation. The solutions are the eigenstates, \(\psi_{n {\bf k}}\), of the Schrödinger equation
\[H \psi_{n {\bf k}} = E \psi_{n {\bf k}}\]with no boundary conditions imposed in the direction perpendicular to the plane spanned by the unit cell vectors \({\bf A}\) and \({\bf B}\). We may write these eigenstates as
\[\psi_{n {\bf k}}({\bf r}) = u_{\bf k}({\bf r}) e^{-i {\bf k}_{AB} {\bf r}_{AB}} e^{-i k_C r_C},\]where \(u_{\bf k}\) is a periodic function and \(k_C\), in general, is a complex number. The solutions with a purely real \(k_C\) are the usual Bloch states and we thus obtain the normal band structure. The solutions with a complex \(k_C\) form the complex band structure.
The solutions, \(k_C\), can be obtained after the calculation by using the method
evaluate()
. To print the data, use the method nlprint. In the figure above, which is obtained by plotting the complex band structure in QuantumATK, the k-values for the real band structure are normalized by \(L\) , the layer separation perpendicular to the AB-plane. The value of \(L\) can be extracted by using the methodlayerSeparation()
.The ComplexBandstructure (and the real bands) is computed along the reciprocal C vector, which is perpendicular to the \({\bf A}\) and \({\bf B}\) unit cell vectors. Thus, if the ComplexBandstructure is desired in a particular direction, like (100) as in the example above, the unit cell should be set up such that this direction is perpendicular to the AB-plane. This is most easily achieved by using the Surface tool in the Builder in QuantumATK and choosing a “Periodic (bulk-like)” type of cell with a minimal number of layers.
The implementation of the computation of the complex band structure in QuantumATK follows the method described in Ref. [1].