tbkit 0.2.1__tar.gz → 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. {tbkit-0.2.1/tbkit.egg-info → tbkit-0.4.0}/PKG-INFO +86 -5
  2. {tbkit-0.2.1 → tbkit-0.4.0}/README.md +82 -3
  3. {tbkit-0.2.1 → tbkit-0.4.0}/pyproject.toml +14 -3
  4. {tbkit-0.2.1 → tbkit-0.4.0}/tbkit/__init__.py +10 -2
  5. tbkit-0.4.0/tbkit/bdg.py +163 -0
  6. {tbkit-0.2.1 → tbkit-0.4.0}/tbkit/dos.py +33 -0
  7. tbkit-0.4.0/tbkit/error_handling.py +2195 -0
  8. tbkit-0.4.0/tbkit/exceptional.py +875 -0
  9. tbkit-0.4.0/tbkit/floquet.py +840 -0
  10. {tbkit-0.2.1 → tbkit-0.4.0}/tbkit/graphene.py +87 -45
  11. tbkit-0.4.0/tbkit/kpm.py +439 -0
  12. tbkit-0.4.0/tbkit/kspace.py +2109 -0
  13. {tbkit-0.2.1 → tbkit-0.4.0}/tbkit/lattice.py +144 -71
  14. tbkit-0.4.0/tbkit/meanfield.py +157 -0
  15. tbkit-0.4.0/tbkit/occupation.py +97 -0
  16. tbkit-0.4.0/tbkit/orbital.py +483 -0
  17. {tbkit-0.2.1 → tbkit-0.4.0}/tbkit/plot.py +93 -83
  18. {tbkit-0.2.1 → tbkit-0.4.0}/tbkit/propagation.py +65 -43
  19. {tbkit-0.2.1 → tbkit-0.4.0}/tbkit/save.py +17 -9
  20. tbkit-0.4.0/tbkit/slater_koster.py +250 -0
  21. {tbkit-0.2.1 → tbkit-0.4.0}/tbkit/system.py +442 -91
  22. tbkit-0.4.0/tbkit/transport.py +225 -0
  23. {tbkit-0.2.1 → tbkit-0.4.0/tbkit.egg-info}/PKG-INFO +86 -5
  24. {tbkit-0.2.1 → tbkit-0.4.0}/tbkit.egg-info/SOURCES.txt +24 -1
  25. {tbkit-0.2.1 → tbkit-0.4.0}/tbkit.egg-info/requires.txt +1 -0
  26. tbkit-0.4.0/tests/test_correlations.py +158 -0
  27. {tbkit-0.2.1 → tbkit-0.4.0}/tests/test_error_handling.py +178 -10
  28. tbkit-0.4.0/tests/test_exceptional.py +405 -0
  29. tbkit-0.4.0/tests/test_floquet.py +433 -0
  30. tbkit-0.4.0/tests/test_green_occupation.py +159 -0
  31. tbkit-0.4.0/tests/test_hall.py +360 -0
  32. tbkit-0.4.0/tests/test_kpm.py +237 -0
  33. {tbkit-0.2.1 → tbkit-0.4.0}/tests/test_kspace.py +4 -1
  34. tbkit-0.4.0/tests/test_large_lattices.py +125 -0
  35. {tbkit-0.2.1 → tbkit-0.4.0}/tests/test_lattice.py +4 -1
  36. tbkit-0.4.0/tests/test_magnetic.py +73 -0
  37. tbkit-0.4.0/tests/test_non_hermitian_bands.py +127 -0
  38. tbkit-0.4.0/tests/test_orbitals.py +360 -0
  39. {tbkit-0.2.1 → tbkit-0.4.0}/tests/test_plot.py +6 -3
  40. {tbkit-0.2.1 → tbkit-0.4.0}/tests/test_propagation.py +26 -1
  41. tbkit-0.4.0/tests/test_regressions.py +809 -0
  42. {tbkit-0.2.1 → tbkit-0.4.0}/tests/test_save.py +9 -1
  43. {tbkit-0.2.1 → tbkit-0.4.0}/tests/test_system.py +20 -0
  44. tbkit-0.4.0/tests/test_three_d.py +240 -0
  45. tbkit-0.4.0/tests/test_topology.py +254 -0
  46. tbkit-0.4.0/tests/test_transport.py +141 -0
  47. tbkit-0.2.1/tbkit/error_handling.py +0 -988
  48. tbkit-0.2.1/tbkit/kspace.py +0 -563
  49. {tbkit-0.2.1 → tbkit-0.4.0}/LICENSE +0 -0
  50. {tbkit-0.2.1 → tbkit-0.4.0}/setup.cfg +0 -0
  51. {tbkit-0.2.1 → tbkit-0.4.0}/tbkit/lattices.py +0 -0
  52. {tbkit-0.2.1 → tbkit-0.4.0}/tbkit.egg-info/dependency_links.txt +0 -0
  53. {tbkit-0.2.1 → tbkit-0.4.0}/tbkit.egg-info/top_level.txt +0 -0
  54. {tbkit-0.2.1 → tbkit-0.4.0}/tests/test_dos.py +0 -0
  55. {tbkit-0.2.1 → tbkit-0.4.0}/tests/test_graphene.py +0 -0
  56. {tbkit-0.2.1 → tbkit-0.4.0}/tests/test_lattices.py +0 -0
@@ -1,8 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tbkit
3
- Version: 0.2.1
4
- Summary: A Python package to build and solve Tight-Binding models, for research and education.
3
+ Version: 0.4.0
4
+ Summary: A Python package to build and solve Tight-Binding models.
5
5
  Author-email: Charles Poli <cpoli374@gmail.com>
6
+ Maintainer-email: cpoli <cpoli374@gmail.com>
6
7
  License-Expression: BSD-3-Clause
7
8
  Project-URL: Homepage, https://github.com/cpoli/tbkit
8
9
  Classifier: Intended Audience :: Education
@@ -18,13 +19,14 @@ Requires-Dist: matplotlib>=3.7
18
19
  Provides-Extra: test
19
20
  Requires-Dist: pytest>=7; extra == "test"
20
21
  Requires-Dist: pytest-cov>=4; extra == "test"
22
+ Requires-Dist: pytest-xdist>=3.2; extra == "test"
21
23
  Provides-Extra: docs
22
24
  Requires-Dist: sphinx>=7; extra == "docs"
23
25
  Requires-Dist: pydata-sphinx-theme>=0.15; extra == "docs"
24
26
  Requires-Dist: sphinx-gallery>=0.15; extra == "docs"
25
27
  Dynamic: license-file
26
28
 
