Program Listing for File numerical_orbit_dynamics.h

Return to documentation for file (dynamics/numerical_orbit_dynamics.h)

#pragma once

#include "lupnt/dynamics/dynamics.h"
#include "lupnt/environment/body.h"
#include "lupnt/numerics/integrator.h"
#include "lupnt/states/params.h"
#include "lupnt/states/state.h"

namespace lupnt {

  struct TerminationInfo {
    bool terminated = false;  // true if stopped before tf due to user/max-iter
    TerminationReason reason = TerminationReason::ReachedTf;
    Real t_stop = 0.0;  // time actually reached
    int steps = 0;      // steps taken
  };

  class NumericalDynamics : public Dynamics {
  private:
    ODE odefunc_;
    Ptr<Integrator> integrator_;
    Real dt_ = 10.0;

  public:
    NumericalDynamics();
    NumericalDynamics(Config& dynamics_config);

    void SetTimeStep(Real dt);
    Real GetTimeStep() const;

    void SetODE(ODE odefunc);
    void SetIntegrator(IntegratorType integ);
    void SetIntegratorParams(IntegratorParams params);

    virtual VecX ComputeRates(Real t, const State& x) const;

    Integrator* GetIntegrator() { return integrator_.get(); }

    using Dynamics::Propagate;
    State Propagate(const State& x0, Real t0, Real tf, const State* u = nullptr) override;
    // State Propagate(const State &x0, Real t0, Real tf, const State *u, MatXd *stm) override;
    StateType GetStateType() const override { return Cart6::TYPE; }

    State PropagateEx(const State& x0, Real t0, Real tf, TerminationInfo* info);
    MatX PropagateEx(const State& x0, Real t0, const VecX& tf, TerminationInfo* info);
    State PropagateExStm(const State& x0, Real t0, Real tf, MatXd* stm, TerminationInfo* info);
  };

  // Cartesian Two-Body Dynamics
  class CartesianTwoBodyDynamics : public NumericalDynamics {
  private:
    Real GM_;

  public:
    CartesianTwoBodyDynamics(Real GM);
    VecX ComputeRates(Real t, const State& x) const override;
    using NumericalDynamics::Propagate;
    StateType GetStateType() const override { return Cart6::TYPE; }
  };

  // J2 Cartesian Two-Body Dynamics
  class JToCartTwoBodyDynamics : public NumericalDynamics {
  private:
    Real GM_, J2_, R_body_;
    Frame frame_ = Frame::GCRF;
    Frame body_fixed_frame_ = Frame::ITRF;

  public:
    JToCartTwoBodyDynamics(Real GM, Real J2, Real R_body, Frame frame = Frame::GCRF,
                           Frame body_fixed_frame = Frame::ITRF);
    VecX ComputeRates(Real t, const State& x) const override;
    using NumericalDynamics::Propagate;
    StateType GetStateType() const override { return Cart6::TYPE; }
    void SetFrame(Frame frame) { frame_ = frame; }
    Frame GetFrame() const { return frame_; }
    void SetBodyFixedFrame(Frame frame) { body_fixed_frame_ = frame; }
    Frame GetBodyFixedFrame() const { return body_fixed_frame_; }
  };

  class J2KeplerianDynamics : public NumericalDynamics {
  private:
    Real GM_, J2_, R_body_;

  public:
    J2KeplerianDynamics(Real GM, Real J2, Real R_body);
    VecX ComputeRates(Real t, const State& x) const override;
    using NumericalDynamics::Propagate;
    StateType GetStateType() const override { return Cart6::TYPE; }
  };

  class MoonMeanDynamics : public NumericalDynamics {
  private:
    const double n3_ = 2.66e-6;
    const double J2_ = 2.03e-4;
    const double k_ = 0.98785;

  public:
    MoonMeanDynamics();
    VecX ComputeRates(Real t, const State& x) const override;
    using NumericalDynamics::Propagate;
    StateType GetStateType() const override { return Cart6::TYPE; }
  };

  class NBodyDynamics : public NumericalDynamics {
  private:
    std::vector<Body> bodies_;
    bool use_srp_ = false;
    bool use_drag_ = false;
    bool use_relativity_ = true;
    bool use_ad_ = false;
    Frame frame_ = Frame::MOON_CI;
    UnitSystem units_ = SI_UNITS;

  public:
    NBodyDynamics();
    NBodyDynamics(Config& dynamics_config);

    // Propagators
    using NumericalDynamics::Propagate;
    State Propagate(const State& x0, Real t0, Real tf, const State* u, MatXd* stm) override;
    VecX ComputeRates(Real t, const State& x) const override;

    // Modifiers
    void AddBody(const Body& body);
    void RemoveBody(const Body& body);

    // Getters
    bool GetUseSrp() { return use_srp_; }
    bool GetUseDrag() { return use_drag_; }
    bool GetUseRelativity() const { return use_relativity_; }
    Real GetSrpCoeff() const { return GetParam("bcoeff_srp"); }
    Real GetDragCoeff() const { return GetParam("bcoeff_drag"); }
    StateType GetStateType() const override { return Cart6::TYPE; }
    Frame GetFrame() { return frame_; }
    std::vector<Body> GetBodies() { return bodies_; }
    UnitSystem GetUnits() const { return units_; }

    // Setters
    void SetAutodiff(bool use_ad) { use_ad_ = use_ad; }
    void SetSrpCoeff(Real bcoeff);
    void SetDragCoeff(Real bcoeff);
    void SetSrpCoefficient(Real CR, Real area, Real mass);
    void SetDragCoefficient(Real CD, Real area, Real mass);
    void SetUseSrp(bool use_srp) { use_srp_ = use_srp; }
    void SetUseDrag(bool use_drag) { use_drag_ = use_drag; }
    void SetUseRelativity(bool use_relativity) { use_relativity_ = use_relativity; }
    void SetFrame(Frame frame) { frame_ = frame; }
    void SetUnits(const UnitSystem& units);
  };

}  // namespace lupnt