cartan

Jacobi Fields

Jacobi fields measure how nearby geodesics spread apart. integrate_jacobi solves the Jacobi ODE along a geodesic using RK4 integration, returning field values at sampled parameter values and detecting conjugate points.

Summary

PropertyValue
Functionintegrate_jacobi
ReturnsJacobiResult
ODE
IntegratorRK4 with fixed step size
Trait requirementsManifold + Curvature

The Jacobi ODE

A Jacobi field along geodesic satisfies:

with initial conditions (initial displacement) and (initial derivative). is the Riemann curvature tensor.

Conjugate points: is conjugate to along if there exists a non-zero Jacobi field with and . Past the first conjugate point, the exponential map is no longer a local diffeomorphism; geodesics are no longer locally length-minimizing.

JacobiResult

pub struct JacobiResult {
    pub t_values:        Vec<f64>,        // parameter values
    pub field_values:    Vec<M::Tangent>, // J(t) at each t
    pub norms:           Vec<f64>,        // ||J(t)|| at each t
    pub conjugate_point: Option<f64>,     // first t where ||J(t)|| < tol, if any
}

Code Examples

Jacobi field on S²

use cartan::prelude::*;
use cartan::manifolds::Sphere;
use cartan_geo::{Geodesic, integrate_jacobi};
use nalgebra::SVector;
 
let s2 = Sphere::<3>;
let p  = [1.0_f64, 0.0, 0.0];
let v  = s2.project_tangent(&p, &[0.0_f64, 1.0, 0.0]);  // unit speed
 
let geo = Geodesic::new(&s2, p, v.clone());
 
// Initial Jacobi field: J(0) = 0, J'(0) = perpendicular to v
let j0   = [0.0_f64; 3].into();
let j0p  = s2.project_tangent(&p, &SVector::from([0.0_f64, 0.0, 1.0]));
 
let result = integrate_jacobi(&s2, &geo, j0, j0p, 100, std::f64::consts::PI);
 
// On S², conjugate point at t = π (antipodal)
assert!(result.conjugate_point.is_some());
let t_conj = result.conjugate_point.unwrap();
assert!((t_conj - std::f64::consts::PI).abs() < 0.1);

Checking geodesic stability

// If no conjugate point before t = 1: geodesic from p to q is minimizing
if result.conjugate_point.map(|t| t > 1.0).unwrap_or(true) {
    println!("Geodesic is length-minimizing on [0, 1]");
}

Numerical Notes

Step size: use n_steps large enough that the step size is well below the injectivity radius. For with , n_steps = 100 gives , adequate for most uses.

Conjugate point detection: detected when . Increase n_steps for sharper localization.

Curvature dependency: high curvature (small injectivity radius) requires smaller step sizes for accurate integration.

Applications

  • Conjugate point detection: determine the valid domain of the exponential map
  • Geodesic instability analysis: active nematics, volterra defect dynamics
  • Sensitivity analysis: how perturbations propagate along trajectories
  • Optimal transport: Jacobi fields appear in displacement interpolation