Program Listing for File anomaly_conversions.cc

Return to documentation for file (conversions/anomaly_conversions.cc)

#include "lupnt/conversions/anomaly_conversions.h"

#include "lupnt/numerics/math_utils.h"

namespace lupnt {
  Real GetOrbitalPeriod(Real a, Real GM) { return 2 * PI * sqrt(pow(a, 3) / GM); }
  VEC_IMP_REAL_REAL(GetOrbitalPeriod);

  Real EccToTrueAnomaly(Real E, Real e) { return atan2(sqrt(1 - pow(e, 2)) * sin(E), cos(E) - e); }

  Real EccToMeanAnomaly(Real E, Real e) { return WrapToPi(E - e * sin(E)); }

  Real MeanToEccAnomaly(Real M, Real e) {
    Real MM = WrapToPi(M);

    // Initial estimate of E
    Real E = MM;
    Real Eest = E - (E - e * sin(E) - MM) / (1.0 - e * cos(E));

    int max_itr = 100;
    int itr = 0;
    while ((abs(Eest - E) >= EPS) && (itr <= max_itr)) {
      E = Eest;
      Eest = E - (E - e * sin(E) - M) / (1.0 - e * cos(E));
      itr++;
    }
    E = Eest;

    return WrapToPi(E);
  }

  Real MeanToTrueAnomaly(Real M, Real e) {
    Real E = MeanToEccAnomaly(M, e);
    Real nu = EccToTrueAnomaly(E, e);
    return WrapToPi(nu);
  }

  Real TrueToEccAnomaly(Real nu, Real e) {
    Real E = 2 * atan(sqrt((1 - e) / (1 + e)) * tan(nu / 2));
    return E;
  }

  Real TrueToMeanAnomaly(Real nu, Real e) {
    Real E = TrueToEccAnomaly(nu, e);
    Real M = EccToMeanAnomaly(E, e);
    return M;
  }

  VEC_IMP_REAL_REAL(EccToTrueAnomaly);
  VEC_IMP_REAL_REAL(EccToMeanAnomaly);
  VEC_IMP_REAL_REAL(MeanToEccAnomaly);
  VEC_IMP_REAL_REAL(TrueToEccAnomaly);
  VEC_IMP_REAL_REAL(MeanToTrueAnomaly);
  VEC_IMP_REAL_REAL(TrueToMeanAnomaly);
}  // namespace lupnt