physicskit 0.1.0__py3-none-any.whl

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 (484) hide show
  1. physicskit/__init__.py +51 -0
  2. physicskit/astro/__init__.py +66 -0
  3. physicskit/astro/cosmic_web.py +395 -0
  4. physicskit/astro/galactic_dynamics.py +137 -0
  5. physicskit/astro/nbody.py +208 -0
  6. physicskit/astro/orbital_mechanics.py +220 -0
  7. physicskit/astro/stellar_dynamo.py +628 -0
  8. physicskit/astro/stellar_structure.py +198 -0
  9. physicskit/astro/tests/__init__.py +0 -0
  10. physicskit/astro/tests/conftest.py +7 -0
  11. physicskit/astro/tests/test_cosmic_web.py +159 -0
  12. physicskit/astro/tests/test_galactic_dynamics.py +46 -0
  13. physicskit/astro/tests/test_nbody.py +81 -0
  14. physicskit/astro/tests/test_orbital_mechanics.py +73 -0
  15. physicskit/astro/tests/test_stellar_dynamo.py +198 -0
  16. physicskit/astro/tests/test_stellar_structure.py +52 -0
  17. physicskit/astro/tests/test_visualizers.py +159 -0
  18. physicskit/astro/visualizers.py +628 -0
  19. physicskit/chaos/__init__.py +55 -0
  20. physicskit/chaos/core/__init__.py +3 -0
  21. physicskit/chaos/core/base_system.py +342 -0
  22. physicskit/chaos/core/integrators.py +40 -0
  23. physicskit/chaos/exceptions.py +24 -0
  24. physicskit/chaos/quantum/__init__.py +38 -0
  25. physicskit/chaos/quantum/billiards.py +274 -0
  26. physicskit/chaos/quantum/husimi.py +85 -0
  27. physicskit/chaos/quantum/maps.py +366 -0
  28. physicskit/chaos/systems/__init__.py +38 -0
  29. physicskit/chaos/systems/billiards.py +1131 -0
  30. physicskit/chaos/systems/continuous.py +1276 -0
  31. physicskit/chaos/systems/maps.py +557 -0
  32. physicskit/chaos/tests/__init__.py +0 -0
  33. physicskit/chaos/tests/test_basins.py +76 -0
  34. physicskit/chaos/tests/test_bifurcation.py +132 -0
  35. physicskit/chaos/tests/test_billiards.py +115 -0
  36. physicskit/chaos/tests/test_continuous.py +224 -0
  37. physicskit/chaos/tests/test_dimension.py +69 -0
  38. physicskit/chaos/tests/test_divergence.py +90 -0
  39. physicskit/chaos/tests/test_dynamic_plots.py +269 -0
  40. physicskit/chaos/tests/test_integrators.py +96 -0
  41. physicskit/chaos/tests/test_io.py +41 -0
  42. physicskit/chaos/tests/test_maps.py +110 -0
  43. physicskit/chaos/tests/test_metrics.py +115 -0
  44. physicskit/chaos/tests/test_phase_space.py +73 -0
  45. physicskit/chaos/tests/test_properties.py +116 -0
  46. physicskit/chaos/tests/test_quantum_billiards.py +94 -0
  47. physicskit/chaos/tests/test_quantum_maps.py +144 -0
  48. physicskit/chaos/tests/test_recurrence.py +51 -0
  49. physicskit/chaos/tests/test_repr_and_api_consistency.py +134 -0
  50. physicskit/chaos/tests/test_section.py +49 -0
  51. physicskit/chaos/tests/test_spectral.py +48 -0
  52. physicskit/chaos/tests/test_streamlit_app.py +45 -0
  53. physicskit/chaos/tests/test_timeseries.py +131 -0
  54. physicskit/chaos/tests/test_viewer3d.py +41 -0
  55. physicskit/chaos/utils/__init__.py +46 -0
  56. physicskit/chaos/utils/dimension.py +139 -0
  57. physicskit/chaos/utils/io.py +95 -0
  58. physicskit/chaos/utils/metrics.py +304 -0
  59. physicskit/chaos/utils/recurrence.py +122 -0
  60. physicskit/chaos/utils/spectral.py +69 -0
  61. physicskit/chaos/utils/timeseries.py +303 -0
  62. physicskit/chaos/visualizers/__init__.py +85 -0
  63. physicskit/chaos/visualizers/basins.py +185 -0
  64. physicskit/chaos/visualizers/bifurcation.py +273 -0
  65. physicskit/chaos/visualizers/divergence.py +374 -0
  66. physicskit/chaos/visualizers/dynamic_plots.py +1372 -0
  67. physicskit/chaos/visualizers/phase_space.py +133 -0
  68. physicskit/chaos/visualizers/quantum.py +299 -0
  69. physicskit/chaos/visualizers/recurrence.py +91 -0
  70. physicskit/chaos/visualizers/section.py +161 -0
  71. physicskit/chaos/visualizers/theme.py +31 -0
  72. physicskit/chaos/visualizers/viewer3d.py +82 -0
  73. physicskit/classical/__init__.py +55 -0
  74. physicskit/classical/core/__init__.py +17 -0
  75. physicskit/classical/core/base_system.py +510 -0
  76. physicskit/classical/core/integrators.py +397 -0
  77. physicskit/classical/systems/__init__.py +32 -0
  78. physicskit/classical/systems/chains.py +334 -0
  79. physicskit/classical/systems/hamiltonian.py +215 -0
  80. physicskit/classical/systems/lagrangian.py +308 -0
  81. physicskit/classical/systems/newtonian.py +536 -0
  82. physicskit/classical/systems/rotations.py +614 -0
  83. physicskit/classical/tests/__init__.py +0 -0
  84. physicskit/classical/tests/conftest.py +7 -0
  85. physicskit/classical/tests/test_base_system.py +113 -0
  86. physicskit/classical/tests/test_chains.py +84 -0
  87. physicskit/classical/tests/test_conservation.py +244 -0
  88. physicskit/classical/tests/test_conservation_utils.py +47 -0
  89. physicskit/classical/tests/test_hamiltonian.py +44 -0
  90. physicskit/classical/tests/test_integrators.py +123 -0
  91. physicskit/classical/tests/test_lagrangian.py +69 -0
  92. physicskit/classical/tests/test_newtonian.py +45 -0
  93. physicskit/classical/tests/test_rotations.py +160 -0
  94. physicskit/classical/tests/test_stepsize.py +149 -0
  95. physicskit/classical/tests/test_symbolic.py +125 -0
  96. physicskit/classical/tests/test_visualizers.py +172 -0
  97. physicskit/classical/utils/__init__.py +20 -0
  98. physicskit/classical/utils/conservation.py +126 -0
  99. physicskit/classical/utils/stepsize.py +187 -0
  100. physicskit/classical/utils/symbolic.py +235 -0
  101. physicskit/classical/visualizers/__init__.py +25 -0
  102. physicskit/classical/visualizers/animations.py +508 -0
  103. physicskit/classical/visualizers/interactive.py +113 -0
  104. physicskit/classical/visualizers/modal_analysis.py +97 -0
  105. physicskit/classical/visualizers/phase_space.py +214 -0
  106. physicskit/condensed/__init__.py +122 -0
  107. physicskit/condensed/anderson_localization.py +155 -0
  108. physicskit/condensed/correlated.py +284 -0
  109. physicskit/condensed/ginzburg_landau.py +220 -0
  110. physicskit/condensed/landau_levels.py +246 -0
  111. physicskit/condensed/laughlin.py +229 -0
  112. physicskit/condensed/models.py +627 -0
  113. physicskit/condensed/tests/__init__.py +0 -0
  114. physicskit/condensed/tests/test_condensed.py +518 -0
  115. physicskit/condensed/tests/test_visualizers.py +87 -0
  116. physicskit/condensed/tight_binding.py +445 -0
  117. physicskit/condensed/topological_insulator_3d.py +178 -0
  118. physicskit/condensed/topology.py +217 -0
  119. physicskit/condensed/visualizers.py +296 -0
  120. physicskit/condensed/weyl.py +180 -0
  121. physicskit/constants.py +184 -0
  122. physicskit/fields/__init__.py +111 -0
  123. physicskit/fields/electrodynamics.py +671 -0
  124. physicskit/fields/quantum_fields.py +510 -0
  125. physicskit/fields/solitons.py +527 -0
  126. physicskit/fields/tests/__init__.py +0 -0
  127. physicskit/fields/tests/conftest.py +7 -0
  128. physicskit/fields/tests/test_field_animations.py +154 -0
  129. physicskit/fields/tests/test_fields.py +439 -0
  130. physicskit/fields/tests/test_visualizers.py +101 -0
  131. physicskit/fields/visualizers.py +503 -0
  132. physicskit/fluids/__init__.py +134 -0
  133. physicskit/fluids/core/__init__.py +23 -0
  134. physicskit/fluids/core/grid.py +165 -0
  135. physicskit/fluids/core/timestepping.py +231 -0
  136. physicskit/fluids/exceptions.py +26 -0
  137. physicskit/fluids/systems/__init__.py +70 -0
  138. physicskit/fluids/systems/compressible_flow.py +281 -0
  139. physicskit/fluids/systems/instabilities.py +343 -0
  140. physicskit/fluids/systems/navier_stokes.py +221 -0
  141. physicskit/fluids/systems/potential_flow.py +440 -0
  142. physicskit/fluids/systems/viscous_flow.py +425 -0
  143. physicskit/fluids/systems/vortex_dynamics.py +304 -0
  144. physicskit/fluids/tests/__init__.py +0 -0
  145. physicskit/fluids/tests/conftest.py +7 -0
  146. physicskit/fluids/tests/test_compressible_flow.py +66 -0
  147. physicskit/fluids/tests/test_instabilities.py +115 -0
  148. physicskit/fluids/tests/test_navier_stokes.py +67 -0
  149. physicskit/fluids/tests/test_potential_flow.py +92 -0
  150. physicskit/fluids/tests/test_static_visualizers.py +91 -0
  151. physicskit/fluids/tests/test_utils.py +100 -0
  152. physicskit/fluids/tests/test_viscous_flow.py +110 -0
  153. physicskit/fluids/tests/test_visualizers.py +34 -0
  154. physicskit/fluids/tests/test_vortex_dynamics.py +88 -0
  155. physicskit/fluids/utils/__init__.py +18 -0
  156. physicskit/fluids/utils/dimensionless.py +239 -0
  157. physicskit/fluids/utils/spectral_analysis.py +142 -0
  158. physicskit/fluids/visualizers/__init__.py +14 -0
  159. physicskit/fluids/visualizers/compressible.py +39 -0
  160. physicskit/fluids/visualizers/flow_fields.py +252 -0
  161. physicskit/fluids/visualizers/potential_flow.py +51 -0
  162. physicskit/fluids/visualizers/spectra.py +62 -0
  163. physicskit/fluids/visualizers/theme.py +38 -0
  164. physicskit/integrators/__init__.py +52 -0
  165. physicskit/integrators/adaptive.py +199 -0
  166. physicskit/integrators/fixed_step.py +360 -0
  167. physicskit/integrators/tests/__init__.py +0 -0
  168. physicskit/integrators/tests/test_integrators.py +101 -0
  169. physicskit/optics/__init__.py +124 -0
  170. physicskit/optics/_compat.py +5 -0
  171. physicskit/optics/gaussian.py +382 -0
  172. physicskit/optics/quantum_optics.py +428 -0
  173. physicskit/optics/ray.py +469 -0
  174. physicskit/optics/tests/__init__.py +0 -0
  175. physicskit/optics/tests/test_diffraction_animation.py +38 -0
  176. physicskit/optics/tests/test_gaussian.py +170 -0
  177. physicskit/optics/tests/test_quantum_optics.py +147 -0
  178. physicskit/optics/tests/test_ray.py +177 -0
  179. physicskit/optics/tests/test_visualizers.py +58 -0
  180. physicskit/optics/tests/test_wave.py +146 -0
  181. physicskit/optics/visualizers.py +264 -0
  182. physicskit/optics/wave.py +365 -0
  183. physicskit/particle/__init__.py +152 -0
  184. physicskit/particle/collider.py +382 -0
  185. physicskit/particle/confinement.py +125 -0
  186. physicskit/particle/decays.py +357 -0
  187. physicskit/particle/electroweak.py +300 -0
  188. physicskit/particle/kinematics.py +271 -0
  189. physicskit/particle/neutrinos.py +84 -0
  190. physicskit/particle/nuclear.py +100 -0
  191. physicskit/particle/scattering.py +159 -0
  192. physicskit/particle/tests/__init__.py +0 -0
  193. physicskit/particle/tests/conftest.py +7 -0
  194. physicskit/particle/tests/test_collider.py +119 -0
  195. physicskit/particle/tests/test_confinement.py +42 -0
  196. physicskit/particle/tests/test_decays.py +112 -0
  197. physicskit/particle/tests/test_electroweak.py +97 -0
  198. physicskit/particle/tests/test_kinematics.py +138 -0
  199. physicskit/particle/tests/test_neutrinos.py +36 -0
  200. physicskit/particle/tests/test_nuclear.py +45 -0
  201. physicskit/particle/tests/test_scattering.py +64 -0
  202. physicskit/particle/tests/test_visualizers.py +214 -0
  203. physicskit/particle/visualizers/__init__.py +38 -0
  204. physicskit/particle/visualizers/animations.py +705 -0
  205. physicskit/particle/visualizers/static.py +101 -0
  206. physicskit/plasma/__init__.py +176 -0
  207. physicskit/plasma/acceleration.py +152 -0
  208. physicskit/plasma/instabilities.py +417 -0
  209. physicskit/plasma/kinetic.py +588 -0
  210. physicskit/plasma/mhd.py +463 -0
  211. physicskit/plasma/single_particle.py +562 -0
  212. physicskit/plasma/tests/__init__.py +0 -0
  213. physicskit/plasma/tests/conftest.py +7 -0
  214. physicskit/plasma/tests/test_new_time_domain_features.py +222 -0
  215. physicskit/plasma/tests/test_plasma.py +232 -0
  216. physicskit/plasma/tests/test_visualizers.py +79 -0
  217. physicskit/plasma/turbulence.py +219 -0
  218. physicskit/plasma/visualizers.py +868 -0
  219. physicskit/plasma/waves.py +549 -0
  220. physicskit/quantum/__init__.py +180 -0
  221. physicskit/quantum/_compat.py +20 -0
  222. physicskit/quantum/chapters/__init__.py +0 -0
  223. physicskit/quantum/chapters/entanglement.py +489 -0
  224. physicskit/quantum/chapters/harmonic_spin.py +517 -0
  225. physicskit/quantum/chapters/hydrogen_am.py +292 -0
  226. physicskit/quantum/chapters/perturbation.py +350 -0
  227. physicskit/quantum/chapters/potentials.py +997 -0
  228. physicskit/quantum/chapters/spin.py +306 -0
  229. physicskit/quantum/chapters/wave_packets.py +541 -0
  230. physicskit/quantum/core/__init__.py +0 -0
  231. physicskit/quantum/core/eigensolvers.py +311 -0
  232. physicskit/quantum/core/operators.py +296 -0
  233. physicskit/quantum/core/solvers.py +271 -0
  234. physicskit/quantum/tests/__init__.py +0 -0
  235. physicskit/quantum/tests/conftest.py +7 -0
  236. physicskit/quantum/tests/test_animations.py +225 -0
  237. physicskit/quantum/tests/test_compat.py +43 -0
  238. physicskit/quantum/tests/test_eigensolvers.py +24 -0
  239. physicskit/quantum/tests/test_entanglement.py +127 -0
  240. physicskit/quantum/tests/test_harmonic_spin.py +140 -0
  241. physicskit/quantum/tests/test_hydrogen_am.py +48 -0
  242. physicskit/quantum/tests/test_measure.py +110 -0
  243. physicskit/quantum/tests/test_operators.py +105 -0
  244. physicskit/quantum/tests/test_perturbation.py +112 -0
  245. physicskit/quantum/tests/test_physics_checks.py +131 -0
  246. physicskit/quantum/tests/test_potentials.py +191 -0
  247. physicskit/quantum/tests/test_solvers.py +70 -0
  248. physicskit/quantum/tests/test_spin.py +22 -0
  249. physicskit/quantum/tests/test_unitarity.py +84 -0
  250. physicskit/quantum/tests/test_wave_packets.py +53 -0
  251. physicskit/quantum/utils/__init__.py +0 -0
  252. physicskit/quantum/utils/measure.py +253 -0
  253. physicskit/quantum/visualizers/__init__.py +0 -0
  254. physicskit/quantum/visualizers/bloch_sphere.py +205 -0
  255. physicskit/quantum/visualizers/entanglement.py +58 -0
  256. physicskit/quantum/visualizers/orbitals.py +187 -0
  257. physicskit/quantum/visualizers/phase_space.py +179 -0
  258. physicskit/quantum/visualizers/wavefunctions.py +230 -0
  259. physicskit/relativity/__init__.py +61 -0
  260. physicskit/relativity/chapters/__init__.py +33 -0
  261. physicskit/relativity/chapters/cosmology.py +190 -0
  262. physicskit/relativity/chapters/gw_merger.py +399 -0
  263. physicskit/relativity/chapters/kerr.py +371 -0
  264. physicskit/relativity/chapters/lensing.py +196 -0
  265. physicskit/relativity/chapters/neutron_star.py +149 -0
  266. physicskit/relativity/chapters/schwarzschild.py +412 -0
  267. physicskit/relativity/chapters/timekeeping.py +133 -0
  268. physicskit/relativity/core/__init__.py +12 -0
  269. physicskit/relativity/core/geodesics.py +216 -0
  270. physicskit/relativity/core/kerr_raytracer.py +259 -0
  271. physicskit/relativity/core/raytracer.py +241 -0
  272. physicskit/relativity/core/tensors.py +468 -0
  273. physicskit/relativity/tests/__init__.py +0 -0
  274. physicskit/relativity/tests/test_conservations.py +54 -0
  275. physicskit/relativity/tests/test_constants.py +34 -0
  276. physicskit/relativity/tests/test_cosmology.py +61 -0
  277. physicskit/relativity/tests/test_gw_merger.py +117 -0
  278. physicskit/relativity/tests/test_kerr.py +116 -0
  279. physicskit/relativity/tests/test_kerr_raytracer.py +103 -0
  280. physicskit/relativity/tests/test_lensing.py +75 -0
  281. physicskit/relativity/tests/test_neutron_star.py +48 -0
  282. physicskit/relativity/tests/test_raytracer.py +67 -0
  283. physicskit/relativity/tests/test_schwarzschild.py +126 -0
  284. physicskit/relativity/tests/test_shadow_render.py +81 -0
  285. physicskit/relativity/tests/test_tensors.py +86 -0
  286. physicskit/relativity/tests/test_timekeeping.py +51 -0
  287. physicskit/relativity/tests/test_visualizers_misc.py +115 -0
  288. physicskit/relativity/utils/__init__.py +1 -0
  289. physicskit/relativity/utils/constants.py +232 -0
  290. physicskit/relativity/visualizers/__init__.py +46 -0
  291. physicskit/relativity/visualizers/interactive.py +127 -0
  292. physicskit/relativity/visualizers/shadow_render.py +367 -0
  293. physicskit/relativity/visualizers/spacetime_3d.py +92 -0
  294. physicskit/relativity/visualizers/spacetime_diagrams.py +198 -0
  295. physicskit/relativity/visualizers/wave_plots.py +185 -0
  296. physicskit/rmt/__init__.py +8 -0
  297. physicskit/rmt/ensembles/__init__.py +108 -0
  298. physicskit/rmt/ensembles/banded.py +114 -0
  299. physicskit/rmt/ensembles/base.py +135 -0
  300. physicskit/rmt/ensembles/bdg.py +218 -0
  301. physicskit/rmt/ensembles/chiral.py +308 -0
  302. physicskit/rmt/ensembles/circular.py +104 -0
  303. physicskit/rmt/ensembles/crossover.py +82 -0
  304. physicskit/rmt/ensembles/density_matrix.py +148 -0
  305. physicskit/rmt/ensembles/effective_hamiltonian.py +230 -0
  306. physicskit/rmt/ensembles/embedded.py +207 -0
  307. physicskit/rmt/ensembles/gaussian.py +153 -0
  308. physicskit/rmt/ensembles/ginibre.py +110 -0
  309. physicskit/rmt/ensembles/girko.py +190 -0
  310. physicskit/rmt/ensembles/graph_laplacian.py +92 -0
  311. physicskit/rmt/ensembles/haar.py +57 -0
  312. physicskit/rmt/ensembles/jacobi.py +182 -0
  313. physicskit/rmt/ensembles/poisson.py +77 -0
  314. physicskit/rmt/ensembles/polynomial.py +139 -0
  315. physicskit/rmt/ensembles/pt_symmetric.py +120 -0
  316. physicskit/rmt/ensembles/single_ring.py +170 -0
  317. physicskit/rmt/ensembles/sparse.py +95 -0
  318. physicskit/rmt/ensembles/syk.py +170 -0
  319. physicskit/rmt/ensembles/truncated_unitary.py +80 -0
  320. physicskit/rmt/ensembles/universality.py +92 -0
  321. physicskit/rmt/ensembles/wishart.py +88 -0
  322. physicskit/rmt/py.typed +0 -0
  323. physicskit/rmt/spectrum.py +82 -0
  324. physicskit/rmt/stats/__init__.py +160 -0
  325. physicskit/rmt/stats/characteristic_polynomial.py +77 -0
  326. physicskit/rmt/stats/circular_law.py +54 -0
  327. physicskit/rmt/stats/correlations.py +162 -0
  328. physicskit/rmt/stats/density.py +70 -0
  329. physicskit/rmt/stats/entanglement.py +36 -0
  330. physicskit/rmt/stats/free_probability.py +202 -0
  331. physicskit/rmt/stats/localization.py +338 -0
  332. physicskit/rmt/stats/marchenko_pastur.py +55 -0
  333. physicskit/rmt/stats/pt_symmetric.py +265 -0
  334. physicskit/rmt/stats/ratios.py +110 -0
  335. physicskit/rmt/stats/real_ginibre.py +134 -0
  336. physicskit/rmt/stats/rigidity.py +272 -0
  337. physicskit/rmt/stats/single_ring.py +95 -0
  338. physicskit/rmt/stats/spacing.py +150 -0
  339. physicskit/rmt/stats/tracy_widom.py +175 -0
  340. physicskit/rmt/stats/truncated_unitary.py +40 -0
  341. physicskit/rmt/stats/unfolding.py +37 -0
  342. physicskit/rmt/stats/wachter.py +67 -0
  343. physicskit/rmt/tests/__init__.py +0 -0
  344. physicskit/rmt/tests/cache_utils.py +107 -0
  345. physicskit/rmt/tests/conftest.py +8 -0
  346. physicskit/rmt/tests/test_banded.py +86 -0
  347. physicskit/rmt/tests/test_base.py +29 -0
  348. physicskit/rmt/tests/test_bdg.py +133 -0
  349. physicskit/rmt/tests/test_characteristic_polynomial.py +50 -0
  350. physicskit/rmt/tests/test_chiral.py +273 -0
  351. physicskit/rmt/tests/test_circular.py +225 -0
  352. physicskit/rmt/tests/test_crossover.py +72 -0
  353. physicskit/rmt/tests/test_density.py +23 -0
  354. physicskit/rmt/tests/test_density_matrix.py +181 -0
  355. physicskit/rmt/tests/test_effective_hamiltonian.py +140 -0
  356. physicskit/rmt/tests/test_embedded.py +169 -0
  357. physicskit/rmt/tests/test_free_probability.py +81 -0
  358. physicskit/rmt/tests/test_gaussian_ensembles.py +22 -0
  359. physicskit/rmt/tests/test_gaussian_semicircle.py +127 -0
  360. physicskit/rmt/tests/test_ginibre_circular_law.py +131 -0
  361. physicskit/rmt/tests/test_girko.py +178 -0
  362. physicskit/rmt/tests/test_graph_laplacian.py +102 -0
  363. physicskit/rmt/tests/test_haar.py +118 -0
  364. physicskit/rmt/tests/test_jacobi_wachter.py +136 -0
  365. physicskit/rmt/tests/test_localization.py +240 -0
  366. physicskit/rmt/tests/test_poisson.py +149 -0
  367. physicskit/rmt/tests/test_polynomial.py +107 -0
  368. physicskit/rmt/tests/test_pt_symmetric.py +178 -0
  369. physicskit/rmt/tests/test_random_state.py +19 -0
  370. physicskit/rmt/tests/test_real_ginibre.py +112 -0
  371. physicskit/rmt/tests/test_rigidity_universality.py +167 -0
  372. physicskit/rmt/tests/test_single_ring.py +132 -0
  373. physicskit/rmt/tests/test_spacing_and_ratios.py +122 -0
  374. physicskit/rmt/tests/test_sparse.py +71 -0
  375. physicskit/rmt/tests/test_spectrum.py +27 -0
  376. physicskit/rmt/tests/test_syk.py +136 -0
  377. physicskit/rmt/tests/test_tracy_widom.py +113 -0
  378. physicskit/rmt/tests/test_tridiagonal.py +41 -0
  379. physicskit/rmt/tests/test_truncated_unitary.py +80 -0
  380. physicskit/rmt/tests/test_validation_base.py +25 -0
  381. physicskit/rmt/tests/test_validation_misc.py +67 -0
  382. physicskit/rmt/tests/test_wishart_marchenko_pastur.py +120 -0
  383. physicskit/rmt/utils/__init__.py +0 -0
  384. physicskit/rmt/utils/haar.py +128 -0
  385. physicskit/rmt/utils/random_state.py +24 -0
  386. physicskit/rmt/utils/tridiagonal.py +167 -0
  387. physicskit/rmt/validation/__init__.py +36 -0
  388. physicskit/rmt/validation/base.py +126 -0
  389. physicskit/rmt/validation/circular_law.py +80 -0
  390. physicskit/rmt/validation/marchenko_pastur.py +53 -0
  391. physicskit/rmt/validation/ratio_distribution.py +53 -0
  392. physicskit/rmt/validation/real_ginibre.py +60 -0
  393. physicskit/rmt/validation/sine_kernel.py +57 -0
  394. physicskit/rmt/validation/single_ring.py +68 -0
  395. physicskit/rmt/validation/tracy_widom.py +89 -0
  396. physicskit/rmt/validation/universality.py +100 -0
  397. physicskit/rmt/validation/wachter.py +52 -0
  398. physicskit/rmt/validation/wigner_semicircle.py +40 -0
  399. physicskit/rmt/validation/wigner_surmise.py +58 -0
  400. physicskit/semiclassical/__init__.py +94 -0
  401. physicskit/semiclassical/_compat.py +5 -0
  402. physicskit/semiclassical/core/__init__.py +41 -0
  403. physicskit/semiclassical/core/gutzwiller.py +215 -0
  404. physicskit/semiclassical/core/path_integral.py +594 -0
  405. physicskit/semiclassical/core/propagators.py +579 -0
  406. physicskit/semiclassical/core/wkb.py +308 -0
  407. physicskit/semiclassical/systems/__init__.py +13 -0
  408. physicskit/semiclassical/systems/scarring.py +278 -0
  409. physicskit/semiclassical/tests/__init__.py +0 -0
  410. physicskit/semiclassical/tests/test_gutzwiller.py +35 -0
  411. physicskit/semiclassical/tests/test_path_integral.py +194 -0
  412. physicskit/semiclassical/tests/test_propagators.py +82 -0
  413. physicskit/semiclassical/tests/test_scarring.py +43 -0
  414. physicskit/semiclassical/tests/test_visualizers.py +89 -0
  415. physicskit/semiclassical/tests/test_wkb.py +30 -0
  416. physicskit/semiclassical/visualizers/__init__.py +17 -0
  417. physicskit/semiclassical/visualizers/gutzwiller.py +55 -0
  418. physicskit/semiclassical/visualizers/path_integral.py +195 -0
  419. physicskit/semiclassical/visualizers/propagators.py +89 -0
  420. physicskit/semiclassical/visualizers/scarring.py +146 -0
  421. physicskit/semiclassical/visualizers/wkb.py +55 -0
  422. physicskit/statphys/__init__.py +80 -0
  423. physicskit/statphys/chapters/__init__.py +43 -0
  424. physicskit/statphys/chapters/ehrenfest_urn.py +112 -0
  425. physicskit/statphys/chapters/ising_lattice.py +431 -0
  426. physicskit/statphys/chapters/kpz_growth.py +129 -0
  427. physicskit/statphys/chapters/molecular_dynamics.py +258 -0
  428. physicskit/statphys/chapters/nonequilibrium_work.py +146 -0
  429. physicskit/statphys/chapters/percolation.py +305 -0
  430. physicskit/statphys/chapters/random_walk.py +142 -0
  431. physicskit/statphys/chapters/renormalization.py +148 -0
  432. physicskit/statphys/chapters/sandpile.py +109 -0
  433. physicskit/statphys/chapters/spin_glass.py +275 -0
  434. physicskit/statphys/core/__init__.py +10 -0
  435. physicskit/statphys/core/kpz_engine.py +53 -0
  436. physicskit/statphys/core/md_engine.py +157 -0
  437. physicskit/statphys/core/monte_carlo.py +462 -0
  438. physicskit/statphys/core/random_walk_engine.py +68 -0
  439. physicskit/statphys/core/sandpile_engine.py +52 -0
  440. physicskit/statphys/tests/__init__.py +0 -0
  441. physicskit/statphys/tests/test_dynamics.py +66 -0
  442. physicskit/statphys/tests/test_ehrenfest_urn.py +44 -0
  443. physicskit/statphys/tests/test_finite_size_scaling.py +62 -0
  444. physicskit/statphys/tests/test_interactive.py +33 -0
  445. physicskit/statphys/tests/test_ising.py +68 -0
  446. physicskit/statphys/tests/test_kpz.py +55 -0
  447. physicskit/statphys/tests/test_landau_theory.py +49 -0
  448. physicskit/statphys/tests/test_md_engine.py +31 -0
  449. physicskit/statphys/tests/test_molecular_dynamics.py +72 -0
  450. physicskit/statphys/tests/test_nonequilibrium_work.py +33 -0
  451. physicskit/statphys/tests/test_partition_function.py +26 -0
  452. physicskit/statphys/tests/test_percolation.py +116 -0
  453. physicskit/statphys/tests/test_potts_model.py +46 -0
  454. physicskit/statphys/tests/test_random_walk.py +50 -0
  455. physicskit/statphys/tests/test_renormalization.py +44 -0
  456. physicskit/statphys/tests/test_sandpile.py +44 -0
  457. physicskit/statphys/tests/test_spin_glass.py +73 -0
  458. physicskit/statphys/tests/test_thermodynamics.py +121 -0
  459. physicskit/statphys/tests/test_xy_model.py +45 -0
  460. physicskit/statphys/utils/__init__.py +1 -0
  461. physicskit/statphys/utils/dynamics.py +100 -0
  462. physicskit/statphys/utils/finite_size_scaling.py +171 -0
  463. physicskit/statphys/utils/landau_theory.py +151 -0
  464. physicskit/statphys/utils/partition_function.py +109 -0
  465. physicskit/statphys/utils/thermodynamics.py +356 -0
  466. physicskit/statphys/visualizers/__init__.py +87 -0
  467. physicskit/statphys/visualizers/interactive.py +161 -0
  468. physicskit/statphys/visualizers/jarzynski_render.py +44 -0
  469. physicskit/statphys/visualizers/kpz_render.py +65 -0
  470. physicskit/statphys/visualizers/lattice_render.py +212 -0
  471. physicskit/statphys/visualizers/particle_render.py +121 -0
  472. physicskit/statphys/visualizers/random_walk_render.py +106 -0
  473. physicskit/statphys/visualizers/rg_render.py +45 -0
  474. physicskit/statphys/visualizers/sandpile_render.py +65 -0
  475. physicskit/statphys/visualizers/spin_glass_render.py +40 -0
  476. physicskit/statphys/visualizers/urn_render.py +38 -0
  477. physicskit/statphys/visualizers/vortex_render.py +84 -0
  478. physicskit/tests/__init__.py +0 -0
  479. physicskit/tests/test_constants.py +38 -0
  480. physicskit-0.1.0.dist-info/METADATA +196 -0
  481. physicskit-0.1.0.dist-info/RECORD +484 -0
  482. physicskit-0.1.0.dist-info/WHEEL +5 -0
  483. physicskit-0.1.0.dist-info/licenses/LICENSE +21 -0
  484. physicskit-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,627 @@
