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,198 @@
|
|
|
1
|
+
"""Kruskal-Szekeres and Penrose-Carter conformal diagrams for the Schwarzschild spacetime.
|
|
2
|
+
|
|
3
|
+
Schwarzschild coordinates :math:`(t, r)` are singular at the horizon
|
|
4
|
+
:math:`r = 2M` -- a mere coordinate artifact, not a physical singularity,
|
|
5
|
+
but one that hides the true global structure of the spacetime. Kruskal and
|
|
6
|
+
Szekeres independently found coordinates :math:`(X, T)` that are perfectly
|
|
7
|
+
regular at the horizon and reveal that maximally extended Schwarzschild
|
|
8
|
+
spacetime actually contains *two* asymptotically flat regions connected by
|
|
9
|
+
a non-traversable wormhole (the Einstein-Rosen bridge). Compactifying
|
|
10
|
+
Kruskal coordinates further via Penrose and Carter's conformal
|
|
11
|
+
transformation brings the entire (infinite) spacetime into a single finite
|
|
12
|
+
diagram, making the causal structure -- including the true curvature
|
|
13
|
+
singularity at :math:`r=0` and the boundaries at infinity -- visible at a
|
|
14
|
+
glance.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import matplotlib.pyplot as plt
|
|
20
|
+
import numpy as np
|
|
21
|
+
|
|
22
|
+
__all__ = [
|
|
23
|
+
"kruskal_coordinates",
|
|
24
|
+
"penrose_carter_coordinates",
|
|
25
|
+
"plot_kruskal_diagram",
|
|
26
|
+
"plot_penrose_diagram",
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def kruskal_coordinates(t, r, M):
|
|
31
|
+
"""Convert Schwarzschild :math:`(t, r)` to Kruskal-Szekeres :math:`(X, T)`.
|
|
32
|
+
|
|
33
|
+
For the exterior region (:math:`r > 2M`):
|
|
34
|
+
|
|
35
|
+
.. math::
|
|
36
|
+
|
|
37
|
+
X = \\sqrt{r/2M - 1}\\, e^{r/4M} \\cosh(t/4M), \\qquad
|
|
38
|
+
T = \\sqrt{r/2M - 1}\\, e^{r/4M} \\sinh(t/4M)
|
|
39
|
+
|
|
40
|
+
and for the interior (:math:`r < 2M`), :math:`\\sinh` and
|
|
41
|
+
:math:`\\cosh` swap roles. Curves of constant :math:`r` are hyperbolae
|
|
42
|
+
:math:`X^2 - T^2 = (r/2M - 1)e^{r/2M}`; curves of constant :math:`t` are
|
|
43
|
+
straight lines through the origin; the horizon :math:`r=2M` maps to the
|
|
44
|
+
lines :math:`X = \\pm T`.
|
|
45
|
+
|
|
46
|
+
Parameters
|
|
47
|
+
----------
|
|
48
|
+
t, r : float or array_like
|
|
49
|
+
Schwarzschild time and radial coordinates.
|
|
50
|
+
M : float
|
|
51
|
+
Mass, in geometrized units.
|
|
52
|
+
|
|
53
|
+
Returns
|
|
54
|
+
-------
|
|
55
|
+
X, T : float or ndarray
|
|
56
|
+
Kruskal-Szekeres coordinates.
|
|
57
|
+
"""
|
|
58
|
+
t = np.asarray(t, dtype=np.float64)
|
|
59
|
+
r = np.asarray(r, dtype=np.float64)
|
|
60
|
+
exterior = r > 2.0 * M
|
|
61
|
+
prefactor = np.sqrt(np.abs(r / (2.0 * M) - 1.0)) * np.exp(r / (4.0 * M))
|
|
62
|
+
X = np.where(exterior, prefactor * np.cosh(t / (4.0 * M)), prefactor * np.sinh(t / (4.0 * M)))
|
|
63
|
+
T = np.where(exterior, prefactor * np.sinh(t / (4.0 * M)), prefactor * np.cosh(t / (4.0 * M)))
|
|
64
|
+
return X, T
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def penrose_carter_coordinates(t, r, M):
|
|
68
|
+
"""Compactified Penrose-Carter diagram coordinates.
|
|
69
|
+
|
|
70
|
+
Applies :math:`\\arctan` to the Kruskal null coordinates
|
|
71
|
+
:math:`u = T - X`, :math:`v = T + X`, bringing the entire
|
|
72
|
+
(infinite-range) spacetime into a finite diamond
|
|
73
|
+
:math:`(\\text{space}, \\text{time}) \\in (-\\pi/2, \\pi/2)^2`.
|
|
74
|
+
|
|
75
|
+
Parameters
|
|
76
|
+
----------
|
|
77
|
+
t, r : float or array_like
|
|
78
|
+
Schwarzschild time and radial coordinates.
|
|
79
|
+
M : float
|
|
80
|
+
Mass, in geometrized units.
|
|
81
|
+
|
|
82
|
+
Returns
|
|
83
|
+
-------
|
|
84
|
+
space, time : float or ndarray
|
|
85
|
+
Compactified diagram coordinates; light rays travel at
|
|
86
|
+
:math:`\\pm 45^\\circ` exactly as in the Kruskal diagram.
|
|
87
|
+
"""
|
|
88
|
+
X, T = kruskal_coordinates(t, r, M)
|
|
89
|
+
u = T - X
|
|
90
|
+
v = T + X
|
|
91
|
+
up = np.arctan(u)
|
|
92
|
+
vp = np.arctan(v)
|
|
93
|
+
space = (vp - up) / 2.0
|
|
94
|
+
time = (vp + up) / 2.0
|
|
95
|
+
return space, time
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _plot_r_and_t_lines(ax, coord_transform, M, r_lines, t_lines, n_dense=400, t_span=40.0, r_span=(1.0e-3, 30.0)):
|
|
99
|
+
t_dense = np.linspace(-t_span * M, t_span * M, n_dense)
|
|
100
|
+
for rl in r_lines:
|
|
101
|
+
x, y = coord_transform(t_dense, np.full_like(t_dense, rl), M)
|
|
102
|
+
ax.plot(x, y, color="steelblue", linewidth=1.0)
|
|
103
|
+
|
|
104
|
+
r_dense = np.linspace(r_span[0] * M, r_span[1] * M, n_dense)
|
|
105
|
+
for tl in t_lines:
|
|
106
|
+
x, y = coord_transform(np.full_like(r_dense, tl), r_dense, M)
|
|
107
|
+
ax.plot(x, y, color="salmon", linewidth=0.7)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def plot_kruskal_diagram(M, ax=None, r_lines=None, t_lines=None, lim=6.0):
|
|
111
|
+
"""Plot a Kruskal-Szekeres diagram: constant-:math:`r` and constant-:math:`t` grid lines,
|
|
112
|
+
the horizon light cone, and the :math:`r=0` singularity.
|
|
113
|
+
|
|
114
|
+
Parameters
|
|
115
|
+
----------
|
|
116
|
+
M : float
|
|
117
|
+
Mass, in geometrized units.
|
|
118
|
+
ax : matplotlib.axes.Axes, optional
|
|
119
|
+
Axes to draw into. A new figure and axes are created if not given.
|
|
120
|
+
r_lines : array_like, optional
|
|
121
|
+
Radii (in units of ``M``) at which to draw constant-:math:`r` hyperbolae.
|
|
122
|
+
t_lines : array_like, optional
|
|
123
|
+
Times (in units of ``M``) at which to draw constant-:math:`t` rays.
|
|
124
|
+
lim : float, default=6.0
|
|
125
|
+
Axis limits, :math:`\\pm` this value.
|
|
126
|
+
|
|
127
|
+
Returns
|
|
128
|
+
-------
|
|
129
|
+
matplotlib.axes.Axes
|
|
130
|
+
"""
|
|
131
|
+
if ax is None:
|
|
132
|
+
_, ax = plt.subplots(figsize=(6, 6))
|
|
133
|
+
if r_lines is None:
|
|
134
|
+
r_lines = np.array([0.5, 1.0, 1.5, 2.5, 3.5, 5.0]) * M
|
|
135
|
+
if t_lines is None:
|
|
136
|
+
t_lines = np.linspace(-8.0, 8.0, 9) * M
|
|
137
|
+
|
|
138
|
+
_plot_r_and_t_lines(ax, kruskal_coordinates, M, r_lines, t_lines)
|
|
139
|
+
|
|
140
|
+
ax.plot([-lim, lim], [-lim, lim], "k--", linewidth=1.2, label="horizon r=2M")
|
|
141
|
+
ax.plot([-lim, lim], [lim, -lim], "k--", linewidth=1.2)
|
|
142
|
+
|
|
143
|
+
Xs = np.linspace(-lim, lim, 200)
|
|
144
|
+
ax.plot(Xs, np.sqrt(Xs**2 + 1.0), "r-", linewidth=2, label="singularity r=0")
|
|
145
|
+
ax.plot(Xs, -np.sqrt(Xs**2 + 1.0), "r-", linewidth=2)
|
|
146
|
+
|
|
147
|
+
ax.set_xlim(-lim, lim)
|
|
148
|
+
ax.set_ylim(-lim, lim)
|
|
149
|
+
ax.set_aspect("equal")
|
|
150
|
+
ax.set_xlabel("X")
|
|
151
|
+
ax.set_ylabel("T")
|
|
152
|
+
ax.set_title("Kruskal-Szekeres diagram")
|
|
153
|
+
ax.legend(loc="upper left", fontsize=8)
|
|
154
|
+
return ax
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def plot_penrose_diagram(M, ax=None, r_lines=None, t_lines=None):
|
|
158
|
+
"""Plot a compactified Penrose-Carter diagram for maximally extended Schwarzschild spacetime.
|
|
159
|
+
|
|
160
|
+
Parameters
|
|
161
|
+
----------
|
|
162
|
+
M : float
|
|
163
|
+
Mass, in geometrized units.
|
|
164
|
+
ax : matplotlib.axes.Axes, optional
|
|
165
|
+
Axes to draw into. A new figure and axes are created if not given.
|
|
166
|
+
r_lines : array_like, optional
|
|
167
|
+
Radii (in units of ``M``) at which to draw constant-:math:`r` curves.
|
|
168
|
+
t_lines : array_like, optional
|
|
169
|
+
Times (in units of ``M``) at which to draw constant-:math:`t` curves.
|
|
170
|
+
|
|
171
|
+
Returns
|
|
172
|
+
-------
|
|
173
|
+
matplotlib.axes.Axes
|
|
174
|
+
"""
|
|
175
|
+
if ax is None:
|
|
176
|
+
_, ax = plt.subplots(figsize=(6, 6))
|
|
177
|
+
if r_lines is None:
|
|
178
|
+
r_lines = np.array([0.5, 1.0, 2.0, 4.0, 8.0]) * M
|
|
179
|
+
if t_lines is None:
|
|
180
|
+
t_lines = np.linspace(-10.0, 10.0, 9) * M
|
|
181
|
+
|
|
182
|
+
_plot_r_and_t_lines(ax, penrose_carter_coordinates, M, r_lines, t_lines, t_span=200.0, r_span=(1.0e-3, 400.0))
|
|
183
|
+
|
|
184
|
+
lim = np.pi / 2.0
|
|
185
|
+
ax.plot([-lim, lim], [-lim, lim], "k--", linewidth=1.2, label="horizon r=2M")
|
|
186
|
+
ax.plot([-lim, lim], [lim, -lim], "k--", linewidth=1.2)
|
|
187
|
+
|
|
188
|
+
ax.plot([-lim, 0], [0, lim], "r-", linewidth=2, label="singularity r=0")
|
|
189
|
+
ax.plot([0, lim], [lim, 0], "r-", linewidth=2)
|
|
190
|
+
|
|
191
|
+
ax.set_xlim(-lim - 0.1, lim + 0.1)
|
|
192
|
+
ax.set_ylim(-lim - 0.1, lim + 0.1)
|
|
193
|
+
ax.set_aspect("equal")
|
|
194
|
+
ax.set_xlabel("space")
|
|
195
|
+
ax.set_ylabel("time")
|
|
196
|
+
ax.set_title("Penrose-Carter conformal diagram")
|
|
197
|
+
ax.legend(loc="upper left", fontsize=8)
|
|
198
|
+
return ax
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"""Visualizations of gravitational wave strain time series and spatial ripple patterns."""
|
|
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
|
+
from physicskit.relativity.utils.constants import check_geometrized_distance, check_geometrized_mass
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"animate_wave_ripple",
|
|
13
|
+
"plot_strain_waveform",
|
|
14
|
+
"plot_wave_ripple",
|
|
15
|
+
"wave_ripple_snapshot",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def plot_strain_waveform(t, h_plus, h_cross=None, ax=None, t_merger=None):
|
|
20
|
+
"""Plot a gravitational wave strain time series.
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
t : array_like
|
|
25
|
+
Time samples.
|
|
26
|
+
h_plus : array_like
|
|
27
|
+
Plus-polarization strain.
|
|
28
|
+
h_cross : array_like, optional
|
|
29
|
+
Cross-polarization strain, plotted alongside ``h_plus`` if given.
|
|
30
|
+
ax : matplotlib.axes.Axes, optional
|
|
31
|
+
Axes to draw into. A new figure and axes are created if not given.
|
|
32
|
+
t_merger : float, optional
|
|
33
|
+
Merger time, marked with a vertical dashed line.
|
|
34
|
+
|
|
35
|
+
Returns
|
|
36
|
+
-------
|
|
37
|
+
matplotlib.axes.Axes
|
|
38
|
+
"""
|
|
39
|
+
if ax is None:
|
|
40
|
+
_, ax = plt.subplots(figsize=(8, 4))
|
|
41
|
+
ax.plot(t, h_plus, label=r"$h_+$", linewidth=1.2)
|
|
42
|
+
if h_cross is not None:
|
|
43
|
+
ax.plot(t, h_cross, label=r"$h_\times$", linewidth=1.0, alpha=0.75)
|
|
44
|
+
if t_merger is not None:
|
|
45
|
+
ax.axvline(t_merger, color="k", linestyle="--", linewidth=1, alpha=0.6, label="merger")
|
|
46
|
+
ax.set_xlabel("time")
|
|
47
|
+
ax.set_ylabel("strain")
|
|
48
|
+
ax.legend()
|
|
49
|
+
return ax
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def wave_ripple_snapshot(merger, t, t_merger, grid_size=150, extent=40.0):
|
|
53
|
+
"""Compute a 2D spatial snapshot of a merger's radiated wave pattern in the orbital plane.
|
|
54
|
+
|
|
55
|
+
Uses the actual (oscillating) :math:`h_+` strain from
|
|
56
|
+
``merger.full_waveform`` evaluated at each grid point's retarded time
|
|
57
|
+
:math:`t_{\\text{ret}} = t - r`, with :math:`1/r` amplitude falloff and
|
|
58
|
+
the schematic quadrupolar :math:`\\cos(2\\varphi)` azimuthal pattern
|
|
59
|
+
characteristic of the dominant (l=2, m=2) gravitational wave mode as
|
|
60
|
+
seen face-on. Using the oscillating strain itself, rather than its
|
|
61
|
+
envelope, is what makes concentric ripples appear at all: at fixed
|
|
62
|
+
``t``, sweeping outward in ``r`` sweeps ``t_ret`` backward through the
|
|
63
|
+
chirp's accumulating phase, so the wave's rising frequency shows up
|
|
64
|
+
directly as rings that pack tighter close to the source. Warns (via
|
|
65
|
+
:func:`~physicskit.relativity.utils.constants.check_geometrized_mass` /
|
|
66
|
+
:func:`~physicskit.relativity.utils.constants.check_geometrized_distance`)
|
|
67
|
+
if ``merger``'s mass or distance looks like an unconverted physical
|
|
68
|
+
value rather than a geometrized length -- this is exactly the failure
|
|
69
|
+
mode that once made this function's animation silently non-oscillating
|
|
70
|
+
(see the package history).
|
|
71
|
+
|
|
72
|
+
Parameters
|
|
73
|
+
----------
|
|
74
|
+
merger : BinaryMerger
|
|
75
|
+
The source binary.
|
|
76
|
+
t : float
|
|
77
|
+
Observation time.
|
|
78
|
+
t_merger : float
|
|
79
|
+
Coalescence time, forwarded to ``merger.full_waveform``.
|
|
80
|
+
grid_size : int, default=150
|
|
81
|
+
Number of grid points per spatial axis.
|
|
82
|
+
extent : float, default=40.0
|
|
83
|
+
Half-width of the spatial grid, in units of ``M``.
|
|
84
|
+
|
|
85
|
+
Returns
|
|
86
|
+
-------
|
|
87
|
+
X, Y : ndarray of shape (grid_size, grid_size)
|
|
88
|
+
Spatial grid coordinates.
|
|
89
|
+
pattern : ndarray of shape (grid_size, grid_size)
|
|
90
|
+
The schematic strain pattern at time ``t``.
|
|
91
|
+
"""
|
|
92
|
+
check_geometrized_mass(merger.m1, name="merger.m1")
|
|
93
|
+
check_geometrized_mass(merger.m2, name="merger.m2")
|
|
94
|
+
check_geometrized_distance(merger.distance, name="merger.distance")
|
|
95
|
+
|
|
96
|
+
x = np.linspace(-extent, extent, grid_size)
|
|
97
|
+
y = np.linspace(-extent, extent, grid_size)
|
|
98
|
+
X, Y = np.meshgrid(x, y)
|
|
99
|
+
R = np.sqrt(X**2 + Y**2)
|
|
100
|
+
Phi = np.arctan2(Y, X)
|
|
101
|
+
R_safe = np.clip(R, 1.0, None)
|
|
102
|
+
|
|
103
|
+
t_ret = t - R_safe
|
|
104
|
+
hp_flat, _ = merger.full_waveform(t_ret.ravel(), t_merger)
|
|
105
|
+
hp = hp_flat.reshape(R.shape)
|
|
106
|
+
pattern = hp * (merger.distance / R_safe) * np.cos(2.0 * Phi)
|
|
107
|
+
return X, Y, pattern
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def plot_wave_ripple(merger, t, t_merger, ax=None, grid_size=150, extent=40.0, cmap="RdBu"):
|
|
111
|
+
"""Plot one snapshot of a merger's spatial wave ripple pattern.
|
|
112
|
+
|
|
113
|
+
Parameters
|
|
114
|
+
----------
|
|
115
|
+
merger : BinaryMerger
|
|
116
|
+
The source binary.
|
|
117
|
+
t : float
|
|
118
|
+
Observation time.
|
|
119
|
+
t_merger : float
|
|
120
|
+
Coalescence time.
|
|
121
|
+
ax : matplotlib.axes.Axes, optional
|
|
122
|
+
Axes to draw into.
|
|
123
|
+
grid_size : int, default=150
|
|
124
|
+
Spatial grid resolution.
|
|
125
|
+
extent : float, default=40.0
|
|
126
|
+
Half-width of the spatial grid, in units of ``M``.
|
|
127
|
+
cmap : str, default="RdBu"
|
|
128
|
+
Diverging colormap name.
|
|
129
|
+
|
|
130
|
+
Returns
|
|
131
|
+
-------
|
|
132
|
+
matplotlib.axes.Axes
|
|
133
|
+
"""
|
|
134
|
+
X, Y, pattern = wave_ripple_snapshot(merger, t, t_merger, grid_size=grid_size, extent=extent)
|
|
135
|
+
if ax is None:
|
|
136
|
+
_, ax = plt.subplots(figsize=(6, 6))
|
|
137
|
+
vmax = np.max(np.abs(pattern)) or 1.0
|
|
138
|
+
im = ax.pcolormesh(X, Y, pattern, cmap=cmap, vmin=-vmax, vmax=vmax, shading="auto")
|
|
139
|
+
ax.set_aspect("equal")
|
|
140
|
+
ax.set_xlabel("x [M]")
|
|
141
|
+
ax.set_ylabel("y [M]")
|
|
142
|
+
ax.set_title(f"GW spatial ripple pattern, t={t:.1f}")
|
|
143
|
+
plt.colorbar(im, ax=ax, fraction=0.046, pad=0.04, label="strain (schematic)")
|
|
144
|
+
return ax
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def animate_wave_ripple(merger, t_merger, t_values, grid_size=100, extent=40.0, cmap="RdBu"):
|
|
148
|
+
"""Animate a merger's spatial wave ripple pattern over a sequence of times.
|
|
149
|
+
|
|
150
|
+
Parameters
|
|
151
|
+
----------
|
|
152
|
+
merger : BinaryMerger
|
|
153
|
+
The source binary.
|
|
154
|
+
t_merger : float
|
|
155
|
+
Coalescence time.
|
|
156
|
+
t_values : array_like
|
|
157
|
+
Sequence of observation times, one per animation frame.
|
|
158
|
+
grid_size : int, default=100
|
|
159
|
+
Spatial grid resolution.
|
|
160
|
+
extent : float, default=40.0
|
|
161
|
+
Half-width of the spatial grid, in units of ``M``.
|
|
162
|
+
cmap : str, default="RdBu"
|
|
163
|
+
Diverging colormap name.
|
|
164
|
+
|
|
165
|
+
Returns
|
|
166
|
+
-------
|
|
167
|
+
matplotlib.animation.FuncAnimation
|
|
168
|
+
"""
|
|
169
|
+
fig, ax = plt.subplots(figsize=(6, 6))
|
|
170
|
+
X, Y, pattern0 = wave_ripple_snapshot(merger, t_values[0], t_merger, grid_size=grid_size, extent=extent)
|
|
171
|
+
vmax = np.max(np.abs(pattern0)) or 1.0
|
|
172
|
+
mesh = ax.pcolormesh(X, Y, pattern0, cmap=cmap, vmin=-vmax, vmax=vmax, shading="auto")
|
|
173
|
+
ax.set_aspect("equal")
|
|
174
|
+
ax.set_xlabel("x [M]")
|
|
175
|
+
ax.set_ylabel("y [M]")
|
|
176
|
+
title = ax.set_title(f"t={t_values[0]:.1f}")
|
|
177
|
+
|
|
178
|
+
def update(frame):
|
|
179
|
+
t = t_values[frame]
|
|
180
|
+
_, _, pattern = wave_ripple_snapshot(merger, t, t_merger, grid_size=grid_size, extent=extent)
|
|
181
|
+
mesh.set_array(pattern.ravel())
|
|
182
|
+
title.set_text(f"t={t:.1f}")
|
|
183
|
+
return mesh, title
|
|
184
|
+
|
|
185
|
+
return FuncAnimation(fig, update, frames=len(t_values), blit=False, interval=60)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"""physicskit.rmt -- a random matrix theory library organized around Dyson's
|
|
2
|
+
threefold way, validated against exact theory and seminal-paper results."""
|
|
3
|
+
|
|
4
|
+
from . import ensembles, stats, validation
|
|
5
|
+
from .spectrum import Spectrum
|
|
6
|
+
|
|
7
|
+
__all__ = ["ensembles", "stats", "validation", "Spectrum"]
|
|
8
|
+
__version__ = "0.1.0"
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
from .banded import PowerLawBandedEnsemble
|
|
2
|
+
from .base import MatrixEnsemble
|
|
3
|
+
from .bdg import BdGClassC, BdGClassCI, BdGClassD, BdGClassDIII
|
|
4
|
+
from .chiral import (
|
|
5
|
+
ChiralBetaEnsemble,
|
|
6
|
+
QCDDiracEnsemble,
|
|
7
|
+
QCDDiracGOE,
|
|
8
|
+
QCDDiracGSE,
|
|
9
|
+
QCDDiracGUE,
|
|
10
|
+
chGOE,
|
|
11
|
+
chGSE,
|
|
12
|
+
chGUE,
|
|
13
|
+
)
|
|
14
|
+
from .circular import COE, CSE, CUE
|
|
15
|
+
from .crossover import GOEGUECrossoverEnsemble
|
|
16
|
+
from .density_matrix import BuresHallEnsemble, HilbertSchmidtEnsemble, InducedMeasureEnsemble
|
|
17
|
+
from .effective_hamiltonian import (
|
|
18
|
+
EffectiveHamiltonianEnsemble,
|
|
19
|
+
EffGOE,
|
|
20
|
+
EffGSE,
|
|
21
|
+
EffGUE,
|
|
22
|
+
)
|
|
23
|
+
from .embedded import EmbeddedGaussianEnsemble, TwoBodyRandomEnsemble
|
|
24
|
+
from .gaussian import GOE, GSE, GUE, HermiteBetaEnsemble
|
|
25
|
+
from .ginibre import GinOE, GinSE, GinUE
|
|
26
|
+
from .girko import GirkoElliptic, IIDEnsemble, standard_normal
|
|
27
|
+
from .graph_laplacian import GraphLaplacianEnsemble
|
|
28
|
+
from .haar import HaarOrthogonalEnsemble
|
|
29
|
+
from .jacobi import JOE, JSE, JUE, JacobiBetaEnsemble
|
|
30
|
+
from .poisson import PoissonEnsemble
|
|
31
|
+
from .polynomial import PolynomialEnsemble, fuss_catalan_moment
|
|
32
|
+
from .pt_symmetric import PTSymmetricEnsemble
|
|
33
|
+
from .single_ring import NonHermitianWishartEnsemble, SingleRingEnsemble
|
|
34
|
+
from .sparse import BernoulliWignerEnsemble, ErdosRenyiEnsemble
|
|
35
|
+
from .syk import SYKEnsemble, majorana_operators
|
|
36
|
+
from .truncated_unitary import TruncatedUnitaryEnsemble
|
|
37
|
+
from .universality import (
|
|
38
|
+
GeneralWignerEnsemble,
|
|
39
|
+
exponential_centered_unit_variance,
|
|
40
|
+
rademacher,
|
|
41
|
+
uniform_unit_variance,
|
|
42
|
+
)
|
|
43
|
+
from .wishart import LOE, LSE, LUE, LaguerreBetaEnsemble
|
|
44
|
+
|
|
45
|
+
__all__ = [
|
|
46
|
+
"MatrixEnsemble",
|
|
47
|
+
"HermiteBetaEnsemble",
|
|
48
|
+
"GOE",
|
|
49
|
+
"GUE",
|
|
50
|
+
"GSE",
|
|
51
|
+
"LaguerreBetaEnsemble",
|
|
52
|
+
"LOE",
|
|
53
|
+
"LUE",
|
|
54
|
+
"LSE",
|
|
55
|
+
"COE",
|
|
56
|
+
"CUE",
|
|
57
|
+
"CSE",
|
|
58
|
+
"GinOE",
|
|
59
|
+
"GinUE",
|
|
60
|
+
"GinSE",
|
|
61
|
+
"JacobiBetaEnsemble",
|
|
62
|
+
"JOE",
|
|
63
|
+
"JUE",
|
|
64
|
+
"JSE",
|
|
65
|
+
"GeneralWignerEnsemble",
|
|
66
|
+
"uniform_unit_variance",
|
|
67
|
+
"rademacher",
|
|
68
|
+
"exponential_centered_unit_variance",
|
|
69
|
+
"BdGClassD",
|
|
70
|
+
"BdGClassC",
|
|
71
|
+
"BdGClassCI",
|
|
72
|
+
"BdGClassDIII",
|
|
73
|
+
"ChiralBetaEnsemble",
|
|
74
|
+
"chGOE",
|
|
75
|
+
"chGUE",
|
|
76
|
+
"chGSE",
|
|
77
|
+
"QCDDiracEnsemble",
|
|
78
|
+
"QCDDiracGOE",
|
|
79
|
+
"QCDDiracGUE",
|
|
80
|
+
"QCDDiracGSE",
|
|
81
|
+
"EffectiveHamiltonianEnsemble",
|
|
82
|
+
"EffGOE",
|
|
83
|
+
"EffGUE",
|
|
84
|
+
"EffGSE",
|
|
85
|
+
"IIDEnsemble",
|
|
86
|
+
"GirkoElliptic",
|
|
87
|
+
"standard_normal",
|
|
88
|
+
"PoissonEnsemble",
|
|
89
|
+
"SYKEnsemble",
|
|
90
|
+
"majorana_operators",
|
|
91
|
+
"PolynomialEnsemble",
|
|
92
|
+
"fuss_catalan_moment",
|
|
93
|
+
"HaarOrthogonalEnsemble",
|
|
94
|
+
"GraphLaplacianEnsemble",
|
|
95
|
+
"ErdosRenyiEnsemble",
|
|
96
|
+
"BernoulliWignerEnsemble",
|
|
97
|
+
"PowerLawBandedEnsemble",
|
|
98
|
+
"InducedMeasureEnsemble",
|
|
99
|
+
"HilbertSchmidtEnsemble",
|
|
100
|
+
"BuresHallEnsemble",
|
|
101
|
+
"EmbeddedGaussianEnsemble",
|
|
102
|
+
"TwoBodyRandomEnsemble",
|
|
103
|
+
"SingleRingEnsemble",
|
|
104
|
+
"NonHermitianWishartEnsemble",
|
|
105
|
+
"PTSymmetricEnsemble",
|
|
106
|
+
"TruncatedUnitaryEnsemble",
|
|
107
|
+
"GOEGUECrossoverEnsemble",
|
|
108
|
+
]
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"""Power-law banded random matrices (PBRM) -- a random matrix model for
|
|
2
|
+
the Anderson localization transition, multifractality, and 1-D
|
|
3
|
+
disordered quantum chains with long-range hopping.
|
|
4
|
+
|
|
5
|
+
Reference: A. D. Mirlin, Y. V. Fyodorov, F.-M. Dittes, J. Quezada,
|
|
6
|
+
T. H. Seligman, "Transition from localized to extended eigenstates in
|
|
7
|
+
the ensemble of power-law random banded matrices", Phys. Rev. E 54
|
|
8
|
+
(1996) 3221.
|
|
9
|
+
|
|
10
|
+
Construction: a real symmetric n x n matrix H with independent Gaussian
|
|
11
|
+
entries, mean zero, whose variance decays as a power law in the
|
|
12
|
+
distance from the diagonal:
|
|
13
|
+
|
|
14
|
+
Var(H_ij) = [1 + (``abs(i - j)`` / b)**(2*alpha)]**(-1) (i != j)
|
|
15
|
+
|
|
16
|
+
with band-width parameter ``b`` and decay exponent ``alpha``. Two
|
|
17
|
+
limits recover familiar physics: alpha -> infinity (or b -> infinity)
|
|
18
|
+
recovers a strictly banded matrix (short-range hopping, Anderson-
|
|
19
|
+
localized eigenstates for a fixed finite band); alpha -> 0 recovers the
|
|
20
|
+
standard (unbanded) GOE (delocalized, semicircle statistics). The
|
|
21
|
+
celebrated special case is alpha = 1 (the default here): the model is
|
|
22
|
+
then exactly at a MULTIFRACTAL critical point, with a b-dependent
|
|
23
|
+
family of critical level statistics interpolating continuously between
|
|
24
|
+
Poisson (b -> 0) and Wigner-Dyson/GOE (b -> infinity) -- unlike every
|
|
25
|
+
other ensemble in this package, PBRM has no single universal limiting
|
|
26
|
+
bulk density or fixed Dyson-class level statistic; the level statistics
|
|
27
|
+
themselves are the tunable object of study, which is why no
|
|
28
|
+
``natural_scale`` rescaling beyond leaving raw energies alone is
|
|
29
|
+
attempted here (see ``tests/test_banded.py`` for what is checked
|
|
30
|
+
instead: the two limiting regimes' qualitative behavior, not a single
|
|
31
|
+
closed-form target).
|
|
32
|
+
|
|
33
|
+
Diagonal entries are independent standard Gaussian (order 1, like the
|
|
34
|
+
off-diagonal entries nearest the diagonal) -- their exact distribution
|
|
35
|
+
does not affect the localization physics, which is governed entirely by
|
|
36
|
+
the off-diagonal decay profile.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
from __future__ import annotations
|
|
40
|
+
|
|
41
|
+
import numpy as np
|
|
42
|
+
|
|
43
|
+
from .base import MatrixEnsemble
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _power_law_variance_profile(n: int, b: float, alpha: float) -> np.ndarray:
|
|
47
|
+
idx = np.arange(n)
|
|
48
|
+
distance = np.abs(idx[:, None] - idx[None, :])
|
|
49
|
+
with np.errstate(divide="ignore"):
|
|
50
|
+
variance = 1.0 / (1.0 + (distance / b) ** (2.0 * alpha))
|
|
51
|
+
return variance
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class PowerLawBandedEnsemble(MatrixEnsemble):
|
|
55
|
+
"""Power-law banded random matrix ensemble (see module docstring).
|
|
56
|
+
|
|
57
|
+
Parameters
|
|
58
|
+
----------
|
|
59
|
+
n : int
|
|
60
|
+
b : float
|
|
61
|
+
Band-width parameter (b > 0).
|
|
62
|
+
alpha : float, optional
|
|
63
|
+
Power-law decay exponent (default 1.0, the multifractal
|
|
64
|
+
critical point).
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
beta: float = 1
|
|
68
|
+
|
|
69
|
+
def __init__(
|
|
70
|
+
self,
|
|
71
|
+
n: int,
|
|
72
|
+
b: float,
|
|
73
|
+
alpha: float = 1.0,
|
|
74
|
+
seed: int | np.random.Generator | None = None,
|
|
75
|
+
) -> None:
|
|
76
|
+
if b <= 0:
|
|
77
|
+
raise ValueError(f"b must be positive, got {b}")
|
|
78
|
+
super().__init__(n, seed=seed)
|
|
79
|
+
self.b = float(b)
|
|
80
|
+
self.alpha = float(alpha)
|
|
81
|
+
|
|
82
|
+
def _sample_matrix(self, rng: np.random.Generator) -> np.ndarray:
|
|
83
|
+
n = self.n
|
|
84
|
+
variance = _power_law_variance_profile(n, self.b, self.alpha)
|
|
85
|
+
std = np.sqrt(variance)
|
|
86
|
+
# A single Gaussian draw per (i, j) pair (i < j), mirrored to
|
|
87
|
+
# (j, i) -- unlike GOE's (x + x.T)/sqrt(2), which averages TWO
|
|
88
|
+
# independent draws and so needs an extra /sqrt(2), there is
|
|
89
|
+
# only one random variable per off-diagonal pair here, so
|
|
90
|
+
# Var(H_ij) = std_ij**2 = variance_ij exactly, with no further
|
|
91
|
+
# factor -- confirmed numerically during development (see
|
|
92
|
+
# tests/test_banded.py) after an initial /2 factor undershot
|
|
93
|
+
# the target profile by half.
|
|
94
|
+
upper = np.triu(rng.standard_normal((n, n)) * std, k=1)
|
|
95
|
+
h = upper + upper.T
|
|
96
|
+
h += np.diag(rng.standard_normal(n))
|
|
97
|
+
return h
|
|
98
|
+
|
|
99
|
+
def _sample_eigenvalues(self, rng: np.random.Generator) -> np.ndarray:
|
|
100
|
+
return np.linalg.eigvalsh(self._sample_matrix(rng))
|
|
101
|
+
|
|
102
|
+
def _sample_eigenvalues_and_vectors(self, rng: np.random.Generator) -> tuple[np.ndarray, np.ndarray]:
|
|
103
|
+
# Eigenvector localization (inverse participation ratio,
|
|
104
|
+
# multifractal spectrum) is the entire physical motivation for
|
|
105
|
+
# this ensemble -- see physicskit.rmt.stats.localization and
|
|
106
|
+
# tests/test_localization.py for the Anderson-localization-
|
|
107
|
+
# transition check this enables (IPR flat/O(1/n) for b large,
|
|
108
|
+
# O(1) for b small, as the band-width parameter tunes the
|
|
109
|
+
# ensemble between GOE-like and strictly-banded-localized).
|
|
110
|
+
eigenvalues, eigenvectors = np.linalg.eigh(self._sample_matrix(rng))
|
|
111
|
+
return eigenvalues, eigenvectors
|
|
112
|
+
|
|
113
|
+
def natural_scale(self) -> float:
|
|
114
|
+
return 1.0
|