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,627 @@
|
|
|
1
|
+
"""Canonical condensed-matter lattice models: SSH, graphene, Haldane, Kane-Mele, BHZ, Kitaev chain.
|
|
2
|
+
|
|
3
|
+
All 2D Bloch Hamiltonians in this module are functions of the *reduced*
|
|
4
|
+
crystal momentum ``(k1, k2)`` described in :mod:`physicskit.condensed.tight_binding`
|
|
5
|
+
(periodic gauge, each component periodic on :math:`[0, 2\\pi)`), which is the
|
|
6
|
+
convention expected by :func:`physicskit.condensed.topology.compute_chern_number`.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import numpy as np
|
|
12
|
+
|
|
13
|
+
from .tight_binding import Hamiltonian, Lattice
|
|
14
|
+
|
|
15
|
+
__all__ = [
|
|
16
|
+
"ssh_hamiltonian",
|
|
17
|
+
"ssh_lattice_hamiltonian",
|
|
18
|
+
"graphene_hamiltonian",
|
|
19
|
+
"graphene_lattice_hamiltonian",
|
|
20
|
+
"haldane_model",
|
|
21
|
+
"haldane_lattice_hamiltonian",
|
|
22
|
+
"kane_mele_hamiltonian",
|
|
23
|
+
"bhz_hamiltonian",
|
|
24
|
+
"bhz_ribbon_hamiltonian",
|
|
25
|
+
"kitaev_chain_hamiltonian",
|
|
26
|
+
"kitaev_chain_bdg_real_space",
|
|
27
|
+
"harper_hofstadter_hamiltonian",
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
_SIGMA_X = np.array([[0, 1], [1, 0]], dtype=complex)
|
|
31
|
+
_SIGMA_Y = np.array([[0, -1j], [1j, 0]], dtype=complex)
|
|
32
|
+
_SIGMA_Z = np.array([[1, 0], [0, -1]], dtype=complex)
|
|
33
|
+
_SIGMA_0 = np.eye(2, dtype=complex)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
# -- SSH ---------------------------------------------------------------------
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def ssh_hamiltonian(k: float, v: float = 1.0, w: float = 1.0) -> np.ndarray:
|
|
40
|
+
"""Bloch Hamiltonian of the Su-Schrieffer-Heeger (SSH) dimerized chain.
|
|
41
|
+
|
|
42
|
+
Parameters
|
|
43
|
+
----------
|
|
44
|
+
k : float
|
|
45
|
+
Reduced crystal momentum, periodic on :math:`[0, 2\\pi)`.
|
|
46
|
+
v : float, default=1.0
|
|
47
|
+
Intracell hopping amplitude.
|
|
48
|
+
w : float, default=1.0
|
|
49
|
+
Intercell hopping amplitude.
|
|
50
|
+
|
|
51
|
+
Returns
|
|
52
|
+
-------
|
|
53
|
+
ndarray, shape (2, 2)
|
|
54
|
+
Bloch Hamiltonian :math:`H(k) = \\begin{pmatrix}0 & v+we^{-ik}\\\\ v+we^{ik} & 0\\end{pmatrix}`.
|
|
55
|
+
|
|
56
|
+
Notes
|
|
57
|
+
-----
|
|
58
|
+
The chain is topologically nontrivial (hosts protected zero-energy edge
|
|
59
|
+
states under open boundary conditions) when :math:`v < w`, and trivial
|
|
60
|
+
when :math:`v > w`. See Also :func:`ssh_lattice_hamiltonian` for the
|
|
61
|
+
real-space builder used to expose those edge states.
|
|
62
|
+
|
|
63
|
+
Examples
|
|
64
|
+
--------
|
|
65
|
+
>>> import numpy as np
|
|
66
|
+
>>> H = ssh_hamiltonian(k=0.0, v=0.5, w=1.0)
|
|
67
|
+
>>> np.round(np.linalg.eigvalsh(H), 8)
|
|
68
|
+
array([-1.5, 1.5])
|
|
69
|
+
"""
|
|
70
|
+
f = v + w * np.exp(-1j * k)
|
|
71
|
+
return np.array([[0, f], [np.conj(f), 0]], dtype=complex)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def ssh_lattice_hamiltonian(v: float = 1.0, w: float = 1.0) -> Hamiltonian:
|
|
75
|
+
"""Build the SSH chain as a :class:`~physicskit.condensed.tight_binding.Hamiltonian`.
|
|
76
|
+
|
|
77
|
+
Parameters
|
|
78
|
+
----------
|
|
79
|
+
v : float, default=1.0
|
|
80
|
+
Intracell hopping amplitude (A-B bond within a unit cell).
|
|
81
|
+
w : float, default=1.0
|
|
82
|
+
Intercell hopping amplitude (B-A bond across the cell boundary).
|
|
83
|
+
|
|
84
|
+
Returns
|
|
85
|
+
-------
|
|
86
|
+
Hamiltonian
|
|
87
|
+
A two-orbital-per-cell chain, suitable for
|
|
88
|
+
:func:`~physicskit.condensed.tight_binding.build_ribbon` to expose
|
|
89
|
+
edge zero modes.
|
|
90
|
+
|
|
91
|
+
See Also
|
|
92
|
+
--------
|
|
93
|
+
ssh_hamiltonian : Closed-form 2x2 Bloch Hamiltonian equivalent to this builder.
|
|
94
|
+
|
|
95
|
+
Examples
|
|
96
|
+
--------
|
|
97
|
+
>>> import numpy as np
|
|
98
|
+
>>> H = ssh_lattice_hamiltonian(v=0.5, w=1.0)
|
|
99
|
+
>>> np.round(H.bands([0.0]), 8)
|
|
100
|
+
array([-1.5, 1.5])
|
|
101
|
+
"""
|
|
102
|
+
lat = Lattice(lattice_vectors=[[1.0]], orbitals=[[0.0], [0.5]], labels=["A", "B"])
|
|
103
|
+
H = Hamiltonian(lat)
|
|
104
|
+
H.add_hopping(0, 1, (0,), v)
|
|
105
|
+
H.add_hopping(1, 0, (1,), w)
|
|
106
|
+
return H
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
# -- Graphene ------------------------------------------------------------
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def graphene_lattice_hamiltonian(t: float = 1.0) -> Hamiltonian:
|
|
113
|
+
"""Nearest-neighbor honeycomb (graphene) tight-binding Hamiltonian.
|
|
114
|
+
|
|
115
|
+
Parameters
|
|
116
|
+
----------
|
|
117
|
+
t : float, default=1.0
|
|
118
|
+
Nearest-neighbor hopping amplitude.
|
|
119
|
+
|
|
120
|
+
Returns
|
|
121
|
+
-------
|
|
122
|
+
Hamiltonian
|
|
123
|
+
|
|
124
|
+
See Also
|
|
125
|
+
--------
|
|
126
|
+
graphene_hamiltonian : Closed-form 2x2 Bloch Hamiltonian equivalent to this builder.
|
|
127
|
+
"""
|
|
128
|
+
lat = Lattice.honeycomb()
|
|
129
|
+
H = Hamiltonian(lat)
|
|
130
|
+
H.add_hopping(0, 1, (0, 0), t)
|
|
131
|
+
H.add_hopping(0, 1, (-1, 0), t)
|
|
132
|
+
H.add_hopping(0, 1, (0, -1), t)
|
|
133
|
+
return H
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def graphene_hamiltonian(k1: float, k2: float, t: float = 1.0) -> np.ndarray:
|
|
137
|
+
"""Bloch Hamiltonian of nearest-neighbor graphene (honeycomb lattice).
|
|
138
|
+
|
|
139
|
+
Parameters
|
|
140
|
+
----------
|
|
141
|
+
k1, k2 : float
|
|
142
|
+
Reduced crystal momenta conjugate to the two honeycomb primitive
|
|
143
|
+
vectors, each periodic on :math:`[0, 2\\pi)`.
|
|
144
|
+
t : float, default=1.0
|
|
145
|
+
Nearest-neighbor hopping amplitude.
|
|
146
|
+
|
|
147
|
+
Returns
|
|
148
|
+
-------
|
|
149
|
+
ndarray, shape (2, 2)
|
|
150
|
+
Bloch Hamiltonian on the A/B sublattice basis.
|
|
151
|
+
|
|
152
|
+
Notes
|
|
153
|
+
-----
|
|
154
|
+
The Dirac points sit at :math:`(k_1, k_2) = (2\\pi/3, 4\\pi/3)` and its
|
|
155
|
+
time-reversed partner :math:`(4\\pi/3, 2\\pi/3)`, where the gap closes
|
|
156
|
+
and the dispersion is linear (massless Dirac cone), as verified in
|
|
157
|
+
the Examples.
|
|
158
|
+
|
|
159
|
+
Examples
|
|
160
|
+
--------
|
|
161
|
+
>>> import numpy as np
|
|
162
|
+
>>> K = np.array([2 * np.pi / 3, 4 * np.pi / 3])
|
|
163
|
+
>>> np.round(np.linalg.eigvalsh(graphene_hamiltonian(*K)), 8)
|
|
164
|
+
array([-0., 0.])
|
|
165
|
+
>>> eigs = np.linalg.eigvalsh(graphene_hamiltonian(*(K + [1e-4, 0])))
|
|
166
|
+
>>> round(float(eigs[1] / 1e-4), 4)
|
|
167
|
+
1.0
|
|
168
|
+
"""
|
|
169
|
+
return graphene_lattice_hamiltonian(t).bloch([k1, k2])
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
# -- Haldane -----------------------------------------------------------------
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def haldane_lattice_hamiltonian(t: float = 1.0, t2: float = 0.2, phi: float = np.pi / 2, M: float = 0.0) -> Hamiltonian:
|
|
176
|
+
"""Haldane model (quantum anomalous Hall) as a :class:`Hamiltonian`.
|
|
177
|
+
|
|
178
|
+
Parameters
|
|
179
|
+
----------
|
|
180
|
+
t : float, default=1.0
|
|
181
|
+
Nearest-neighbor hopping amplitude.
|
|
182
|
+
t2 : float, default=0.2
|
|
183
|
+
Next-nearest-neighbor hopping magnitude.
|
|
184
|
+
phi : float, default=pi/2
|
|
185
|
+
Next-nearest-neighbor hopping phase, breaking time-reversal symmetry.
|
|
186
|
+
M : float, default=0.0
|
|
187
|
+
Sublattice (Semenoff) mass, breaking inversion symmetry.
|
|
188
|
+
|
|
189
|
+
Returns
|
|
190
|
+
-------
|
|
191
|
+
Hamiltonian
|
|
192
|
+
|
|
193
|
+
See Also
|
|
194
|
+
--------
|
|
195
|
+
haldane_model : Closed-form 2x2 Bloch Hamiltonian equivalent to this builder.
|
|
196
|
+
"""
|
|
197
|
+
lat = Lattice.honeycomb()
|
|
198
|
+
H = Hamiltonian(lat, onsite=[-M, M])
|
|
199
|
+
H.add_hopping(0, 1, (0, 0), t)
|
|
200
|
+
H.add_hopping(0, 1, (-1, 0), t)
|
|
201
|
+
H.add_hopping(0, 1, (0, -1), t)
|
|
202
|
+
t2c = t2 * np.exp(1j * phi)
|
|
203
|
+
for R in [(1, 0), (0, -1), (-1, 1)]:
|
|
204
|
+
H.add_hopping(0, 0, R, t2c)
|
|
205
|
+
H.add_hopping(1, 1, R, np.conj(t2c))
|
|
206
|
+
return H
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def haldane_model(kx: float, ky: float, t: float = 1.0, t2: float = 0.2, phi: float = np.pi / 2, M: float = 0.0) -> np.ndarray:
|
|
210
|
+
"""Bloch Hamiltonian of the Haldane model on the honeycomb lattice.
|
|
211
|
+
|
|
212
|
+
The Haldane model realizes the quantum anomalous Hall effect: a Chern
|
|
213
|
+
insulator with zero *net* magnetic flux per unit cell, arising from a
|
|
214
|
+
complex next-nearest-neighbor hopping :math:`t_2 e^{i\\phi}` that breaks
|
|
215
|
+
time-reversal symmetry while preserving the lattice translational symmetry.
|
|
216
|
+
|
|
217
|
+
Parameters
|
|
218
|
+
----------
|
|
219
|
+
kx, ky : float
|
|
220
|
+
Reduced crystal momenta (see :mod:`physicskit.condensed.tight_binding`),
|
|
221
|
+
each periodic on :math:`[0, 2\\pi)`.
|
|
222
|
+
t : float, default=1.0
|
|
223
|
+
Nearest-neighbor hopping amplitude.
|
|
224
|
+
t2 : float, default=0.2
|
|
225
|
+
Next-nearest-neighbor hopping magnitude.
|
|
226
|
+
phi : float, default=pi/2
|
|
227
|
+
Next-nearest-neighbor hopping phase.
|
|
228
|
+
M : float, default=0.0
|
|
229
|
+
Sublattice mass. The model is a Chern insulator
|
|
230
|
+
(:math:`C = \\mathrm{sgn}(\\sin\\phi)`) for :math:`|M| < 3\\sqrt{3}\\,t_2|\\sin\\phi|`,
|
|
231
|
+
and a trivial insulator otherwise.
|
|
232
|
+
|
|
233
|
+
Returns
|
|
234
|
+
-------
|
|
235
|
+
ndarray, shape (2, 2)
|
|
236
|
+
|
|
237
|
+
See Also
|
|
238
|
+
--------
|
|
239
|
+
physicskit.condensed.topology.compute_chern_number : Computes the Chern number of this model.
|
|
240
|
+
|
|
241
|
+
Examples
|
|
242
|
+
--------
|
|
243
|
+
>>> import numpy as np
|
|
244
|
+
>>> from physicskit.condensed.topology import compute_chern_number
|
|
245
|
+
>>> H_func = lambda k1, k2: haldane_model(k1, k2, t=1.0, t2=0.2, phi=np.pi / 2, M=0.0)
|
|
246
|
+
>>> compute_chern_number(H_func, grid_size=30)
|
|
247
|
+
[1, -1]
|
|
248
|
+
>>> H_trivial = lambda k1, k2: haldane_model(k1, k2, t=1.0, t2=0.2, phi=np.pi / 2, M=2.0)
|
|
249
|
+
>>> compute_chern_number(H_trivial, grid_size=30)
|
|
250
|
+
[0, 0]
|
|
251
|
+
"""
|
|
252
|
+
return haldane_lattice_hamiltonian(t, t2, phi, M).bloch([kx, ky])
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
# -- Kane-Mele -----------------------------------------------------------
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def kane_mele_hamiltonian(
|
|
259
|
+
kx: float,
|
|
260
|
+
ky: float,
|
|
261
|
+
t: float = 1.0,
|
|
262
|
+
lambda_so: float = 0.06,
|
|
263
|
+
lambda_v: float = 0.0,
|
|
264
|
+
lambda_r: float = 0.0,
|
|
265
|
+
) -> np.ndarray:
|
|
266
|
+
"""Bloch Hamiltonian of the Kane-Mele quantum spin Hall model.
|
|
267
|
+
|
|
268
|
+
Two time-reversed Haldane copies (intrinsic spin-orbit coupling with
|
|
269
|
+
opposite Chern-number-generating phase for each spin), realizing a
|
|
270
|
+
:math:`\\mathbb{Z}_2` topological insulator with helical edge states.
|
|
271
|
+
Basis order is ``(A up, B up, A down, B down)``.
|
|
272
|
+
|
|
273
|
+
Parameters
|
|
274
|
+
----------
|
|
275
|
+
kx, ky : float
|
|
276
|
+
Reduced crystal momenta, each periodic on :math:`[0, 2\\pi)`.
|
|
277
|
+
t : float, default=1.0
|
|
278
|
+
Nearest-neighbor hopping amplitude.
|
|
279
|
+
lambda_so : float, default=0.06
|
|
280
|
+
Intrinsic spin-orbit coupling strength.
|
|
281
|
+
lambda_v : float, default=0.0
|
|
282
|
+
Sublattice (staggered) potential.
|
|
283
|
+
lambda_r : float, default=0.0
|
|
284
|
+
Rashba spin-orbit coupling strength. A nonzero value mixes the spin
|
|
285
|
+
blocks (breaking :math:`s_z` conservation) but preserves overall
|
|
286
|
+
time-reversal symmetry.
|
|
287
|
+
|
|
288
|
+
Returns
|
|
289
|
+
-------
|
|
290
|
+
ndarray, shape (4, 4)
|
|
291
|
+
|
|
292
|
+
Notes
|
|
293
|
+
-----
|
|
294
|
+
When ``lambda_r == 0``, :math:`s_z` is conserved and the Hamiltonian is
|
|
295
|
+
block-diagonal in spin; each block is a Haldane model with
|
|
296
|
+
:math:`t_2 = \\lambda_{so}`, :math:`\\phi = \\pm\\pi/2`. In that case the
|
|
297
|
+
:math:`\\mathbb{Z}_2` invariant equals the spin-up Chern number modulo 2
|
|
298
|
+
(see :func:`physicskit.condensed.topology.z2_invariant`).
|
|
299
|
+
|
|
300
|
+
Examples
|
|
301
|
+
--------
|
|
302
|
+
>>> import numpy as np
|
|
303
|
+
>>> H = kane_mele_hamiltonian(0.3, 0.7, lambda_so=0.06)
|
|
304
|
+
>>> np.allclose(H, H.conj().T)
|
|
305
|
+
True
|
|
306
|
+
>>> up = H[:2, :2]; down = H[2:, 2:]
|
|
307
|
+
>>> down_expected = kane_mele_hamiltonian(0.3, 0.7, lambda_so=0.06)[2:, 2:]
|
|
308
|
+
>>> np.allclose(down, down_expected)
|
|
309
|
+
True
|
|
310
|
+
"""
|
|
311
|
+
H_up = haldane_lattice_hamiltonian(t=t, t2=lambda_so, phi=np.pi / 2, M=lambda_v).bloch([kx, ky])
|
|
312
|
+
H_down = haldane_lattice_hamiltonian(t=t, t2=lambda_so, phi=-np.pi / 2, M=lambda_v).bloch([kx, ky])
|
|
313
|
+
H = np.zeros((4, 4), dtype=complex)
|
|
314
|
+
H[:2, :2] = H_up
|
|
315
|
+
H[2:, 2:] = H_down
|
|
316
|
+
|
|
317
|
+
if lambda_r != 0.0:
|
|
318
|
+
lat = Lattice.honeycomb()
|
|
319
|
+
orb_cart = lat.cartesian_orbitals()
|
|
320
|
+
bond_R = [(0, 0), (-1, 0), (0, -1)]
|
|
321
|
+
bond_vecs = []
|
|
322
|
+
for R in bond_R:
|
|
323
|
+
Rcart = np.array(R, dtype=float) @ lat.lattice_vectors
|
|
324
|
+
bond_vecs.append(orb_cart[1] + Rcart - orb_cart[0])
|
|
325
|
+
R_block = np.zeros((2, 2), dtype=complex)
|
|
326
|
+
for R, d in zip(bond_R, bond_vecs, strict=True):
|
|
327
|
+
d_hat = d / np.linalg.norm(d)
|
|
328
|
+
spin_mat = 1j * lambda_r * (_SIGMA_X * d_hat[1] - _SIGMA_Y * d_hat[0])
|
|
329
|
+
phase = np.exp(1j * (kx * R[0] + ky * R[1]))
|
|
330
|
+
R_block += spin_mat * phase
|
|
331
|
+
# Off-diagonal sublattice block (A up/down <-> B up/down), spin-mixing Rashba term.
|
|
332
|
+
H_AB = np.zeros((2, 2), dtype=complex)
|
|
333
|
+
H_AB[0, 0] = R_block[0, 0]
|
|
334
|
+
H_AB[1, 1] = R_block[1, 1]
|
|
335
|
+
H_AB[0, 1] = R_block[0, 1]
|
|
336
|
+
H_AB[1, 0] = R_block[1, 0]
|
|
337
|
+
H[0, 2] += H_AB[0, 0]
|
|
338
|
+
H[1, 3] += H_AB[1, 1]
|
|
339
|
+
H[0, 3] += H_AB[0, 1]
|
|
340
|
+
H[1, 2] += H_AB[1, 0]
|
|
341
|
+
H[2, 0] += np.conj(H_AB[0, 0])
|
|
342
|
+
H[3, 1] += np.conj(H_AB[1, 1])
|
|
343
|
+
H[3, 0] += np.conj(H_AB[0, 1])
|
|
344
|
+
H[2, 1] += np.conj(H_AB[1, 0])
|
|
345
|
+
return H
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
# -- BHZ -----------------------------------------------------------------
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
def bhz_hamiltonian(kx: float, ky: float, A: float = 1.0, B: float = 1.0, M: float = 1.0, D: float = 0.0) -> np.ndarray:
|
|
352
|
+
"""Bloch Hamiltonian of the Bernevig-Hughes-Zhang (BHZ) model for HgTe quantum wells.
|
|
353
|
+
|
|
354
|
+
A minimal 4-band :math:`\\mathbb{Z}_2` topological insulator model,
|
|
355
|
+
block-diagonal in a time-reversed pair of 2x2 Dirac-like blocks. Basis
|
|
356
|
+
order is ``(E up, H up, E down, H down)``.
|
|
357
|
+
|
|
358
|
+
Parameters
|
|
359
|
+
----------
|
|
360
|
+
kx, ky : float
|
|
361
|
+
Reduced crystal momenta, each periodic on :math:`[0, 2\\pi)`.
|
|
362
|
+
A, B : float, default=1.0
|
|
363
|
+
Model parameters controlling the Dirac velocity and quadratic
|
|
364
|
+
band curvature.
|
|
365
|
+
M : float, default=1.0
|
|
366
|
+
Band inversion mass. The model is topological (band-inverted) for
|
|
367
|
+
:math:`M/B > 0` and trivial for :math:`M/B < 0`.
|
|
368
|
+
D : float, default=0.0
|
|
369
|
+
Particle-hole asymmetry parameter.
|
|
370
|
+
|
|
371
|
+
Returns
|
|
372
|
+
-------
|
|
373
|
+
ndarray, shape (4, 4)
|
|
374
|
+
|
|
375
|
+
Examples
|
|
376
|
+
--------
|
|
377
|
+
>>> import numpy as np
|
|
378
|
+
>>> H = bhz_hamiltonian(0.1, -0.2, M=1.0, B=1.0)
|
|
379
|
+
>>> np.allclose(H, H.conj().T)
|
|
380
|
+
True
|
|
381
|
+
>>> np.allclose(H[:2, :2], H[2:, 2:].conj())
|
|
382
|
+
True
|
|
383
|
+
"""
|
|
384
|
+
eps = -D * (2 - np.cos(kx) - np.cos(ky))
|
|
385
|
+
dx = A * np.sin(kx)
|
|
386
|
+
dy = A * np.sin(ky)
|
|
387
|
+
dz = M - 2 * B * (2 - np.cos(kx) - np.cos(ky))
|
|
388
|
+
h_up = eps * _SIGMA_0 + dx * _SIGMA_X + dy * _SIGMA_Y + dz * _SIGMA_Z
|
|
389
|
+
h_down = np.conj(h_up)
|
|
390
|
+
H = np.zeros((4, 4), dtype=complex)
|
|
391
|
+
H[:2, :2] = h_up
|
|
392
|
+
H[2:, 2:] = h_down
|
|
393
|
+
return H
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
def bhz_ribbon_hamiltonian(kx: float, n_cells: int, A: float = 1.0, B: float = 1.0, M: float = 1.0, D: float = 0.0) -> np.ndarray:
|
|
397
|
+
"""Real-space BHZ ribbon: periodic along ``x``, open (finite) along ``y``.
|
|
398
|
+
|
|
399
|
+
Truncating the ``y`` direction exposes the pair of helical, spin-locked
|
|
400
|
+
edge states that make the BHZ model a quantum spin Hall insulator --
|
|
401
|
+
the effect Konig et al. (2007) measured directly in HgTe/CdTe quantum
|
|
402
|
+
wells, by two-terminal conductance quantized at :math:`2e^2/h`.
|
|
403
|
+
|
|
404
|
+
Parameters
|
|
405
|
+
----------
|
|
406
|
+
kx : float
|
|
407
|
+
Reduced crystal momentum along the periodic (``x``) direction.
|
|
408
|
+
n_cells : int
|
|
409
|
+
Number of unit cells stacked along the open (``y``) direction.
|
|
410
|
+
A, B : float, default=1.0
|
|
411
|
+
Model parameters controlling the Dirac velocity and quadratic
|
|
412
|
+
band curvature (see :func:`bhz_hamiltonian`).
|
|
413
|
+
M : float, default=1.0
|
|
414
|
+
Band inversion mass. Topological (edge-state-carrying) for
|
|
415
|
+
:math:`M/B > 0`.
|
|
416
|
+
D : float, default=0.0
|
|
417
|
+
Particle-hole asymmetry parameter.
|
|
418
|
+
|
|
419
|
+
Returns
|
|
420
|
+
-------
|
|
421
|
+
ndarray, shape (4 * n_cells, 4 * n_cells)
|
|
422
|
+
Hermitian, open-boundary ribbon Hamiltonian, block-diagonal in the
|
|
423
|
+
``(E up, H up)`` / ``(E down, H down)`` time-reversed sectors.
|
|
424
|
+
|
|
425
|
+
Examples
|
|
426
|
+
--------
|
|
427
|
+
In the topological regime (:math:`M/B > 0`), the ribbon has a pair of
|
|
428
|
+
near-zero-energy states crossing at :math:`k_x = 0` -- the helical edge
|
|
429
|
+
modes -- absent in the trivial regime (:math:`M/B < 0`):
|
|
430
|
+
|
|
431
|
+
>>> import numpy as np
|
|
432
|
+
>>> spectrum = np.linalg.eigvalsh(bhz_ribbon_hamiltonian(kx=0.0, n_cells=40, M=1.0, B=1.0))
|
|
433
|
+
>>> bool(np.any(np.abs(spectrum) < 1e-6))
|
|
434
|
+
True
|
|
435
|
+
>>> spectrum_trivial = np.linalg.eigvalsh(bhz_ribbon_hamiltonian(kx=0.0, n_cells=40, M=-1.0, B=1.0))
|
|
436
|
+
>>> bool(np.any(np.abs(spectrum_trivial) < 1e-6))
|
|
437
|
+
False
|
|
438
|
+
"""
|
|
439
|
+
eps0 = -D * (2 - np.cos(kx))
|
|
440
|
+
dx = A * np.sin(kx)
|
|
441
|
+
dz0 = M - 2 * B * (2 - np.cos(kx))
|
|
442
|
+
onsite_up = eps0 * _SIGMA_0 + dx * _SIGMA_X + dz0 * _SIGMA_Z
|
|
443
|
+
onsite_down = onsite_up
|
|
444
|
+
hop_up = 0.5 * (D * _SIGMA_0 + 2 * B * _SIGMA_Z) - 0.5j * A * _SIGMA_Y
|
|
445
|
+
hop_down = hop_up.conj().T
|
|
446
|
+
|
|
447
|
+
N = n_cells
|
|
448
|
+
H = np.zeros((4 * N, 4 * N), dtype=complex)
|
|
449
|
+
for c in range(N):
|
|
450
|
+
H[4 * c : 4 * c + 2, 4 * c : 4 * c + 2] = onsite_up
|
|
451
|
+
H[4 * c + 2 : 4 * c + 4, 4 * c + 2 : 4 * c + 4] = onsite_down
|
|
452
|
+
for c in range(N - 1):
|
|
453
|
+
H[4 * c : 4 * c + 2, 4 * c + 4 : 4 * c + 6] = hop_up
|
|
454
|
+
H[4 * c + 4 : 4 * c + 6, 4 * c : 4 * c + 2] = hop_up.conj().T
|
|
455
|
+
H[4 * c + 2 : 4 * c + 4, 4 * c + 6 : 4 * c + 8] = hop_down
|
|
456
|
+
H[4 * c + 6 : 4 * c + 8, 4 * c + 2 : 4 * c + 4] = hop_down.conj().T
|
|
457
|
+
return H
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
# -- Kitaev chain --------------------------------------------------------
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
def kitaev_chain_hamiltonian(k: float, mu: float = 0.0, t: float = 1.0, delta: float = 1.0) -> np.ndarray:
|
|
464
|
+
"""Bogoliubov-de Gennes Bloch Hamiltonian of the Kitaev p-wave superconducting chain.
|
|
465
|
+
|
|
466
|
+
Parameters
|
|
467
|
+
----------
|
|
468
|
+
k : float
|
|
469
|
+
Reduced crystal momentum, periodic on :math:`[0, 2\\pi)`.
|
|
470
|
+
mu : float, default=0.0
|
|
471
|
+
Chemical potential.
|
|
472
|
+
t : float, default=1.0
|
|
473
|
+
Nearest-neighbor hopping amplitude.
|
|
474
|
+
delta : float, default=1.0
|
|
475
|
+
p-wave pairing amplitude.
|
|
476
|
+
|
|
477
|
+
Returns
|
|
478
|
+
-------
|
|
479
|
+
ndarray, shape (2, 2)
|
|
480
|
+
BdG Hamiltonian :math:`H(k) = \\xi(k)\\tau_z + \\Delta(k)\\tau_y` in the
|
|
481
|
+
Nambu basis, with :math:`\\xi(k) = -2t\\cos k - \\mu` and
|
|
482
|
+
:math:`\\Delta(k) = 2\\Delta\\sin k`.
|
|
483
|
+
|
|
484
|
+
Notes
|
|
485
|
+
-----
|
|
486
|
+
The chain is a topological superconductor, hosting unpaired Majorana
|
|
487
|
+
zero modes at the ends of an open chain, for :math:`|\\mu| < 2t`; it is
|
|
488
|
+
topologically trivial for :math:`|\\mu| > 2t`.
|
|
489
|
+
|
|
490
|
+
Examples
|
|
491
|
+
--------
|
|
492
|
+
>>> import numpy as np
|
|
493
|
+
>>> H = kitaev_chain_hamiltonian(k=np.pi / 2, mu=0.0, t=1.0, delta=1.0)
|
|
494
|
+
>>> np.round(np.linalg.eigvalsh(H), 8)
|
|
495
|
+
array([-2., 2.])
|
|
496
|
+
"""
|
|
497
|
+
xi = -2 * t * np.cos(k) - mu
|
|
498
|
+
d = 2 * delta * np.sin(k)
|
|
499
|
+
return xi * _SIGMA_Z + d * _SIGMA_Y
|
|
500
|
+
|
|
501
|
+
|
|
502
|
+
def kitaev_chain_bdg_real_space(n_sites: int, mu: float = 0.0, t: float = 1.0, delta: float = 1.0) -> np.ndarray:
|
|
503
|
+
"""Real-space open-boundary BdG Hamiltonian of the Kitaev chain.
|
|
504
|
+
|
|
505
|
+
Parameters
|
|
506
|
+
----------
|
|
507
|
+
n_sites : int
|
|
508
|
+
Number of lattice sites in the finite, open chain.
|
|
509
|
+
mu : float, default=0.0
|
|
510
|
+
Chemical potential.
|
|
511
|
+
t : float, default=1.0
|
|
512
|
+
Nearest-neighbor hopping amplitude.
|
|
513
|
+
delta : float, default=1.0
|
|
514
|
+
p-wave pairing amplitude.
|
|
515
|
+
|
|
516
|
+
Returns
|
|
517
|
+
-------
|
|
518
|
+
ndarray, shape (2*n_sites, 2*n_sites)
|
|
519
|
+
BdG Hamiltonian in the Nambu basis
|
|
520
|
+
:math:`(c_1, \\dots, c_N, c_1^\\dagger, \\dots, c_N^\\dagger)`.
|
|
521
|
+
|
|
522
|
+
Examples
|
|
523
|
+
--------
|
|
524
|
+
In the topological phase (:math:`|\\mu| < 2t`), diagonalizing this matrix
|
|
525
|
+
yields a pair of near-zero-energy eigenvalues (Majorana end modes),
|
|
526
|
+
exponentially localized at the two ends of the chain:
|
|
527
|
+
|
|
528
|
+
>>> import numpy as np
|
|
529
|
+
>>> H = kitaev_chain_bdg_real_space(n_sites=60, mu=0.0, t=1.0, delta=1.0)
|
|
530
|
+
>>> eigs = np.linalg.eigvalsh(H)
|
|
531
|
+
>>> bool(np.abs(eigs[np.argmin(np.abs(eigs))]) < 1e-6)
|
|
532
|
+
True
|
|
533
|
+
"""
|
|
534
|
+
N = n_sites
|
|
535
|
+
H = np.zeros((2 * N, 2 * N), dtype=complex)
|
|
536
|
+
for i in range(N):
|
|
537
|
+
H[i, i] = -mu
|
|
538
|
+
H[N + i, N + i] = mu
|
|
539
|
+
for i in range(N - 1):
|
|
540
|
+
H[i, i + 1] += -t
|
|
541
|
+
H[i + 1, i] += -t
|
|
542
|
+
H[N + i, N + i + 1] += t
|
|
543
|
+
H[N + i + 1, N + i] += t
|
|
544
|
+
H[i, N + i + 1] += delta
|
|
545
|
+
H[N + i + 1, i] += np.conj(delta)
|
|
546
|
+
H[i + 1, N + i] += -delta
|
|
547
|
+
H[N + i, i + 1] += -np.conj(delta)
|
|
548
|
+
return H
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
# -- Harper-Hofstadter --------------------------------------------------------
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
def harper_hofstadter_hamiltonian(k1: float, k2: float, p: int, q: int, t: float = 1.0) -> np.ndarray:
|
|
555
|
+
r"""Bloch Hamiltonian of the square-lattice Harper-Hofstadter model at flux ``p/q``.
|
|
556
|
+
|
|
557
|
+
A charged particle on a square lattice threaded by a uniform magnetic
|
|
558
|
+
flux :math:`p/q` (in units of the flux quantum) per plaquette, in
|
|
559
|
+
Landau gauge :math:`\mathbf{A} = (0, Bx)`. Translational symmetry along
|
|
560
|
+
``x`` survives only in steps of ``q`` lattice constants, so the ``q``
|
|
561
|
+
inequivalent sublattice sites ``m = 0, ..., q-1`` within one magnetic
|
|
562
|
+
unit cell become an internal band index, coupled by
|
|
563
|
+
|
|
564
|
+
.. math::
|
|
565
|
+
|
|
566
|
+
H_{mm}(k_1, k_2) = -2t\cos\!\left(k_2 + 2\pi \frac{p}{q} m\right), \qquad
|
|
567
|
+
H_{m, m+1} = -t,
|
|
568
|
+
|
|
569
|
+
plus the boundary hopping :math:`H_{q-1, 0} = -t\,e^{ik_1}` that closes
|
|
570
|
+
the magnetic unit cell, with :math:`k_1` the reduced momentum conjugate
|
|
571
|
+
to translation by one magnetic cell (period :math:`q` sites) and
|
|
572
|
+
:math:`k_2` the ordinary reduced momentum along the unbroken direction.
|
|
573
|
+
This is the lattice (Bloch) route to the same physics as
|
|
574
|
+
:mod:`physicskit.condensed.landau_levels`, and, fed one band at a time
|
|
575
|
+
into :func:`~physicskit.condensed.topology.compute_chern_number`, the
|
|
576
|
+
standard numerical verification of the TKNN integer quantum Hall
|
|
577
|
+
formula: summing the Chern numbers of the lowest :math:`r` (non-touching)
|
|
578
|
+
bands gives the exactly quantized Hall conductance
|
|
579
|
+
:math:`\sigma_{xy} = C\,e^2/h` at the filling between band :math:`r` and
|
|
580
|
+
:math:`r+1`.
|
|
581
|
+
|
|
582
|
+
Parameters
|
|
583
|
+
----------
|
|
584
|
+
k1, k2 : float
|
|
585
|
+
Reduced crystal momenta, each periodic on :math:`[0, 2\pi)`. ``k1``
|
|
586
|
+
is conjugate to the enlarged (``q``-site) magnetic unit cell.
|
|
587
|
+
p, q : int
|
|
588
|
+
Flux per plaquette :math:`p/q` (in lowest terms), :math:`0 < p < q`.
|
|
589
|
+
Odd ``q`` avoids the exact band touchings that occur for some even
|
|
590
|
+
``q``, where individual-band Chern numbers become ill-defined.
|
|
591
|
+
t : float, default=1.0
|
|
592
|
+
Nearest-neighbor hopping amplitude.
|
|
593
|
+
|
|
594
|
+
Returns
|
|
595
|
+
-------
|
|
596
|
+
ndarray, shape (q, q)
|
|
597
|
+
Hermitian Bloch Hamiltonian.
|
|
598
|
+
|
|
599
|
+
See Also
|
|
600
|
+
--------
|
|
601
|
+
physicskit.condensed.topology.compute_chern_number : Chern number of each resulting band.
|
|
602
|
+
|
|
603
|
+
Examples
|
|
604
|
+
--------
|
|
605
|
+
At flux ``1/3`` the three bands carry Chern numbers ``-1, 2, -1``
|
|
606
|
+
(summing to zero, as any complete set of bands of a lattice Hamiltonian
|
|
607
|
+
must), so the Hall conductance is quantized to :math:`-1` and :math:`+1`
|
|
608
|
+
(in units of :math:`e^2/h`) at the two gaps:
|
|
609
|
+
|
|
610
|
+
>>> import numpy as np
|
|
611
|
+
>>> from physicskit.condensed.topology import compute_chern_number
|
|
612
|
+
>>> H_func = lambda k1, k2: harper_hofstadter_hamiltonian(k1, k2, p=1, q=3)
|
|
613
|
+
>>> chern_numbers = compute_chern_number(H_func, grid_size=30)
|
|
614
|
+
>>> chern_numbers
|
|
615
|
+
[-1, 2, -1]
|
|
616
|
+
>>> sum(chern_numbers)
|
|
617
|
+
0
|
|
618
|
+
"""
|
|
619
|
+
H = np.zeros((q, q), dtype=complex)
|
|
620
|
+
m = np.arange(q)
|
|
621
|
+
H[np.diag_indices(q)] = -2 * t * np.cos(k2 + 2 * np.pi * p * m / q)
|
|
622
|
+
for i in range(q - 1):
|
|
623
|
+
H[i, i + 1] = -t
|
|
624
|
+
H[i + 1, i] = -t
|
|
625
|
+
H[q - 1, 0] += -t * np.exp(1j * k1)
|
|
626
|
+
H[0, q - 1] += -t * np.exp(-1j * k1)
|
|
627
|
+
return H
|
|
File without changes
|