@interstellar-tools/equations 0.49.0 → 0.50.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/dist/categories/angle/compute-angle.d.ts +1 -1
- package/dist/categories/angle/compute-angle.js +4 -4
- package/dist/categories/angle/compute-angle.js.map +1 -1
- package/dist/categories/anomalies/mean-to-eccentric-anomaly.d.ts +1 -1
- package/dist/categories/anomalies/mean-to-eccentric-anomaly.js +4 -4
- package/dist/categories/anomalies/mean-to-eccentric-anomaly.js.map +1 -1
- package/dist/categories/anomalies/true-to-mean-anomaly.d.ts +1 -1
- package/dist/categories/anomalies/true-to-mean-anomaly.js +2 -2
- package/dist/categories/anomalies/true-to-mean-anomaly.js.map +1 -1
- package/dist/categories/cartography/body-fixed-from-inertial-dcm-iau.js +3 -3
- package/dist/categories/cartography/body-fixed-from-inertial-dcm-iau.js.map +1 -1
- package/dist/categories/gravity/acceleration-on1-by2.js +1 -1
- package/dist/categories/gravity/acceleration-on1-by2.js.map +1 -1
- package/dist/categories/gravity/force-on1-by2.js +1 -1
- package/dist/categories/gravity/force-on1-by2.js.map +1 -1
- package/dist/categories/kepler/solve-kepler-high-eccentricity.d.ts +1 -1
- package/dist/categories/kepler/solve-kepler-high-eccentricity.js +2 -2
- package/dist/categories/kepler/solve-kepler-high-eccentricity.js.map +1 -1
- package/dist/categories/kepler/solve-kepler.d.ts +1 -1
- package/dist/categories/kepler/solve-kepler.js +5 -5
- package/dist/categories/kepler/solve-kepler.js.map +1 -1
- package/dist/index.d.ts +49 -49
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -49
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/dist/__tests__/helpers/index.d.ts +0 -9
- package/dist/__tests__/helpers/index.d.ts.map +0 -1
- package/dist/__tests__/helpers/index.js +0 -45
- package/dist/__tests__/helpers/index.js.map +0 -1
- package/dist/categories/angle/__tests__/compute-angle.int.spec.d.ts +0 -2
- package/dist/categories/angle/__tests__/compute-angle.int.spec.d.ts.map +0 -1
- package/dist/categories/angle/__tests__/compute-angle.int.spec.js +0 -62
- package/dist/categories/angle/__tests__/compute-angle.int.spec.js.map +0 -1
- package/dist/categories/angle/__tests__/wrap-angle.spec.d.ts +0 -2
- package/dist/categories/angle/__tests__/wrap-angle.spec.d.ts.map +0 -1
- package/dist/categories/angle/__tests__/wrap-angle.spec.js +0 -60
- package/dist/categories/angle/__tests__/wrap-angle.spec.js.map +0 -1
- package/dist/categories/anomalies/__tests__/eccentric-to-true-anomaly.spec.d.ts +0 -2
- package/dist/categories/anomalies/__tests__/eccentric-to-true-anomaly.spec.d.ts.map +0 -1
- package/dist/categories/anomalies/__tests__/eccentric-to-true-anomaly.spec.js +0 -33
- package/dist/categories/anomalies/__tests__/eccentric-to-true-anomaly.spec.js.map +0 -1
- package/dist/categories/anomalies/__tests__/mean-to-eccentric-anomaly.spec.d.ts +0 -2
- package/dist/categories/anomalies/__tests__/mean-to-eccentric-anomaly.spec.d.ts.map +0 -1
- package/dist/categories/anomalies/__tests__/mean-to-eccentric-anomaly.spec.js +0 -197
- package/dist/categories/anomalies/__tests__/mean-to-eccentric-anomaly.spec.js.map +0 -1
- package/dist/categories/anomalies/__tests__/true-to-mean-anomaly.spec.d.ts +0 -2
- package/dist/categories/anomalies/__tests__/true-to-mean-anomaly.spec.d.ts.map +0 -1
- package/dist/categories/anomalies/__tests__/true-to-mean-anomaly.spec.js +0 -46
- package/dist/categories/anomalies/__tests__/true-to-mean-anomaly.spec.js.map +0 -1
- package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.d.ts +0 -2
- package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.d.ts.map +0 -1
- package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.js +0 -56
- package/dist/categories/cartography/__tests__/body-fixed-from-inertial-dcm-iau.int.spec.js.map +0 -1
- package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.d.ts +0 -2
- package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.d.ts.map +0 -1
- package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.js +0 -60
- package/dist/categories/cartography/__tests__/eccentricity-squared-oblate-spheroid.spec.js.map +0 -1
- package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.d.ts +0 -2
- package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.d.ts.map +0 -1
- package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.js +0 -60
- package/dist/categories/cartography/__tests__/flattening-oblate-spheroid.spec.js.map +0 -1
- package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.d.ts +0 -2
- package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.d.ts.map +0 -1
- package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.js +0 -73
- package/dist/categories/cartography/__tests__/is-on-triaxial-ellipsoid-surface.spec.js.map +0 -1
- package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.d.ts +0 -2
- package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.d.ts.map +0 -1
- package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.js +0 -69
- package/dist/categories/cartography/__tests__/planetocentric-latitude.spec.js.map +0 -1
- package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.d.ts +0 -2
- package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.d.ts.map +0 -1
- package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.js +0 -103
- package/dist/categories/cartography/__tests__/planetographic-latitude-oblate.spec.js.map +0 -1
- package/dist/categories/gravity/__tests__/gravitational-acceleration-on1-by2.int.spec.d.ts +0 -2
- package/dist/categories/gravity/__tests__/gravitational-acceleration-on1-by2.int.spec.d.ts.map +0 -1
- package/dist/categories/gravity/__tests__/gravitational-acceleration-on1-by2.int.spec.js +0 -87
- package/dist/categories/gravity/__tests__/gravitational-acceleration-on1-by2.int.spec.js.map +0 -1
- package/dist/categories/gravity/__tests__/gravitational-force-on1-by2.int.spec.d.ts +0 -2
- package/dist/categories/gravity/__tests__/gravitational-force-on1-by2.int.spec.d.ts.map +0 -1
- package/dist/categories/gravity/__tests__/gravitational-force-on1-by2.int.spec.js +0 -107
- package/dist/categories/gravity/__tests__/gravitational-force-on1-by2.int.spec.js.map +0 -1
- package/dist/categories/gravity/__tests__/gravitational-force.spec.d.ts +0 -2
- package/dist/categories/gravity/__tests__/gravitational-force.spec.d.ts.map +0 -1
- package/dist/categories/gravity/__tests__/gravitational-force.spec.js +0 -106
- package/dist/categories/gravity/__tests__/gravitational-force.spec.js.map +0 -1
- package/dist/categories/gravity/__tests__/gravitational-parameters.spec.d.ts +0 -2
- package/dist/categories/gravity/__tests__/gravitational-parameters.spec.d.ts.map +0 -1
- package/dist/categories/gravity/__tests__/gravitational-parameters.spec.js +0 -75
- package/dist/categories/gravity/__tests__/gravitational-parameters.spec.js.map +0 -1
- package/dist/categories/helpers/__tests__/apply-matrix-3.spec.d.ts +0 -2
- package/dist/categories/helpers/__tests__/apply-matrix-3.spec.d.ts.map +0 -1
- package/dist/categories/helpers/__tests__/apply-matrix-3.spec.js +0 -79
- package/dist/categories/helpers/__tests__/apply-matrix-3.spec.js.map +0 -1
- package/dist/categories/helpers/__tests__/det-3.spec.d.ts +0 -2
- package/dist/categories/helpers/__tests__/det-3.spec.d.ts.map +0 -1
- package/dist/categories/helpers/__tests__/det-3.spec.js +0 -73
- package/dist/categories/helpers/__tests__/det-3.spec.js.map +0 -1
- package/dist/categories/helpers/__tests__/mat-mul3.spec.d.ts +0 -2
- package/dist/categories/helpers/__tests__/mat-mul3.spec.d.ts.map +0 -1
- package/dist/categories/helpers/__tests__/mat-mul3.spec.js +0 -86
- package/dist/categories/helpers/__tests__/mat-mul3.spec.js.map +0 -1
- package/dist/categories/helpers/__tests__/misc.spec.d.ts +0 -2
- package/dist/categories/helpers/__tests__/misc.spec.d.ts.map +0 -1
- package/dist/categories/helpers/__tests__/misc.spec.js +0 -101
- package/dist/categories/helpers/__tests__/misc.spec.js.map +0 -1
- package/dist/categories/helpers/__tests__/radians.spec.d.ts +0 -2
- package/dist/categories/helpers/__tests__/radians.spec.d.ts.map +0 -1
- package/dist/categories/helpers/__tests__/radians.spec.js +0 -37
- package/dist/categories/helpers/__tests__/radians.spec.js.map +0 -1
- package/dist/categories/helpers/__tests__/rot-1.spec.d.ts +0 -2
- package/dist/categories/helpers/__tests__/rot-1.spec.d.ts.map +0 -1
- package/dist/categories/helpers/__tests__/rot-1.spec.js +0 -59
- package/dist/categories/helpers/__tests__/rot-1.spec.js.map +0 -1
- package/dist/categories/helpers/__tests__/rot-3.spec.d.ts +0 -2
- package/dist/categories/helpers/__tests__/rot-3.spec.d.ts.map +0 -1
- package/dist/categories/helpers/__tests__/rot-3.spec.js +0 -65
- package/dist/categories/helpers/__tests__/rot-3.spec.js.map +0 -1
- package/dist/categories/kepler/__tests__/solve-kepler-bisection.spec.d.ts +0 -2
- package/dist/categories/kepler/__tests__/solve-kepler-bisection.spec.d.ts.map +0 -1
- package/dist/categories/kepler/__tests__/solve-kepler-bisection.spec.js +0 -86
- package/dist/categories/kepler/__tests__/solve-kepler-bisection.spec.js.map +0 -1
- package/dist/categories/kepler/__tests__/solve-kepler-high-eccentricity.spec.d.ts +0 -2
- package/dist/categories/kepler/__tests__/solve-kepler-high-eccentricity.spec.d.ts.map +0 -1
- package/dist/categories/kepler/__tests__/solve-kepler-high-eccentricity.spec.js +0 -81
- package/dist/categories/kepler/__tests__/solve-kepler-high-eccentricity.spec.js.map +0 -1
- package/dist/categories/kepler/__tests__/solve-kepler-newton-raphson.spec.d.ts +0 -2
- package/dist/categories/kepler/__tests__/solve-kepler-newton-raphson.spec.d.ts.map +0 -1
- package/dist/categories/kepler/__tests__/solve-kepler-newton-raphson.spec.js +0 -50
- package/dist/categories/kepler/__tests__/solve-kepler-newton-raphson.spec.js.map +0 -1
- package/dist/categories/kepler/__tests__/solve-kepler.int.spec.d.ts +0 -2
- package/dist/categories/kepler/__tests__/solve-kepler.int.spec.d.ts.map +0 -1
- package/dist/categories/kepler/__tests__/solve-kepler.int.spec.js +0 -76
- package/dist/categories/kepler/__tests__/solve-kepler.int.spec.js.map +0 -1
- package/dist/categories/manoeuvres/__tests__/combine-burns-delta-v.spec.d.ts +0 -2
- package/dist/categories/manoeuvres/__tests__/combine-burns-delta-v.spec.d.ts.map +0 -1
- package/dist/categories/manoeuvres/__tests__/combine-burns-delta-v.spec.js +0 -103
- package/dist/categories/manoeuvres/__tests__/combine-burns-delta-v.spec.js.map +0 -1
- package/dist/categories/manoeuvres/__tests__/gravity-assist-turning-angle.spec.d.ts +0 -2
- package/dist/categories/manoeuvres/__tests__/gravity-assist-turning-angle.spec.d.ts.map +0 -1
- package/dist/categories/manoeuvres/__tests__/gravity-assist-turning-angle.spec.js +0 -89
- package/dist/categories/manoeuvres/__tests__/gravity-assist-turning-angle.spec.js.map +0 -1
- package/dist/categories/manoeuvres/__tests__/hohmann-transfer.spec.d.ts +0 -2
- package/dist/categories/manoeuvres/__tests__/hohmann-transfer.spec.d.ts.map +0 -1
- package/dist/categories/manoeuvres/__tests__/hohmann-transfer.spec.js +0 -101
- package/dist/categories/manoeuvres/__tests__/hohmann-transfer.spec.js.map +0 -1
- package/dist/categories/manoeuvres/__tests__/oberth-energy-gain.spec.d.ts +0 -2
- package/dist/categories/manoeuvres/__tests__/oberth-energy-gain.spec.d.ts.map +0 -1
- package/dist/categories/manoeuvres/__tests__/oberth-energy-gain.spec.js +0 -71
- package/dist/categories/manoeuvres/__tests__/oberth-energy-gain.spec.js.map +0 -1
- package/dist/categories/manoeuvres/__tests__/plane-change-delta-v.spec.d.ts +0 -2
- package/dist/categories/manoeuvres/__tests__/plane-change-delta-v.spec.d.ts.map +0 -1
- package/dist/categories/manoeuvres/__tests__/plane-change-delta-v.spec.js +0 -90
- package/dist/categories/manoeuvres/__tests__/plane-change-delta-v.spec.js.map +0 -1
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.d.ts +0 -2
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.d.ts.map +0 -1
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.js +0 -84
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.js.map +0 -1
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.d.ts +0 -2
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.d.ts.map +0 -1
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.js +0 -65
- package/dist/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.js +0 -71
- package/dist/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/characteristic-energy-c3.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/characteristic-energy-c3.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/characteristic-energy-c3.spec.js +0 -36
- package/dist/categories/orbits/__tests__/characteristic-energy-c3.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/circular-speed.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/circular-speed.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/circular-speed.spec.js +0 -69
- package/dist/categories/orbits/__tests__/circular-speed.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/cw-hill-derivatives.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/cw-hill-derivatives.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/cw-hill-derivatives.spec.js +0 -64
- package/dist/categories/orbits/__tests__/cw-hill-derivatives.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/escape-speed.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/escape-speed.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/escape-speed.spec.js +0 -79
- package/dist/categories/orbits/__tests__/escape-speed.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/flight-path-angle-from-true-anomaly.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/flight-path-angle-from-true-anomaly.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/flight-path-angle-from-true-anomaly.spec.js +0 -92
- package/dist/categories/orbits/__tests__/flight-path-angle-from-true-anomaly.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.js +0 -64
- package/dist/categories/orbits/__tests__/hyperbolic-periapsis-speed.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.js +0 -104
- package/dist/categories/orbits/__tests__/j2-argument-of-perigee-rate.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.js +0 -99
- package/dist/categories/orbits/__tests__/j2-nodal-precession-rate.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/kepler-period.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/kepler-period.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/kepler-period.spec.js +0 -72
- package/dist/categories/orbits/__tests__/kepler-period.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/mean-motion.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/mean-motion.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/mean-motion.spec.js +0 -48
- package/dist/categories/orbits/__tests__/mean-motion.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/peri-apoapsis-radii.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/peri-apoapsis-radii.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/peri-apoapsis-radii.spec.js +0 -74
- package/dist/categories/orbits/__tests__/peri-apoapsis-radii.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.js +0 -86
- package/dist/categories/orbits/__tests__/specific-angular-momentum-from-elements.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/specific-angular-momentum.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/specific-angular-momentum.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/specific-angular-momentum.spec.js +0 -85
- package/dist/categories/orbits/__tests__/specific-angular-momentum.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/specific-mechanical-energy.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/specific-mechanical-energy.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/specific-mechanical-energy.spec.js +0 -81
- package/dist/categories/orbits/__tests__/specific-mechanical-energy.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/sphere-of-influence-radius.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/sphere-of-influence-radius.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/sphere-of-influence-radius.spec.js +0 -62
- package/dist/categories/orbits/__tests__/sphere-of-influence-radius.spec.js.map +0 -1
- package/dist/categories/orbits/__tests__/vis-viva-speed.spec.d.ts +0 -2
- package/dist/categories/orbits/__tests__/vis-viva-speed.spec.d.ts.map +0 -1
- package/dist/categories/orbits/__tests__/vis-viva-speed.spec.js +0 -80
- package/dist/categories/orbits/__tests__/vis-viva-speed.spec.js.map +0 -1
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test, { describe } from 'node:test';
|
|
3
|
-
import { rocketDeltaVFromIsp } from '../rocket-delta-v-from-isp';
|
|
4
|
-
import { relClose } from 'packages/equations/src/__tests__/helpers';
|
|
5
|
-
describe('rocketDeltaVFromIsp', () => {
|
|
6
|
-
test('computes Δv = g0 * Isp * ln(m0/mf) for typical inputs (default g0)', () => {
|
|
7
|
-
const Isp = 320; // s
|
|
8
|
-
const m0 = 1200; // kg
|
|
9
|
-
const mf = 800; // kg
|
|
10
|
-
const dv = rocketDeltaVFromIsp(Isp, m0, mf);
|
|
11
|
-
const expected = 9.80665 * Isp * Math.log(m0 / mf);
|
|
12
|
-
relClose(dv, expected);
|
|
13
|
-
assert.ok(dv > 0);
|
|
14
|
-
});
|
|
15
|
-
test('uses provided g0 when passed', () => {
|
|
16
|
-
const Isp = 300;
|
|
17
|
-
const m0 = 1000;
|
|
18
|
-
const mf = 500;
|
|
19
|
-
const g0 = 9.81;
|
|
20
|
-
const dv = rocketDeltaVFromIsp(Isp, m0, mf, g0);
|
|
21
|
-
const expected = g0 * Isp * Math.log(m0 / mf);
|
|
22
|
-
relClose(dv, expected);
|
|
23
|
-
});
|
|
24
|
-
test('scales linearly with Isp (doubling Isp doubles Δv)', () => {
|
|
25
|
-
const m0 = 1200;
|
|
26
|
-
const mf = 800;
|
|
27
|
-
const dv1 = rocketDeltaVFromIsp(200, m0, mf);
|
|
28
|
-
const dv2 = rocketDeltaVFromIsp(400, m0, mf);
|
|
29
|
-
relClose(dv2 / dv1, 2);
|
|
30
|
-
});
|
|
31
|
-
test('scales linearly with g0 (doubling g0 doubles Δv)', () => {
|
|
32
|
-
const Isp = 300;
|
|
33
|
-
const m0 = 1200;
|
|
34
|
-
const mf = 800;
|
|
35
|
-
const dv1 = rocketDeltaVFromIsp(Isp, m0, mf, 9.80665);
|
|
36
|
-
const dv2 = rocketDeltaVFromIsp(Isp, m0, mf, 2 * 9.80665);
|
|
37
|
-
relClose(dv2 / dv1, 2);
|
|
38
|
-
});
|
|
39
|
-
test('increases as mf decreases (more propellant -> higher Δv)', () => {
|
|
40
|
-
const Isp = 320;
|
|
41
|
-
const m0 = 1000;
|
|
42
|
-
const dvLessProp = rocketDeltaVFromIsp(Isp, m0, 900);
|
|
43
|
-
const dvMoreProp = rocketDeltaVFromIsp(Isp, m0, 500);
|
|
44
|
-
assert.ok(dvMoreProp > dvLessProp, `${dvMoreProp} should be > ${dvLessProp}`);
|
|
45
|
-
});
|
|
46
|
-
test('near-limit case (mf close to m0) yields a small Δv', () => {
|
|
47
|
-
const dv = rocketDeltaVFromIsp(300, 1000, 999.999);
|
|
48
|
-
assert.ok(dv >= 0);
|
|
49
|
-
assert.ok(dv < 10, `expected small dv, got ${dv}`);
|
|
50
|
-
});
|
|
51
|
-
test('throws TypeError when any input is not finite', () => {
|
|
52
|
-
assert.throws(() => rocketDeltaVFromIsp(Number.NaN, 1, 0.5), (err) => err instanceof TypeError &&
|
|
53
|
-
err.message === 'Isp must be a finite number. Received: NaN');
|
|
54
|
-
assert.throws(() => rocketDeltaVFromIsp(300, Number.POSITIVE_INFINITY, 0.5), (err) => err instanceof TypeError &&
|
|
55
|
-
err.message === 'm0 must be a finite number. Received: Infinity');
|
|
56
|
-
assert.throws(() => rocketDeltaVFromIsp(300, 1, Number.NEGATIVE_INFINITY), (err) => err instanceof TypeError &&
|
|
57
|
-
err.message === 'mf must be a finite number. Received: -Infinity');
|
|
58
|
-
assert.throws(() => rocketDeltaVFromIsp(300, 1, 0.5, Number.NaN), (err) => err instanceof TypeError &&
|
|
59
|
-
err.message === 'g0 must be a finite number. Received: NaN');
|
|
60
|
-
});
|
|
61
|
-
test('throws RangeError when Isp <= 0', () => {
|
|
62
|
-
assert.throws(() => rocketDeltaVFromIsp(0, 10, 5), (err) => err instanceof RangeError &&
|
|
63
|
-
err.message === 'Isp must be > 0. Received: 0');
|
|
64
|
-
});
|
|
65
|
-
test('throws RangeError when g0 <= 0', () => {
|
|
66
|
-
assert.throws(() => rocketDeltaVFromIsp(300, 10, 5, 0), (err) => err instanceof RangeError &&
|
|
67
|
-
err.message === 'g0 must be > 0. Received: 0');
|
|
68
|
-
});
|
|
69
|
-
test('throws RangeError when m0 <= 0', () => {
|
|
70
|
-
assert.throws(() => rocketDeltaVFromIsp(300, 0, 0.5), (err) => err instanceof RangeError &&
|
|
71
|
-
err.message === 'm0 must be > 0. Received: 0');
|
|
72
|
-
});
|
|
73
|
-
test('throws RangeError when mf <= 0', () => {
|
|
74
|
-
assert.throws(() => rocketDeltaVFromIsp(300, 10, 0), (err) => err instanceof RangeError &&
|
|
75
|
-
err.message === 'mf must be > 0. Received: 0');
|
|
76
|
-
});
|
|
77
|
-
test('throws RangeError when mf >= m0', () => {
|
|
78
|
-
assert.throws(() => rocketDeltaVFromIsp(300, 10, 10), (err) => err instanceof RangeError &&
|
|
79
|
-
err.message === 'mf must be < m0. Received: mf=10, m0=10');
|
|
80
|
-
assert.throws(() => rocketDeltaVFromIsp(300, 10, 11), (err) => err instanceof RangeError &&
|
|
81
|
-
err.message === 'mf must be < m0. Received: mf=11, m0=10');
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
//# sourceMappingURL=rocket-delta-v-from-isp.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rocket-delta-v-from-isp.spec.js","sourceRoot":"","sources":["../../../../src/categories/manoeuvres/__tests__/rocket-delta-v-from-isp.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rocket-delta-v-from-ve.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test, { describe } from 'node:test';
|
|
3
|
-
import { rocketDeltaVFromVe } from '../rocket-delta-v-from-ve';
|
|
4
|
-
import { relClose } from 'packages/equations/src/__tests__/helpers';
|
|
5
|
-
describe('rocketDeltaVFromVe', () => {
|
|
6
|
-
test('computes Δv = ve * ln(m0/mf) for typical inputs', () => {
|
|
7
|
-
const ve = 3100; // m/s
|
|
8
|
-
const m0 = 1200; // kg
|
|
9
|
-
const mf = 800; // kg
|
|
10
|
-
const dv = rocketDeltaVFromVe(ve, m0, mf);
|
|
11
|
-
const expected = ve * Math.log(m0 / mf);
|
|
12
|
-
relClose(dv, expected);
|
|
13
|
-
assert.ok(dv > 0);
|
|
14
|
-
});
|
|
15
|
-
test('returns 0 when m0 === mf (but function disallows this, so we test a near-limit case)', () => {
|
|
16
|
-
const ve = 3000;
|
|
17
|
-
const m0 = 1000;
|
|
18
|
-
const mf = 999.999;
|
|
19
|
-
const dv = rocketDeltaVFromVe(ve, m0, mf);
|
|
20
|
-
// ln(1 + tiny) ~ tiny
|
|
21
|
-
assert.ok(dv >= 0);
|
|
22
|
-
assert.ok(dv < 10, `expected small dv, got ${dv}`);
|
|
23
|
-
});
|
|
24
|
-
test('scales linearly with ve (doubling ve doubles Δv)', () => {
|
|
25
|
-
const m0 = 1200;
|
|
26
|
-
const mf = 800;
|
|
27
|
-
const dv1 = rocketDeltaVFromVe(1000, m0, mf);
|
|
28
|
-
const dv2 = rocketDeltaVFromVe(2000, m0, mf);
|
|
29
|
-
relClose(dv2 / dv1, 2);
|
|
30
|
-
});
|
|
31
|
-
test('increases as mf decreases (more propellant -> higher Δv)', () => {
|
|
32
|
-
const ve = 3000;
|
|
33
|
-
const m0 = 1000;
|
|
34
|
-
const dvLessProp = rocketDeltaVFromVe(ve, m0, 900);
|
|
35
|
-
const dvMoreProp = rocketDeltaVFromVe(ve, m0, 500);
|
|
36
|
-
assert.ok(dvMoreProp > dvLessProp, `${dvMoreProp} should be > ${dvLessProp}`);
|
|
37
|
-
});
|
|
38
|
-
test('throws TypeError when any input is not finite', () => {
|
|
39
|
-
assert.throws(() => rocketDeltaVFromVe(Number.NaN, 1, 0.5), (err) => err instanceof TypeError &&
|
|
40
|
-
err.message === 've must be a finite number. Received: NaN');
|
|
41
|
-
assert.throws(() => rocketDeltaVFromVe(1, Number.POSITIVE_INFINITY, 0.5), (err) => err instanceof TypeError &&
|
|
42
|
-
err.message === 'm0 must be a finite number. Received: Infinity');
|
|
43
|
-
assert.throws(() => rocketDeltaVFromVe(1, 1, Number.NEGATIVE_INFINITY), (err) => err instanceof TypeError &&
|
|
44
|
-
err.message === 'mf must be a finite number. Received: -Infinity');
|
|
45
|
-
});
|
|
46
|
-
test('throws RangeError when ve <= 0', () => {
|
|
47
|
-
assert.throws(() => rocketDeltaVFromVe(0, 10, 5), (err) => err instanceof RangeError &&
|
|
48
|
-
err.message === 've must be > 0. Received: 0');
|
|
49
|
-
});
|
|
50
|
-
test('throws RangeError when m0 <= 0', () => {
|
|
51
|
-
assert.throws(() => rocketDeltaVFromVe(1, 0, 0.5), (err) => err instanceof RangeError &&
|
|
52
|
-
err.message === 'm0 must be > 0. Received: 0');
|
|
53
|
-
});
|
|
54
|
-
test('throws RangeError when mf <= 0', () => {
|
|
55
|
-
assert.throws(() => rocketDeltaVFromVe(1, 10, 0), (err) => err instanceof RangeError &&
|
|
56
|
-
err.message === 'mf must be > 0. Received: 0');
|
|
57
|
-
});
|
|
58
|
-
test('throws RangeError when mf >= m0', () => {
|
|
59
|
-
assert.throws(() => rocketDeltaVFromVe(1, 10, 10), (err) => err instanceof RangeError &&
|
|
60
|
-
err.message === 'mf must be < m0. Received: mf=10, m0=10');
|
|
61
|
-
assert.throws(() => rocketDeltaVFromVe(1, 10, 11), (err) => err instanceof RangeError &&
|
|
62
|
-
err.message === 'mf must be < m0. Received: mf=11, m0=10');
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
//# sourceMappingURL=rocket-delta-v-from-ve.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rocket-delta-v-from-ve.spec.js","sourceRoot":"","sources":["../../../../src/categories/manoeuvres/__tests__/rocket-delta-v-from-ve.spec.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAEpE,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC3D,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,MAAM;QACvB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK;QACtB,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,KAAK;QAErB,MAAM,EAAE,GAAG,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAE1C,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACxC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QACvB,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sFAAsF,EAAE,GAAG,EAAE;QAChG,MAAM,EAAE,GAAG,IAAI,CAAC;QAChB,MAAM,EAAE,GAAG,IAAI,CAAC;QAChB,MAAM,EAAE,GAAG,OAAO,CAAC;QAEnB,MAAM,EAAE,GAAG,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAE1C,sBAAsB;QACtB,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QACnB,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,0BAA0B,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC5D,MAAM,EAAE,GAAG,IAAI,CAAC;QAChB,MAAM,EAAE,GAAG,GAAG,CAAC;QAEf,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAE7C,QAAQ,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACpE,MAAM,EAAE,GAAG,IAAI,CAAC;QAChB,MAAM,EAAE,GAAG,IAAI,CAAC;QAEhB,MAAM,UAAU,GAAG,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QAEnD,MAAM,CAAC,EAAE,CACP,UAAU,GAAG,UAAU,EACvB,GAAG,UAAU,gBAAgB,UAAU,EAAE,CAC1C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAC5C,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,YAAY,SAAS;YACxB,GAAG,CAAC,OAAO,KAAK,2CAA2C,CAC9D,CAAC;QAEF,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,iBAAiB,EAAE,GAAG,CAAC,EAC1D,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,YAAY,SAAS;YACxB,GAAG,CAAC,OAAO,KAAK,gDAAgD,CACnE,CAAC;QAEF,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,EACxD,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,YAAY,SAAS;YACxB,GAAG,CAAC,OAAO,KAAK,iDAAiD,CACpE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAClC,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,YAAY,UAAU;YACzB,GAAG,CAAC,OAAO,KAAK,6BAA6B,CAChD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EACnC,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,YAAY,UAAU;YACzB,GAAG,CAAC,OAAO,KAAK,6BAA6B,CAChD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAClC,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,YAAY,UAAU;YACzB,GAAG,CAAC,OAAO,KAAK,6BAA6B,CAChD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EACnC,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,YAAY,UAAU;YACzB,GAAG,CAAC,OAAO,KAAK,yCAAyC,CAC5D,CAAC;QAEF,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EACnC,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,YAAY,UAAU;YACzB,GAAG,CAAC,OAAO,KAAK,yCAAyC,CAC5D,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"atmospheric-drag-acceleration.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test, { describe } from 'node:test';
|
|
3
|
-
import { atmosphericDragAcceleration } from '../atmospheric-drag-acceleration';
|
|
4
|
-
import { relClose } from 'packages/equations/src/__tests__/helpers';
|
|
5
|
-
describe('atmosphericDragAcceleration', () => {
|
|
6
|
-
test('computes aD = 0.5 * (Cd*A/m) * rho * v² for typical inputs', () => {
|
|
7
|
-
const Cd = 2.2;
|
|
8
|
-
const A = 2.0; // m²
|
|
9
|
-
const m = 500; // kg
|
|
10
|
-
const rho = 1e-12; // kg/m^3
|
|
11
|
-
const v = 7700; // m/s
|
|
12
|
-
const aD = atmosphericDragAcceleration(Cd, A, m, rho, v);
|
|
13
|
-
const expected = 0.5 * ((Cd * A) / m) * rho * v * v;
|
|
14
|
-
relClose(aD, expected);
|
|
15
|
-
assert.ok(aD >= 0);
|
|
16
|
-
});
|
|
17
|
-
test('returns 0 when rho = 0', () => {
|
|
18
|
-
const aD = atmosphericDragAcceleration(2.2, 2.0, 500, 0, 7700);
|
|
19
|
-
assert.equal(aD, 0);
|
|
20
|
-
});
|
|
21
|
-
test('returns 0 when v = 0', () => {
|
|
22
|
-
const aD = atmosphericDragAcceleration(2.2, 2.0, 500, 1e-12, 0);
|
|
23
|
-
assert.equal(aD, 0);
|
|
24
|
-
});
|
|
25
|
-
test('returns 0 when A = 0 (no reference area)', () => {
|
|
26
|
-
const aD = atmosphericDragAcceleration(2.2, 0, 500, 1e-12, 7700);
|
|
27
|
-
assert.equal(aD, 0);
|
|
28
|
-
});
|
|
29
|
-
test('scales with v² (doubling v quadruples aD)', () => {
|
|
30
|
-
const Cd = 2.2;
|
|
31
|
-
const A = 2.0;
|
|
32
|
-
const m = 500;
|
|
33
|
-
const rho = 1e-12;
|
|
34
|
-
const a1 = atmosphericDragAcceleration(Cd, A, m, rho, 1000);
|
|
35
|
-
const a2 = atmosphericDragAcceleration(Cd, A, m, rho, 2000);
|
|
36
|
-
relClose(a2 / a1, 4);
|
|
37
|
-
});
|
|
38
|
-
test('throws TypeError when any input is not finite', () => {
|
|
39
|
-
assert.throws(() => atmosphericDragAcceleration(Number.NaN, 1, 1, 1, 1), (err) => err instanceof TypeError &&
|
|
40
|
-
err.message === 'Cd must be a finite number. Received: NaN');
|
|
41
|
-
assert.throws(() => atmosphericDragAcceleration(1, Number.POSITIVE_INFINITY, 1, 1, 1), (err) => err instanceof TypeError &&
|
|
42
|
-
err.message === 'A must be a finite number. Received: Infinity');
|
|
43
|
-
assert.throws(() => atmosphericDragAcceleration(1, 1, Number.NEGATIVE_INFINITY, 1, 1), (err) => err instanceof TypeError &&
|
|
44
|
-
err.message === 'm must be a finite number. Received: -Infinity');
|
|
45
|
-
assert.throws(() => atmosphericDragAcceleration(1, 1, 1, Number.NaN, 1), (err) => err instanceof TypeError &&
|
|
46
|
-
err.message === 'rho must be a finite number. Received: NaN');
|
|
47
|
-
assert.throws(() => atmosphericDragAcceleration(1, 1, 1, 1, Number.NaN), (err) => err instanceof TypeError &&
|
|
48
|
-
err.message === 'v must be a finite number. Received: NaN');
|
|
49
|
-
});
|
|
50
|
-
test('throws RangeError when Cd < 0', () => {
|
|
51
|
-
assert.throws(() => atmosphericDragAcceleration(-1e-9, 1, 1, 1, 1), (err) => err instanceof RangeError &&
|
|
52
|
-
err.message === 'Cd must be >= 0. Received: -1e-9');
|
|
53
|
-
});
|
|
54
|
-
test('throws RangeError when A < 0', () => {
|
|
55
|
-
assert.throws(() => atmosphericDragAcceleration(1, -1e-9, 1, 1, 1), (err) => err instanceof RangeError &&
|
|
56
|
-
err.message === 'A must be >= 0. Received: -1e-9');
|
|
57
|
-
});
|
|
58
|
-
test('throws RangeError when m <= 0', () => {
|
|
59
|
-
assert.throws(() => atmosphericDragAcceleration(1, 1, 0, 1, 1), (err) => err instanceof RangeError &&
|
|
60
|
-
err.message === 'm must be > 0. Received: 0');
|
|
61
|
-
});
|
|
62
|
-
test('throws RangeError when rho < 0', () => {
|
|
63
|
-
assert.throws(() => atmosphericDragAcceleration(1, 1, 1, -1e-9, 1), (err) => err instanceof RangeError &&
|
|
64
|
-
err.message === 'rho must be >= 0. Received: -1e-9');
|
|
65
|
-
});
|
|
66
|
-
test('throws RangeError when v < 0', () => {
|
|
67
|
-
assert.throws(() => atmosphericDragAcceleration(1, 1, 1, 1, -1e-9), (err) => err instanceof RangeError &&
|
|
68
|
-
err.message === 'v must be >= 0. Received: -1e-9');
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
//# sourceMappingURL=atmospheric-drag-acceleration.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"atmospheric-drag-acceleration.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/atmospheric-drag-acceleration.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"characteristic-energy-c3.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/characteristic-energy-c3.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test, { describe } from 'node:test';
|
|
3
|
-
import { characteristicEnergyC3 } from '../characteristic-energy-c3';
|
|
4
|
-
import { relClose } from 'packages/equations/src/__tests__/helpers';
|
|
5
|
-
describe('characteristicEnergyC3', () => {
|
|
6
|
-
test('returns vInfinity² for a positive number', () => {
|
|
7
|
-
const vInf = 3.2;
|
|
8
|
-
const c3 = characteristicEnergyC3(vInf);
|
|
9
|
-
// avoid strict equality for floats
|
|
10
|
-
relClose(c3, 10.24);
|
|
11
|
-
});
|
|
12
|
-
test('returns vInfinity² for zero', () => {
|
|
13
|
-
assert.equal(characteristicEnergyC3(0), 0);
|
|
14
|
-
});
|
|
15
|
-
test('returns vInfinity² for a negative number (squares it)', () => {
|
|
16
|
-
assert.equal(characteristicEnergyC3(-4), 16);
|
|
17
|
-
});
|
|
18
|
-
test('works with decimal inputs', () => {
|
|
19
|
-
const vInf = 1.2345;
|
|
20
|
-
const c3 = characteristicEnergyC3(vInf);
|
|
21
|
-
relClose(c3, vInf * vInf);
|
|
22
|
-
});
|
|
23
|
-
test('throws TypeError for NaN', () => {
|
|
24
|
-
assert.throws(() => characteristicEnergyC3(Number.NaN), (err) => err instanceof TypeError &&
|
|
25
|
-
err.message === 'vInfinity must be a finite number. Received: NaN');
|
|
26
|
-
});
|
|
27
|
-
test('throws TypeError for +Infinity', () => {
|
|
28
|
-
assert.throws(() => characteristicEnergyC3(Number.POSITIVE_INFINITY), (err) => err instanceof TypeError &&
|
|
29
|
-
err.message === 'vInfinity must be a finite number. Received: Infinity');
|
|
30
|
-
});
|
|
31
|
-
test('throws TypeError for -Infinity', () => {
|
|
32
|
-
assert.throws(() => characteristicEnergyC3(Number.NEGATIVE_INFINITY), (err) => err instanceof TypeError &&
|
|
33
|
-
err.message === 'vInfinity must be a finite number. Received: -Infinity');
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
//# sourceMappingURL=characteristic-energy-c3.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"characteristic-energy-c3.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/characteristic-energy-c3.spec.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAEpE,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACpD,MAAM,IAAI,GAAG,GAAG,CAAC;QACjB,MAAM,EAAE,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAExC,mCAAmC;QACnC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC;QACpB,MAAM,EAAE,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAExC,QAAQ,CAAC,EAAE,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,sBAAsB,CAAC,MAAM,CAAC,GAAG,CAAC,EACxC,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,YAAY,SAAS;YACxB,GAAG,CAAC,OAAO,KAAK,kDAAkD,CACrE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,sBAAsB,CAAC,MAAM,CAAC,iBAAiB,CAAC,EACtD,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,YAAY,SAAS;YACxB,GAAG,CAAC,OAAO,KAAK,uDAAuD,CAC1E,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,sBAAsB,CAAC,MAAM,CAAC,iBAAiB,CAAC,EACtD,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,YAAY,SAAS;YACxB,GAAG,CAAC,OAAO,KAAK,wDAAwD,CAC3E,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"circular-speed.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/circular-speed.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test, { describe } from 'node:test';
|
|
3
|
-
import { absClose, relClose } from 'packages/equations/src/__tests__/helpers';
|
|
4
|
-
import { circularSpeed } from '../circular-speed';
|
|
5
|
-
describe('circularSpeed', () => {
|
|
6
|
-
test('LEO (~400 km) around Earth: v ≈ 7.67 km/s', () => {
|
|
7
|
-
const mu = 3.986004418e14; // m³/s²
|
|
8
|
-
const r = 6378e3 + 400e3; // m
|
|
9
|
-
const v = circularSpeed(r, mu);
|
|
10
|
-
const expected = Math.sqrt(mu / r);
|
|
11
|
-
relClose(v, expected, 1e-12);
|
|
12
|
-
assert.ok(v > 7400 && v < 7900, `unexpected LEO speed: ${v} m/s`);
|
|
13
|
-
});
|
|
14
|
-
test('GEO (~42,164 km): v ≈ 3074 m/s', () => {
|
|
15
|
-
const mu = 3.986004418e14;
|
|
16
|
-
const r = 42164e3;
|
|
17
|
-
const v = circularSpeed(r, mu);
|
|
18
|
-
const expected = Math.sqrt(mu / r);
|
|
19
|
-
relClose(v, expected, 1e-12);
|
|
20
|
-
// loose real-world check
|
|
21
|
-
const ref = 3074; // m/s
|
|
22
|
-
relClose(v, ref, 0.02); // within 2%
|
|
23
|
-
});
|
|
24
|
-
test('Heliocentric at 1 AU: v ≈ 29.78 km/s', () => {
|
|
25
|
-
const muSun = 1.32712440018e20; // m³/s²
|
|
26
|
-
const AU = 149597870700; // m
|
|
27
|
-
const v = circularSpeed(AU, muSun);
|
|
28
|
-
const ref = 29780; // m/s
|
|
29
|
-
relClose(v, ref, 0.01); // within 1%
|
|
30
|
-
});
|
|
31
|
-
test('Scaling with μ: doubling μ increases v by √2 (same r)', () => {
|
|
32
|
-
const r = 7000e3;
|
|
33
|
-
const mu = 3.986004418e14;
|
|
34
|
-
const v1 = circularSpeed(r, mu);
|
|
35
|
-
const v2 = circularSpeed(r, 2 * mu);
|
|
36
|
-
relClose(v2 / v1, Math.SQRT2, 1e-12);
|
|
37
|
-
});
|
|
38
|
-
test('Scaling with r: quadrupling r halves v (same μ)', () => {
|
|
39
|
-
const mu = 3.986004418e14;
|
|
40
|
-
const r1 = 7000e3;
|
|
41
|
-
const r2 = 4 * r1;
|
|
42
|
-
const v1 = circularSpeed(r1, mu);
|
|
43
|
-
const v2 = circularSpeed(r2, mu);
|
|
44
|
-
relClose(v2 / v1, 0.5, 1e-12);
|
|
45
|
-
});
|
|
46
|
-
test('Degenerate case: μ = 0 → v = 0', () => {
|
|
47
|
-
const r = 7000e3;
|
|
48
|
-
const v = circularSpeed(r, 0);
|
|
49
|
-
absClose(v, 0, 1e-15);
|
|
50
|
-
});
|
|
51
|
-
test('Input validation: r<=0, non-finite r; μ<0, non-finite μ', () => {
|
|
52
|
-
const r = 7000e3;
|
|
53
|
-
const mu = 3.986004418e14;
|
|
54
|
-
// r invalid
|
|
55
|
-
assert.throws(() => circularSpeed(0, mu), /positive/);
|
|
56
|
-
assert.throws(() => circularSpeed(-1, mu), /positive/);
|
|
57
|
-
assert.throws(() => circularSpeed(Number.NaN, mu), /finite/);
|
|
58
|
-
// μ invalid
|
|
59
|
-
assert.throws(() => circularSpeed(r, -1), /non-negative/);
|
|
60
|
-
assert.throws(() => circularSpeed(r, Number.NaN), /finite/);
|
|
61
|
-
});
|
|
62
|
-
test('Numerical sanity: extremely large/small-but-valid values remain finite', () => {
|
|
63
|
-
const v1 = circularSpeed(1e3, 1e9); // small r, large μ
|
|
64
|
-
const v2 = circularSpeed(1e12, 1e6); // huge r, small μ
|
|
65
|
-
assert.ok(Number.isFinite(v1) && v1 > 0);
|
|
66
|
-
assert.ok(Number.isFinite(v2) && v2 > 0);
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
//# sourceMappingURL=circular-speed.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"circular-speed.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/circular-speed.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cw-hill-derivatives.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/cw-hill-derivatives.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test, { describe } from 'node:test';
|
|
3
|
-
import { cwHillDerivatives } from '../cw-hill-derivatives';
|
|
4
|
-
import { relClose, relCloseTuple } from 'packages/equations/src/__tests__/helpers';
|
|
5
|
-
describe('cwHillDerivatives', () => {
|
|
6
|
-
test('returns [xDot,yDot,zDot,xDDot,yDDot,zDDot] matching CW/Hill accelerations', () => {
|
|
7
|
-
const n = 0.001; // rad/s
|
|
8
|
-
const state = [100, -50, 25, 0.2, -0.1, 0.05];
|
|
9
|
-
const ds = cwHillDerivatives(state, n);
|
|
10
|
-
const [x, y, z, xDot, yDot, zDot] = state;
|
|
11
|
-
const n2 = n * n;
|
|
12
|
-
const expected = [
|
|
13
|
-
xDot,
|
|
14
|
-
yDot,
|
|
15
|
-
zDot,
|
|
16
|
-
2 * n * yDot + 3 * n2 * x,
|
|
17
|
-
-2 * n * xDot,
|
|
18
|
-
-n2 * z
|
|
19
|
-
];
|
|
20
|
-
relCloseTuple(ds, expected);
|
|
21
|
-
});
|
|
22
|
-
test('when n = 0, accelerations are zero and derivative is pure velocity', () => {
|
|
23
|
-
const n = 0;
|
|
24
|
-
const state = [1, 2, 3, 0.1, 0.2, 0.3];
|
|
25
|
-
const ds = cwHillDerivatives(state, n);
|
|
26
|
-
const expected = [0.1, 0.2, 0.3, 0, 0, 0];
|
|
27
|
-
relCloseTuple(ds, expected);
|
|
28
|
-
});
|
|
29
|
-
test('z dynamics are simple harmonic: zDDot = -n² z', () => {
|
|
30
|
-
const n = 0.01;
|
|
31
|
-
const state = [0, 0, 123.456, 0, 0, 0];
|
|
32
|
-
const ds = cwHillDerivatives(state, n);
|
|
33
|
-
const expectedZDDot = -(n * n) * state[2];
|
|
34
|
-
relClose(ds[5], expectedZDDot);
|
|
35
|
-
});
|
|
36
|
-
test('throws TypeError when n is not finite (NaN)', () => {
|
|
37
|
-
const state = [0, 0, 0, 0, 0, 0];
|
|
38
|
-
assert.throws(() => cwHillDerivatives(state, Number.NaN), (err) => err instanceof TypeError &&
|
|
39
|
-
err.message === 'n must be finite. Received: NaN');
|
|
40
|
-
});
|
|
41
|
-
test('throws RangeError when n < 0', () => {
|
|
42
|
-
const state = [0, 0, 0, 0, 0, 0];
|
|
43
|
-
assert.throws(() => cwHillDerivatives(state, -1e-9), (err) => err instanceof RangeError &&
|
|
44
|
-
err.message === 'n must be >= 0. Received: -1e-9');
|
|
45
|
-
});
|
|
46
|
-
test('throws TypeError when a state component is not finite', () => {
|
|
47
|
-
const n = 0.001;
|
|
48
|
-
const badX = [Number.NaN, 0, 0, 0, 0, 0];
|
|
49
|
-
assert.throws(() => cwHillDerivatives(badX, n), (err) => err instanceof TypeError &&
|
|
50
|
-
err.message === 'x must be finite. Received: NaN');
|
|
51
|
-
const badYDot = [0, 0, 0, 0, Number.POSITIVE_INFINITY, 0];
|
|
52
|
-
assert.throws(() => cwHillDerivatives(badYDot, n), (err) => err instanceof TypeError &&
|
|
53
|
-
err.message === 'yDot must be finite. Received: Infinity');
|
|
54
|
-
});
|
|
55
|
-
test('output is always finite for finite inputs', () => {
|
|
56
|
-
const n = 0.002;
|
|
57
|
-
const state = [1e6, -1e6, 1e5, 10, -10, 1];
|
|
58
|
-
const ds = cwHillDerivatives(state, n);
|
|
59
|
-
for (const v of ds) {
|
|
60
|
-
assert.ok(Number.isFinite(v), `expected finite output, got ${v}`);
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
//# sourceMappingURL=cw-hill-derivatives.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cw-hill-derivatives.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/cw-hill-derivatives.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"escape-speed.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/escape-speed.spec.ts"],"names":[],"mappings":""}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert/strict';
|
|
2
|
-
import test, { describe } from 'node:test';
|
|
3
|
-
import { escapeSpeed } from '../escape-speed';
|
|
4
|
-
import { absClose, relClose } from 'packages/equations/src/__tests__/helpers';
|
|
5
|
-
describe('escapeSpeed', () => {
|
|
6
|
-
test('definition check: v_esc = sqrt(2μ/r)', () => {
|
|
7
|
-
const mu = 3.986004418e14; // m³/s² (Earth GM)
|
|
8
|
-
const r = 7000e3; // m
|
|
9
|
-
const v = escapeSpeed(r, mu);
|
|
10
|
-
const expected = Math.sqrt((2 * mu) / r);
|
|
11
|
-
relClose(v, expected, 1e-15);
|
|
12
|
-
});
|
|
13
|
-
test('relationship to circular speed: v_esc = √2 * √(μ/r)', () => {
|
|
14
|
-
const mu = 3.986004418e14;
|
|
15
|
-
const r = 7000e3;
|
|
16
|
-
const vEsc = escapeSpeed(r, mu);
|
|
17
|
-
const vCirc = Math.sqrt(mu / r);
|
|
18
|
-
relClose(vEsc / vCirc, Math.SQRT2, 1e-15);
|
|
19
|
-
});
|
|
20
|
-
test('Earth surface ~6378 km: v_esc ≈ 11.186 km/s', () => {
|
|
21
|
-
const mu = 3.986004418e14;
|
|
22
|
-
const rSurface = 6378e3;
|
|
23
|
-
const v = escapeSpeed(rSurface, mu);
|
|
24
|
-
const ref = 11186; // m/s
|
|
25
|
-
relClose(v, ref, 0.01); // within 1%
|
|
26
|
-
});
|
|
27
|
-
test('LEO (~400 km): v_esc ≈ 10.86 km/s', () => {
|
|
28
|
-
const mu = 3.986004418e14;
|
|
29
|
-
const rLeo = 6378e3 + 400e3;
|
|
30
|
-
const v = escapeSpeed(rLeo, mu);
|
|
31
|
-
const ref = 10860; // m/s
|
|
32
|
-
relClose(v, ref, 0.02); // within 2%
|
|
33
|
-
});
|
|
34
|
-
test('scaling with μ: doubling μ → v scales by √2 (same r)', () => {
|
|
35
|
-
const r = 7000e3;
|
|
36
|
-
const mu = 3.986004418e14;
|
|
37
|
-
const v1 = escapeSpeed(r, mu);
|
|
38
|
-
const v2 = escapeSpeed(r, 2 * mu);
|
|
39
|
-
relClose(v2 / v1, Math.SQRT2, 1e-15);
|
|
40
|
-
});
|
|
41
|
-
test('scaling with r: quadrupling r → v halves (same μ)', () => {
|
|
42
|
-
const mu = 3.986004418e14;
|
|
43
|
-
const r1 = 7000e3;
|
|
44
|
-
const r2 = 4 * r1;
|
|
45
|
-
const v1 = escapeSpeed(r1, mu);
|
|
46
|
-
const v2 = escapeSpeed(r2, mu);
|
|
47
|
-
relClose(v2 / v1, 0.5, 1e-15);
|
|
48
|
-
});
|
|
49
|
-
test('dimensionless identity: (v² * r) / (2μ) ≈ 1', () => {
|
|
50
|
-
const mu = 1.2345e12;
|
|
51
|
-
const r = 3.21e7;
|
|
52
|
-
const v = escapeSpeed(r, mu);
|
|
53
|
-
const ratio = (v * v * r) / (2 * mu);
|
|
54
|
-
relClose(ratio, 1, 1e-12);
|
|
55
|
-
});
|
|
56
|
-
test('degenerate case μ = 0 → v_esc = 0', () => {
|
|
57
|
-
const r = 7000e3;
|
|
58
|
-
const v = escapeSpeed(r, 0);
|
|
59
|
-
absClose(v, 0, 1e-15);
|
|
60
|
-
});
|
|
61
|
-
test('input validation: r<=0, non-finite r; μ<0, non-finite μ throw', () => {
|
|
62
|
-
const r = 7000e3;
|
|
63
|
-
const mu = 3.986004418e14;
|
|
64
|
-
// r invalid
|
|
65
|
-
assert.throws(() => escapeSpeed(0, mu), /positive/);
|
|
66
|
-
assert.throws(() => escapeSpeed(-1, mu), /positive/);
|
|
67
|
-
assert.throws(() => escapeSpeed(Number.NaN, mu), /finite/);
|
|
68
|
-
// μ invalid
|
|
69
|
-
assert.throws(() => escapeSpeed(r, -1), /non-negative/);
|
|
70
|
-
assert.throws(() => escapeSpeed(r, Number.NaN), /finite/);
|
|
71
|
-
});
|
|
72
|
-
test('numerical sanity: extreme but valid values remain finite and positive', () => {
|
|
73
|
-
const v1 = escapeSpeed(1e3, 1e9); // small r, large μ
|
|
74
|
-
const v2 = escapeSpeed(1e12, 1e6); // large r, small μ
|
|
75
|
-
assert.ok(Number.isFinite(v1) && v1 > 0);
|
|
76
|
-
assert.ok(Number.isFinite(v2) && v2 > 0);
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
//# sourceMappingURL=escape-speed.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"escape-speed.spec.js","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/escape-speed.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flight-path-angle-from-true-anomaly.spec.d.ts","sourceRoot":"","sources":["../../../../src/categories/orbits/__tests__/flight-path-angle-from-true-anomaly.spec.ts"],"names":[],"mappings":""}
|