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,271 @@
1
+ r"""Relativistic four-vector kinematics.
2
+
3
+ Works throughout in **natural units with** :math:`c=1`: energy, momentum,
4
+ and mass all share the same energy-like unit (GeV for particle physics,
5
+ MeV for nuclear physics -- the caller's choice, so long as it is used
6
+ consistently), the same convention :mod:`physicskit.relativity` uses for
7
+ its own geometrized units (:math:`G=c=1`).
8
+
9
+ - :class:`FourVector` -- an energy-momentum four-vector :math:`p^\mu =
10
+ (E, p_x, p_y, p_z)`, with its invariant mass, speed, and Lorentz factor
11
+ as derived properties.
12
+ - :func:`boost` -- a Lorentz boost along a Cartesian axis.
13
+ - :func:`boost_generic` -- a Lorentz boost along an arbitrary 3-velocity.
14
+ - :func:`invariant_mass` -- the invariant mass of a system of particles.
15
+ - :func:`rapidity` -- the additive (under boosts) rapidity variable.
16
+ - :func:`boost_to_com` -- the velocity of a system's center-of-momentum frame.
17
+ """
18
+
19
+ from __future__ import annotations
20
+
21
+ import numpy as np
22
+
23
+ __all__ = ["FourVector", "boost", "boost_generic", "invariant_mass", "rapidity", "boost_to_com"]
24
+
25
+
26
+ class FourVector:
27
+ r"""An energy-momentum four-vector :math:`p^\mu=(E,p_x,p_y,p_z)`.
28
+
29
+ Parameters
30
+ ----------
31
+ E : float
32
+ Energy.
33
+ px, py, pz : float
34
+ Momentum components.
35
+
36
+ Examples
37
+ --------
38
+ >>> p = FourVector(2.0, 0.0, 0.0, 1.0)
39
+ >>> round(p.mass, 6)
40
+ 1.732051
41
+ """
42
+
43
+ def __init__(self, E, px, py, pz):
44
+ self.E = float(E)
45
+ self.px = float(px)
46
+ self.py = float(py)
47
+ self.pz = float(pz)
48
+
49
+ @property
50
+ def p_vec(self):
51
+ """``ndarray`` of shape (3,): the momentum 3-vector."""
52
+ return np.array([self.px, self.py, self.pz])
53
+
54
+ @property
55
+ def p_mag(self):
56
+ r"""Momentum magnitude, :math:`|\vec p|`."""
57
+ return float(np.linalg.norm(self.p_vec))
58
+
59
+ @property
60
+ def mass(self):
61
+ r"""Invariant mass, :math:`m=\sqrt{E^2-|\vec p|^2}`.
62
+
63
+ The radicand is clipped at 0 before the square root, so a
64
+ four-vector that is numerically spacelike only by floating-point
65
+ noise (e.g. the sum of several on-shell four-vectors) returns
66
+ ``0.0`` rather than raising on a tiny negative argument.
67
+ """
68
+ radicand = self.E**2 - self.p_mag**2
69
+ return float(np.sqrt(max(radicand, 0.0)))
70
+
71
+ @property
72
+ def beta(self):
73
+ r"""Speed, :math:`\beta=|\vec p|/E`."""
74
+ return self.p_mag / self.E
75
+
76
+ @property
77
+ def gamma(self):
78
+ r"""Lorentz factor, :math:`\gamma=E/m`.
79
+
80
+ Raises
81
+ ------
82
+ ZeroDivisionError
83
+ If the four-vector is massless (no rest frame).
84
+ """
85
+ m = self.mass
86
+ if m == 0.0:
87
+ raise ZeroDivisionError("A massless four-vector has no rest frame / undefined gamma.")
88
+ return self.E / m
89
+
90
+ def __add__(self, other):
91
+ return FourVector(self.E + other.E, self.px + other.px, self.py + other.py, self.pz + other.pz)
92
+
93
+ def __sub__(self, other):
94
+ return FourVector(self.E - other.E, self.px - other.px, self.py - other.py, self.pz - other.pz)
95
+
96
+ def __repr__(self):
97
+ return f"FourVector(E={self.E:.4g}, px={self.px:.4g}, py={self.py:.4g}, pz={self.pz:.4g})"
98
+
99
+
100
+ def boost(four_vector, beta, axis="z"):
101
+ r"""Lorentz-boost a :class:`FourVector` along a Cartesian axis.
102
+
103
+ Parameters
104
+ ----------
105
+ four_vector : FourVector
106
+ The four-vector to boost.
107
+ beta : float
108
+ Boost velocity, :math:`-1 < \beta < 1`, in units of :math:`c=1`.
109
+ axis : {"x", "y", "z"}, default="z"
110
+ Cartesian axis of the boost.
111
+
112
+ Returns
113
+ -------
114
+ FourVector
115
+ The boosted four-vector.
116
+
117
+ Examples
118
+ --------
119
+ >>> p = FourVector(1.0, 0.0, 0.0, 0.0) # a particle at rest, mass 1
120
+ >>> pb = boost(p, 0.6, axis="z")
121
+ >>> round(pb.E, 6), round(pb.pz, 6)
122
+ (1.25, 0.75)
123
+ """
124
+ if not (-1.0 < beta < 1.0):
125
+ raise ValueError(f"beta={beta} must satisfy -1 < beta < 1.")
126
+ gamma = 1.0 / np.sqrt(1.0 - beta**2)
127
+ E, px, py, pz = four_vector.E, four_vector.px, four_vector.py, four_vector.pz
128
+ if axis == "x":
129
+ return FourVector(gamma * (E + beta * px), gamma * (px + beta * E), py, pz)
130
+ elif axis == "y":
131
+ return FourVector(gamma * (E + beta * py), px, gamma * (py + beta * E), pz)
132
+ elif axis == "z":
133
+ return FourVector(gamma * (E + beta * pz), px, py, gamma * (pz + beta * E))
134
+ raise ValueError(f"axis must be 'x', 'y', or 'z', got {axis!r}.")
135
+
136
+
137
+ def boost_generic(four_vector, beta_vec):
138
+ r"""Lorentz-boost a :class:`FourVector` along an arbitrary 3-velocity.
139
+
140
+ Generalizes :func:`boost` to a boost direction that need not lie
141
+ along a Cartesian axis -- the transformation used, e.g., to take a
142
+ daughter four-momentum computed in a parent's rest frame back to the
143
+ lab frame when the parent's own flight direction is not one of the
144
+ axes (as happens at every vertex of a branching cascade; see
145
+ :mod:`physicskit.particle.collider`).
146
+
147
+ .. math::
148
+
149
+ E' = \gamma(E + \vec\beta\cdot\vec p), \qquad
150
+ \vec p' = \vec p + \left[\frac{\gamma-1}{\beta^2}(\vec\beta\cdot\vec p)
151
+ + \gamma E\right]\vec\beta
152
+
153
+ which reduces to :func:`boost` when :math:`\vec\beta` is aligned with
154
+ a single axis.
155
+
156
+ Parameters
157
+ ----------
158
+ four_vector : FourVector
159
+ The four-vector to boost.
160
+ beta_vec : array_like of shape (3,)
161
+ Boost velocity, :math:`|\vec\beta| < 1`, in units of :math:`c=1`.
162
+
163
+ Returns
164
+ -------
165
+ FourVector
166
+ The boosted four-vector.
167
+
168
+ Examples
169
+ --------
170
+ >>> p = FourVector(1.0, 0.0, 0.0, 0.0) # a particle at rest, mass 1
171
+ >>> pb = boost_generic(p, [0.0, 0.0, 0.6])
172
+ >>> round(pb.E, 6), round(pb.pz, 6)
173
+ (1.25, 0.75)
174
+ """
175
+ beta_vec = np.asarray(beta_vec, dtype=float)
176
+ beta2 = float(beta_vec @ beta_vec)
177
+ if beta2 >= 1.0:
178
+ raise ValueError(f"|beta_vec|={np.sqrt(beta2)} must be < 1.")
179
+ if beta2 == 0.0:
180
+ return FourVector(four_vector.E, four_vector.px, four_vector.py, four_vector.pz)
181
+ gamma = 1.0 / np.sqrt(1.0 - beta2)
182
+ E, p_vec = four_vector.E, four_vector.p_vec
183
+ p_dot_beta = float(p_vec @ beta_vec)
184
+ p_new = p_vec + ((gamma - 1.0) * p_dot_beta / beta2 + gamma * E) * beta_vec
185
+ E_new = gamma * (E + p_dot_beta)
186
+ return FourVector(float(E_new), *[float(c) for c in p_new])
187
+
188
+
189
+ def invariant_mass(four_vectors):
190
+ """The invariant mass of a system of four-vectors.
191
+
192
+ Parameters
193
+ ----------
194
+ four_vectors : iterable of FourVector
195
+ The particles making up the system.
196
+
197
+ Returns
198
+ -------
199
+ float
200
+ The mass of the sum of the four-vectors -- e.g. the reconstructed
201
+ mass of a resonance from its decay products.
202
+
203
+ Examples
204
+ --------
205
+ >>> p1 = FourVector(1.0, 0.0, 0.0, 0.6)
206
+ >>> p2 = FourVector(1.0, 0.0, 0.0, -0.6)
207
+ >>> round(invariant_mass([p1, p2]), 6)
208
+ 2.0
209
+ """
210
+ total = None
211
+ for p in four_vectors:
212
+ total = p if total is None else total + p
213
+ return total.mass
214
+
215
+
216
+ def rapidity(four_vector, axis="z"):
217
+ r"""Rapidity along a Cartesian axis, :math:`y=\tfrac12\ln\!\big[(E+p_i)/(E-p_i)\big]`.
218
+
219
+ Rapidity is additive under boosts along the same axis: boosting a
220
+ particle by velocity :math:`\beta` shifts its rapidity by exactly
221
+ :math:`\operatorname{artanh}\beta`.
222
+
223
+ Parameters
224
+ ----------
225
+ four_vector : FourVector
226
+ The particle.
227
+ axis : {"x", "y", "z"}, default="z"
228
+ Cartesian axis.
229
+
230
+ Returns
231
+ -------
232
+ float
233
+
234
+ Examples
235
+ --------
236
+ >>> p = FourVector(2.0, 0.0, 0.0, 1.0)
237
+ >>> round(rapidity(p), 6)
238
+ 0.549306
239
+ """
240
+ E = four_vector.E
241
+ p_i = {"x": four_vector.px, "y": four_vector.py, "z": four_vector.pz}[axis]
242
+ return float(0.5 * np.log((E + p_i) / (E - p_i)))
243
+
244
+
245
+ def boost_to_com(four_vectors):
246
+ """The 3-velocity of the center-of-momentum frame of a system.
247
+
248
+ Parameters
249
+ ----------
250
+ four_vectors : iterable of FourVector
251
+ The particles making up the system.
252
+
253
+ Returns
254
+ -------
255
+ ndarray of shape (3,)
256
+ The velocity (units of :math:`c=1`) of the system's total
257
+ momentum relative to the current frame, :math:`\\vec\\beta_{\\rm
258
+ com} = \\vec p_{\\rm tot}/E_{\\rm tot}`.
259
+
260
+ Examples
261
+ --------
262
+ >>> p1 = FourVector(2.0, 0.0, 0.0, 1.0)
263
+ >>> p2 = FourVector(1.0, 0.0, 0.0, 0.0)
264
+ >>> beta_com = boost_to_com([p1, p2])
265
+ >>> [round(float(b), 6) for b in beta_com]
266
+ [0.0, 0.0, 0.333333]
267
+ """
268
+ total = None
269
+ for p in four_vectors:
270
+ total = p if total is None else total + p
271
+ return total.p_vec / total.E
@@ -0,0 +1,84 @@
1
+ r"""Two-flavor vacuum neutrino oscillations.
2
+
3
+ - :func:`oscillation_probability` -- the standard two-flavor
4
+ :math:`\nu_e\to\nu_\mu` vacuum oscillation probability.
5
+ - :func:`survival_probability` -- its complement, :math:`\nu_e\to\nu_e`.
6
+
7
+ **Simplification**: a full treatment has three flavors, a PMNS matrix
8
+ with three mixing angles and a CP-violating phase, and matter (MSW)
9
+ effects for neutrinos propagating through the Earth or the Sun. The
10
+ two-flavor vacuum-oscillation formula used here is the standard
11
+ leading-order approximation whenever a single mass-squared splitting
12
+ dominates (as :math:`\Delta m^2_{21}` or :math:`\Delta m^2_{31}}` each
13
+ individually do in different regimes), and is the textbook starting
14
+ point for any oscillation demonstration (see the Particle Data Group's
15
+ "Neutrino Mixing" review).
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import numpy as np
21
+
22
+ __all__ = ["oscillation_probability", "survival_probability"]
23
+
24
+
25
+ def oscillation_probability(L, E, theta, delta_m2):
26
+ r"""Two-flavor vacuum oscillation probability :math:`P(\nu_e\to\nu_\mu)`.
27
+
28
+ .. math::
29
+
30
+ P(\nu_e\to\nu_\mu) = \sin^2(2\theta)\,
31
+ \sin^2\!\left(1.267\,\frac{\Delta m^2 L}{E}\right)
32
+
33
+ the standard PDG form in practical units: :math:`L` in km, :math:`E`
34
+ in GeV, :math:`\Delta m^2` in :math:`{\rm eV}^2` (the numerical
35
+ constant 1.267 absorbs :math:`\hbar,c` and the unit conversion; see
36
+ the Particle Data Group's "Neutrino Mixing" review).
37
+
38
+ Parameters
39
+ ----------
40
+ L : array_like
41
+ Baseline (distance traveled), in km.
42
+ E : array_like
43
+ Neutrino energy, in GeV.
44
+ theta : float
45
+ Mixing angle, in radians.
46
+ delta_m2 : float
47
+ Mass-squared splitting, in :math:`{\rm eV}^2`.
48
+
49
+ Returns
50
+ -------
51
+ ndarray or float
52
+
53
+ Examples
54
+ --------
55
+ >>> round(float(oscillation_probability(0.0, 1.0, 0.5, 2.5e-3)), 10)
56
+ 0.0
57
+ >>> theta = np.pi / 4 # maximal mixing
58
+ >>> L_E = np.pi / 2 / (1.267 * 2.5e-3) # argument = pi/2 -> sin^2 = 1
59
+ >>> round(float(oscillation_probability(L_E, 1.0, theta, 2.5e-3)), 6)
60
+ 1.0
61
+ """
62
+ L = np.asarray(L, dtype=float)
63
+ E = np.asarray(E, dtype=float)
64
+ return np.sin(2.0 * theta) ** 2 * np.sin(1.267 * delta_m2 * L / E) ** 2
65
+
66
+
67
+ def survival_probability(L, E, theta, delta_m2):
68
+ r"""Two-flavor vacuum survival probability, :math:`P(\nu_e\to\nu_e)=1-P(\nu_e\to\nu_\mu)`.
69
+
70
+ Parameters
71
+ ----------
72
+ L, E, theta, delta_m2
73
+ See :func:`oscillation_probability`.
74
+
75
+ Returns
76
+ -------
77
+ ndarray or float
78
+
79
+ Examples
80
+ --------
81
+ >>> round(float(survival_probability(0.0, 1.0, 0.5, 2.5e-3)), 10)
82
+ 1.0
83
+ """
84
+ return 1.0 - oscillation_probability(L, E, theta, delta_m2)
@@ -0,0 +1,100 @@
1
+ r"""Nuclear binding energy and reaction Q-values.
2
+
3
+ Masses and energies here are in **MeV**, the universal convention for the
4
+ semi-empirical mass formula's fitted coefficients.
5
+
6
+ - :func:`semf_binding_energy`, :func:`binding_energy_per_nucleon` -- the
7
+ Weizsacker (liquid-drop) semi-empirical mass formula.
8
+ - :func:`q_value` -- the energy released (or absorbed) in a nuclear reaction.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ __all__ = ["semf_binding_energy", "binding_energy_per_nucleon", "q_value"]
14
+
15
+ _A_V = 15.75
16
+ _A_S = 17.8
17
+ _A_C = 0.711
18
+ _A_A = 23.7
19
+ _A_P = 11.18
20
+
21
+
22
+ def semf_binding_energy(Z, A):
23
+ r"""Semi-empirical (Weizsacker) total nuclear binding energy, in MeV.
24
+
25
+ .. math::
26
+
27
+ B(Z,A) = a_V A - a_S A^{2/3} - a_C\frac{Z(Z-1)}{A^{1/3}}
28
+ - a_A\frac{(A-2Z)^2}{A} + \delta(A,Z)
29
+
30
+ with the standard coefficients :math:`a_V=15.75`, :math:`a_S=17.8`,
31
+ :math:`a_C=0.711`, :math:`a_A=23.7` MeV, and the pairing term
32
+ :math:`\delta=+a_PA^{-1/2}` for even-even nuclei,
33
+ :math:`\delta=-a_PA^{-1/2}` for odd-odd nuclei, and :math:`\delta=0`
34
+ for odd-:math:`A` nuclei, with :math:`a_P\approx11.18` MeV.
35
+
36
+ Parameters
37
+ ----------
38
+ Z : int
39
+ Atomic (proton) number.
40
+ A : int
41
+ Mass number.
42
+
43
+ Returns
44
+ -------
45
+ float
46
+ Total binding energy, in MeV.
47
+
48
+ Examples
49
+ --------
50
+ >>> B = semf_binding_energy(26, 56) # Iron-56
51
+ >>> 8.0 < B / 56 < 9.0
52
+ True
53
+ """
54
+ N = A - Z
55
+ if Z % 2 == 0 and N % 2 == 0:
56
+ delta = _A_P / A**0.5
57
+ elif Z % 2 == 1 and N % 2 == 1:
58
+ delta = -_A_P / A**0.5
59
+ else:
60
+ delta = 0.0
61
+ return _A_V * A - _A_S * A ** (2 / 3) - _A_C * Z * (Z - 1) / A ** (1 / 3) - _A_A * (A - 2 * Z) ** 2 / A + delta
62
+
63
+
64
+ def binding_energy_per_nucleon(Z, A):
65
+ """Binding energy per nucleon, ``semf_binding_energy(Z, A) / A``, in MeV.
66
+
67
+ Examples
68
+ --------
69
+ >>> bpn = binding_energy_per_nucleon(26, 56)
70
+ >>> 8.0 < bpn < 9.0
71
+ True
72
+ """
73
+ return semf_binding_energy(Z, A) / A
74
+
75
+
76
+ def q_value(reactant_masses, product_masses):
77
+ r"""Reaction Q-value, :math:`Q=\sum m_{\rm reactants}-\sum m_{\rm products}`.
78
+
79
+ A positive ``Q`` means the reaction is exothermic (releases energy);
80
+ a negative ``Q`` means it is endothermic and requires that much
81
+ additional kinetic energy to proceed. Masses (or mass-energies) may be
82
+ in any consistent unit.
83
+
84
+ Parameters
85
+ ----------
86
+ reactant_masses : iterable of float
87
+ Masses of the reactants.
88
+ product_masses : iterable of float
89
+ Masses of the products.
90
+
91
+ Returns
92
+ -------
93
+ float
94
+
95
+ Examples
96
+ --------
97
+ >>> round(q_value([2.014102, 3.016049], [4.002602, 1.008665]), 6) # D + T -> He4 + n
98
+ 0.018884
99
+ """
100
+ return sum(reactant_masses) - sum(product_masses)
@@ -0,0 +1,159 @@
1
+ r"""Cross-sections and Mandelstam kinematics.
2
+
3
+ Uses the same natural-unit convention (:math:`\hbar=c=1`) as
4
+ :mod:`physicskit.particle.kinematics`.
5
+
6
+ - :func:`mandelstam_s`, :func:`mandelstam_t`, :func:`mandelstam_u` -- the
7
+ three relativistic invariants of a 2-to-2 scattering process.
8
+ - :func:`rutherford_dsigma_domega`, :func:`impact_parameter` -- classical
9
+ Rutherford scattering off a Coulomb potential.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import numpy as np
15
+
16
+ __all__ = ["ALPHA_FS", "mandelstam_s", "mandelstam_t", "mandelstam_u", "rutherford_dsigma_domega", "impact_parameter"]
17
+
18
+ ALPHA_FS = 1 / 137.035999084
19
+ """The fine-structure constant, :math:`\\alpha\\approx1/137.036`."""
20
+
21
+
22
+ def _dot_squared(p1, p2, sign):
23
+ dE = p1.E + sign * p2.E
24
+ dpx = p1.px + sign * p2.px
25
+ dpy = p1.py + sign * p2.py
26
+ dpz = p1.pz + sign * p2.pz
27
+ return dE**2 - (dpx**2 + dpy**2 + dpz**2)
28
+
29
+
30
+ def mandelstam_s(p1, p2):
31
+ r"""Mandelstam :math:`s=(p_1+p_2)^2`, the total invariant mass squared.
32
+
33
+ Parameters
34
+ ----------
35
+ p1, p2 : physicskit.particle.kinematics.FourVector
36
+ The two incoming (or, by the same formula, any two summed) particles.
37
+
38
+ Returns
39
+ -------
40
+ float
41
+
42
+ Examples
43
+ --------
44
+ >>> from physicskit.particle.kinematics import FourVector
45
+ >>> p1 = FourVector(1.0, 0.0, 0.0, 0.6)
46
+ >>> p2 = FourVector(1.0, 0.0, 0.0, -0.6)
47
+ >>> round(mandelstam_s(p1, p2), 6)
48
+ 4.0
49
+ """
50
+ return float(_dot_squared(p1, p2, +1))
51
+
52
+
53
+ def mandelstam_t(p1, p3):
54
+ r"""Mandelstam :math:`t=(p_1-p_3)^2`, the momentum-transfer invariant.
55
+
56
+ Parameters
57
+ ----------
58
+ p1 : physicskit.particle.kinematics.FourVector
59
+ An incoming particle.
60
+ p3 : physicskit.particle.kinematics.FourVector
61
+ The outgoing particle it is compared to.
62
+
63
+ Returns
64
+ -------
65
+ float
66
+ """
67
+ return float(_dot_squared(p1, p3, -1))
68
+
69
+
70
+ def mandelstam_u(p1, p4):
71
+ r"""Mandelstam :math:`u=(p_1-p_4)^2`, the other momentum-transfer invariant.
72
+
73
+ Parameters
74
+ ----------
75
+ p1 : physicskit.particle.kinematics.FourVector
76
+ An incoming particle.
77
+ p4 : physicskit.particle.kinematics.FourVector
78
+ The other outgoing particle.
79
+
80
+ Returns
81
+ -------
82
+ float
83
+
84
+ Notes
85
+ -----
86
+ For a 2-to-2 process :math:`1+2\to3+4`, :math:`s+t+u=\sum_i m_i^2`.
87
+ """
88
+ return float(_dot_squared(p1, p4, -1))
89
+
90
+
91
+ def rutherford_dsigma_domega(theta, Z1, Z2, E_kin, alpha=ALPHA_FS):
92
+ r"""Rutherford differential cross section, in natural units.
93
+
94
+ .. math::
95
+
96
+ \frac{d\sigma}{d\Omega} = \left(\frac{Z_1Z_2\alpha}{4E_{\rm kin}}\right)^2
97
+ \frac{1}{\sin^4(\theta/2)}
98
+
99
+ Parameters
100
+ ----------
101
+ theta : array_like
102
+ Scattering angle (radians). ``theta=0`` gives ``inf`` -- the
103
+ genuine, integrable-but-divergent small-angle Rutherford behavior.
104
+ Z1, Z2 : float
105
+ Projectile and target charge numbers.
106
+ E_kin : float
107
+ Projectile kinetic energy.
108
+ alpha : float, default=ALPHA_FS
109
+ Coupling constant (the fine-structure constant, by default).
110
+
111
+ Returns
112
+ -------
113
+ ndarray or float
114
+
115
+ Examples
116
+ --------
117
+ >>> import numpy as np
118
+ >>> theta = np.array([np.pi / 4, np.pi / 2])
119
+ >>> vals = rutherford_dsigma_domega(theta, Z1=1, Z2=79, E_kin=5.0)
120
+ >>> ratio = (vals[0] * np.sin(theta[0] / 2) ** 4) / (vals[1] * np.sin(theta[1] / 2) ** 4)
121
+ >>> round(float(ratio), 6)
122
+ 1.0
123
+ """
124
+ theta = np.asarray(theta, dtype=float)
125
+ prefactor = (Z1 * Z2 * alpha / (4.0 * E_kin)) ** 2
126
+ with np.errstate(divide="ignore"):
127
+ result = prefactor / np.sin(theta / 2.0) ** 4
128
+ return result
129
+
130
+
131
+ def impact_parameter(theta, Z1, Z2, E_kin, alpha=ALPHA_FS):
132
+ r"""Classical Rutherford impact parameter producing scattering angle ``theta``.
133
+
134
+ .. math::
135
+
136
+ b(\theta) = \frac{Z_1Z_2\alpha}{2E_{\rm kin}}\cot(\theta/2)
137
+
138
+ Parameters
139
+ ----------
140
+ theta : array_like
141
+ Scattering angle (radians).
142
+ Z1, Z2 : float
143
+ Projectile and target charge numbers.
144
+ E_kin : float
145
+ Projectile kinetic energy.
146
+ alpha : float, default=ALPHA_FS
147
+ Coupling constant.
148
+
149
+ Returns
150
+ -------
151
+ ndarray or float
152
+
153
+ Examples
154
+ --------
155
+ >>> round(float(impact_parameter(np.pi, Z1=1, Z2=79, E_kin=5.0)), 6)
156
+ 0.0
157
+ """
158
+ theta = np.asarray(theta, dtype=float)
159
+ return (Z1 * Z2 * alpha / (2.0 * E_kin)) / np.tan(theta / 2.0)
File without changes
@@ -0,0 +1,7 @@
1
+ """Test-session setup: force Matplotlib's non-interactive Agg backend
2
+ before anything imports pyplot, so the suite (and CI, which has no
3
+ display) can exercise the plotting/animation code headlessly."""
4
+
5
+ import matplotlib
6
+
7
+ matplotlib.use("Agg")