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,246 @@
|
|
|
1
|
+
r"""Landau levels: the 1930 quantization of a charged particle in a uniform magnetic field.
|
|
2
|
+
|
|
3
|
+
Lev Landau showed that the classically continuous cyclotron motion of a
|
|
4
|
+
charged particle in a uniform magnetic field :math:`B` quantizes into
|
|
5
|
+
discrete, macroscopically degenerate levels
|
|
6
|
+
|
|
7
|
+
.. math::
|
|
8
|
+
|
|
9
|
+
E_n = \hbar\omega_c\left(n+\tfrac12\right), \qquad \omega_c = \frac{eB}{m},
|
|
10
|
+
\qquad n = 0, 1, 2, \dots,
|
|
11
|
+
|
|
12
|
+
exactly the harmonic-oscillator spectrum, with :math:`\omega_c` set by the
|
|
13
|
+
field rather than a spring constant. Each level's macroscopic degeneracy per
|
|
14
|
+
unit area, :math:`n_B = 1/(2\pi \ell_B^2)` with magnetic length
|
|
15
|
+
:math:`\ell_B = \sqrt{\hbar/(eB)}`, is the microscopic origin of orbital
|
|
16
|
+
(Landau) diamagnetism, and -- once a 2D electron gas and disorder-broadened
|
|
17
|
+
levels are added -- the direct ancestor of the integer quantum Hall effect
|
|
18
|
+
(:mod:`physicskit.condensed.topology`) fifty years later.
|
|
19
|
+
|
|
20
|
+
Uses the same natural-unit convention (:math:`\hbar=e=1`) as the rest of
|
|
21
|
+
:mod:`physicskit.condensed`; pass ``m``, ``e``, and ``hbar`` explicitly to
|
|
22
|
+
work in physical units instead. See
|
|
23
|
+
:func:`physicskit.condensed.tight_binding.apply_peierls_phase` for the
|
|
24
|
+
lattice (Peierls-substitution) route to the same physics.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
from __future__ import annotations
|
|
28
|
+
|
|
29
|
+
import numpy as np
|
|
30
|
+
|
|
31
|
+
__all__ = [
|
|
32
|
+
"cyclotron_frequency",
|
|
33
|
+
"magnetic_length",
|
|
34
|
+
"landau_level_energies",
|
|
35
|
+
"landau_degeneracy",
|
|
36
|
+
"landau_density_of_states",
|
|
37
|
+
"filling_factor",
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def cyclotron_frequency(B: float, m: float = 1.0, e: float = 1.0) -> float:
|
|
42
|
+
r"""Cyclotron frequency :math:`\omega_c = eB/m`.
|
|
43
|
+
|
|
44
|
+
Parameters
|
|
45
|
+
----------
|
|
46
|
+
B : float
|
|
47
|
+
Magnetic field strength.
|
|
48
|
+
m : float, default=1.0
|
|
49
|
+
Particle mass.
|
|
50
|
+
e : float, default=1.0
|
|
51
|
+
Particle charge magnitude.
|
|
52
|
+
|
|
53
|
+
Returns
|
|
54
|
+
-------
|
|
55
|
+
float
|
|
56
|
+
|
|
57
|
+
Examples
|
|
58
|
+
--------
|
|
59
|
+
>>> cyclotron_frequency(B=2.0, m=0.5)
|
|
60
|
+
4.0
|
|
61
|
+
"""
|
|
62
|
+
return e * B / m
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def magnetic_length(B: float, hbar: float = 1.0, e: float = 1.0) -> float:
|
|
66
|
+
r"""Magnetic length :math:`\ell_B = \sqrt{\hbar/(eB)}`.
|
|
67
|
+
|
|
68
|
+
The natural length scale of the lowest Landau level's cyclotron orbit.
|
|
69
|
+
|
|
70
|
+
Parameters
|
|
71
|
+
----------
|
|
72
|
+
B : float
|
|
73
|
+
Magnetic field strength.
|
|
74
|
+
hbar : float, default=1.0
|
|
75
|
+
Reduced Planck constant.
|
|
76
|
+
e : float, default=1.0
|
|
77
|
+
Particle charge magnitude.
|
|
78
|
+
|
|
79
|
+
Returns
|
|
80
|
+
-------
|
|
81
|
+
float
|
|
82
|
+
|
|
83
|
+
Examples
|
|
84
|
+
--------
|
|
85
|
+
>>> magnetic_length(B=1.0)
|
|
86
|
+
1.0
|
|
87
|
+
>>> round(magnetic_length(B=4.0), 4)
|
|
88
|
+
0.5
|
|
89
|
+
"""
|
|
90
|
+
return float(np.sqrt(hbar / (e * B)))
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def landau_level_energies(n_max: int, B: float, m: float = 1.0, e: float = 1.0, hbar: float = 1.0) -> np.ndarray:
|
|
94
|
+
r"""Landau energy levels :math:`E_n = \hbar\omega_c(n+\tfrac12)` for :math:`n=0,\dots,n_{max}`.
|
|
95
|
+
|
|
96
|
+
Parameters
|
|
97
|
+
----------
|
|
98
|
+
n_max : int
|
|
99
|
+
Highest Landau index to include.
|
|
100
|
+
B : float
|
|
101
|
+
Magnetic field strength.
|
|
102
|
+
m : float, default=1.0
|
|
103
|
+
Particle mass.
|
|
104
|
+
e : float, default=1.0
|
|
105
|
+
Particle charge magnitude.
|
|
106
|
+
hbar : float, default=1.0
|
|
107
|
+
Reduced Planck constant.
|
|
108
|
+
|
|
109
|
+
Returns
|
|
110
|
+
-------
|
|
111
|
+
ndarray, shape (n_max + 1,)
|
|
112
|
+
Equally spaced energies :math:`E_0 < E_1 < \dots < E_{n_{max}}`,
|
|
113
|
+
spacing :math:`\hbar\omega_c`.
|
|
114
|
+
|
|
115
|
+
See Also
|
|
116
|
+
--------
|
|
117
|
+
landau_degeneracy : Number of degenerate single-particle states per level.
|
|
118
|
+
|
|
119
|
+
Examples
|
|
120
|
+
--------
|
|
121
|
+
>>> landau_level_energies(n_max=2, B=1.0)
|
|
122
|
+
array([0.5, 1.5, 2.5])
|
|
123
|
+
"""
|
|
124
|
+
omega_c = cyclotron_frequency(B, m, e)
|
|
125
|
+
n = np.arange(n_max + 1)
|
|
126
|
+
return hbar * omega_c * (n + 0.5)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def landau_degeneracy(area: float, B: float, hbar: float = 1.0, e: float = 1.0) -> float:
|
|
130
|
+
r"""Number of degenerate single-particle states per Landau level.
|
|
131
|
+
|
|
132
|
+
Each Landau level holds :math:`n_B \cdot \text{area}` states, where
|
|
133
|
+
:math:`n_B = 1/(2\pi\ell_B^2) = eB/(2\pi\hbar) = B/\Phi_0` is one state
|
|
134
|
+
per flux quantum :math:`\Phi_0 = 2\pi\hbar/e` threading the sample --
|
|
135
|
+
the origin of the macroscopic degeneracy behind Landau diamagnetism.
|
|
136
|
+
|
|
137
|
+
Parameters
|
|
138
|
+
----------
|
|
139
|
+
area : float
|
|
140
|
+
Real-space sample area.
|
|
141
|
+
B : float
|
|
142
|
+
Magnetic field strength.
|
|
143
|
+
hbar : float, default=1.0
|
|
144
|
+
Reduced Planck constant.
|
|
145
|
+
e : float, default=1.0
|
|
146
|
+
Particle charge magnitude.
|
|
147
|
+
|
|
148
|
+
Returns
|
|
149
|
+
-------
|
|
150
|
+
float
|
|
151
|
+
|
|
152
|
+
Examples
|
|
153
|
+
--------
|
|
154
|
+
>>> landau_degeneracy(area=2 * np.pi, B=1.0)
|
|
155
|
+
1.0
|
|
156
|
+
"""
|
|
157
|
+
l_B = magnetic_length(B, hbar, e)
|
|
158
|
+
return float(area / (2 * np.pi * l_B**2))
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def landau_density_of_states(
|
|
162
|
+
energies,
|
|
163
|
+
B: float,
|
|
164
|
+
m: float = 1.0,
|
|
165
|
+
e: float = 1.0,
|
|
166
|
+
hbar: float = 1.0,
|
|
167
|
+
n_max: int = 20,
|
|
168
|
+
broadening: float = 0.05,
|
|
169
|
+
) -> np.ndarray:
|
|
170
|
+
r"""Disorder-broadened density of states per unit area.
|
|
171
|
+
|
|
172
|
+
Replaces each infinitely sharp level
|
|
173
|
+
:math:`n_B\,\delta(E - E_n)` with a Gaussian of width ``broadening``,
|
|
174
|
+
the standard phenomenological model for the disorder- or
|
|
175
|
+
finite-lifetime-broadened Landau levels seen in a real 2D electron gas
|
|
176
|
+
(and needed to have a finite conductivity between the exactly quantized
|
|
177
|
+
Hall plateaus).
|
|
178
|
+
|
|
179
|
+
Parameters
|
|
180
|
+
----------
|
|
181
|
+
energies : array_like
|
|
182
|
+
Energies at which to evaluate the density of states.
|
|
183
|
+
B : float
|
|
184
|
+
Magnetic field strength.
|
|
185
|
+
m : float, default=1.0
|
|
186
|
+
Particle mass.
|
|
187
|
+
e : float, default=1.0
|
|
188
|
+
Particle charge magnitude.
|
|
189
|
+
hbar : float, default=1.0
|
|
190
|
+
Reduced Planck constant.
|
|
191
|
+
n_max : int, default=20
|
|
192
|
+
Highest Landau index included in the sum.
|
|
193
|
+
broadening : float, default=0.05
|
|
194
|
+
Gaussian standard deviation of each broadened level.
|
|
195
|
+
|
|
196
|
+
Returns
|
|
197
|
+
-------
|
|
198
|
+
ndarray
|
|
199
|
+
Density of states per unit area, same shape as ``energies``.
|
|
200
|
+
|
|
201
|
+
Examples
|
|
202
|
+
--------
|
|
203
|
+
>>> dos = landau_density_of_states([0.5], B=1.0, n_max=0, broadening=0.1)
|
|
204
|
+
>>> round(float(dos[0]), 4)
|
|
205
|
+
0.6349
|
|
206
|
+
"""
|
|
207
|
+
energies = np.atleast_1d(np.asarray(energies, dtype=float))
|
|
208
|
+
E_n = landau_level_energies(n_max, B, m, e, hbar)
|
|
209
|
+
per_level = landau_degeneracy(1.0, B, hbar, e)
|
|
210
|
+
norm = 1.0 / (broadening * np.sqrt(2 * np.pi))
|
|
211
|
+
dos = np.zeros_like(energies)
|
|
212
|
+
for En in E_n:
|
|
213
|
+
dos += per_level * norm * np.exp(-0.5 * ((energies - En) / broadening) ** 2)
|
|
214
|
+
return dos
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def filling_factor(density: float, B: float, hbar: float = 1.0, e: float = 1.0) -> float:
|
|
218
|
+
r"""Landau-level filling factor :math:`\nu = n_e / n_B = n_e h/(eB)`.
|
|
219
|
+
|
|
220
|
+
The number of filled Landau levels (generally non-integer) for a 2D
|
|
221
|
+
electron density ``density``. Integer :math:`\nu` is the condition for
|
|
222
|
+
an incompressible quantum Hall plateau in
|
|
223
|
+
:mod:`physicskit.condensed.topology`.
|
|
224
|
+
|
|
225
|
+
Parameters
|
|
226
|
+
----------
|
|
227
|
+
density : float
|
|
228
|
+
2D electron number density (particles per unit area).
|
|
229
|
+
B : float
|
|
230
|
+
Magnetic field strength.
|
|
231
|
+
hbar : float, default=1.0
|
|
232
|
+
Reduced Planck constant.
|
|
233
|
+
e : float, default=1.0
|
|
234
|
+
Particle charge magnitude.
|
|
235
|
+
|
|
236
|
+
Returns
|
|
237
|
+
-------
|
|
238
|
+
float
|
|
239
|
+
|
|
240
|
+
Examples
|
|
241
|
+
--------
|
|
242
|
+
>>> round(filling_factor(density=2.0, B=1.0), 6)
|
|
243
|
+
12.566371
|
|
244
|
+
"""
|
|
245
|
+
l_B = magnetic_length(B, hbar, e)
|
|
246
|
+
return float(density * 2 * np.pi * l_B**2)
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
r"""The fractional quantum Hall effect (1982-1983): Laughlin's wavefunction.
|
|
2
|
+
|
|
3
|
+
Tsui, Stormer, and Gossard found that an ultraclean 2D electron gas in a
|
|
4
|
+
strong magnetic field develops Hall plateaus at simple fractional fillings,
|
|
5
|
+
:math:`\nu=1/3` foremost among them -- a result the single-particle Landau-
|
|
6
|
+
level picture behind the *integer* effect
|
|
7
|
+
(:mod:`physicskit.condensed.landau_levels`) cannot explain at all, since a
|
|
8
|
+
partially filled Landau level is macroscopically degenerate and gapless
|
|
9
|
+
without electron-electron interactions. Laughlin supplied the missing
|
|
10
|
+
many-body mechanism: a trial wavefunction for :math:`N` electrons confined
|
|
11
|
+
to the lowest Landau level of a disk,
|
|
12
|
+
|
|
13
|
+
.. math::
|
|
14
|
+
|
|
15
|
+
\Psi_m(z_1,\dots,z_N) = \prod_{i<j}(z_i-z_j)^m\,
|
|
16
|
+
\exp\!\left(-\sum_i \frac{|z_i|^2}{4\ell_B^2}\right), \qquad m \text{ odd},
|
|
17
|
+
|
|
18
|
+
with :math:`z_j=x_j+iy_j` (magnetic length :math:`\ell_B=1` throughout this
|
|
19
|
+
module) and filling :math:`\nu=1/m`. The prefactor's zeroes at coincident
|
|
20
|
+
particle positions are exactly what strong Coulomb repulsion demands, and
|
|
21
|
+
:math:`|\Psi_m|^2` doubles as the Boltzmann weight of a classical 2D
|
|
22
|
+
one-component plasma at an effective temperature set by :math:`m` (Laughlin's
|
|
23
|
+
"plasma analogy"), letting ordinary Metropolis Monte Carlo sample it
|
|
24
|
+
directly with no diagonalization of any kind.
|
|
25
|
+
|
|
26
|
+
The pair correlation function :math:`g(r)` extracted from those samples
|
|
27
|
+
shows the wavefunction's defining feature directly: a "correlation hole"
|
|
28
|
+
that drives :math:`g(r) \to 0` as :math:`r \to 0` -- particles actively
|
|
29
|
+
avoid each other far more strongly than Pauli exclusion alone would
|
|
30
|
+
enforce -- rising to the uncorrelated value :math:`g \approx 1` over a
|
|
31
|
+
few magnetic lengths.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
from __future__ import annotations
|
|
35
|
+
|
|
36
|
+
import numpy as np
|
|
37
|
+
from numba import njit
|
|
38
|
+
|
|
39
|
+
__all__ = ["laughlin_metropolis_sweep", "laughlin_pair_correlation", "laughlin_radial_density"]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@njit(cache=True)
|
|
43
|
+
def _delta_log_prob(z, i, z_new, m):
|
|
44
|
+
n = z.shape[0]
|
|
45
|
+
dlog = 0.0
|
|
46
|
+
for j in range(n):
|
|
47
|
+
if j == i:
|
|
48
|
+
continue
|
|
49
|
+
dlog += 2.0 * m * (np.log(np.abs(z_new - z[j])) - np.log(np.abs(z[i] - z[j])))
|
|
50
|
+
dlog += -0.5 * (np.abs(z_new) ** 2 - np.abs(z[i]) ** 2)
|
|
51
|
+
return dlog
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@njit(cache=True)
|
|
55
|
+
def laughlin_metropolis_sweep(z: np.ndarray, m: int, step: float = 1.0) -> np.ndarray:
|
|
56
|
+
r"""Perform one Metropolis sweep sampling :math:`|\Psi_m|^2`, in place.
|
|
57
|
+
|
|
58
|
+
Proposes a small random displacement of one particle at a time and
|
|
59
|
+
accepts or rejects it with the exact Metropolis ratio of
|
|
60
|
+
:math:`|\Psi_m|^2` -- Laughlin's "plasma analogy" Boltzmann weight,
|
|
61
|
+
:math:`\prod_{i<j}|z_i-z_j|^{2m}\,e^{-\sum_i|z_i|^2/2}` -- with no
|
|
62
|
+
explicit normalization needed since only the ratio between
|
|
63
|
+
configurations ever enters.
|
|
64
|
+
|
|
65
|
+
Parameters
|
|
66
|
+
----------
|
|
67
|
+
z : ndarray of shape (N,), dtype complex128
|
|
68
|
+
Particle positions :math:`z_j=x_j+iy_j`. Modified in place.
|
|
69
|
+
m : int
|
|
70
|
+
Laughlin exponent (filling :math:`\nu=1/m`); odd for fermions.
|
|
71
|
+
step : float, default=1.0
|
|
72
|
+
Maximum displacement of a trial move along each of :math:`x, y`,
|
|
73
|
+
drawn uniformly from ``[-step, step]``.
|
|
74
|
+
|
|
75
|
+
Returns
|
|
76
|
+
-------
|
|
77
|
+
ndarray of shape (N,)
|
|
78
|
+
The same array passed in.
|
|
79
|
+
|
|
80
|
+
Examples
|
|
81
|
+
--------
|
|
82
|
+
A two-particle system's Metropolis chain never proposes an *exactly*
|
|
83
|
+
coincident configuration acceptable (:math:`|\Psi_m|^2 = 0` there), so
|
|
84
|
+
repeated sweeps keep the two particles strictly apart:
|
|
85
|
+
|
|
86
|
+
>>> import numpy as np
|
|
87
|
+
>>> rng = np.random.default_rng(0)
|
|
88
|
+
>>> z = np.array([0.1 + 0.0j, -0.1 + 0.0j])
|
|
89
|
+
>>> for _ in range(200):
|
|
90
|
+
... _ = laughlin_metropolis_sweep(z, m=3, step=0.5)
|
|
91
|
+
>>> bool(np.abs(z[0] - z[1]) > 1e-3)
|
|
92
|
+
True
|
|
93
|
+
"""
|
|
94
|
+
n = z.shape[0]
|
|
95
|
+
for _ in range(n):
|
|
96
|
+
i = np.random.randint(0, n)
|
|
97
|
+
dx = (np.random.random() - 0.5) * 2.0 * step
|
|
98
|
+
dy = (np.random.random() - 0.5) * 2.0 * step
|
|
99
|
+
z_new = z[i] + dx + 1j * dy
|
|
100
|
+
dlog = _delta_log_prob(z, i, z_new, m)
|
|
101
|
+
if dlog >= 0.0 or np.random.random() < np.exp(dlog):
|
|
102
|
+
z[i] = z_new
|
|
103
|
+
return z
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@njit(cache=True)
|
|
107
|
+
def _pair_distances(z):
|
|
108
|
+
n = z.shape[0]
|
|
109
|
+
out = np.empty(n * (n - 1) // 2)
|
|
110
|
+
k = 0
|
|
111
|
+
for i in range(n):
|
|
112
|
+
for j in range(i + 1, n):
|
|
113
|
+
out[k] = np.abs(z[i] - z[j])
|
|
114
|
+
k += 1
|
|
115
|
+
return out
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def laughlin_pair_correlation(z_samples: np.ndarray, m: int, r_max: float, n_bins: int = 60) -> tuple:
|
|
119
|
+
r"""Pair correlation function :math:`g(r)` from sampled Laughlin configurations.
|
|
120
|
+
|
|
121
|
+
Bins every pairwise separation across a stack of equilibrium samples
|
|
122
|
+
(drawn with :func:`laughlin_metropolis_sweep`) and normalizes by the
|
|
123
|
+
Laughlin state's exact bulk density :math:`\rho=1/(2\pi m \ell_B^2)`,
|
|
124
|
+
so that :math:`g(r) \to 1` far from any correlation the wavefunction
|
|
125
|
+
itself imposes.
|
|
126
|
+
|
|
127
|
+
Parameters
|
|
128
|
+
----------
|
|
129
|
+
z_samples : ndarray of shape (n_samples, N), dtype complex128
|
|
130
|
+
Stack of particle-position snapshots, ideally decorrelated by
|
|
131
|
+
several sweeps between samples.
|
|
132
|
+
m : int
|
|
133
|
+
Laughlin exponent used to generate the samples.
|
|
134
|
+
r_max : float
|
|
135
|
+
Largest separation to bin, in units of :math:`\ell_B`.
|
|
136
|
+
n_bins : int, default=60
|
|
137
|
+
Number of radial bins.
|
|
138
|
+
|
|
139
|
+
Returns
|
|
140
|
+
-------
|
|
141
|
+
r : ndarray of shape (n_bins,)
|
|
142
|
+
Bin-center separations.
|
|
143
|
+
g : ndarray of shape (n_bins,)
|
|
144
|
+
Pair correlation function; ``g[0] \approx 0`` is the correlation
|
|
145
|
+
hole, ``g \to 1`` at large separation.
|
|
146
|
+
|
|
147
|
+
See Also
|
|
148
|
+
--------
|
|
149
|
+
laughlin_metropolis_sweep : Generates the equilibrium samples this function bins.
|
|
150
|
+
|
|
151
|
+
Examples
|
|
152
|
+
--------
|
|
153
|
+
>>> import numpy as np
|
|
154
|
+
>>> rng = np.random.default_rng(0)
|
|
155
|
+
>>> N, m = 12, 3
|
|
156
|
+
>>> R0 = np.sqrt(2 * m * N)
|
|
157
|
+
>>> r0 = R0 * np.sqrt(rng.random(N))
|
|
158
|
+
>>> th0 = rng.uniform(0, 2 * np.pi, N)
|
|
159
|
+
>>> z = (r0 * np.cos(th0) + 1j * r0 * np.sin(th0)).astype(np.complex128)
|
|
160
|
+
>>> for _ in range(300):
|
|
161
|
+
... _ = laughlin_metropolis_sweep(z, m=m, step=1.0)
|
|
162
|
+
>>> samples = np.array([laughlin_metropolis_sweep(z, m=m, step=1.0).copy() for _ in range(200)])
|
|
163
|
+
>>> r, g = laughlin_pair_correlation(samples, m=m, r_max=6.0, n_bins=30)
|
|
164
|
+
>>> bool(g[0] < 0.1)
|
|
165
|
+
True
|
|
166
|
+
"""
|
|
167
|
+
n = z_samples.shape[1]
|
|
168
|
+
rho = 1.0 / (2.0 * np.pi * m)
|
|
169
|
+
all_dists = np.concatenate([_pair_distances(z) for z in z_samples])
|
|
170
|
+
r_edges = np.linspace(0.0, r_max, n_bins + 1)
|
|
171
|
+
hist, _ = np.histogram(all_dists, bins=r_edges)
|
|
172
|
+
r_centers = 0.5 * (r_edges[1:] + r_edges[:-1])
|
|
173
|
+
shell_area = np.pi * (r_edges[1:] ** 2 - r_edges[:-1] ** 2)
|
|
174
|
+
n_samples = z_samples.shape[0]
|
|
175
|
+
g = 2.0 * hist / (n_samples * n * rho * shell_area)
|
|
176
|
+
return r_centers, g
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def laughlin_radial_density(z_samples: np.ndarray, r_max: float, n_bins: int = 60) -> tuple:
|
|
180
|
+
r"""Radially averaged particle density profile from sampled Laughlin configurations.
|
|
181
|
+
|
|
182
|
+
Parameters
|
|
183
|
+
----------
|
|
184
|
+
z_samples : ndarray of shape (n_samples, N), dtype complex128
|
|
185
|
+
Stack of particle-position snapshots (see :func:`laughlin_pair_correlation`).
|
|
186
|
+
r_max : float
|
|
187
|
+
Largest radius to bin, in units of :math:`\ell_B`.
|
|
188
|
+
n_bins : int, default=60
|
|
189
|
+
Number of radial bins.
|
|
190
|
+
|
|
191
|
+
Returns
|
|
192
|
+
-------
|
|
193
|
+
r : ndarray of shape (n_bins,)
|
|
194
|
+
Bin-center radii.
|
|
195
|
+
density : ndarray of shape (n_bins,)
|
|
196
|
+
Mean particle density in each annulus, in units of :math:`\ell_B^{-2}`.
|
|
197
|
+
|
|
198
|
+
Notes
|
|
199
|
+
-----
|
|
200
|
+
A large-:math:`N` Laughlin droplet is an incompressible liquid: this
|
|
201
|
+
profile is approximately flat at the bulk density
|
|
202
|
+
:math:`\rho=1/(2\pi m \ell_B^2)` out to the droplet radius, falling to
|
|
203
|
+
zero over a few magnetic lengths at the edge -- the real-space
|
|
204
|
+
counterpart of the sharp gap that makes the plateau itself possible.
|
|
205
|
+
|
|
206
|
+
Examples
|
|
207
|
+
--------
|
|
208
|
+
>>> import numpy as np
|
|
209
|
+
>>> rng = np.random.default_rng(0)
|
|
210
|
+
>>> N, m = 12, 3
|
|
211
|
+
>>> R0 = np.sqrt(2 * m * N)
|
|
212
|
+
>>> r0 = R0 * np.sqrt(rng.random(N))
|
|
213
|
+
>>> th0 = rng.uniform(0, 2 * np.pi, N)
|
|
214
|
+
>>> z = (r0 * np.cos(th0) + 1j * r0 * np.sin(th0)).astype(np.complex128)
|
|
215
|
+
>>> for _ in range(300):
|
|
216
|
+
... _ = laughlin_metropolis_sweep(z, m=m, step=1.0)
|
|
217
|
+
>>> samples = np.array([laughlin_metropolis_sweep(z, m=m, step=1.0).copy() for _ in range(200)])
|
|
218
|
+
>>> r, density = laughlin_radial_density(samples, r_max=2 * R0, n_bins=20)
|
|
219
|
+
>>> bool(density[-1] < density[2])
|
|
220
|
+
True
|
|
221
|
+
"""
|
|
222
|
+
r_edges = np.linspace(0.0, r_max, n_bins + 1)
|
|
223
|
+
all_radii = np.abs(z_samples).ravel()
|
|
224
|
+
hist, _ = np.histogram(all_radii, bins=r_edges)
|
|
225
|
+
r_centers = 0.5 * (r_edges[1:] + r_edges[:-1])
|
|
226
|
+
shell_area = np.pi * (r_edges[1:] ** 2 - r_edges[:-1] ** 2)
|
|
227
|
+
n_samples = z_samples.shape[0]
|
|
228
|
+
density = hist / (n_samples * shell_area)
|
|
229
|
+
return r_centers, density
|