keplerian-core
Version:
High-performance TypeScript library for orbital mechanics calculations, providing numerical integration, state propagation, and perturbation modeling for Keplerian orbits.
33 lines (32 loc) • 1.72 kB
JavaScript
// Leapfrog integrator implementation
import { vectorAdd, vectorScale, vectorCross2D } from '../../utils/vector';
import { calculateRungeLenzVector, calculateOrbitalEnergy } from '../forces';
export const leapfrogIntegrator = {
name: 'leapfrog',
displayName: 'Leapfrog',
description: 'Second-order symplectic integrator. Good energy conservation.',
order: 2,
recommended: false,
function: (state, params, accelerationFn, time, dt) => {
const acceleration = accelerationFn(state.position, state.velocity, params);
const halfVelocity = vectorAdd(state.velocity, vectorScale(acceleration, 0.5 * params.timeStep));
const newPosition = vectorAdd(state.position, vectorScale(halfVelocity, params.timeStep));
const newAcceleration = accelerationFn(newPosition, halfVelocity, params);
const newVelocity = vectorAdd(halfVelocity, vectorScale(newAcceleration, 0.5 * params.timeStep));
const momentum = vectorScale(newVelocity, params.orbitingMass);
const angularMomentum = vectorCross2D(newPosition, momentum);
const rungeLenzVector = calculateRungeLenzVector(newPosition, newVelocity, params);
const energy = calculateOrbitalEnergy(newPosition, newVelocity, params);
const k = params.gravitationalConstant * params.centralMass * params.orbitingMass;
const eccentricity = Math.sqrt(rungeLenzVector.x * rungeLenzVector.x + rungeLenzVector.y * rungeLenzVector.y) / (params.orbitingMass * k);
return {
position: newPosition,
velocity: newVelocity,
momentum,
angularMomentum,
rungeLenzVector,
energy,
eccentricity
};
}
};