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
JavaScript
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);
});
});