sisl.physics.Bloch
- class sisl.physics.Bloch
Bases:
objectBloch’s theorem object containing unfolding factors and unfolding algorithms
This class is a wrapper for expanding any matrix from a smaller matrix cell into a larger, using Bloch’s theorem. The general idea may be summarized in the following equation:
\[\begin{split}\mathbf M_{K}^N =\frac1N \; \sum_{ \substack{j=0\\ k_j=\frac{K+j}N } }^{N-1} \quad \begin{bmatrix} 1 & \cdots & e^{i (1-N)k_j} \\ e^{i k_j} & \cdots & e^{i (2-N)k_j} \\ \vdots & \ddots & \vdots \\ e^{i (N-1)k_j} & \cdots & 1 \end{bmatrix} \otimes \mathbf M_{k_j}^1.\end{split}\]Notes
When doing a Brillouin-zone average of Bloch-expansions (e.g. self-energies) one can get better performance by using
finalize=Falseand then call a subsequentbloch.unfold_finalize(M).- Parameters:
bloch (
(3,) int) – Bloch repetitions along each directionfinalize – whether the unfold routine also copies out the Toeplitz matrix. If false, the user should call
bloch.unfold_finalize(M)on the returned matrix to ensure it is complete, see examples.
Examples
Auto-use finalize of the Toeplitz matrix.
>>> bloch = Bloch([2, 1, 2]) >>> k_unfold = bloch.unfold_points([0] * 3) >>> M = [func(*args, k=k) for k in k_unfold] >>> M = bloch.unfold(M, k_unfold)
Manual finalization of the Toeplitz matrix.
>>> bloch = Bloch([2, 1, 2], finalize=False) >>> k_unfold = bloch.unfold_points([0] * 3) >>> M = [func(*args, k=k) for k in k_unfold] >>> M = bloch.unfold(M, k_unfold) >>> if not bloch.finalize: ... bloch.unfold_finalize(M)
Methods
unfold(M, k_unfold)Unfold the matrix list of matrices M into a corresponding k-point (unfolding k-points are k_unfold)
Copy out the Toeplitz matrix from the sub-calculated elements.
Return a list of k-points to be evaluated for this objects unfolding
Attributes
Number of Bloch expansions along each lattice vector
- __call__(func, k, *args, **kwargs)[source]
Return a functions return values as the Bloch unfolded equivalent according to this object
Calling the
Blochobject is a shorthand for the manual use of theBloch.unfold_pointsandBloch.unfoldmethods.This call structure is a shorthand for:
>>> bloch = Bloch([2, 1, 2]) >>> k_unfold = bloch.unfold_points([0] * 3) >>> M = [func(*args, k=k) for k in k_unfold] >>> bloch.unfold(M, k_unfold)
Notes
The function passed must have a keyword argument
k.- Parameters:
- Returns:
unfolded Bloch matrix
- Return type:
- unfold(M, k_unfold)[source]
Unfold the matrix list of matrices M into a corresponding k-point (unfolding k-points are k_unfold)
- Parameters:
M (
(:,:,:)) – an*-N-M matrix used for unfoldingk_unfold (Sequence[Sequence[float]]) – unfolding k-points as returned by
Bloch.unfold_points
- Returns:
unfolded matrix of size
M[0].shape * k_unfold.shape[0] ** 2- Return type:
- unfold_finalize(M)[source]
Copy out the Toeplitz matrix from the sub-calculated elements.
This is necessary to be called if the
Blochobject has been initialized withBloch(..., finalize=False). Otherwise it should not be used.- Parameters:
M – the full matrix, where only the Toeplitz elements are filled.
- Return type:
the full matrix with copied out elements.
- unfold_points(k)[source]
Return a list of k-points to be evaluated for this objects unfolding
The k-point k is with respect to the unfolded geometry. The return list of k points are the k-points required to be sampled in the folded geometry.
- property bloch
Number of Bloch expansions along each lattice vector