27
- # tbkit — a Tight-Binding package for research and education
29
+ # tbkit — a Tight-Binding package
28
30
 
29
31
  [![tests](https://github.com/cpoli/tbkit/actions/workflows/tests.yml/badge.svg)](https://github.com/cpoli/tbkit/actions/workflows/tests.yml)
30
32
  [![coverage](https://img.shields.io/badge/coverage-100%25-brightgreen.svg)](https://cpoli.github.io/tbkit/coverage/)
@@ -40,6 +42,12 @@ models — lattices, hoppings, Hamiltonians, spectra, band structures —
40
42
  explicit and easy to inspect, so it works as well for teaching as for
41
43
  research prototyping.
42
44
 
45
+ For computational physics beyond tight-binding — quantum mechanics,
46
+ classical mechanics, statistical physics, general relativity, and more —
47
+ see [physicskit](https://github.com/cpoli/physicskit), whose
48
+ `physicskit.condensed` subpackage covers tight-binding band theory and
49
+ topology alongside superconductivity.
50
+
43
51
  ## Features
44
52
 
45
53
  * **Real space**: build arbitrarily complex finite lattices (flakes,
@@ -50,7 +58,40 @@ research prototyping.
50
58
  periodic lattice from a small set of intra-unit-cell hoppings, and compute
51
59
  band structures along a k-path through high-symmetry points.
52
60
  * **Topology**: Berry curvature and Chern numbers of a group of bands, by
53
- the gauge-invariant Fukui-Hatsugai-Suzuki lattice method.
61
+ the gauge-invariant Fukui-Hatsugai-Suzuki lattice method; Zak/Berry
62
+ phases, Wannier centres and their flow, the Z2 invariant (Wilson loops
63
+ and Fu-Kane parities), the quantum geometric tensor, symmetry checks and
64
+ the tenfold way, magnetic supercells (TKNN), and the real-space local
65
+ Chern marker.
66
+ * **Hall conductivities**: the intrinsic anomalous Hall conductivity at
67
+ any Fermi level (Kubo formula over the Brillouin zone, in 2D and 3D,
68
+ with adaptive mesh refinement), the spin Hall conductivity, and the
69
+ real-space Kubo-Bastin Hall conductivity of large disordered samples by
70
+ the kernel polynomial method.
71
+ * **3D**: lattices, slabs, and Bloch Hamiltonians in three dimensions
72
+ (Anderson transition, Weyl semimetals).
73
+ * **Orbitals**: several orbitals per site with Slater-Koster bond
74
+ integrals (s, p, d), non-orthogonal bases, and spinful multi-orbital
75
+ real-space models (`OrbitalSystem`: atomic/Kane-Mele spin-orbit,
76
+ Rashba, Zeeman, Peierls phases).
77
+ * **Large lattices**: sparse neighbour search, shift-invert sparse
78
+ eigensolvers, and the kernel polynomial method (DOS, LDOS, Kubo-Greenwood
79
+ conductivity).
80
+ * **Green's functions and transport**: retarded Green's functions, LDOS,
81
+ Fermi levels and occupations, and Landauer transmission through a device
82
+ between semi-infinite leads.
83
+ * **Interactions and superconductivity**: the Hubbard model in mean field,
84
+ and Bogoliubov-de Gennes Hamiltonians in real and reciprocal space.
85
+ * **Non-Hermitian bands**: non-reciprocal hoppings, spectral winding, the
86
+ skin effect, and the generalized Brillouin zone.
87
+ * **Exceptional points** of 2D bands: eigenvalue vorticity, discriminant
88
+ winding, an EP finder (charges, Jordan-block orders, exceptional rings,
89
+ bulk Fermi arcs, the doubling theorem), encircling exceptional versus
90
+ diabolical points, and biorthogonal Chern numbers of line-gapped bands.
91
+ * **Floquet**: quasienergies, Floquet and Sambe Hamiltonians, driven
92
+ Bloch models (`FloquetKSpace`, `DrivenKSpace`), exact step drives of
93
+ Bloch models, ribbons and flakes (`step_drive`), and anomalous Floquet
94
+ phases: the Rudner winding number and edge-state counts.
54
95
  * **Spin**: optional spin-1/2 degree of freedom on every site, with 2x2
55
96
  (Pauli-matrix) hoppings/onsite terms, for spin-orbit coupling (Rashba,
56
97
  Kane-Mele) and Zeeman splitting.
@@ -75,12 +116,21 @@ research prototyping.
75
116
  |----------------------------|---------------------------------------------------------|
76
117
  | `tbkit.Lattice` | Define and manipulate site positions and sublattices. |
77
118
  | `tbkit.System` | Build the real-space Hamiltonian from a `Lattice` and solve it. |
78
- | `tbkit.KSpace` | Build and solve the Bloch Hamiltonian of a periodic `Lattice`; bands, Berry curvature/Chern numbers, ribbons, DOS. |
119
+ | `tbkit.KSpace` | Build and solve the Bloch Hamiltonian of a periodic `Lattice`; bands, Berry curvature/Chern numbers, anomalous and spin Hall conductivities, ribbons, DOS. |
79
120
  | `tbkit.Plot` | Plot lattices, spectra, eigenstates, and the density of states. |
80
121
  | `tbkit.Propagation` | Time-evolve a wavepacket. |
81
122
  | `tbkit.Save` | Save figures/animations to disk. |
82
123
  | `tbkit.lattices` | Ready-made common lattices. |
83
124
  | `tbkit.dos` | Broadened density of states from a set of eigenenergies. |
125
+ | `tbkit.OrbitalSystem` | Real-space models with several orbitals and spin per site (`tbkit.orbital`). |
126
+ | `tbkit.Transport` | Landauer transmission through a device between leads (`tbkit.transport`). |
127
+ | `tbkit.occupation` | Fermi-Dirac occupations and Fermi levels. |
128
+ | `tbkit.kpm` | Kernel polynomial method: DOS, LDOS, longitudinal and Hall conductivities of very large lattices. |
129
+ | `tbkit.slater_koster` | Slater-Koster bond integrals and multi-orbital `KSpace` models. |
130
+ | `tbkit.meanfield` | The Hubbard model in (unrestricted Hartree-Fock) mean field. |
131
+ | `tbkit.bdg` | Bogoliubov-de Gennes Hamiltonians and pairings. |
132
+ | `tbkit.exceptional` | Exceptional and diabolical points of 2D bands: vorticity, discriminant winding, EP finder, Fermi arcs, encircling. |
133
+ | `tbkit.floquet` | Floquet theory; `FloquetKSpace`/`DrivenKSpace` for driven Bloch models, `step_drive`, and the winding number of anomalous Floquet phases. |
84
134
 
85
135
  ## Install
86
136
 
@@ -215,6 +265,7 @@ thumbnailed example gallery under `docs/source/api/gallery/`.
215
265
 
216
266
  | Script | What it shows |
217
267
  |---------------------------------------------------------------------------|----------------|
268
+ | [`tight_binding/plot_square_lattice_bands.py`](examples/tight_binding/plot_square_lattice_bands.py) | The square lattice: Bloch's theorem at its simplest, bands along Gamma-X-M-Gamma, the nested Fermi surface, and the van Hove singularity. |
218
269
  | [`tight_binding/plot_graphene_bands.py`](examples/tight_binding/plot_graphene_bands.py) | Real-space flake + reciprocal-space band structure; graphene's Dirac point and Wallace's 1947 linear dispersion. |
219
270
  | [`tight_binding/plot_visualizing_a_model.py`](examples/tight_binding/plot_visualizing_a_model.py) | `tbkit.plot.Plot`: lattice, spectrum with sublattice polarization, density of states, eigenstate intensity. |
220
271
  | [`magnetic_field/plot_magnetic_field.py`](examples/magnetic_field/plot_magnetic_field.py) | Peierls substitution; an Aharonov-Bohm ring's flux-periodic spectrum. |
@@ -228,6 +279,36 @@ thumbnailed example gallery under `docs/source/api/gallery/`.
228
279
  | [`topology/plot_edge_states.py`](examples/topology/plot_edge_states.py) | Zigzag graphene ribbon edge band; Kane-Mele helical edge states. |
229
280
  | [`dynamics/plot_bloch_oscillations.py`](examples/dynamics/plot_bloch_oscillations.py) | Wannier-Stark ladder, its localization, and Bloch oscillations under a uniform tilt. |
230
281
  | [`topology/plot_thouless_pump.py`](examples/topology/plot_thouless_pump.py) | The Rice-Mele model as a Thouless quantum pump: quantized Chern number and polarization winding. |
282
+ | [`strain/plot_pseudo_magnetic_field.py`](examples/strain/plot_pseudo_magnetic_field.py) | Triaxial strain as a gauge field: pseudo-Landau levels in graphene from a purely real Hamiltonian. |
283
+ | [`non_hermitian/plot_pt_symmetry.py`](examples/non_hermitian/plot_pt_symmetry.py) | PT symmetry, exceptional points, the Petermann factor, and a selectively amplified topological edge mode. |
284
+ | [`tight_binding/plot_isolation_of_graphene.py`](examples/tight_binding/plot_isolation_of_graphene.py) | The physics behind the isolation of graphene: flakes, zigzag edge states, and the Dirac cones' Berry phase of pi. |
285
+ | [`magnetic_field/plot_peierls_substitution.py`](examples/magnetic_field/plot_peierls_substitution.py) | The Peierls substitution: gauge-invariant plaquette fluxes, in two different gauges. |
286
+ | [`topology/plot_zak_phase.py`](examples/topology/plot_zak_phase.py) | The SSH chain's Zak phase and Wannier centres. |
287
+ | [`topology/plot_tknn_hofstadter.py`](examples/topology/plot_tknn_hofstadter.py) | TKNN: Chern numbers of the Hofstadter bands from magnetic supercells, and the Diophantine equation. |
288
+ | [`topology/plot_kane_mele_z2.py`](examples/topology/plot_kane_mele_z2.py) | The Kane-Mele Z2 invariant from Wannier-centre flow. |
289
+ | [`topology/plot_fu_kane_parity.py`](examples/topology/plot_fu_kane_parity.py) | The Fu-Kane parity criterion on the BHZ model, checked against the Wannier flow. |
290
+ | [`topology/plot_quantum_geometry.py`](examples/topology/plot_quantum_geometry.py) | The quantum metric and Berry curvature of a Bloch band. |
291
+ | [`topology/plot_tenfold_way.py`](examples/topology/plot_tenfold_way.py) | Symmetry classes of tight-binding models: the tenfold way. |
292
+ | [`topology/plot_local_chern_marker.py`](examples/topology/plot_local_chern_marker.py) | The local Chern marker of a finite, disordered Haldane flake. |
293
+ | [`three_dimensions/plot_anderson_transition.py`](examples/three_dimensions/plot_anderson_transition.py) | The 3D Anderson metal-insulator transition from level statistics. |
294
+ | [`three_dimensions/plot_weyl_semimetal.py`](examples/three_dimensions/plot_weyl_semimetal.py) | A Weyl semimetal: Chern number jumps across Weyl points, and Fermi arcs on a slab. |
295
+ | [`orbitals/plot_slater_koster.py`](examples/orbitals/plot_slater_koster.py) | Slater-Koster sp3 graphene: the decoupled pi bands, a non-orthogonal basis, and the same model in real space. |
296
+ | [`large_scale/plot_kernel_polynomial_method.py`](examples/large_scale/plot_kernel_polynomial_method.py) | The kernel polynomial method on a very large (disordered) graphene flake. |
297
+ | [`transport/plot_landauer_conductance.py`](examples/transport/plot_landauer_conductance.py) | Landauer conductance, and the quantized steps of a quantum point contact. |
298
+ | [`correlations/plot_hubbard_edge_magnetism.py`](examples/correlations/plot_hubbard_edge_magnetism.py) | Hubbard mean field: magnetism of graphene's zigzag edges. |
299
+ | [`correlations/plot_lieb_theorem.py`](examples/correlations/plot_lieb_theorem.py) | Lieb's theorem: the total spin of bipartite Hubbard lattices. |
300
+ | [`superconductivity/plot_kitaev_chain.py`](examples/superconductivity/plot_kitaev_chain.py) | The Kitaev chain: BdG bands, the topological phase, and Majorana end modes. |
301
+ | [`non_hermitian/plot_skin_effect.py`](examples/non_hermitian/plot_skin_effect.py) | The non-Hermitian skin effect, the spectral winding, and the generalized Brillouin zone. |
302
+ | [`topology/plot_diabolical_points.py`](examples/topology/plot_diabolical_points.py) | Diabolical points: an accidental conical intersection in a two-parameter family, avoided crossings, and the eigenvector's sign change. |
303
+ | [`non_hermitian/plot_exceptional_points_fermi_arcs.py`](examples/non_hermitian/plot_exceptional_points_fermi_arcs.py) | Exceptional points in momentum space: Re E and Im E, EP charges, and the bulk Fermi arc. |
304
+ | [`non_hermitian/plot_exceptional_point_vorticity.py`](examples/non_hermitian/plot_exceptional_point_vorticity.py) | A Dirac point splits into an EP pair (vorticity conserved), or becomes an exceptional ring. |
305
+ | [`non_hermitian/plot_exceptional_point_encircling.py`](examples/non_hermitian/plot_exceptional_point_encircling.py) | Encircling an EP (state swap, four-loop return) versus a Dirac point (Berry phase pi). |
306
+ | [`non_hermitian/plot_exceptional_points_chern_number.py`](examples/non_hermitian/plot_exceptional_points_chern_number.py) | Biorthogonal Chern numbers (LR = RL = RR = LL) until the line gap closes at exceptional points. |
307
+ | [`floquet/plot_floquet_chern_insulator.py`](examples/floquet/plot_floquet_chern_insulator.py) | A Floquet Chern insulator from circularly polarized light on graphene. |
308
+ | [`floquet/plot_anomalous_floquet_phases.py`](examples/floquet/plot_anomalous_floquet_phases.py) | Anomalous Floquet phases: edge states with zero Chern numbers, the winding number, and the five-step model. |
309
+ | [`hall_effects/plot_anomalous_hall_effect.py`](examples/hall_effects/plot_anomalous_hall_effect.py) | The anomalous Hall effect: sigma_xy(E_F) of the Haldane model, quantized at C in the gap, not in the bands. |
310
+ | [`hall_effects/plot_anomalous_hall_disorder.py`](examples/hall_effects/plot_anomalous_hall_disorder.py) | The anomalous Hall plateau of a disordered Haldane torus, by the Kubo-Bastin kernel polynomial method. |
311
+ | [`hall_effects/plot_intrinsic_spin_hall_effect.py`](examples/hall_effects/plot_intrinsic_spin_hall_effect.py) | The intrinsic spin Hall effect: the Kane-Mele plateau at e/2pi, and its departure from quantization under Rashba coupling. |
231
312
 
232
313
  The `examples/` directory also has five older Jupyter notebooks (graphene
233
314
  flakes, kagome/Lieb/dumbbell lattices, disorder, strain, time propagation)
@@ -1,4 +1,4 @@
1
- # tbkit — a Tight-Binding package for research and education
1
+ # tbkit — a Tight-Binding package
2
2
 
3
3
  [![tests](https://github.com/cpoli/tbkit/actions/workflows/tests.yml/badge.svg)](https://github.com/cpoli/tbkit/actions/workflows/tests.yml)
4
4
  [![coverage](https://img.shields.io/badge/coverage-100%25-brightgreen.svg)](https://cpoli.github.io/tbkit/coverage/)
@@ -14,6 +14,12 @@ models — lattices, hoppings, Hamiltonians, spectra, band structures —
14
14
  explicit and easy to inspect, so it works as well for teaching as for
15
15
  research prototyping.
16
16
 
17
+ For computational physics beyond tight-binding — quantum mechanics,
18
+ classical mechanics, statistical physics, general relativity, and more —
19
+ see [physicskit](https://github.com/cpoli/physicskit), whose
20
+ `physicskit.condensed` subpackage covers tight-binding band theory and
21
+ topology alongside superconductivity.
22
+
17
23
  ## Features
18
24
 
19
25
  * **Real space**: build arbitrarily complex finite lattices (flakes,
@@ -24,7 +30,40 @@ research prototyping.
24
30
  periodic lattice from a small set of intra-unit-cell hoppings, and compute
25
31
  band structures along a k-path through high-symmetry points.
26
32
  * **Topology**: Berry curvature and Chern numbers of a group of bands, by
27
- the gauge-invariant Fukui-Hatsugai-Suzuki lattice method.
33
+ the gauge-invariant Fukui-Hatsugai-Suzuki lattice method; Zak/Berry
34
+ phases, Wannier centres and their flow, the Z2 invariant (Wilson loops
35
+ and Fu-Kane parities), the quantum geometric tensor, symmetry checks and
36
+ the tenfold way, magnetic supercells (TKNN), and the real-space local
37
+ Chern marker.
38
+ * **Hall conductivities**: the intrinsic anomalous Hall conductivity at
39
+ any Fermi level (Kubo formula over the Brillouin zone, in 2D and 3D,
40
+ with adaptive mesh refinement), the spin Hall conductivity, and the
41
+ real-space Kubo-Bastin Hall conductivity of large disordered samples by
42
+ the kernel polynomial method.
43
+ * **3D**: lattices, slabs, and Bloch Hamiltonians in three dimensions
44
+ (Anderson transition, Weyl semimetals).
45
+ * **Orbitals**: several orbitals per site with Slater-Koster bond
46
+ integrals (s, p, d), non-orthogonal bases, and spinful multi-orbital
47
+ real-space models (`OrbitalSystem`: atomic/Kane-Mele spin-orbit,
48
+ Rashba, Zeeman, Peierls phases).
49
+ * **Large lattices**: sparse neighbour search, shift-invert sparse
50
+ eigensolvers, and the kernel polynomial method (DOS, LDOS, Kubo-Greenwood
51
+ conductivity).
52
+ * **Green's functions and transport**: retarded Green's functions, LDOS,
53
+ Fermi levels and occupations, and Landauer transmission through a device
54
+ between semi-infinite leads.
55
+ * **Interactions and superconductivity**: the Hubbard model in mean field,
56
+ and Bogoliubov-de Gennes Hamiltonians in real and reciprocal space.
57
+ * **Non-Hermitian bands**: non-reciprocal hoppings, spectral winding, the
58
+ skin effect, and the generalized Brillouin zone.
59
+ * **Exceptional points** of 2D bands: eigenvalue vorticity, discriminant
60
+ winding, an EP finder (charges, Jordan-block orders, exceptional rings,
61
+ bulk Fermi arcs, the doubling theorem), encircling exceptional versus
62
+ diabolical points, and biorthogonal Chern numbers of line-gapped bands.
63
+ * **Floquet**: quasienergies, Floquet and Sambe Hamiltonians, driven
64
+ Bloch models (`FloquetKSpace`, `DrivenKSpace`), exact step drives of
65
+ Bloch models, ribbons and flakes (`step_drive`), and anomalous Floquet
66
+ phases: the Rudner winding number and edge-state counts.
28
67
  * **Spin**: optional spin-1/2 degree of freedom on every site, with 2x2
29
68
  (Pauli-matrix) hoppings/onsite terms, for spin-orbit coupling (Rashba,
30
69
  Kane-Mele) and Zeeman splitting.
@@ -49,12 +88,21 @@ research prototyping.
49
88
  |----------------------------|---------------------------------------------------------|
50
89
  | `tbkit.Lattice` | Define and manipulate site positions and sublattices. |
51
90
  | `tbkit.System` | Build the real-space Hamiltonian from a `Lattice` and solve it. |
52
- | `tbkit.KSpace` | Build and solve the Bloch Hamiltonian of a periodic `Lattice`; bands, Berry curvature/Chern numbers, ribbons, DOS. |
91
+ | `tbkit.KSpace` | Build and solve the Bloch Hamiltonian of a periodic `Lattice`; bands, Berry curvature/Chern numbers, anomalous and spin Hall conductivities, ribbons, DOS. |
53
92
  | `tbkit.Plot` | Plot lattices, spectra, eigenstates, and the density of states. |
54
93
  | `tbkit.Propagation` | Time-evolve a wavepacket. |
55
94
  | `tbkit.Save` | Save figures/animations to disk. |
56
95
  | `tbkit.lattices` | Ready-made common lattices. |
57
96
  | `tbkit.dos` | Broadened density of states from a set of eigenenergies. |
97
+ | `tbkit.OrbitalSystem` | Real-space models with several orbitals and spin per site (`tbkit.orbital`). |
98
+ | `tbkit.Transport` | Landauer transmission through a device between leads (`tbkit.transport`). |
99
+ | `tbkit.occupation` | Fermi-Dirac occupations and Fermi levels. |
100
+ | `tbkit.kpm` | Kernel polynomial method: DOS, LDOS, longitudinal and Hall conductivities of very large lattices. |
101
+ | `tbkit.slater_koster` | Slater-Koster bond integrals and multi-orbital `KSpace` models. |
102
+ | `tbkit.meanfield` | The Hubbard model in (unrestricted Hartree-Fock) mean field. |
103
+ | `tbkit.bdg` | Bogoliubov-de Gennes Hamiltonians and pairings. |
104
+ | `tbkit.exceptional` | Exceptional and diabolical points of 2D bands: vorticity, discriminant winding, EP finder, Fermi arcs, encircling. |
105
+ | `tbkit.floquet` | Floquet theory; `FloquetKSpace`/`DrivenKSpace` for driven Bloch models, `step_drive`, and the winding number of anomalous Floquet phases. |
58
106
 
59
107
  ## Install
60
108
 
@@ -189,6 +237,7 @@ thumbnailed example gallery under `docs/source/api/gallery/`.
189
237
 
190
238
  | Script | What it shows |
191
239
  |---------------------------------------------------------------------------|----------------|
240
+ | [`tight_binding/plot_square_lattice_bands.py`](examples/tight_binding/plot_square_lattice_bands.py) | The square lattice: Bloch's theorem at its simplest, bands along Gamma-X-M-Gamma, the nested Fermi surface, and the van Hove singularity. |
192
241
  | [`tight_binding/plot_graphene_bands.py`](examples/tight_binding/plot_graphene_bands.py) | Real-space flake + reciprocal-space band structure; graphene's Dirac point and Wallace's 1947 linear dispersion. |
193
242
  | [`tight_binding/plot_visualizing_a_model.py`](examples/tight_binding/plot_visualizing_a_model.py) | `tbkit.plot.Plot`: lattice, spectrum with sublattice polarization, density of states, eigenstate intensity. |
194
243
  | [`magnetic_field/plot_magnetic_field.py`](examples/magnetic_field/plot_magnetic_field.py) | Peierls substitution; an Aharonov-Bohm ring's flux-periodic spectrum. |
@@ -202,6 +251,36 @@ thumbnailed example gallery under `docs/source/api/gallery/`.
202
251
  | [`topology/plot_edge_states.py`](examples/topology/plot_edge_states.py) | Zigzag graphene ribbon edge band; Kane-Mele helical edge states. |
203
252
  | [`dynamics/plot_bloch_oscillations.py`](examples/dynamics/plot_bloch_oscillations.py) | Wannier-Stark ladder, its localization, and Bloch oscillations under a uniform tilt. |
204
253
  | [`topology/plot_thouless_pump.py`](examples/topology/plot_thouless_pump.py) | The Rice-Mele model as a Thouless quantum pump: quantized Chern number and polarization winding. |
254
+ | [`strain/plot_pseudo_magnetic_field.py`](examples/strain/plot_pseudo_magnetic_field.py) | Triaxial strain as a gauge field: pseudo-Landau levels in graphene from a purely real Hamiltonian. |
255
+ | [`non_hermitian/plot_pt_symmetry.py`](examples/non_hermitian/plot_pt_symmetry.py) | PT symmetry, exceptional points, the Petermann factor, and a selectively amplified topological edge mode. |
256
+ | [`tight_binding/plot_isolation_of_graphene.py`](examples/tight_binding/plot_isolation_of_graphene.py) | The physics behind the isolation of graphene: flakes, zigzag edge states, and the Dirac cones' Berry phase of pi. |
257
+ | [`magnetic_field/plot_peierls_substitution.py`](examples/magnetic_field/plot_peierls_substitution.py) | The Peierls substitution: gauge-invariant plaquette fluxes, in two different gauges. |
258
+ | [`topology/plot_zak_phase.py`](examples/topology/plot_zak_phase.py) | The SSH chain's Zak phase and Wannier centres. |
259
+ | [`topology/plot_tknn_hofstadter.py`](examples/topology/plot_tknn_hofstadter.py) | TKNN: Chern numbers of the Hofstadter bands from magnetic supercells, and the Diophantine equation. |
260
+ | [`topology/plot_kane_mele_z2.py`](examples/topology/plot_kane_mele_z2.py) | The Kane-Mele Z2 invariant from Wannier-centre flow. |
261
+ | [`topology/plot_fu_kane_parity.py`](examples/topology/plot_fu_kane_parity.py) | The Fu-Kane parity criterion on the BHZ model, checked against the Wannier flow. |
262
+ | [`topology/plot_quantum_geometry.py`](examples/topology/plot_quantum_geometry.py) | The quantum metric and Berry curvature of a Bloch band. |
263
+ | [`topology/plot_tenfold_way.py`](examples/topology/plot_tenfold_way.py) | Symmetry classes of tight-binding models: the tenfold way. |
264
+ | [`topology/plot_local_chern_marker.py`](examples/topology/plot_local_chern_marker.py) | The local Chern marker of a finite, disordered Haldane flake. |
265
+ | [`three_dimensions/plot_anderson_transition.py`](examples/three_dimensions/plot_anderson_transition.py) | The 3D Anderson metal-insulator transition from level statistics. |
266
+ | [`three_dimensions/plot_weyl_semimetal.py`](examples/three_dimensions/plot_weyl_semimetal.py) | A Weyl semimetal: Chern number jumps across Weyl points, and Fermi arcs on a slab. |
267
+ | [`orbitals/plot_slater_koster.py`](examples/orbitals/plot_slater_koster.py) | Slater-Koster sp3 graphene: the decoupled pi bands, a non-orthogonal basis, and the same model in real space. |
268
+ | [`large_scale/plot_kernel_polynomial_method.py`](examples/large_scale/plot_kernel_polynomial_method.py) | The kernel polynomial method on a very large (disordered) graphene flake. |
269
+ | [`transport/plot_landauer_conductance.py`](examples/transport/plot_landauer_conductance.py) | Landauer conductance, and the quantized steps of a quantum point contact. |
270
+ | [`correlations/plot_hubbard_edge_magnetism.py`](examples/correlations/plot_hubbard_edge_magnetism.py) | Hubbard mean field: magnetism of graphene's zigzag edges. |
271
+ | [`correlations/plot_lieb_theorem.py`](examples/correlations/plot_lieb_theorem.py) | Lieb's theorem: the total spin of bipartite Hubbard lattices. |
272
+ | [`superconductivity/plot_kitaev_chain.py`](examples/superconductivity/plot_kitaev_chain.py) | The Kitaev chain: BdG bands, the topological phase, and Majorana end modes. |
273
+ | [`non_hermitian/plot_skin_effect.py`](examples/non_hermitian/plot_skin_effect.py) | The non-Hermitian skin effect, the spectral winding, and the generalized Brillouin zone. |
274
+ | [`topology/plot_diabolical_points.py`](examples/topology/plot_diabolical_points.py) | Diabolical points: an accidental conical intersection in a two-parameter family, avoided crossings, and the eigenvector's sign change. |
275
+ | [`non_hermitian/plot_exceptional_points_fermi_arcs.py`](examples/non_hermitian/plot_exceptional_points_fermi_arcs.py) | Exceptional points in momentum space: Re E and Im E, EP charges, and the bulk Fermi arc. |
276
+ | [`non_hermitian/plot_exceptional_point_vorticity.py`](examples/non_hermitian/plot_exceptional_point_vorticity.py) | A Dirac point splits into an EP pair (vorticity conserved), or becomes an exceptional ring. |
277
+ | [`non_hermitian/plot_exceptional_point_encircling.py`](examples/non_hermitian/plot_exceptional_point_encircling.py) | Encircling an EP (state swap, four-loop return) versus a Dirac point (Berry phase pi). |
278
+ | [`non_hermitian/plot_exceptional_points_chern_number.py`](examples/non_hermitian/plot_exceptional_points_chern_number.py) | Biorthogonal Chern numbers (LR = RL = RR = LL) until the line gap closes at exceptional points. |
279
+ | [`floquet/plot_floquet_chern_insulator.py`](examples/floquet/plot_floquet_chern_insulator.py) | A Floquet Chern insulator from circularly polarized light on graphene. |
280
+ | [`floquet/plot_anomalous_floquet_phases.py`](examples/floquet/plot_anomalous_floquet_phases.py) | Anomalous Floquet phases: edge states with zero Chern numbers, the winding number, and the five-step model. |
281
+ | [`hall_effects/plot_anomalous_hall_effect.py`](examples/hall_effects/plot_anomalous_hall_effect.py) | The anomalous Hall effect: sigma_xy(E_F) of the Haldane model, quantized at C in the gap, not in the bands. |
282
+ | [`hall_effects/plot_anomalous_hall_disorder.py`](examples/hall_effects/plot_anomalous_hall_disorder.py) | The anomalous Hall plateau of a disordered Haldane torus, by the Kubo-Bastin kernel polynomial method. |
283
+ | [`hall_effects/plot_intrinsic_spin_hall_effect.py`](examples/hall_effects/plot_intrinsic_spin_hall_effect.py) | The intrinsic spin Hall effect: the Kane-Mele plateau at e/2pi, and its departure from quantization under Rashba coupling. |
205
284
 
206
285
  The `examples/` directory also has five older Jupyter notebooks (graphene
207
286
  flakes, kagome/Lieb/dumbbell lattices, disorder, strain, time propagation)
@@ -4,11 +4,12 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tbkit"
7
- version = "0.2.1"
8
- description = "A Python package to build and solve Tight-Binding models, for research and education."
7
+ version = "0.4.0"
8
+ description = "A Python package to build and solve Tight-Binding models."
9
9
  readme = "README.md"
10
10
  license = "BSD-3-Clause"
11
11
  authors = [{ name = "Charles Poli", email = "cpoli374@gmail.com" }]
12
+ maintainers = [{ name = "cpoli", email = "cpoli374@gmail.com" }]
12
13
  requires-python = ">=3.10"
13
14
  dependencies = [
14
15
  "numpy>=1.24",
@@ -26,9 +27,19 @@ classifiers = [
26
27
  Homepage = "https://github.com/cpoli/tbkit"
27
28
 
28
29
  [project.optional-dependencies]
29
- test = ["pytest>=7", "pytest-cov>=4"]
30
+ test = ["pytest>=7", "pytest-cov>=4", "pytest-xdist>=3.2"]
30
31
  docs = ["sphinx>=7", "pydata-sphinx-theme>=0.15", "sphinx-gallery>=0.15"]
31
32
 
33
+ [tool.pytest.ini_options]
34
+ # The suite is warning-free; keep it that way. A warning from tbkit itself is
35
+ # a defect (e.g. complex energies reaching matplotlib), and one from a test is
36
+ # usually the test misusing an API. Add a targeted `ignore::` entry below if a
37
+ # dependency ever emits something genuinely out of our control.
38
+ filterwarnings = ["error"]
39
+ # Run in parallel; worksteal rebalances the few slow Floquet/Hall/KPM tests.
40
+ # Pass -n0 to run a single test without the worker startup cost.
41
+ addopts = "-n auto --dist worksteal"
42
+
32
43
  [tool.setuptools.packages.find]
33
44
  include = ["tbkit*"]
34
45
 
@@ -6,11 +6,14 @@
6
6
 
7
7
  """tbkit: build and solve Tight-Binding models."""
8
8
 
9
- __version__ = "0.2.1"
9
+ __version__ = "0.4.0"
10
10
 
11
11
  __all__ = [
12
12
  "Lattice", "System", "Plot", "Propagation", "Save", "KSpace",
13
- "reciprocal_vectors", "error_handling",
13
+ "reciprocal_vectors", "OrbitalSystem", "Transport", "FloquetKSpace",
14
+ "DrivenKSpace", "StepDrive", "step_drive",
15
+ "MeanFieldResult", "hubbard_mean_field", "ExceptionalPoints", "Encircling",
16
+ "find_exceptional_points", "error_handling",
14
17
  ]
15
18
 
16
19
  # NOTE: these are explicit imports, not `from tbkit.<module> import *`.
@@ -24,4 +27,9 @@ from tbkit.plot import Plot
24
27
  from tbkit.propagation import Propagation
25
28
  from tbkit.save import Save
26
29
  from tbkit.kspace import KSpace, reciprocal_vectors
30
+ from tbkit.orbital import OrbitalSystem
31
+ from tbkit.transport import Transport
32
+ from tbkit.floquet import FloquetKSpace, DrivenKSpace, StepDrive, step_drive
33
+ from tbkit.meanfield import MeanFieldResult, hubbard_mean_field
34
+ from tbkit.exceptional import ExceptionalPoints, Encircling, find_exceptional_points
27
35
  import tbkit.error_handling
@@ -0,0 +1,163 @@
1
+ r"""
2
+ Superconductivity in the Bogoliubov-de Gennes (BdG) formalism. With a
3
+ pairing term :math:`\sum_{ij}\Delta_{ij}c^\dagger_ic^\dagger_j + h.c.`,
4
+ the Hamiltonian is :math:`\frac12\Psi^\dagger H_{BdG}\Psi` in the Nambu
5
+ basis :math:`\Psi = (c_1, \dots, c_N, c_1^\dagger, \dots, c_N^\dagger)^T`,
6
+
7
+ .. math::
8
+
9
+ H_{BdG} = \begin{pmatrix} h - \mu & \Delta \\ \Delta^\dagger & -(h-\mu)^T \end{pmatrix}\, ,
10
+
11
+ with :math:`\Delta^T = -\Delta` (Fermi statistics). Its spectrum is
12
+ symmetric, :math:`\pm E_n`, by the particle-hole symmetry
13
+ :math:`\tau_x H_{BdG}^*\tau_x = -H_{BdG}`; the quasiparticle energies are
14
+ the :math:`E_n \ge 0`, and a zero mode is a Majorana mode. Real-space
15
+ models come from *bdg_ham*, periodic ones from *bdg_kspace* (a
16
+ :class:`tbkit.kspace.KSpace` with the holes as extra orbitals, so its bands,
17
+ Berry phases, *finite_ham*, ... all apply).
18
+ """
19
+ from __future__ import annotations
20
+
21
+ import numpy as np
22
+ from numpy.typing import NDArray
23
+ import scipy.sparse as sparse
24
+
25
+ import tbkit.error_handling as error_handling
26
+ from tbkit.lattice import Lattice
27
+
28
+
29
+ def bdg_ham(ham, pairing, mu: float = 0.) -> sparse.csr_matrix:
30
+ r'''
31
+ Get the real-space BdG Hamiltonian (see the module docstring).
32
+
33
+ :param ham: Square Hermitian matrix, shape (N, N) (e.g. *System.ham*).
34
+ :param pairing: Square antisymmetric matrix, shape (N, N): :math:`\Delta`
35
+ (see *pairing_bonds*, *pairing_s_wave*).
36
+ :param mu: Real number. Default value 0. Chemical potential.
37
+
38
+ :returns:
39
+ * **ham_bdg** -- Sparse CSR matrix, shape (2N, 2N).
40
+ '''
41
+ h = sparse.csr_matrix(ham, dtype='c16')
42
+ delta = sparse.csr_matrix(pairing, dtype='c16')
43
+ error_handling.square_matrix(h, 'ham')
44
+ error_handling.hermitian(h)
45
+ error_handling.pairing(delta, h.shape[0])
46
+ error_handling.real_number(mu, 'mu')
47
+ h = h - mu * sparse.identity(h.shape[0], dtype='c16', format='csr')
48
+ return sparse.csr_matrix(sparse.bmat([[h, delta], [delta.conj().T, -h.T]]))
49
+
50
+
51
+ def pairing_bonds(sys, delta: complex) -> sparse.csr_matrix:
52
+ r'''
53
+ Get a p-wave (odd) pairing on the bonds of *sys.hop*:
54
+ :math:`\Delta_{ij} = \Delta`, :math:`\Delta_{ji} = -\Delta` for every
55
+ stored hopping :math:`i\to j` (oriented as *System.set_hopping* stores
56
+ them: angle in :math:`[0, 180)`). On a chain it is Kitaev's
57
+ :math:`\Delta\,c^\dagger_jc^\dagger_{j+1}`.
58
+
59
+ :param sys: **System** instance, with hoppings.
60
+ :param delta: Complex number. :math:`\Delta`.
61
+
62
+ :returns:
63
+ * **pairing** -- Sparse CSR matrix, shape (sites, sites).
64
+ '''
65
+ error_handling.empty_hop(sys.hop)
66
+ error_handling.number(delta, 'delta')
67
+ i, j = sys.hop['i'].astype(int), sys.hop['j'].astype(int)
68
+ n = sys.lat.sites
69
+ vals = np.full(len(i), delta, dtype='c16')
70
+ return sparse.csr_matrix((np.concatenate([vals, -vals]), (np.concatenate([i, j]), np.concatenate([j, i]))),
71
+ shape=(n, n))
72
+
73
+
74
+ def pairing_s_wave(n_sites: int, delta: complex) -> sparse.csr_matrix:
75
+ r'''
76
+ Get an onsite singlet (s-wave) pairing
77
+ :math:`\Delta\sum_i c^\dagger_{i\uparrow}c^\dagger_{i\downarrow} + h.c.`
78
+ for a spinful model with rows ordered site by site, spin up then down
79
+ (as *KSpace* with ``spin=True`` and *OrbitalSystem* with one orbital).
80
+
81
+ :param n_sites: Positive integer. Number of sites.
82
+ :param delta: Complex number. :math:`\Delta`.
83
+
84
+ :returns:
85
+ * **pairing** -- Sparse CSR matrix, shape (2 n_sites, 2 n_sites).
86
+ '''
87
+ error_handling.positive_int(n_sites, 'n_sites')
88
+ error_handling.number(delta, 'delta')
89
+ block = np.array([[0., delta], [-delta, 0.]], dtype='c16')
90
+ return sparse.csr_matrix(sparse.kron(sparse.identity(n_sites), block))
91
+
92
+
93
+ def bdg_kspace(ks, pairing: list[dict], mu: float = 0.):
94
+ r'''
95
+ Get the BdG Bloch Hamiltonian of a periodic model,
96
+
97
+ .. math::
98
+
99
+ H_{BdG}(\mathbf{k}) = \begin{pmatrix} h(\mathbf{k})-\mu & \Delta(\mathbf{k}) \\
100
+ \Delta(\mathbf{k})^\dagger & -[h(-\mathbf{k})-\mu]^T\end{pmatrix}\, ,\qquad
101
+ \Delta(\mathbf{k}) = \sum_{\mathbf{R}}\Delta_{ij}(\mathbf{R})\,e^{i\mathbf{k}\cdot\mathbf{R}}\, ,
102
+
103
+ as a new **KSpace** whose orbitals are those of *ks* (particles,
104
+ ``0 ... norb-1``) followed by their holes (``norb ... 2 norb-1``, at the
105
+ same positions). Each pairing :math:`\Delta\,c^\dagger_{i,\mathbf{0}}c^\dagger_{j,\mathbf{R}} + h.c.`
106
+ enters antisymmetrized, :math:`\Delta_{ij}(\mathbf{R}) = -\Delta_{ji}(-\mathbf{R})`.
107
+
108
+ :param ks: **KSpace** instance (Hermitian, orthogonal basis).
109
+ :param pairing: List of dictionaries with keys ('i', 'j', 'R', 'delta'):
110
+ orbital indices of *ks* (``0 ... norb-1``; with ``spin=True``,
111
+ ``2*site + spin``), lattice vector, amplitude.
112
+ :param mu: Real number. Default value 0. Chemical potential.
113
+
114
+ :returns:
115
+ * **ks_bdg** -- **KSpace** instance, 2 norb orbitals.
116
+
117
+ Example usage::
118
+
119
+ # Kitaev chain: E(k) = +-sqrt((2t cos k - mu)^2 + 4 Delta^2 sin^2 k)
120
+ chain = KSpace(lattices.chain())
121
+ chain.set_hopping([{'i': 0, 'j': 0, 'R': (1,), 't': t}])
122
+ kit = bdg_kspace(chain, [{'i': 0, 'j': 0, 'R': (1,), 'delta': delta}], mu=mu)
123
+ '''
124
+ from tbkit.kspace import KSpace
125
+ error_handling.hermitian_kspace(ks.is_hermitian(), ks._overlap_hop)
126
+ error_handling.pairing_kspace(pairing, ks.norb, ks.dim)
127
+ error_handling.real_number(mu, 'mu')
128
+ norb = ks.norb
129
+ tau = ks.orbital_positions()
130
+ tags = np.repeat(ks.tags, 2) if ks.spin else ks.tags
131
+ cell = [{'tag': str(t), 'r0': tuple(float(c) for c in r)} for t, r in zip(tags, tau)]
132
+ new = KSpace(Lattice(unit_cell=cell + [dict(c) for c in cell], prim_vec=ks.lat.prim_vec))
133
+ h0 = np.diag(ks.onsite) + ks._onsite_offdiag - mu * np.eye(norb)
134
+ new.onsite = np.concatenate([np.diag(h0), -np.diag(h0)]).astype('c16')
135
+ off = h0 - np.diag(np.diag(h0))
136
+ new._onsite_offdiag = np.block([[off, np.zeros((norb, norb))], [np.zeros((norb, norb)), -off.T]]).astype('c16')
137
+ hops = [(i, j, R, t) for i, j, R, t in ks._hop]
138
+ hops += [(j + norb, i + norb, -R, -t) for i, j, R, t in ks._hop]
139
+ for dic in pairing:
140
+ R = np.zeros(ks.space_dim)
141
+ for n, a in zip(dic['R'], ks.lat.prim_vec):
142
+ R += n * np.array(a)
143
+ i, j, d = dic['i'], dic['j'], complex(dic['delta'])
144
+ hops += [(i, j + norb, R, d), (j, i + norb, -R, -d),
145
+ (j + norb, i, -R, np.conj(d)), (i + norb, j, R, -np.conj(d))]
146
+ new._hop = hops
147
+ return new
148
+
149
+
150
+ def particle_hole(n: int) -> NDArray[np.float64]:
151
+ r'''
152
+ Get the unitary part :math:`\tau_x` of the BdG particle-hole symmetry
153
+ :math:`C = \tau_x\mathcal{K}` (:math:`C^2 = +1`), for *n* particle
154
+ orbitals: pass it to *KSpace.symmetry_error* (``antiunitary=True``,
155
+ ``anti=True``) or *KSpace.tenfold_class* (``particle_hole=``).
156
+
157
+ :param n: Positive integer. Number of particle orbitals.
158
+
159
+ :returns:
160
+ * **tau_x** -- Real ndarray, shape (2n, 2n).
161
+ '''
162
+ error_handling.positive_int(n, 'n')
163
+ return np.kron(np.array([[0., 1.], [1., 0.]]), np.eye(n))
@@ -7,6 +7,8 @@ from __future__ import annotations
7
7
 
8
8
  import numpy as np
9
9
  from numpy.typing import ArrayLike, NDArray
10
+ import matplotlib.pyplot as plt
11
+ from matplotlib.figure import Figure
10
12
 
11
13
  import tbkit.error_handling as error_handling
12
14
 
@@ -63,3 +65,34 @@ def density_of_states(
63
65
  else:
64
66
  weight = (broadening/np.pi) / (diff**2 + broadening**2)
65
67
  return e_grid, weight.sum(axis=1)
68
+
69
+
70
+ def _plot_density_of_states(
71
+ energies: ArrayLike,
72
+ e_grid: ArrayLike | None,
73
+ broadening: float,
74
+ kernel: str,
75
+ fs: float,
76
+ lw: float,
77
+ figsize: tuple[float, float] | None,
78
+ ) -> Figure:
79
+ '''
80
+ Private function. Plot *density_of_states* (shared by *Plot.dos* and
81
+ *KSpace.plot_dos*, which validate the plotting parameters).
82
+ '''
83
+ e_grid, rho = density_of_states(energies, e_grid=e_grid, broadening=broadening, kernel=kernel)
84
+ fig, ax = plt.subplots(figsize=figsize)
85
+ ax.plot(e_grid, rho, 'b', lw=lw)
86
+ ax.fill_between(e_grid, rho, color='b', alpha=0.2)
87
+ ax.set_xlim([e_grid[0], e_grid[-1]])
88
+ ax.set_ylim([0., None])
89
+ ax.set_title('Density of states', fontsize=fs)
90
+ ax.set_xlabel('$E$', fontsize=fs)
91
+ ax.set_ylabel(r'$\rho(E)$', fontsize=fs)
92
+ for label in ax.xaxis.get_majorticklabels():
93
+ label.set_fontsize(fs)
94
+ for label in ax.yaxis.get_majorticklabels():
95
+ label.set_fontsize(fs)
96
+ fig.set_layout_engine('tight')
97
+ plt.draw()
98
+ return fig