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,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
|