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