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,101 @@
1
+ """Static plotting helpers: decay chain populations and differential cross sections.
2
+
3
+ Matplotlib is used throughout. Every function returns its figure object
4
+ rather than calling ``show()``, so it composes cleanly into larger
5
+ figures or headless pipelines.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import matplotlib.pyplot as plt
11
+ import numpy as np
12
+
13
+ __all__ = ["plot_decay_chain", "plot_differential_cross_section"]
14
+
15
+
16
+ def plot_decay_chain(t, populations, labels=None, ax=None):
17
+ """Plot each species' population over time in a radioactive decay chain.
18
+
19
+ Parameters
20
+ ----------
21
+ t : ndarray of shape (n_t,)
22
+ Times.
23
+ populations : ndarray of shape (n_species, n_t)
24
+ Population of each species over time, e.g. from
25
+ :func:`physicskit.particle.decays.bateman_decay_chain`.
26
+ labels : sequence of str, optional
27
+ Label for each species; defaults to ``"species 1"``, ``"species 2"``, ...
28
+ ax : matplotlib.axes.Axes, optional
29
+ Axes to draw into; a new figure is created if omitted.
30
+
31
+ Returns
32
+ -------
33
+ fig : matplotlib.figure.Figure
34
+ ax : matplotlib.axes.Axes
35
+
36
+ Examples
37
+ --------
38
+ >>> import numpy as np
39
+ >>> from physicskit.particle.decays import bateman_decay_chain
40
+ >>> t = np.linspace(0, 10, 50)
41
+ >>> N = bateman_decay_chain(1000.0, [0.5, 0.2], t)
42
+ >>> fig, ax = plot_decay_chain(t, N, labels=["Parent", "Daughter"])
43
+ >>> isinstance(fig, plt.Figure)
44
+ True
45
+ """
46
+ populations = np.asarray(populations)
47
+ if labels is None:
48
+ labels = [f"species {i + 1}" for i in range(populations.shape[0])]
49
+ if ax is None:
50
+ fig, ax = plt.subplots()
51
+ else:
52
+ fig = ax.figure
53
+ for row, label in zip(populations, labels, strict=True):
54
+ ax.plot(t, row, label=label)
55
+ ax.set_xlabel("t")
56
+ ax.set_ylabel("population")
57
+ ax.legend()
58
+ return fig, ax
59
+
60
+
61
+ def plot_differential_cross_section(theta, dsigma_domega, ax=None, log_scale=True):
62
+ """Plot a differential cross section :math:`d\\sigma/d\\Omega` vs. scattering angle.
63
+
64
+ Parameters
65
+ ----------
66
+ theta : ndarray of shape (n,)
67
+ Scattering angles (radians).
68
+ dsigma_domega : ndarray of shape (n,)
69
+ Differential cross section values, e.g. from
70
+ :func:`physicskit.particle.scattering.rutherford_dsigma_domega`.
71
+ ax : matplotlib.axes.Axes, optional
72
+ Axes to draw into; a new figure is created if omitted.
73
+ log_scale : bool, default=True
74
+ Plot the cross section on a log y-axis, appropriate for the
75
+ Rutherford formula's steep small-angle divergence.
76
+
77
+ Returns
78
+ -------
79
+ fig : matplotlib.figure.Figure
80
+ ax : matplotlib.axes.Axes
81
+
82
+ Examples
83
+ --------
84
+ >>> import numpy as np
85
+ >>> from physicskit.particle.scattering import rutherford_dsigma_domega
86
+ >>> theta = np.linspace(0.1, np.pi - 0.1, 50)
87
+ >>> vals = rutherford_dsigma_domega(theta, Z1=2, Z2=79, E_kin=5.0)
88
+ >>> fig, ax = plot_differential_cross_section(theta, vals)
89
+ >>> isinstance(fig, plt.Figure)
90
+ True
91
+ """
92
+ if ax is None:
93
+ fig, ax = plt.subplots()
94
+ else:
95
+ fig = ax.figure
96
+ ax.plot(theta, dsigma_domega)
97
+ if log_scale:
98
+ ax.set_yscale("log")
99
+ ax.set_xlabel(r"$\theta$")
100
+ ax.set_ylabel(r"$d\sigma/d\Omega$")
101
+ return fig, ax
@@ -0,0 +1,176 @@
1
+ """Computational plasma physics: single-particle motion, MHD, waves, and kinetic theory.
2
+
3
+ Typical usage::
4
+
5
+ import physicskit as pk
6
+ import numpy as np
7
+
8
+ # Cyclotron gyration of a proton in a 1 T field:
9
+ r_hist, v_hist = pk.plasma.boris_integrate(
10
+ np.zeros(3), np.array([1e5, 0.0, 0.0]),
11
+ pk.plasma.QE, pk.plasma.MP,
12
+ np.zeros(3), np.array([0.0, 0.0, 1.0]),
13
+ dt=1e-10, steps=1000,
14
+ )
15
+ """
16
+
17
+ from .acceleration import simulate_wakefield_acceleration, wakefield_e_field
18
+ from .instabilities import (
19
+ reconnection_field_from_flux,
20
+ reconnection_harris_ic,
21
+ reconnection_inflow_velocity,
22
+ simulate_reconnection,
23
+ simulate_weibel_filamentation,
24
+ weibel_fastest_growing_mode,
25
+ weibel_growth_rate,
26
+ )
27
+ from .kinetic import (
28
+ deposit_number_density,
29
+ interpolate_field,
30
+ landau_damping_ic,
31
+ landau_damping_rate,
32
+ langmuir_wave_ic,
33
+ maxwellian_velocities,
34
+ pic_simulate,
35
+ pic_step,
36
+ solve_poisson_1d,
37
+ two_stream_ic,
38
+ )
39
+ from .mhd import (
40
+ MU0,
41
+ alfven_speed,
42
+ grad_shafranov_rhs_solovev,
43
+ lundquist_number,
44
+ magnetosonic_speeds,
45
+ petschek_rate,
46
+ resistive_diffusion_time,
47
+ safety_factor_large_aspect_ratio,
48
+ solovev_particular_solution,
49
+ solve_grad_shafranov,
50
+ sound_speed,
51
+ sweet_parker_layer_width,
52
+ sweet_parker_rate,
53
+ )
54
+ from .single_particle import (
55
+ ME,
56
+ MP,
57
+ QE,
58
+ boris_integrate,
59
+ boris_push,
60
+ curvature_drift,
61
+ cyclotron_frequency,
62
+ exb_drift,
63
+ grad_b_drift,
64
+ larmor_radius,
65
+ magnetic_mirror_bounce,
66
+ magnetic_moment,
67
+ mirror_force,
68
+ )
69
+ from .turbulence import drift_wave_noise_ic, hasegawa_mima_rhs, simulate_hasegawa_mima
70
+ from .visualizers import (
71
+ animate_alfven_wave,
72
+ animate_drift_wave_turbulence,
73
+ animate_ion_acoustic_soliton,
74
+ animate_langmuir_wave,
75
+ animate_reconnection,
76
+ animate_two_stream_phase_space,
77
+ animate_wakefield_acceleration,
78
+ animate_weibel_filamentation,
79
+ plot_cma_diagram,
80
+ plot_drift_trajectory,
81
+ plot_field_energy_history,
82
+ plot_flux_surfaces,
83
+ plot_particle_orbit_3d,
84
+ plot_phase_space,
85
+ plot_phase_space_interactive,
86
+ plot_q_profile,
87
+ )
88
+ from .waves import (
89
+ alfven_wave_pulse_ic,
90
+ cma_coordinates,
91
+ cold_plasma_dispersion,
92
+ ion_acoustic_soliton_evolve,
93
+ ion_acoustic_soliton_profile,
94
+ plasma_frequency,
95
+ rl_parameters,
96
+ simulate_alfven_wave,
97
+ stix_parameters,
98
+ whistler_dispersion,
99
+ )
100
+
101
+ __all__ = [
102
+ "QE",
103
+ "ME",
104
+ "MP",
105
+ "MU0",
106
+ "cyclotron_frequency",
107
+ "larmor_radius",
108
+ "magnetic_moment",
109
+ "boris_push",
110
+ "boris_integrate",
111
+ "exb_drift",
112
+ "grad_b_drift",
113
+ "curvature_drift",
114
+ "mirror_force",
115
+ "magnetic_mirror_bounce",
116
+ "alfven_speed",
117
+ "sound_speed",
118
+ "magnetosonic_speeds",
119
+ "solovev_particular_solution",
120
+ "grad_shafranov_rhs_solovev",
121
+ "solve_grad_shafranov",
122
+ "safety_factor_large_aspect_ratio",
123
+ "lundquist_number",
124
+ "resistive_diffusion_time",
125
+ "sweet_parker_rate",
126
+ "sweet_parker_layer_width",
127
+ "petschek_rate",
128
+ "plasma_frequency",
129
+ "stix_parameters",
130
+ "rl_parameters",
131
+ "cold_plasma_dispersion",
132
+ "whistler_dispersion",
133
+ "cma_coordinates",
134
+ "maxwellian_velocities",
135
+ "landau_damping_ic",
136
+ "langmuir_wave_ic",
137
+ "two_stream_ic",
138
+ "deposit_number_density",
139
+ "interpolate_field",
140
+ "solve_poisson_1d",
141
+ "pic_step",
142
+ "pic_simulate",
143
+ "landau_damping_rate",
144
+ "reconnection_harris_ic",
145
+ "reconnection_inflow_velocity",
146
+ "reconnection_field_from_flux",
147
+ "simulate_reconnection",
148
+ "weibel_growth_rate",
149
+ "weibel_fastest_growing_mode",
150
+ "simulate_weibel_filamentation",
151
+ "ion_acoustic_soliton_profile",
152
+ "ion_acoustic_soliton_evolve",
153
+ "alfven_wave_pulse_ic",
154
+ "simulate_alfven_wave",
155
+ "drift_wave_noise_ic",
156
+ "hasegawa_mima_rhs",
157
+ "simulate_hasegawa_mima",
158
+ "wakefield_e_field",
159
+ "simulate_wakefield_acceleration",
160
+ "plot_particle_orbit_3d",
161
+ "plot_drift_trajectory",
162
+ "plot_flux_surfaces",
163
+ "plot_q_profile",
164
+ "plot_phase_space",
165
+ "plot_field_energy_history",
166
+ "plot_cma_diagram",
167
+ "plot_phase_space_interactive",
168
+ "animate_reconnection",
169
+ "animate_weibel_filamentation",
170
+ "animate_two_stream_phase_space",
171
+ "animate_langmuir_wave",
172
+ "animate_ion_acoustic_soliton",
173
+ "animate_drift_wave_turbulence",
174
+ "animate_alfven_wave",
175
+ "animate_wakefield_acceleration",
176
+ ]
@@ -0,0 +1,152 @@
1
+ """Plasma-wakefield-style particle acceleration: a test charge surfing a prescribed traveling wave.
2
+
3
+ A full plasma-wakefield-accelerator simulation would derive the
4
+ accelerating field self-consistently from a driver beam or laser pulse
5
+ depositing momentum into the plasma via PIC (as :mod:`physicskit.plasma.kinetic`
6
+ does for electrostatic waves, just relativistically and in the wake of a
7
+ driver). That is a large undertaking; the standard pedagogical
8
+ simplification -- used throughout introductory wakefield-acceleration
9
+ treatments -- is instead to *prescribe* the wakefield as a traveling
10
+ longitudinal electric-field wave :math:`E_z(x,t)=E_0\\cos[k(x-v_{ph}t)]`
11
+ (a rigid wake moving at the driver's phase velocity :math:`v_{ph}`, not fed
12
+ back on by the accelerated particle) and inject a single test charge into
13
+ it with :func:`physicskit.plasma.single_particle.boris_push` (setting
14
+ :math:`\\mathbf{B}=0`, since this toy model has no transverse focusing
15
+ field). A particle riding near the wave's phase velocity feels a
16
+ sign-definite accelerating field for as long as it stays within one
17
+ quarter-wavelength of the field's zero-crossing (the "accelerating bucket"),
18
+ gaining energy at the expense of the (externally prescribed, infinite-energy-
19
+ reservoir) wave, exactly the qualitative picture of plasma wakefield
20
+ acceleration without any of its self-consistent field generation.
21
+ """
22
+
23
+ from __future__ import annotations
24
+
25
+ import numpy as np
26
+
27
+ from physicskit.plasma.single_particle import boris_push
28
+
29
+ __all__ = [
30
+ "wakefield_e_field",
31
+ "simulate_wakefield_acceleration",
32
+ ]
33
+
34
+
35
+ def wakefield_e_field(x: np.ndarray, t: float, E0: float, k: float, v_phase: float) -> np.ndarray:
36
+ """Prescribed traveling-wave longitudinal wakefield :math:`E_z(x,t) = E_0\\cos[k(x - v_{ph}t)]`.
37
+
38
+ A rigid sinusoidal accelerating structure moving at the fixed phase
39
+ velocity `v_phase`, standing in for the self-consistent plasma
40
+ wakefield a real driver beam or laser wake would generate (see the
41
+ module docstring for the simplification this represents).
42
+
43
+ Parameters
44
+ ----------
45
+ x : ndarray or float
46
+ Position(s) at which to evaluate the field.
47
+ t : float
48
+ Time.
49
+ E0 : float
50
+ Peak field amplitude.
51
+ k : float
52
+ Wakefield wavenumber.
53
+ v_phase : float
54
+ Phase velocity of the traveling wave.
55
+
56
+ Returns
57
+ -------
58
+ ndarray or float
59
+ :math:`E_z(x, t)`, same shape as `x`.
60
+
61
+ See Also
62
+ --------
63
+ simulate_wakefield_acceleration : Injects a test particle into this field.
64
+
65
+ Examples
66
+ --------
67
+ >>> round(float(wakefield_e_field(0.0, t=0.0, E0=1.0, k=1.0, v_phase=1.0)), 6)
68
+ 1.0
69
+ """
70
+ return E0 * np.cos(k * (x - v_phase * t))
71
+
72
+
73
+ def simulate_wakefield_acceleration(x0: float, v0: float, q: float, m: float, E0: float, k: float, v_phase: float, dt: float, steps: int) -> dict:
74
+ """Integrate a test charge's 1D motion in the prescribed traveling wakefield, with the Boris pusher.
75
+
76
+ Calls :func:`physicskit.plasma.single_particle.boris_push` once per
77
+ step with :math:`\\mathbf{B}=0` and :math:`\\mathbf{E}=(E_z(x,t),0,0)`
78
+ re-evaluated at the particle's *current* position and time each
79
+ step -- unlike :func:`physicskit.plasma.single_particle.boris_integrate`,
80
+ which assumes a field uniform in space and time, this wakefield varies
81
+ in both, so the field must be recomputed every step rather than
82
+ baked into a single Numba-compiled loop. The pusher itself remains
83
+ exactly energy-conserving in a pure magnetic field and exact-leapfrog
84
+ in a pure electric field; it is otherwise an ordinary (non-relativistic)
85
+ classical integrator, so results should be read qualitatively once
86
+ the particle's speed approaches a meaningful fraction of `v_phase`
87
+ (real wakefield acceleration is an intrinsically relativistic problem).
88
+
89
+ Parameters
90
+ ----------
91
+ x0 : float
92
+ Initial position along the wave.
93
+ v0 : float
94
+ Initial longitudinal velocity.
95
+ q : float
96
+ Particle charge.
97
+ m : float
98
+ Particle mass.
99
+ E0 : float
100
+ Peak wakefield amplitude, from :func:`wakefield_e_field`.
101
+ k : float
102
+ Wakefield wavenumber.
103
+ v_phase : float
104
+ Wakefield phase velocity.
105
+ dt : float
106
+ Time step.
107
+ steps : int
108
+ Number of steps to advance.
109
+
110
+ Returns
111
+ -------
112
+ dict
113
+ ``{"t": ndarray shape (steps+1,), "x": position history, "v":
114
+ longitudinal velocity history, "kinetic_energy": :math:`\\tfrac12 m v^2`
115
+ history}``.
116
+
117
+ See Also
118
+ --------
119
+ wakefield_e_field : The prescribed field this particle rides.
120
+
121
+ Examples
122
+ --------
123
+ A particle launched exactly at the wave's phase velocity, sitting on
124
+ the accelerating part of the field, gains kinetic energy:
125
+
126
+ >>> import numpy as np
127
+ >>> result = simulate_wakefield_acceleration(
128
+ ... x0=0.0, v0=0.9, q=1.0, m=1.0, E0=0.05, k=1.0, v_phase=1.0, dt=0.01, steps=2000
129
+ ... )
130
+ >>> bool(result["kinetic_energy"][-1] > result["kinetic_energy"][0])
131
+ True
132
+ """
133
+ pos = np.array([x0, 0.0, 0.0])
134
+ vel = np.array([v0, 0.0, 0.0])
135
+ B = np.zeros(3)
136
+
137
+ n = steps + 1
138
+ x_hist = np.empty(n)
139
+ v_hist = np.empty(n)
140
+ x_hist[0], v_hist[0] = pos[0], vel[0]
141
+
142
+ t = 0.0
143
+ for i in range(steps):
144
+ Ez = wakefield_e_field(pos[0], t, E0, k, v_phase)
145
+ E = np.array([Ez, 0.0, 0.0])
146
+ pos, vel = boris_push(pos, vel, q, m, E, B, dt)
147
+ t += dt
148
+ x_hist[i + 1], v_hist[i + 1] = pos[0], vel[0]
149
+
150
+ t_hist = np.arange(n) * dt
151
+ kinetic_energy = 0.5 * m * v_hist**2
152
+ return {"t": t_hist, "x": x_hist, "v": v_hist, "kinetic_energy": kinetic_energy}