This guide covers the gravity models in Vulcan, from simple point mass to spherical harmonic expansions, all with full symbolic compatibility for trajectory optimization.
Quick Start
Vec3<double> r;
r << 7000000.0, 0.0, 0.0;
Vec3< Scalar > acceleration(const Vec3< Scalar > &r_ecef, double mu=constants::earth::mu, double J2_coeff=constants::earth::J2, double R_eq=constants::earth::R_eq)
J2 gravitational acceleration (oblate Earth).
Definition J2.hpp:30
Vec3< Scalar > acceleration(const Vec3< Scalar > &r_ecef, double mu=constants::earth::mu, double J2_coeff=constants::earth::J2, double J3_coeff=constants::earth::J3, double J4_coeff=constants::earth::J4, double R_eq=constants::earth::R_eq)
J2/J3/J4 gravitational acceleration.
Definition J2J4.hpp:29
Vec3< Scalar > acceleration(const Vec3< Scalar > &r_ecef, double mu=constants::earth::mu)
Point mass gravitational acceleration.
Definition PointMass.hpp:24
Definition GravityTypes.hpp:7
Definition Aerodynamics.hpp:11
Coordinate Convention
All gravity functions use the ECEF (Earth-Centered, Earth-Fixed) frame:
- Position r: Vector from Earth's center to your point, in meters
- Acceleration g: Points toward Earth's center (opposite to r)
Direction from Potential
The gravitational acceleration is the negative gradient of the potential:
| Quantity | Sign | Physical Meaning |
| Potential U | Negative | Lower (more negative) = more bound |
| Acceleration g | Toward center | Always points "downhill" in potential |
Example
Vec3<double> r;
r << 7000000.0, 0.0, 0.0;
Available Models
| Model | Fidelity | Use Case | Function |
| Point Mass | Low | Quick estimates | point_mass::acceleration() |
| J2 | Medium | LEO/MEO, 6-DOF sim | j2::acceleration() |
| J2-J4 | High | Precise propagation | j2j4::acceleration() |
| Spherical Harmonics | Very High | High-precision | spherical_harmonics::acceleration() |
Point Mass Gravity
The simplest model treating Earth as a uniform sphere:
Scalar potential(const Vec3< Scalar > &r_ecef, double mu=constants::earth::mu)
Point mass gravitational potential.
Definition PointMass.hpp:44
Scalar acceleration_magnitude(const Scalar &r_mag, double mu=constants::earth::mu)
Gravitational acceleration magnitude at distance r.
Definition PointMass.hpp:62
J2 Oblate Earth Model
Accounts for Earth's equatorial bulge—the dominant perturbation for satellites:
Scalar potential(const Vec3< Scalar > &r_ecef, double mu=constants::earth::mu, double J2_coeff=constants::earth::J2, double R_eq=constants::earth::R_eq)
J2 gravitational potential.
Definition J2.hpp:77
J2 Effects
- Equatorial gravity: Slightly reduced (~9.78 m/s² vs ~9.83 at poles)
- Nodal precession: Orbital plane rotates over time
- Apsidal precession: Orbit ellipse rotates
J2-J4 Higher Fidelity
Includes J3 (pear shape) and J4 (higher-order oblateness):
Scalar potential(const Vec3< Scalar > &r_ecef, double mu=constants::earth::mu, double J2_coeff=constants::earth::J2, double J3_coeff=constants::earth::J3, double J4_coeff=constants::earth::J4, double R_eq=constants::earth::R_eq)
J2/J3/J4 gravitational potential.
Definition J2J4.hpp:108
Spherical Harmonics
General expansion for highest fidelity:
Vec3< Scalar > acceleration(const Vec3< Scalar > &r_ecef, const GravityCoefficients &coeffs=default_coefficients())
Spherical harmonic gravitational acceleration.
Definition SphericalHarmonics.hpp:121
Gravity model coefficients container.
Definition SphericalHarmonics.hpp:20
Legendre Polynomials
The implementation includes associated Legendre polynomial computation:
Scalar legendre_Pnm(int n, int m, const Scalar &x)
Compute associated Legendre polynomial P_nm(x).
Definition SphericalHarmonics.hpp:69
Symbolic Computation
All gravity models work with janus::SymbolicScalar for optimization:
using Scalar = janus::SymbolicScalar;
Scalar x = janus::sym("x");
Scalar y = janus::sym("y");
Scalar z = janus::sym("z");
Vec3<Scalar> r;
r << x, y, z;
janus::Function f("gravity", {x, y, z}, {g(0), g(1), g(2)});
auto result =
f({7000000.0, 0.0, 0.0});
constexpr double f
Flattening (WGS84).
Definition Constants.hpp:25
Gravity Gradient (Jacobian)
Compute the Jacobian for orbit propagation and control:
auto J = janus::jacobian({g(0), g(1), g(2)}, {x, y, z});
janus::Function f_grad("gravity_gradient", {x, y, z},
{J(0,0), J(0,1), J(0,2),
J(1,0), J(1,1), J(1,2),
J(2,0), J(2,1), J(2,2)});
Graph Visualization
Export computational graphs as interactive HTML:
janus::export_graph_html(g(0), "gravity_graph", "J2_Gravity_X");
Physical Constants
All constants are in vulcan::constants::earth:
constexpr double R_pol
Polar radius [m].
Definition Constants.hpp:19
constexpr double R_eq
Equatorial radius [m] (WGS84).
Definition Constants.hpp:16
constexpr double J4
J4 zonal harmonic coefficient.
Definition Constants.hpp:34
constexpr double J3
J3 zonal harmonic coefficient.
Definition Constants.hpp:31
constexpr double J2
J2 zonal harmonic coefficient.
Definition Constants.hpp:28
constexpr double mu
Gravitational parameter (GM) [m^3/s^2].
Definition Constants.hpp:13
API Reference
point_mass namespace
| Function | Description |
| acceleration(r) | Gravitational acceleration g = -μ/r³ · r |
| acceleration_magnitude(r_mag) | |g| = μ/r² |
| potential(r) | U = -μ/r |
j2 namespace
| Function | Description |
| acceleration(r, [mu, J2, R_eq]) | J2 oblate Earth gravity |
| potential(r, [mu, J2, R_eq]) | J2 gravitational potential |
j2j4 namespace
| Function | Description |
| acceleration(r, [mu, J2, J3, J4, R_eq]) | J2-J4 zonal harmonics |
| potential(r, [mu, J2, J3, J4, R_eq]) | J2-J4 potential |
spherical_harmonics namespace
| Function | Description |
| acceleration(r, [coeffs]) | General spherical harmonic acceleration |
| potential(r, [coeffs]) | General spherical harmonic potential |
| legendre_Pnm(n, m, x) | Associated Legendre polynomial P_nm(x) |
| GravityCoefficients(n_max) | Coefficient container with default Earth values |
Example: Complete Demo
See examples/gravity/gravity_demo.cpp for a comprehensive demonstration.
# Build and run
./scripts/build.sh
./build/examples/gravity_demo
Sample output:
=== Vulcan Gravity Models Demo ===
--- 1. Point Mass Gravity ---
ISS gravity (point mass): [-8.691234, 0.000000, 0.000000] m/s²
Magnitude: 8.691234 m/s²
--- 2. J2 Gravity (Oblate Earth) ---
J2 effect: Polar gravity is 0.52% stronger than equatorial
...