1
+ """Canonical condensed-matter lattice models: SSH, graphene, Haldane, Kane-Mele, BHZ, Kitaev chain.
2
+
3
+ All 2D Bloch Hamiltonians in this module are functions of the *reduced*
4
+ crystal momentum ``(k1, k2)`` described in :mod:`physicskit.condensed.tight_binding`
5
+ (periodic gauge, each component periodic on :math:`[0, 2\\pi)`), which is the
6
+ convention expected by :func:`physicskit.condensed.topology.compute_chern_number`.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import numpy as np
12
+
13
+ from .tight_binding import Hamiltonian, Lattice
14
+
15
+ __all__ = [
16
+ "ssh_hamiltonian",
17
+ "ssh_lattice_hamiltonian",
18
+ "graphene_hamiltonian",
19
+ "graphene_lattice_hamiltonian",
20
+ "haldane_model",
21
+ "haldane_lattice_hamiltonian",
22
+ "kane_mele_hamiltonian",
23
+ "bhz_hamiltonian",
24
+ "bhz_ribbon_hamiltonian",
25
+ "kitaev_chain_hamiltonian",
26
+ "kitaev_chain_bdg_real_space",
27
+ "harper_hofstadter_hamiltonian",
28
+ ]
29
+
30
+ _SIGMA_X = np.array([[0, 1], [1, 0]], dtype=complex)
31
+ _SIGMA_Y = np.array([[0, -1j], [1j, 0]], dtype=complex)
32
+ _SIGMA_Z = np.array([[1, 0], [0, -1]], dtype=complex)
33
+ _SIGMA_0 = np.eye(2, dtype=complex)
34
+
35
+
36
+ # -- SSH ---------------------------------------------------------------------
37
+
38
+
39
+ def ssh_hamiltonian(k: float, v: float = 1.0, w: float = 1.0) -> np.ndarray:
40
+ """Bloch Hamiltonian of the Su-Schrieffer-Heeger (SSH) dimerized chain.
41
+
42
+ Parameters
43
+ ----------
44
+ k : float
45
+ Reduced crystal momentum, periodic on :math:`[0, 2\\pi)`.
46
+ v : float, default=1.0
47
+ Intracell hopping amplitude.
48
+ w : float, default=1.0
49
+ Intercell hopping amplitude.
50
+
51
+ Returns
52
+ -------
53
+ ndarray, shape (2, 2)
54
+ Bloch Hamiltonian :math:`H(k) = \\begin{pmatrix}0 & v+we^{-ik}\\\\ v+we^{ik} & 0\\end{pmatrix}`.
55
+
56
+ Notes
57
+ -----
58
+ The chain is topologically nontrivial (hosts protected zero-energy edge
59
+ states under open boundary conditions) when :math:`v < w`, and trivial
60
+ when :math:`v > w`. See Also :func:`ssh_lattice_hamiltonian` for the
61
+ real-space builder used to expose those edge states.
62
+
63
+ Examples
64
+ --------
65
+ >>> import numpy as np
66
+ >>> H = ssh_hamiltonian(k=0.0, v=0.5, w=1.0)
67
+ >>> np.round(np.linalg.eigvalsh(H), 8)
68
+ array([-1.5, 1.5])
69
+ """
70
+ f = v + w * np.exp(-1j * k)
71
+ return np.array([[0, f], [np.conj(f), 0]], dtype=complex)
72
+
73
+
74
+ def ssh_lattice_hamiltonian(v: float = 1.0, w: float = 1.0) -> Hamiltonian:
75
+ """Build the SSH chain as a :class:`~physicskit.condensed.tight_binding.Hamiltonian`.
76
+
77
+ Parameters
78
+ ----------
79
+ v : float, default=1.0
80
+ Intracell hopping amplitude (A-B bond within a unit cell).
81
+ w : float, default=1.0
82
+ Intercell hopping amplitude (B-A bond across the cell boundary).
83
+
84
+ Returns
85
+ -------
86
+ Hamiltonian
87
+ A two-orbital-per-cell chain, suitable for
88
+ :func:`~physicskit.condensed.tight_binding.build_ribbon` to expose
89
+ edge zero modes.
90
+
91
+ See Also
92
+ --------
93
+ ssh_hamiltonian : Closed-form 2x2 Bloch Hamiltonian equivalent to this builder.
94
+
95
+ Examples
96
+ --------
97
+ >>> import numpy as np
98
+ >>> H = ssh_lattice_hamiltonian(v=0.5, w=1.0)
99
+ >>> np.round(H.bands([0.0]), 8)
100
+ array([-1.5, 1.5])
101
+ """
102
+ lat = Lattice(lattice_vectors=[[1.0]], orbitals=[[0.0], [0.5]], labels=["A", "B"])
103
+ H = Hamiltonian(lat)
104
+ H.add_hopping(0, 1, (0,), v)
105
+ H.add_hopping(1, 0, (1,), w)
106
+ return H
107
+
108
+
109
+ # -- Graphene ------------------------------------------------------------
110
+
111
+
112
+ def graphene_lattice_hamiltonian(t: float = 1.0) -> Hamiltonian:
113
+ """Nearest-neighbor honeycomb (graphene) tight-binding Hamiltonian.
114
+
115
+ Parameters
116
+ ----------
117
+ t : float, default=1.0
118
+ Nearest-neighbor hopping amplitude.
119
+
120
+ Returns
121
+ -------
122
+ Hamiltonian
123
+
124
+ See Also
125
+ --------
126
+ graphene_hamiltonian : Closed-form 2x2 Bloch Hamiltonian equivalent to this builder.
127
+ """
128
+ lat = Lattice.honeycomb()
129
+ H = Hamiltonian(lat)
130
+ H.add_hopping(0, 1, (0, 0), t)
131
+ H.add_hopping(0, 1, (-1, 0), t)
132
+ H.add_hopping(0, 1, (0, -1), t)
133
+ return H
134
+
135
+
136
+ def graphene_hamiltonian(k1: float, k2: float, t: float = 1.0) -> np.ndarray:
137
+ """Bloch Hamiltonian of nearest-neighbor graphene (honeycomb lattice).
138
+
139
+ Parameters
140
+ ----------
141
+ k1, k2 : float
142
+ Reduced crystal momenta conjugate to the two honeycomb primitive
143
+ vectors, each periodic on :math:`[0, 2\\pi)`.
144
+ t : float, default=1.0
145
+ Nearest-neighbor hopping amplitude.
146
+
147
+ Returns
148
+ -------
149
+ ndarray, shape (2, 2)
150
+ Bloch Hamiltonian on the A/B sublattice basis.
151
+
152
+ Notes
153
+ -----
154
+ The Dirac points sit at :math:`(k_1, k_2) = (2\\pi/3, 4\\pi/3)` and its
155
+ time-reversed partner :math:`(4\\pi/3, 2\\pi/3)`, where the gap closes
156
+ and the dispersion is linear (massless Dirac cone), as verified in
157
+ the Examples.
158
+
159
+ Examples
160
+ --------
161
+ >>> import numpy as np
162
+ >>> K = np.array([2 * np.pi / 3, 4 * np.pi / 3])
163
+ >>> np.round(np.linalg.eigvalsh(graphene_hamiltonian(*K)), 8)
164
+ array([-0., 0.])
165
+ >>> eigs = np.linalg.eigvalsh(graphene_hamiltonian(*(K + [1e-4, 0])))
166
+ >>> round(float(eigs[1] / 1e-4), 4)
167
+ 1.0
168
+ """
169
+ return graphene_lattice_hamiltonian(t).bloch([k1, k2])
170
+
171
+
172
+ # -- Haldane -----------------------------------------------------------------
173
+
174
+
175
+ def haldane_lattice_hamiltonian(t: float = 1.0, t2: float = 0.2, phi: float = np.pi / 2, M: float = 0.0) -> Hamiltonian:
176
+ """Haldane model (quantum anomalous Hall) as a :class:`Hamiltonian`.
177
+
178
+ Parameters
179
+ ----------
180
+ t : float, default=1.0
181
+ Nearest-neighbor hopping amplitude.
182
+ t2 : float, default=0.2
183
+ Next-nearest-neighbor hopping magnitude.
184
+ phi : float, default=pi/2
185
+ Next-nearest-neighbor hopping phase, breaking time-reversal symmetry.
186
+ M : float, default=0.0
187
+ Sublattice (Semenoff) mass, breaking inversion symmetry.
188
+
189
+ Returns
190
+ -------
191
+ Hamiltonian
192
+
193
+ See Also
194
+ --------
195
+ haldane_model : Closed-form 2x2 Bloch Hamiltonian equivalent to this builder.
196
+ """
197
+ lat = Lattice.honeycomb()
198
+ H = Hamiltonian(lat, onsite=[-M, M])
199
+ H.add_hopping(0, 1, (0, 0), t)
200
+ H.add_hopping(0, 1, (-1, 0), t)
201
+ H.add_hopping(0, 1, (0, -1), t)
202
+ t2c = t2 * np.exp(1j * phi)
203
+ for R in [(1, 0), (0, -1), (-1, 1)]:
204
+ H.add_hopping(0, 0, R, t2c)
205
+ H.add_hopping(1, 1, R, np.conj(t2c))
206
+ return H
207
+
208
+
209
+ def haldane_model(kx: float, ky: float, t: float = 1.0, t2: float = 0.2, phi: float = np.pi / 2, M: float = 0.0) -> np.ndarray:
210
+ """Bloch Hamiltonian of the Haldane model on the honeycomb lattice.
211
+
212
+ The Haldane model realizes the quantum anomalous Hall effect: a Chern
213
+ insulator with zero *net* magnetic flux per unit cell, arising from a
214
+ complex next-nearest-neighbor hopping :math:`t_2 e^{i\\phi}` that breaks
215
+ time-reversal symmetry while preserving the lattice translational symmetry.
216
+
217
+ Parameters
218
+ ----------
219
+ kx, ky : float
220
+ Reduced crystal momenta (see :mod:`physicskit.condensed.tight_binding`),
221
+ each periodic on :math:`[0, 2\\pi)`.
222
+ t : float, default=1.0
223
+ Nearest-neighbor hopping amplitude.
224
+ t2 : float, default=0.2
225
+ Next-nearest-neighbor hopping magnitude.
226
+ phi : float, default=pi/2
227
+ Next-nearest-neighbor hopping phase.
228
+ M : float, default=0.0
229
+ Sublattice mass. The model is a Chern insulator
230
+ (:math:`C = \\mathrm{sgn}(\\sin\\phi)`) for :math:`|M| < 3\\sqrt{3}\\,t_2|\\sin\\phi|`,
231
+ and a trivial insulator otherwise.
232
+
233
+ Returns
234
+ -------
235
+ ndarray, shape (2, 2)
236
+
237
+ See Also
238
+ --------
239
+ physicskit.condensed.topology.compute_chern_number : Computes the Chern number of this model.
240
+
241
+ Examples
242
+ --------
243
+ >>> import numpy as np
244
+ >>> from physicskit.condensed.topology import compute_chern_number
245
+ >>> H_func = lambda k1, k2: haldane_model(k1, k2, t=1.0, t2=0.2, phi=np.pi / 2, M=0.0)
246
+ >>> compute_chern_number(H_func, grid_size=30)
247
+ [1, -1]
248
+ >>> H_trivial = lambda k1, k2: haldane_model(k1, k2, t=1.0, t2=0.2, phi=np.pi / 2, M=2.0)
249
+ >>> compute_chern_number(H_trivial, grid_size=30)
250
+ [0, 0]
251
+ """
252
+ return haldane_lattice_hamiltonian(t, t2, phi, M).bloch([kx, ky])
253
+
254
+
255
+ # -- Kane-Mele -----------------------------------------------------------
256
+
257
+
258
+ def kane_mele_hamiltonian(
259
+ kx: float,
260
+ ky: float,
261
+ t: float = 1.0,
262
+ lambda_so: float = 0.06,
263
+ lambda_v: float = 0.0,
264
+ lambda_r: float = 0.0,
265
+ ) -> np.ndarray:
266
+ """Bloch Hamiltonian of the Kane-Mele quantum spin Hall model.
267
+
268
+ Two time-reversed Haldane copies (intrinsic spin-orbit coupling with
269
+ opposite Chern-number-generating phase for each spin), realizing a
270
+ :math:`\\mathbb{Z}_2` topological insulator with helical edge states.
271
+ Basis order is ``(A up, B up, A down, B down)``.
272
+
273
+ Parameters
274
+ ----------
275
+ kx, ky : float
276
+ Reduced crystal momenta, each periodic on :math:`[0, 2\\pi)`.
277
+ t : float, default=1.0
278
+ Nearest-neighbor hopping amplitude.
279
+ lambda_so : float, default=0.06
280
+ Intrinsic spin-orbit coupling strength.
281
+ lambda_v : float, default=0.0
282
+ Sublattice (staggered) potential.
283
+ lambda_r : float, default=0.0
284
+ Rashba spin-orbit coupling strength. A nonzero value mixes the spin
285
+ blocks (breaking :math:`s_z` conservation) but preserves overall
286
+ time-reversal symmetry.
287
+
288
+ Returns
289
+ -------
290
+ ndarray, shape (4, 4)
291
+
292
+ Notes
293
+ -----
294
+ When ``lambda_r == 0``, :math:`s_z` is conserved and the Hamiltonian is
295
+ block-diagonal in spin; each block is a Haldane model with
296
+ :math:`t_2 = \\lambda_{so}`, :math:`\\phi = \\pm\\pi/2`. In that case the
297
+ :math:`\\mathbb{Z}_2` invariant equals the spin-up Chern number modulo 2
298
+ (see :func:`physicskit.condensed.topology.z2_invariant`).
299
+
300
+ Examples
301
+ --------
302
+ >>> import numpy as np
303
+ >>> H = kane_mele_hamiltonian(0.3, 0.7, lambda_so=0.06)
304
+ >>> np.allclose(H, H.conj().T)
305
+ True
306
+ >>> up = H[:2, :2]; down = H[2:, 2:]
307
+ >>> down_expected = kane_mele_hamiltonian(0.3, 0.7, lambda_so=0.06)[2:, 2:]
308
+ >>> np.allclose(down, down_expected)
309
+ True
310
+ """
311
+ H_up = haldane_lattice_hamiltonian(t=t, t2=lambda_so, phi=np.pi / 2, M=lambda_v).bloch([kx, ky])
312
+ H_down = haldane_lattice_hamiltonian(t=t, t2=lambda_so, phi=-np.pi / 2, M=lambda_v).bloch([kx, ky])
313
+ H = np.zeros((4, 4), dtype=complex)
314
+ H[:2, :2] = H_up
315
+ H[2:, 2:] = H_down
316
+
317
+ if lambda_r != 0.0:
318
+ lat = Lattice.honeycomb()
319
+ orb_cart = lat.cartesian_orbitals()
320
+ bond_R = [(0, 0), (-1, 0), (0, -1)]
321
+ bond_vecs = []
322
+ for R in bond_R:
323
+ Rcart = np.array(R, dtype=float) @ lat.lattice_vectors
324
+ bond_vecs.append(orb_cart[1] + Rcart - orb_cart[0])
325
+ R_block = np.zeros((2, 2), dtype=complex)
326
+ for R, d in zip(bond_R, bond_vecs, strict=True):
327
+ d_hat = d / np.linalg.norm(d)
328
+ spin_mat = 1j * lambda_r * (_SIGMA_X * d_hat[1] - _SIGMA_Y * d_hat[0])
329
+ phase = np.exp(1j * (kx * R[0] + ky * R[1]))
330
+ R_block += spin_mat * phase
331
+ # Off-diagonal sublattice block (A up/down <-> B up/down), spin-mixing Rashba term.
332
+ H_AB = np.zeros((2, 2), dtype=complex)
333
+ H_AB[0, 0] = R_block[0, 0]
334
+ H_AB[1, 1] = R_block[1, 1]
335
+ H_AB[0, 1] = R_block[0, 1]
336
+ H_AB[1, 0] = R_block[1, 0]
337
+ H[0, 2] += H_AB[0, 0]
338
+ H[1, 3] += H_AB[1, 1]
339
+ H[0, 3] += H_AB[0, 1]
340
+ H[1, 2] += H_AB[1, 0]
341
+ H[2, 0] += np.conj(H_AB[0, 0])
342
+ H[3, 1] += np.conj(H_AB[1, 1])
343
+ H[3, 0] += np.conj(H_AB[0, 1])
344
+ H[2, 1] += np.conj(H_AB[1, 0])
345
+ return H
346
+
347
+
348
+ # -- BHZ -----------------------------------------------------------------
349
+
350
+
351
+ def bhz_hamiltonian(kx: float, ky: float, A: float = 1.0, B: float = 1.0, M: float = 1.0, D: float = 0.0) -> np.ndarray:
352
+ """Bloch Hamiltonian of the Bernevig-Hughes-Zhang (BHZ) model for HgTe quantum wells.
353
+
354
+ A minimal 4-band :math:`\\mathbb{Z}_2` topological insulator model,
355
+ block-diagonal in a time-reversed pair of 2x2 Dirac-like blocks. Basis
356
+ order is ``(E up, H up, E down, H down)``.
357
+
358
+ Parameters
359
+ ----------
360
+ kx, ky : float
361
+ Reduced crystal momenta, each periodic on :math:`[0, 2\\pi)`.
362
+ A, B : float, default=1.0
363
+ Model parameters controlling the Dirac velocity and quadratic
364
+ band curvature.
365
+ M : float, default=1.0
366
+ Band inversion mass. The model is topological (band-inverted) for
367
+ :math:`M/B > 0` and trivial for :math:`M/B < 0`.
368
+ D : float, default=0.0
369
+ Particle-hole asymmetry parameter.
370
+
371
+ Returns
372
+ -------
373
+ ndarray, shape (4, 4)
374
+
375
+ Examples
376
+ --------
377
+ >>> import numpy as np
378
+ >>> H = bhz_hamiltonian(0.1, -0.2, M=1.0, B=1.0)
379
+ >>> np.allclose(H, H.conj().T)
380
+ True
381
+ >>> np.allclose(H[:2, :2], H[2:, 2:].conj())
382
+ True
383
+ """
384
+ eps = -D * (2 - np.cos(kx) - np.cos(ky))
385
+ dx = A * np.sin(kx)
386
+ dy = A * np.sin(ky)
387
+ dz = M - 2 * B * (2 - np.cos(kx) - np.cos(ky))
388
+ h_up = eps * _SIGMA_0 + dx * _SIGMA_X + dy * _SIGMA_Y + dz * _SIGMA_Z
389
+ h_down = np.conj(h_up)
390
+ H = np.zeros((4, 4), dtype=complex)
391
+ H[:2, :2] = h_up
392
+ H[2:, 2:] = h_down
393
+ return H
394
+
395
+
396
+ def bhz_ribbon_hamiltonian(kx: float, n_cells: int, A: float = 1.0, B: float = 1.0, M: float = 1.0, D: float = 0.0) -> np.ndarray:
397
+ """Real-space BHZ ribbon: periodic along ``x``, open (finite) along ``y``.
398
+
399
+ Truncating the ``y`` direction exposes the pair of helical, spin-locked
400
+ edge states that make the BHZ model a quantum spin Hall insulator --
401
+ the effect Konig et al. (2007) measured directly in HgTe/CdTe quantum
402
+ wells, by two-terminal conductance quantized at :math:`2e^2/h`.
403
+
404
+ Parameters
405
+ ----------
406
+ kx : float
407
+ Reduced crystal momentum along the periodic (``x``) direction.
408
+ n_cells : int
409
+ Number of unit cells stacked along the open (``y``) direction.
410
+ A, B : float, default=1.0
411
+ Model parameters controlling the Dirac velocity and quadratic
412
+ band curvature (see :func:`bhz_hamiltonian`).
413
+ M : float, default=1.0
414
+ Band inversion mass. Topological (edge-state-carrying) for
415
+ :math:`M/B > 0`.
416
+ D : float, default=0.0
417
+ Particle-hole asymmetry parameter.
418
+
419
+ Returns
420
+ -------
421
+ ndarray, shape (4 * n_cells, 4 * n_cells)
422
+ Hermitian, open-boundary ribbon Hamiltonian, block-diagonal in the
423
+ ``(E up, H up)`` / ``(E down, H down)`` time-reversed sectors.
424
+
425
+ Examples
426
+ --------
427
+ In the topological regime (:math:`M/B > 0`), the ribbon has a pair of
428
+ near-zero-energy states crossing at :math:`k_x = 0` -- the helical edge
429
+ modes -- absent in the trivial regime (:math:`M/B < 0`):
430
+
431
+ >>> import numpy as np
432
+ >>> spectrum = np.linalg.eigvalsh(bhz_ribbon_hamiltonian(kx=0.0, n_cells=40, M=1.0, B=1.0))
433
+ >>> bool(np.any(np.abs(spectrum) < 1e-6))
434
+ True
435
+ >>> spectrum_trivial = np.linalg.eigvalsh(bhz_ribbon_hamiltonian(kx=0.0, n_cells=40, M=-1.0, B=1.0))
436
+ >>> bool(np.any(np.abs(spectrum_trivial) < 1e-6))
437
+ False
438
+ """
439
+ eps0 = -D * (2 - np.cos(kx))
440
+ dx = A * np.sin(kx)
441
+ dz0 = M - 2 * B * (2 - np.cos(kx))
442
+ onsite_up = eps0 * _SIGMA_0 + dx * _SIGMA_X + dz0 * _SIGMA_Z
443
+ onsite_down = onsite_up
444
+ hop_up = 0.5 * (D * _SIGMA_0 + 2 * B * _SIGMA_Z) - 0.5j * A * _SIGMA_Y
445
+ hop_down = hop_up.conj().T
446
+
447
+ N = n_cells
448
+ H = np.zeros((4 * N, 4 * N), dtype=complex)
449
+ for c in range(N):
450
+ H[4 * c : 4 * c + 2, 4 * c : 4 * c + 2] = onsite_up
451
+ H[4 * c + 2 : 4 * c + 4, 4 * c + 2 : 4 * c + 4] = onsite_down
452
+ for c in range(N - 1):
453
+ H[4 * c : 4 * c + 2, 4 * c + 4 : 4 * c + 6] = hop_up
454
+ H[4 * c + 4 : 4 * c + 6, 4 * c : 4 * c + 2] = hop_up.conj().T
455
+ H[4 * c + 2 : 4 * c + 4, 4 * c + 6 : 4 * c + 8] = hop_down
456
+ H[4 * c + 6 : 4 * c + 8, 4 * c + 2 : 4 * c + 4] = hop_down.conj().T
457
+ return H
458
+
459
+
460
+ # -- Kitaev chain --------------------------------------------------------
461
+
462
+
463
+ def kitaev_chain_hamiltonian(k: float, mu: float = 0.0, t: float = 1.0, delta: float = 1.0) -> np.ndarray:
464
+ """Bogoliubov-de Gennes Bloch Hamiltonian of the Kitaev p-wave superconducting chain.
465
+
466
+ Parameters
467
+ ----------
468
+ k : float
469
+ Reduced crystal momentum, periodic on :math:`[0, 2\\pi)`.
470
+ mu : float, default=0.0
471
+ Chemical potential.
472
+ t : float, default=1.0
473
+ Nearest-neighbor hopping amplitude.
474
+ delta : float, default=1.0
475
+ p-wave pairing amplitude.
476
+
477
+ Returns
478
+ -------
479
+ ndarray, shape (2, 2)
480
+ BdG Hamiltonian :math:`H(k) = \\xi(k)\\tau_z + \\Delta(k)\\tau_y` in the
481
+ Nambu basis, with :math:`\\xi(k) = -2t\\cos k - \\mu` and
482
+ :math:`\\Delta(k) = 2\\Delta\\sin k`.
483
+
484
+ Notes
485
+ -----
486
+ The chain is a topological superconductor, hosting unpaired Majorana
487
+ zero modes at the ends of an open chain, for :math:`|\\mu| < 2t`; it is
488
+ topologically trivial for :math:`|\\mu| > 2t`.
489
+
490
+ Examples
491
+ --------
492
+ >>> import numpy as np
493
+ >>> H = kitaev_chain_hamiltonian(k=np.pi / 2, mu=0.0, t=1.0, delta=1.0)
494
+ >>> np.round(np.linalg.eigvalsh(H), 8)
495
+ array([-2., 2.])
496
+ """
497
+ xi = -2 * t * np.cos(k) - mu
498
+ d = 2 * delta * np.sin(k)
499
+ return xi * _SIGMA_Z + d * _SIGMA_Y
500
+
501
+
502
+ def kitaev_chain_bdg_real_space(n_sites: int, mu: float = 0.0, t: float = 1.0, delta: float = 1.0) -> np.ndarray:
503
+ """Real-space open-boundary BdG Hamiltonian of the Kitaev chain.
504
+
505
+ Parameters
506
+ ----------
507
+ n_sites : int
508
+ Number of lattice sites in the finite, open chain.
509
+ mu : float, default=0.0
510
+ Chemical potential.
511
+ t : float, default=1.0
512
+ Nearest-neighbor hopping amplitude.
513
+ delta : float, default=1.0
514
+ p-wave pairing amplitude.
515
+
516
+ Returns
517
+ -------
518
+ ndarray, shape (2*n_sites, 2*n_sites)
519
+ BdG Hamiltonian in the Nambu basis
520
+ :math:`(c_1, \\dots, c_N, c_1^\\dagger, \\dots, c_N^\\dagger)`.
521
+
522
+ Examples
523
+ --------
524
+ In the topological phase (:math:`|\\mu| < 2t`), diagonalizing this matrix
525
+ yields a pair of near-zero-energy eigenvalues (Majorana end modes),
526
+ exponentially localized at the two ends of the chain:
527
+
528
+ >>> import numpy as np
529
+ >>> H = kitaev_chain_bdg_real_space(n_sites=60, mu=0.0, t=1.0, delta=1.0)
530
+ >>> eigs = np.linalg.eigvalsh(H)
531
+ >>> bool(np.abs(eigs[np.argmin(np.abs(eigs))]) < 1e-6)
532
+ True
533
+ """
534
+ N = n_sites
535
+ H = np.zeros((2 * N, 2 * N), dtype=complex)
536
+ for i in range(N):
537
+ H[i, i] = -mu
538
+ H[N + i, N + i] = mu
539
+ for i in range(N - 1):
540
+ H[i, i + 1] += -t
541
+ H[i + 1, i] += -t
542
+ H[N + i, N + i + 1] += t
543
+ H[N + i + 1, N + i] += t
544
+ H[i, N + i + 1] += delta
545
+ H[N + i + 1, i] += np.conj(delta)
546
+ H[i + 1, N + i] += -delta
547
+ H[N + i, i + 1] += -np.conj(delta)
548
+ return H
549
+
550
+
551
+ # -- Harper-Hofstadter --------------------------------------------------------
552
+
553
+
554
+ def harper_hofstadter_hamiltonian(k1: float, k2: float, p: int, q: int, t: float = 1.0) -> np.ndarray:
555
+ r"""Bloch Hamiltonian of the square-lattice Harper-Hofstadter model at flux ``p/q``.
556
+
557
+ A charged particle on a square lattice threaded by a uniform magnetic
558
+ flux :math:`p/q` (in units of the flux quantum) per plaquette, in
559
+ Landau gauge :math:`\mathbf{A} = (0, Bx)`. Translational symmetry along
560
+ ``x`` survives only in steps of ``q`` lattice constants, so the ``q``
561
+ inequivalent sublattice sites ``m = 0, ..., q-1`` within one magnetic
562
+ unit cell become an internal band index, coupled by
563
+
564
+ .. math::
565
+
566
+ H_{mm}(k_1, k_2) = -2t\cos\!\left(k_2 + 2\pi \frac{p}{q} m\right), \qquad
567
+ H_{m, m+1} = -t,
568
+
569
+ plus the boundary hopping :math:`H_{q-1, 0} = -t\,e^{ik_1}` that closes
570
+ the magnetic unit cell, with :math:`k_1` the reduced momentum conjugate
571
+ to translation by one magnetic cell (period :math:`q` sites) and
572
+ :math:`k_2` the ordinary reduced momentum along the unbroken direction.
573
+ This is the lattice (Bloch) route to the same physics as
574
+ :mod:`physicskit.condensed.landau_levels`, and, fed one band at a time
575
+ into :func:`~physicskit.condensed.topology.compute_chern_number`, the
576
+ standard numerical verification of the TKNN integer quantum Hall
577
+ formula: summing the Chern numbers of the lowest :math:`r` (non-touching)
578
+ bands gives the exactly quantized Hall conductance
579
+ :math:`\sigma_{xy} = C\,e^2/h` at the filling between band :math:`r` and
580
+ :math:`r+1`.
581
+
582
+ Parameters
583
+ ----------
584
+ k1, k2 : float
585
+ Reduced crystal momenta, each periodic on :math:`[0, 2\pi)`. ``k1``
586
+ is conjugate to the enlarged (``q``-site) magnetic unit cell.
587
+ p, q : int
588
+ Flux per plaquette :math:`p/q` (in lowest terms), :math:`0 < p < q`.
589
+ Odd ``q`` avoids the exact band touchings that occur for some even
590
+ ``q``, where individual-band Chern numbers become ill-defined.
591
+ t : float, default=1.0
592
+ Nearest-neighbor hopping amplitude.
593
+
594
+ Returns
595
+ -------
596
+ ndarray, shape (q, q)
597
+ Hermitian Bloch Hamiltonian.
598
+
599
+ See Also
600
+ --------
601
+ physicskit.condensed.topology.compute_chern_number : Chern number of each resulting band.
602
+
603
+ Examples
604
+ --------
605
+ At flux ``1/3`` the three bands carry Chern numbers ``-1, 2, -1``
606
+ (summing to zero, as any complete set of bands of a lattice Hamiltonian
607
+ must), so the Hall conductance is quantized to :math:`-1` and :math:`+1`
608
+ (in units of :math:`e^2/h`) at the two gaps:
609
+
610
+ >>> import numpy as np
611
+ >>> from physicskit.condensed.topology import compute_chern_number
612
+ >>> H_func = lambda k1, k2: harper_hofstadter_hamiltonian(k1, k2, p=1, q=3)
613
+ >>> chern_numbers = compute_chern_number(H_func, grid_size=30)
614
+ >>> chern_numbers
615
+ [-1, 2, -1]
616
+ >>> sum(chern_numbers)
617
+ 0
618
+ """
619
+ H = np.zeros((q, q), dtype=complex)
620
+ m = np.arange(q)
621
+ H[np.diag_indices(q)] = -2 * t * np.cos(k2 + 2 * np.pi * p * m / q)
622
+ for i in range(q - 1):
623
+ H[i, i + 1] = -t
624
+ H[i + 1, i] = -t
625
+ H[q - 1, 0] += -t * np.exp(1j * k1)
626
+ H[0, q - 1] += -t * np.exp(-1j * k1)
627
+ return H
File without changes