Program Listing for File frame_conversions.h

Return to documentation for file (conversions/frame_conversions.h)

#pragma once

#include "lupnt/core/constants.h"
#include "lupnt/interfaces/spice_cheby.h"

namespace lupnt {

  Vec6 ItrfToGcrf(Real t_tdb, const Vec6& rv_itrf);
  Vec3 ItrfToGcrf(Real t_tdb, const Vec3& rv_itrf);

  Vec6 GcrfToItrf(Real t_tdb, const Vec6& rv_gcrf);
  Vec3 GcrfToItrf(Real t_tdb, const Vec3& rv_gcrf);

  Vec6 GcrfToEme(const Vec6& rv_gcrf);
  Vec3 GcrfToEme(const Vec3& rv_gcrf);
  Vec6 EmeToGcrf(const Vec6& rv_eme);
  Vec3 EmeToGcrf(const Vec3& rv_eme);

  Vec6 GcrfToIcrf(Real t_tdb, const Vec6& rv_gcrf);
  Vec3 GcrfToIcrf(Real t_tdb, const Vec3& rv_gcrf);
  Vec6 IcrfToGcrf(Real t_tdb, const Vec6& rv_icrf);
  Vec3 IcrfToGcrf(Real t_tdb, const Vec3& rv_icrf);

  Vec6 GcrfToMoonCi(Real t_tdb, const Vec6& rv_gcrf);
  Vec3 GcrfToMoonCi(Real t_tdb, const Vec3& rv_gcrf);
  Vec6 MoonCiToGcrf(Real t_tdb, const Vec6& rv_mi);
  Vec3 MoonCiToGcrf(Real t_tdb, const Vec3& rv_mi);

  Vec6 MoonCiToPa(Real t_tdb, const Vec6& rv_mi);
  Vec3 MoonCiToPa(Real t_tdb, const Vec3& rv_mi);
  Vec6 MoonPaToCi(Real t_tdb, const Vec6& rv_pa);
  Vec3 MoonPaToCi(Real t_tdb, const Vec3& rv_pa);

  Vec6 MoonPaToMe(const Vec6& rv_pa);
  Vec3 MoonPaToMe(const Vec3& rv_pa);
  Vec6 MoonMeToPa(const Vec6& rv_me);
  Vec3 MoonMeToPa(const Vec3& rv_me);

  Vec6 GcrfToEmr(Real t_tdb, const Vec6& rv_gcrf);
  Vec3 GcrfToEmr(Real t_tdb, const Vec3& rv_gcrf);
  Vec6 EmrToGcrf(Real t_tdb, const Vec6& rv_emr);
  Vec3 EmrToGcrf(Real t_tdb, const Vec3& rv_emr);

  Vec6 MoonCiToOp(Real t_tdb, const Vec6& rv_ci);
  Vec3 MoonCiToOp(Real t_tdb, const Vec3& rv_ci);
  Vec6 MoonOpToCi(Real t_tdb, const Vec6& rv_op);
  Vec3 MoonOpToCi(Real t_tdb, const Vec3& rv_op);

  // Rotations

  Mat3 RotPrecessionNutation(Real t_tdb);

  Mat3 RotSideralMotion(Real t_tdb);

  Mat3 RotSideralMotionDot(Real t_tdb);

  Mat3 RotPolarMotion(Real t_tdb);

  Mat3d RotGcrfToEme();
  Mat3d RotGcrfToEmeFirstOrder();
  Mat3d RotGcrfToEmeSecondOrder();

  Mat3 RotMoonCiToPa(Real t_tdb, Mat3* R_mi2pa_dot = nullptr);

  Mat3d RotMoonPaToMe();

  Mat3 RotMoonOpToCi(Real t_tdb);

  // ---------------------------------------------------------------------
  // SPICE-derived Earth orientation parameters (EOP)
  // ---------------------------------------------------------------------

  struct SpiceEopParams {
    Real x_pole;
    Real y_pole;
    Real ut1_utc;
  };

  SpiceEopParams ComputeEopFromSpice(Real t_tdb);

  // ---------------------------------------------------------------------
  // SPICE-fitted high-accuracy Earth/lunar orientation (initialization)
  // ---------------------------------------------------------------------

  void InitFrameConversionFromSpice(Real t_start_tdb, Real t_end_tdb,
                                    Real segment_length_s = 86400.0, int num_coeffs = 13);

  void ClearFrameConversionFit();

  bool HasFittedEarthOrientation(Real t_tdb);

  bool HasFittedLunarOrientation(Real t_tdb);

}  // namespace lupnt