universal-physics-tensor 0.5.0 → 0.7.0
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.
- package/README.md +66 -105
- package/dist/bridges/catalog-adapter.d.ts +116 -0
- package/dist/bridges/catalog-adapter.d.ts.map +1 -0
- package/dist/bridges/catalog-adapter.js +302 -0
- package/dist/bridges/catalog-adapter.js.map +1 -0
- package/dist/bridges/equations/_be-helpers.d.ts +145 -0
- package/dist/bridges/equations/_be-helpers.d.ts.map +1 -0
- package/dist/bridges/equations/_be-helpers.js +179 -0
- package/dist/bridges/equations/_be-helpers.js.map +1 -0
- package/dist/bridges/equations/be-11-decoherence-master.d.ts +1 -2
- package/dist/bridges/equations/be-11-decoherence-master.d.ts.map +1 -1
- package/dist/bridges/equations/be-11-decoherence-master.js +9 -20
- package/dist/bridges/equations/be-11-decoherence-master.js.map +1 -1
- package/dist/bridges/equations/be-12-coherence-length.d.ts +7 -1
- package/dist/bridges/equations/be-12-coherence-length.d.ts.map +1 -1
- package/dist/bridges/equations/be-12-coherence-length.js +8 -16
- package/dist/bridges/equations/be-12-coherence-length.js.map +1 -1
- package/dist/bridges/equations/be-13-einstein-trace.d.ts +51 -3
- package/dist/bridges/equations/be-13-einstein-trace.d.ts.map +1 -1
- package/dist/bridges/equations/be-13-einstein-trace.js +74 -17
- package/dist/bridges/equations/be-13-einstein-trace.js.map +1 -1
- package/dist/bridges/equations/be-14-ryu-takayanagi.d.ts +10 -4
- package/dist/bridges/equations/be-14-ryu-takayanagi.d.ts.map +1 -1
- package/dist/bridges/equations/be-14-ryu-takayanagi.js +6 -17
- package/dist/bridges/equations/be-14-ryu-takayanagi.js.map +1 -1
- package/dist/bridges/equations/be-15-emergence.d.ts +7 -1
- package/dist/bridges/equations/be-15-emergence.d.ts.map +1 -1
- package/dist/bridges/equations/be-15-emergence.js +12 -22
- package/dist/bridges/equations/be-15-emergence.js.map +1 -1
- package/dist/bridges/equations/be-16-landauer.d.ts +7 -1
- package/dist/bridges/equations/be-16-landauer.d.ts.map +1 -1
- package/dist/bridges/equations/be-16-landauer.js +5 -13
- package/dist/bridges/equations/be-16-landauer.js.map +1 -1
- package/dist/bridges/equations/be-17-einstein-cartan.d.ts +26 -13
- package/dist/bridges/equations/be-17-einstein-cartan.d.ts.map +1 -1
- package/dist/bridges/equations/be-17-einstein-cartan.js +28 -31
- package/dist/bridges/equations/be-17-einstein-cartan.js.map +1 -1
- package/dist/bridges/equations/be-18-higgs-mass.d.ts +7 -1
- package/dist/bridges/equations/be-18-higgs-mass.d.ts.map +1 -1
- package/dist/bridges/equations/be-18-higgs-mass.js +5 -16
- package/dist/bridges/equations/be-18-higgs-mass.js.map +1 -1
- package/dist/bridges/equations/be-19-quantum-bounce.d.ts +38 -3
- package/dist/bridges/equations/be-19-quantum-bounce.d.ts.map +1 -1
- package/dist/bridges/equations/be-19-quantum-bounce.js +69 -20
- package/dist/bridges/equations/be-19-quantum-bounce.js.map +1 -1
- package/dist/bridges/equations/be-20-vacuum-energy.d.ts +20 -1
- package/dist/bridges/equations/be-20-vacuum-energy.d.ts.map +1 -1
- package/dist/bridges/equations/be-20-vacuum-energy.js +36 -15
- package/dist/bridges/equations/be-20-vacuum-energy.js.map +1 -1
- package/dist/bridges/equations/be-21-kss-bound.d.ts +2 -0
- package/dist/bridges/equations/be-21-kss-bound.d.ts.map +1 -1
- package/dist/bridges/equations/be-21-kss-bound.js +4 -10
- package/dist/bridges/equations/be-21-kss-bound.js.map +1 -1
- package/dist/bridges/equations/be-22-topological-entanglement.d.ts +6 -9
- package/dist/bridges/equations/be-22-topological-entanglement.d.ts.map +1 -1
- package/dist/bridges/equations/be-22-topological-entanglement.js +9 -21
- package/dist/bridges/equations/be-22-topological-entanglement.js.map +1 -1
- package/dist/bridges/equations/be-23-syk-planckian.d.ts +7 -1
- package/dist/bridges/equations/be-23-syk-planckian.d.ts.map +1 -1
- package/dist/bridges/equations/be-23-syk-planckian.js +11 -25
- package/dist/bridges/equations/be-23-syk-planckian.js.map +1 -1
- package/dist/bridges/equations/be-24-foerster-fret.d.ts +7 -1
- package/dist/bridges/equations/be-24-foerster-fret.d.ts.map +1 -1
- package/dist/bridges/equations/be-24-foerster-fret.js +8 -16
- package/dist/bridges/equations/be-24-foerster-fret.js.map +1 -1
- package/dist/bridges/equations/be-25-iit-phi.d.ts +7 -1
- package/dist/bridges/equations/be-25-iit-phi.d.ts.map +1 -1
- package/dist/bridges/equations/be-25-iit-phi.js +12 -16
- package/dist/bridges/equations/be-25-iit-phi.js.map +1 -1
- package/dist/bridges/equations/be-25-orch-or.d.ts +6 -3
- package/dist/bridges/equations/be-25-orch-or.d.ts.map +1 -1
- package/dist/bridges/equations/be-25-orch-or.js +8 -17
- package/dist/bridges/equations/be-25-orch-or.js.map +1 -1
- package/dist/bridges/equations/be-26-dna-tunneling.d.ts +6 -3
- package/dist/bridges/equations/be-26-dna-tunneling.d.ts.map +1 -1
- package/dist/bridges/equations/be-26-dna-tunneling.js +11 -26
- package/dist/bridges/equations/be-26-dna-tunneling.js.map +1 -1
- package/dist/bridges/equations/be-27-effective-temperature.d.ts +7 -1
- package/dist/bridges/equations/be-27-effective-temperature.d.ts.map +1 -1
- package/dist/bridges/equations/be-27-effective-temperature.js +8 -16
- package/dist/bridges/equations/be-27-effective-temperature.js.map +1 -1
- package/dist/bridges/equations/be-28-onsager-entropy-production.d.ts +7 -1
- package/dist/bridges/equations/be-28-onsager-entropy-production.d.ts.map +1 -1
- package/dist/bridges/equations/be-28-onsager-entropy-production.js +9 -13
- package/dist/bridges/equations/be-28-onsager-entropy-production.js.map +1 -1
- package/dist/bridges/equations/be-29-jarzynski.d.ts +7 -1
- package/dist/bridges/equations/be-29-jarzynski.d.ts.map +1 -1
- package/dist/bridges/equations/be-29-jarzynski.js +8 -13
- package/dist/bridges/equations/be-29-jarzynski.js.map +1 -1
- package/dist/bridges/equations/be-30-flm-first-law.d.ts +11 -2
- package/dist/bridges/equations/be-30-flm-first-law.d.ts.map +1 -1
- package/dist/bridges/equations/be-30-flm-first-law.js +10 -21
- package/dist/bridges/equations/be-30-flm-first-law.js.map +1 -1
- package/dist/bridges/equations/be-31-causal-set-bd.d.ts +7 -1
- package/dist/bridges/equations/be-31-causal-set-bd.d.ts.map +1 -1
- package/dist/bridges/equations/be-31-causal-set-bd.js +11 -25
- package/dist/bridges/equations/be-31-causal-set-bd.js.map +1 -1
- package/dist/bridges/equations/be-32-quantum-reference-frame.d.ts +6 -9
- package/dist/bridges/equations/be-32-quantum-reference-frame.d.ts.map +1 -1
- package/dist/bridges/equations/be-32-quantum-reference-frame.js +8 -18
- package/dist/bridges/equations/be-32-quantum-reference-frame.js.map +1 -1
- package/dist/bridges/equations/be-33-hertz-millis.d.ts +53 -28
- package/dist/bridges/equations/be-33-hertz-millis.d.ts.map +1 -1
- package/dist/bridges/equations/be-33-hertz-millis.js +55 -51
- package/dist/bridges/equations/be-33-hertz-millis.js.map +1 -1
- package/dist/bridges/equations/be-34-kibble-zurek.d.ts +6 -3
- package/dist/bridges/equations/be-34-kibble-zurek.d.ts.map +1 -1
- package/dist/bridges/equations/be-34-kibble-zurek.js +15 -26
- package/dist/bridges/equations/be-34-kibble-zurek.js.map +1 -1
- package/dist/bridges/equations/be-35-conformal-bootstrap.d.ts +6 -9
- package/dist/bridges/equations/be-35-conformal-bootstrap.d.ts.map +1 -1
- package/dist/bridges/equations/be-35-conformal-bootstrap.js +9 -21
- package/dist/bridges/equations/be-35-conformal-bootstrap.js.map +1 -1
- package/dist/bridges/equations/be-36-gw-speed-bound.d.ts +7 -1
- package/dist/bridges/equations/be-36-gw-speed-bound.d.ts.map +1 -1
- package/dist/bridges/equations/be-36-gw-speed-bound.js +5 -13
- package/dist/bridges/equations/be-36-gw-speed-bound.js.map +1 -1
- package/dist/bridges/equations/be-37-shapiro-delay.d.ts +4 -2
- package/dist/bridges/equations/be-37-shapiro-delay.d.ts.map +1 -1
- package/dist/bridges/equations/be-37-shapiro-delay.js +22 -37
- package/dist/bridges/equations/be-37-shapiro-delay.js.map +1 -1
- package/dist/bridges/equations/be-38-mond.d.ts +7 -1
- package/dist/bridges/equations/be-38-mond.d.ts.map +1 -1
- package/dist/bridges/equations/be-38-mond.js +9 -19
- package/dist/bridges/equations/be-38-mond.js.map +1 -1
- package/dist/bridges/equations/be-39-asymptotic-safety.d.ts +66 -2
- package/dist/bridges/equations/be-39-asymptotic-safety.d.ts.map +1 -1
- package/dist/bridges/equations/be-39-asymptotic-safety.js +128 -20
- package/dist/bridges/equations/be-39-asymptotic-safety.js.map +1 -1
- package/dist/bridges/equations/be-40-composite-higgs.d.ts +7 -1
- package/dist/bridges/equations/be-40-composite-higgs.d.ts.map +1 -1
- package/dist/bridges/equations/be-40-composite-higgs.js +10 -22
- package/dist/bridges/equations/be-40-composite-higgs.js.map +1 -1
- package/dist/bridges/equations/be-41-swampland.d.ts +6 -3
- package/dist/bridges/equations/be-41-swampland.d.ts.map +1 -1
- package/dist/bridges/equations/be-41-swampland.js +11 -23
- package/dist/bridges/equations/be-41-swampland.js.map +1 -1
- package/dist/bridges/equations/be-42-hawking-temperature.d.ts +2 -0
- package/dist/bridges/equations/be-42-hawking-temperature.d.ts.map +1 -1
- package/dist/bridges/equations/be-42-hawking-temperature.js +5 -13
- package/dist/bridges/equations/be-42-hawking-temperature.js.map +1 -1
- package/dist/bridges/equations/be-43-er-epr.d.ts +7 -1
- package/dist/bridges/equations/be-43-er-epr.d.ts.map +1 -1
- package/dist/bridges/equations/be-43-er-epr.js +5 -13
- package/dist/bridges/equations/be-43-er-epr.js.map +1 -1
- package/dist/bridges/equations/be-44-soft-hair.d.ts +7 -1
- package/dist/bridges/equations/be-44-soft-hair.d.ts.map +1 -1
- package/dist/bridges/equations/be-44-soft-hair.js +5 -13
- package/dist/bridges/equations/be-44-soft-hair.js.map +1 -1
- package/dist/bridges/equations/be-45-tcc.d.ts +7 -1
- package/dist/bridges/equations/be-45-tcc.d.ts.map +1 -1
- package/dist/bridges/equations/be-45-tcc.js +10 -22
- package/dist/bridges/equations/be-45-tcc.js.map +1 -1
- package/dist/bridges/equations/be-46-multiverse-measure.d.ts +7 -1
- package/dist/bridges/equations/be-46-multiverse-measure.d.ts.map +1 -1
- package/dist/bridges/equations/be-46-multiverse-measure.js +9 -19
- package/dist/bridges/equations/be-46-multiverse-measure.js.map +1 -1
- package/dist/bridges/equations/be-47-bbn-dark-sector.d.ts +7 -1
- package/dist/bridges/equations/be-47-bbn-dark-sector.d.ts.map +1 -1
- package/dist/bridges/equations/be-47-bbn-dark-sector.js +14 -16
- package/dist/bridges/equations/be-47-bbn-dark-sector.js.map +1 -1
- package/dist/bridges/equations/be-48-grw-localization.d.ts +7 -1
- package/dist/bridges/equations/be-48-grw-localization.d.ts.map +1 -1
- package/dist/bridges/equations/be-48-grw-localization.js +15 -20
- package/dist/bridges/equations/be-48-grw-localization.js.map +1 -1
- package/dist/bridges/equations/be-49-quantum-darwinism.d.ts +7 -1
- package/dist/bridges/equations/be-49-quantum-darwinism.d.ts.map +1 -1
- package/dist/bridges/equations/be-49-quantum-darwinism.js +10 -22
- package/dist/bridges/equations/be-49-quantum-darwinism.js.map +1 -1
- package/dist/bridges/equations/be-50-wheeler-feynman.d.ts +42 -12
- package/dist/bridges/equations/be-50-wheeler-feynman.d.ts.map +1 -1
- package/dist/bridges/equations/be-50-wheeler-feynman.js +84 -20
- package/dist/bridges/equations/be-50-wheeler-feynman.js.map +1 -1
- package/dist/bridges/equations/be-53-yang-mills-beta.d.ts +158 -0
- package/dist/bridges/equations/be-53-yang-mills-beta.d.ts.map +1 -0
- package/dist/bridges/equations/be-53-yang-mills-beta.js +175 -0
- package/dist/bridges/equations/be-53-yang-mills-beta.js.map +1 -0
- package/dist/bridges/equations/be-54-randall-sundrum-brane.d.ts +117 -0
- package/dist/bridges/equations/be-54-randall-sundrum-brane.d.ts.map +1 -0
- package/dist/bridges/equations/be-54-randall-sundrum-brane.js +213 -0
- package/dist/bridges/equations/be-54-randall-sundrum-brane.js.map +1 -0
- package/dist/bridges/gravitational-lensing.d.ts +13 -2
- package/dist/bridges/gravitational-lensing.d.ts.map +1 -1
- package/dist/bridges/gravitational-lensing.js +17 -6
- package/dist/bridges/gravitational-lensing.js.map +1 -1
- package/dist/bridges/index.d.ts +40 -1
- package/dist/bridges/index.d.ts.map +1 -1
- package/dist/bridges/index.js +130 -48
- package/dist/bridges/index.js.map +1 -1
- package/dist/bridges/perihelion-precession-labeled.d.ts +46 -0
- package/dist/bridges/perihelion-precession-labeled.d.ts.map +1 -0
- package/dist/bridges/perihelion-precession-labeled.js +54 -0
- package/dist/bridges/perihelion-precession-labeled.js.map +1 -0
- package/dist/bridges/perihelion-precession.d.ts +18 -3
- package/dist/bridges/perihelion-precession.d.ts.map +1 -1
- package/dist/bridges/perihelion-precession.js +22 -8
- package/dist/bridges/perihelion-precession.js.map +1 -1
- package/dist/core/axes-registry.d.ts +67 -0
- package/dist/core/axes-registry.d.ts.map +1 -0
- package/dist/core/axes-registry.js +75 -0
- package/dist/core/axes-registry.js.map +1 -0
- package/dist/core/cell.d.ts +176 -0
- package/dist/core/cell.d.ts.map +1 -0
- package/dist/core/cell.js +166 -0
- package/dist/core/cell.js.map +1 -0
- package/dist/core/constants.d.ts +50 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +50 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/flux-rules.d.ts +176 -0
- package/dist/core/flux-rules.d.ts.map +1 -0
- package/dist/core/flux-rules.js +329 -0
- package/dist/core/flux-rules.js.map +1 -0
- package/dist/core/labeled-tensor.d.ts +143 -0
- package/dist/core/labeled-tensor.d.ts.map +1 -0
- package/dist/core/labeled-tensor.js +275 -0
- package/dist/core/labeled-tensor.js.map +1 -0
- package/dist/core/regime-registry.d.ts +169 -0
- package/dist/core/regime-registry.d.ts.map +1 -0
- package/dist/core/regime-registry.js +174 -0
- package/dist/core/regime-registry.js.map +1 -0
- package/dist/core/regime-rule-install.d.ts +26 -0
- package/dist/core/regime-rule-install.d.ts.map +1 -0
- package/dist/core/regime-rule-install.js +90 -0
- package/dist/core/regime-rule-install.js.map +1 -0
- package/dist/core/regimes-builtins.d.ts +22 -0
- package/dist/core/regimes-builtins.d.ts.map +1 -0
- package/dist/core/regimes-builtins.js +96 -0
- package/dist/core/regimes-builtins.js.map +1 -0
- package/dist/core/tensor.d.ts +112 -0
- package/dist/core/tensor.d.ts.map +1 -1
- package/dist/core/tensor.js +366 -0
- package/dist/core/tensor.js.map +1 -1
- package/dist/core/types.d.ts +7 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/universal-index.d.ts +97 -0
- package/dist/core/universal-index.d.ts.map +1 -0
- package/dist/core/universal-index.js +70 -0
- package/dist/core/universal-index.js.map +1 -0
- package/dist/diff/bridge-gradient.d.ts +94 -0
- package/dist/diff/bridge-gradient.d.ts.map +1 -0
- package/dist/diff/bridge-gradient.js +83 -0
- package/dist/diff/bridge-gradient.js.map +1 -0
- package/dist/diff/bridge-specs.d.ts +68 -0
- package/dist/diff/bridge-specs.d.ts.map +1 -0
- package/dist/diff/bridge-specs.js +96 -0
- package/dist/diff/bridge-specs.js.map +1 -0
- package/dist/dimensional/bridge-check.d.ts.map +1 -1
- package/dist/dimensional/bridge-check.js +8 -0
- package/dist/dimensional/bridge-check.js.map +1 -1
- package/dist/dimensional/connection-validators.d.ts +13 -6
- package/dist/dimensional/connection-validators.d.ts.map +1 -1
- package/dist/dimensional/connection-validators.js +1 -1
- package/dist/dimensional/connection-validators.js.map +1 -1
- package/dist/dimensional/curvature-composite.d.ts +90 -0
- package/dist/dimensional/curvature-composite.d.ts.map +1 -0
- package/dist/dimensional/curvature-composite.js +57 -0
- package/dist/dimensional/curvature-composite.js.map +1 -0
- package/dist/dimensional/curvature-invariants.d.ts +90 -0
- package/dist/dimensional/curvature-invariants.d.ts.map +1 -0
- package/dist/dimensional/curvature-invariants.js +64 -0
- package/dist/dimensional/curvature-invariants.js.map +1 -0
- package/dist/dimensional/curvature.d.ts +82 -41
- package/dist/dimensional/curvature.d.ts.map +1 -1
- package/dist/dimensional/curvature.js +19 -11
- package/dist/dimensional/curvature.js.map +1 -1
- package/dist/dimensional/einstein-equation.d.ts +126 -0
- package/dist/dimensional/einstein-equation.d.ts.map +1 -0
- package/dist/dimensional/einstein-equation.js +122 -0
- package/dist/dimensional/einstein-equation.js.map +1 -0
- package/dist/dimensional/field-equation-helpers.d.ts +82 -0
- package/dist/dimensional/field-equation-helpers.d.ts.map +1 -0
- package/dist/dimensional/field-equation-helpers.js +123 -0
- package/dist/dimensional/field-equation-helpers.js.map +1 -0
- package/dist/dimensional/friedmann-equation.d.ts +148 -0
- package/dist/dimensional/friedmann-equation.d.ts.map +1 -0
- package/dist/dimensional/friedmann-equation.js +150 -0
- package/dist/dimensional/friedmann-equation.js.map +1 -0
- package/dist/dimensional/gauge-field.d.ts +182 -0
- package/dist/dimensional/gauge-field.d.ts.map +1 -0
- package/dist/dimensional/gauge-field.js +134 -0
- package/dist/dimensional/gauge-field.js.map +1 -0
- package/dist/dimensional/killing-validators.d.ts +94 -0
- package/dist/dimensional/killing-validators.d.ts.map +1 -0
- package/dist/dimensional/killing-validators.js +66 -0
- package/dist/dimensional/killing-validators.js.map +1 -0
- package/dist/dimensional/klein-gordon-equation.d.ts +113 -0
- package/dist/dimensional/klein-gordon-equation.d.ts.map +1 -0
- package/dist/dimensional/klein-gordon-equation.js +98 -0
- package/dist/dimensional/klein-gordon-equation.js.map +1 -0
- package/dist/dimensional/rg-flow.d.ts +156 -0
- package/dist/dimensional/rg-flow.d.ts.map +1 -0
- package/dist/dimensional/rg-flow.js +150 -0
- package/dist/dimensional/rg-flow.js.map +1 -0
- package/dist/dimensional/stress-energy-validators.d.ts +74 -0
- package/dist/dimensional/stress-energy-validators.d.ts.map +1 -0
- package/dist/dimensional/stress-energy-validators.js +47 -0
- package/dist/dimensional/stress-energy-validators.js.map +1 -0
- package/dist/dimensional/tensor-trace.d.ts +128 -0
- package/dist/dimensional/tensor-trace.d.ts.map +1 -0
- package/dist/dimensional/tensor-trace.js +95 -0
- package/dist/dimensional/tensor-trace.js.map +1 -0
- package/dist/dimensional/tensor.d.ts +6 -8
- package/dist/dimensional/tensor.d.ts.map +1 -1
- package/dist/dimensional/tensor.js +3 -1
- package/dist/dimensional/tensor.js.map +1 -1
- package/dist/dimensional/validator-registry.d.ts +90 -0
- package/dist/dimensional/validator-registry.d.ts.map +1 -0
- package/dist/dimensional/validator-registry.js +131 -0
- package/dist/dimensional/validator-registry.js.map +1 -0
- package/dist/dimensional/validator.d.ts +12 -2
- package/dist/dimensional/validator.d.ts.map +1 -1
- package/dist/dimensional/validator.js +60 -75
- package/dist/dimensional/validator.js.map +1 -1
- package/dist/dimensional/weyl-validators.d.ts +84 -0
- package/dist/dimensional/weyl-validators.d.ts.map +1 -0
- package/dist/dimensional/weyl-validators.js +84 -0
- package/dist/dimensional/weyl-validators.js.map +1 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -1
- package/dist/numerical/be37-covariant-eikonal.d.ts +37 -2
- package/dist/numerical/be37-covariant-eikonal.d.ts.map +1 -1
- package/dist/numerical/be37-covariant-eikonal.js +51 -14
- package/dist/numerical/be37-covariant-eikonal.js.map +1 -1
- package/dist/numerical/christoffel-flat.d.ts +49 -0
- package/dist/numerical/christoffel-flat.d.ts.map +1 -0
- package/dist/numerical/christoffel-flat.js +86 -0
- package/dist/numerical/christoffel-flat.js.map +1 -0
- package/dist/numerical/curvature-lowering-helpers.d.ts +76 -57
- package/dist/numerical/curvature-lowering-helpers.d.ts.map +1 -1
- package/dist/numerical/curvature-lowering-helpers.js +203 -64
- package/dist/numerical/curvature-lowering-helpers.js.map +1 -1
- package/dist/numerical/derivative-lowering.d.ts +67 -0
- package/dist/numerical/derivative-lowering.d.ts.map +1 -0
- package/dist/numerical/derivative-lowering.js +243 -0
- package/dist/numerical/derivative-lowering.js.map +1 -0
- package/dist/numerical/einstein-equation.d.ts +106 -0
- package/dist/numerical/einstein-equation.d.ts.map +1 -0
- package/dist/numerical/einstein-equation.js +172 -0
- package/dist/numerical/einstein-equation.js.map +1 -0
- package/dist/numerical/engine-registry.js +4 -4
- package/dist/numerical/engine-registry.js.map +1 -1
- package/dist/numerical/geodesic-integrator.d.ts +7 -4
- package/dist/numerical/geodesic-integrator.d.ts.map +1 -1
- package/dist/numerical/geodesic-integrator.js +5 -1
- package/dist/numerical/geodesic-integrator.js.map +1 -1
- package/dist/numerical/gl4-integrator.d.ts +57 -9
- package/dist/numerical/gl4-integrator.d.ts.map +1 -1
- package/dist/numerical/gl4-integrator.js +63 -16
- package/dist/numerical/gl4-integrator.js.map +1 -1
- package/dist/numerical/killing.d.ts +157 -0
- package/dist/numerical/killing.d.ts.map +1 -0
- package/dist/numerical/killing.js +242 -0
- package/dist/numerical/killing.js.map +1 -0
- package/dist/numerical/kretschmann.d.ts +62 -0
- package/dist/numerical/kretschmann.d.ts.map +1 -0
- package/dist/numerical/kretschmann.js +88 -0
- package/dist/numerical/kretschmann.js.map +1 -0
- package/dist/numerical/lowering-utils.d.ts +47 -0
- package/dist/numerical/lowering-utils.d.ts.map +1 -0
- package/dist/numerical/lowering-utils.js +64 -0
- package/dist/numerical/lowering-utils.js.map +1 -0
- package/dist/numerical/lowering.d.ts +1 -29
- package/dist/numerical/lowering.d.ts.map +1 -1
- package/dist/numerical/lowering.js +226 -415
- package/dist/numerical/lowering.js.map +1 -1
- package/dist/numerical/mathts-engine.js +8 -8
- package/dist/numerical/mathts-engine.js.map +1 -1
- package/dist/numerical/metric-inverse.d.ts.map +1 -1
- package/dist/numerical/metric-inverse.js +28 -0
- package/dist/numerical/metric-inverse.js.map +1 -1
- package/dist/numerical/null-ic.d.ts +40 -0
- package/dist/numerical/null-ic.d.ts.map +1 -0
- package/dist/numerical/null-ic.js +50 -0
- package/dist/numerical/null-ic.js.map +1 -0
- package/dist/numerical/null-ray-integrator.d.ts +3 -2
- package/dist/numerical/null-ray-integrator.d.ts.map +1 -1
- package/dist/numerical/null-ray-integrator.js +6 -3
- package/dist/numerical/null-ray-integrator.js.map +1 -1
- package/dist/numerical/painleve-gullstrand-metric.d.ts +74 -0
- package/dist/numerical/painleve-gullstrand-metric.d.ts.map +1 -0
- package/dist/numerical/painleve-gullstrand-metric.js +121 -0
- package/dist/numerical/painleve-gullstrand-metric.js.map +1 -0
- package/dist/numerical/pderiv.d.ts +35 -3
- package/dist/numerical/pderiv.d.ts.map +1 -1
- package/dist/numerical/pderiv.js +47 -12
- package/dist/numerical/pderiv.js.map +1 -1
- package/dist/numerical/perihelion-finder.d.ts +57 -0
- package/dist/numerical/perihelion-finder.d.ts.map +1 -1
- package/dist/numerical/perihelion-finder.js +57 -0
- package/dist/numerical/perihelion-finder.js.map +1 -1
- package/dist/numerical/tensor-engine.d.ts +2 -2
- package/dist/numerical/tensor-engine.d.ts.map +1 -1
- package/dist/numerical/weyl-lowering.d.ts +60 -0
- package/dist/numerical/weyl-lowering.d.ts.map +1 -0
- package/dist/numerical/weyl-lowering.js +111 -0
- package/dist/numerical/weyl-lowering.js.map +1 -0
- package/package.json +9 -7
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derivative-arm lowering — extracted from `lowering.ts`'s switch
|
|
3
|
+
* to close the v0.6.1 sprint-target LOC miss (903 vs ≤890).
|
|
4
|
+
*
|
|
5
|
+
* Exports two pure functions:
|
|
6
|
+
* - `lowerTensorPartialDerivative` (∂_μ over tensor-symbol or
|
|
7
|
+
* metric-tensor `of` operands, three numericalForm strategies)
|
|
8
|
+
* - `lowerCovariantDerivative` (∇_μ over tensor-symbol or
|
|
9
|
+
* metric-tensor `of`; sign rule applied per free index)
|
|
10
|
+
*
|
|
11
|
+
* Both functions take a `recur` thunk for the recursive `lowerNode`
|
|
12
|
+
* call (the covariant-derivative arm needs it twice, once to lower
|
|
13
|
+
* the `of` operand and once to lower a synthesized
|
|
14
|
+
* `tensor-partial-derivative` for the partial component of ∇).
|
|
15
|
+
* Threading the recursion via parameter avoids a forward-import
|
|
16
|
+
* cycle between this module and `lowering.ts`.
|
|
17
|
+
*
|
|
18
|
+
* @module numerical/derivative-lowering
|
|
19
|
+
*/
|
|
20
|
+
import { validate } from '../dimensional/validator.js';
|
|
21
|
+
import { pderivGrid, pderivNumericalFn, pderivSymbolic } from './pderiv.js';
|
|
22
|
+
import { NumericalBackendError } from './errors.js';
|
|
23
|
+
import { zeroTensor, zeroTensorLike, flatToNested, tensorAdd, tensorAddScaled, computeChristoffelTensor, contractChristoffelWithOperand, getMetricDerivFlat, } from './connection-lowering-helpers.js';
|
|
24
|
+
import { isMetricTensorNode, dimensionOf, requireValue, flattenNestedArray, } from './lowering-utils.js';
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// tensor-partial-derivative arm
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
/**
|
|
29
|
+
* Lower a `tensor-partial-derivative` node (∂_μ over an `of` operand).
|
|
30
|
+
*
|
|
31
|
+
* v0.3.5/v0.4.0 scope: `of` is a tensor-symbol or metric-tensor.
|
|
32
|
+
* ∂_μ(of) adds the wrtIndex as a trailing axis — the result shape is
|
|
33
|
+
* [...ofShape, N], NOT ofShape. (For BE-37, `of` = the scalar S is
|
|
34
|
+
* rank-0, so ∂_μ S is the rank-1 wave covector k_μ, shape [N].)
|
|
35
|
+
*
|
|
36
|
+
* Three numericalForm dispatches: 'symbolic' (caller-supplied
|
|
37
|
+
* derivatives map), 'numerical-fn' (rank-0 scalar field, all-axes
|
|
38
|
+
* stack), 'grid' (sampled derivative field).
|
|
39
|
+
*
|
|
40
|
+
* @internal
|
|
41
|
+
*/
|
|
42
|
+
export function lowerTensorPartialDerivative(node, inputs, engine) {
|
|
43
|
+
const of = node.of;
|
|
44
|
+
// v0.4.0 extension: metric-tensor pderiv dispatch.
|
|
45
|
+
if (of.kind === 'metric-tensor') {
|
|
46
|
+
const mNode = of;
|
|
47
|
+
const strategy = mNode.derivativeStrategy ?? 'computed';
|
|
48
|
+
const N = dimensionOf(inputs);
|
|
49
|
+
const coordLabel = node.wrtIndex.label;
|
|
50
|
+
const ofShape = mNode.indices.map(() => N);
|
|
51
|
+
const resultShape = [...ofShape, N];
|
|
52
|
+
if (strategy === 'zero') {
|
|
53
|
+
// ∂g = 0 everywhere (constant/flat metric).
|
|
54
|
+
return zeroTensor(resultShape, engine);
|
|
55
|
+
}
|
|
56
|
+
if (strategy === 'supplied') {
|
|
57
|
+
// Look up the N slices ∂_mu g for mu=0..N-1 and stack them as the
|
|
58
|
+
// trailing axis. Key format: `${metricName}/${coordLabel}_${mu}`.
|
|
59
|
+
const size = resultShape.reduce((a, b) => a * b, 1);
|
|
60
|
+
const flat = new Array(size).fill(0);
|
|
61
|
+
for (let mu = 0; mu < N; mu++) {
|
|
62
|
+
const key = `${mNode.name}/${coordLabel}_${mu}`;
|
|
63
|
+
const slice = inputs.metricDerivatives?.get(key);
|
|
64
|
+
if (slice === undefined) {
|
|
65
|
+
throw new NumericalBackendError(`lowering: metric-tensor pderiv with strategy='supplied': ` +
|
|
66
|
+
`no metricDerivatives entry for "${key}"`);
|
|
67
|
+
}
|
|
68
|
+
const flatSlice = flattenNestedArray(slice, N * N);
|
|
69
|
+
for (let ij = 0; ij < N * N; ij++) {
|
|
70
|
+
flat[ij * N + mu] = flatSlice[ij];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return engine.fromNested(flatToNested(flat, resultShape), resultShape);
|
|
74
|
+
}
|
|
75
|
+
// strategy === 'computed': constant-tensor metrics carry no
|
|
76
|
+
// coordinate dependence — ∂_μ g = 0.
|
|
77
|
+
return zeroTensor(resultShape, engine);
|
|
78
|
+
}
|
|
79
|
+
if (of.kind !== 'tensor-symbol') {
|
|
80
|
+
throw new NumericalBackendError(`lowering: tensor-partial-derivative numerical eval requires a tensor-symbol `
|
|
81
|
+
+ `or metric-tensor 'of' operand in v0.3.5/v0.4.0 — got '${of.kind}'`);
|
|
82
|
+
}
|
|
83
|
+
const sym = of;
|
|
84
|
+
const form = sym.numericalForm ?? 'symbolic';
|
|
85
|
+
const coordLabel = node.wrtIndex.label;
|
|
86
|
+
const N = dimensionOf(inputs);
|
|
87
|
+
const ofShape = sym.indices.map(() => N);
|
|
88
|
+
const resultShape = [...ofShape, N];
|
|
89
|
+
if (form === 'symbolic') {
|
|
90
|
+
const d = pderivSymbolic(sym.name, coordLabel, inputs.derivatives ?? new Map());
|
|
91
|
+
return engine.fromNested(d, resultShape);
|
|
92
|
+
}
|
|
93
|
+
if (form === 'numerical-fn') {
|
|
94
|
+
// 'numerical-fn' lowering is scoped to a rank-0 `of` (scalar
|
|
95
|
+
// field). ∂_μ ranges over all N coordinate axes — stack the N
|
|
96
|
+
// single-axis derivatives into the rank-1 result.
|
|
97
|
+
if (ofShape.length !== 0) {
|
|
98
|
+
throw new NumericalBackendError(`lowering: 'numerical-fn' pderiv lowering supports a rank-0 'of' in v0.3.5; `
|
|
99
|
+
+ `"${sym.name}" is rank ${ofShape.length}`);
|
|
100
|
+
}
|
|
101
|
+
const fn = inputs.fields?.get(sym.name);
|
|
102
|
+
if (!fn) {
|
|
103
|
+
throw new NumericalBackendError(`lowering: 'numerical-fn' tensor-symbol "${sym.name}" has no field fn in inputs.fields`);
|
|
104
|
+
}
|
|
105
|
+
const coordValues = inputs.coords ? [...inputs.coords.values()] : [];
|
|
106
|
+
const components = [];
|
|
107
|
+
for (let axis = 0; axis < N; axis++) {
|
|
108
|
+
components.push(pderivNumericalFn(fn, coordValues, axis));
|
|
109
|
+
}
|
|
110
|
+
return engine.fromNested(components, [N]);
|
|
111
|
+
}
|
|
112
|
+
// form === 'grid': the GridField is sampled over space and
|
|
113
|
+
// pderivGrid returns the derivative field sampled on that grid.
|
|
114
|
+
const grid = inputs.grids?.get(sym.name);
|
|
115
|
+
if (!grid) {
|
|
116
|
+
throw new NumericalBackendError(`lowering: 'grid' tensor-symbol "${sym.name}" has no GridField in inputs.grids`);
|
|
117
|
+
}
|
|
118
|
+
const gridAxis = inputs.coords ? [...inputs.coords.keys()].indexOf(coordLabel) : 0;
|
|
119
|
+
const flat = pderivGrid(grid, gridAxis < 0 ? 0 : gridAxis);
|
|
120
|
+
return engine.fromNested(flat.length === 1 ? flat[0] : flat, grid.shape);
|
|
121
|
+
}
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
// covariant-derivative arm
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
/**
|
|
126
|
+
* Lower a `covariant-derivative` node (∇_μ over an `of` operand).
|
|
127
|
+
*
|
|
128
|
+
* Calls `recur` to lower the `of` subtree and a synthesized
|
|
129
|
+
* `tensor-partial-derivative` (the ∂ component of ∇). The Christoffel
|
|
130
|
+
* correction (Γ^α_{μν} sign rule per free index of `of`) builds on
|
|
131
|
+
* the metric-derivative data supplied via `inputs.metricDerivatives`.
|
|
132
|
+
*
|
|
133
|
+
* v0.4.0 contract: `of.derivativeStrategy === 'zero'` short-circuits
|
|
134
|
+
* to a zero result. `'computed'` on a raw-tensor metric reduces to
|
|
135
|
+
* the partial only (constant metric → Γ = 0). `'supplied'` invokes
|
|
136
|
+
* the full Christoffel pipeline.
|
|
137
|
+
*
|
|
138
|
+
* @internal
|
|
139
|
+
*/
|
|
140
|
+
export function lowerCovariantDerivative(node, inputs, engine, recur) {
|
|
141
|
+
// S2(a) fix: `of.freeIndices` does NOT exist on the raw ExprNode.
|
|
142
|
+
// Re-validate the `of` subtree to obtain its free-index structure.
|
|
143
|
+
const covNode = node;
|
|
144
|
+
const ofExpr = covNode.of;
|
|
145
|
+
// TS-2 runtime guard: `covNode.of` is typed as `unknown` (module-cycle
|
|
146
|
+
// prevents ExprNode import in connection-validators.ts). A malformed
|
|
147
|
+
// AST bypassing validate() would produce a cryptic TypeError at
|
|
148
|
+
// `ofExpr.kind` below. Throw a clear message now.
|
|
149
|
+
if (typeof ofExpr.kind !== 'string') {
|
|
150
|
+
throw new NumericalBackendError(`lowering: CovariantDerivativeNode.of must have a string 'kind' field ` +
|
|
151
|
+
`(got ${JSON.stringify(ofExpr.kind)}). ` +
|
|
152
|
+
`Always call validate() before evaluateNumericalRaw().`);
|
|
153
|
+
}
|
|
154
|
+
const ofValidation = validate(ofExpr);
|
|
155
|
+
// Build ordered list of free indices: [{label, variance, pos}].
|
|
156
|
+
const ofFreeIndices = [];
|
|
157
|
+
const ofIndices = ofExpr.indices;
|
|
158
|
+
if (ofIndices) {
|
|
159
|
+
for (const idx of ofIndices) {
|
|
160
|
+
const counts = ofValidation.freeIndices.get(idx.label);
|
|
161
|
+
if (counts === undefined)
|
|
162
|
+
continue; // contracted — not a free axis
|
|
163
|
+
ofFreeIndices.push({
|
|
164
|
+
label: idx.label,
|
|
165
|
+
variance: idx.variance,
|
|
166
|
+
pos: ofFreeIndices.length,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
// Fallback for future of-kinds without .indices.
|
|
172
|
+
let axisPos = 0;
|
|
173
|
+
for (const [label, counts] of ofValidation.freeIndices) {
|
|
174
|
+
for (let i = 0; i < counts.upper; i++) {
|
|
175
|
+
ofFreeIndices.push({ label, variance: 'upper', pos: axisPos++ });
|
|
176
|
+
}
|
|
177
|
+
for (let i = 0; i < counts.lower; i++) {
|
|
178
|
+
ofFreeIndices.push({ label, variance: 'lower', pos: axisPos++ });
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Lower the operand tensor via the injected recur thunk.
|
|
183
|
+
const ofTensor = recur(ofExpr, inputs, engine);
|
|
184
|
+
const N = dimensionOf(inputs);
|
|
185
|
+
// TS-2 runtime guard: gLower must be a metric-tensor node.
|
|
186
|
+
if (!isMetricTensorNode(covNode.gLower)) {
|
|
187
|
+
throw new NumericalBackendError(`lowering: CovariantDerivativeNode.gLower must be a metric-tensor node ` +
|
|
188
|
+
`(got kind='${covNode.gLower.kind}')`);
|
|
189
|
+
}
|
|
190
|
+
const strategy = covNode.gLower.derivativeStrategy ?? 'computed';
|
|
191
|
+
// S2(b): strategy='zero' → flat space, Γ=0, ∇_μ T = ∂_μ T.
|
|
192
|
+
// For constant tensors ∂_μ T = 0, result is zero of shape [...ofShape, N].
|
|
193
|
+
if (strategy === 'zero') {
|
|
194
|
+
const outShape = [...ofTensor.shape, N];
|
|
195
|
+
return zeroTensor(outShape, engine);
|
|
196
|
+
}
|
|
197
|
+
// v0.4.0 CRITICAL FIX (Finding #1): 'computed' on a raw-tensor metric means
|
|
198
|
+
// constant metric → Γ = 0 → covariant-derivative = partial only.
|
|
199
|
+
// This early return MUST come before Christoffel construction.
|
|
200
|
+
if (ofExpr.kind !== 'tensor-symbol' && ofExpr.kind !== 'metric-tensor') {
|
|
201
|
+
throw new NumericalBackendError(`lowering: covariant-derivative 'of' must be tensor-symbol or metric-tensor ` +
|
|
202
|
+
`(got '${ofExpr.kind}') — validated nodes cannot reach this point`);
|
|
203
|
+
}
|
|
204
|
+
const pdNode = {
|
|
205
|
+
kind: 'tensor-partial-derivative',
|
|
206
|
+
of: ofExpr,
|
|
207
|
+
wrt: covNode.wrt,
|
|
208
|
+
wrtIndex: covNode.wrtIndex,
|
|
209
|
+
};
|
|
210
|
+
const partial = recur(pdNode, inputs, engine);
|
|
211
|
+
if (strategy === 'computed') {
|
|
212
|
+
return partial;
|
|
213
|
+
}
|
|
214
|
+
// S2(c) + S2(d): Build Γ^α_{μν} from metric data and apply
|
|
215
|
+
// the sign rule to all free indices of `of`:
|
|
216
|
+
// ∇_μ T^α_β = ∂_μ T^α_β + Γ^α_{μλ} T^λ_β − Γ^λ_{μβ} T^α_λ
|
|
217
|
+
if (ofFreeIndices.length === 0) {
|
|
218
|
+
return partial;
|
|
219
|
+
}
|
|
220
|
+
// gLower narrowed to MetricTensorNode by the predicate above (TS-2).
|
|
221
|
+
const gLowerNode = covNode.gLower;
|
|
222
|
+
const gInverseNode = covNode.gInverse;
|
|
223
|
+
const gInverseData = flattenNestedArray(requireValue(gInverseNode.name, inputs), N * N);
|
|
224
|
+
const coordLabel = covNode.wrtIndex.label;
|
|
225
|
+
// getMetricDeriv(mu): returns flat [N*N] of ∂_{mu} g.
|
|
226
|
+
// 'supplied' strategy is the only remaining possibility here.
|
|
227
|
+
const getMetricDeriv = (mu) => getMetricDerivFlat(gLowerNode.name, coordLabel, mu, 'supplied', N, inputs.metricDerivatives);
|
|
228
|
+
// Compute Γ^α_{μν} from metric data.
|
|
229
|
+
const GammaTensor = computeChristoffelTensor(gInverseData, getMetricDeriv, N, engine);
|
|
230
|
+
const GammaFlat = flattenNestedArray(engine.toNested(GammaTensor), N * N * N);
|
|
231
|
+
// Apply the Christoffel correction for each free index of `of`.
|
|
232
|
+
// S2(d) sign rule: upper → +Γ, lower → −Γ.
|
|
233
|
+
const ofFlat = flattenNestedArray(engine.toNested(ofTensor), ofTensor.shape.reduce((a, b) => a * b, 1));
|
|
234
|
+
const ofShapeArr = [...ofTensor.shape];
|
|
235
|
+
let correction = zeroTensorLike(partial, engine);
|
|
236
|
+
for (const freeIdx of ofFreeIndices) {
|
|
237
|
+
const term = contractChristoffelWithOperand(GammaFlat, ofFlat, ofShapeArr, freeIdx.pos, freeIdx.variance, N, engine);
|
|
238
|
+
const sign = freeIdx.variance === 'upper' ? 1 : -1;
|
|
239
|
+
correction = tensorAddScaled(correction, term, sign, engine);
|
|
240
|
+
}
|
|
241
|
+
return tensorAdd(partial, correction, engine);
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=derivative-lowering.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derivative-lowering.js","sourceRoot":"","sources":["../../src/numerical/derivative-lowering.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Einstein field equation residual evaluator (v0.6.0 Phase 2, Task 2.4).
|
|
3
|
+
*
|
|
4
|
+
* Computes the **scale-normalized** max residual of
|
|
5
|
+
*
|
|
6
|
+
* G_μν[g] + Λ g_μν − (8πG/c⁴) T_μν
|
|
7
|
+
*
|
|
8
|
+
* at a coordinate point, using the existing v0.5.0 einstein-tensor lowering
|
|
9
|
+
* pipeline (lowerNode, einstein-tensor arm in src/numerical/lowering.ts).
|
|
10
|
+
* No curvature recomputation from scratch — delegates to the internal
|
|
11
|
+
* `lowerNode` synchronous path to stay non-async.
|
|
12
|
+
*
|
|
13
|
+
* **Scale normalization**: in SI units, the G_tt component involves catastrophic
|
|
14
|
+
* cancellation of terms of order c²/r² ≈ 9e16/r² — the raw absolute residual
|
|
15
|
+
* |G_tt| reaches O(0.25) due to FD truncation noise in individual Riemann
|
|
16
|
+
* components, even though the true G_tt is identically zero. To make the
|
|
17
|
+
* vacuum-closure test meaningful, each |G_μν| component is normalized by the
|
|
18
|
+
* scale of the corresponding metric component |g_μν| (where g_μν ≠ 0).
|
|
19
|
+
* The returned value is then max over (μ,ν) of |G_μν| / scale_μν, which is
|
|
20
|
+
* dimensionless and measures relative closure at the FD truncation floor.
|
|
21
|
+
*
|
|
22
|
+
* @module numerical/einstein-equation
|
|
23
|
+
*/
|
|
24
|
+
/** 4-component coordinate vector [t, r, θ, φ].
|
|
25
|
+
*
|
|
26
|
+
* @public */
|
|
27
|
+
export type Vec4 = [number, number, number, number];
|
|
28
|
+
/**
|
|
29
|
+
* Coordinate-dependent metric closure: maps a coordinate 4-vector to a 4×4
|
|
30
|
+
* covariant or contravariant metric matrix.
|
|
31
|
+
*
|
|
32
|
+
* @public
|
|
33
|
+
*/
|
|
34
|
+
export type MetricClosure = (x: ReadonlyArray<number>) => number[][];
|
|
35
|
+
/**
|
|
36
|
+
* Input bag for `evaluateEinsteinEquationResidual`.
|
|
37
|
+
*
|
|
38
|
+
* @public
|
|
39
|
+
*/
|
|
40
|
+
export interface EinsteinEquationResidualInput {
|
|
41
|
+
/**
|
|
42
|
+
* Covariant metric closure g_{μν}(x). Must be coordinate-dependent (the FD
|
|
43
|
+
* pipeline inside the einstein-tensor lowering samples it at perturbed points).
|
|
44
|
+
*/
|
|
45
|
+
gFn: MetricClosure;
|
|
46
|
+
/**
|
|
47
|
+
* Contravariant metric closure g^{μν}(x). Must be the exact inverse of gFn
|
|
48
|
+
* (i.e. gFn(x) · gInvFn(x) = I for all x).
|
|
49
|
+
*/
|
|
50
|
+
gInvFn: MetricClosure;
|
|
51
|
+
/** Cosmological constant Λ in units consistent with the metric (m⁻² for SI). Use 0 for vacuum. */
|
|
52
|
+
cosmologicalConstant: number;
|
|
53
|
+
/** Stress-energy tensor T_μν as a 4×4 matrix closure; return zeros for vacuum. */
|
|
54
|
+
stressEnergy: (x: Vec4) => number[][];
|
|
55
|
+
/** Coordinate 4-vector [t, r, θ, φ] at which to evaluate the residual. */
|
|
56
|
+
x: Vec4;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Evaluate the Einstein-equation scale-normalized residual at the given point.
|
|
60
|
+
*
|
|
61
|
+
* Returns `max over (μ,ν) of |G_μν + Λ g_μν − κ T_μν| / scale_μν`, where
|
|
62
|
+
* `scale_μν = max(|g_μν|, 1e-30)` to avoid division by zero on off-diagonal
|
|
63
|
+
* zero entries.
|
|
64
|
+
*
|
|
65
|
+
* **Why scale-normalize?** In SI units, G_tt involves cancellation of
|
|
66
|
+
* Riemann terms of order c²/r² ~ 9e16/r², leaving a FD truncation noise
|
|
67
|
+
* of O(0.25) in the absolute residual at r=3r_s. Dividing by |g_tt| ~ 6e16
|
|
68
|
+
* gives a relative residual of ~4e-18, which is the genuine FD precision
|
|
69
|
+
* floor. Without normalization, the vacuum closure test would require a
|
|
70
|
+
* tolerance of ~1 rather than ~1e-17, making it vacuous.
|
|
71
|
+
*
|
|
72
|
+
* For Schwarzschild vacuum (T=0, Λ=0) the normalized residual should be
|
|
73
|
+
* near machine precision (typically < 1e-8 at all 13 sample points).
|
|
74
|
+
*
|
|
75
|
+
* The function is **synchronous** because `lowerNode` is synchronous — the
|
|
76
|
+
* async wrapper in `evaluateNumerical` is only for the engine-registry lookup
|
|
77
|
+
* and dimensional validation, both bypassed here by using the Float64 engine
|
|
78
|
+
* directly and passing a structurally-known-valid AST.
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```typescript
|
|
82
|
+
* import { evaluateEinsteinEquationResidual } from 'universal-physics-tensor';
|
|
83
|
+
* import {
|
|
84
|
+
* schwarzschildGFn,
|
|
85
|
+
* schwarzschildGInverseFn,
|
|
86
|
+
* schwarzschildRs,
|
|
87
|
+
* } from '../tests/fixtures/schwarzschild.js';
|
|
88
|
+
*
|
|
89
|
+
* const M = 1.989e30;
|
|
90
|
+
* const r_s = schwarzschildRs(M);
|
|
91
|
+
* const x: [number, number, number, number] = [0, 5 * r_s, Math.PI / 2, 0];
|
|
92
|
+
*
|
|
93
|
+
* const residual = evaluateEinsteinEquationResidual({
|
|
94
|
+
* gFn: schwarzschildGFn(M),
|
|
95
|
+
* gInvFn: schwarzschildGInverseFn(M),
|
|
96
|
+
* cosmologicalConstant: 0,
|
|
97
|
+
* stressEnergy: (_x) => [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],
|
|
98
|
+
* x,
|
|
99
|
+
* });
|
|
100
|
+
* // residual < 1e-8 for Schwarzschild vacuum (FD truncation floor)
|
|
101
|
+
* ```
|
|
102
|
+
*
|
|
103
|
+
* @public
|
|
104
|
+
*/
|
|
105
|
+
export declare function evaluateEinsteinEquationResidual(input: EinsteinEquationResidualInput): number;
|
|
106
|
+
//# sourceMappingURL=einstein-equation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"einstein-equation.d.ts","sourceRoot":"","sources":["../../src/numerical/einstein-equation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAWH;;cAEc;AACd,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,MAAM,EAAE,EAAE,CAAC;AAErE;;;;GAIG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;;OAGG;IACH,GAAG,EAAE,aAAa,CAAC;IACnB;;;OAGG;IACH,MAAM,EAAE,aAAa,CAAC;IACtB,kGAAkG;IAClG,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kFAAkF;IAClF,YAAY,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,EAAE,EAAE,CAAC;IACtC,0EAA0E;IAC1E,CAAC,EAAE,IAAI,CAAC;CACT;AAsDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,6BAA6B,GACnC,MAAM,CAmER"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Einstein field equation residual evaluator (v0.6.0 Phase 2, Task 2.4).
|
|
3
|
+
*
|
|
4
|
+
* Computes the **scale-normalized** max residual of
|
|
5
|
+
*
|
|
6
|
+
* G_μν[g] + Λ g_μν − (8πG/c⁴) T_μν
|
|
7
|
+
*
|
|
8
|
+
* at a coordinate point, using the existing v0.5.0 einstein-tensor lowering
|
|
9
|
+
* pipeline (lowerNode, einstein-tensor arm in src/numerical/lowering.ts).
|
|
10
|
+
* No curvature recomputation from scratch — delegates to the internal
|
|
11
|
+
* `lowerNode` synchronous path to stay non-async.
|
|
12
|
+
*
|
|
13
|
+
* **Scale normalization**: in SI units, the G_tt component involves catastrophic
|
|
14
|
+
* cancellation of terms of order c²/r² ≈ 9e16/r² — the raw absolute residual
|
|
15
|
+
* |G_tt| reaches O(0.25) due to FD truncation noise in individual Riemann
|
|
16
|
+
* components, even though the true G_tt is identically zero. To make the
|
|
17
|
+
* vacuum-closure test meaningful, each |G_μν| component is normalized by the
|
|
18
|
+
* scale of the corresponding metric component |g_μν| (where g_μν ≠ 0).
|
|
19
|
+
* The returned value is then max over (μ,ν) of |G_μν| / scale_μν, which is
|
|
20
|
+
* dimensionless and measures relative closure at the FD truncation floor.
|
|
21
|
+
*
|
|
22
|
+
* @module numerical/einstein-equation
|
|
23
|
+
*/
|
|
24
|
+
import { lowerNode } from './lowering.js';
|
|
25
|
+
import { Float64ReferenceEngine } from './float64-engine.js';
|
|
26
|
+
import { metric } from '../dimensional/metric.js';
|
|
27
|
+
import { tsym } from '../dimensional/tensor.js';
|
|
28
|
+
import { LENGTH, DIMENSIONLESS } from '../dimensional/types.js';
|
|
29
|
+
import { C_SI, G_SI } from '../core/constants.js';
|
|
30
|
+
/** Shared engine instance (stateless Float64ReferenceEngine, safe to reuse). */
|
|
31
|
+
const _engine = new Float64ReferenceEngine();
|
|
32
|
+
/**
|
|
33
|
+
* Build the EinsteinTensorNode AST that the lowering layer understands.
|
|
34
|
+
* The inner RiemannTensorNode and outer EinsteinTensorNode both reference
|
|
35
|
+
* the same metric pair by name ('g' / 'g_inv'), which the inputs.tensors
|
|
36
|
+
* and inputs.fields maps must populate at call time.
|
|
37
|
+
*/
|
|
38
|
+
function buildEinsteinNode() {
|
|
39
|
+
const gLower = metric('g', [{ label: 'mu', variance: 'lower' }, { label: 'nu', variance: 'lower' }], DIMENSIONLESS, '+,-,-,-');
|
|
40
|
+
const gInverse = metric('g_inv', [{ label: 'mu', variance: 'upper' }, { label: 'nu', variance: 'upper' }], DIMENSIONLESS, '+,-,-,-');
|
|
41
|
+
const xCoord = tsym('x', [{ label: 'c', variance: 'upper' }], LENGTH, 'coordinate');
|
|
42
|
+
const riemannNode = {
|
|
43
|
+
kind: 'riemann-tensor',
|
|
44
|
+
upperIndex: { label: 'rho', variance: 'upper' },
|
|
45
|
+
lowerIndices: [
|
|
46
|
+
{ label: 'sigma', variance: 'lower' },
|
|
47
|
+
{ label: 'lam', variance: 'lower' },
|
|
48
|
+
{ label: 'nu_r', variance: 'lower' },
|
|
49
|
+
],
|
|
50
|
+
gLower,
|
|
51
|
+
gInverse,
|
|
52
|
+
xCoord,
|
|
53
|
+
};
|
|
54
|
+
return {
|
|
55
|
+
kind: 'einstein-tensor',
|
|
56
|
+
riemann: riemannNode,
|
|
57
|
+
gLower,
|
|
58
|
+
gInverse,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/** The cached AST node (constructed once, reused across calls). */
|
|
62
|
+
const _einsteinNode = buildEinsteinNode();
|
|
63
|
+
/**
|
|
64
|
+
* Evaluate the Einstein-equation scale-normalized residual at the given point.
|
|
65
|
+
*
|
|
66
|
+
* Returns `max over (μ,ν) of |G_μν + Λ g_μν − κ T_μν| / scale_μν`, where
|
|
67
|
+
* `scale_μν = max(|g_μν|, 1e-30)` to avoid division by zero on off-diagonal
|
|
68
|
+
* zero entries.
|
|
69
|
+
*
|
|
70
|
+
* **Why scale-normalize?** In SI units, G_tt involves cancellation of
|
|
71
|
+
* Riemann terms of order c²/r² ~ 9e16/r², leaving a FD truncation noise
|
|
72
|
+
* of O(0.25) in the absolute residual at r=3r_s. Dividing by |g_tt| ~ 6e16
|
|
73
|
+
* gives a relative residual of ~4e-18, which is the genuine FD precision
|
|
74
|
+
* floor. Without normalization, the vacuum closure test would require a
|
|
75
|
+
* tolerance of ~1 rather than ~1e-17, making it vacuous.
|
|
76
|
+
*
|
|
77
|
+
* For Schwarzschild vacuum (T=0, Λ=0) the normalized residual should be
|
|
78
|
+
* near machine precision (typically < 1e-8 at all 13 sample points).
|
|
79
|
+
*
|
|
80
|
+
* The function is **synchronous** because `lowerNode` is synchronous — the
|
|
81
|
+
* async wrapper in `evaluateNumerical` is only for the engine-registry lookup
|
|
82
|
+
* and dimensional validation, both bypassed here by using the Float64 engine
|
|
83
|
+
* directly and passing a structurally-known-valid AST.
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* import { evaluateEinsteinEquationResidual } from 'universal-physics-tensor';
|
|
88
|
+
* import {
|
|
89
|
+
* schwarzschildGFn,
|
|
90
|
+
* schwarzschildGInverseFn,
|
|
91
|
+
* schwarzschildRs,
|
|
92
|
+
* } from '../tests/fixtures/schwarzschild.js';
|
|
93
|
+
*
|
|
94
|
+
* const M = 1.989e30;
|
|
95
|
+
* const r_s = schwarzschildRs(M);
|
|
96
|
+
* const x: [number, number, number, number] = [0, 5 * r_s, Math.PI / 2, 0];
|
|
97
|
+
*
|
|
98
|
+
* const residual = evaluateEinsteinEquationResidual({
|
|
99
|
+
* gFn: schwarzschildGFn(M),
|
|
100
|
+
* gInvFn: schwarzschildGInverseFn(M),
|
|
101
|
+
* cosmologicalConstant: 0,
|
|
102
|
+
* stressEnergy: (_x) => [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],
|
|
103
|
+
* x,
|
|
104
|
+
* });
|
|
105
|
+
* // residual < 1e-8 for Schwarzschild vacuum (FD truncation floor)
|
|
106
|
+
* ```
|
|
107
|
+
*
|
|
108
|
+
* @public
|
|
109
|
+
*/
|
|
110
|
+
export function evaluateEinsteinEquationResidual(input) {
|
|
111
|
+
const { gFn, gInvFn, cosmologicalConstant, stressEnergy, x } = input;
|
|
112
|
+
// κ = 8πG/c⁴ (SI units: m/kg·s² if G in m³/kg/s², c in m/s)
|
|
113
|
+
const kappa = (8 * Math.PI * G_SI) / (C_SI * C_SI * C_SI * C_SI);
|
|
114
|
+
// Sample metric at the evaluation point (needed for the Λ g_μν term, the
|
|
115
|
+
// ½R g_μν subtraction inside einstein-tensor lowering, and scale normalization).
|
|
116
|
+
const gAtX = gFn(x);
|
|
117
|
+
const gInvAtX = gInvFn(x);
|
|
118
|
+
const gMat = gAtX;
|
|
119
|
+
// Build NumericalInputs that the einstein-tensor lowering arm expects:
|
|
120
|
+
// - inputs.tensors['g']: concrete g_{μν} at x (step 4: ½R g_μν subtraction)
|
|
121
|
+
// - inputs.tensors['g_inv']: concrete g^{μν} at x (step 3: scalar trace R)
|
|
122
|
+
// - inputs.tensors['x']: coordinate array (riemann-tensor arm reads xCoord)
|
|
123
|
+
// - inputs.fields['g']: coordinate-dependent g closure (FD for ∂g → Γ)
|
|
124
|
+
// - inputs.fields['g_inv']: coordinate-dependent g^{-1} closure (FD for Γ)
|
|
125
|
+
const inputs = {
|
|
126
|
+
tensors: new Map([
|
|
127
|
+
['g', gAtX],
|
|
128
|
+
['g_inv', gInvAtX],
|
|
129
|
+
['x', [...x]],
|
|
130
|
+
]),
|
|
131
|
+
fields: new Map([
|
|
132
|
+
['g', gFn],
|
|
133
|
+
['g_inv', gInvFn],
|
|
134
|
+
]),
|
|
135
|
+
dimension: 4,
|
|
136
|
+
};
|
|
137
|
+
// Lower G_μν via the einstein-tensor arm. lowerNode is synchronous (no await
|
|
138
|
+
// inside the einstein-tensor / ricci-tensor / riemann-tensor case arms).
|
|
139
|
+
const G_tensor = lowerNode(_einsteinNode, inputs, _engine);
|
|
140
|
+
const G = _engine.toNested(G_tensor);
|
|
141
|
+
// T_μν at this point.
|
|
142
|
+
const T = stressEnergy(x);
|
|
143
|
+
// Scale-normalized residual: max |G_μν + Λ g_μν − κ T_μν| / |g_μν|
|
|
144
|
+
//
|
|
145
|
+
// scale_μν = max(|g_μν|, 1e-30) avoids division by zero on off-diagonal zeros.
|
|
146
|
+
// For diagonal Schwarzschild: |g_tt| ~ c²f ~ 6e16, |g_rr|~1.5, |g_θθ|~r²,
|
|
147
|
+
// |g_φφ|~r²sin²θ. Off-diagonal components are exactly zero → scale = 1e-30,
|
|
148
|
+
// making |G_μν|/scale = |G_μν|/1e-30 — but G_μν off-diagonal is also ~0
|
|
149
|
+
// (FD noise), so these terms are ~0/1e-30 = negligible once the diagonal
|
|
150
|
+
// terms dominate.
|
|
151
|
+
//
|
|
152
|
+
// Implementation note: use max(|g_μν|, 1.0) instead of 1e-30 to keep the
|
|
153
|
+
// relative residual well-behaved when G_μν_off-diag has O(FD noise) absolute
|
|
154
|
+
// values. With floor=1.0, the off-diagonal "relative" residuals are just the
|
|
155
|
+
// absolute FD noise, which is < 1e-9 for 4th-order stencils, hence swamped
|
|
156
|
+
// by the diagonal relative residuals.
|
|
157
|
+
const N = 4;
|
|
158
|
+
let maxNormalized = 0;
|
|
159
|
+
for (let mu = 0; mu < N; mu++) {
|
|
160
|
+
for (let nu = 0; nu < N; nu++) {
|
|
161
|
+
const component = G[mu][nu]
|
|
162
|
+
+ cosmologicalConstant * gMat[mu][nu]
|
|
163
|
+
- kappa * T[mu][nu];
|
|
164
|
+
const scale = Math.max(Math.abs(gMat[mu][nu]), 1.0);
|
|
165
|
+
const normalized = Math.abs(component) / scale;
|
|
166
|
+
if (normalized > maxNormalized)
|
|
167
|
+
maxNormalized = normalized;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return maxNormalized;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=einstein-equation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"einstein-equation.js","sourceRoot":"","sources":["../../src/numerical/einstein-equation.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,9 +16,9 @@ async function detectDefault() {
|
|
|
16
16
|
return _resolvedDefault;
|
|
17
17
|
try {
|
|
18
18
|
await import('@danielsimonjr/mathts-tensor');
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
19
|
+
// v0.5.1 TS-4: the prior `@ts-ignore` is replaced by the ambient module
|
|
20
|
+
// declaration at the top of this file; the try-catch still handles the
|
|
21
|
+
// runtime-absent case (Promise rejection from the bundler/loader).
|
|
22
22
|
await import('@danielsimonjr/mathts-autograd');
|
|
23
23
|
_resolvedDefault = 'mathts';
|
|
24
24
|
}
|
|
@@ -26,7 +26,7 @@ async function detectDefault() {
|
|
|
26
26
|
// I5 fix: `process` is undefined in browser bundlers; guard before reading.
|
|
27
27
|
const quiet = typeof process !== 'undefined' && process.env?.UPT_QUIET_FALLBACK === '1';
|
|
28
28
|
if (!quiet) {
|
|
29
|
-
console.warn('[universal-physics-tensor
|
|
29
|
+
console.warn('[universal-physics-tensor] @danielsimonjr/mathts-tensor and/or '
|
|
30
30
|
+ '@danielsimonjr/mathts-autograd not installed. '
|
|
31
31
|
+ 'Falling back to Float64ReferenceEngine. '
|
|
32
32
|
+ 'Install both peers for MathTS-default + autograd (AD) support. '
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-registry.js","sourceRoot":"","sources":["../../src/numerical/engine-registry.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,2EAA2E;AAC3E,6EAA6E;AAC7E,uDAAuD;AACvD,IAAI,cAAiD,CAAC;AAEtD,8EAA8E;AAC9E,mEAAmE;AACnE,IAAI,gBAAkD,CAAC;AAEvD;;;;GAIG;AACH,KAAK,UAAU,aAAa;IAC1B,IAAI,gBAAgB,KAAK,SAAS;QAAE,OAAO,gBAAgB,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;QAC7C,
|
|
1
|
+
{"version":3,"file":"engine-registry.js","sourceRoot":"","sources":["../../src/numerical/engine-registry.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,2EAA2E;AAC3E,6EAA6E;AAC7E,uDAAuD;AACvD,IAAI,cAAiD,CAAC;AAEtD,8EAA8E;AAC9E,mEAAmE;AACnE,IAAI,gBAAkD,CAAC;AAEvD;;;;GAIG;AACH,KAAK,UAAU,aAAa;IAC1B,IAAI,gBAAgB,KAAK,SAAS;QAAE,OAAO,gBAAgB,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;QAC7C,wEAAwE;QACxE,uEAAuE;QACvE,mEAAmE;QACnE,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;QAC/C,gBAAgB,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;QAC5E,MAAM,KAAK,GACT,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,kBAAkB,KAAK,GAAG,CAAC;QAC5E,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CACV,iEAAiE;kBAC/D,gDAAgD;kBAChD,0CAA0C;kBAC1C,iEAAiE;kBACjE,oDAAoD,CACvD,CAAC;QACJ,CAAC;QACD,gBAAgB,GAAG,SAAS,CAAC;IAC/B,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,2EAA2E;AAC3E,gEAAgE;AAEhE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,cAAc,KAAK,CAAC,KAAK,IAAI,EAAE;QAC7B,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACxB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAC5D,OAAO,IAAI,YAAY,EAAE,CAAC;QAC5B,CAAC;QACD,OAAO,IAAI,sBAAsB,EAAE,CAAC;IACtC,CAAC,CAAC,EAAE,CAAC;IACL,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,cAAc,GAAG,SAAS,CAAC;IAC3B,gBAAgB,GAAG,SAAS,CAAC;AAC/B,CAAC"}
|
|
@@ -4,11 +4,14 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export interface GeodesicIntegratorInputs {
|
|
6
6
|
/**
|
|
7
|
-
* Christoffel-symbol closure. Maps a 4-coordinate array x^μ to
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* Christoffel-symbol closure. Maps a 4-coordinate array x^μ to a
|
|
8
|
+
* Float64Array(64) containing Γ^μ_{νρ}(x) in λ-major layout:
|
|
9
|
+
* index (λ, μ, ν) → 16·λ + 4·μ + ν.
|
|
10
|
+
*
|
|
11
|
+
* BR-2 (v0.6.0 Task 2.9): migrated from nested number[][][] to flat
|
|
12
|
+
* Float64Array(64). Consumers call `arr[16*mu + 4*nu + rho]`.
|
|
10
13
|
*/
|
|
11
|
-
christoffelFn: (x: ReadonlyArray<number>) =>
|
|
14
|
+
christoffelFn: (x: ReadonlyArray<number>) => Float64Array;
|
|
12
15
|
/** Initial 4-position x^μ(τ₀) = [t, r, θ, φ]. */
|
|
13
16
|
x0: readonly [number, number, number, number];
|
|
14
17
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geodesic-integrator.d.ts","sourceRoot":"","sources":["../../src/numerical/geodesic-integrator.ts"],"names":[],"mappings":"AAwBA;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC
|
|
1
|
+
{"version":3,"file":"geodesic-integrator.d.ts","sourceRoot":"","sources":["../../src/numerical/geodesic-integrator.ts"],"names":[],"mappings":"AAwBA;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;;;;OAOG;IACH,aAAa,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,YAAY,CAAC;IAE1D,iDAAiD;IACjD,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAE9C;;;;;;;;OAQG;IACH,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAE9C,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IAEjB,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IAEf,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IAEd;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAE3D,kCAAkC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAE3D;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/E;AAuDD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,wBAAwB,GAC/B,wBAAwB,CAuD1B"}
|
|
@@ -35,6 +35,9 @@ function combineRK4(y, k1, k2, k3, k4, h) {
|
|
|
35
35
|
/**
|
|
36
36
|
* Evaluate the Christoffel acceleration −Γ^μ_{νρ} v^ν v^ρ at position x
|
|
37
37
|
* with 4-velocity v. Returns (dx/dτ, dv/dτ) = (v, accel).
|
|
38
|
+
*
|
|
39
|
+
* BR-2 (v0.6.0 Task 2.9): christoffelFn now returns Float64Array(64).
|
|
40
|
+
* Index access: G[16*mu + 4*nu + rho] (λ-major layout).
|
|
38
41
|
*/
|
|
39
42
|
function geodesicRHS(christoffelFn, x, v) {
|
|
40
43
|
const G = christoffelFn(x);
|
|
@@ -43,7 +46,7 @@ function geodesicRHS(christoffelFn, x, v) {
|
|
|
43
46
|
let acc = 0;
|
|
44
47
|
for (let nu = 0; nu < 4; nu++) {
|
|
45
48
|
for (let rho = 0; rho < 4; rho++) {
|
|
46
|
-
acc += G[mu
|
|
49
|
+
acc += G[16 * mu + 4 * nu + rho] * v[nu] * v[rho];
|
|
47
50
|
}
|
|
48
51
|
}
|
|
49
52
|
dv[mu] = -acc;
|
|
@@ -62,6 +65,7 @@ function geodesicRHS(christoffelFn, x, v) {
|
|
|
62
65
|
*/
|
|
63
66
|
export function integrateGeodesic(inputs) {
|
|
64
67
|
const { christoffelFn, x0, v0, tauStart, tauEnd, steps, domainMinRadius } = inputs;
|
|
68
|
+
// BR-2: christoffelFn now returns Float64Array(64); geodesicRHS reads flat layout.
|
|
65
69
|
// E11 fix: explicit option in place of monkey-patched .r_s on the closure.
|
|
66
70
|
// Callers (e.g. the Schwarzschild test fixture) pass `3 * r_s` directly.
|
|
67
71
|
if (typeof domainMinRadius === 'number' && x0[1] < domainMinRadius) {
|