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,397 @@
1
+ """Numba-accelerated time integrators.
2
+
3
+ Standard RK4 is provided for reference/comparison, but it is not
4
+ energy-preserving: over long integrations the numerically computed
5
+ Hamiltonian drifts (typically grows) because RK4 is not a symplectic
6
+ map. The default backends for conservative systems in ``physicskit.classical`` are:
7
+
8
+ * :func:`velocity_verlet_integrate` -- 2nd-order symplectic Stormer-Verlet,
9
+ valid for *separable* Hamiltonians H(q, p) = T(p) + V(q).
10
+ * :func:`yoshida4_integrate` -- 4th-order symplectic integrator built by
11
+ composing three Verlet sub-steps with Yoshida's (1990) coefficients.
12
+ * :func:`implicit_midpoint_integrate` -- a general-purpose symplectic
13
+ integrator (2nd order) that works for *any* Hamiltonian system,
14
+ including non-separable ones (coupled generalized coordinates such as
15
+ the double pendulum, or rigid-body/Euler-type equations). It is solved
16
+ by fixed-point iteration each step.
17
+
18
+ All step functions accept plain ``@njit``-compiled callback functions so
19
+ the whole time loop can run at native speed with no Python overhead.
20
+ """
21
+
22
+ from __future__ import annotations
23
+
24
+ import numpy as np
25
+ from numba import njit
26
+
27
+ __all__ = [
28
+ "rk4_step",
29
+ "rk4_integrate",
30
+ "velocity_verlet_step",
31
+ "velocity_verlet_integrate",
32
+ "yoshida4_step",
33
+ "yoshida4_integrate",
34
+ "implicit_midpoint_step",
35
+ "implicit_midpoint_integrate",
36
+ "make_separable_derivatives",
37
+ ]
38
+
39
+ # ---------------------------------------------------------------------------
40
+ # Classical Runge-Kutta 4 (non-symplectic reference integrator)
41
+ # ---------------------------------------------------------------------------
42
+
43
+
44
+ @njit(cache=False)
45
+ def rk4_step(deriv_func, t, y, dt):
46
+ """Single RK4 step for ``dy/dt = deriv_func(t, y)``.
47
+
48
+ Parameters
49
+ ----------
50
+ deriv_func : callable
51
+ ``@njit`` dispatcher ``(t, y) -> dy``.
52
+ t : float
53
+ Current time.
54
+ y : ndarray
55
+ Current state.
56
+ dt : float
57
+ Step size.
58
+
59
+ Returns
60
+ -------
61
+ ndarray
62
+ State at ``t + dt``.
63
+ """
64
+ k1 = deriv_func(t, y)
65
+ k2 = deriv_func(t + 0.5 * dt, y + 0.5 * dt * k1)
66
+ k3 = deriv_func(t + 0.5 * dt, y + 0.5 * dt * k2)
67
+ k4 = deriv_func(t + dt, y + dt * k3)
68
+ return y + (dt / 6.0) * (k1 + 2.0 * k2 + 2.0 * k3 + k4)
69
+
70
+
71
+ @njit(cache=False)
72
+ def rk4_integrate(deriv_func, y0, t0, n_steps, dt):
73
+ """Integrate ``dy/dt = deriv_func(t, y)`` for ``n_steps`` of size ``dt``.
74
+
75
+ Parameters
76
+ ----------
77
+ deriv_func : callable
78
+ ``@njit`` dispatcher ``(t, y) -> dy``.
79
+ y0 : ndarray
80
+ Initial state.
81
+ t0 : float
82
+ Initial time.
83
+ n_steps : int
84
+ Number of steps to take.
85
+ dt : float
86
+ Step size.
87
+
88
+ Returns
89
+ -------
90
+ t : ndarray, shape (n_steps + 1,)
91
+ y : ndarray, shape (n_steps + 1, len(y0))
92
+ """
93
+ dim = y0.shape[0]
94
+ ts = np.empty(n_steps + 1)
95
+ ys = np.empty((n_steps + 1, dim))
96
+ ts[0] = t0
97
+ ys[0, :] = y0
98
+ y = y0.copy()
99
+ t = t0
100
+ for i in range(n_steps):
101
+ y = rk4_step(deriv_func, t, y, dt)
102
+ t = t0 + (i + 1) * dt
103
+ ts[i + 1] = t
104
+ ys[i + 1, :] = y
105
+ return ts, ys
106
+
107
+
108
+ # ---------------------------------------------------------------------------
109
+ # Symplectic (velocity) Verlet -- separable Hamiltonians H = T(p) + V(q)
110
+ # ---------------------------------------------------------------------------
111
+
112
+
113
+ @njit(cache=False)
114
+ def velocity_verlet_step(force_func, mass_inv, q, p, dt, t=0.0):
115
+ """One Stormer-Verlet / velocity-Verlet step.
116
+
117
+ Parameters
118
+ ----------
119
+ force_func : callable
120
+ ``@njit`` dispatcher ``(q, t) -> force``, returning -dV/dq.
121
+ mass_inv : float or ndarray
122
+ 1/m per coordinate, giving ``dT/dp = mass_inv * p`` for the
123
+ standard kinetic form.
124
+ q, p : ndarray
125
+ Current position and momentum.
126
+ dt : float
127
+ Step size.
128
+ t : float, default 0.0
129
+ Current time.
130
+
131
+ Returns
132
+ -------
133
+ q, p : ndarray
134
+ Position and momentum at ``t + dt``.
135
+ """
136
+ f0 = force_func(q, t)
137
+ p_half = p + 0.5 * dt * f0
138
+ q_new = q + dt * (mass_inv * p_half)
139
+ f1 = force_func(q_new, t + dt)
140
+ p_new = p_half + 0.5 * dt * f1
141
+ return q_new, p_new
142
+
143
+
144
+ @njit(cache=False)
145
+ def velocity_verlet_integrate(force_func, mass_inv, q0, p0, t0, n_steps, dt):
146
+ """Integrate a separable Hamiltonian system with velocity Verlet.
147
+
148
+ Parameters
149
+ ----------
150
+ force_func : callable
151
+ ``@njit`` dispatcher ``(q, t) -> force``.
152
+ mass_inv : float or ndarray
153
+ 1/m per coordinate.
154
+ q0, p0 : ndarray
155
+ Initial position and momentum.
156
+ t0 : float
157
+ Initial time.
158
+ n_steps : int
159
+ Number of steps to take.
160
+ dt : float
161
+ Step size.
162
+
163
+ Returns
164
+ -------
165
+ t : ndarray, shape (n_steps + 1,)
166
+ q, p : ndarray, shape (n_steps + 1, len(q0))
167
+ """
168
+ dim = q0.shape[0]
169
+ ts = np.empty(n_steps + 1)
170
+ qs = np.empty((n_steps + 1, dim))
171
+ ps = np.empty((n_steps + 1, dim))
172
+ ts[0] = t0
173
+ qs[0, :] = q0
174
+ ps[0, :] = p0
175
+ q, p = q0.copy(), p0.copy()
176
+ t = t0
177
+ for i in range(n_steps):
178
+ q, p = velocity_verlet_step(force_func, mass_inv, q, p, dt, t)
179
+ t = t0 + (i + 1) * dt
180
+ ts[i + 1] = t
181
+ qs[i + 1, :] = q
182
+ ps[i + 1, :] = p
183
+ return ts, qs, ps
184
+
185
+
186
+ # ---------------------------------------------------------------------------
187
+ # 4th-order Yoshida integrator (triple-composition of Verlet)
188
+ # ---------------------------------------------------------------------------
189
+
190
+ _YOSHIDA_CUBE_ROOT = 2.0 ** (1.0 / 3.0)
191
+ _YOSHIDA_W1 = 1.0 / (2.0 - _YOSHIDA_CUBE_ROOT)
192
+ _YOSHIDA_W0 = -_YOSHIDA_CUBE_ROOT / (2.0 - _YOSHIDA_CUBE_ROOT)
193
+
194
+
195
+ @njit(cache=False)
196
+ def yoshida4_step(force_func, mass_inv, q, p, dt, t=0.0):
197
+ """One 4th-order Yoshida step: composition of 3 Verlet sub-steps.
198
+
199
+ Parameters
200
+ ----------
201
+ force_func : callable
202
+ ``@njit`` dispatcher ``(q, t) -> force``.
203
+ mass_inv : float or ndarray
204
+ 1/m per coordinate.
205
+ q, p : ndarray
206
+ Current position and momentum.
207
+ dt : float
208
+ Step size.
209
+ t : float, default 0.0
210
+ Current time.
211
+
212
+ Returns
213
+ -------
214
+ q, p : ndarray
215
+ Position and momentum at ``t + dt``.
216
+ """
217
+ q, p = velocity_verlet_step(force_func, mass_inv, q, p, _YOSHIDA_W1 * dt, t)
218
+ t1 = t + _YOSHIDA_W1 * dt
219
+ q, p = velocity_verlet_step(force_func, mass_inv, q, p, _YOSHIDA_W0 * dt, t1)
220
+ t2 = t1 + _YOSHIDA_W0 * dt
221
+ q, p = velocity_verlet_step(force_func, mass_inv, q, p, _YOSHIDA_W1 * dt, t2)
222
+ return q, p
223
+
224
+
225
+ @njit(cache=False)
226
+ def yoshida4_integrate(force_func, mass_inv, q0, p0, t0, n_steps, dt):
227
+ """Integrate a separable Hamiltonian system with 4th-order Yoshida.
228
+
229
+ Parameters
230
+ ----------
231
+ force_func : callable
232
+ ``@njit`` dispatcher ``(q, t) -> force``.
233
+ mass_inv : float or ndarray
234
+ 1/m per coordinate.
235
+ q0, p0 : ndarray
236
+ Initial position and momentum.
237
+ t0 : float
238
+ Initial time.
239
+ n_steps : int
240
+ Number of steps to take.
241
+ dt : float
242
+ Step size.
243
+
244
+ Returns
245
+ -------
246
+ t : ndarray, shape (n_steps + 1,)
247
+ q, p : ndarray, shape (n_steps + 1, len(q0))
248
+ """
249
+ dim = q0.shape[0]
250
+ ts = np.empty(n_steps + 1)
251
+ qs = np.empty((n_steps + 1, dim))
252
+ ps = np.empty((n_steps + 1, dim))
253
+ ts[0] = t0
254
+ qs[0, :] = q0
255
+ ps[0, :] = p0
256
+ q, p = q0.copy(), p0.copy()
257
+ t = t0
258
+ for i in range(n_steps):
259
+ q, p = yoshida4_step(force_func, mass_inv, q, p, dt, t)
260
+ t = t0 + (i + 1) * dt
261
+ ts[i + 1] = t
262
+ qs[i + 1, :] = q
263
+ ps[i + 1, :] = p
264
+ return ts, qs, ps
265
+
266
+
267
+ # ---------------------------------------------------------------------------
268
+ # Implicit midpoint -- general symplectic integrator (non-separable OK)
269
+ # ---------------------------------------------------------------------------
270
+
271
+
272
+ @njit(cache=False)
273
+ def implicit_midpoint_step(deriv_func, t, y, dt, tol=1e-12, max_iter=100):
274
+ """One implicit-midpoint step for ``dy/dt = deriv_func(t, y)``.
275
+
276
+ Solved by fixed-point (Picard) iteration:
277
+ ``y_{n+1} = y_n + dt * f(t + dt/2, (y_n + y_{n+1}) / 2)``.
278
+
279
+ The implicit midpoint rule is symplectic for canonical Hamiltonian
280
+ systems (any H(q, p), separable or not) and exactly preserves
281
+ quadratic invariants of bilinear ODEs (e.g. Euler's rigid-body
282
+ equations), making it a robust general-purpose fallback wherever a
283
+ closed-form separable split is unavailable.
284
+
285
+ Parameters
286
+ ----------
287
+ deriv_func : callable
288
+ ``@njit`` dispatcher ``(t, y) -> dy``.
289
+ t : float
290
+ Current time.
291
+ y : ndarray
292
+ Current state.
293
+ dt : float
294
+ Step size.
295
+ tol : float, default 1e-12
296
+ Fixed-point convergence tolerance (max abs component change).
297
+ max_iter : int, default 100
298
+ Maximum Picard iterations per step.
299
+
300
+ Returns
301
+ -------
302
+ ndarray
303
+ State at ``t + dt``.
304
+ """
305
+ tm = t + 0.5 * dt
306
+ y_next = y + dt * deriv_func(t, y) # explicit-Euler predictor
307
+ for _ in range(max_iter):
308
+ y_mid = 0.5 * (y + y_next)
309
+ y_new = y + dt * deriv_func(tm, y_mid)
310
+ if np.max(np.abs(y_new - y_next)) < tol:
311
+ y_next = y_new
312
+ break
313
+ y_next = y_new
314
+ return y_next
315
+
316
+
317
+ @njit(cache=False)
318
+ def implicit_midpoint_integrate(deriv_func, y0, t0, n_steps, dt, tol=1e-12, max_iter=100):
319
+ """Integrate ``dy/dt = deriv_func(t, y)`` with the implicit midpoint rule.
320
+
321
+ Parameters
322
+ ----------
323
+ deriv_func : callable
324
+ ``@njit`` dispatcher ``(t, y) -> dy``.
325
+ y0 : ndarray
326
+ Initial state.
327
+ t0 : float
328
+ Initial time.
329
+ n_steps : int
330
+ Number of steps to take.
331
+ dt : float
332
+ Step size.
333
+ tol : float, default 1e-12
334
+ Fixed-point convergence tolerance, passed to
335
+ :func:`implicit_midpoint_step`.
336
+ max_iter : int, default 100
337
+ Maximum Picard iterations per step.
338
+
339
+ Returns
340
+ -------
341
+ t : ndarray, shape (n_steps + 1,)
342
+ y : ndarray, shape (n_steps + 1, len(y0))
343
+ """
344
+ dim = y0.shape[0]
345
+ ts = np.empty(n_steps + 1)
346
+ ys = np.empty((n_steps + 1, dim))
347
+ ts[0] = t0
348
+ ys[0, :] = y0
349
+ y = y0.copy()
350
+ t = t0
351
+ for i in range(n_steps):
352
+ y = implicit_midpoint_step(deriv_func, t, y, dt, tol, max_iter)
353
+ t = t0 + (i + 1) * dt
354
+ ts[i + 1] = t
355
+ ys[i + 1, :] = y
356
+ return ts, ys
357
+
358
+
359
+ # ---------------------------------------------------------------------------
360
+ # Helper: build a generic dy/dt callback from a separable force function
361
+ # ---------------------------------------------------------------------------
362
+
363
+
364
+ def make_separable_derivatives(force_func, mass_inv, ndof: int):
365
+ """Wrap a separable-Hamiltonian force function as a stacked-state derivative.
366
+
367
+ Wraps ``force_func(q, t)`` as a stacked-state ``deriv_func(t, y)``
368
+ (``y = [q, p]``) usable by :func:`rk4_integrate` and
369
+ :func:`implicit_midpoint_integrate`.
370
+
371
+ Parameters
372
+ ----------
373
+ force_func : callable
374
+ ``@njit`` dispatcher ``(q, t) -> force``.
375
+ mass_inv : float or ndarray
376
+ 1/m per coordinate.
377
+ ndof : int
378
+ Number of degrees of freedom (``len(y) == 2 * ndof``).
379
+
380
+ Returns
381
+ -------
382
+ callable
383
+ A new ``@njit`` dispatcher ``(t, y) -> dy``, closing over
384
+ ``force_func``, ``mass_inv`` and ``ndof`` as compile-time
385
+ constants, so callers get the same first-class-function speed
386
+ as a hand-written derivative.
387
+ """
388
+
389
+ @njit(cache=False)
390
+ def deriv(t, y):
391
+ q = y[:ndof]
392
+ p = y[ndof:]
393
+ dq = mass_inv * p
394
+ dp = force_func(q, t)
395
+ return np.concatenate((dq, dp))
396
+
397
+ return deriv
@@ -0,0 +1,32 @@
1
+ from physicskit.classical.systems.chains import FPUTChain, HarmonicChain, SineGordonChain
2
+ from physicskit.classical.systems.hamiltonian import HenonHeilesSystem, PendulumSwarm, pendulum_action_angle
3
+ from physicskit.classical.systems.lagrangian import BeadOnRotatingHoop, CoupledOscillators, DoublePendulum
4
+ from physicskit.classical.systems.newtonian import KeplerSystem, ProjectileMotion
5
+ from physicskit.classical.systems.rotations import (
6
+ EulerTop,
7
+ HeavySymmetricTop,
8
+ effective_potential_symmetric_top,
9
+ find_theta_equilibrium,
10
+ nutation_frequency,
11
+ precession_frequency,
12
+ )
13
+
14
+ __all__ = [
15
+ "ProjectileMotion",
16
+ "KeplerSystem",
17
+ "DoublePendulum",
18
+ "BeadOnRotatingHoop",
19
+ "CoupledOscillators",
20
+ "HenonHeilesSystem",
21
+ "PendulumSwarm",
22
+ "pendulum_action_angle",
23
+ "HarmonicChain",
24
+ "FPUTChain",
25
+ "SineGordonChain",
26
+ "EulerTop",
27
+ "HeavySymmetricTop",
28
+ "effective_potential_symmetric_top",
29
+ "find_theta_equilibrium",
30
+ "nutation_frequency",
31
+ "precession_frequency",
32
+ ]