pythtb.WFArray.berry_phase#

WFArray.berry_phase(axis_idx, state_idx=None, berry_evals=False, contin=True)[source]#

Berry phase accumulated along a specified mesh axis.

This routine evaluates the geometric phase accumulated by a set of states transported along a closed loop in parameter space. The phase is computed from the Wilson loop unitary matrix. Explicitly,

\[\phi_{\mu} = -\text{Im} \ln \det W_{\mu}\]

where \(W_{\mu}\) (obtained from wilson_loop()) is the ordered product of the unitary (overlap) links along the axis_idx direction \(\mu\) in the mesh.

If berry_evals=True, the function additionally returns the individual multiband phases (“hybrid Wannier centers”) determined from the phases of the eigenvalues of the Wilson loop unitary matrix,

\[\phi_{\mu}^{(n)} = -\text{Im} \ln \lambda_{\mu}^{(n)}\]

When summed modulo \(2\pi\), the \(\phi_{\mu}^{(n)}\) reproduce the total Berry phase.

Parameters:
axis_idxint

Index of the Mesh axis along which the Berry phase is computed. For a one-dimensional Mesh, this must be 0.

Changed in version 2.0.0: Renamed from dir to axis_idx to avoid conflict with built-in Python function dir().

state_idxint or array-like of int, optional

Band index or list of indices specifying which states to include in the Berry phase calculation. If omitted, all bands are included.

Changed in version 2.0.0: Renamed from occ. The band indices are not required to be occupied bands only. The default behavior is to include all bands, and the "all" option has been removed.

continbool, optional

Controls branch-continuity of the returned Berry phases. If True (default), phases are chosen to vary smoothly along the orthogonal mesh directions. The reference phase (first string) is constrained to lie in \([-\pi, \pi]\). Subsequent phases are adjusted by adding or subtracting \(2 \pi\) as needed to ensure continuity with the previous string. If False, all phases are constrained to lie in \([-\pi, \pi]\).

berry_evalsbool, optional

If True, also return the Wilson loop eigen-phases (hybrid Wannier centers). These are branch-fixed following the same rules as above.

Returns:
phasenp.ndarray

Total Berry phase along axis_idx. Scalar when only one axis is present in the Mesh, otherwise an array with one less dimension than the original Mesh, corresponding to the Berry phase for each remaining Mesh points.

For example, if Mesh has axes [i, j, k], and axis_idx=1, then the returned array has shape [i, k].

evalsnp.ndarray, optional

Only returned if berry_evals=True. Wilson loop eigen-phases along axis_idx. Follows the same indexing convention as above, with an additional trailing index labeling the phases \(\phi_n\).

See also

wilson_loop()
Formalism

Sec. 4.5 for the discretized formula used to compute Berry phase.

Berry phase and curvature in the Haldane model

For an example

Graphene Dirac cone Berry phase

For an example

Three-site Thouless pump

For an example

Notes

  • berry_evals are to be distinguished from Wilson loop eigenvalues (as returned in wilson_loop() with wilson_evals=True). The berry_evals are the phase arguments of wilson_evals, not the eigenvalues themselves.

  • For a single 1D string, the Berry phase is always returned in \([-\pi,\pi]\).

  • For multidimensional meshes, the phase is computed for each 1D string obtained by slicing along axis_idx; continuity treatment depends on contin.

  • A manifold specified by state_idx should be isolated from other states (no degeneracies with states outside the subset). Ensuring this is the user’s responsibility.

  • For an array of size N along axis_idx, the Wilson loop is formed from the N-1 nearest-neighbor inner products. This gives an open-path phase unless the endpoints correspond to the same physical Hamiltonian; in which case the first state is appended to the end (if endpoints are not already identical) to close the loop (with appropriate PBC phase along k-axes).

Examples

Compute Berry phases along the second mesh axis for the three lowest bands. If wf has axes [i, j, k], then phase[i, k] is the result along the string wf[i, :, k].

>>> phase = wf.berry_phase(axis_idx=1, state_idx=[0, 1, 2])