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 ( - PhysicalQuantityof type energy) – The energies for which to calculate the complex bandstructure. Note:- energiesare relative to- energy_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 the- energiesparameter. Default:- FermiLevel
 
 - energies()¶
- Returns:
- The energies for which the complex bandstructure is calculated. 
- Return type:
- PhysicalQuantityof type energy
 
 - energyZero()¶
- Returns:
- The energy zero. 
- Return type:
- PhysicalQuantityof 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 - PhysicalQuantitywith 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 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:
- PhysicalQuantityof type energy
 
 - fermiTemperature()¶
- Returns:
- The Fermi temperature. 
- Return type:
- PhysicalQuantityof 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:
- PhysicalQuantityof 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)
 
Fig. 147 Complex bandstructure for silicon along the (100) direction. The right-hand side of the plots illustrates the real bands while the left-hand side of the plot shows the imaginary part of \(k_C\) for the complex bands.¶
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 method- layerSeparation().
- 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].