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.
- physicskit/__init__.py +51 -0
- physicskit/astro/__init__.py +66 -0
- physicskit/astro/cosmic_web.py +395 -0
- physicskit/astro/galactic_dynamics.py +137 -0
- physicskit/astro/nbody.py +208 -0
- physicskit/astro/orbital_mechanics.py +220 -0
- physicskit/astro/stellar_dynamo.py +628 -0
- physicskit/astro/stellar_structure.py +198 -0
- physicskit/astro/tests/__init__.py +0 -0
- physicskit/astro/tests/conftest.py +7 -0
- physicskit/astro/tests/test_cosmic_web.py +159 -0
- physicskit/astro/tests/test_galactic_dynamics.py +46 -0
- physicskit/astro/tests/test_nbody.py +81 -0
- physicskit/astro/tests/test_orbital_mechanics.py +73 -0
- physicskit/astro/tests/test_stellar_dynamo.py +198 -0
- physicskit/astro/tests/test_stellar_structure.py +52 -0
- physicskit/astro/tests/test_visualizers.py +159 -0
- physicskit/astro/visualizers.py +628 -0
- physicskit/chaos/__init__.py +55 -0
- physicskit/chaos/core/__init__.py +3 -0
- physicskit/chaos/core/base_system.py +342 -0
- physicskit/chaos/core/integrators.py +40 -0
- physicskit/chaos/exceptions.py +24 -0
- physicskit/chaos/quantum/__init__.py +38 -0
- physicskit/chaos/quantum/billiards.py +274 -0
- physicskit/chaos/quantum/husimi.py +85 -0
- physicskit/chaos/quantum/maps.py +366 -0
- physicskit/chaos/systems/__init__.py +38 -0
- physicskit/chaos/systems/billiards.py +1131 -0
- physicskit/chaos/systems/continuous.py +1276 -0
- physicskit/chaos/systems/maps.py +557 -0
- physicskit/chaos/tests/__init__.py +0 -0
- physicskit/chaos/tests/test_basins.py +76 -0
- physicskit/chaos/tests/test_bifurcation.py +132 -0
- physicskit/chaos/tests/test_billiards.py +115 -0
- physicskit/chaos/tests/test_continuous.py +224 -0
- physicskit/chaos/tests/test_dimension.py +69 -0
- physicskit/chaos/tests/test_divergence.py +90 -0
- physicskit/chaos/tests/test_dynamic_plots.py +269 -0
- physicskit/chaos/tests/test_integrators.py +96 -0
- physicskit/chaos/tests/test_io.py +41 -0
- physicskit/chaos/tests/test_maps.py +110 -0
- physicskit/chaos/tests/test_metrics.py +115 -0
- physicskit/chaos/tests/test_phase_space.py +73 -0
- physicskit/chaos/tests/test_properties.py +116 -0
- physicskit/chaos/tests/test_quantum_billiards.py +94 -0
- physicskit/chaos/tests/test_quantum_maps.py +144 -0
- physicskit/chaos/tests/test_recurrence.py +51 -0
- physicskit/chaos/tests/test_repr_and_api_consistency.py +134 -0
- physicskit/chaos/tests/test_section.py +49 -0
- physicskit/chaos/tests/test_spectral.py +48 -0
- physicskit/chaos/tests/test_streamlit_app.py +45 -0
- physicskit/chaos/tests/test_timeseries.py +131 -0
- physicskit/chaos/tests/test_viewer3d.py +41 -0
- physicskit/chaos/utils/__init__.py +46 -0
- physicskit/chaos/utils/dimension.py +139 -0
- physicskit/chaos/utils/io.py +95 -0
- physicskit/chaos/utils/metrics.py +304 -0
- physicskit/chaos/utils/recurrence.py +122 -0
- physicskit/chaos/utils/spectral.py +69 -0
- physicskit/chaos/utils/timeseries.py +303 -0
- physicskit/chaos/visualizers/__init__.py +85 -0
- physicskit/chaos/visualizers/basins.py +185 -0
- physicskit/chaos/visualizers/bifurcation.py +273 -0
- physicskit/chaos/visualizers/divergence.py +374 -0
- physicskit/chaos/visualizers/dynamic_plots.py +1372 -0
- physicskit/chaos/visualizers/phase_space.py +133 -0
- physicskit/chaos/visualizers/quantum.py +299 -0
- physicskit/chaos/visualizers/recurrence.py +91 -0
- physicskit/chaos/visualizers/section.py +161 -0
- physicskit/chaos/visualizers/theme.py +31 -0
- physicskit/chaos/visualizers/viewer3d.py +82 -0
- physicskit/classical/__init__.py +55 -0
- physicskit/classical/core/__init__.py +17 -0
- physicskit/classical/core/base_system.py +510 -0
- physicskit/classical/core/integrators.py +397 -0
- physicskit/classical/systems/__init__.py +32 -0
- physicskit/classical/systems/chains.py +334 -0
- physicskit/classical/systems/hamiltonian.py +215 -0
- physicskit/classical/systems/lagrangian.py +308 -0
- physicskit/classical/systems/newtonian.py +536 -0
- physicskit/classical/systems/rotations.py +614 -0
- physicskit/classical/tests/__init__.py +0 -0
- physicskit/classical/tests/conftest.py +7 -0
- physicskit/classical/tests/test_base_system.py +113 -0
- physicskit/classical/tests/test_chains.py +84 -0
- physicskit/classical/tests/test_conservation.py +244 -0
- physicskit/classical/tests/test_conservation_utils.py +47 -0
- physicskit/classical/tests/test_hamiltonian.py +44 -0
- physicskit/classical/tests/test_integrators.py +123 -0
- physicskit/classical/tests/test_lagrangian.py +69 -0
- physicskit/classical/tests/test_newtonian.py +45 -0
- physicskit/classical/tests/test_rotations.py +160 -0
- physicskit/classical/tests/test_stepsize.py +149 -0
- physicskit/classical/tests/test_symbolic.py +125 -0
- physicskit/classical/tests/test_visualizers.py +172 -0
- physicskit/classical/utils/__init__.py +20 -0
- physicskit/classical/utils/conservation.py +126 -0
- physicskit/classical/utils/stepsize.py +187 -0
- physicskit/classical/utils/symbolic.py +235 -0
- physicskit/classical/visualizers/__init__.py +25 -0
- physicskit/classical/visualizers/animations.py +508 -0
- physicskit/classical/visualizers/interactive.py +113 -0
- physicskit/classical/visualizers/modal_analysis.py +97 -0
- physicskit/classical/visualizers/phase_space.py +214 -0
- physicskit/condensed/__init__.py +122 -0
- physicskit/condensed/anderson_localization.py +155 -0
- physicskit/condensed/correlated.py +284 -0
- physicskit/condensed/ginzburg_landau.py +220 -0
- physicskit/condensed/landau_levels.py +246 -0
- physicskit/condensed/laughlin.py +229 -0
- physicskit/condensed/models.py +627 -0
- physicskit/condensed/tests/__init__.py +0 -0
- physicskit/condensed/tests/test_condensed.py +518 -0
- physicskit/condensed/tests/test_visualizers.py +87 -0
- physicskit/condensed/tight_binding.py +445 -0
- physicskit/condensed/topological_insulator_3d.py +178 -0
- physicskit/condensed/topology.py +217 -0
- physicskit/condensed/visualizers.py +296 -0
- physicskit/condensed/weyl.py +180 -0
- physicskit/constants.py +184 -0
- physicskit/fields/__init__.py +111 -0
- physicskit/fields/electrodynamics.py +671 -0
- physicskit/fields/quantum_fields.py +510 -0
- physicskit/fields/solitons.py +527 -0
- physicskit/fields/tests/__init__.py +0 -0
- physicskit/fields/tests/conftest.py +7 -0
- physicskit/fields/tests/test_field_animations.py +154 -0
- physicskit/fields/tests/test_fields.py +439 -0
- physicskit/fields/tests/test_visualizers.py +101 -0
- physicskit/fields/visualizers.py +503 -0
- physicskit/fluids/__init__.py +134 -0
- physicskit/fluids/core/__init__.py +23 -0
- physicskit/fluids/core/grid.py +165 -0
- physicskit/fluids/core/timestepping.py +231 -0
- physicskit/fluids/exceptions.py +26 -0
- physicskit/fluids/systems/__init__.py +70 -0
- physicskit/fluids/systems/compressible_flow.py +281 -0
- physicskit/fluids/systems/instabilities.py +343 -0
- physicskit/fluids/systems/navier_stokes.py +221 -0
- physicskit/fluids/systems/potential_flow.py +440 -0
- physicskit/fluids/systems/viscous_flow.py +425 -0
- physicskit/fluids/systems/vortex_dynamics.py +304 -0
- physicskit/fluids/tests/__init__.py +0 -0
- physicskit/fluids/tests/conftest.py +7 -0
- physicskit/fluids/tests/test_compressible_flow.py +66 -0
- physicskit/fluids/tests/test_instabilities.py +115 -0
- physicskit/fluids/tests/test_navier_stokes.py +67 -0
- physicskit/fluids/tests/test_potential_flow.py +92 -0
- physicskit/fluids/tests/test_static_visualizers.py +91 -0
- physicskit/fluids/tests/test_utils.py +100 -0
- physicskit/fluids/tests/test_viscous_flow.py +110 -0
- physicskit/fluids/tests/test_visualizers.py +34 -0
- physicskit/fluids/tests/test_vortex_dynamics.py +88 -0
- physicskit/fluids/utils/__init__.py +18 -0
- physicskit/fluids/utils/dimensionless.py +239 -0
- physicskit/fluids/utils/spectral_analysis.py +142 -0
- physicskit/fluids/visualizers/__init__.py +14 -0
- physicskit/fluids/visualizers/compressible.py +39 -0
- physicskit/fluids/visualizers/flow_fields.py +252 -0
- physicskit/fluids/visualizers/potential_flow.py +51 -0
- physicskit/fluids/visualizers/spectra.py +62 -0
- physicskit/fluids/visualizers/theme.py +38 -0
- physicskit/integrators/__init__.py +52 -0
- physicskit/integrators/adaptive.py +199 -0
- physicskit/integrators/fixed_step.py +360 -0
- physicskit/integrators/tests/__init__.py +0 -0
- physicskit/integrators/tests/test_integrators.py +101 -0
- physicskit/optics/__init__.py +124 -0
- physicskit/optics/_compat.py +5 -0
- physicskit/optics/gaussian.py +382 -0
- physicskit/optics/quantum_optics.py +428 -0
- physicskit/optics/ray.py +469 -0
- physicskit/optics/tests/__init__.py +0 -0
- physicskit/optics/tests/test_diffraction_animation.py +38 -0
- physicskit/optics/tests/test_gaussian.py +170 -0
- physicskit/optics/tests/test_quantum_optics.py +147 -0
- physicskit/optics/tests/test_ray.py +177 -0
- physicskit/optics/tests/test_visualizers.py +58 -0
- physicskit/optics/tests/test_wave.py +146 -0
- physicskit/optics/visualizers.py +264 -0
- physicskit/optics/wave.py +365 -0
- physicskit/particle/__init__.py +152 -0
- physicskit/particle/collider.py +382 -0
- physicskit/particle/confinement.py +125 -0
- physicskit/particle/decays.py +357 -0
- physicskit/particle/electroweak.py +300 -0
- physicskit/particle/kinematics.py +271 -0
- physicskit/particle/neutrinos.py +84 -0
- physicskit/particle/nuclear.py +100 -0
- physicskit/particle/scattering.py +159 -0
- physicskit/particle/tests/__init__.py +0 -0
- physicskit/particle/tests/conftest.py +7 -0
- physicskit/particle/tests/test_collider.py +119 -0
- physicskit/particle/tests/test_confinement.py +42 -0
- physicskit/particle/tests/test_decays.py +112 -0
- physicskit/particle/tests/test_electroweak.py +97 -0
- physicskit/particle/tests/test_kinematics.py +138 -0
- physicskit/particle/tests/test_neutrinos.py +36 -0
- physicskit/particle/tests/test_nuclear.py +45 -0
- physicskit/particle/tests/test_scattering.py +64 -0
- physicskit/particle/tests/test_visualizers.py +214 -0
- physicskit/particle/visualizers/__init__.py +38 -0
- physicskit/particle/visualizers/animations.py +705 -0
- physicskit/particle/visualizers/static.py +101 -0
- physicskit/plasma/__init__.py +176 -0
- physicskit/plasma/acceleration.py +152 -0
- physicskit/plasma/instabilities.py +417 -0
- physicskit/plasma/kinetic.py +588 -0
- physicskit/plasma/mhd.py +463 -0
- physicskit/plasma/single_particle.py +562 -0
- physicskit/plasma/tests/__init__.py +0 -0
- physicskit/plasma/tests/conftest.py +7 -0
- physicskit/plasma/tests/test_new_time_domain_features.py +222 -0
- physicskit/plasma/tests/test_plasma.py +232 -0
- physicskit/plasma/tests/test_visualizers.py +79 -0
- physicskit/plasma/turbulence.py +219 -0
- physicskit/plasma/visualizers.py +868 -0
- physicskit/plasma/waves.py +549 -0
- physicskit/quantum/__init__.py +180 -0
- physicskit/quantum/_compat.py +20 -0
- physicskit/quantum/chapters/__init__.py +0 -0
- physicskit/quantum/chapters/entanglement.py +489 -0
- physicskit/quantum/chapters/harmonic_spin.py +517 -0
- physicskit/quantum/chapters/hydrogen_am.py +292 -0
- physicskit/quantum/chapters/perturbation.py +350 -0
- physicskit/quantum/chapters/potentials.py +997 -0
- physicskit/quantum/chapters/spin.py +306 -0
- physicskit/quantum/chapters/wave_packets.py +541 -0
- physicskit/quantum/core/__init__.py +0 -0
- physicskit/quantum/core/eigensolvers.py +311 -0
- physicskit/quantum/core/operators.py +296 -0
- physicskit/quantum/core/solvers.py +271 -0
- physicskit/quantum/tests/__init__.py +0 -0
- physicskit/quantum/tests/conftest.py +7 -0
- physicskit/quantum/tests/test_animations.py +225 -0
- physicskit/quantum/tests/test_compat.py +43 -0
- physicskit/quantum/tests/test_eigensolvers.py +24 -0
- physicskit/quantum/tests/test_entanglement.py +127 -0
- physicskit/quantum/tests/test_harmonic_spin.py +140 -0
- physicskit/quantum/tests/test_hydrogen_am.py +48 -0
- physicskit/quantum/tests/test_measure.py +110 -0
- physicskit/quantum/tests/test_operators.py +105 -0
- physicskit/quantum/tests/test_perturbation.py +112 -0
- physicskit/quantum/tests/test_physics_checks.py +131 -0
- physicskit/quantum/tests/test_potentials.py +191 -0
- physicskit/quantum/tests/test_solvers.py +70 -0
- physicskit/quantum/tests/test_spin.py +22 -0
- physicskit/quantum/tests/test_unitarity.py +84 -0
- physicskit/quantum/tests/test_wave_packets.py +53 -0
- physicskit/quantum/utils/__init__.py +0 -0
- physicskit/quantum/utils/measure.py +253 -0
- physicskit/quantum/visualizers/__init__.py +0 -0
- physicskit/quantum/visualizers/bloch_sphere.py +205 -0
- physicskit/quantum/visualizers/entanglement.py +58 -0
- physicskit/quantum/visualizers/orbitals.py +187 -0
- physicskit/quantum/visualizers/phase_space.py +179 -0
- physicskit/quantum/visualizers/wavefunctions.py +230 -0
- physicskit/relativity/__init__.py +61 -0
- physicskit/relativity/chapters/__init__.py +33 -0
- physicskit/relativity/chapters/cosmology.py +190 -0
- physicskit/relativity/chapters/gw_merger.py +399 -0
- physicskit/relativity/chapters/kerr.py +371 -0
- physicskit/relativity/chapters/lensing.py +196 -0
- physicskit/relativity/chapters/neutron_star.py +149 -0
- physicskit/relativity/chapters/schwarzschild.py +412 -0
- physicskit/relativity/chapters/timekeeping.py +133 -0
- physicskit/relativity/core/__init__.py +12 -0
- physicskit/relativity/core/geodesics.py +216 -0
- physicskit/relativity/core/kerr_raytracer.py +259 -0
- physicskit/relativity/core/raytracer.py +241 -0
- physicskit/relativity/core/tensors.py +468 -0
- physicskit/relativity/tests/__init__.py +0 -0
- physicskit/relativity/tests/test_conservations.py +54 -0
- physicskit/relativity/tests/test_constants.py +34 -0
- physicskit/relativity/tests/test_cosmology.py +61 -0
- physicskit/relativity/tests/test_gw_merger.py +117 -0
- physicskit/relativity/tests/test_kerr.py +116 -0
- physicskit/relativity/tests/test_kerr_raytracer.py +103 -0
- physicskit/relativity/tests/test_lensing.py +75 -0
- physicskit/relativity/tests/test_neutron_star.py +48 -0
- physicskit/relativity/tests/test_raytracer.py +67 -0
- physicskit/relativity/tests/test_schwarzschild.py +126 -0
- physicskit/relativity/tests/test_shadow_render.py +81 -0
- physicskit/relativity/tests/test_tensors.py +86 -0
- physicskit/relativity/tests/test_timekeeping.py +51 -0
- physicskit/relativity/tests/test_visualizers_misc.py +115 -0
- physicskit/relativity/utils/__init__.py +1 -0
- physicskit/relativity/utils/constants.py +232 -0
- physicskit/relativity/visualizers/__init__.py +46 -0
- physicskit/relativity/visualizers/interactive.py +127 -0
- physicskit/relativity/visualizers/shadow_render.py +367 -0
- physicskit/relativity/visualizers/spacetime_3d.py +92 -0
- physicskit/relativity/visualizers/spacetime_diagrams.py +198 -0
- physicskit/relativity/visualizers/wave_plots.py +185 -0
- physicskit/rmt/__init__.py +8 -0
- physicskit/rmt/ensembles/__init__.py +108 -0
- physicskit/rmt/ensembles/banded.py +114 -0
- physicskit/rmt/ensembles/base.py +135 -0
- physicskit/rmt/ensembles/bdg.py +218 -0
- physicskit/rmt/ensembles/chiral.py +308 -0
- physicskit/rmt/ensembles/circular.py +104 -0
- physicskit/rmt/ensembles/crossover.py +82 -0
- physicskit/rmt/ensembles/density_matrix.py +148 -0
- physicskit/rmt/ensembles/effective_hamiltonian.py +230 -0
- physicskit/rmt/ensembles/embedded.py +207 -0
- physicskit/rmt/ensembles/gaussian.py +153 -0
- physicskit/rmt/ensembles/ginibre.py +110 -0
- physicskit/rmt/ensembles/girko.py +190 -0
- physicskit/rmt/ensembles/graph_laplacian.py +92 -0
- physicskit/rmt/ensembles/haar.py +57 -0
- physicskit/rmt/ensembles/jacobi.py +182 -0
- physicskit/rmt/ensembles/poisson.py +77 -0
- physicskit/rmt/ensembles/polynomial.py +139 -0
- physicskit/rmt/ensembles/pt_symmetric.py +120 -0
- physicskit/rmt/ensembles/single_ring.py +170 -0
- physicskit/rmt/ensembles/sparse.py +95 -0
- physicskit/rmt/ensembles/syk.py +170 -0
- physicskit/rmt/ensembles/truncated_unitary.py +80 -0
- physicskit/rmt/ensembles/universality.py +92 -0
- physicskit/rmt/ensembles/wishart.py +88 -0
- physicskit/rmt/py.typed +0 -0
- physicskit/rmt/spectrum.py +82 -0
- physicskit/rmt/stats/__init__.py +160 -0
- physicskit/rmt/stats/characteristic_polynomial.py +77 -0
- physicskit/rmt/stats/circular_law.py +54 -0
- physicskit/rmt/stats/correlations.py +162 -0
- physicskit/rmt/stats/density.py +70 -0
- physicskit/rmt/stats/entanglement.py +36 -0
- physicskit/rmt/stats/free_probability.py +202 -0
- physicskit/rmt/stats/localization.py +338 -0
- physicskit/rmt/stats/marchenko_pastur.py +55 -0
- physicskit/rmt/stats/pt_symmetric.py +265 -0
- physicskit/rmt/stats/ratios.py +110 -0
- physicskit/rmt/stats/real_ginibre.py +134 -0
- physicskit/rmt/stats/rigidity.py +272 -0
- physicskit/rmt/stats/single_ring.py +95 -0
- physicskit/rmt/stats/spacing.py +150 -0
- physicskit/rmt/stats/tracy_widom.py +175 -0
- physicskit/rmt/stats/truncated_unitary.py +40 -0
- physicskit/rmt/stats/unfolding.py +37 -0
- physicskit/rmt/stats/wachter.py +67 -0
- physicskit/rmt/tests/__init__.py +0 -0
- physicskit/rmt/tests/cache_utils.py +107 -0
- physicskit/rmt/tests/conftest.py +8 -0
- physicskit/rmt/tests/test_banded.py +86 -0
- physicskit/rmt/tests/test_base.py +29 -0
- physicskit/rmt/tests/test_bdg.py +133 -0
- physicskit/rmt/tests/test_characteristic_polynomial.py +50 -0
- physicskit/rmt/tests/test_chiral.py +273 -0
- physicskit/rmt/tests/test_circular.py +225 -0
- physicskit/rmt/tests/test_crossover.py +72 -0
- physicskit/rmt/tests/test_density.py +23 -0
- physicskit/rmt/tests/test_density_matrix.py +181 -0
- physicskit/rmt/tests/test_effective_hamiltonian.py +140 -0
- physicskit/rmt/tests/test_embedded.py +169 -0
- physicskit/rmt/tests/test_free_probability.py +81 -0
- physicskit/rmt/tests/test_gaussian_ensembles.py +22 -0
- physicskit/rmt/tests/test_gaussian_semicircle.py +127 -0
- physicskit/rmt/tests/test_ginibre_circular_law.py +131 -0
- physicskit/rmt/tests/test_girko.py +178 -0
- physicskit/rmt/tests/test_graph_laplacian.py +102 -0
- physicskit/rmt/tests/test_haar.py +118 -0
- physicskit/rmt/tests/test_jacobi_wachter.py +136 -0
- physicskit/rmt/tests/test_localization.py +240 -0
- physicskit/rmt/tests/test_poisson.py +149 -0
- physicskit/rmt/tests/test_polynomial.py +107 -0
- physicskit/rmt/tests/test_pt_symmetric.py +178 -0
- physicskit/rmt/tests/test_random_state.py +19 -0
- physicskit/rmt/tests/test_real_ginibre.py +112 -0
- physicskit/rmt/tests/test_rigidity_universality.py +167 -0
- physicskit/rmt/tests/test_single_ring.py +132 -0
- physicskit/rmt/tests/test_spacing_and_ratios.py +122 -0
- physicskit/rmt/tests/test_sparse.py +71 -0
- physicskit/rmt/tests/test_spectrum.py +27 -0
- physicskit/rmt/tests/test_syk.py +136 -0
- physicskit/rmt/tests/test_tracy_widom.py +113 -0
- physicskit/rmt/tests/test_tridiagonal.py +41 -0
- physicskit/rmt/tests/test_truncated_unitary.py +80 -0
- physicskit/rmt/tests/test_validation_base.py +25 -0
- physicskit/rmt/tests/test_validation_misc.py +67 -0
- physicskit/rmt/tests/test_wishart_marchenko_pastur.py +120 -0
- physicskit/rmt/utils/__init__.py +0 -0
- physicskit/rmt/utils/haar.py +128 -0
- physicskit/rmt/utils/random_state.py +24 -0
- physicskit/rmt/utils/tridiagonal.py +167 -0
- physicskit/rmt/validation/__init__.py +36 -0
- physicskit/rmt/validation/base.py +126 -0
- physicskit/rmt/validation/circular_law.py +80 -0
- physicskit/rmt/validation/marchenko_pastur.py +53 -0
- physicskit/rmt/validation/ratio_distribution.py +53 -0
- physicskit/rmt/validation/real_ginibre.py +60 -0
- physicskit/rmt/validation/sine_kernel.py +57 -0
- physicskit/rmt/validation/single_ring.py +68 -0
- physicskit/rmt/validation/tracy_widom.py +89 -0
- physicskit/rmt/validation/universality.py +100 -0
- physicskit/rmt/validation/wachter.py +52 -0
- physicskit/rmt/validation/wigner_semicircle.py +40 -0
- physicskit/rmt/validation/wigner_surmise.py +58 -0
- physicskit/semiclassical/__init__.py +94 -0
- physicskit/semiclassical/_compat.py +5 -0
- physicskit/semiclassical/core/__init__.py +41 -0
- physicskit/semiclassical/core/gutzwiller.py +215 -0
- physicskit/semiclassical/core/path_integral.py +594 -0
- physicskit/semiclassical/core/propagators.py +579 -0
- physicskit/semiclassical/core/wkb.py +308 -0
- physicskit/semiclassical/systems/__init__.py +13 -0
- physicskit/semiclassical/systems/scarring.py +278 -0
- physicskit/semiclassical/tests/__init__.py +0 -0
- physicskit/semiclassical/tests/test_gutzwiller.py +35 -0
- physicskit/semiclassical/tests/test_path_integral.py +194 -0
- physicskit/semiclassical/tests/test_propagators.py +82 -0
- physicskit/semiclassical/tests/test_scarring.py +43 -0
- physicskit/semiclassical/tests/test_visualizers.py +89 -0
- physicskit/semiclassical/tests/test_wkb.py +30 -0
- physicskit/semiclassical/visualizers/__init__.py +17 -0
- physicskit/semiclassical/visualizers/gutzwiller.py +55 -0
- physicskit/semiclassical/visualizers/path_integral.py +195 -0
- physicskit/semiclassical/visualizers/propagators.py +89 -0
- physicskit/semiclassical/visualizers/scarring.py +146 -0
- physicskit/semiclassical/visualizers/wkb.py +55 -0
- physicskit/statphys/__init__.py +80 -0
- physicskit/statphys/chapters/__init__.py +43 -0
- physicskit/statphys/chapters/ehrenfest_urn.py +112 -0
- physicskit/statphys/chapters/ising_lattice.py +431 -0
- physicskit/statphys/chapters/kpz_growth.py +129 -0
- physicskit/statphys/chapters/molecular_dynamics.py +258 -0
- physicskit/statphys/chapters/nonequilibrium_work.py +146 -0
- physicskit/statphys/chapters/percolation.py +305 -0
- physicskit/statphys/chapters/random_walk.py +142 -0
- physicskit/statphys/chapters/renormalization.py +148 -0
- physicskit/statphys/chapters/sandpile.py +109 -0
- physicskit/statphys/chapters/spin_glass.py +275 -0
- physicskit/statphys/core/__init__.py +10 -0
- physicskit/statphys/core/kpz_engine.py +53 -0
- physicskit/statphys/core/md_engine.py +157 -0
- physicskit/statphys/core/monte_carlo.py +462 -0
- physicskit/statphys/core/random_walk_engine.py +68 -0
- physicskit/statphys/core/sandpile_engine.py +52 -0
- physicskit/statphys/tests/__init__.py +0 -0
- physicskit/statphys/tests/test_dynamics.py +66 -0
- physicskit/statphys/tests/test_ehrenfest_urn.py +44 -0
- physicskit/statphys/tests/test_finite_size_scaling.py +62 -0
- physicskit/statphys/tests/test_interactive.py +33 -0
- physicskit/statphys/tests/test_ising.py +68 -0
- physicskit/statphys/tests/test_kpz.py +55 -0
- physicskit/statphys/tests/test_landau_theory.py +49 -0
- physicskit/statphys/tests/test_md_engine.py +31 -0
- physicskit/statphys/tests/test_molecular_dynamics.py +72 -0
- physicskit/statphys/tests/test_nonequilibrium_work.py +33 -0
- physicskit/statphys/tests/test_partition_function.py +26 -0
- physicskit/statphys/tests/test_percolation.py +116 -0
- physicskit/statphys/tests/test_potts_model.py +46 -0
- physicskit/statphys/tests/test_random_walk.py +50 -0
- physicskit/statphys/tests/test_renormalization.py +44 -0
- physicskit/statphys/tests/test_sandpile.py +44 -0
- physicskit/statphys/tests/test_spin_glass.py +73 -0
- physicskit/statphys/tests/test_thermodynamics.py +121 -0
- physicskit/statphys/tests/test_xy_model.py +45 -0
- physicskit/statphys/utils/__init__.py +1 -0
- physicskit/statphys/utils/dynamics.py +100 -0
- physicskit/statphys/utils/finite_size_scaling.py +171 -0
- physicskit/statphys/utils/landau_theory.py +151 -0
- physicskit/statphys/utils/partition_function.py +109 -0
- physicskit/statphys/utils/thermodynamics.py +356 -0
- physicskit/statphys/visualizers/__init__.py +87 -0
- physicskit/statphys/visualizers/interactive.py +161 -0
- physicskit/statphys/visualizers/jarzynski_render.py +44 -0
- physicskit/statphys/visualizers/kpz_render.py +65 -0
- physicskit/statphys/visualizers/lattice_render.py +212 -0
- physicskit/statphys/visualizers/particle_render.py +121 -0
- physicskit/statphys/visualizers/random_walk_render.py +106 -0
- physicskit/statphys/visualizers/rg_render.py +45 -0
- physicskit/statphys/visualizers/sandpile_render.py +65 -0
- physicskit/statphys/visualizers/spin_glass_render.py +40 -0
- physicskit/statphys/visualizers/urn_render.py +38 -0
- physicskit/statphys/visualizers/vortex_render.py +84 -0
- physicskit/tests/__init__.py +0 -0
- physicskit/tests/test_constants.py +38 -0
- physicskit-0.1.0.dist-info/METADATA +196 -0
- physicskit-0.1.0.dist-info/RECORD +484 -0
- physicskit-0.1.0.dist-info/WHEEL +5 -0
- physicskit-0.1.0.dist-info/licenses/LICENSE +21 -0
- 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}
|