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,235 @@
|
|
|
1
|
+
"""SymPy engine that auto-derives equations of motion from a Lagrangian.
|
|
2
|
+
|
|
3
|
+
Given an arbitrary Lagrangian L(q, qdot, t), :class:`LagrangianEngine`:
|
|
4
|
+
|
|
5
|
+
1. Forms the Euler-Lagrange equations
|
|
6
|
+
d/dt(dL/dqdot_i) - dL/dq_i = 0
|
|
7
|
+
which are linear in qddot, and solves them for the generalized
|
|
8
|
+
accelerations qddot_i (equivalently: derives the mass matrix M(q)
|
|
9
|
+
and inverts it).
|
|
10
|
+
2. Performs the Legendre transform p_i = dL/dqdot_i and derives the
|
|
11
|
+
Hamiltonian H(q, p, t) = sum_i p_i qdot_i - L, giving dH/dq and dH/dp
|
|
12
|
+
in closed form. This is what makes the *implicit midpoint* symplectic
|
|
13
|
+
integrator applicable even when M(q) is configuration-dependent and
|
|
14
|
+
the system is therefore non-separable (e.g. the double pendulum).
|
|
15
|
+
3. Lambdifies every derived vector expression and JIT-compiles it with
|
|
16
|
+
Numba, exposing plain ``@njit`` dispatchers so the equations of
|
|
17
|
+
motion run at native speed inside :mod:`physicskit.classical.core.integrators`
|
|
18
|
+
(whose step functions call these callbacks from nopython code, which
|
|
19
|
+
requires them to be real njit dispatchers rather than closures over
|
|
20
|
+
Python objects).
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
from collections.abc import Sequence
|
|
26
|
+
|
|
27
|
+
import numpy as np
|
|
28
|
+
import sympy as sp
|
|
29
|
+
from numba import njit
|
|
30
|
+
|
|
31
|
+
__all__ = ["LagrangianEngine"]
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _lambdify_vector_njit(args: Sequence[sp.Symbol], exprs: Sequence[sp.Expr]):
|
|
35
|
+
"""Lambdify a list of scalar expressions and JIT-compile it.
|
|
36
|
+
|
|
37
|
+
Dynamically generated functions cannot use numba's on-disk cache.
|
|
38
|
+
|
|
39
|
+
Parameters
|
|
40
|
+
----------
|
|
41
|
+
args : sequence of sympy Symbol
|
|
42
|
+
Positional arguments of the generated function.
|
|
43
|
+
exprs : sequence of sympy expression
|
|
44
|
+
Scalar expressions to evaluate, in order.
|
|
45
|
+
|
|
46
|
+
Returns
|
|
47
|
+
-------
|
|
48
|
+
callable
|
|
49
|
+
An ``@njit`` dispatcher returning a Python list of scalars.
|
|
50
|
+
"""
|
|
51
|
+
raw = sp.lambdify(tuple(args), list(exprs), modules="numpy")
|
|
52
|
+
return njit(cache=False)(raw)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _indexed_wrapper(raw_jit, n: int, as_array: bool = True):
|
|
56
|
+
"""Build an ``@njit`` wrapper ``f(arr1, arr2, scalar) -> ...`` around a lambdified function.
|
|
57
|
+
|
|
58
|
+
The wrapped function's signature is ``(arr1[0..n-1], arr2[0..n-1], scalar)``.
|
|
59
|
+
Numba cannot star-unpack a runtime numpy array in nopython mode
|
|
60
|
+
(the argument count must be known at compile time), so this
|
|
61
|
+
generates explicit-index source (``arr1[0], arr1[1], ...``) via
|
|
62
|
+
``exec`` -- the same technique SymPy's own ``lambdify`` uses -- and
|
|
63
|
+
then JIT-compiles it. ``n`` is fixed per system (a compile-time
|
|
64
|
+
constant), so this runs once, at system-construction time.
|
|
65
|
+
|
|
66
|
+
Parameters
|
|
67
|
+
----------
|
|
68
|
+
raw_jit : callable
|
|
69
|
+
An ``@njit`` dispatcher taking ``2 * n + 1`` scalar arguments.
|
|
70
|
+
n : int
|
|
71
|
+
Length of each array argument.
|
|
72
|
+
as_array : bool
|
|
73
|
+
If True, wrap the result in ``np.array(...)``; if False, return
|
|
74
|
+
it as-is (for scalar-valued ``raw_jit``, e.g. a Hamiltonian).
|
|
75
|
+
|
|
76
|
+
Returns
|
|
77
|
+
-------
|
|
78
|
+
callable
|
|
79
|
+
An ``@njit`` dispatcher ``(arr1, arr2, scalar) -> result``.
|
|
80
|
+
"""
|
|
81
|
+
call_args = [f"a1[{i}]" for i in range(n)] + [f"a2[{i}]" for i in range(n)] + ["s"]
|
|
82
|
+
body = f"np.array(raw_jit({', '.join(call_args)}))" if as_array else f"raw_jit({', '.join(call_args)})"
|
|
83
|
+
src = f"def _wrapper(a1, a2, s):\n return {body}\n"
|
|
84
|
+
ns = {"raw_jit": raw_jit, "np": np}
|
|
85
|
+
exec(src, ns)
|
|
86
|
+
return njit(cache=False)(ns["_wrapper"])
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class LagrangianEngine:
|
|
90
|
+
"""Derive and JIT-compile equations of motion from L(q, qdot, t).
|
|
91
|
+
|
|
92
|
+
Parameters
|
|
93
|
+
----------
|
|
94
|
+
q, qdot : sequences of sympy Symbol
|
|
95
|
+
Generalized coordinates and velocities, same length/order.
|
|
96
|
+
L : sympy expression
|
|
97
|
+
The Lagrangian, a function of ``q``, ``qdot``, optionally the
|
|
98
|
+
time symbol ``t``, and any constant parameters (substituted via
|
|
99
|
+
``params`` before compilation).
|
|
100
|
+
t : sympy Symbol, optional
|
|
101
|
+
Time symbol appearing in ``L`` (e.g. for a rotating hoop with
|
|
102
|
+
explicit time dependence). A fresh dummy symbol is used if
|
|
103
|
+
omitted.
|
|
104
|
+
params : dict[sympy.Symbol, float], optional
|
|
105
|
+
Numeric values substituted for constant parameters in ``L``.
|
|
106
|
+
|
|
107
|
+
Attributes
|
|
108
|
+
----------
|
|
109
|
+
acceleration_njit : callable
|
|
110
|
+
``(q, qdot, t) -> qddot``.
|
|
111
|
+
momentum_njit : callable
|
|
112
|
+
``(q, qdot) -> p``, where ``p_i = dL/dqdot_i``.
|
|
113
|
+
canonical_deriv_njit : callable
|
|
114
|
+
``(t, y) -> dy``, where ``y = [q, p]`` and ``dy = [dH/dp, -dH/dq]``.
|
|
115
|
+
velocity_njit : callable
|
|
116
|
+
``(q, p) -> qdot``, i.e. ``dH/dp``.
|
|
117
|
+
full_deriv_njit : callable
|
|
118
|
+
``(t, y) -> dy``, where ``y = [q, qdot]`` and ``dy = [qdot, qddot]``.
|
|
119
|
+
hamiltonian_njit : callable
|
|
120
|
+
``(q, p, t) -> H``.
|
|
121
|
+
mass_matrix : sympy.Matrix
|
|
122
|
+
The symbolic mass matrix M(q) from the Euler-Lagrange derivation.
|
|
123
|
+
H_expr : sympy expression
|
|
124
|
+
The derived Hamiltonian H(q, p, t).
|
|
125
|
+
"""
|
|
126
|
+
|
|
127
|
+
def __init__(self, q, qdot, L: sp.Expr, t: sp.Symbol = None, params: dict = None):
|
|
128
|
+
self.q = list(q)
|
|
129
|
+
self.qdot = list(qdot)
|
|
130
|
+
self.n = len(self.q)
|
|
131
|
+
self.t = t if t is not None else sp.Symbol("t")
|
|
132
|
+
self.params = params or {}
|
|
133
|
+
self.L = sp.sympify(L).subs(self.params)
|
|
134
|
+
|
|
135
|
+
self._qddot = sp.symbols(f"qddot0:{self.n}")
|
|
136
|
+
self._p = sp.symbols(f"p0:{self.n}")
|
|
137
|
+
self._derive_euler_lagrange()
|
|
138
|
+
self._derive_hamiltonian()
|
|
139
|
+
self._compile()
|
|
140
|
+
|
|
141
|
+
# -- Euler-Lagrange -----------------------------------------------
|
|
142
|
+
def _derive_euler_lagrange(self):
|
|
143
|
+
q, qdot, qddot, t = self.q, self.qdot, self._qddot, self.t
|
|
144
|
+
n = self.n
|
|
145
|
+
|
|
146
|
+
dL_dqdot = [sp.diff(self.L, qdot[i]) for i in range(n)]
|
|
147
|
+
eqs = []
|
|
148
|
+
for i in range(n):
|
|
149
|
+
total_ddt = sp.diff(dL_dqdot[i], t)
|
|
150
|
+
for j in range(n):
|
|
151
|
+
total_ddt += sp.diff(dL_dqdot[i], q[j]) * qdot[j]
|
|
152
|
+
total_ddt += sp.diff(dL_dqdot[i], qdot[j]) * qddot[j]
|
|
153
|
+
eqs.append(sp.together(total_ddt - sp.diff(self.L, q[i])))
|
|
154
|
+
|
|
155
|
+
M, rhs = sp.linear_eq_to_matrix(eqs, list(qddot))
|
|
156
|
+
self.mass_matrix = sp.simplify(M)
|
|
157
|
+
self._qddot_expr = sp.simplify(self.mass_matrix.inv() * rhs)
|
|
158
|
+
|
|
159
|
+
# -- Legendre transform / Hamiltonian ------------------------------
|
|
160
|
+
def _derive_hamiltonian(self):
|
|
161
|
+
q, qdot, p = self.q, self.qdot, self._p
|
|
162
|
+
n = self.n
|
|
163
|
+
|
|
164
|
+
dL_dqdot = [sp.diff(self.L, qdot[i]) for i in range(n)]
|
|
165
|
+
A, b = sp.linear_eq_to_matrix([dL_dqdot[i] - p[i] for i in range(n)], list(qdot))
|
|
166
|
+
qdot_of_p = A.inv() * b
|
|
167
|
+
qdot_subs = {qdot[i]: qdot_of_p[i] for i in range(n)}
|
|
168
|
+
|
|
169
|
+
H = sum(p[i] * qdot_of_p[i] for i in range(n)) - self.L.subs(qdot_subs, simultaneous=True)
|
|
170
|
+
self.H_expr = sp.simplify(H)
|
|
171
|
+
|
|
172
|
+
self._dHdq = [sp.simplify(sp.diff(self.H_expr, q[i])) for i in range(n)]
|
|
173
|
+
self._dHdp = [sp.simplify(sp.diff(self.H_expr, p[i])) for i in range(n)]
|
|
174
|
+
self._velocity_expr = [sp.simplify(qdot_of_p[i]) for i in range(n)]
|
|
175
|
+
self._p_of_qdot_expr = list(dL_dqdot)
|
|
176
|
+
|
|
177
|
+
# -- compile everything to njit callables --------------------------
|
|
178
|
+
def _compile(self):
|
|
179
|
+
q, qdot, p, t = self.q, self.qdot, self._p, self.t
|
|
180
|
+
n = self.n
|
|
181
|
+
qp_args = tuple(q) + tuple(qdot) + (t,)
|
|
182
|
+
qP_args = tuple(q) + tuple(p) + (t,)
|
|
183
|
+
|
|
184
|
+
accel_raw = _lambdify_vector_njit(qp_args, self._qddot_expr)
|
|
185
|
+
grad_q_raw = _lambdify_vector_njit(qP_args, self._dHdq)
|
|
186
|
+
grad_p_raw = _lambdify_vector_njit(qP_args, self._dHdp)
|
|
187
|
+
vel_raw = _lambdify_vector_njit(qP_args, self._velocity_expr)
|
|
188
|
+
p_raw = _lambdify_vector_njit(qp_args, self._p_of_qdot_expr)
|
|
189
|
+
H_raw = njit(cache=False)(sp.lambdify(qP_args, self.H_expr, modules="numpy"))
|
|
190
|
+
|
|
191
|
+
acceleration_njit = _indexed_wrapper(accel_raw, n)
|
|
192
|
+
momentum_njit_full = _indexed_wrapper(p_raw, n)
|
|
193
|
+
grad_q_njit = _indexed_wrapper(grad_q_raw, n)
|
|
194
|
+
grad_p_njit = _indexed_wrapper(grad_p_raw, n)
|
|
195
|
+
velocity_njit_full = _indexed_wrapper(vel_raw, n)
|
|
196
|
+
hamiltonian_njit_full = _indexed_wrapper(H_raw, n, as_array=False)
|
|
197
|
+
|
|
198
|
+
@njit(cache=False)
|
|
199
|
+
def momentum_njit(qa, qdota):
|
|
200
|
+
return momentum_njit_full(qa, qdota, 0.0)
|
|
201
|
+
|
|
202
|
+
@njit(cache=False)
|
|
203
|
+
def canonical_deriv_njit(tt, y):
|
|
204
|
+
qa = y[:n]
|
|
205
|
+
pa = y[n:]
|
|
206
|
+
dHdq = grad_q_njit(qa, pa, tt)
|
|
207
|
+
dHdp = grad_p_njit(qa, pa, tt)
|
|
208
|
+
out = np.empty(2 * n)
|
|
209
|
+
out[:n] = dHdp
|
|
210
|
+
out[n:] = -dHdq
|
|
211
|
+
return out
|
|
212
|
+
|
|
213
|
+
@njit(cache=False)
|
|
214
|
+
def velocity_njit(qa, pa):
|
|
215
|
+
return velocity_njit_full(qa, pa, 0.0)
|
|
216
|
+
|
|
217
|
+
@njit(cache=False)
|
|
218
|
+
def full_deriv_njit(tt, y):
|
|
219
|
+
qa = y[:n]
|
|
220
|
+
qdota = y[n:]
|
|
221
|
+
out = np.empty(2 * n)
|
|
222
|
+
out[:n] = qdota
|
|
223
|
+
out[n:] = acceleration_njit(qa, qdota, tt)
|
|
224
|
+
return out
|
|
225
|
+
|
|
226
|
+
@njit(cache=False)
|
|
227
|
+
def hamiltonian_njit(qa, pa, tt):
|
|
228
|
+
return hamiltonian_njit_full(qa, pa, tt)
|
|
229
|
+
|
|
230
|
+
self.acceleration_njit = acceleration_njit
|
|
231
|
+
self.momentum_njit = momentum_njit
|
|
232
|
+
self.canonical_deriv_njit = canonical_deriv_njit
|
|
233
|
+
self.velocity_njit = velocity_njit
|
|
234
|
+
self.full_deriv_njit = full_deriv_njit
|
|
235
|
+
self.hamiltonian_njit = hamiltonian_njit
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from physicskit.classical.visualizers.animations import SideBySideAnimator, orbit_trace_animation, pendulum_animation
|
|
2
|
+
from physicskit.classical.visualizers.interactive import interactive_orbit, interactive_so3_momentum_sphere
|
|
3
|
+
from physicskit.classical.visualizers.modal_analysis import animate_modal_energies, plot_modal_energy_bars
|
|
4
|
+
from physicskit.classical.visualizers.phase_space import (
|
|
5
|
+
plot_phase_portrait,
|
|
6
|
+
plot_phase_swarm,
|
|
7
|
+
plot_poincare_section,
|
|
8
|
+
plot_so3_momentum_sphere,
|
|
9
|
+
poincare_section,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"plot_phase_portrait",
|
|
14
|
+
"plot_phase_swarm",
|
|
15
|
+
"poincare_section",
|
|
16
|
+
"plot_poincare_section",
|
|
17
|
+
"plot_so3_momentum_sphere",
|
|
18
|
+
"plot_modal_energy_bars",
|
|
19
|
+
"animate_modal_energies",
|
|
20
|
+
"SideBySideAnimator",
|
|
21
|
+
"orbit_trace_animation",
|
|
22
|
+
"pendulum_animation",
|
|
23
|
+
"interactive_so3_momentum_sphere",
|
|
24
|
+
"interactive_orbit",
|
|
25
|
+
]
|