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,124 @@
|
|
|
1
|
+
"""physicskit.optics: classical and quantum optics -- rays, waves, Gaussian beams, and quantized light.
|
|
2
|
+
|
|
3
|
+
Typical usage::
|
|
4
|
+
|
|
5
|
+
import physicskit as pk
|
|
6
|
+
import numpy as np
|
|
7
|
+
|
|
8
|
+
beam = pk.optics.GaussianBeam(wavelength=1.064e-3, w0=0.05)
|
|
9
|
+
system = pk.optics.OpticalSystem([
|
|
10
|
+
pk.optics.OpticalElement(pk.optics.free_space(1.0), length=1.0),
|
|
11
|
+
pk.optics.OpticalElement(pk.optics.thin_lens(0.5)),
|
|
12
|
+
])
|
|
13
|
+
q_out = pk.optics.propagate_q(beam.q_parameter(0.0), system.system_matrix())
|
|
14
|
+
|
|
15
|
+
- :mod:`physicskit.optics.ray` -- geometric ray optics and ABCD matrices:
|
|
16
|
+
free space, thin/thick lenses, curved and flat interfaces, spherical
|
|
17
|
+
mirrors, GRIN media, cascaded optical systems, and laser-cavity
|
|
18
|
+
stability.
|
|
19
|
+
- :mod:`physicskit.optics.wave` -- scalar wave optics: circular/slit
|
|
20
|
+
apertures and Fraunhofer, Fresnel, and angular-spectrum diffraction.
|
|
21
|
+
- :mod:`physicskit.optics.gaussian` -- Gaussian beam propagation via the
|
|
22
|
+
complex beam parameter :math:`q`, Hermite-Gaussian and Laguerre-Gaussian
|
|
23
|
+
higher-order modes, and :math:`M^2` beam-quality propagation.
|
|
24
|
+
- :mod:`physicskit.optics.quantum_optics` -- quantum optical states (Fock,
|
|
25
|
+
coherent, squeezed) in a truncated photon-number basis, Wigner
|
|
26
|
+
quasi-probability distributions, and the Jaynes-Cummings model of a
|
|
27
|
+
two-level atom coupled to a quantized cavity mode.
|
|
28
|
+
- :mod:`physicskit.optics.visualizers` -- ray-trace, beam-envelope,
|
|
29
|
+
diffraction-pattern, and interactive Wigner-surface plots.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
from physicskit.optics.gaussian import (
|
|
33
|
+
GaussianBeam,
|
|
34
|
+
hermite_gaussian_mode,
|
|
35
|
+
laguerre_gaussian_mode,
|
|
36
|
+
m2_beam_waist,
|
|
37
|
+
propagate_q,
|
|
38
|
+
q_to_beam_params,
|
|
39
|
+
)
|
|
40
|
+
from physicskit.optics.quantum_optics import (
|
|
41
|
+
JaynesCummingsModel,
|
|
42
|
+
coherent_state,
|
|
43
|
+
compute_wigner_function,
|
|
44
|
+
fock_state,
|
|
45
|
+
squeezed_state,
|
|
46
|
+
wigner_negativity,
|
|
47
|
+
)
|
|
48
|
+
from physicskit.optics.ray import (
|
|
49
|
+
OpticalElement,
|
|
50
|
+
OpticalSystem,
|
|
51
|
+
cavity_round_trip_matrix,
|
|
52
|
+
cavity_stability,
|
|
53
|
+
curved_interface,
|
|
54
|
+
flat_interface,
|
|
55
|
+
free_space,
|
|
56
|
+
grin_medium,
|
|
57
|
+
spherical_mirror,
|
|
58
|
+
thick_lens,
|
|
59
|
+
thin_lens,
|
|
60
|
+
)
|
|
61
|
+
from physicskit.optics.visualizers import (
|
|
62
|
+
animate_diffraction_propagation,
|
|
63
|
+
interactive_wigner_surface,
|
|
64
|
+
plot_beam_envelope,
|
|
65
|
+
plot_diffraction_pattern,
|
|
66
|
+
plot_ray_trace,
|
|
67
|
+
)
|
|
68
|
+
from physicskit.optics.wave import (
|
|
69
|
+
angular_spectrum_propagate,
|
|
70
|
+
circular_aperture,
|
|
71
|
+
double_slit_aperture,
|
|
72
|
+
field_grid,
|
|
73
|
+
fraunhofer_diffraction,
|
|
74
|
+
fresnel_diffraction,
|
|
75
|
+
intensity,
|
|
76
|
+
single_slit_aperture,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
__version__ = "0.1.0"
|
|
80
|
+
|
|
81
|
+
__all__ = [
|
|
82
|
+
"__version__",
|
|
83
|
+
# ray
|
|
84
|
+
"free_space",
|
|
85
|
+
"thin_lens",
|
|
86
|
+
"flat_interface",
|
|
87
|
+
"curved_interface",
|
|
88
|
+
"thick_lens",
|
|
89
|
+
"spherical_mirror",
|
|
90
|
+
"grin_medium",
|
|
91
|
+
"OpticalElement",
|
|
92
|
+
"OpticalSystem",
|
|
93
|
+
"cavity_round_trip_matrix",
|
|
94
|
+
"cavity_stability",
|
|
95
|
+
# wave
|
|
96
|
+
"circular_aperture",
|
|
97
|
+
"single_slit_aperture",
|
|
98
|
+
"double_slit_aperture",
|
|
99
|
+
"fraunhofer_diffraction",
|
|
100
|
+
"fresnel_diffraction",
|
|
101
|
+
"angular_spectrum_propagate",
|
|
102
|
+
"intensity",
|
|
103
|
+
"field_grid",
|
|
104
|
+
# gaussian
|
|
105
|
+
"propagate_q",
|
|
106
|
+
"q_to_beam_params",
|
|
107
|
+
"GaussianBeam",
|
|
108
|
+
"hermite_gaussian_mode",
|
|
109
|
+
"laguerre_gaussian_mode",
|
|
110
|
+
"m2_beam_waist",
|
|
111
|
+
# quantum_optics
|
|
112
|
+
"fock_state",
|
|
113
|
+
"coherent_state",
|
|
114
|
+
"squeezed_state",
|
|
115
|
+
"compute_wigner_function",
|
|
116
|
+
"wigner_negativity",
|
|
117
|
+
"JaynesCummingsModel",
|
|
118
|
+
# visualizers
|
|
119
|
+
"plot_ray_trace",
|
|
120
|
+
"plot_beam_envelope",
|
|
121
|
+
"plot_diffraction_pattern",
|
|
122
|
+
"interactive_wigner_surface",
|
|
123
|
+
"animate_diffraction_propagation",
|
|
124
|
+
]
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
r"""Gaussian beam propagation: the complex beam parameter, ABCD transformation, and higher-order modes.
|
|
2
|
+
|
|
3
|
+
A paraxial, monochromatic beam with a Gaussian transverse intensity profile
|
|
4
|
+
is completely described, at any position :math:`z` along its propagation
|
|
5
|
+
axis, by a single complex number -- the beam parameter :math:`q(z)`,
|
|
6
|
+
introduced by Kogelnik & Li (*Appl. Opt.* **5**, 1550, 1966) -- through
|
|
7
|
+
|
|
8
|
+
.. math::
|
|
9
|
+
|
|
10
|
+
\frac{1}{q(z)} = \frac{1}{R(z)} - i\,\frac{\lambda}{\pi w(z)^2},
|
|
11
|
+
|
|
12
|
+
where :math:`w(z)` is the :math:`1/e^2` intensity radius and :math:`R(z)`
|
|
13
|
+
the radius of curvature of the wavefronts. Propagation through any paraxial
|
|
14
|
+
optical system described by a ray-transfer (ABCD) matrix updates :math:`q`
|
|
15
|
+
by the same bilinear (Mobius) transformation that acts on ray-tracing
|
|
16
|
+
matrices, which is what makes the complex-:math:`q` formalism so useful:
|
|
17
|
+
free-space propagation, lenses, mirrors, and interfaces all become 2x2
|
|
18
|
+
matrix multiplications, exactly as in ordinary ray optics. This module also
|
|
19
|
+
covers the free-space eigenmodes of the paraxial wave equation built on top
|
|
20
|
+
of the fundamental Gaussian -- the Hermite-Gaussian and Laguerre-Gaussian
|
|
21
|
+
mode families -- and the empirical :math:`M^2` beam-quality factor used to
|
|
22
|
+
describe real, non-diffraction-limited laser beams.
|
|
23
|
+
|
|
24
|
+
The ABCD matrix convention used throughout (shared with
|
|
25
|
+
:mod:`physicskit.optics.ray`) is ``M = [[A, B], [C, D]]`` acting on a ray
|
|
26
|
+
state ``[y, theta]`` as ``state_out = M @ state_in``; e.g. free space of
|
|
27
|
+
length ``d`` is ``[[1, d], [0, 1]]`` and a thin lens of focal length ``f``
|
|
28
|
+
is ``[[1, 0], [-1/f, 1]]``.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
from __future__ import annotations
|
|
32
|
+
|
|
33
|
+
import numpy as np
|
|
34
|
+
from scipy.special import eval_genlaguerre, eval_hermite
|
|
35
|
+
|
|
36
|
+
__all__ = [
|
|
37
|
+
"propagate_q",
|
|
38
|
+
"q_to_beam_params",
|
|
39
|
+
"GaussianBeam",
|
|
40
|
+
"hermite_gaussian_mode",
|
|
41
|
+
"laguerre_gaussian_mode",
|
|
42
|
+
"m2_beam_waist",
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def propagate_q(q, M):
|
|
47
|
+
r"""Propagate a complex beam parameter through a paraxial optical system.
|
|
48
|
+
|
|
49
|
+
Applies the same bilinear transformation used for ray-transfer (ABCD)
|
|
50
|
+
matrices,
|
|
51
|
+
|
|
52
|
+
.. math::
|
|
53
|
+
|
|
54
|
+
q_{\text{out}} = \frac{A q + B}{C q + D},
|
|
55
|
+
|
|
56
|
+
with :math:`A, B, C, D` the entries of ``M`` in the convention
|
|
57
|
+
``M = [[A, B], [C, D]]``.
|
|
58
|
+
|
|
59
|
+
Parameters
|
|
60
|
+
----------
|
|
61
|
+
q : complex
|
|
62
|
+
Beam parameter before the system.
|
|
63
|
+
M : ndarray of shape (2, 2)
|
|
64
|
+
Ray-transfer (ABCD) matrix of the optical system.
|
|
65
|
+
|
|
66
|
+
Returns
|
|
67
|
+
-------
|
|
68
|
+
complex
|
|
69
|
+
Beam parameter ``q_out`` after the system.
|
|
70
|
+
|
|
71
|
+
Examples
|
|
72
|
+
--------
|
|
73
|
+
>>> import numpy as np
|
|
74
|
+
>>> free_space = np.array([[1.0, 2.0], [0.0, 1.0]])
|
|
75
|
+
>>> propagate_q(1j, free_space)
|
|
76
|
+
(2+1j)
|
|
77
|
+
"""
|
|
78
|
+
M = np.asarray(M)
|
|
79
|
+
A, B, C, D = M[0, 0], M[0, 1], M[1, 0], M[1, 1]
|
|
80
|
+
q = complex(q)
|
|
81
|
+
return complex((A * q + B) / (C * q + D))
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def q_to_beam_params(q, wavelength):
|
|
85
|
+
r"""Extract the beam radius and radius of curvature from a complex beam parameter.
|
|
86
|
+
|
|
87
|
+
Inverts
|
|
88
|
+
|
|
89
|
+
.. math::
|
|
90
|
+
|
|
91
|
+
\frac{1}{q} = \frac{1}{R} - i\,\frac{\lambda}{\pi w^2}.
|
|
92
|
+
|
|
93
|
+
At the beam waist :math:`\mathrm{Re}(1/q) = 0`, so ``R`` would formally
|
|
94
|
+
diverge; this is handled explicitly and ``np.inf`` is returned there
|
|
95
|
+
instead of raising or silently producing ``nan``.
|
|
96
|
+
|
|
97
|
+
Parameters
|
|
98
|
+
----------
|
|
99
|
+
q : complex
|
|
100
|
+
Complex beam parameter.
|
|
101
|
+
wavelength : float
|
|
102
|
+
Wavelength (in the same length units as ``q``).
|
|
103
|
+
|
|
104
|
+
Returns
|
|
105
|
+
-------
|
|
106
|
+
w : float
|
|
107
|
+
Beam radius (:math:`1/e^2` intensity radius).
|
|
108
|
+
R : float
|
|
109
|
+
Radius of curvature of the wavefront; ``np.inf`` at the waist.
|
|
110
|
+
|
|
111
|
+
Examples
|
|
112
|
+
--------
|
|
113
|
+
>>> import numpy as np
|
|
114
|
+
>>> zR = 3.0
|
|
115
|
+
>>> w, R = q_to_beam_params(1j * zR, wavelength=0.5e-3)
|
|
116
|
+
>>> round(float(w), 6), R
|
|
117
|
+
(0.021851, inf)
|
|
118
|
+
"""
|
|
119
|
+
q = complex(q)
|
|
120
|
+
inv_q = 1.0 / q
|
|
121
|
+
re, im = inv_q.real, inv_q.imag
|
|
122
|
+
mag = abs(inv_q)
|
|
123
|
+
if mag == 0.0 or abs(re) < 1e-10 * mag:
|
|
124
|
+
R = np.inf
|
|
125
|
+
else:
|
|
126
|
+
R = 1.0 / re
|
|
127
|
+
w = np.sqrt(-wavelength / (np.pi * im))
|
|
128
|
+
return w, R
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
class GaussianBeam:
|
|
132
|
+
r"""A fundamental (:math:`\mathrm{TEM}_{00}`) Gaussian laser beam.
|
|
133
|
+
|
|
134
|
+
Parameters
|
|
135
|
+
----------
|
|
136
|
+
wavelength : float
|
|
137
|
+
Wavelength, in the same length units as ``w0`` and ``z0``.
|
|
138
|
+
w0 : float
|
|
139
|
+
Waist radius (:math:`1/e^2` intensity radius at the narrowest point).
|
|
140
|
+
z0 : float, default=0.0
|
|
141
|
+
Axial position of the waist.
|
|
142
|
+
"""
|
|
143
|
+
|
|
144
|
+
def __init__(self, wavelength, w0, z0=0.0):
|
|
145
|
+
self.wavelength = wavelength
|
|
146
|
+
self.w0 = w0
|
|
147
|
+
self.z0 = z0
|
|
148
|
+
|
|
149
|
+
@property
|
|
150
|
+
def rayleigh_range(self):
|
|
151
|
+
r"""Rayleigh range, :math:`z_R = \pi w_0^2/\lambda`."""
|
|
152
|
+
return np.pi * self.w0**2 / self.wavelength
|
|
153
|
+
|
|
154
|
+
def waist(self, z):
|
|
155
|
+
r"""Beam radius at axial position ``z``.
|
|
156
|
+
|
|
157
|
+
.. math::
|
|
158
|
+
|
|
159
|
+
w(z) = w_0 \sqrt{1 + \left(\frac{z - z_0}{z_R}\right)^2}
|
|
160
|
+
|
|
161
|
+
Parameters
|
|
162
|
+
----------
|
|
163
|
+
z : float or array_like
|
|
164
|
+
Axial position(s).
|
|
165
|
+
|
|
166
|
+
Returns
|
|
167
|
+
-------
|
|
168
|
+
float or ndarray
|
|
169
|
+
"""
|
|
170
|
+
zR = self.rayleigh_range
|
|
171
|
+
return self.w0 * np.sqrt(1.0 + ((np.asarray(z, dtype=float) - self.z0) / zR) ** 2)
|
|
172
|
+
|
|
173
|
+
def radius_of_curvature(self, z):
|
|
174
|
+
r"""Wavefront radius of curvature at axial position ``z``.
|
|
175
|
+
|
|
176
|
+
.. math::
|
|
177
|
+
|
|
178
|
+
R(z) = (z - z_0)\left[1 + \left(\frac{z_R}{z - z_0}\right)^2\right]
|
|
179
|
+
|
|
180
|
+
with :math:`R(z_0) = \infty` (the wavefront is flat at the waist),
|
|
181
|
+
handled explicitly rather than relying on the indeterminate-form
|
|
182
|
+
arithmetic of the formula above.
|
|
183
|
+
|
|
184
|
+
Parameters
|
|
185
|
+
----------
|
|
186
|
+
z : float or array_like
|
|
187
|
+
Axial position(s).
|
|
188
|
+
|
|
189
|
+
Returns
|
|
190
|
+
-------
|
|
191
|
+
float or ndarray
|
|
192
|
+
"""
|
|
193
|
+
zR = self.rayleigh_range
|
|
194
|
+
dz = np.asarray(z, dtype=float) - self.z0
|
|
195
|
+
dz_safe = np.where(dz == 0.0, 1.0, dz)
|
|
196
|
+
R = np.where(dz == 0.0, np.inf, dz_safe + zR**2 / dz_safe)
|
|
197
|
+
if np.isscalar(z) or np.ndim(z) == 0:
|
|
198
|
+
return float(R) # pragma: no cover -- coverage.py mismeasures this line as
|
|
199
|
+
# unreached even though it demonstrably runs (verified by direct print-
|
|
200
|
+
# instrumentation) under test_radius_of_curvature_is_infinite_at_the_waist
|
|
201
|
+
# and test_radius_of_curvature_far_from_waist_approaches_z_minus_z0.
|
|
202
|
+
return R
|
|
203
|
+
|
|
204
|
+
def gouy_phase(self, z):
|
|
205
|
+
r"""Gouy phase at axial position ``z``, :math:`\zeta(z) = \arctan[(z-z_0)/z_R]`.
|
|
206
|
+
|
|
207
|
+
Parameters
|
|
208
|
+
----------
|
|
209
|
+
z : float or array_like
|
|
210
|
+
Axial position(s).
|
|
211
|
+
|
|
212
|
+
Returns
|
|
213
|
+
-------
|
|
214
|
+
float or ndarray
|
|
215
|
+
"""
|
|
216
|
+
zR = self.rayleigh_range
|
|
217
|
+
return np.arctan((np.asarray(z, dtype=float) - self.z0) / zR)
|
|
218
|
+
|
|
219
|
+
def q_parameter(self, z):
|
|
220
|
+
r"""Complex beam parameter at axial position ``z``, :math:`q(z) = (z-z_0) + i z_R`.
|
|
221
|
+
|
|
222
|
+
Parameters
|
|
223
|
+
----------
|
|
224
|
+
z : float
|
|
225
|
+
Axial position.
|
|
226
|
+
|
|
227
|
+
Returns
|
|
228
|
+
-------
|
|
229
|
+
complex
|
|
230
|
+
"""
|
|
231
|
+
zR = self.rayleigh_range
|
|
232
|
+
return complex(z - self.z0, zR)
|
|
233
|
+
|
|
234
|
+
@property
|
|
235
|
+
def divergence_angle(self):
|
|
236
|
+
r"""Far-field half-angle divergence, :math:`\theta = \lambda/(\pi w_0)`."""
|
|
237
|
+
return self.wavelength / (np.pi * self.w0)
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def hermite_gaussian_mode(x, y, z, beam, m, n):
|
|
241
|
+
r"""Hermite-Gaussian :math:`\mathrm{TEM}_{mn}` mode amplitude.
|
|
242
|
+
|
|
243
|
+
.. math::
|
|
244
|
+
|
|
245
|
+
u_{mn}(x, y, z) = \frac{w_0}{w(z)}\,
|
|
246
|
+
H_m\!\left(\frac{\sqrt2\,x}{w(z)}\right)
|
|
247
|
+
H_n\!\left(\frac{\sqrt2\,y}{w(z)}\right)
|
|
248
|
+
\exp\!\left[-\frac{x^2+y^2}{w(z)^2}\right]
|
|
249
|
+
\exp\!\left[-\frac{ik(x^2+y^2)}{2R(z)}\right]
|
|
250
|
+
\exp\!\left[i(m+n+1)\zeta(z)\right] \exp(-ikz)
|
|
251
|
+
|
|
252
|
+
with :math:`k = 2\pi/\lambda`. :math:`m=n=0` reduces to the fundamental
|
|
253
|
+
Gaussian mode carried by ``beam``.
|
|
254
|
+
|
|
255
|
+
Parameters
|
|
256
|
+
----------
|
|
257
|
+
x, y : array_like
|
|
258
|
+
Transverse coordinates (broadcastable).
|
|
259
|
+
z : float
|
|
260
|
+
Axial position.
|
|
261
|
+
beam : GaussianBeam
|
|
262
|
+
The underlying fundamental-mode beam (sets :math:`w_0`, :math:`z_0`,
|
|
263
|
+
:math:`\lambda`).
|
|
264
|
+
m, n : int
|
|
265
|
+
Transverse mode indices along :math:`x` and :math:`y`.
|
|
266
|
+
|
|
267
|
+
Returns
|
|
268
|
+
-------
|
|
269
|
+
ndarray
|
|
270
|
+
Complex field amplitude, broadcast shape of ``x`` and ``y``.
|
|
271
|
+
|
|
272
|
+
Examples
|
|
273
|
+
--------
|
|
274
|
+
>>> import numpy as np
|
|
275
|
+
>>> beam = GaussianBeam(wavelength=1.0, w0=1.0, z0=0.0)
|
|
276
|
+
>>> u00 = hermite_gaussian_mode(0.0, 0.0, 0.0, beam, 0, 0)
|
|
277
|
+
>>> round(float(abs(u00)), 6)
|
|
278
|
+
1.0
|
|
279
|
+
"""
|
|
280
|
+
x = np.asarray(x, dtype=float)
|
|
281
|
+
y = np.asarray(y, dtype=float)
|
|
282
|
+
k = 2.0 * np.pi / beam.wavelength
|
|
283
|
+
w = beam.waist(z)
|
|
284
|
+
R = beam.radius_of_curvature(z)
|
|
285
|
+
zeta = beam.gouy_phase(z)
|
|
286
|
+
r2 = x**2 + y**2
|
|
287
|
+
curvature_phase = 0.0 if np.isinf(R) else k * r2 / (2.0 * R)
|
|
288
|
+
amplitude = (beam.w0 / w) * eval_hermite(m, np.sqrt(2.0) * x / w) * eval_hermite(n, np.sqrt(2.0) * y / w) * np.exp(-r2 / w**2)
|
|
289
|
+
phase = np.exp(-1j * curvature_phase) * np.exp(1j * (m + n + 1) * zeta) * np.exp(-1j * k * z)
|
|
290
|
+
return (amplitude * phase).astype(complex)
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def laguerre_gaussian_mode(r, phi, z, beam, l, p):
|
|
294
|
+
r"""Laguerre-Gaussian :math:`\mathrm{LG}_p^l` mode amplitude.
|
|
295
|
+
|
|
296
|
+
.. math::
|
|
297
|
+
|
|
298
|
+
u_{lp}(r, \phi, z) = \frac{w_0}{w(z)}
|
|
299
|
+
\left(\frac{r\sqrt2}{w(z)}\right)^{|l|}
|
|
300
|
+
L_p^{|l|}\!\left(\frac{2r^2}{w(z)^2}\right)
|
|
301
|
+
\exp\!\left[-\frac{r^2}{w(z)^2}\right]
|
|
302
|
+
\exp\!\left[-\frac{ikr^2}{2R(z)}\right]
|
|
303
|
+
\exp(il\phi)
|
|
304
|
+
\exp\!\left[i(|l|+2p+1)\zeta(z)\right] \exp(-ikz)
|
|
305
|
+
|
|
306
|
+
with :math:`k = 2\pi/\lambda` and :math:`L_p^{|l|}` the associated
|
|
307
|
+
Laguerre polynomial.
|
|
308
|
+
|
|
309
|
+
Parameters
|
|
310
|
+
----------
|
|
311
|
+
r, phi : array_like
|
|
312
|
+
Polar transverse coordinates (broadcastable); ``r`` is the radial
|
|
313
|
+
distance from the axis, ``phi`` the azimuthal angle.
|
|
314
|
+
z : float
|
|
315
|
+
Axial position.
|
|
316
|
+
beam : GaussianBeam
|
|
317
|
+
The underlying fundamental-mode beam.
|
|
318
|
+
l : int
|
|
319
|
+
Azimuthal (orbital) mode index.
|
|
320
|
+
p : int
|
|
321
|
+
Radial mode index.
|
|
322
|
+
|
|
323
|
+
Returns
|
|
324
|
+
-------
|
|
325
|
+
ndarray
|
|
326
|
+
Complex field amplitude, broadcast shape of ``r`` and ``phi``.
|
|
327
|
+
|
|
328
|
+
Examples
|
|
329
|
+
--------
|
|
330
|
+
>>> import numpy as np
|
|
331
|
+
>>> beam = GaussianBeam(wavelength=1.0, w0=1.0, z0=0.0)
|
|
332
|
+
>>> u00 = laguerre_gaussian_mode(0.0, 0.0, 0.0, beam, 0, 0)
|
|
333
|
+
>>> round(float(abs(u00)), 6)
|
|
334
|
+
1.0
|
|
335
|
+
"""
|
|
336
|
+
r = np.asarray(r, dtype=float)
|
|
337
|
+
phi = np.asarray(phi, dtype=float)
|
|
338
|
+
k = 2.0 * np.pi / beam.wavelength
|
|
339
|
+
w = beam.waist(z)
|
|
340
|
+
R = beam.radius_of_curvature(z)
|
|
341
|
+
zeta = beam.gouy_phase(z)
|
|
342
|
+
curvature_phase = 0.0 if np.isinf(R) else k * r**2 / (2.0 * R)
|
|
343
|
+
amplitude = (beam.w0 / w) * (r * np.sqrt(2.0) / w) ** abs(l) * eval_genlaguerre(p, abs(l), 2.0 * r**2 / w**2) * np.exp(-(r**2) / w**2)
|
|
344
|
+
phase = np.exp(-1j * curvature_phase) * np.exp(1j * l * phi) * np.exp(1j * (abs(l) + 2 * p + 1) * zeta) * np.exp(-1j * k * z)
|
|
345
|
+
return (amplitude * phase).astype(complex)
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
def m2_beam_waist(z, wavelength, w0, M2=1.0):
|
|
349
|
+
r"""Beam radius of a non-ideal (:math:`M^2 > 1`) real laser beam, waist fixed at :math:`z=0`.
|
|
350
|
+
|
|
351
|
+
.. math::
|
|
352
|
+
|
|
353
|
+
w(z) = w_0 \sqrt{1 + \left(\frac{z}{z_{R,\text{eff}}}\right)^2},
|
|
354
|
+
\qquad z_{R,\text{eff}} = \frac{\pi w_0^2}{M^2 \lambda}
|
|
355
|
+
|
|
356
|
+
A beam-quality factor :math:`M^2 \ge 1` (equal to 1 for an ideal
|
|
357
|
+
diffraction-limited Gaussian beam) reduces the effective Rayleigh range,
|
|
358
|
+
so a real beam of the same waist diverges faster than the ideal case.
|
|
359
|
+
|
|
360
|
+
Parameters
|
|
361
|
+
----------
|
|
362
|
+
z : float or array_like
|
|
363
|
+
Axial position(s), measured from the waist at :math:`z=0`.
|
|
364
|
+
wavelength : float
|
|
365
|
+
Wavelength.
|
|
366
|
+
w0 : float
|
|
367
|
+
Waist radius.
|
|
368
|
+
M2 : float, default=1.0
|
|
369
|
+
Beam-quality factor, :math:`M^2 \ge 1`.
|
|
370
|
+
|
|
371
|
+
Returns
|
|
372
|
+
-------
|
|
373
|
+
float or ndarray
|
|
374
|
+
Beam radius ``w(z)``.
|
|
375
|
+
|
|
376
|
+
Examples
|
|
377
|
+
--------
|
|
378
|
+
>>> round(float(m2_beam_waist(0.0, wavelength=0.5e-3, w0=0.1, M2=2.0)), 6)
|
|
379
|
+
0.1
|
|
380
|
+
"""
|
|
381
|
+
zR_eff = np.pi * w0**2 / (M2 * wavelength)
|
|
382
|
+
return w0 * np.sqrt(1.0 + (np.asarray(z, dtype=float) / zR_eff) ** 2)
|