UNPKG

keplerian-core

Version:

High-performance TypeScript library for orbital mechanics calculations, providing numerical integration, state propagation, and perturbation modeling for Keplerian orbits.

141 lines (140 loc) 5.78 kB
import { simulate } from '../src/simulation'; describe('Simulation Function', () => { // Test case for basic simulation with RK4 integrator it('should simulate a basic orbit using RK4 integrator', () => { const initialConditions = { position: { x: 149.6e9, y: 0 }, // 1 AU velocity: { x: 0, y: 29780 } // Earth's orbital velocity around Sun }; const simulationParams = { gravitationalConstant: 6.67430e-11, centralMass: 1.989e30, // Sun's mass orbitingMass: 5.972e24, // Earth's mass gravitationalParameter: 6.67430e-11 * 1.989e30, // G * M_sun timeStep: 3600, // 1 hour totalTime: 24 * 3600, // 1 Earth day integrator: 'rk4' // Using RK4 for better accuracy }; const result = simulate(initialConditions, simulationParams, 'json'); expect(result).toBeInstanceOf(Array); const states = result; expect(states.length).toBeGreaterThan(0); expect(states[0].position).toEqual(initialConditions.position); }); // Test case for different integrator (Euler) it('should simulate an orbit using Euler integrator', () => { const initialConditions = { position: { x: 149.6e9, y: 0 }, velocity: { x: 0, y: 29780 } }; const simulationParams = { gravitationalConstant: 6.67430e-11, centralMass: 1.989e30, orbitingMass: 5.972e24, gravitationalParameter: 6.67430e-11 * 1.989e30, timeStep: 3600, totalTime: 24 * 3600, integrator: 'euler' // Using Euler integrator }; const result = simulate(initialConditions, simulationParams, 'json'); expect(result).toBeInstanceOf(Array); const states = result; expect(states.length).toBeGreaterThan(0); }); // Test case for CSV format output it('should return CSV format when requested', () => { const initialConditions = { position: { x: 149.6e9, y: 0 }, velocity: { x: 0, y: 29780 } }; const simulationParams = { gravitationalConstant: 6.67430e-11, centralMass: 1.989e30, orbitingMass: 5.972e24, gravitationalParameter: 6.67430e-11 * 1.989e30, timeStep: 3600, totalTime: 24 * 3600, integrator: 'rk4' }; const result = simulate(initialConditions, simulationParams, 'csv'); expect(typeof result).toBe('string'); expect(result).toContain('position.x,position.y,velocity.x,velocity.y'); }); // Test case for unknown integrator it('should throw an error for an unknown integrator', () => { const initialConditions = { position: { x: 0, y: 0 }, velocity: { x: 0, y: 0 } }; const simulationParams = { gravitationalConstant: 6.67430e-11, centralMass: 1.989e30, orbitingMass: 1, gravitationalParameter: 6.67430e-11 * 1.989e30, timeStep: 1, totalTime: 1, integrator: 'unknown' // Cast to any to test unknown case }; expect(() => simulate(initialConditions, simulationParams, 'json')).toThrow('Unknown integrator: unknown'); }); // Test case for Leapfrog integrator it('should simulate an orbit using Leapfrog integrator', () => { const initialConditions = { position: { x: 149.6e9, y: 0 }, velocity: { x: 0, y: 29780 } }; const simulationParams = { gravitationalConstant: 6.67430e-11, centralMass: 1.989e30, orbitingMass: 5.972e24, gravitationalParameter: 6.67430e-11 * 1.989e30, timeStep: 3600, totalTime: 24 * 3600, integrator: 'leapfrog' // Using Leapfrog integrator }; const result = simulate(initialConditions, simulationParams, 'json'); expect(result).toBeInstanceOf(Array); const states = result; expect(states.length).toBeGreaterThan(0); }); // Test case for RK2 integrator it('should simulate an orbit using RK2 integrator', () => { const initialConditions = { position: { x: 149.6e9, y: 0 }, velocity: { x: 0, y: 29780 } }; const simulationParams = { gravitationalConstant: 6.67430e-11, centralMass: 1.989e30, orbitingMass: 5.972e24, gravitationalParameter: 6.67430e-11 * 1.989e30, timeStep: 3600, totalTime: 24 * 3600, integrator: 'rk2' // Using RK2 integrator }; const result = simulate(initialConditions, simulationParams, 'json'); expect(result).toBeInstanceOf(Array); const states = result; expect(states.length).toBeGreaterThan(0); }); // Test case for Velocity Verlet integrator it('should simulate an orbit using Velocity Verlet integrator', () => { const initialConditions = { position: { x: 149.6e9, y: 0 }, velocity: { x: 0, y: 29780 } }; const simulationParams = { gravitationalConstant: 6.67430e-11, centralMass: 1.989e30, orbitingMass: 5.972e24, gravitationalParameter: 6.67430e-11 * 1.989e30, timeStep: 3600, totalTime: 24 * 3600, integrator: 'velocity-verlet' // Using Velocity Verlet integrator }; const result = simulate(initialConditions, simulationParams, 'json'); expect(result).toBeInstanceOf(Array); const states = result; expect(states.length).toBeGreaterThan(0); }); });