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