Program Listing for File analytical_orbit_dynamics.h

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

#pragma once

#include "lupnt/dynamics/dynamics.h"
#include "lupnt/states/state.h"

namespace lupnt {

  class AnalyticalDynamics : public Dynamics {
  public:
    virtual ~AnalyticalDynamics() = default;

    using Dynamics::Propagate;

    State Propagate(const State &x0, Real t0, Real tf, const State *u = nullptr) override;

    MatX Propagate(const State &x0, const VecX &tfs, const State *u = nullptr) override;

    virtual State Propagate(const State &x0, Real t0, Real tf, const State *u, MatXd *stm) override
        = 0;
  };

  template <typename T = ClassicalOE> class KeplerianDynamics : public AnalyticalDynamics {
  private:
    Real GM_;

  public:
    KeplerianDynamics(Real GM) : GM_(GM) {}
    using AnalyticalDynamics::Propagate;

    State Propagate(const State &state, Real t0, Real tf, const State *u, MatXd *stm) override;

    StateType GetStateType() const override { return T::TYPE; }
  };

  class ClohessyWiltshireDynamics : public AnalyticalDynamics {
  private:
    Real a_, n_;
    VecX K_;
    Real t0_;

  public:
    ClohessyWiltshireDynamics(Real a, Real n);

    Mat6 ComputeMat(Real tf);
    using AnalyticalDynamics::Propagate;

    State Propagate(const State &state, Real t0, Real tf, const State *u, MatXd *stm) override;

    StateType GetStateType() const override { return RelCart6::TYPE; }
  };

  class YamanakaAnkersenDynamics : public AnalyticalDynamics {
  private:
    Real a_, n_, e_, M0_;
    VecX K_;
    Real t0_;
    VecX rv_rtn_;

  public:
    YamanakaAnkersenDynamics(const ClassicalOE &coe_c, const Cart6 &rv_rtn, Real GM_);

    MatX ComputeMat(Real t);

    MatX ComputeInverseMat(Real t);
    using AnalyticalDynamics::Propagate;

    State Propagate(const State &state, Real t0, Real tf, const State *u, MatXd *stm) override;

    StateType GetStateType() const override { return ClassicalOE::TYPE; }
  };

  class RoeGeometricMappingDynamics : public AnalyticalDynamics {
  private:
    Real a_, e_, i_, w_, M0_;
    Real ex_, ey_, n_;
    VecX K_;
    Real t0_;

  public:
    RoeGeometricMappingDynamics(const ClassicalOE coe_c, const QuasiNonsingROE &roe, Real GM);

    MatX ComputeMat(Real t);
    using AnalyticalDynamics::Propagate;

    State Propagate(const State &state, Real t0, Real tf, const State *u, MatXd *stm) override;

    StateType GetStateType() const override { return QuasiNonsingROE::TYPE; }
  };

}  // namespace lupnt