Program Listing for File joint_orbit_clock_dynamics.h

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

#pragma once

#include "lupnt/dynamics/clock_dynamics.h"
#include "lupnt/dynamics/numerical_orbit_dynamics.h"
#include "lupnt/environment/body.h"
#include "lupnt/states/state.h"

namespace lupnt {

  class JointOrbitClockDynamics : public NumericalDynamics {
  private:
    static constexpr int ORBIT_STATE_SIZE = 6;

    Ptr<NumericalDynamics> orbit_dynamics_;
    Ptr<ClockDynamics> clock_dynamics_;
    bool use_clock_relativity_ = true;
    bool relativity_center_body_set_ = false;
    BodyId relativity_center_body_ = BodyId::EARTH;
    Real reference_rate_offset_ = 0.0;
    bool add_clock_noise_ = false;
    Frame frame_ = Frame::UNDEFINED;
    UnitSystem units_ = SI_UNITS;

    BodyId SelectRelativityCenter(Real t, const State& orbit_state) const;

    Vec6 GetCenterState(Real t, BodyId center_body) const;

    Real RelativisticRate(Real t, const State& orbit_state) const;

    State BuildState(const State& x0, const VecX& values) const;

  public:
    JointOrbitClockDynamics();

    explicit JointOrbitClockDynamics(Config& config);

    void SetOrbitDynamics(Ptr<NumericalDynamics> orbit_dynamics);
    Ptr<NumericalDynamics> GetOrbitDynamics() const { return orbit_dynamics_; }

    void SetClockDynamics(Ptr<ClockDynamics> clock_dynamics);
    Ptr<ClockDynamics> GetClockDynamics() const { return clock_dynamics_; }

    void SetUseClockRelativity(bool use_clock_relativity) {
      use_clock_relativity_ = use_clock_relativity;
    }
    bool GetUseClockRelativity() const { return use_clock_relativity_; }

    void SetRelativityCenterBody(BodyId center_body) {
      relativity_center_body_ = center_body;
      relativity_center_body_set_ = true;
    }
    BodyId GetRelativityCenterBody() const { return relativity_center_body_; }
    bool HasRelativityCenterBody() const { return relativity_center_body_set_; }
    void ClearRelativityCenterBody() { relativity_center_body_set_ = false; }

    void SetReferenceRateOffset(Real reference_rate_offset) {
      reference_rate_offset_ = reference_rate_offset;
    }
    Real GetReferenceRateOffset() const { return reference_rate_offset_; }

    void SetAddClockNoise(bool add_clock_noise) { add_clock_noise_ = add_clock_noise; }
    bool GetAddClockNoise() const { return add_clock_noise_; }

    void SetFrame(Frame frame) { frame_ = frame; }
    Frame GetFrame() const { return frame_; }

    void SetUnits(const UnitSystem& units) { units_ = units; }
    UnitSystem GetUnits() const { return units_; }

    using NumericalDynamics::Propagate;

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

    using NumericalDynamics::PropagateWithParams;

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

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

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

}  // namespace lupnt