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
physicskit/plasma/mhd.py
ADDED
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
"""Magnetohydrodynamics: wave speeds, toroidal equilibrium, and magnetic reconnection.
|
|
2
|
+
|
|
3
|
+
Treats the plasma as a single conducting fluid rather than a collection of
|
|
4
|
+
orbiting particles. Three regimes are covered: the characteristic wave
|
|
5
|
+
speeds of ideal MHD (:func:`alfven_speed`, :func:`sound_speed`,
|
|
6
|
+
:func:`magnetosonic_speeds`); static toroidal equilibrium, obtained by
|
|
7
|
+
solving the Grad-Shafranov equation
|
|
8
|
+
:math:`\\Delta^*\\psi = -\\mu_0 R^2 p'(\\psi) - FF'(\\psi)` for the poloidal
|
|
9
|
+
flux function :math:`\\psi(R, Z)` that balances pressure against the
|
|
10
|
+
magnetic force in an axisymmetric device (:func:`solve_grad_shafranov`,
|
|
11
|
+
:func:`safety_factor_large_aspect_ratio`); and resistive magnetic
|
|
12
|
+
reconnection, where a thin current sheet lets field lines of opposite
|
|
13
|
+
polarity break and reconnect, converting magnetic energy to heat and flow
|
|
14
|
+
(:func:`sweet_parker_rate`, :func:`petschek_rate`).
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import numpy as np
|
|
20
|
+
from numba import njit
|
|
21
|
+
|
|
22
|
+
__all__ = [
|
|
23
|
+
"MU0",
|
|
24
|
+
"alfven_speed",
|
|
25
|
+
"sound_speed",
|
|
26
|
+
"magnetosonic_speeds",
|
|
27
|
+
"solovev_particular_solution",
|
|
28
|
+
"grad_shafranov_rhs_solovev",
|
|
29
|
+
"solve_grad_shafranov",
|
|
30
|
+
"safety_factor_large_aspect_ratio",
|
|
31
|
+
"lundquist_number",
|
|
32
|
+
"resistive_diffusion_time",
|
|
33
|
+
"sweet_parker_rate",
|
|
34
|
+
"sweet_parker_layer_width",
|
|
35
|
+
"petschek_rate",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
MU0 = 4 * np.pi * 1e-7
|
|
39
|
+
"""Vacuum permeability, in H/m."""
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def alfven_speed(B: float, rho: float) -> float:
|
|
43
|
+
"""Alfven speed :math:`v_A = B/\\sqrt{\\mu_0 \\rho}`, at which a perturbation propagates along tensioned field lines.
|
|
44
|
+
|
|
45
|
+
Hannes Alfven's 1942 discovery that a magnetized, perfectly conducting
|
|
46
|
+
fluid supports a transverse wave -- field lines behaving like strings
|
|
47
|
+
under tension :math:`B^2/\\mu_0`, plucked by the inertia of the frozen-in
|
|
48
|
+
plasma -- founded MHD as a distinct discipline and earned the 1970
|
|
49
|
+
Nobel Prize.
|
|
50
|
+
|
|
51
|
+
Parameters
|
|
52
|
+
----------
|
|
53
|
+
B : float
|
|
54
|
+
Magnetic field magnitude in Tesla.
|
|
55
|
+
rho : float
|
|
56
|
+
Mass density in kg/m^3.
|
|
57
|
+
|
|
58
|
+
Returns
|
|
59
|
+
-------
|
|
60
|
+
float
|
|
61
|
+
Alfven speed in m/s.
|
|
62
|
+
|
|
63
|
+
See Also
|
|
64
|
+
--------
|
|
65
|
+
magnetosonic_speeds : The compressive (fast/slow) counterparts of this
|
|
66
|
+
purely magnetic wave.
|
|
67
|
+
|
|
68
|
+
Examples
|
|
69
|
+
--------
|
|
70
|
+
>>> round(float(alfven_speed(B=1.0, rho=1e-6)), 2)
|
|
71
|
+
892062.06
|
|
72
|
+
"""
|
|
73
|
+
return B / np.sqrt(MU0 * rho)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def sound_speed(gamma: float, p: float, rho: float) -> float:
|
|
77
|
+
"""Ordinary adiabatic sound speed :math:`c_s = \\sqrt{\\gamma p/\\rho}`.
|
|
78
|
+
|
|
79
|
+
Parameters
|
|
80
|
+
----------
|
|
81
|
+
gamma : float
|
|
82
|
+
Adiabatic index (5/3 for an ideal monatomic gas).
|
|
83
|
+
p : float
|
|
84
|
+
Pressure in Pa.
|
|
85
|
+
rho : float
|
|
86
|
+
Mass density in kg/m^3.
|
|
87
|
+
|
|
88
|
+
Returns
|
|
89
|
+
-------
|
|
90
|
+
float
|
|
91
|
+
Sound speed in m/s.
|
|
92
|
+
|
|
93
|
+
Examples
|
|
94
|
+
--------
|
|
95
|
+
>>> round(float(sound_speed(gamma=5 / 3, p=1.0, rho=1e-6)), 2)
|
|
96
|
+
1290.99
|
|
97
|
+
"""
|
|
98
|
+
return np.sqrt(gamma * p / rho)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def magnetosonic_speeds(vA: float, cs: float, theta: float) -> tuple:
|
|
102
|
+
"""Fast and slow magnetosonic phase speeds at propagation angle :math:`\\theta` to :math:`\\mathbf{B}`.
|
|
103
|
+
|
|
104
|
+
The two compressive MHD normal modes solve
|
|
105
|
+
:math:`v_{f,s}^2 = \\tfrac{1}{2}\\left[(v_A^2+c_s^2) \\pm \\sqrt{(v_A^2+c_s^2)^2 - 4v_A^2c_s^2\\cos^2\\theta}\\right]`.
|
|
106
|
+
At :math:`\\theta=0` (propagation along :math:`\\mathbf{B}`) they reduce
|
|
107
|
+
to :math:`\\max(v_A, c_s)` and :math:`\\min(v_A, c_s)`; at
|
|
108
|
+
:math:`\\theta=\\pi/2` the fast mode becomes the purely compressive
|
|
109
|
+
:math:`\\sqrt{v_A^2+c_s^2}` and the slow mode vanishes, since a
|
|
110
|
+
perpendicular perturbation cannot bend field lines that are already
|
|
111
|
+
perpendicular to its wavevector.
|
|
112
|
+
|
|
113
|
+
Parameters
|
|
114
|
+
----------
|
|
115
|
+
vA : float
|
|
116
|
+
Alfven speed in m/s, from :func:`alfven_speed`.
|
|
117
|
+
cs : float
|
|
118
|
+
Sound speed in m/s, from :func:`sound_speed`.
|
|
119
|
+
theta : float
|
|
120
|
+
Angle between the wavevector and :math:`\\mathbf{B}`, in radians.
|
|
121
|
+
|
|
122
|
+
Returns
|
|
123
|
+
-------
|
|
124
|
+
v_fast, v_slow : float
|
|
125
|
+
Fast and slow magnetosonic phase speeds in m/s.
|
|
126
|
+
|
|
127
|
+
Examples
|
|
128
|
+
--------
|
|
129
|
+
>>> import numpy as np
|
|
130
|
+
>>> vf, vs = magnetosonic_speeds(vA=892062.06, cs=1e5, theta=np.pi / 2)
|
|
131
|
+
>>> round(vf, 2)
|
|
132
|
+
897649.55
|
|
133
|
+
>>> round(vs, 2)
|
|
134
|
+
0.0
|
|
135
|
+
"""
|
|
136
|
+
s = vA**2 + cs**2
|
|
137
|
+
d = np.sqrt(max(s**2 - 4.0 * vA**2 * cs**2 * np.cos(theta) ** 2, 0.0))
|
|
138
|
+
return float(np.sqrt(0.5 * (s + d))), float(np.sqrt(0.5 * (s - d)))
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def solovev_particular_solution(R: np.ndarray, Z: np.ndarray, c1: float, c2: float) -> np.ndarray:
|
|
142
|
+
"""Closed-form particular solution of the linear (Solov'ev) Grad-Shafranov equation.
|
|
143
|
+
|
|
144
|
+
When the source term is linear in :math:`R^2` -- i.e.
|
|
145
|
+
:math:`p'(\\psi) = \\text{const}` and :math:`FF'(\\psi) = \\text{const}`,
|
|
146
|
+
so :math:`\\Delta^*\\psi = c_1 R^2 + c_2` -- the Grad-Shafranov operator
|
|
147
|
+
:math:`\\Delta^*\\psi = \\partial_R^2\\psi - R^{-1}\\partial_R\\psi + \\partial_Z^2\\psi`
|
|
148
|
+
admits the exact polynomial solution :math:`\\psi_p = \\tfrac{c_1}{8}R^4 +
|
|
149
|
+
\\tfrac{c_2}{2}Z^2` (Solov'ev, 1968); adding any solution of the
|
|
150
|
+
homogeneous equation :math:`\\Delta^*\\psi=0` shapes the boundary into a
|
|
151
|
+
D-shaped or elongated cross-section without affecting the pressure and
|
|
152
|
+
current profile. Used here to validate :func:`solve_grad_shafranov`
|
|
153
|
+
against an exact answer, and to supply consistent Dirichlet boundary
|
|
154
|
+
data for it.
|
|
155
|
+
|
|
156
|
+
Parameters
|
|
157
|
+
----------
|
|
158
|
+
R, Z : ndarray
|
|
159
|
+
Cylindrical coordinates (broadcastable), in meters.
|
|
160
|
+
c1, c2 : float
|
|
161
|
+
Coefficients of the linear source term :math:`\\Delta^*\\psi = c_1 R^2 + c_2`.
|
|
162
|
+
|
|
163
|
+
Returns
|
|
164
|
+
-------
|
|
165
|
+
ndarray
|
|
166
|
+
Poloidal flux :math:`\\psi(R, Z)`, same shape as ``R``/``Z``.
|
|
167
|
+
|
|
168
|
+
See Also
|
|
169
|
+
--------
|
|
170
|
+
grad_shafranov_rhs_solovev : The corresponding source term.
|
|
171
|
+
solve_grad_shafranov : Numerical solver validated against this solution.
|
|
172
|
+
|
|
173
|
+
Examples
|
|
174
|
+
--------
|
|
175
|
+
>>> import numpy as np
|
|
176
|
+
>>> solovev_particular_solution(np.array([1.0]), np.array([0.0]), c1=1.0, c2=-2.0)
|
|
177
|
+
array([0.125])
|
|
178
|
+
"""
|
|
179
|
+
return (c1 / 8.0) * R**4 + (c2 / 2.0) * Z**2
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def grad_shafranov_rhs_solovev(R: np.ndarray, c1: float, c2: float) -> np.ndarray:
|
|
183
|
+
"""Source term :math:`\\Delta^*\\psi = c_1 R^2 + c_2` of the linear Solov'ev equilibrium.
|
|
184
|
+
|
|
185
|
+
Equivalent to :math:`-\\mu_0 R^2 p'(\\psi) - FF'(\\psi)` in the
|
|
186
|
+
Grad-Shafranov equation for the special case of constant
|
|
187
|
+
:math:`p'(\\psi)` and :math:`FF'(\\psi)`.
|
|
188
|
+
|
|
189
|
+
Parameters
|
|
190
|
+
----------
|
|
191
|
+
R : ndarray
|
|
192
|
+
Major-radius coordinate, in meters.
|
|
193
|
+
c1, c2 : float
|
|
194
|
+
Source coefficients (related to :math:`p'` and :math:`FF'`).
|
|
195
|
+
|
|
196
|
+
Returns
|
|
197
|
+
-------
|
|
198
|
+
ndarray
|
|
199
|
+
The right-hand side :math:`\\Delta^*\\psi`, same shape as ``R``.
|
|
200
|
+
|
|
201
|
+
Examples
|
|
202
|
+
--------
|
|
203
|
+
>>> import numpy as np
|
|
204
|
+
>>> grad_shafranov_rhs_solovev(np.array([1.0, 2.0]), c1=1.0, c2=-2.0)
|
|
205
|
+
array([-1., 2.])
|
|
206
|
+
"""
|
|
207
|
+
return c1 * R**2 + c2
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
@njit(cache=True)
|
|
211
|
+
def _sor_grad_shafranov(psi, R, dR, dZ, c1, c2, omega, max_iter):
|
|
212
|
+
nr, nz = psi.shape
|
|
213
|
+
for _ in range(max_iter):
|
|
214
|
+
for i in range(1, nr - 1):
|
|
215
|
+
Ri = R[i]
|
|
216
|
+
coef_ip = 1.0 / dR**2 - 1.0 / (2.0 * Ri * dR)
|
|
217
|
+
coef_im = 1.0 / dR**2 + 1.0 / (2.0 * Ri * dR)
|
|
218
|
+
coef_j = 1.0 / dZ**2
|
|
219
|
+
coef_c = -2.0 / dR**2 - 2.0 / dZ**2
|
|
220
|
+
for j in range(1, nz - 1):
|
|
221
|
+
source = c1 * Ri**2 + c2
|
|
222
|
+
rhs = source - coef_ip * psi[i + 1, j] - coef_im * psi[i - 1, j] - coef_j * psi[i, j + 1] - coef_j * psi[i, j - 1]
|
|
223
|
+
psi[i, j] = (1.0 - omega) * psi[i, j] + omega * (rhs / coef_c)
|
|
224
|
+
return psi
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def solve_grad_shafranov(R: np.ndarray, Z: np.ndarray, c1: float, c2: float, omega: float = 1.8, max_iter: int = 4000) -> np.ndarray:
|
|
228
|
+
"""Solve the axisymmetric Grad-Shafranov equation by successive over-relaxation (SOR).
|
|
229
|
+
|
|
230
|
+
Finite-differences the elliptic operator
|
|
231
|
+
:math:`\\Delta^*\\psi = \\partial_R^2\\psi - R^{-1}\\partial_R\\psi +
|
|
232
|
+
\\partial_Z^2\\psi` on a rectangular :math:`(R, Z)` grid and relaxes it
|
|
233
|
+
toward the linear (Solov'ev) source :math:`c_1 R^2 + c_2`, using
|
|
234
|
+
Dirichlet boundary data taken from the exact
|
|
235
|
+
:func:`solovev_particular_solution` -- so the interior solution this
|
|
236
|
+
converges to is known analytically and can be checked directly, rather
|
|
237
|
+
than only visually.
|
|
238
|
+
|
|
239
|
+
Parameters
|
|
240
|
+
----------
|
|
241
|
+
R : ndarray, shape (nr,)
|
|
242
|
+
Major-radius grid points, in meters; must be strictly positive
|
|
243
|
+
(the operator is singular at :math:`R=0`).
|
|
244
|
+
Z : ndarray, shape (nz,)
|
|
245
|
+
Vertical grid points, in meters.
|
|
246
|
+
c1, c2 : float
|
|
247
|
+
Coefficients of the linear source term, as in :func:`grad_shafranov_rhs_solovev`.
|
|
248
|
+
omega : float, default=1.8
|
|
249
|
+
SOR relaxation parameter, :math:`1 < \\omega < 2`.
|
|
250
|
+
max_iter : int, default=4000
|
|
251
|
+
Number of relaxation sweeps.
|
|
252
|
+
|
|
253
|
+
Returns
|
|
254
|
+
-------
|
|
255
|
+
ndarray, shape (nr, nz)
|
|
256
|
+
Poloidal flux :math:`\\psi(R, Z)` on the grid.
|
|
257
|
+
|
|
258
|
+
See Also
|
|
259
|
+
--------
|
|
260
|
+
solovev_particular_solution : The exact solution this converges to.
|
|
261
|
+
safety_factor_large_aspect_ratio : A downstream equilibrium diagnostic.
|
|
262
|
+
|
|
263
|
+
Examples
|
|
264
|
+
--------
|
|
265
|
+
>>> import numpy as np
|
|
266
|
+
>>> R = np.linspace(0.5, 1.5, 41)
|
|
267
|
+
>>> Z = np.linspace(-0.5, 0.5, 41)
|
|
268
|
+
>>> c1, c2 = 1.0, -2.0
|
|
269
|
+
>>> psi = solve_grad_shafranov(R, Z, c1, c2)
|
|
270
|
+
>>> RR, ZZ = np.meshgrid(R, Z, indexing="ij")
|
|
271
|
+
>>> psi_exact = solovev_particular_solution(RR, ZZ, c1, c2)
|
|
272
|
+
>>> bool(np.max(np.abs(psi - psi_exact)) < 1e-3)
|
|
273
|
+
True
|
|
274
|
+
"""
|
|
275
|
+
nr, nz = len(R), len(Z)
|
|
276
|
+
RR, ZZ = np.meshgrid(R, Z, indexing="ij")
|
|
277
|
+
psi_exact = solovev_particular_solution(RR, ZZ, c1, c2)
|
|
278
|
+
psi = np.zeros((nr, nz))
|
|
279
|
+
psi[0, :] = psi_exact[0, :]
|
|
280
|
+
psi[-1, :] = psi_exact[-1, :]
|
|
281
|
+
psi[:, 0] = psi_exact[:, 0]
|
|
282
|
+
psi[:, -1] = psi_exact[:, -1]
|
|
283
|
+
dR = float(R[1] - R[0])
|
|
284
|
+
dZ = float(Z[1] - Z[0])
|
|
285
|
+
return _sor_grad_shafranov(psi, np.asarray(R, dtype=float), dR, dZ, float(c1), float(c2), float(omega), int(max_iter))
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def safety_factor_large_aspect_ratio(r: float, R0: float, Bt: float, Bp: float) -> float:
|
|
289
|
+
"""Tokamak safety factor :math:`q \\approx rB_t/(R_0 B_p)` in the large-aspect-ratio approximation.
|
|
290
|
+
|
|
291
|
+
Counts how many times a field line winds the long way (toroidally)
|
|
292
|
+
around the torus for each time it winds the short way (poloidally).
|
|
293
|
+
Field lines with rational :math:`q = m/n` close on themselves after
|
|
294
|
+
:math:`n` toroidal transits and are resonant surfaces for
|
|
295
|
+
magnetic-island-forming instabilities; :math:`q=1` in particular marks
|
|
296
|
+
the sawtooth-unstable region at a tokamak's core.
|
|
297
|
+
|
|
298
|
+
Parameters
|
|
299
|
+
----------
|
|
300
|
+
r : float
|
|
301
|
+
Minor-radius coordinate of the flux surface, in meters.
|
|
302
|
+
R0 : float
|
|
303
|
+
Major radius of the torus, in meters.
|
|
304
|
+
Bt : float
|
|
305
|
+
Toroidal field strength at the flux surface, in Tesla.
|
|
306
|
+
Bp : float
|
|
307
|
+
Poloidal field strength at the flux surface, in Tesla.
|
|
308
|
+
|
|
309
|
+
Returns
|
|
310
|
+
-------
|
|
311
|
+
float
|
|
312
|
+
Safety factor (dimensionless).
|
|
313
|
+
|
|
314
|
+
Examples
|
|
315
|
+
--------
|
|
316
|
+
>>> round(safety_factor_large_aspect_ratio(r=0.3, R0=1.0, Bt=2.0, Bp=0.2), 10)
|
|
317
|
+
3.0
|
|
318
|
+
"""
|
|
319
|
+
return r * Bt / (R0 * Bp)
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
def lundquist_number(L: float, vA: float, eta: float) -> float:
|
|
323
|
+
"""Lundquist number :math:`S = L v_A/\\eta`, the magnetic Reynolds number built from the Alfven speed.
|
|
324
|
+
|
|
325
|
+
Parameters
|
|
326
|
+
----------
|
|
327
|
+
L : float
|
|
328
|
+
Characteristic length scale (e.g. current-sheet length), in meters.
|
|
329
|
+
vA : float
|
|
330
|
+
Alfven speed in m/s, from :func:`alfven_speed`.
|
|
331
|
+
eta : float
|
|
332
|
+
Magnetic diffusivity in m^2/s.
|
|
333
|
+
|
|
334
|
+
Returns
|
|
335
|
+
-------
|
|
336
|
+
float
|
|
337
|
+
Lundquist number (dimensionless). Fusion and astrophysical plasmas
|
|
338
|
+
typically have :math:`S \\sim 10^{6}` -- :math:`10^{14}`.
|
|
339
|
+
|
|
340
|
+
See Also
|
|
341
|
+
--------
|
|
342
|
+
sweet_parker_rate : Reconnection rate scaling as :math:`S^{-1/2}`.
|
|
343
|
+
|
|
344
|
+
Examples
|
|
345
|
+
--------
|
|
346
|
+
>>> lundquist_number(L=1.0, vA=1e6, eta=1.0)
|
|
347
|
+
1000000.0
|
|
348
|
+
"""
|
|
349
|
+
return L * vA / eta
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
def resistive_diffusion_time(L: float, eta: float) -> float:
|
|
353
|
+
"""Resistive diffusion time :math:`\\tau_\\eta = L^2/\\eta` for magnetic field to decay through a length :math:`L`.
|
|
354
|
+
|
|
355
|
+
Parameters
|
|
356
|
+
----------
|
|
357
|
+
L : float
|
|
358
|
+
Length scale in meters.
|
|
359
|
+
eta : float
|
|
360
|
+
Magnetic diffusivity in m^2/s.
|
|
361
|
+
|
|
362
|
+
Returns
|
|
363
|
+
-------
|
|
364
|
+
float
|
|
365
|
+
Diffusion time in seconds.
|
|
366
|
+
|
|
367
|
+
Examples
|
|
368
|
+
--------
|
|
369
|
+
>>> resistive_diffusion_time(L=1.0, eta=1.0)
|
|
370
|
+
1.0
|
|
371
|
+
"""
|
|
372
|
+
return L**2 / eta
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
def sweet_parker_rate(S: float) -> float:
|
|
376
|
+
"""Sweet-Parker reconnection rate :math:`v_{in}/v_A = S^{-1/2}`.
|
|
377
|
+
|
|
378
|
+
Sweet and Parker's 1957/1958 model treats reconnection as
|
|
379
|
+
steady inflow through a long, thin resistive current sheet of aspect
|
|
380
|
+
ratio :math:`\\delta/L \\sim S^{-1/2}`; mass conservation through that
|
|
381
|
+
narrow sheet throttles the inflow (and hence the whole reconnection
|
|
382
|
+
process) to the same :math:`S^{-1/2}` scaling. For solar-flare-scale
|
|
383
|
+
Lundquist numbers (:math:`S\\sim10^{12}`) this predicts reconnection
|
|
384
|
+
millions of times too slow to explain observed flare energy-release
|
|
385
|
+
times -- the puzzle :func:`petschek_rate` was proposed to resolve.
|
|
386
|
+
|
|
387
|
+
Parameters
|
|
388
|
+
----------
|
|
389
|
+
S : float
|
|
390
|
+
Lundquist number, from :func:`lundquist_number`.
|
|
391
|
+
|
|
392
|
+
Returns
|
|
393
|
+
-------
|
|
394
|
+
float
|
|
395
|
+
Dimensionless reconnection rate :math:`v_{in}/v_A`.
|
|
396
|
+
|
|
397
|
+
See Also
|
|
398
|
+
--------
|
|
399
|
+
sweet_parker_layer_width : The current-sheet thickness behind this rate.
|
|
400
|
+
petschek_rate : The faster, X-point reconnection alternative.
|
|
401
|
+
|
|
402
|
+
Examples
|
|
403
|
+
--------
|
|
404
|
+
>>> round(float(sweet_parker_rate(S=1e6)), 6)
|
|
405
|
+
0.001
|
|
406
|
+
"""
|
|
407
|
+
return 1.0 / np.sqrt(S)
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
def sweet_parker_layer_width(L: float, S: float) -> float:
|
|
411
|
+
"""Sweet-Parker current-sheet thickness :math:`\\delta = L/\\sqrt{S}`.
|
|
412
|
+
|
|
413
|
+
Parameters
|
|
414
|
+
----------
|
|
415
|
+
L : float
|
|
416
|
+
Current-sheet length in meters.
|
|
417
|
+
S : float
|
|
418
|
+
Lundquist number, from :func:`lundquist_number`.
|
|
419
|
+
|
|
420
|
+
Returns
|
|
421
|
+
-------
|
|
422
|
+
float
|
|
423
|
+
Current-sheet thickness in meters.
|
|
424
|
+
|
|
425
|
+
Examples
|
|
426
|
+
--------
|
|
427
|
+
>>> round(float(sweet_parker_layer_width(L=1e7, S=1e6)), 4)
|
|
428
|
+
10000.0
|
|
429
|
+
"""
|
|
430
|
+
return L / np.sqrt(S)
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
def petschek_rate(S: float) -> float:
|
|
434
|
+
"""Petschek reconnection rate :math:`v_{in}/v_A \\approx \\pi/(8\\ln S)`.
|
|
435
|
+
|
|
436
|
+
Petschek (1964) showed that if the diffusion region shrinks to a
|
|
437
|
+
small X-point rather than the full Sweet-Parker sheet length, four
|
|
438
|
+
standing slow-mode shocks can carry most of the inflowing flux and
|
|
439
|
+
energy conversion, giving a reconnection rate that falls only
|
|
440
|
+
logarithmically with :math:`S` instead of as :math:`S^{-1/2}` --
|
|
441
|
+
fast enough to plausibly explain solar flare and magnetospheric
|
|
442
|
+
substorm timescales.
|
|
443
|
+
|
|
444
|
+
Parameters
|
|
445
|
+
----------
|
|
446
|
+
S : float
|
|
447
|
+
Lundquist number, from :func:`lundquist_number`.
|
|
448
|
+
|
|
449
|
+
Returns
|
|
450
|
+
-------
|
|
451
|
+
float
|
|
452
|
+
Dimensionless reconnection rate :math:`v_{in}/v_A`.
|
|
453
|
+
|
|
454
|
+
See Also
|
|
455
|
+
--------
|
|
456
|
+
sweet_parker_rate : The slower, steady-sheet reconnection rate this improves on.
|
|
457
|
+
|
|
458
|
+
Examples
|
|
459
|
+
--------
|
|
460
|
+
>>> round(float(petschek_rate(S=1e6)), 4)
|
|
461
|
+
0.0284
|
|
462
|
+
"""
|
|
463
|
+
return np.pi / (8.0 * np.log(S))
|