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,308 @@
|
|
|
1
|
+
"""Lagrangian-mechanics systems, derived symbolically via
|
|
2
|
+
:class:`physicskit.classical.utils.symbolic.LagrangianEngine`.
|
|
3
|
+
|
|
4
|
+
Each system here writes down L(q, qdot) with SymPy, hands it to the
|
|
5
|
+
engine to auto-derive the Euler-Lagrange accelerations and the
|
|
6
|
+
Legendre-transformed Hamiltonian, and exposes the resulting JIT
|
|
7
|
+
equations of motion through :class:`physicskit.classical.core.base_system.LagrangianSystem`.
|
|
8
|
+
Because the Hamiltonian form is derived even when the mass matrix M(q)
|
|
9
|
+
is configuration-dependent (i.e. the system is non-separable), the
|
|
10
|
+
default integration method is ``implicit_midpoint`` -- the general
|
|
11
|
+
symplectic integrator from :mod:`physicskit.classical.core.integrators`.
|
|
12
|
+
|
|
13
|
+
Deriving equations of motion (SymPy differentiation, matrix inversion,
|
|
14
|
+
simplification, then Numba compilation) costs on the order of a second
|
|
15
|
+
even for a 2-DOF system -- so each system's engine-building step is
|
|
16
|
+
wrapped in ``functools.lru_cache``, keyed on the physical parameters
|
|
17
|
+
(masses, lengths, ...). Constructing many instances of the *same*
|
|
18
|
+
physical system (e.g. an ensemble of initial conditions to show
|
|
19
|
+
sensitivity to initial conditions, as in the chaos example) reuses the
|
|
20
|
+
cached engine instead of re-deriving and re-compiling from scratch.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
from functools import lru_cache
|
|
26
|
+
|
|
27
|
+
import numpy as np
|
|
28
|
+
import sympy as sp
|
|
29
|
+
|
|
30
|
+
from physicskit.classical.core.base_system import LagrangianSystem
|
|
31
|
+
from physicskit.classical.utils.symbolic import LagrangianEngine
|
|
32
|
+
|
|
33
|
+
__all__ = ["DoublePendulum", "BeadOnRotatingHoop", "CoupledOscillators", "ElasticPendulum"]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@lru_cache(maxsize=32)
|
|
37
|
+
def _double_pendulum_engine(m1: float, m2: float, l1: float, l2: float, g: float) -> LagrangianEngine:
|
|
38
|
+
th1, th2, w1, w2 = sp.symbols("th1 th2 w1 w2")
|
|
39
|
+
m1s, m2s, l1s, l2s, gs = sp.symbols("m1 m2 l1 l2 g")
|
|
40
|
+
|
|
41
|
+
x1 = l1s * sp.sin(th1)
|
|
42
|
+
y1 = -l1s * sp.cos(th1)
|
|
43
|
+
x2 = x1 + l2s * sp.sin(th2)
|
|
44
|
+
y2 = y1 - l2s * sp.cos(th2)
|
|
45
|
+
x1d = sp.diff(x1, th1) * w1
|
|
46
|
+
y1d = sp.diff(y1, th1) * w1
|
|
47
|
+
x2d = sp.diff(x2, th1) * w1 + sp.diff(x2, th2) * w2
|
|
48
|
+
y2d = sp.diff(y2, th1) * w1 + sp.diff(y2, th2) * w2
|
|
49
|
+
|
|
50
|
+
T = sp.Rational(1, 2) * m1s * (x1d**2 + y1d**2) + sp.Rational(1, 2) * m2s * (x2d**2 + y2d**2)
|
|
51
|
+
V = m1s * gs * y1 + m2s * gs * y2
|
|
52
|
+
L = sp.simplify(T - V)
|
|
53
|
+
|
|
54
|
+
params = {m1s: m1, m2s: m2, l1s: l1, l2s: l2, gs: g}
|
|
55
|
+
return LagrangianEngine([th1, th2], [w1, w2], L, params=params)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class DoublePendulum(LagrangianSystem):
|
|
59
|
+
"""Planar double pendulum: two point masses on massless rods.
|
|
60
|
+
|
|
61
|
+
Generalized coordinates: q = (theta1, theta2), angles from the
|
|
62
|
+
downward vertical. A classic showcase of deterministic chaos and of
|
|
63
|
+
the non-separable-Hamiltonian case for symplectic integration (the
|
|
64
|
+
mass matrix depends on ``theta2 - theta1``).
|
|
65
|
+
|
|
66
|
+
Parameters
|
|
67
|
+
----------
|
|
68
|
+
theta0, thetadot0 : array-like, shape (2,)
|
|
69
|
+
Initial angles and angular velocities.
|
|
70
|
+
m1, m2 : float
|
|
71
|
+
Bob masses.
|
|
72
|
+
l1, l2 : float
|
|
73
|
+
Rod lengths.
|
|
74
|
+
g : float
|
|
75
|
+
Gravitational acceleration.
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
def __init__(self, theta0, thetadot0, m1=1.0, m2=1.0, l1=1.0, l2=1.0, g=9.81):
|
|
79
|
+
self.m1, self.m2, self.l1, self.l2, self.g = m1, m2, l1, l2, g
|
|
80
|
+
self.engine = _double_pendulum_engine(m1, m2, l1, l2, g)
|
|
81
|
+
self._accel_njit = self.engine.acceleration_njit
|
|
82
|
+
self._momentum_njit = self.engine.momentum_njit
|
|
83
|
+
self._canonical_deriv_njit = self.engine.canonical_deriv_njit
|
|
84
|
+
self._velocity_njit = self.engine.velocity_njit
|
|
85
|
+
self._deriv_njit = self.engine.full_deriv_njit
|
|
86
|
+
self._hamiltonian_njit = self.engine.hamiltonian_njit
|
|
87
|
+
|
|
88
|
+
super().__init__(theta0, thetadot0)
|
|
89
|
+
|
|
90
|
+
def positions(self, q: np.ndarray = None):
|
|
91
|
+
"""Cartesian (x1, y1, x2, y2) bob positions for a given (theta1, theta2).
|
|
92
|
+
|
|
93
|
+
Parameters
|
|
94
|
+
----------
|
|
95
|
+
q : ndarray, optional
|
|
96
|
+
``(theta1, theta2)``; defaults to the current state.
|
|
97
|
+
|
|
98
|
+
Returns
|
|
99
|
+
-------
|
|
100
|
+
ndarray, shape (4,)
|
|
101
|
+
``(x1, y1, x2, y2)``.
|
|
102
|
+
"""
|
|
103
|
+
q = self.q if q is None else q
|
|
104
|
+
th1, th2 = q
|
|
105
|
+
x1 = self.l1 * np.sin(th1)
|
|
106
|
+
y1 = -self.l1 * np.cos(th1)
|
|
107
|
+
x2 = x1 + self.l2 * np.sin(th2)
|
|
108
|
+
y2 = y1 - self.l2 * np.cos(th2)
|
|
109
|
+
return np.array([x1, y1, x2, y2])
|
|
110
|
+
|
|
111
|
+
def energy(self, state: np.ndarray = None) -> float:
|
|
112
|
+
state = self.state if state is None else state
|
|
113
|
+
q, qdot = self.split(state, self.ndof)
|
|
114
|
+
p = self._momentum_njit(q, qdot)
|
|
115
|
+
return float(self._hamiltonian_njit(q, p, 0.0))
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@lru_cache(maxsize=32)
|
|
119
|
+
def _bead_on_hoop_engine(R: float, omega: float, g: float) -> LagrangianEngine:
|
|
120
|
+
th, w = sp.symbols("th w")
|
|
121
|
+
Rs, Om, gs = sp.symbols("R Omega g")
|
|
122
|
+
|
|
123
|
+
L = sp.Rational(1, 2) * Rs**2 * (w**2 + Om**2 * sp.sin(th) ** 2) - gs * Rs * (1 - sp.cos(th))
|
|
124
|
+
params = {Rs: R, Om: omega, gs: g}
|
|
125
|
+
return LagrangianEngine([th], [w], L, params=params)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
class BeadOnRotatingHoop(LagrangianSystem):
|
|
129
|
+
"""A bead sliding without friction on a hoop of radius R rotating at
|
|
130
|
+
fixed angular speed Omega about the vertical diameter.
|
|
131
|
+
|
|
132
|
+
Generalized coordinate: q = (theta,), the bead's polar angle on the
|
|
133
|
+
hoop. In the rotating frame the effective Lagrangian is autonomous
|
|
134
|
+
(no explicit time dependence), so the system is a genuine 1-DOF
|
|
135
|
+
conservative Hamiltonian; above the critical speed
|
|
136
|
+
``Omega_c = sqrt(g / R)`` the theta=0 equilibrium becomes unstable
|
|
137
|
+
and two symmetric stable equilibria appear (a pitchfork bifurcation).
|
|
138
|
+
|
|
139
|
+
Parameters
|
|
140
|
+
----------
|
|
141
|
+
theta0, thetadot0 : float
|
|
142
|
+
Initial angle and angular velocity.
|
|
143
|
+
R : float
|
|
144
|
+
Hoop radius.
|
|
145
|
+
omega : float
|
|
146
|
+
Fixed rotation rate ``Omega`` about the vertical diameter.
|
|
147
|
+
g : float
|
|
148
|
+
Gravitational acceleration.
|
|
149
|
+
"""
|
|
150
|
+
|
|
151
|
+
def __init__(self, theta0, thetadot0, R=1.0, omega=2.0, g=9.81):
|
|
152
|
+
self.R, self.omega, self.g = R, omega, g
|
|
153
|
+
self.engine = _bead_on_hoop_engine(R, omega, g)
|
|
154
|
+
self._accel_njit = self.engine.acceleration_njit
|
|
155
|
+
self._momentum_njit = self.engine.momentum_njit
|
|
156
|
+
self._canonical_deriv_njit = self.engine.canonical_deriv_njit
|
|
157
|
+
self._velocity_njit = self.engine.velocity_njit
|
|
158
|
+
self._deriv_njit = self.engine.full_deriv_njit
|
|
159
|
+
self._hamiltonian_njit = self.engine.hamiltonian_njit
|
|
160
|
+
|
|
161
|
+
super().__init__(np.atleast_1d(theta0), np.atleast_1d(thetadot0))
|
|
162
|
+
|
|
163
|
+
def energy(self, state: np.ndarray = None) -> float:
|
|
164
|
+
state = self.state if state is None else state
|
|
165
|
+
q, qdot = self.split(state, self.ndof)
|
|
166
|
+
p = self._momentum_njit(q, qdot)
|
|
167
|
+
return float(self._hamiltonian_njit(q, p, 0.0))
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
@lru_cache(maxsize=32)
|
|
171
|
+
def _elastic_pendulum_engine(m: float, k: float, L0: float, g: float) -> LagrangianEngine:
|
|
172
|
+
s, th, sd, wd = sp.symbols("s th sd wd")
|
|
173
|
+
ms, ks, L0s, gs = sp.symbols("m k L0 g")
|
|
174
|
+
|
|
175
|
+
r = L0s + s
|
|
176
|
+
T = sp.Rational(1, 2) * ms * (sd**2 + r**2 * wd**2)
|
|
177
|
+
V = sp.Rational(1, 2) * ks * s**2 - ms * gs * r * sp.cos(th)
|
|
178
|
+
L = sp.simplify(T - V)
|
|
179
|
+
|
|
180
|
+
params = {ms: m, ks: k, L0s: L0, gs: g}
|
|
181
|
+
return LagrangianEngine([s, th], [sd, wd], L, params=params)
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
class ElasticPendulum(LagrangianSystem):
|
|
185
|
+
"""Spring pendulum: a mass on a Hookean spring that both stretches and
|
|
186
|
+
swings, in 2 DOF.
|
|
187
|
+
|
|
188
|
+
Generalized coordinates q = (s, theta): `s` is the spring's stretch
|
|
189
|
+
beyond its natural length `L0` (so the pivot-to-mass distance is
|
|
190
|
+
``r = L0 + s``), `theta` is the swing angle from the downward
|
|
191
|
+
vertical. Lagrangian:
|
|
192
|
+
|
|
193
|
+
L = (m/2)(sdot^2 + (L0+s)^2 thetadot^2)
|
|
194
|
+
- (k/2) s^2 + m g (L0+s) cos(theta)
|
|
195
|
+
|
|
196
|
+
The ``r^2 thetadot^2`` term is what couples the (otherwise linear)
|
|
197
|
+
stretch and swing motions: whenever the mass swings, its varying
|
|
198
|
+
distance from the pivot pumps the spring, and vice versa. The coupling
|
|
199
|
+
is strongest, and famously resonant, in *1:2 autoparametric resonance*
|
|
200
|
+
-- when the natural stretch frequency ``omega_s = sqrt(k/m)`` is twice
|
|
201
|
+
the natural swing frequency ``omega_theta = sqrt(g/L0)`` -- where
|
|
202
|
+
energy started as pure vertical stretching oscillation periodically
|
|
203
|
+
leaks into, and back out of, swinging. The default parameters below
|
|
204
|
+
satisfy that condition exactly (``k = 4*m*g/L0``).
|
|
205
|
+
|
|
206
|
+
Parameters
|
|
207
|
+
----------
|
|
208
|
+
q0, qdot0 : array-like, shape (2,)
|
|
209
|
+
Initial ``(s, theta)`` and ``(sdot, thetadot)``.
|
|
210
|
+
m : float, default 1.0
|
|
211
|
+
Mass.
|
|
212
|
+
k : float, default 39.24
|
|
213
|
+
Spring constant; the default is ``4*m*g/L0`` for the default
|
|
214
|
+
`m`, `g`, `L0`, i.e. the 1:2 autoparametric resonance condition.
|
|
215
|
+
L0 : float, default 1.0
|
|
216
|
+
Spring natural length.
|
|
217
|
+
g : float, default 9.81
|
|
218
|
+
Gravitational acceleration.
|
|
219
|
+
"""
|
|
220
|
+
|
|
221
|
+
def __init__(self, q0, qdot0, m=1.0, k=39.24, L0=1.0, g=9.81):
|
|
222
|
+
self.m, self.k, self.L0, self.g = m, k, L0, g
|
|
223
|
+
self.engine = _elastic_pendulum_engine(m, k, L0, g)
|
|
224
|
+
self._accel_njit = self.engine.acceleration_njit
|
|
225
|
+
self._momentum_njit = self.engine.momentum_njit
|
|
226
|
+
self._canonical_deriv_njit = self.engine.canonical_deriv_njit
|
|
227
|
+
self._velocity_njit = self.engine.velocity_njit
|
|
228
|
+
self._deriv_njit = self.engine.full_deriv_njit
|
|
229
|
+
self._hamiltonian_njit = self.engine.hamiltonian_njit
|
|
230
|
+
|
|
231
|
+
super().__init__(q0, qdot0)
|
|
232
|
+
|
|
233
|
+
def positions(self, q: np.ndarray = None):
|
|
234
|
+
"""Cartesian (x, y) mass position for a given (s, theta).
|
|
235
|
+
|
|
236
|
+
Parameters
|
|
237
|
+
----------
|
|
238
|
+
q : ndarray, optional
|
|
239
|
+
``(s, theta)``; defaults to the current state.
|
|
240
|
+
|
|
241
|
+
Returns
|
|
242
|
+
-------
|
|
243
|
+
ndarray, shape (2,)
|
|
244
|
+
``(x, y)``.
|
|
245
|
+
"""
|
|
246
|
+
q = self.q if q is None else q
|
|
247
|
+
s, th = q
|
|
248
|
+
r = self.L0 + s
|
|
249
|
+
return np.array([r * np.sin(th), -r * np.cos(th)])
|
|
250
|
+
|
|
251
|
+
def energy(self, state: np.ndarray = None) -> float:
|
|
252
|
+
state = self.state if state is None else state
|
|
253
|
+
q, qdot = self.split(state, self.ndof)
|
|
254
|
+
p = self._momentum_njit(q, qdot)
|
|
255
|
+
return float(self._hamiltonian_njit(q, p, 0.0))
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
@lru_cache(maxsize=32)
|
|
259
|
+
def _coupled_oscillators_engine(n: int, m: float, k: float) -> LagrangianEngine:
|
|
260
|
+
qs = sp.symbols(f"q0:{n}")
|
|
261
|
+
ws = sp.symbols(f"w0:{n}")
|
|
262
|
+
ms, ks = sp.symbols("m k")
|
|
263
|
+
|
|
264
|
+
T = sum(sp.Rational(1, 2) * ms * w**2 for w in ws)
|
|
265
|
+
chain = (0,) + qs + (0,)
|
|
266
|
+
V = sum(sp.Rational(1, 2) * ks * (chain[i + 1] - chain[i]) ** 2 for i in range(n + 1))
|
|
267
|
+
L = sp.simplify(T - V)
|
|
268
|
+
|
|
269
|
+
params = {ms: m, ks: k}
|
|
270
|
+
return LagrangianEngine(list(qs), list(ws), L, params=params)
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
class CoupledOscillators(LagrangianSystem):
|
|
274
|
+
"""A chain of N masses connected by linear springs, both ends fixed
|
|
275
|
+
to immovable walls -- the small-N, harmonic prototype of the larger
|
|
276
|
+
lattice chains in :mod:`physicskit.classical.systems.chains`.
|
|
277
|
+
|
|
278
|
+
Generalized coordinates: q_i = displacement of mass i from
|
|
279
|
+
equilibrium, i = 1..N.
|
|
280
|
+
|
|
281
|
+
Parameters
|
|
282
|
+
----------
|
|
283
|
+
q0, qdot0 : array-like, shape (n,)
|
|
284
|
+
Initial displacements and velocities.
|
|
285
|
+
n : int
|
|
286
|
+
Number of masses.
|
|
287
|
+
m, k : float
|
|
288
|
+
Mass and spring constant (uniform across the chain).
|
|
289
|
+
"""
|
|
290
|
+
|
|
291
|
+
def __init__(self, q0, qdot0, n=3, m=1.0, k=1.0):
|
|
292
|
+
self.n_masses = n
|
|
293
|
+
self.m, self.k = m, k
|
|
294
|
+
self.engine = _coupled_oscillators_engine(n, m, k)
|
|
295
|
+
self._accel_njit = self.engine.acceleration_njit
|
|
296
|
+
self._momentum_njit = self.engine.momentum_njit
|
|
297
|
+
self._canonical_deriv_njit = self.engine.canonical_deriv_njit
|
|
298
|
+
self._velocity_njit = self.engine.velocity_njit
|
|
299
|
+
self._deriv_njit = self.engine.full_deriv_njit
|
|
300
|
+
self._hamiltonian_njit = self.engine.hamiltonian_njit
|
|
301
|
+
|
|
302
|
+
super().__init__(q0, qdot0)
|
|
303
|
+
|
|
304
|
+
def energy(self, state: np.ndarray = None) -> float:
|
|
305
|
+
state = self.state if state is None else state
|
|
306
|
+
q, qdot = self.split(state, self.ndof)
|
|
307
|
+
p = self._momentum_njit(q, qdot)
|
|
308
|
+
return float(self._hamiltonian_njit(q, p, 0.0))
|