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,195 @@
|
|
|
1
|
+
r"""Plotting helpers for Feynman's path-integral phasor ("arrow and stopwatch") construction."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import matplotlib.pyplot as plt
|
|
6
|
+
import numpy as np
|
|
7
|
+
from matplotlib.animation import FuncAnimation
|
|
8
|
+
|
|
9
|
+
__all__ = ["animate_feynman_phasor_spiral", "plot_phasor_convergence"]
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def animate_feynman_phasor_spiral(
|
|
13
|
+
paths: np.ndarray,
|
|
14
|
+
actions: np.ndarray,
|
|
15
|
+
classical_path: np.ndarray,
|
|
16
|
+
classical_action: float,
|
|
17
|
+
hbar: float,
|
|
18
|
+
t_array: np.ndarray,
|
|
19
|
+
interval: int = 40,
|
|
20
|
+
) -> FuncAnimation:
|
|
21
|
+
r"""Animate paths being added one at a time alongside their growing Feynman phasor sum.
|
|
22
|
+
|
|
23
|
+
Two side-by-side panels update together, frame by frame, as paths are
|
|
24
|
+
added in order of increasing :math:`|S-S_{\rm cl}|` (closest to the
|
|
25
|
+
classical path first -- the same order used by
|
|
26
|
+
:func:`~physicskit.semiclassical.core.path_integral.feynman_phasor_partial_sums`).
|
|
27
|
+
The left panel shows each path in real space, :math:`x(t)`, faded by
|
|
28
|
+
how far its action is from the classical action; the right panel
|
|
29
|
+
shows the cumulative phasor sum :math:`\sum\exp(iS/\hbar)` in the
|
|
30
|
+
complex plane, traced out as a connected "arrow chain" -- Feynman's
|
|
31
|
+
own picture of how nearby-action paths reinforce while distant-action
|
|
32
|
+
paths spin around and largely cancel.
|
|
33
|
+
|
|
34
|
+
Parameters
|
|
35
|
+
----------
|
|
36
|
+
paths : ndarray, shape (n_paths, n_points)
|
|
37
|
+
Ensemble of paths, e.g. from
|
|
38
|
+
:func:`~physicskit.semiclassical.core.path_integral.build_phasor_diagram`.
|
|
39
|
+
actions : ndarray, shape (n_paths,)
|
|
40
|
+
Discretized action of each path.
|
|
41
|
+
classical_path : ndarray, shape (n_points,)
|
|
42
|
+
The exact classical trajectory, drawn on top of every frame.
|
|
43
|
+
classical_action : float
|
|
44
|
+
The exact classical action, used both as the sort reference and
|
|
45
|
+
as the reference for the color/alpha of each path.
|
|
46
|
+
hbar : float
|
|
47
|
+
Reduced Planck constant (or an effective value thereof) used in
|
|
48
|
+
the phasors :math:`\exp(iS/\hbar)`.
|
|
49
|
+
t_array : ndarray, shape (n_points,)
|
|
50
|
+
Time grid shared by every path (and the classical path).
|
|
51
|
+
interval : int, default=40
|
|
52
|
+
Delay between animation frames, in milliseconds.
|
|
53
|
+
|
|
54
|
+
Returns
|
|
55
|
+
-------
|
|
56
|
+
matplotlib.animation.FuncAnimation
|
|
57
|
+
The animation object; assign it to a variable to keep it alive,
|
|
58
|
+
and display it with ``plt.show()`` or save it with
|
|
59
|
+
``anim.save(...)``.
|
|
60
|
+
|
|
61
|
+
Examples
|
|
62
|
+
--------
|
|
63
|
+
>>> from physicskit.semiclassical.core.path_integral import build_phasor_diagram
|
|
64
|
+
>>> paths, actions, x_cl, S_cl, _ = build_phasor_diagram(
|
|
65
|
+
... x0=0.0, xf=1.0, T=1.0, m=1.0, hbar=0.1, potential="free",
|
|
66
|
+
... n_slices=20, n_paths=30, sigma=0.3, seed=0)
|
|
67
|
+
>>> t = np.linspace(0.0, 1.0, x_cl.shape[0])
|
|
68
|
+
>>> anim = animate_feynman_phasor_spiral(paths, actions, x_cl, S_cl, hbar=0.1, t_array=t)
|
|
69
|
+
>>> isinstance(anim, FuncAnimation)
|
|
70
|
+
True
|
|
71
|
+
"""
|
|
72
|
+
paths = np.asarray(paths)
|
|
73
|
+
actions = np.asarray(actions)
|
|
74
|
+
n_paths = paths.shape[0]
|
|
75
|
+
|
|
76
|
+
order = np.argsort(np.abs(actions - classical_action))
|
|
77
|
+
sorted_paths = paths[order]
|
|
78
|
+
sorted_actions = actions[order]
|
|
79
|
+
|
|
80
|
+
dist = np.abs(sorted_actions - classical_action)
|
|
81
|
+
dist_max = dist.max() if dist.max() > 0 else 1.0
|
|
82
|
+
closeness = 1.0 - dist / dist_max # 1 = right at classical action, 0 = farthest
|
|
83
|
+
|
|
84
|
+
phasors = np.exp(1j * sorted_actions / hbar)
|
|
85
|
+
partial_sums = np.concatenate([[0.0 + 0.0j], np.cumsum(phasors)])
|
|
86
|
+
|
|
87
|
+
fig, (ax_paths, ax_complex) = plt.subplots(1, 2, figsize=(12, 5.5))
|
|
88
|
+
|
|
89
|
+
ax_paths.plot(t_array, classical_path, color="red", lw=2.5, zorder=5, label="classical path")
|
|
90
|
+
ax_paths.set_xlim(t_array.min(), t_array.max())
|
|
91
|
+
x_all = np.concatenate([paths.ravel(), classical_path.ravel()])
|
|
92
|
+
pad = 0.1 * (x_all.max() - x_all.min() + 1e-12)
|
|
93
|
+
ax_paths.set_ylim(x_all.min() - pad, x_all.max() + pad)
|
|
94
|
+
ax_paths.set_xlabel("t")
|
|
95
|
+
ax_paths.set_ylabel("x(t)")
|
|
96
|
+
ax_paths.set_title("Sampled paths (closest to classical first)")
|
|
97
|
+
ax_paths.legend(loc="upper left", fontsize=8)
|
|
98
|
+
path_lines = []
|
|
99
|
+
|
|
100
|
+
radius = np.max(np.abs(partial_sums)) * 1.15 + 1e-12
|
|
101
|
+
ax_complex.set_xlim(-radius, radius)
|
|
102
|
+
ax_complex.set_ylim(-radius, radius)
|
|
103
|
+
ax_complex.set_xlabel("Re")
|
|
104
|
+
ax_complex.set_ylabel("Im")
|
|
105
|
+
ax_complex.set_title(r"Phasor sum $\sum e^{iS/\hbar}$")
|
|
106
|
+
ax_complex.axhline(0, color="gray", lw=0.5)
|
|
107
|
+
ax_complex.axvline(0, color="gray", lw=0.5)
|
|
108
|
+
ax_complex.set_aspect("equal")
|
|
109
|
+
(spiral_line,) = ax_complex.plot([], [], color="C0", lw=1.0)
|
|
110
|
+
arrow = ax_complex.annotate("", xy=(0, 0), xytext=(0, 0), arrowprops=dict(arrowstyle="->", color="crimson", lw=2))
|
|
111
|
+
|
|
112
|
+
def init():
|
|
113
|
+
spiral_line.set_data([], [])
|
|
114
|
+
arrow.xy = (0, 0)
|
|
115
|
+
arrow.set_position((0, 0))
|
|
116
|
+
return [spiral_line, arrow]
|
|
117
|
+
|
|
118
|
+
def update(frame: int):
|
|
119
|
+
for ln in path_lines:
|
|
120
|
+
ln.remove()
|
|
121
|
+
path_lines.clear()
|
|
122
|
+
for j in range(frame + 1):
|
|
123
|
+
c = closeness[j]
|
|
124
|
+
color = (1.0, 0.35 * (1 - c), 0.0, 0.15 + 0.7 * c)
|
|
125
|
+
(ln,) = ax_paths.plot(t_array, sorted_paths[j], color=color, lw=1.0, zorder=2)
|
|
126
|
+
path_lines.append(ln)
|
|
127
|
+
|
|
128
|
+
pts = partial_sums[: frame + 2]
|
|
129
|
+
spiral_line.set_data(pts.real, pts.imag)
|
|
130
|
+
arrow.set_position((0, 0))
|
|
131
|
+
arrow.xy = (pts[-1].real, pts[-1].imag)
|
|
132
|
+
ax_complex.set_title(f"Phasor sum after {frame + 1}/{n_paths} paths")
|
|
133
|
+
return path_lines + [spiral_line, arrow]
|
|
134
|
+
|
|
135
|
+
anim = FuncAnimation(fig, update, init_func=init, frames=n_paths, interval=interval, blit=False)
|
|
136
|
+
return anim
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def plot_phasor_convergence(partial_sums_by_hbar, hbar_values, ax=None):
|
|
140
|
+
r"""Plot the running phasor-sum magnitude for several :math:`\hbar` values on shared axes.
|
|
141
|
+
|
|
142
|
+
Shows the core physics claim quantitatively: as :math:`\hbar` shrinks,
|
|
143
|
+
the growing partial sum's magnitude climbs faster and plateaus sooner
|
|
144
|
+
(dominated by an ever-smaller neighborhood of the classical path),
|
|
145
|
+
while larger :math:`\hbar` gives a partial sum that keeps wandering
|
|
146
|
+
randomly as more distant paths are added.
|
|
147
|
+
|
|
148
|
+
Parameters
|
|
149
|
+
----------
|
|
150
|
+
partial_sums_by_hbar : sequence of ndarray of complex
|
|
151
|
+
One partial-sum array per :math:`\hbar` value (e.g. from
|
|
152
|
+
:func:`~physicskit.semiclassical.core.path_integral.feynman_phasor_partial_sums`
|
|
153
|
+
or the last element of
|
|
154
|
+
:func:`~physicskit.semiclassical.core.path_integral.build_phasor_diagram`'s
|
|
155
|
+
return value), each of shape ``(n_paths + 1,)``.
|
|
156
|
+
hbar_values : sequence of float
|
|
157
|
+
The :math:`\hbar` value corresponding to each array in
|
|
158
|
+
``partial_sums_by_hbar`` (used only for the legend labels).
|
|
159
|
+
ax : matplotlib.axes.Axes, optional
|
|
160
|
+
Axes to draw into; a new figure is created if omitted.
|
|
161
|
+
|
|
162
|
+
Returns
|
|
163
|
+
-------
|
|
164
|
+
fig : matplotlib.figure.Figure
|
|
165
|
+
ax : matplotlib.axes.Axes
|
|
166
|
+
|
|
167
|
+
Examples
|
|
168
|
+
--------
|
|
169
|
+
>>> from physicskit.semiclassical.core.path_integral import build_phasor_diagram
|
|
170
|
+
>>> sums, hbars = [], [0.5, 0.05]
|
|
171
|
+
>>> for hbar in hbars:
|
|
172
|
+
... _, _, _, _, partial = build_phasor_diagram(
|
|
173
|
+
... x0=0.0, xf=1.0, T=1.0, m=1.0, hbar=hbar, potential="free",
|
|
174
|
+
... n_slices=20, n_paths=60, sigma=0.3, seed=0)
|
|
175
|
+
... sums.append(partial)
|
|
176
|
+
>>> fig, ax = plot_phasor_convergence(sums, hbars)
|
|
177
|
+
>>> isinstance(fig, plt.Figure)
|
|
178
|
+
True
|
|
179
|
+
"""
|
|
180
|
+
if ax is None:
|
|
181
|
+
fig, ax = plt.subplots(figsize=(7, 4.5))
|
|
182
|
+
else:
|
|
183
|
+
fig = ax.figure
|
|
184
|
+
|
|
185
|
+
for partial, hbar in zip(partial_sums_by_hbar, hbar_values):
|
|
186
|
+
partial = np.asarray(partial)
|
|
187
|
+
n = partial.shape[0] - 1
|
|
188
|
+
frac = np.arange(n + 1) / n
|
|
189
|
+
ax.plot(frac, np.abs(partial), label=rf"$\hbar={hbar:g}$")
|
|
190
|
+
|
|
191
|
+
ax.set_xlabel("fraction of paths included (closest-to-classical first)")
|
|
192
|
+
ax.set_ylabel(r"$\left|\sum e^{iS/\hbar}\right|$")
|
|
193
|
+
ax.set_title("Phasor-sum concentration near the classical path")
|
|
194
|
+
ax.legend(fontsize=8)
|
|
195
|
+
return fig, ax
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
r"""Plotting helpers comparing classical trajectories with the exact quantum Wigner function."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import matplotlib.pyplot as plt
|
|
6
|
+
import numpy as np
|
|
7
|
+
|
|
8
|
+
__all__ = ["plot_classical_trajectory_on_wigner"]
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _wigner_transform(x: np.ndarray, psi: np.ndarray, hbar: float = 1.0, n_p: int = 200, p_max: float | None = None):
|
|
12
|
+
r"""Wigner quasi-probability distribution :math:`W(x,p)` of a 1D wavefunction.
|
|
13
|
+
|
|
14
|
+
A local copy of :func:`physicskit.quantum.visualizers.phase_space.wigner_transform`,
|
|
15
|
+
kept here so :mod:`physicskit.semiclassical` has no dependency on
|
|
16
|
+
:mod:`physicskit.quantum`.
|
|
17
|
+
"""
|
|
18
|
+
x = np.asarray(x)
|
|
19
|
+
psi = np.asarray(psi, dtype=complex)
|
|
20
|
+
N = x.shape[0]
|
|
21
|
+
dx = x[1] - x[0]
|
|
22
|
+
if p_max is None:
|
|
23
|
+
p_max = np.pi * hbar / (2 * dx)
|
|
24
|
+
|
|
25
|
+
p = np.linspace(-p_max, p_max, n_p)
|
|
26
|
+
W = np.zeros((N, n_p))
|
|
27
|
+
|
|
28
|
+
for i in range(N):
|
|
29
|
+
kmax = min(i, N - 1 - i)
|
|
30
|
+
k = np.arange(-kmax, kmax + 1)
|
|
31
|
+
integrand = np.conj(psi[i + k]) * psi[i - k]
|
|
32
|
+
phase = np.exp(2j * np.outer(p, k * dx) / hbar)
|
|
33
|
+
W[i, :] = (dx / (np.pi * hbar)) * np.real(phase @ integrand)
|
|
34
|
+
|
|
35
|
+
return x, p, W
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def plot_classical_trajectory_on_wigner(x: np.ndarray, psi: np.ndarray, q_hist: np.ndarray, p_hist: np.ndarray, hbar: float = 1.0, ax=None):
|
|
39
|
+
r"""Overlay a classical phase-space trajectory on the exact quantum Wigner function.
|
|
40
|
+
|
|
41
|
+
Compares the classical and quantum pictures directly: the Wigner
|
|
42
|
+
function of a quantum state, with the classical trajectory
|
|
43
|
+
(:func:`physicskit.semiclassical.core.propagators.propagate_trajectory_monodromy_action`)
|
|
44
|
+
that WKB/Van Vleck theory builds that state's semiclassical
|
|
45
|
+
approximation from, drawn on top -- the two agree closely wherever
|
|
46
|
+
the semiclassical approximation is accurate.
|
|
47
|
+
|
|
48
|
+
Parameters
|
|
49
|
+
----------
|
|
50
|
+
x : ndarray
|
|
51
|
+
Position grid the wavefunction is sampled on.
|
|
52
|
+
psi : ndarray of complex
|
|
53
|
+
Quantum wavefunction sampled on ``x``.
|
|
54
|
+
q_hist, p_hist : ndarray
|
|
55
|
+
Classical trajectory phase-space coordinates.
|
|
56
|
+
hbar : float, default=1.0
|
|
57
|
+
Value of :math:`\hbar` to use.
|
|
58
|
+
ax : matplotlib.axes.Axes, optional
|
|
59
|
+
Axes to draw into; a new figure is created if omitted.
|
|
60
|
+
|
|
61
|
+
Returns
|
|
62
|
+
-------
|
|
63
|
+
fig : matplotlib.figure.Figure
|
|
64
|
+
ax : matplotlib.axes.Axes
|
|
65
|
+
|
|
66
|
+
Examples
|
|
67
|
+
--------
|
|
68
|
+
>>> import numpy as np
|
|
69
|
+
>>> from physicskit.semiclassical.core.propagators import frozen_gaussian_1d
|
|
70
|
+
>>> x = np.linspace(-8, 8, 400)
|
|
71
|
+
>>> psi = frozen_gaussian_1d(x, qc=1.0, pc=0.5, gamma=1.0)
|
|
72
|
+
>>> theta = np.linspace(0, 2 * np.pi, 100)
|
|
73
|
+
>>> q_hist, p_hist = np.cos(theta), np.sin(theta)
|
|
74
|
+
>>> fig, ax = plot_classical_trajectory_on_wigner(x, psi, q_hist, p_hist)
|
|
75
|
+
>>> isinstance(fig, plt.Figure)
|
|
76
|
+
True
|
|
77
|
+
"""
|
|
78
|
+
if ax is None:
|
|
79
|
+
fig, ax = plt.subplots()
|
|
80
|
+
else:
|
|
81
|
+
fig = ax.figure
|
|
82
|
+
_x, p, W = _wigner_transform(x, psi, hbar=hbar)
|
|
83
|
+
im = ax.pcolormesh(x, p, W.T, cmap="RdBu_r", shading="auto")
|
|
84
|
+
fig.colorbar(im, ax=ax, label="W(x,p)")
|
|
85
|
+
ax.plot(q_hist, p_hist, color="k", linewidth=1.5, label="classical orbit")
|
|
86
|
+
ax.set_xlabel("x")
|
|
87
|
+
ax.set_ylabel("p")
|
|
88
|
+
ax.legend()
|
|
89
|
+
return fig, ax
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
r"""Plotting helpers for quantum scars: eigenstate density maps and Husimi phase-space projections.
|
|
2
|
+
|
|
3
|
+
:func:`plot_scar_map_interactive` returns a Plotly figure for pan/zoom
|
|
4
|
+
exploration of a scarred eigenstate density; the rest return a
|
|
5
|
+
Matplotlib figure and axes rather than calling ``show()``.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import matplotlib.pyplot as plt
|
|
11
|
+
import numpy as np
|
|
12
|
+
import plotly.graph_objects as go
|
|
13
|
+
|
|
14
|
+
__all__ = ["plot_scar_map", "plot_husimi_1d", "plot_scar_map_interactive"]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def plot_scar_map(
|
|
18
|
+
X: np.ndarray,
|
|
19
|
+
Y: np.ndarray,
|
|
20
|
+
density: np.ndarray,
|
|
21
|
+
mask: np.ndarray | None = None,
|
|
22
|
+
orbit_x: np.ndarray | None = None,
|
|
23
|
+
orbit_y: np.ndarray | None = None,
|
|
24
|
+
ax=None,
|
|
25
|
+
):
|
|
26
|
+
r"""Heatmap an eigenstate density with a classical periodic orbit overlaid.
|
|
27
|
+
|
|
28
|
+
Parameters
|
|
29
|
+
----------
|
|
30
|
+
X, Y : ndarray
|
|
31
|
+
Coordinate meshgrid.
|
|
32
|
+
density : ndarray
|
|
33
|
+
Probability density :math:`|\psi|^2`, same shape as ``X``.
|
|
34
|
+
mask : ndarray of bool, optional
|
|
35
|
+
``True`` inside the billiard; density outside is not drawn.
|
|
36
|
+
orbit_x, orbit_y : ndarray, optional
|
|
37
|
+
Classical orbit coordinates, e.g. from
|
|
38
|
+
:func:`physicskit.semiclassical.systems.scarring.bouncing_ball_orbit_points`.
|
|
39
|
+
ax : matplotlib.axes.Axes, optional
|
|
40
|
+
Axes to draw into; a new figure is created if omitted.
|
|
41
|
+
|
|
42
|
+
Returns
|
|
43
|
+
-------
|
|
44
|
+
fig : matplotlib.figure.Figure
|
|
45
|
+
ax : matplotlib.axes.Axes
|
|
46
|
+
|
|
47
|
+
Examples
|
|
48
|
+
--------
|
|
49
|
+
>>> import numpy as np
|
|
50
|
+
>>> from physicskit.semiclassical.systems.scarring import bouncing_ball_orbit_points
|
|
51
|
+
>>> x = np.linspace(-2, 2, 100)
|
|
52
|
+
>>> y = np.linspace(-1, 1, 60)
|
|
53
|
+
>>> X, Y = np.meshgrid(x, y, indexing="ij")
|
|
54
|
+
>>> density = np.exp(-(X - 0.3) ** 2 / (2 * 0.2 ** 2))
|
|
55
|
+
>>> orbit_x, orbit_y = bouncing_ball_orbit_points(x0=0.3, R=1.0)
|
|
56
|
+
>>> fig, ax = plot_scar_map(X, Y, density, orbit_x=orbit_x, orbit_y=orbit_y)
|
|
57
|
+
>>> isinstance(fig, plt.Figure)
|
|
58
|
+
True
|
|
59
|
+
"""
|
|
60
|
+
if ax is None:
|
|
61
|
+
fig, ax = plt.subplots()
|
|
62
|
+
else:
|
|
63
|
+
fig = ax.figure
|
|
64
|
+
plot_density = np.where(mask, density, np.nan) if mask is not None else density
|
|
65
|
+
im = ax.pcolormesh(X, Y, plot_density, cmap="inferno", shading="auto")
|
|
66
|
+
fig.colorbar(im, ax=ax, label=r"$|\psi|^2$")
|
|
67
|
+
if orbit_x is not None:
|
|
68
|
+
ax.plot(orbit_x, orbit_y, color="c", linewidth=1.2, label="classical orbit")
|
|
69
|
+
ax.legend()
|
|
70
|
+
ax.set_xlabel("x")
|
|
71
|
+
ax.set_ylabel("y")
|
|
72
|
+
ax.set_aspect("equal")
|
|
73
|
+
return fig, ax
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def plot_husimi_1d(S0: np.ndarray, P0: np.ndarray, husimi: np.ndarray, ax=None):
|
|
77
|
+
r"""Contour-plot a 1D Husimi phase-space projection.
|
|
78
|
+
|
|
79
|
+
Parameters
|
|
80
|
+
----------
|
|
81
|
+
S0, P0 : ndarray
|
|
82
|
+
Phase-space grid, from :func:`physicskit.semiclassical.systems.scarring.husimi_projection_1d`.
|
|
83
|
+
husimi : ndarray
|
|
84
|
+
Husimi distribution, same shape as ``S0``.
|
|
85
|
+
ax : matplotlib.axes.Axes, optional
|
|
86
|
+
Axes to draw into; a new figure is created if omitted.
|
|
87
|
+
|
|
88
|
+
Returns
|
|
89
|
+
-------
|
|
90
|
+
fig : matplotlib.figure.Figure
|
|
91
|
+
ax : matplotlib.axes.Axes
|
|
92
|
+
|
|
93
|
+
Examples
|
|
94
|
+
--------
|
|
95
|
+
>>> import numpy as np
|
|
96
|
+
>>> from physicskit.semiclassical.systems.scarring import husimi_projection_1d
|
|
97
|
+
>>> s = np.linspace(-10, 10, 1000)
|
|
98
|
+
>>> psi = np.exp(-(s - 2.0) ** 2 / 2.0) * np.exp(1j * 3.0 * s)
|
|
99
|
+
>>> S0, P0, H = husimi_projection_1d(psi, s, sigma=1.0, resolution=40, s0_range=(-2, 6), p0_range=(-2, 8))
|
|
100
|
+
>>> fig, ax = plot_husimi_1d(S0, P0, H)
|
|
101
|
+
>>> isinstance(fig, plt.Figure)
|
|
102
|
+
True
|
|
103
|
+
"""
|
|
104
|
+
if ax is None:
|
|
105
|
+
fig, ax = plt.subplots()
|
|
106
|
+
else:
|
|
107
|
+
fig = ax.figure
|
|
108
|
+
im = ax.pcolormesh(S0, P0, husimi, cmap="viridis", shading="auto")
|
|
109
|
+
fig.colorbar(im, ax=ax, label="Husimi (peak-normalized)")
|
|
110
|
+
ax.set_xlabel("s")
|
|
111
|
+
ax.set_ylabel("p")
|
|
112
|
+
return fig, ax
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def plot_scar_map_interactive(X: np.ndarray, Y: np.ndarray, density: np.ndarray):
|
|
116
|
+
r"""Interactive Plotly heatmap of an eigenstate density, for zooming into scarred structure.
|
|
117
|
+
|
|
118
|
+
Parameters
|
|
119
|
+
----------
|
|
120
|
+
X, Y : ndarray
|
|
121
|
+
Coordinate meshgrid.
|
|
122
|
+
density : ndarray
|
|
123
|
+
Probability density :math:`|\psi|^2`, same shape as ``X``.
|
|
124
|
+
|
|
125
|
+
Returns
|
|
126
|
+
-------
|
|
127
|
+
plotly.graph_objects.Figure
|
|
128
|
+
|
|
129
|
+
See Also
|
|
130
|
+
--------
|
|
131
|
+
plot_scar_map : The static Matplotlib heatmap equivalent, with orbit overlay support.
|
|
132
|
+
|
|
133
|
+
Examples
|
|
134
|
+
--------
|
|
135
|
+
>>> import numpy as np
|
|
136
|
+
>>> x = np.linspace(-2, 2, 60)
|
|
137
|
+
>>> y = np.linspace(-1, 1, 40)
|
|
138
|
+
>>> X, Y = np.meshgrid(x, y, indexing="ij")
|
|
139
|
+
>>> density = np.exp(-(X - 0.3) ** 2 / (2 * 0.2 ** 2))
|
|
140
|
+
>>> fig = plot_scar_map_interactive(X, Y, density)
|
|
141
|
+
>>> isinstance(fig, go.Figure)
|
|
142
|
+
True
|
|
143
|
+
"""
|
|
144
|
+
fig = go.Figure(data=go.Heatmap(x=X[:, 0], y=Y[0, :], z=density.T, colorscale="Inferno"))
|
|
145
|
+
fig.update_layout(xaxis_title="x", yaxis_title="y")
|
|
146
|
+
return fig
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
r"""Plotting helpers for WKB wavefunctions."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import matplotlib.pyplot as plt
|
|
6
|
+
import numpy as np
|
|
7
|
+
|
|
8
|
+
__all__ = ["plot_wkb_wavefunction"]
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def plot_wkb_wavefunction(x: np.ndarray, psi: np.ndarray, V=None, ax=None):
|
|
12
|
+
r"""Plot a WKB (or exact) 1D wavefunction, optionally with the potential on a twin axis.
|
|
13
|
+
|
|
14
|
+
Parameters
|
|
15
|
+
----------
|
|
16
|
+
x : ndarray
|
|
17
|
+
Position grid.
|
|
18
|
+
psi : ndarray
|
|
19
|
+
Wavefunction values, e.g. from
|
|
20
|
+
:func:`physicskit.semiclassical.core.wkb.wkb_wavefunction`.
|
|
21
|
+
V : callable, optional
|
|
22
|
+
Potential energy function ``V(x)``, drawn on a secondary y-axis
|
|
23
|
+
if given.
|
|
24
|
+
ax : matplotlib.axes.Axes, optional
|
|
25
|
+
Axes to draw into; a new figure is created if omitted.
|
|
26
|
+
|
|
27
|
+
Returns
|
|
28
|
+
-------
|
|
29
|
+
fig : matplotlib.figure.Figure
|
|
30
|
+
ax : matplotlib.axes.Axes
|
|
31
|
+
|
|
32
|
+
Examples
|
|
33
|
+
--------
|
|
34
|
+
>>> import numpy as np
|
|
35
|
+
>>> from physicskit.semiclassical.core.wkb import bohr_sommerfeld_energies, wkb_wavefunction
|
|
36
|
+
>>> V = lambda x: 0.5 * x ** 2
|
|
37
|
+
>>> E2 = bohr_sommerfeld_energies(V, m=1.0, x_min=-20, x_max=20, n_max=3)[2]
|
|
38
|
+
>>> x = np.linspace(-6, 6, 1000)
|
|
39
|
+
>>> psi = wkb_wavefunction(x, E2, V)
|
|
40
|
+
>>> fig, ax = plot_wkb_wavefunction(x, psi, V=V)
|
|
41
|
+
>>> isinstance(fig, plt.Figure)
|
|
42
|
+
True
|
|
43
|
+
"""
|
|
44
|
+
if ax is None:
|
|
45
|
+
fig, ax = plt.subplots()
|
|
46
|
+
else:
|
|
47
|
+
fig = ax.figure
|
|
48
|
+
ax.plot(x, psi, color="C0", label=r"$\psi_{\mathrm{WKB}}(x)$")
|
|
49
|
+
ax.set_xlabel("x")
|
|
50
|
+
ax.set_ylabel(r"$\psi(x)$", color="C0")
|
|
51
|
+
if V is not None:
|
|
52
|
+
ax2 = ax.twinx()
|
|
53
|
+
ax2.plot(x, V(x), color="C1", linestyle="--", label="V(x)")
|
|
54
|
+
ax2.set_ylabel("V(x)", color="C1")
|
|
55
|
+
return fig, ax
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"""physicskit.statphys: interactive, computational statistical mechanics.
|
|
2
|
+
|
|
3
|
+
``physicskit.statphys`` brings the core breakthroughs of statistical mechanics, lattice
|
|
4
|
+
physics, critical phenomena, molecular dynamics, and disordered systems into
|
|
5
|
+
a visual, computational Python framework:
|
|
6
|
+
|
|
7
|
+
- **Lattice models** (:mod:`physicskit.statphys.chapters.ising_lattice`): the 2D Ising
|
|
8
|
+
model with Metropolis and Wolff-cluster dynamics, the q-state Potts model,
|
|
9
|
+
and the XY model's topological Kosterlitz-Thouless transition.
|
|
10
|
+
- **Disordered systems** (:mod:`physicskit.statphys.chapters.spin_glass`): the
|
|
11
|
+
Edwards-Anderson Ising spin glass, with quenched bond disorder,
|
|
12
|
+
frustration, and the replica-overlap order parameter.
|
|
13
|
+
- **Molecular dynamics** (:mod:`physicskit.statphys.chapters.molecular_dynamics`): a
|
|
14
|
+
Velocity-Verlet-integrated Lennard-Jones gas that relaxes toward the
|
|
15
|
+
Maxwell-Boltzmann distribution, with live tracking of Boltzmann's
|
|
16
|
+
H-function.
|
|
17
|
+
- **Diffusion** (:mod:`physicskit.statphys.chapters.random_walk`): random walk
|
|
18
|
+
ensembles illustrating the Einstein relation and the central limit
|
|
19
|
+
theorem.
|
|
20
|
+
- **Critical phenomena** (:mod:`physicskit.statphys.chapters.percolation`,
|
|
21
|
+
:mod:`physicskit.statphys.chapters.renormalization`, :mod:`physicskit.statphys.chapters.sandpile`):
|
|
22
|
+
site/bond percolation with Hoshen-Kopelman cluster labeling, Kadanoff
|
|
23
|
+
block-spin renormalization group coarse-graining, and the
|
|
24
|
+
self-organized-critical Bak-Tang-Wiesenfeld sandpile.
|
|
25
|
+
- **Irreversibility** (:mod:`physicskit.statphys.chapters.ehrenfest_urn`): the
|
|
26
|
+
Ehrenfest urn model, the simplest system reconciling reversible
|
|
27
|
+
microscopic dynamics with an observed thermodynamic arrow of time.
|
|
28
|
+
- **Replica symmetry breaking** (:mod:`physicskit.statphys.chapters.spin_glass`): the
|
|
29
|
+
infinite-range Sherrington-Kirkpatrick spin glass and its numerically
|
|
30
|
+
observable replica-overlap distribution.
|
|
31
|
+
- **Interface growth** (:mod:`physicskit.statphys.chapters.kpz_growth`): the
|
|
32
|
+
Kardar-Parisi-Zhang universality class via Restricted Solid-On-Solid
|
|
33
|
+
deposition.
|
|
34
|
+
- **Nonequilibrium work** (:mod:`physicskit.statphys.chapters.nonequilibrium_work`):
|
|
35
|
+
Jarzynski's equality, recovering exact equilibrium free energies from
|
|
36
|
+
irreversible, finite-speed work measurements.
|
|
37
|
+
|
|
38
|
+
Examples
|
|
39
|
+
--------
|
|
40
|
+
>>> from physicskit.statphys.chapters import Ising2D
|
|
41
|
+
>>> model = Ising2D(L=32, seed=0)
|
|
42
|
+
>>> round(float(model.T_C), 3)
|
|
43
|
+
2.269
|
|
44
|
+
>>> model.sweep(beta=1.0 / model.T_C, n_sweeps=100)
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
from physicskit.statphys.chapters import (
|
|
48
|
+
BlockSpinRG,
|
|
49
|
+
BTWSandpile,
|
|
50
|
+
EdwardsAndersonSpinGlass2D,
|
|
51
|
+
EhrenfestUrn,
|
|
52
|
+
Ising2D,
|
|
53
|
+
JarzynskiHarmonicTrap,
|
|
54
|
+
KPZInterface,
|
|
55
|
+
LennardJonesGas,
|
|
56
|
+
Percolation2D,
|
|
57
|
+
PottsModel2D,
|
|
58
|
+
RandomWalk,
|
|
59
|
+
SherringtonKirkpatrick,
|
|
60
|
+
XYModel2D,
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
__version__ = "0.2.0"
|
|
64
|
+
|
|
65
|
+
__all__ = [
|
|
66
|
+
"BTWSandpile",
|
|
67
|
+
"BlockSpinRG",
|
|
68
|
+
"EdwardsAndersonSpinGlass2D",
|
|
69
|
+
"EhrenfestUrn",
|
|
70
|
+
"Ising2D",
|
|
71
|
+
"JarzynskiHarmonicTrap",
|
|
72
|
+
"KPZInterface",
|
|
73
|
+
"LennardJonesGas",
|
|
74
|
+
"Percolation2D",
|
|
75
|
+
"PottsModel2D",
|
|
76
|
+
"RandomWalk",
|
|
77
|
+
"SherringtonKirkpatrick",
|
|
78
|
+
"XYModel2D",
|
|
79
|
+
"__version__",
|
|
80
|
+
]
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""Physics chapters: user-facing model classes built on :mod:`physicskit.statphys.core`.
|
|
2
|
+
|
|
3
|
+
- :mod:`physicskit.statphys.chapters.ising_lattice` -- Ising, Potts, and XY lattice spin models.
|
|
4
|
+
- :mod:`physicskit.statphys.chapters.spin_glass` -- the Edwards-Anderson Ising spin glass and the
|
|
5
|
+
infinite-range Sherrington-Kirkpatrick model.
|
|
6
|
+
- :mod:`physicskit.statphys.chapters.molecular_dynamics` -- Lennard-Jones gas and the H-theorem.
|
|
7
|
+
- :mod:`physicskit.statphys.chapters.random_walk` -- random walks, diffusion, and the CLT.
|
|
8
|
+
- :mod:`physicskit.statphys.chapters.percolation` -- site/bond percolation and cluster geometry.
|
|
9
|
+
- :mod:`physicskit.statphys.chapters.renormalization` -- Kadanoff block-spin coarse-graining.
|
|
10
|
+
- :mod:`physicskit.statphys.chapters.sandpile` -- the Bak-Tang-Wiesenfeld self-organized-critical sandpile.
|
|
11
|
+
- :mod:`physicskit.statphys.chapters.ehrenfest_urn` -- the Ehrenfest urn model of statistical irreversibility.
|
|
12
|
+
- :mod:`physicskit.statphys.chapters.kpz_growth` -- the Kardar-Parisi-Zhang universality class via
|
|
13
|
+
Restricted Solid-On-Solid interface growth.
|
|
14
|
+
- :mod:`physicskit.statphys.chapters.nonequilibrium_work` -- Jarzynski's equality for a dragged
|
|
15
|
+
harmonic trap.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from physicskit.statphys.chapters.ehrenfest_urn import EhrenfestUrn
|
|
19
|
+
from physicskit.statphys.chapters.ising_lattice import Ising2D, PottsModel2D, XYModel2D
|
|
20
|
+
from physicskit.statphys.chapters.kpz_growth import KPZInterface
|
|
21
|
+
from physicskit.statphys.chapters.molecular_dynamics import LennardJonesGas
|
|
22
|
+
from physicskit.statphys.chapters.nonequilibrium_work import JarzynskiHarmonicTrap
|
|
23
|
+
from physicskit.statphys.chapters.percolation import Percolation2D
|
|
24
|
+
from physicskit.statphys.chapters.random_walk import RandomWalk
|
|
25
|
+
from physicskit.statphys.chapters.renormalization import BlockSpinRG
|
|
26
|
+
from physicskit.statphys.chapters.sandpile import BTWSandpile
|
|
27
|
+
from physicskit.statphys.chapters.spin_glass import EdwardsAndersonSpinGlass2D, SherringtonKirkpatrick
|
|
28
|
+
|
|
29
|
+
__all__ = [
|
|
30
|
+
"BTWSandpile",
|
|
31
|
+
"BlockSpinRG",
|
|
32
|
+
"EdwardsAndersonSpinGlass2D",
|
|
33
|
+
"EhrenfestUrn",
|
|
34
|
+
"Ising2D",
|
|
35
|
+
"JarzynskiHarmonicTrap",
|
|
36
|
+
"KPZInterface",
|
|
37
|
+
"LennardJonesGas",
|
|
38
|
+
"Percolation2D",
|
|
39
|
+
"PottsModel2D",
|
|
40
|
+
"RandomWalk",
|
|
41
|
+
"SherringtonKirkpatrick",
|
|
42
|
+
"XYModel2D",
|
|
43
|
+
]
|