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,246 @@
1
+ r"""Landau levels: the 1930 quantization of a charged particle in a uniform magnetic field.
2
+
3
+ Lev Landau showed that the classically continuous cyclotron motion of a
4
+ charged particle in a uniform magnetic field :math:`B` quantizes into
5
+ discrete, macroscopically degenerate levels
6
+
7
+ .. math::
8
+
9
+ E_n = \hbar\omega_c\left(n+\tfrac12\right), \qquad \omega_c = \frac{eB}{m},
10
+ \qquad n = 0, 1, 2, \dots,
11
+
12
+ exactly the harmonic-oscillator spectrum, with :math:`\omega_c` set by the
13
+ field rather than a spring constant. Each level's macroscopic degeneracy per
14
+ unit area, :math:`n_B = 1/(2\pi \ell_B^2)` with magnetic length
15
+ :math:`\ell_B = \sqrt{\hbar/(eB)}`, is the microscopic origin of orbital
16
+ (Landau) diamagnetism, and -- once a 2D electron gas and disorder-broadened
17
+ levels are added -- the direct ancestor of the integer quantum Hall effect
18
+ (:mod:`physicskit.condensed.topology`) fifty years later.
19
+
20
+ Uses the same natural-unit convention (:math:`\hbar=e=1`) as the rest of
21
+ :mod:`physicskit.condensed`; pass ``m``, ``e``, and ``hbar`` explicitly to
22
+ work in physical units instead. See
23
+ :func:`physicskit.condensed.tight_binding.apply_peierls_phase` for the
24
+ lattice (Peierls-substitution) route to the same physics.
25
+ """
26
+
27
+ from __future__ import annotations
28
+
29
+ import numpy as np
30
+
31
+ __all__ = [
32
+ "cyclotron_frequency",
33
+ "magnetic_length",
34
+ "landau_level_energies",
35
+ "landau_degeneracy",
36
+ "landau_density_of_states",
37
+ "filling_factor",
38
+ ]
39
+
40
+
41
+ def cyclotron_frequency(B: float, m: float = 1.0, e: float = 1.0) -> float:
42
+ r"""Cyclotron frequency :math:`\omega_c = eB/m`.
43
+
44
+ Parameters
45
+ ----------
46
+ B : float
47
+ Magnetic field strength.
48
+ m : float, default=1.0
49
+ Particle mass.
50
+ e : float, default=1.0
51
+ Particle charge magnitude.
52
+
53
+ Returns
54
+ -------
55
+ float
56
+
57
+ Examples
58
+ --------
59
+ >>> cyclotron_frequency(B=2.0, m=0.5)
60
+ 4.0
61
+ """
62
+ return e * B / m
63
+
64
+
65
+ def magnetic_length(B: float, hbar: float = 1.0, e: float = 1.0) -> float:
66
+ r"""Magnetic length :math:`\ell_B = \sqrt{\hbar/(eB)}`.
67
+
68
+ The natural length scale of the lowest Landau level's cyclotron orbit.
69
+
70
+ Parameters
71
+ ----------
72
+ B : float
73
+ Magnetic field strength.
74
+ hbar : float, default=1.0
75
+ Reduced Planck constant.
76
+ e : float, default=1.0
77
+ Particle charge magnitude.
78
+
79
+ Returns
80
+ -------
81
+ float
82
+
83
+ Examples
84
+ --------
85
+ >>> magnetic_length(B=1.0)
86
+ 1.0
87
+ >>> round(magnetic_length(B=4.0), 4)
88
+ 0.5
89
+ """
90
+ return float(np.sqrt(hbar / (e * B)))
91
+
92
+
93
+ def landau_level_energies(n_max: int, B: float, m: float = 1.0, e: float = 1.0, hbar: float = 1.0) -> np.ndarray:
94
+ r"""Landau energy levels :math:`E_n = \hbar\omega_c(n+\tfrac12)` for :math:`n=0,\dots,n_{max}`.
95
+
96
+ Parameters
97
+ ----------
98
+ n_max : int
99
+ Highest Landau index to include.
100
+ B : float
101
+ Magnetic field strength.
102
+ m : float, default=1.0
103
+ Particle mass.
104
+ e : float, default=1.0
105
+ Particle charge magnitude.
106
+ hbar : float, default=1.0
107
+ Reduced Planck constant.
108
+
109
+ Returns
110
+ -------
111
+ ndarray, shape (n_max + 1,)
112
+ Equally spaced energies :math:`E_0 < E_1 < \dots < E_{n_{max}}`,
113
+ spacing :math:`\hbar\omega_c`.
114
+
115
+ See Also
116
+ --------
117
+ landau_degeneracy : Number of degenerate single-particle states per level.
118
+
119
+ Examples
120
+ --------
121
+ >>> landau_level_energies(n_max=2, B=1.0)
122
+ array([0.5, 1.5, 2.5])
123
+ """
124
+ omega_c = cyclotron_frequency(B, m, e)
125
+ n = np.arange(n_max + 1)
126
+ return hbar * omega_c * (n + 0.5)
127
+
128
+
129
+ def landau_degeneracy(area: float, B: float, hbar: float = 1.0, e: float = 1.0) -> float:
130
+ r"""Number of degenerate single-particle states per Landau level.
131
+
132
+ Each Landau level holds :math:`n_B \cdot \text{area}` states, where
133
+ :math:`n_B = 1/(2\pi\ell_B^2) = eB/(2\pi\hbar) = B/\Phi_0` is one state
134
+ per flux quantum :math:`\Phi_0 = 2\pi\hbar/e` threading the sample --
135
+ the origin of the macroscopic degeneracy behind Landau diamagnetism.
136
+
137
+ Parameters
138
+ ----------
139
+ area : float
140
+ Real-space sample area.
141
+ B : float
142
+ Magnetic field strength.
143
+ hbar : float, default=1.0
144
+ Reduced Planck constant.
145
+ e : float, default=1.0
146
+ Particle charge magnitude.
147
+
148
+ Returns
149
+ -------
150
+ float
151
+
152
+ Examples
153
+ --------
154
+ >>> landau_degeneracy(area=2 * np.pi, B=1.0)
155
+ 1.0
156
+ """
157
+ l_B = magnetic_length(B, hbar, e)
158
+ return float(area / (2 * np.pi * l_B**2))
159
+
160
+
161
+ def landau_density_of_states(
162
+ energies,
163
+ B: float,
164
+ m: float = 1.0,
165
+ e: float = 1.0,
166
+ hbar: float = 1.0,
167
+ n_max: int = 20,
168
+ broadening: float = 0.05,
169
+ ) -> np.ndarray:
170
+ r"""Disorder-broadened density of states per unit area.
171
+
172
+ Replaces each infinitely sharp level
173
+ :math:`n_B\,\delta(E - E_n)` with a Gaussian of width ``broadening``,
174
+ the standard phenomenological model for the disorder- or
175
+ finite-lifetime-broadened Landau levels seen in a real 2D electron gas
176
+ (and needed to have a finite conductivity between the exactly quantized
177
+ Hall plateaus).
178
+
179
+ Parameters
180
+ ----------
181
+ energies : array_like
182
+ Energies at which to evaluate the density of states.
183
+ B : float
184
+ Magnetic field strength.
185
+ m : float, default=1.0
186
+ Particle mass.
187
+ e : float, default=1.0
188
+ Particle charge magnitude.
189
+ hbar : float, default=1.0
190
+ Reduced Planck constant.
191
+ n_max : int, default=20
192
+ Highest Landau index included in the sum.
193
+ broadening : float, default=0.05
194
+ Gaussian standard deviation of each broadened level.
195
+
196
+ Returns
197
+ -------
198
+ ndarray
199
+ Density of states per unit area, same shape as ``energies``.
200
+
201
+ Examples
202
+ --------
203
+ >>> dos = landau_density_of_states([0.5], B=1.0, n_max=0, broadening=0.1)
204
+ >>> round(float(dos[0]), 4)
205
+ 0.6349
206
+ """
207
+ energies = np.atleast_1d(np.asarray(energies, dtype=float))
208
+ E_n = landau_level_energies(n_max, B, m, e, hbar)
209
+ per_level = landau_degeneracy(1.0, B, hbar, e)
210
+ norm = 1.0 / (broadening * np.sqrt(2 * np.pi))
211
+ dos = np.zeros_like(energies)
212
+ for En in E_n:
213
+ dos += per_level * norm * np.exp(-0.5 * ((energies - En) / broadening) ** 2)
214
+ return dos
215
+
216
+
217
+ def filling_factor(density: float, B: float, hbar: float = 1.0, e: float = 1.0) -> float:
218
+ r"""Landau-level filling factor :math:`\nu = n_e / n_B = n_e h/(eB)`.
219
+
220
+ The number of filled Landau levels (generally non-integer) for a 2D
221
+ electron density ``density``. Integer :math:`\nu` is the condition for
222
+ an incompressible quantum Hall plateau in
223
+ :mod:`physicskit.condensed.topology`.
224
+
225
+ Parameters
226
+ ----------
227
+ density : float
228
+ 2D electron number density (particles per unit area).
229
+ B : float
230
+ Magnetic field strength.
231
+ hbar : float, default=1.0
232
+ Reduced Planck constant.
233
+ e : float, default=1.0
234
+ Particle charge magnitude.
235
+
236
+ Returns
237
+ -------
238
+ float
239
+
240
+ Examples
241
+ --------
242
+ >>> round(filling_factor(density=2.0, B=1.0), 6)
243
+ 12.566371
244
+ """
245
+ l_B = magnetic_length(B, hbar, e)
246
+ return float(density * 2 * np.pi * l_B**2)
@@ -0,0 +1,229 @@
1
+ r"""The fractional quantum Hall effect (1982-1983): Laughlin's wavefunction.
2
+
3
+ Tsui, Stormer, and Gossard found that an ultraclean 2D electron gas in a
4
+ strong magnetic field develops Hall plateaus at simple fractional fillings,
5
+ :math:`\nu=1/3` foremost among them -- a result the single-particle Landau-
6
+ level picture behind the *integer* effect
7
+ (:mod:`physicskit.condensed.landau_levels`) cannot explain at all, since a
8
+ partially filled Landau level is macroscopically degenerate and gapless
9
+ without electron-electron interactions. Laughlin supplied the missing
10
+ many-body mechanism: a trial wavefunction for :math:`N` electrons confined
11
+ to the lowest Landau level of a disk,
12
+
13
+ .. math::
14
+
15
+ \Psi_m(z_1,\dots,z_N) = \prod_{i<j}(z_i-z_j)^m\,
16
+ \exp\!\left(-\sum_i \frac{|z_i|^2}{4\ell_B^2}\right), \qquad m \text{ odd},
17
+
18
+ with :math:`z_j=x_j+iy_j` (magnetic length :math:`\ell_B=1` throughout this
19
+ module) and filling :math:`\nu=1/m`. The prefactor's zeroes at coincident
20
+ particle positions are exactly what strong Coulomb repulsion demands, and
21
+ :math:`|\Psi_m|^2` doubles as the Boltzmann weight of a classical 2D
22
+ one-component plasma at an effective temperature set by :math:`m` (Laughlin's
23
+ "plasma analogy"), letting ordinary Metropolis Monte Carlo sample it
24
+ directly with no diagonalization of any kind.
25
+
26
+ The pair correlation function :math:`g(r)` extracted from those samples
27
+ shows the wavefunction's defining feature directly: a "correlation hole"
28
+ that drives :math:`g(r) \to 0` as :math:`r \to 0` -- particles actively
29
+ avoid each other far more strongly than Pauli exclusion alone would
30
+ enforce -- rising to the uncorrelated value :math:`g \approx 1` over a
31
+ few magnetic lengths.
32
+ """
33
+
34
+ from __future__ import annotations
35
+
36
+ import numpy as np
37
+ from numba import njit
38
+
39
+ __all__ = ["laughlin_metropolis_sweep", "laughlin_pair_correlation", "laughlin_radial_density"]
40
+
41
+
42
+ @njit(cache=True)
43
+ def _delta_log_prob(z, i, z_new, m):
44
+ n = z.shape[0]
45
+ dlog = 0.0
46
+ for j in range(n):
47
+ if j == i:
48
+ continue
49
+ dlog += 2.0 * m * (np.log(np.abs(z_new - z[j])) - np.log(np.abs(z[i] - z[j])))
50
+ dlog += -0.5 * (np.abs(z_new) ** 2 - np.abs(z[i]) ** 2)
51
+ return dlog
52
+
53
+
54
+ @njit(cache=True)
55
+ def laughlin_metropolis_sweep(z: np.ndarray, m: int, step: float = 1.0) -> np.ndarray:
56
+ r"""Perform one Metropolis sweep sampling :math:`|\Psi_m|^2`, in place.
57
+
58
+ Proposes a small random displacement of one particle at a time and
59
+ accepts or rejects it with the exact Metropolis ratio of
60
+ :math:`|\Psi_m|^2` -- Laughlin's "plasma analogy" Boltzmann weight,
61
+ :math:`\prod_{i<j}|z_i-z_j|^{2m}\,e^{-\sum_i|z_i|^2/2}` -- with no
62
+ explicit normalization needed since only the ratio between
63
+ configurations ever enters.
64
+
65
+ Parameters
66
+ ----------
67
+ z : ndarray of shape (N,), dtype complex128
68
+ Particle positions :math:`z_j=x_j+iy_j`. Modified in place.
69
+ m : int
70
+ Laughlin exponent (filling :math:`\nu=1/m`); odd for fermions.
71
+ step : float, default=1.0
72
+ Maximum displacement of a trial move along each of :math:`x, y`,
73
+ drawn uniformly from ``[-step, step]``.
74
+
75
+ Returns
76
+ -------
77
+ ndarray of shape (N,)
78
+ The same array passed in.
79
+
80
+ Examples
81
+ --------
82
+ A two-particle system's Metropolis chain never proposes an *exactly*
83
+ coincident configuration acceptable (:math:`|\Psi_m|^2 = 0` there), so
84
+ repeated sweeps keep the two particles strictly apart:
85
+
86
+ >>> import numpy as np
87
+ >>> rng = np.random.default_rng(0)
88
+ >>> z = np.array([0.1 + 0.0j, -0.1 + 0.0j])
89
+ >>> for _ in range(200):
90
+ ... _ = laughlin_metropolis_sweep(z, m=3, step=0.5)
91
+ >>> bool(np.abs(z[0] - z[1]) > 1e-3)
92
+ True
93
+ """
94
+ n = z.shape[0]
95
+ for _ in range(n):
96
+ i = np.random.randint(0, n)
97
+ dx = (np.random.random() - 0.5) * 2.0 * step
98
+ dy = (np.random.random() - 0.5) * 2.0 * step
99
+ z_new = z[i] + dx + 1j * dy
100
+ dlog = _delta_log_prob(z, i, z_new, m)
101
+ if dlog >= 0.0 or np.random.random() < np.exp(dlog):
102
+ z[i] = z_new
103
+ return z
104
+
105
+
106
+ @njit(cache=True)
107
+ def _pair_distances(z):
108
+ n = z.shape[0]
109
+ out = np.empty(n * (n - 1) // 2)
110
+ k = 0
111
+ for i in range(n):
112
+ for j in range(i + 1, n):
113
+ out[k] = np.abs(z[i] - z[j])
114
+ k += 1
115
+ return out
116
+
117
+
118
+ def laughlin_pair_correlation(z_samples: np.ndarray, m: int, r_max: float, n_bins: int = 60) -> tuple:
119
+ r"""Pair correlation function :math:`g(r)` from sampled Laughlin configurations.
120
+
121
+ Bins every pairwise separation across a stack of equilibrium samples
122
+ (drawn with :func:`laughlin_metropolis_sweep`) and normalizes by the
123
+ Laughlin state's exact bulk density :math:`\rho=1/(2\pi m \ell_B^2)`,
124
+ so that :math:`g(r) \to 1` far from any correlation the wavefunction
125
+ itself imposes.
126
+
127
+ Parameters
128
+ ----------
129
+ z_samples : ndarray of shape (n_samples, N), dtype complex128
130
+ Stack of particle-position snapshots, ideally decorrelated by
131
+ several sweeps between samples.
132
+ m : int
133
+ Laughlin exponent used to generate the samples.
134
+ r_max : float
135
+ Largest separation to bin, in units of :math:`\ell_B`.
136
+ n_bins : int, default=60
137
+ Number of radial bins.
138
+
139
+ Returns
140
+ -------
141
+ r : ndarray of shape (n_bins,)
142
+ Bin-center separations.
143
+ g : ndarray of shape (n_bins,)
144
+ Pair correlation function; ``g[0] \approx 0`` is the correlation
145
+ hole, ``g \to 1`` at large separation.
146
+
147
+ See Also
148
+ --------
149
+ laughlin_metropolis_sweep : Generates the equilibrium samples this function bins.
150
+
151
+ Examples
152
+ --------
153
+ >>> import numpy as np
154
+ >>> rng = np.random.default_rng(0)
155
+ >>> N, m = 12, 3
156
+ >>> R0 = np.sqrt(2 * m * N)
157
+ >>> r0 = R0 * np.sqrt(rng.random(N))
158
+ >>> th0 = rng.uniform(0, 2 * np.pi, N)
159
+ >>> z = (r0 * np.cos(th0) + 1j * r0 * np.sin(th0)).astype(np.complex128)
160
+ >>> for _ in range(300):
161
+ ... _ = laughlin_metropolis_sweep(z, m=m, step=1.0)
162
+ >>> samples = np.array([laughlin_metropolis_sweep(z, m=m, step=1.0).copy() for _ in range(200)])
163
+ >>> r, g = laughlin_pair_correlation(samples, m=m, r_max=6.0, n_bins=30)
164
+ >>> bool(g[0] < 0.1)
165
+ True
166
+ """
167
+ n = z_samples.shape[1]
168
+ rho = 1.0 / (2.0 * np.pi * m)
169
+ all_dists = np.concatenate([_pair_distances(z) for z in z_samples])
170
+ r_edges = np.linspace(0.0, r_max, n_bins + 1)
171
+ hist, _ = np.histogram(all_dists, bins=r_edges)
172
+ r_centers = 0.5 * (r_edges[1:] + r_edges[:-1])
173
+ shell_area = np.pi * (r_edges[1:] ** 2 - r_edges[:-1] ** 2)
174
+ n_samples = z_samples.shape[0]
175
+ g = 2.0 * hist / (n_samples * n * rho * shell_area)
176
+ return r_centers, g
177
+
178
+
179
+ def laughlin_radial_density(z_samples: np.ndarray, r_max: float, n_bins: int = 60) -> tuple:
180
+ r"""Radially averaged particle density profile from sampled Laughlin configurations.
181
+
182
+ Parameters
183
+ ----------
184
+ z_samples : ndarray of shape (n_samples, N), dtype complex128
185
+ Stack of particle-position snapshots (see :func:`laughlin_pair_correlation`).
186
+ r_max : float
187
+ Largest radius to bin, in units of :math:`\ell_B`.
188
+ n_bins : int, default=60
189
+ Number of radial bins.
190
+
191
+ Returns
192
+ -------
193
+ r : ndarray of shape (n_bins,)
194
+ Bin-center radii.
195
+ density : ndarray of shape (n_bins,)
196
+ Mean particle density in each annulus, in units of :math:`\ell_B^{-2}`.
197
+
198
+ Notes
199
+ -----
200
+ A large-:math:`N` Laughlin droplet is an incompressible liquid: this
201
+ profile is approximately flat at the bulk density
202
+ :math:`\rho=1/(2\pi m \ell_B^2)` out to the droplet radius, falling to
203
+ zero over a few magnetic lengths at the edge -- the real-space
204
+ counterpart of the sharp gap that makes the plateau itself possible.
205
+
206
+ Examples
207
+ --------
208
+ >>> import numpy as np
209
+ >>> rng = np.random.default_rng(0)
210
+ >>> N, m = 12, 3
211
+ >>> R0 = np.sqrt(2 * m * N)
212
+ >>> r0 = R0 * np.sqrt(rng.random(N))
213
+ >>> th0 = rng.uniform(0, 2 * np.pi, N)
214
+ >>> z = (r0 * np.cos(th0) + 1j * r0 * np.sin(th0)).astype(np.complex128)
215
+ >>> for _ in range(300):
216
+ ... _ = laughlin_metropolis_sweep(z, m=m, step=1.0)
217
+ >>> samples = np.array([laughlin_metropolis_sweep(z, m=m, step=1.0).copy() for _ in range(200)])
218
+ >>> r, density = laughlin_radial_density(samples, r_max=2 * R0, n_bins=20)
219
+ >>> bool(density[-1] < density[2])
220
+ True
221
+ """
222
+ r_edges = np.linspace(0.0, r_max, n_bins + 1)
223
+ all_radii = np.abs(z_samples).ravel()
224
+ hist, _ = np.histogram(all_radii, bins=r_edges)
225
+ r_centers = 0.5 * (r_edges[1:] + r_edges[:-1])
226
+ shell_area = np.pi * (r_edges[1:] ** 2 - r_edges[:-1] ** 2)
227
+ n_samples = z_samples.shape[0]
228
+ density = hist / (n_samples * shell_area)
229
+ return r_centers, density