diff --git a/CMakeLists.txt b/CMakeLists.txt index 38429b0d3..8082d13e6 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -277,7 +277,7 @@ ENDIF () ### Open Space Toolkit ▸ Physics -FIND_PACKAGE ("OpenSpaceToolkitPhysics" "0.8.2" REQUIRED) +FIND_PACKAGE ("OpenSpaceToolkitPhysics" "1.0" REQUIRED) IF (NOT OpenSpaceToolkitPhysics_FOUND) diff --git a/bindings/python/requirements.txt b/bindings/python/requirements.txt index baf0d145a..a478d2681 100644 --- a/bindings/python/requirements.txt +++ b/bindings/python/requirements.txt @@ -1,3 +1,3 @@ # Apache License 2.0 -open-space-toolkit-physics~=0.8.1 +open-space-toolkit-physics~=1.0.0 diff --git a/bindings/python/src/OpenSpaceToolkitAstrodynamicsPy/NumericalSolver.cpp b/bindings/python/src/OpenSpaceToolkitAstrodynamicsPy/NumericalSolver.cpp index a2d204830..d840656f5 100644 --- a/bindings/python/src/OpenSpaceToolkitAstrodynamicsPy/NumericalSolver.cpp +++ b/bindings/python/src/OpenSpaceToolkitAstrodynamicsPy/NumericalSolver.cpp @@ -106,6 +106,7 @@ inline void OpenSpaceToolkitAstrodynamicsPy_NumericalSolver(pybind11::module& aM enum_(numericalSolver, "StepperType") + .value("RungeKutta4", NumericalSolver::StepperType::RungeKutta4) .value("RungeKuttaCashKarp54", NumericalSolver::StepperType::RungeKuttaCashKarp54) .value("RungeKuttaFehlberg78", NumericalSolver::StepperType::RungeKuttaFehlberg78) diff --git a/bindings/python/test/test_numerical_solver.py b/bindings/python/test/test_numerical_solver.py index 2bc0c65d7..eb9b0f859 100644 --- a/bindings/python/test/test_numerical_solver.py +++ b/bindings/python/test/test_numerical_solver.py @@ -80,6 +80,12 @@ def test_get_types( assert numerical_solver.get_absolute_tolerance() == absolute_tolerance def test_get_string_from_types(self): + assert ( + NumericalSolver.string_from_stepper_type( + NumericalSolver.StepperType.RungeKutta4 + ) + == "RungeKutta4" + ) assert ( NumericalSolver.string_from_stepper_type( NumericalSolver.StepperType.RungeKuttaCashKarp54 diff --git a/bindings/python/test/trajectory/orbit/models/test_propagated.py b/bindings/python/test/trajectory/orbit/models/test_propagated.py index 54842be5f..d4fe05091 100644 --- a/bindings/python/test/trajectory/orbit/models/test_propagated.py +++ b/bindings/python/test/trajectory/orbit/models/test_propagated.py @@ -52,7 +52,7 @@ def propagated_default_inputs(): ) inertia_tensor = np.ndarray(shape=(3, 3)) surface_area = 0.8 - drag_coefficient = 2.2 + drag_coefficient = 0.0 satellitesystem = SatelliteSystem( mass, satellite_geometry, inertia_tensor, surface_area, drag_coefficient diff --git a/bindings/python/test/trajectory/test_propagator.py b/bindings/python/test/trajectory/test_propagator.py index 57a6dfc07..f9a2c1c3f 100644 --- a/bindings/python/test/trajectory/test_propagator.py +++ b/bindings/python/test/trajectory/test_propagator.py @@ -52,7 +52,7 @@ def propagator_default_inputs(): ) inertia_tensor = np.identity(3) surface_area = 0.8 - drag_coefficient = 2.2 + drag_coefficient = 0.0 satellitesystem = SatelliteSystem( mass, satellite_geometry, inertia_tensor, surface_area, drag_coefficient @@ -77,7 +77,7 @@ def propagator(propagator_default_inputs) -> Propagator: return Propagator(*propagator_default_inputs[:2]) -class TestPropagated: +class TestPropagator: def test_constructors(self, propagator: Propagator): assert propagator is not None assert isinstance(propagator, Propagator) diff --git a/docker/development/Dockerfile b/docker/development/Dockerfile index b47edadd6..85d40deaa 100644 --- a/docker/development/Dockerfile +++ b/docker/development/Dockerfile @@ -127,8 +127,8 @@ RUN mkdir -p /tmp/open-space-toolkit-mathematics \ ## Open Space Toolkit ▸ Physics -ARG OSTK_PHYSICS_MAJOR="0" -ARG OSTK_PHYSICS_MINOR="8" +ARG OSTK_PHYSICS_MAJOR="1" +ARG OSTK_PHYSICS_MINOR="0" RUN mkdir -p /tmp/open-space-toolkit-physics \ && cd /tmp/open-space-toolkit-physics \ diff --git a/include/OpenSpaceToolkit/Astrodynamics/Flight/System/Dynamics/SatelliteDynamics.hpp b/include/OpenSpaceToolkit/Astrodynamics/Flight/System/Dynamics/SatelliteDynamics.hpp index a2bd37b64..67a723a68 100644 --- a/include/OpenSpaceToolkit/Astrodynamics/Flight/System/Dynamics/SatelliteDynamics.hpp +++ b/include/OpenSpaceToolkit/Astrodynamics/Flight/System/Dynamics/SatelliteDynamics.hpp @@ -11,6 +11,7 @@ #include +#include #include #include #include @@ -163,15 +164,7 @@ class SatelliteDynamics : public Dynamics SatelliteSystem satelliteSystem_; Instant instant_; - // Only force model currently used that incorporates solely Earth's gravity void DynamicalEquations(const Dynamics::StateVector& x, Dynamics::StateVector& dxdt, const double t); - - // // Atmospheric perturbations only - // void Exponential_Dynamics ( const SatelliteDynamics::StateVector& - // x, - // SatelliteDynamics::StateVector& - // dxdt, - // const double ) const ; }; } // namespace dynamics diff --git a/include/OpenSpaceToolkit/Astrodynamics/NumericalSolver.hpp b/include/OpenSpaceToolkit/Astrodynamics/NumericalSolver.hpp index f3a059c77..b039641ba 100644 --- a/include/OpenSpaceToolkit/Astrodynamics/NumericalSolver.hpp +++ b/include/OpenSpaceToolkit/Astrodynamics/NumericalSolver.hpp @@ -33,6 +33,7 @@ class NumericalSolver public: enum class StepperType { + RungeKutta4, RungeKuttaCashKarp54, RungeKuttaFehlberg78 }; diff --git a/src/OpenSpaceToolkit/Astrodynamics/Flight/System/Dynamics/SatelliteDynamics.cpp b/src/OpenSpaceToolkit/Astrodynamics/Flight/System/Dynamics/SatelliteDynamics.cpp index 99b5903e9..194696ee3 100644 --- a/src/OpenSpaceToolkit/Astrodynamics/Flight/System/Dynamics/SatelliteDynamics.cpp +++ b/src/OpenSpaceToolkit/Astrodynamics/Flight/System/Dynamics/SatelliteDynamics.cpp @@ -3,6 +3,8 @@ #include #include +#include + #include namespace ostk @@ -19,6 +21,8 @@ namespace dynamics using ostk::physics::units::Derived; using ostk::physics::units::Length; using ostk::physics::units::Time; +using ostk::physics::coord::Frame; +using ostk::physics::env::obj::Celestial; static const Derived::Unit GravitationalParameterSIUnit = Derived::Unit::GravitationalParameter(Length::Unit::Meter, Time::Unit::Second); @@ -134,18 +138,20 @@ void SatelliteDynamics::DynamicalEquations(const Dynamics::StateVector& x, Dynam const Instant currentInstant = instant_ + Duration::Seconds(t); environment_.setInstant(currentInstant); + // GRAVITY // Initialize gravitational acceleration vector Vector3d totalGravitationalAcceleration_SI = {0.0, 0.0, 0.0}; // Access all objects in the environment and loop through them for (const auto& objectName : environment_.getObjectNames()) { + const Shared object = environment_.accessCelestialObjectWithName(objectName); + if (objectName != "Earth") { // Obtain 3rd body effect on center of Earth (origin in GCRF) aka 3rd body correction const Vector gravitationalAcceleration3rdBodyCorrection = - environment_.accessCelestialObjectWithName(objectName) - ->getGravitationalFieldAt(Position::Meters({0.0, 0.0, 0.0}, gcrfSPtr_)); + object->getGravitationalFieldAt(Position::Meters({0.0, 0.0, 0.0}, gcrfSPtr_), currentInstant); // Subtract 3rd body correct from total gravitational acceleration totalGravitationalAcceleration_SI -= @@ -153,69 +159,52 @@ void SatelliteDynamics::DynamicalEquations(const Dynamics::StateVector& x, Dynam } // Obtain gravitational acceleration from current object - const Vector gravitationalAcceleration = - environment_.accessCelestialObjectWithName(objectName)->getGravitationalFieldAt(currentPosition); + const Vector gravitationalAcceleration = object->getGravitationalFieldAt(currentPosition, currentInstant); // Add object's gravity to total gravitational acceleration totalGravitationalAcceleration_SI += gravitationalAcceleration.inFrame(gcrfSPtr_, currentInstant).getValue(); } - // Integrate position and velocity states + // DRAG + Vector3d totalDragAcceleration = {0.0, 0.0, 0.0}; + + const Real mass = satelliteSystem_.getMass().inKilograms(); + const Real dragCoefficient = satelliteSystem_.getDragCoefficient(); + const Real surfaceArea = satelliteSystem_.getCrossSectionalSurfaceArea(); + + for (const auto& objectName : environment_.getObjectNames()) + { + const Shared object = environment_.accessCelestialObjectWithName(objectName); + + // TBI: currently only defined for Earth + if (object->atmosphericModelIsDefined()) + { + const Real atmosphericDensity = object->getAtmosphericDensityAt(currentPosition, currentInstant).getValue(); + + const Vector3d earthAngularVelocity = + Frame::GCRF()->getTransformTo(Frame::ITRF(), currentInstant).getAngularVelocity(); // rad/s + + const Vector3d relativeVelocity = + Vector3d(x[3], x[4], x[5]) - earthAngularVelocity.cross(Vector3d(x[0], x[1], x[2])); + + // Calculate drag acceleration + const Vector3d dragAcceleration = -(0.5 / mass) * dragCoefficient * surfaceArea * atmosphericDensity * + relativeVelocity.norm() * relativeVelocity; + + totalDragAcceleration += dragAcceleration; + } + } + + // Propagate velocity dxdt[0] = x[3]; dxdt[1] = x[4]; dxdt[2] = x[5]; - dxdt[3] = totalGravitationalAcceleration_SI[0]; - dxdt[4] = totalGravitationalAcceleration_SI[1]; - dxdt[5] = totalGravitationalAcceleration_SI[2]; -} -// void SatelliteDynamics::Exponential_Dynamics -// ( const SatelliteDynamics::StateVector& -// x, -// SatelliteDynamics::StateVector& -// dxdt, -// const double ) const -// { -// // Find position magnitude -// const double positionMagnitude = std::sqrt(std::pow(x[0],2) + std::pow(x[1],2) + std::pow(x[2],2)); - -// // Integrate velocity states -// const double positionMagnitudeCubed = std::pow(positionMagnitude,3) ; - -// // Access constants -// const double mu_SI = -// ((environment_.accessCelestialObjectWithName("Earth"))->getGravitationalParameter()).in(GravitationalParameterSIUnit) -// ; const double Re = ((environment_.accessCelestialObjectWithName("Earth"))->getEquatorialRadius()).inMeters() ; -// const double dragCoefficient = satelliteSystem_.getDragCoefficient() ; -// const double surfaceArea = satelliteSystem_.getCrossSectionalSurfaceArea() ; -// const double mass = satelliteSystem_.getMass().inKilograms() ; -// const Vector3d earthAngularVelocity = { 0, 0, 7.2921159e-5 } ; // rad/s -// const double rho0 = 6.967e-13 ; // kg/m^3 -// const double h0 = 500000 ; -// const double H = 63822 ; - -// // Calculate relative velocity to wind -// const Vector3d relativeVelocity = Vector3d({ x[3], x[4], x[5] }) - -// Vector3d({earthAngularVelocity.cross(Vector3d({ x[0], x[1], x[2] }))}) ; const double relativeVelocityMagnitude = -// std::sqrt(std::pow(relativeVelocity[0],2) + std::pow(relativeVelocity[1],2) + std::pow(relativeVelocity[2],2)) ; - -// // Calculate density parameters -// const double hEllipse = positionMagnitude - Re ; -// const double rho = rho0 * std::exp( - (hEllipse - h0) / H ) ; - -// // Calculate drag acceleration -// const Vector3d dragAcceleration = -0.5 * dragCoefficient * (surfaceArea / mass) * rho * relativeVelocityMagnitude -// * relativeVelocity ; - -// // Integrate position and velocity states -// dxdt[0] = x[3] ; -// dxdt[1] = x[4] ; -// dxdt[2] = x[5] ; -// dxdt[3] = -(mu_SI / positionMagnitudeCubed) * x[0] + dragAcceleration[0] ; -// dxdt[4] = -(mu_SI / positionMagnitudeCubed) * x[1] + dragAcceleration[1] ; -// dxdt[5] = -(mu_SI / positionMagnitudeCubed) * x[2] + dragAcceleration[2] ; - -// } + // Propagate acceleration + dxdt[3] = totalGravitationalAcceleration_SI[0] + totalDragAcceleration[0]; + dxdt[4] = totalGravitationalAcceleration_SI[1] + totalDragAcceleration[1]; + dxdt[5] = totalGravitationalAcceleration_SI[2] + totalDragAcceleration[2]; +} } // namespace dynamics } // namespace system diff --git a/src/OpenSpaceToolkit/Astrodynamics/NumericalSolver.cpp b/src/OpenSpaceToolkit/Astrodynamics/NumericalSolver.cpp index 9d5393a12..819c5ad2e 100644 --- a/src/OpenSpaceToolkit/Astrodynamics/NumericalSolver.cpp +++ b/src/OpenSpaceToolkit/Astrodynamics/NumericalSolver.cpp @@ -14,6 +14,7 @@ namespace astro using namespace boost::numeric::odeint; +typedef runge_kutta4 stepper_type_4; typedef runge_kutta_cash_karp54 error_stepper_type_54; typedef runge_kutta_fehlberg78 error_stepper_type_78; @@ -195,6 +196,23 @@ Array NumericalSolver::integrateStatesAtSortedInst switch (stepperType_) { + case NumericalSolver::StepperType::RungeKutta4: + { + integrate_times( + stepper_type_4(), + aSystemOfEquations, + aStateVector, + anIntegrationDurationInSecsArray.begin(), + anIntegrationDurationInSecsArray.end(), + adjustedTimeStep, + [&](const NumericalSolver::StateVector& x, double t) -> void + { + this->observeNumericalIntegration(x, t); + } + ); + break; + } + case NumericalSolver::StepperType::RungeKuttaCashKarp54: { integrate_times( @@ -261,6 +279,36 @@ NumericalSolver::StateVector NumericalSolver::integrateStateForDuration( switch (stepperType_) { + case NumericalSolver::StepperType::RungeKutta4: + { + // Integrate_adaptive uses constant step size under the hood + // for a stepper without error control like RK4. + // Therefore, just use integrate_const for simplicity. + switch (logType_) + { + case NumericalSolver::LogType::NoLog: + case NumericalSolver::LogType::LogAdaptive: + case NumericalSolver::LogType::LogConstant: + { + integrate_const( + stepper_type_4(), + aSystemOfEquations, + aStateVector, + (0.0), + integrationDurationInSecs, + adjustedTimeStep, + [&](const NumericalSolver::StateVector& x, double t) -> void + { + this->observeNumericalIntegration(x, t); + } + ); + return aStateVector; + } + default: + throw ostk::core::error::runtime::Wrong("Log type"); + } + } + case NumericalSolver::StepperType::RungeKuttaCashKarp54: { switch (logType_) @@ -388,6 +436,9 @@ String NumericalSolver::StringFromStepperType(const NumericalSolver::StepperType { switch (aStepperType) { + case NumericalSolver::StepperType::RungeKutta4: + return "RungeKutta4"; + case NumericalSolver::StepperType::RungeKuttaCashKarp54: return "RungeKuttaCashKarp54"; diff --git a/src/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit.cpp b/src/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit.cpp index 7ba98b80f..fc7b0462a 100644 --- a/src/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit.cpp +++ b/src/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit.cpp @@ -874,7 +874,7 @@ Orbit Orbit::SunSynchronous( // Sun direction in GCRF const Vector3d sunDirection_GCRF = environment.accessCelestialObjectWithName("Sun") - ->getPositionIn(Frame::GCRF()) + ->getPositionIn(Frame::GCRF(), anEpoch) .getCoordinates() .normalized(); diff --git a/test/OpenSpaceToolkit/Astrodynamics/Flight/Profile.test.cpp b/test/OpenSpaceToolkit/Astrodynamics/Flight/Profile.test.cpp index 8685f2116..d306a05f5 100644 --- a/test/OpenSpaceToolkit/Astrodynamics/Flight/Profile.test.cpp +++ b/test/OpenSpaceToolkit/Astrodynamics/Flight/Profile.test.cpp @@ -183,60 +183,64 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Flight_Profile, GetStatesAt) using ostk::astro::flight::profile::State; { - { - const Array referenceInstants = { Instant::DateTime(DateTime(2018, 1, 1, 0, 0, 0, 0), Scale::UTC), Instant::DateTime(DateTime(2018, 1, 1, 0, 0, 0, 500), Scale::UTC), Instant::DateTime(DateTime(2018, 1, 1, 0, 0, 1, 0), Scale::UTC), }; - const Array referenceStates = { - {Instant::DateTime(DateTime(2018, 1, 1, 0, 0, 0), Scale::UTC), - Position::Meters({7000000.000000000000, 0.000000000000, 0.000000000000}, Frame::GCRF()), - Velocity::MetersPerSecond({0.000000000000, 7546.053287267836, 0.000000000000}, Frame::GCRF()), - Quaternion::XYZS(-0.500000000000, -0.500000000000, 0.500000000000, 0.500000000000), - {0.000000000000, -0.001078007612, 0.000000000000}, - Frame::GCRF()}, - {Instant::DateTime(DateTime(2018, 1, 1, 0, 0, 0, 500), Scale::UTC), - Position::Meters({6999998.983162164688, 3773.026460940484, 0.000000000000}, Frame::GCRF()), - Velocity::MetersPerSecond({-4.067351246933, 7546.052191108910, 0.000000000000}, Frame::GCRF()), - Quaternion::XYZS(-0.499865230892, -0.500134732792, 0.500134732792, 0.499865230892), - {0.000000000000, -0.001078007612, 0.000000000000}, - Frame::GCRF()}, - {Instant::DateTime(DateTime(2018, 1, 1, 0, 0, 1), Scale::UTC), - Position::Meters({6999995.932648953050, 7546.051825722679, 0.000000000000}, Frame::GCRF()), - Velocity::MetersPerSecond({-8.134701312198, 7546.048902632449, 0.000000000000}, Frame::GCRF()), - Quaternion::XYZS(-0.499730425479, -0.500269429259, 0.500269429259, 0.499730425479), - {0.000000000000, -0.001078007612, 0.000000000000}, - Frame::GCRF()}}; - - const Array states = profile_.getStatesAt(referenceInstants); - - EXPECT_EQ(referenceStates.getSize(), states.getSize()); - - for (const auto stateTuple : ostk::core::ctnr::iterators::Zip(referenceStates, states)) - { - const State& referenceState = std::get<0>(stateTuple); - const State& state = std::get<1>(stateTuple); - - EXPECT_EQ(state.getInstant(), referenceState.getInstant()); - EXPECT_TRUE(state.getPosition().getCoordinates().isNear(referenceState.getPosition().getCoordinates(), 1e-5)); - EXPECT_TRUE(state.getVelocity().getCoordinates().isNear(referenceState.getVelocity().getCoordinates(), 1e-5)); - EXPECT_TRUE(state.getAttitude().isNear(referenceState.getAttitude().toNormalized(), Angle::Degrees(1e-3))); - EXPECT_TRUE(state.getAngularVelocity().isNear(referenceState.getAngularVelocity(), 1e-5)); - EXPECT_EQ(state.getFrame(), referenceState.getFrame()); + const Array referenceStates = { + {Instant::DateTime(DateTime(2018, 1, 1, 0, 0, 0), Scale::UTC), + Position::Meters({7000000.000000000000, 0.000000000000, 0.000000000000}, Frame::GCRF()), + Velocity::MetersPerSecond({0.000000000000, 7546.053287267836, 0.000000000000}, Frame::GCRF()), + Quaternion::XYZS(-0.500000000000, -0.500000000000, 0.500000000000, 0.500000000000), + {0.000000000000, -0.001078007612, 0.000000000000}, + Frame::GCRF()}, + {Instant::DateTime(DateTime(2018, 1, 1, 0, 0, 0, 500), Scale::UTC), + Position::Meters({6999998.983162164688, 3773.026460940484, 0.000000000000}, Frame::GCRF()), + Velocity::MetersPerSecond({-4.067351246933, 7546.052191108910, 0.000000000000}, Frame::GCRF()), + Quaternion::XYZS(-0.499865230892, -0.500134732792, 0.500134732792, 0.499865230892), + {0.000000000000, -0.001078007612, 0.000000000000}, + Frame::GCRF()}, + {Instant::DateTime(DateTime(2018, 1, 1, 0, 0, 1), Scale::UTC), + Position::Meters({6999995.932648953050, 7546.051825722679, 0.000000000000}, Frame::GCRF()), + Velocity::MetersPerSecond({-8.134701312198, 7546.048902632449, 0.000000000000}, Frame::GCRF()), + Quaternion::XYZS(-0.499730425479, -0.500269429259, 0.500269429259, 0.499730425479), + {0.000000000000, -0.001078007612, 0.000000000000}, + Frame::GCRF()}}; + + const Array states = profile_.getStatesAt(referenceInstants); + + EXPECT_EQ(referenceStates.getSize(), states.getSize()); + + for (const auto stateTuple : ostk::core::ctnr::iterators::Zip(referenceStates, states)) + { + const State& referenceState = std::get<0>(stateTuple); + const State& state = std::get<1>(stateTuple); + + EXPECT_EQ(state.getInstant(), referenceState.getInstant()); + EXPECT_TRUE( + state.getPosition().getCoordinates().isNear(referenceState.getPosition().getCoordinates(), 1e-5) + ); + EXPECT_TRUE( + state.getVelocity().getCoordinates().isNear(referenceState.getVelocity().getCoordinates(), 1e-5) + ); + EXPECT_TRUE( + state.getAttitude().isNear(referenceState.getAttitude().toNormalized(), Angle::Degrees(1e-3)) + ); + EXPECT_TRUE(state.getAngularVelocity().isNear(referenceState.getAngularVelocity(), 1e-5)); + EXPECT_EQ(state.getFrame(), referenceState.getFrame()); + } + } } -} -} -{ - EXPECT_ANY_THROW(Profile::Undefined().getStatesAt( - {Instant::DateTime(DateTime(2018, 1, 1, 0, 0, 0), Scale::UTC), - Instant::DateTime(DateTime(2018, 1, 1, 0, 0, 1), Scale::UTC)} - )); -} + { + EXPECT_ANY_THROW(Profile::Undefined().getStatesAt( + {Instant::DateTime(DateTime(2018, 1, 1, 0, 0, 0), Scale::UTC), + Instant::DateTime(DateTime(2018, 1, 1, 0, 0, 1), Scale::UTC)} + )); + } } TEST_F(OpenSpaceToolkit_Astrodynamics_Flight_Profile, Undefined) diff --git a/test/OpenSpaceToolkit/Astrodynamics/Flight/System/Dynamics/SatelliteDynamics.test.cpp b/test/OpenSpaceToolkit/Astrodynamics/Flight/System/Dynamics/SatelliteDynamics.test.cpp index 7c4f267b9..25d1160b0 100644 --- a/test/OpenSpaceToolkit/Astrodynamics/Flight/System/Dynamics/SatelliteDynamics.test.cpp +++ b/test/OpenSpaceToolkit/Astrodynamics/Flight/System/Dynamics/SatelliteDynamics.test.cpp @@ -14,6 +14,10 @@ #include #include +#include +#include +#include +#include #include #include #include @@ -534,42 +538,47 @@ TEST(OpenSpaceToolkit_Astrodynamics_Flight_System_Dynamics_SatelliteDynamics, Ge TEST(OpenSpaceToolkit_Astrodynamics_Flight_System_Dynamics_SatelliteDynamics, getDynamicalEquations) { - using ostk::core::ctnr::Array; - using ostk::core::types::Integer; - using ostk::core::types::Real; using ostk::core::types::Shared; + using ostk::core::types::Real; + using ostk::core::ctnr::Array; using ostk::core::types::String; + using ostk::core::types::Integer; - using ostk::math::geom::d3::objects::Composite; - using ostk::math::geom::d3::objects::Cuboid; - using ostk::math::geom::d3::objects::Point; using ostk::math::obj::Matrix3d; using ostk::math::obj::Vector3d; + using ostk::math::geom::d3::objects::Cuboid; + using ostk::math::geom::d3::objects::Composite; + using ostk::math::geom::d3::objects::Point; - using ostk::physics::Environment; + using ostk::physics::units::Length; + using ostk::physics::units::Mass; + using ostk::physics::units::Derived; + using ostk::physics::time::Scale; + using ostk::physics::time::Instant; + using ostk::physics::time::Duration; + using ostk::physics::time::Interval; + using ostk::physics::time::DateTime; using ostk::physics::coord::Frame; using ostk::physics::coord::Position; using ostk::physics::coord::Velocity; + using ostk::physics::Environment; + using ostk::physics::env::ephem::Analytical; using ostk::physics::env::Object; using ostk::physics::env::obj::celest::Earth; - using ostk::physics::env::obj::celest::Moon; using ostk::physics::env::obj::celest::Sun; - using ostk::physics::time::DateTime; - using ostk::physics::time::Duration; - using ostk::physics::time::Instant; - using ostk::physics::time::Interval; - using ostk::physics::time::Scale; - using ostk::physics::units::Derived; - using ostk::physics::units::Length; - using ostk::physics::units::Mass; + using ostk::physics::env::obj::celest::Moon; + using EarthGravitationalModel = ostk::physics::environment::gravitational::Earth; + using EarthMagneticModel = ostk::physics::environment::magnetic::Earth; + using EarthAtmosphericModel = ostk::physics::environment::atmospheric::Earth; + using ostk::astro::trajectory::State; using ostk::astro::flight::system::SatelliteSystem; using ostk::astro::flight::system::dynamics::SatelliteDynamics; - using ostk::astro::trajectory::State; using namespace boost::numeric::odeint; SatelliteDynamics::StateVector Earth_ReferencePull(6); + SatelliteDynamics::StateVector Earth_DragReference(6); SatelliteDynamics::StateVector Moon_ReferencePull(6); SatelliteDynamics::StateVector Sun_ReferencePull(6); SatelliteDynamics::StateVector Earth_Sun_Moon_ReferencePull(6); @@ -578,13 +587,14 @@ TEST(OpenSpaceToolkit_Astrodynamics_Flight_System_Dynamics_SatelliteDynamics, ge { // Create environment const Instant instantJ2000 = Instant::J2000(); + const Array> objects = {std::make_shared(Earth::Spherical())}; const Environment customEnvironment = Environment(instantJ2000, objects); const Shared gcrfSPtr = Frame::GCRF(); // Current state and instant setup, choose equinox as instant to make geometry simple - /* Earth pulls in the -X direction, Sun pulls in the +X direction, and Moon in the +Y direction */ + // Earth pulls in the -X direction, Sun pulls in the +X direction, and Moon in the +Y direction const Instant startInstant = Instant::DateTime(DateTime(2021, 3, 20, 12, 0, 0), Scale::UTC); const State startState = { @@ -598,8 +608,10 @@ TEST(OpenSpaceToolkit_Astrodynamics_Flight_System_Dynamics_SatelliteDynamics, ge {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); + + // Drag coefficient to 0.0 to neglect atmospheric drag const SatelliteSystem satelliteSystem = { - Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Satellite dynamics setup with Celestial object SatelliteDynamics satelliteDynamics = {customEnvironment, satelliteSystem}; @@ -648,7 +660,7 @@ TEST(OpenSpaceToolkit_Astrodynamics_Flight_System_Dynamics_SatelliteDynamics, ge const Shared gcrfSPtr = Frame::GCRF(); // Current state and instant setup, choose equinox as instant to make geometry simple - /* Earth pulls in the -X direction, Sun pulls in the +X direction, and Moon in the +Y direction */ + // Earth pulls in the -X direction, Sun pulls in the +X direction, and Moon in the +Y direction const Instant startInstant = Instant::DateTime(DateTime(2021, 3, 20, 12, 0, 0), Scale::UTC); const State startState = { @@ -662,8 +674,10 @@ TEST(OpenSpaceToolkit_Astrodynamics_Flight_System_Dynamics_SatelliteDynamics, ge {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); + + // Drag coefficient to 0.0 to neglect atmospheric drag const SatelliteSystem satelliteSystem = { - Mass(90.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(90.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Satellite dynamics setup with Celestial object SatelliteDynamics satelliteDynamics = {customEnvironment, satelliteSystem}; @@ -712,7 +726,7 @@ TEST(OpenSpaceToolkit_Astrodynamics_Flight_System_Dynamics_SatelliteDynamics, ge const Shared gcrfSPtr = Frame::GCRF(); // Current state and instant setup, choose equinox as instant to make geometry simple - /* Earth pulls in the -X direction, Sun pulls in the +X direction, and Moon in the +Y direction */ + // Earth pulls in the -X direction, Sun pulls in the +X direction, and Moon in the +Y direction const Instant startInstant = Instant::DateTime(DateTime(2021, 3, 20, 12, 0, 0), Scale::UTC); const State startState = { @@ -770,6 +784,7 @@ TEST(OpenSpaceToolkit_Astrodynamics_Flight_System_Dynamics_SatelliteDynamics, ge { // Create environment const Instant instantJ2000 = Instant::J2000(); + const Array> objects = { std::make_shared(Moon::Default()), std::make_shared(Sun::Default()), @@ -779,7 +794,7 @@ TEST(OpenSpaceToolkit_Astrodynamics_Flight_System_Dynamics_SatelliteDynamics, ge const Shared gcrfSPtr = Frame::GCRF(); // Current state and instant setup, choose equinox as instant to make geometry simple - /* Earth pulls in the -X direction, Sun pulls in the +X direction, and Moon in the +Y direction */ + // Earth pulls in the -X direction, Sun pulls in the +X direction, and Moon in the +Y direction const Instant startInstant = Instant::DateTime(DateTime(2021, 3, 20, 12, 0, 0), Scale::UTC); const State startState = { @@ -793,8 +808,10 @@ TEST(OpenSpaceToolkit_Astrodynamics_Flight_System_Dynamics_SatelliteDynamics, ge {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); + + // Drag coefficient to 0.0 to neglect atmospheric drag const SatelliteSystem satelliteSystem = { - Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Satellite dynamics setup with Celestial object SatelliteDynamics satelliteDynamics = {customEnvironment, satelliteSystem}; @@ -838,6 +855,103 @@ TEST(OpenSpaceToolkit_Astrodynamics_Flight_System_Dynamics_SatelliteDynamics, ge EXPECT_GT(5e-14, startStateVector[5] - Earth_Sun_Moon_ReferencePull[5]); } + // Earth only gravity + exponential Drag + { + // Comparison data generated using OREKIT + + // Setup environment + const Instant instantJ2000 = Instant::J2000(); + + // Custom Earth with added exponential atmosphere + const Shared earth = std::make_shared(Earth( + Earth::Models::Spherical::GravitationalParameter, + Earth::Models::Spherical::EquatorialRadius, + Earth::Models::Spherical::Flattening, + Earth::Models::Spherical::J2, + Earth::Models::Spherical::J4, + std::make_shared(Frame::ITRF()), + EarthGravitationalModel::Type::Spherical, + EarthMagneticModel::Type::Undefined, + EarthAtmosphericModel::Type::Exponential + )); + + const Array> objects = {earth}; + + const Environment customEnvironment = Environment(instantJ2000, objects); + + const Shared gcrfSPtr = Frame::GCRF(); + + // Satellite shape does not matter for drag, since constant Cd & area are defined + const Composite satelliteGeometry(Cuboid( + {0.0, 0.0, 0.0}, + {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, + {1.0, 2.0, 3.0} + )); + + // Satellite System + // Cd = 2.1 + // Area = 1.0 + const SatelliteSystem satelliteSystem = { + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 1.0, 2.1}; + + // Initial conditions + const Instant startInstant = Instant::DateTime(DateTime(2023, 1, 1, 0, 0, 0), Scale::UTC); + const Length semiMajorAxis = Earth::Models::Spherical::EquatorialRadius + Length::Kilometers(500); + const double startingSpeedY = 7612.608170359118000; + + const State startState = { + startInstant, + Position::Meters({semiMajorAxis.inMeters(), 0.0, 0.0}, gcrfSPtr), + Velocity::MetersPerSecond({0.0, startingSpeedY, 0.0}, gcrfSPtr)}; + + // Satellite dynamics setup with Celestial object + SatelliteDynamics satelliteDynamics = {customEnvironment, satelliteSystem}; + satelliteDynamics.setInstant(startInstant); + + // Set up initial state vector + SatelliteDynamics::StateVector startStateVector(6); + const Vector3d startPositionCoordinates = + (startState.getPosition()).inUnit(Position::Unit::Meter).accessCoordinates(); + const Vector3d startVelocityCoordinates = + (startState.getVelocity()).inUnit(Velocity::Unit::MeterPerSecond).accessCoordinates(); + startStateVector[0] = startPositionCoordinates[0]; + startStateVector[1] = startPositionCoordinates[1]; + startStateVector[2] = startPositionCoordinates[2]; + startStateVector[3] = startVelocityCoordinates[0]; + startStateVector[4] = startVelocityCoordinates[1]; + startStateVector[5] = startVelocityCoordinates[2]; + + // Check initial conditions precision + EXPECT_NEAR(startStateVector[0], 6878137.0, 1e-15); + EXPECT_NEAR(startStateVector[1], 0.0, 1e-15); + EXPECT_NEAR(startStateVector[2], 0.0, 1e-15); + EXPECT_NEAR(startStateVector[3], 0.0, 1e-15); + EXPECT_NEAR(startStateVector[4], 7612.608170359118, 1e-15); + EXPECT_NEAR(startStateVector[5], 0.0, 1e-15); + + // Perform 1.0s integration step + runge_kutta4 stepper; + stepper.do_step(satelliteDynamics.getDynamicalEquations(), startStateVector, (0.0), 1.0); + + // Reference values achieved in OREKit + Earth_DragReference[0] = 6878132.787246078000000; + Earth_DragReference[1] = 7612.606615971900000; + Earth_DragReference[2] = -0.000000000000330; + + Earth_DragReference[3] = -8.425506982847088; + Earth_DragReference[4] = 7612.603507382901000; + Earth_DragReference[5] = -0.000000000000649; + + // OREKit has Z-axis change at the 13th decimal place, which is not realistic for this simple model. + // Consider this the precision and compare at 12th decimal place. + EXPECT_NEAR(startStateVector[0], Earth_DragReference[0], 1e-12); + EXPECT_NEAR(startStateVector[1], Earth_DragReference[1], 1e-12); + EXPECT_NEAR(startStateVector[2], Earth_DragReference[2], 1e-12); + EXPECT_NEAR(startStateVector[3], Earth_DragReference[3], 1e-12); + EXPECT_NEAR(startStateVector[4], Earth_DragReference[4], 1e-12); + EXPECT_NEAR(startStateVector[5], Earth_DragReference[5], 1e-12); + } + // Minimum radius "re-entry" test { // Create environment diff --git a/test/OpenSpaceToolkit/Astrodynamics/NumericalSolver.test.cpp b/test/OpenSpaceToolkit/Astrodynamics/NumericalSolver.test.cpp index dfe586d20..828c0d756 100644 --- a/test/OpenSpaceToolkit/Astrodynamics/NumericalSolver.test.cpp +++ b/test/OpenSpaceToolkit/Astrodynamics/NumericalSolver.test.cpp @@ -286,6 +286,15 @@ TEST(OpenSpaceToolkit_Astrodynamics_NumericalSolver, GetNumbers) using ostk::astro::NumericalSolver; + { + NumericalSolver numericalSolver = { + NumericalSolver::LogType::NoLog, NumericalSolver::StepperType::RungeKutta4, 5.0, 1.0e-15, 1.0e-15}; + + EXPECT_EQ(numericalSolver.getTimeStep(), 5.0); + EXPECT_EQ(numericalSolver.getRelativeTolerance(), 1.0e-15); + EXPECT_EQ(numericalSolver.getAbsoluteTolerance(), 1.0e-15); + } + { NumericalSolver numericalSolver = { NumericalSolver::LogType::NoLog, NumericalSolver::StepperType::RungeKuttaCashKarp54, 5.0, 1.0e-15, 1.0e-15}; @@ -309,6 +318,7 @@ TEST(OpenSpaceToolkit_Astrodynamics_NumericalSolver, StringFromType) using ostk::astro::NumericalSolver; { + EXPECT_TRUE(NumericalSolver::StringFromStepperType(NumericalSolver::StepperType::RungeKutta4) == "RungeKutta4"); EXPECT_TRUE( NumericalSolver::StringFromStepperType(NumericalSolver::StepperType::RungeKuttaCashKarp54) == "RungeKuttaCashKarp54" @@ -338,6 +348,90 @@ TEST(OpenSpaceToolkit_Astrodynamics_NumericalSolver, IntegrateStatesAtSortedInst using ostk::astro::NumericalSolver; + // Performance test with RungeKutta4 in forward time + { + const NumericalSolver::StateVector currentStateVector = {0, 1}; + + const Instant startInstant = Instant::J2000(); + + const Array instantArray = { + startInstant + Duration::Seconds(10), + startInstant + Duration::Seconds(40), + startInstant + Duration::Seconds(70)}; + + // needs very small step size + NumericalSolver numericalSolver = { + NumericalSolver::LogType::NoLog, NumericalSolver::StepperType::RungeKutta4, 0.001, 1.0e-15, 1.0e-15}; + + const Array propagatedStateVectorArray = + numericalSolver.integrateStatesAtSortedInstants( + currentStateVector, + startInstant, + instantArray, + [](const NumericalSolver::StateVector &x, NumericalSolver::StateVector &dxdt, const double) -> void + { + dxdt[0] = x[1]; + dxdt[1] = -x[0]; + } + ); + + // Validate the output against an analytical function + + for (size_t i = 0; i < instantArray.size(); i++) + { + const NumericalSolver::StateVector propagatedStateVector = propagatedStateVectorArray[i]; + + EXPECT_GT( + 2e-10, std::abs(propagatedStateVector[0] - std::sin((instantArray[i] - startInstant).inSeconds())) + ); + EXPECT_GT( + 2e-10, std::abs(propagatedStateVector[1] - std::cos((instantArray[i] - startInstant).inSeconds())) + ); + } + } + + // Performance test with RungeKutta4 in backward time + { + const NumericalSolver::StateVector currentStateVector = {0, 1}; + + const Instant startInstant = Instant::J2000(); + + const Array instantArray = { + startInstant + Duration::Seconds(-10), + startInstant + Duration::Seconds(-40), + startInstant + Duration::Seconds(-70)}; + + // needs very small step size + NumericalSolver numericalSolver = { + NumericalSolver::LogType::NoLog, NumericalSolver::StepperType::RungeKutta4, 0.001, 1.0e-15, 1.0e-15}; + + const Array propagatedStateVectorArray = + numericalSolver.integrateStatesAtSortedInstants( + currentStateVector, + startInstant, + instantArray, + [](const NumericalSolver::StateVector &x, NumericalSolver::StateVector &dxdt, const double) -> void + { + dxdt[0] = x[1]; + dxdt[1] = -x[0]; + } + ); + + // Validate the output against an analytical function + + for (size_t i = 0; i < instantArray.size(); i++) + { + const NumericalSolver::StateVector propagatedStateVector = propagatedStateVectorArray[i]; + + EXPECT_GT( + 2e-10, std::abs(propagatedStateVector[0] - std::sin((instantArray[i] - startInstant).inSeconds())) + ); + EXPECT_GT( + 2e-10, std::abs(propagatedStateVector[1] - std::cos((instantArray[i] - startInstant).inSeconds())) + ); + } + } + // Performance test with RungeKuttaCashKarp54 and integrateStatesAtSortedInstants in forward time { const NumericalSolver::StateVector currentStateVector = {0, 1}; @@ -519,6 +613,56 @@ TEST(OpenSpaceToolkit_Astrodynamics_NumericalSolver, IntegrateStateForDuration) using ostk::astro::NumericalSolver; + // Performance test with RungeKutta4 in forward time + { + const NumericalSolver::StateVector currentStateVector = {0, 1}; + const Duration propDuration = Duration::Seconds(10); + + // needs very small step size + NumericalSolver numericalSolver = { + NumericalSolver::LogType::NoLog, NumericalSolver::StepperType::RungeKutta4, 0.001, 1.0e-15, 1.0e-15}; + + const NumericalSolver::StateVector propagatedStateVector = numericalSolver.integrateStateForDuration( + currentStateVector, + propDuration, + [](const NumericalSolver::StateVector &x, NumericalSolver::StateVector &dxdt, const double) -> void + { + dxdt[0] = x[1]; + dxdt[1] = -x[0]; + } + ); + + // Validate the output against an analytical function + + EXPECT_GT(2e-10, std::abs(propagatedStateVector[0] - std::sin(propDuration.inSeconds()))); + EXPECT_GT(2e-10, std::abs(propagatedStateVector[1] - std::cos(propDuration.inSeconds()))); + } + + // Performance test with RungeKutta4 in backward time + { + const NumericalSolver::StateVector currentStateVector = {0, 1}; + const Duration propDuration = Duration::Seconds(-10); + + // needs very small step size + NumericalSolver numericalSolver = { + NumericalSolver::LogType::NoLog, NumericalSolver::StepperType::RungeKutta4, 0.001, 1.0e-15, 1.0e-15}; + + const NumericalSolver::StateVector propagatedStateVector = numericalSolver.integrateStateForDuration( + currentStateVector, + propDuration, + [](const NumericalSolver::StateVector &x, NumericalSolver::StateVector &dxdt, const double) -> void + { + dxdt[0] = x[1]; + dxdt[1] = -x[0]; + } + ); + + // Validate the output against an analytical function + + EXPECT_GT(2e-10, std::abs(propagatedStateVector[0] - std::sin(propDuration.inSeconds()))); + EXPECT_GT(2e-10, std::abs(propagatedStateVector[1] - std::cos(propDuration.inSeconds()))); + } + // Performance test with RungeKuttaCashKarp54 and integrateStateForDuration in forward time { const NumericalSolver::StateVector currentStateVector = {0, 1}; @@ -731,6 +875,60 @@ TEST(OpenSpaceToolkit_Astrodynamics_NumericalSolver, IntegrateStateFromInstantTo using ostk::astro::NumericalSolver; + // Performance test with RungeKutta4 in forwards time + { + const NumericalSolver::StateVector currentStateVector = {0, 1}; + const Instant instant = Instant::J2000(); + const Duration propDuration = Duration::Seconds(100); + + // needs very small step size + NumericalSolver numericalSolver = { + NumericalSolver::LogType::NoLog, NumericalSolver::StepperType::RungeKutta4, 0.001, 1.0e-15, 1.0e-15}; + + const NumericalSolver::StateVector propagatedStateVector = numericalSolver.integrateStateFromInstantToInstant( + currentStateVector, + instant, + instant + propDuration, + [](const NumericalSolver::StateVector &x, NumericalSolver::StateVector &dxdt, const double) -> void + { + dxdt[0] = x[1]; + dxdt[1] = -x[0]; + } + ); + + // Validate the output against an analytical function + + EXPECT_GT(2e-10, std::abs(propagatedStateVector[0] - std::sin(propDuration.inSeconds()))); + EXPECT_GT(2e-10, std::abs(propagatedStateVector[1] - std::cos(propDuration.inSeconds()))); + } + + // Performance test with RungeKutta4 in backwards time + { + const NumericalSolver::StateVector currentStateVector = {0, 1}; + const Instant instant = Instant::J2000(); + const Duration propDuration = Duration::Seconds(-100); + + // needs very small step size + NumericalSolver numericalSolver = { + NumericalSolver::LogType::NoLog, NumericalSolver::StepperType::RungeKutta4, 0.001, 1.0e-15, 1.0e-15}; + + const NumericalSolver::StateVector propagatedStateVector = numericalSolver.integrateStateFromInstantToInstant( + currentStateVector, + instant, + instant + propDuration, + [](const NumericalSolver::StateVector &x, NumericalSolver::StateVector &dxdt, const double) -> void + { + dxdt[0] = x[1]; + dxdt[1] = -x[0]; + } + ); + + // Validate the output against an analytical function + + EXPECT_GT(2e-10, std::abs(propagatedStateVector[0] - std::sin(propDuration.inSeconds()))); + EXPECT_GT(2e-10, std::abs(propagatedStateVector[1] - std::cos(propDuration.inSeconds()))); + } + // Performance test with RungeKuttaCashKarp54 in forward time { const NumericalSolver::StateVector currentStateVector = {0, 1}; diff --git a/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit.test.cpp b/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit.test.cpp index 163a5d349..ffa2d6fc5 100644 --- a/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit.test.cpp +++ b/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit.test.cpp @@ -936,9 +936,7 @@ TEST(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit, GetOrbitalFrame) // VVLH { - // [TBI] - } { diff --git a/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit/Models/Kepler/COE.test.cpp b/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit/Models/Kepler/COE.test.cpp index e4b4969f7..4079bd35f 100644 --- a/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit/Models/Kepler/COE.test.cpp +++ b/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit/Models/Kepler/COE.test.cpp @@ -620,9 +620,7 @@ TEST(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Kepler_COE, GetCarte } { - // [TBI] Add more tests - } { @@ -682,11 +680,9 @@ TEST(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Kepler_COE, Cartesia } { - // const Array // [TBI] Add more tests - } { diff --git a/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit/Models/Propagated.test.cpp b/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit/Models/Propagated.test.cpp index 96315a1a4..0d234d0bd 100644 --- a/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit/Models/Propagated.test.cpp +++ b/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit/Models/Propagated.test.cpp @@ -416,8 +416,10 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagated, Calcul const Composite satelliteGeometry(Cuboid( {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); + + // Drag coefficient to 0.0 to neglect atmospheric drag const SatelliteSystem satelliteSystem = { - Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Reference data setup const Table referenceData = Table::Load( @@ -792,8 +794,10 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagated, Calcul const Composite satelliteGeometry(Cuboid( {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); + + // Drag coefficient to 0.0 to neglect atmospheric drag const SatelliteSystem satelliteSystem = { - Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Test basic positive and negative revolution numbers { @@ -899,7 +903,7 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagated, Access {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Satellite dynamics setup SatelliteDynamics satelliteDynamics = {defaultEnvironment_, satelliteSystem}; @@ -977,7 +981,7 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagated, SetCac {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); // TBI: Add fixtures later const SatelliteSystem satelliteSystem = { - Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Satellite dynamics setup SatelliteDynamics satelliteDynamics = {defaultEnvironment_, satelliteSystem}; @@ -1100,8 +1104,10 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagated, PropAc const Composite satelliteGeometry(Cuboid( {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); + + // Drag coefficient to 0.0 to neglect atmospheric drag const SatelliteSystem satelliteSystem = { - Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Satellite dynamics setup SatelliteDynamics satelliteDynamics = {customEnvironment, satelliteSystem}; @@ -1291,7 +1297,7 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagated, PropAc {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Current state and instant setup const Instant startInstant = Instant::DateTime(DateTime::Parse("2021-03-20 00:00:00.000"), Scale::UTC); @@ -1487,7 +1493,7 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagated, PropAc {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // EGM96 360x360 perturbation only vs GMAT { @@ -1790,7 +1796,7 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagated, PropAc {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // EGM84 70x70 perturbation only vs STK EGM84 { @@ -2034,8 +2040,10 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagated, PropAc {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); + + // Drag coefficient to 0.0 to neglect atmospheric drag const SatelliteSystem satelliteSystem = { - Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Satellite dynamics setup SatelliteDynamics satelliteDynamics = {customEnvironment, satelliteSystem}; @@ -2128,7 +2136,7 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagated, PropAc {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Satellite dynamics setup SatelliteDynamics satelliteDynamics = {customEnvironment, satelliteSystem}; @@ -2220,8 +2228,10 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagated, PropAc {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); + + // Drag coefficient to 0.0 to neglect atmospheric drag const SatelliteSystem satelliteSystem = { - Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Satellite dynamics setup SatelliteDynamics satelliteDynamics = {customEnvironment, satelliteSystem}; @@ -2319,7 +2329,7 @@ TEST( {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Satellite dynamics setup SatelliteDynamics satelliteDynamics = {customEnvironment, satelliteSystem}; @@ -2372,7 +2382,7 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagated, PropAc {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Create environment const Instant instantJ2000 = Instant::J2000(); @@ -2553,7 +2563,7 @@ TEST_F( {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Satellite dynamics setup SatelliteDynamics satelliteDynamics = {customEnvironment, satelliteSystem}; @@ -2657,7 +2667,7 @@ TEST(DISABLED_OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagated, {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Satellite dynamics setup SatelliteDynamics satelliteDynamics_default = {customEnvironment_default, satelliteSystem}; @@ -2724,7 +2734,7 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagated, Propag {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; const SatelliteDynamics satelliteDynamics = {defaultEnvironment_, satelliteSystem}; Propagated propagated(satelliteDynamics, defaultnumericalSolver_, states); diff --git a/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit/Models/Propagated/Orekit_Drag_Exponential_320km_2hr_run.csv b/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit/Models/Propagated/Orekit_Drag_Exponential_320km_2hr_run.csv new file mode 100644 index 000000000..bc36eeaca --- /dev/null +++ b/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit/Models/Propagated/Orekit_Drag_Exponential_320km_2hr_run.csv @@ -0,0 +1,242 @@ +DATE,POS_X,POS_Y,POS_Z,VEL_X,VEL_Y,VEL_Z +2023-01-01T00:00:00.000,6878137.0,0.0,0.0,-0.0,7612.608170359118,0.0 +2023-01-01T00:00:30.000,6874345.869406072,228336.2837964543,-1.856046696678136E-11,-252.71881900855786,7608.412198681022,8.354890985150848E-12 +2023-01-01T00:01:00.000,6862976.656865406,456420.85588209674,1.0765463744633143E-9,-505.15904766386524,7595.828931364627,7.423084502187452E-11 +2023-01-01T00:01:30.000,6844041.895483153,684002.2823591176,5.00909063906659E-9,-757.0424030937238,7574.872239855169,1.974826190564103E-10 +2023-01-01T00:02:00.000,6817562.45840862,910829.683983358,1.349658545150151E-8,-1008.0912163098047,7545.56522622016,3.7783838097186813E-10 +2023-01-01T00:02:30.000,6783567.535825212,1136653.012726376,2.8246495495908465E-8,-1258.0287383019122,7507.940197682023,6.149001592039272E-10 +2023-01-01T00:03:00.000,6742094.602771929,1361223.3274211956,5.095246218666244E-8,-1506.5794451180614,7462.0386310032,9.081445010661357E-10 +2023-01-01T00:03:30.000,6693189.377831887,1584293.0681878736,8.329055170780798E-8,-1753.4693415940583,7407.911126763038,1.2569233388165633E-9 +2023-01-01T00:04:00.000,6636905.7727333885,1805616.3293363657,1.2691553213507155E-7,-1998.426263397758,7345.6173535768785,1.6604650621919367E-9 +2023-01-01T00:04:30.000,6573305.832919105,2024949.1304458512,1.8345718581156822E-7,-2241.18017705504,7275.22598231878,2.11787579583169E-9 +2023-01-01T00:05:00.000,6502459.669148907,2242049.6853216914,2.545166630964649E-7,-2481.463477626766,7196.814610420445,2.628140879712792E-9 +2023-01-01T00:05:30.000,6424445.380211712,2456678.668533523,3.4166288354499437E-7,-2719.011283708555,7110.469676329779,3.1901265504171995E-9 +2023-01-01T00:06:00.000,6339348.966831568,2668599.479240671,4.4642899050842226E-7,-2953.5617294281965,7016.286364223392,3.80258182075777E-9 +2023-01-01T00:06:30.000,6247264.236862884,2877578.5020140433,5.703088650639484E-7,-3184.8562531188095,6914.368499078069,4.464140554995964E-9 +2023-01-01T00:07:00.000,6148292.701879313,3083385.3643669933,7.147537050971794E-7,-3412.6398823495047,6804.828432216896,5.1733237365958244E-9 +2023-01-01T00:07:30.000,6042543.465270279,3285793.1907112375,8.811686752638673E-7,-3636.6615149993695,6687.786917456224,5.92854192517421E-9 +2023-01-01T00:08:00.000,5930133.101968509,3484578.852457902,1.0709096334531966E-6,-3856.6741960649188,6563.372977989973,6.728097899027554E-9 +2023-01-01T00:08:30.000,5811185.529941179,3679523.213987973,1.2852799392621732E-6,-4072.435389895858,6431.723764158045,7.570189479339958E-9 +2023-01-01T00:09:00.000,5685831.873586293,3870411.3742210097,1.525527349869758E-6,-4283.707247559073,6292.9844022556435,8.452912531908489E-9 +2023-01-01T00:09:30.000,5554210.319184946,4057032.903515818,1.792841008570485E-6,-4490.256869036109,6147.307834550139,9.374264141957335E-9 +2023-01-01T00:10:00.000,5416465.96256874,4239182.075641945,2.088348531090582E-6,-4691.8565599650865,5994.854650681881,1.0332145957354826E-8 +2023-01-01T00:10:30.000,5272750.649170349,4416658.094566259,2.4131131946652415E-6,-4888.284082644061,5835.792910634777,1.1324367695296491E-8 +2023-01-01T00:11:00.000,5123222.80663352,4589265.3158046305,2.7681312347039007E-6,-5079.322901019098,5670.297959471824,1.234865080727233E-8 +2023-01-01T00:11:30.000,4968047.27016705,4756813.462094683,3.1543292537113655E-6,-5264.76241938703,5498.5522340398065,1.3402632296899801E-8 +2023-01-01T00:12:00.000,4807395.100835253,4919117.833151889,3.5725617469665784E-6,-5444.398214549719,5320.745061856243,1.448386868497371E-8 +2023-01-01T00:12:30.000,4641443.396985229,5075999.509277754,4.02360874928803E-6,-5618.032261163965,5137.072452400305,1.5589840115863143E-8 +2023-01-01T00:13:00.000,4470375.099018834,5227285.5485956725,4.5081736070354966E-6,-5785.47315003857,4947.736881037736,1.671795459917088E-8 +2023-01-01T00:13:30.000,4294378.787724527,5372809.1776969815,5.0268808793121264E-6,-5946.53629913798,4752.947065818016,1.786555238036578E-8 +2023-01-01T00:14:00.000,4113648.476391437,5512409.975487116,5.580274372139247E-6,-6101.044157059866,4552.917737389793,1.9029910433902176E-8 +2023-01-01T00:14:30.000,3928383.396934829,5645934.050029119,6.168815309178865E-6,-6248.826398762356,4347.869402288239,2.0208247072151994E-8 +2023-01-01T00:15:00.000,3738787.780268667,5773234.208189649,6.7928806423758985E-6,-6389.7201133251465,4138.028099855251,2.1397726663297617E-8 +2023-01-01T00:15:30.000,3545070.631167478,5894170.117900383,7.452761505684018E-6,-6523.569983537511,3923.625153060478,2.2595464451164258E-8 +2023-01-01T00:16:00.000,3347445.4978656424,6008608.462856028,8.148661814826007E-6,-6650.228457115253,3704.896913497867,2.3798531469811595E-8 +2023-01-01T00:16:30.000,3146130.236648108,6116423.089478332,8.880697015821814E-6,-6769.555909357834,3482.0845008388055,2.500395954555466E-8 +2023-01-01T00:17:00.000,2941346.7716920483,6217495.145984157,9.648892984795485E-6,-6881.42079706641,3255.43353702911,2.6208746378946065E-8 +2023-01-01T00:17:30.000,2733320.8504241975,6311713.213404245,1.0453185081346162E-5,-6985.699803553046,3025.1938755228616,2.740986069912177E-8 +2023-01-01T00:18:00.000,2522281.7946635503,6398973.4284082865,1.1293417357538595E-5,-7082.277974581311,2791.6193258515564,2.8604247482795706E-8 +2023-01-01T00:18:30.000,2308462.247823757,6479179.597800892,1.2169341924335604E-5,-7171.048845088372,2554.9673738322313,2.9788833230080436E-8 +2023-01-01T00:19:00.000,2092097.918453903,6552243.30456223,1.3080618477058647E-5,-7251.914556548882,2315.4988977229523,3.0960531289215033E-8 +2023-01-01T00:19:30.000,1873427.320400356,6618084.005316445,1.402681398122388E-5,-7324.785964851336,2073.477880638606,3.211624722219584E-8 +2023-01-01T00:20:00.000,1652691.5098761558,6676629.119120419,1.5007402519859816E-5,-7389.582738567905,1829.171119543996,3.325288420323188E-8 +2023-01-01T00:20:30.000,1430133.8197277575,6727814.107474989,1.6021765303169274E-5,-7446.233447509473,1582.847931145036,3.436734844188348E-8 +2023-01-01T00:21:00.000,1205999.5911920916,6771582.545470421,1.706919084115342E-5,-7494.675641468238,1334.779855002272,3.5456554622691104E-8 +2023-01-01T00:21:30.000,980535.9034396246,6807886.183987708,1.814887527956912E-5,-7534.855919061081,1085.240354193992,3.651743135306183E-8 +2023-01-01T00:22:00.000,753991.3012015685,6836685.002887126,1.9259922899343532E-5,-7566.729986597795,834.504513858912,3.754692661115193E-8 +2023-01-01T00:22:30.000,526615.5207815019,6857947.2551254295,2.040134677932168E-5,-7590.262706909305,582.8487379507504,3.854201318546746E-8 +2023-01-01T00:23:00.000,298659.2147534249,6871649.501753004,2.1572069621974208E-5,-7605.428138082036,330.55044453897716,3.9499694097899596E-8 +2023-01-01T00:23:30.000,70373.67564974108,6877776.637752491,2.277092474144428E-5,-7612.209562055747,77.88775999162704,4.041700800191672E-8 +2023-01-01T00:24:00.000,-157989.44105623924,6876321.908690273,2.3996657213064293E-5,-7610.59950305326,-174.86078762270387,4.129103454765521E-8 +2023-01-01T00:24:30.000,-386178.39436789864,6867286.91816258,2.5247925183225903E-5,-7600.5997358218365,-427.4165755756912,4.211889970567878E-8 +2023-01-01T00:25:00.000,-613941.6352772005,6850681.626027928,2.6523301338240463E-5,-7582.221283677064,-679.5011936244798,4.2897781041218686E-8 +2023-01-01T00:25:30.000,-841028.0840649438,6826524.337427897,2.7821274530582037E-5,-7555.484406351419,-930.8367509226578,4.3624912930759574E-8 +2023-01-01T00:26:00.000,-1067187.407083699,6794841.682608296,2.914025156066232E-5,-7520.418577660907,-1181.1461823586792,4.4297591712899744E-8 +2023-01-01T00:26:30.000,-1292170.292718306,6755668.587562996,3.0478559112045343E-5,-7477.062453014419,-1430.1535539840422,4.4913180765491346E-8 +2023-01-01T00:27:00.000,-1515728.7262197318,6709048.235532793,3.183444583777163E-5,-7425.4638268015615,-1677.5843671945272,4.5469115501152855E-8 +2023-01-01T00:27:30.000,-1737616.263109309,6655032.019401714,3.320608459522565E-5,-7365.6795797060095,-1923.1658613291793,4.596290827334397E-8 +2023-01-01T00:28:00.000,-1957588.3008519686,6593679.485043268,3.459157482674745E-5,-7297.7756160023855,-2166.6273143534545,4.6392153185304037E-8 +2023-01-01T00:28:30.000,-2175402.3484989884,6525058.265679089,3.598894508296052E-5,-7221.826790905855,-2407.7003412950817,4.6754530794274706E-8 +2023-01-01T00:29:00.000,-2390818.294003005,6449244.007322315,3.739615568556245E-5,-7137.916828054462,-2646.1191901036354,4.7047812703559646E-8 +2023-01-01T00:29:30.000,-2603598.6689106063,6366320.285387928,3.881110152610324E-5,-7046.138227215215,-2881.621034607696,4.7269866035115514E-8 +2023-01-01T00:30:00.000,-2813508.910140725,6276378.5125619285,4.023161499705994E-5,-6946.592162315648,-3113.946264246633,4.741865777552295E-8 +2023-01-01T00:30:30.000,-3020317.618560255,6179517.838030955,4.16554690513042E-5,-6839.388369913235,-3342.8387702576347,4.749225898840031E-8 +2023-01-01T00:31:00.000,-3223796.814071837,6075845.038183405,4.308038038584823E-5,-6724.6450282256565,-3568.046228002497,4.7488848886114724E-8 +2023-01-01T00:31:30.000,-3423722.186932619,5965474.398902558,4.4504012745560744E-5,-6602.488626855213,-3789.320375122936,4.740671875494229E-8 +2023-01-01T00:32:00.000,-3619873.3450269527,5848527.5895814365,4.5923980342344725E-5,-6473.053827351055,-4006.4172852178103,4.724427572632455E-8 +2023-01-01T00:32:30.000,-3812034.0568204205,5725133.528998318,4.733785138507375E-5,-6336.483314762864,-4219.097636740547,4.7000046388504385E-8 +2023-01-01T00:33:00.000,-3999992.4897273844,5595428.243200707,4.8743151715406E-5,-6192.927640349707,-4427.126976820359,4.667268023239687E-8 +2023-01-01T00:33:30.000,-4183541.4436292793,5459554.715554484,5.0137368544414866E-5,-6042.545055617387,-4630.275979716418,4.626095292588891E-8 +2023-01-01T00:34:00.000,-4362478.57928624,5317662.729123498,5.151795428480499E-5,-5885.501337867281,-4828.320699620078,4.576376941098967E-8 +2023-01-01T00:34:30.000,-4536606.641390247,5169908.701553339,5.28823304733186E-5,-5721.969607448947,-5021.042817526445,4.518016681849131E-8 +2023-01-01T00:35:00.000,-4705733.676013916,5016455.512641369,5.422789177778025E-5,-5552.130136917981,-5208.2298819031985,4.450931719504542E-8 +2023-01-01T00:35:30.000,-4869673.242215223,4857472.324783031,5.555201008307932E-5,-5376.170152309468,-5389.675542891293,4.3750530037812055E-8 +2023-01-01T00:36:00.000,-5028244.617564896,4693134.3964923965,5.6852038650247794E-5,-5194.283626746097,-5565.1797797794325,4.290325463209979E-8 +2023-01-01T00:36:30.000,-5181272.997369896,4523622.889202532,5.812531634265803E-5,-5006.671066608513,-5734.549121501484,4.196708218768189E-8 +2023-01-01T00:37:00.000,-5328589.687373385,4349124.66755863,5.9369171913239266E-5,-4813.539290503521,-5897.5968599138405,4.094174776974785E-8 +2023-01-01T00:37:30.000,-5470032.289718752,4169832.0934240716,6.05809283464946E-5,-4615.101201273912,-6054.143255617539,3.9827132020729456E-8 +2023-01-01T00:38:00.000,-5605444.881972675,3985942.8138265098,6.175790724899243E-5,-4411.57555130113,-6204.015736098313,3.862326266952742E-8 +2023-01-01T00:38:30.000,-5734678.189009874,3797659.543077723,6.289743328190542E-5,-4203.186701359593,-6347.049085966089,3.733031582495582E-8 +2023-01-01T00:39:00.000,-5857589.74757012,3605189.8393074083,6.399683862907942E-5,-3990.1643732884404,-6483.085629084274,3.594861705051881E-8 +2023-01-01T00:39:30.000,-5974044.063306009,3408745.875657291,6.505346749403327E-5,-3772.7433967533575,-6611.975402388016,3.447864221793564E-8 +2023-01-01T00:40:00.000,-6083912.760148466,3208544.206387744,6.606468061921666E-5,-3551.1634503776713,-6733.576321199829,3.2921018137136513E-8 +2023-01-01T00:40:30.000,-6187074.721825248,3004805.528154775,6.702785982078978E-5,-3325.668797528035,-6847.75433586036,3.1276522960761496E-8 +2023-01-01T00:41:00.000,-6283416.225376494,2797754.4367205333,6.79404125321347E-5,-3096.5080170460033,-6954.383579501613,2.954608636150873E-8 +2023-01-01T00:41:30.000,-6372831.066520102,2587619.1793655255,6.879977634926241E-5,-2863.933729222306,-7053.346506799743,2.773078948099499E-8 +2023-01-01T00:42:00.000,-6455220.6767287385,2374631.403275491,6.960342357124568E-5,-2628.2023173159005,-7144.534023554442,2.5831864649111208E-8 +2023-01-01T00:42:30.000,-6530494.231889444,2159025.9001802825,7.03488657287807E-5,-2389.5736449247984,-7227.845606952063,2.3850694873177223E-8 +2023-01-01T00:43:00.000,-6598568.752426002,1941040.3475262695,7.103365809396522E-5,-2148.3107695202175,-7303.189416379962,2.1788813096524428E-8 +2023-01-01T00:43:30.000,-6659369.194773749,1720915.0464675934,7.165540416437496E-5,-1904.6796524598512,-7370.482394669826,1.964790122645945E-8 +2023-01-01T00:44:00.000,-6712828.534105949,1498892.6569650844,7.22117601145221E-5,-1658.9488657999268,-7429.650359658405,1.7429788931888774E-8 +2023-01-01T00:44:30.000,-6758887.838220544,1275217.9302848752,7.270043920779526E-5,-1411.389296229255,-7480.628085964727,1.513645221121092E-8 +2023-01-01T00:45:00.000,-6797496.332505835,1050137.439191592,7.311921616200108E-5,-1162.2738464516456,-7523.359376893617,1.2770011731409351E-8 +2023-01-01T00:45:30.000,-6828611.455913483,823899.3061335487,7.346593146166218E-5,-911.8771343458657,-7557.797126386272,1.0332730939606366E-8 +2023-01-01T00:46:00.000,-6852198.907877101,596752.9297195887,7.373849561026804E-5,-660.4751902347914,-7583.90337094959,7.827013948663779E-9 +2023-01-01T00:46:30.000,-6868232.686124726,368948.7097890892,7.393489331572773E-5,-408.3451525974617,-7601.649331506991,5.255403198740922E-9 +2023-01-01T00:47:00.000,-6876695.115343505,140737.77137821334,7.405318760233685E-5,-155.7649625594791,-7611.015445124622,2.6205768970435307E-9 +2023-01-01T00:47:30.000,-6877576.866664956,-87628.31211330385,7.409152384264097E-5,96.98694250146009,-7611.991386577943,-7.465376168207149E-11 +2023-01-01T00:48:00.000,-6870876.967949358,-315897.7962496626,7.404813370266043E-5,349.63193589714683,-7604.576079734912,-2.827347591036567E-9 +2023-01-01T00:48:30.000,-6856602.804857904,-543819.0430750787,7.392133899403271E-5,601.8915087791861,-7588.777698743253,-5.63443662204873E-9 +2023-01-01T00:49:00.000,-6834770.11271146,-771140.7985125126,7.370955542672746E-5,853.4875771594765,-7564.613659020453,-8.492729521949607E-9 +2023-01-01T00:49:30.000,-6805402.959144876,-997612.4693392495,7.341129625610043E-5,1104.1427884623897,-7532.110598056439,-1.1398915218831114E-8 +2023-01-01T00:50:00.000,-6768533.717575977,-1222984.3994339989,7.302517581816993E-5,1353.5808272707216,-7491.304346050082,-1.4349566728076479E-8 +2023-01-01T00:50:30.000,-6724203.031518507,-1447008.1449909904,7.25499129471292E-5,1601.5267199283562,-7442.239886411933,-1.7341145176150434E-8 +2023-01-01T00:51:00.000,-6672459.769778312,-1669436.7483976749,7.198433426924266E-5,1847.7071376638696,-7384.9713061766515,-2.0370004017042962E-8 +2023-01-01T00:51:30.000,-6613360.972582211,-1890025.0104741072,7.132737736742125E-5,2091.8506979009053,-7319.561736379871,-2.3432393436371334E-8 +2023-01-01T00:52:00.000,-6546971.788698869,-2108529.7607739205,7.05780938109257E-5,2333.68826342318,-7246.083282465179,-2.6524464937862764E-8 +2023-01-01T00:52:30.000,-6473365.40362107,-2324710.1256488934,6.973565204480839E-5,2572.9532390643026,-7164.616944797918,-2.9642276106662833E-8 +2023-01-01T00:53:00.000,-6392622.958888484,-2538327.793781628,6.879934013387608E-5,2809.381865595371,-7075.25252937346,-3.2781795543645134E-8 +2023-01-01T00:53:30.000,-6304833.4626399055,-2749147.278893602,6.776856835613442E-5,3042.7135104863446,-6978.08854881837,-3.5938907964634765E-8 +2023-01-01T00:54:00.000,-6210093.691493553,-2956936.1793390033,6.664287164086061E-5,3272.690955220685,-6873.232113793582,-3.9109419458202765E-8 +2023-01-01T00:54:30.000,-6108508.083863606,-3161465.434298172,6.542191184664592E-5,3499.060678846527,-6760.798814919302,-4.2289062895440565E-8 +2023-01-01T00:55:00.000,-6000188.624830536,-3362509.5762882293,6.41054798749504E-5,3721.573137451783,-6640.912595351811,-4.547350348488467E-8 +2023-01-01T00:55:30.000,-5885254.72269223,-3559846.979712534,6.269349761492065E-5,3939.983039255126,-6513.70561415262,-4.865834446553002E-8 +2023-01-01T00:56:00.000,-5763833.077331913,-3753260.105174964,6.118601971543644E-5,4154.049615009564,-6379.318100600586,-5.183913293064864E-8 +2023-01-01T00:56:30.000,-5636057.540548012,-3942535.739289709,5.958323518057406E-5,4363.536883420537,-6237.898199607622,-5.501136577491678E-8 +2023-01-01T00:57:00.000,-5502068.968499928,-4127465.229722199,5.788546878490269E-5,4568.213911285936,-6089.601808408371,-5.8170495757150436E-8 +2023-01-01T00:57:30.000,-5362015.066432369,-4307844.715202078,5.609318230526257E-5,4767.855068071277,-5934.592404703888,-6.131193767075497E-8 +2023-01-01T00:58:00.000,-5216050.225849417,-4483475.350254645,5.4206975565914926E-5,4962.240274639375,-5773.040866448779,-6.443107461381068E-8 +2023-01-01T00:58:30.000,-5064335.354317821,-4654163.524403042,5.2227587294197696E-5,5151.155245860355,-5605.1252834804545,-6.752326435054245E-8 +2023-01-01T00:59:00.000,-4907037.698087142,-4819721.075599532,5.015589578407136E-5,5334.391726834489,-5431.030761198162,-7.058384575575935E-8 +2023-01-01T00:59:30.000,-4744330.657722274,-4979965.497650583,4.799291936519397E-5,5511.747722467536,-5250.949216508177,-7.360814533369679E-8 +2023-01-01T01:00:00.000,-4576393.596951604,-5134720.141407124,4.5739816675423566E-5,5683.027720145426,-5065.079166260169,-7.659148380255328E-8 +2023-01-01T01:00:30.000,-4403411.644941508,-5283814.409498136,4.339788673490937E-5,5848.042905262858,-4873.625508407872,-7.952918273588439E-8 +2023-01-01T01:01:00.000,-4225575.492215164,-5427083.944392945,4.09685688202001E-5,6006.611369368199,-4676.79929613539,-8.241657125189739E-8 +2023-01-01T01:01:30.000,-4043081.1804406503,-5564370.809584898,3.8453442137068195E-5,6158.55831069524,-4474.817505198058,-8.524899274158375E-8 +2023-01-01T01:02:00.000,-3856129.886320076,-5695523.663696677,3.5854225291021643E-5,6303.7162268607335,-4267.902794734394,-8.802181162653155E-8 +2023-01-01T01:02:30.000,-3664927.699817936,-5820397.927315324,3.317277555475199E-5,6441.925099515282,-4056.2832618127914,-9.073042013717804E-8 +2023-01-01T01:03:00.000,-3469685.396973228,-5938855.942373046,3.0411087932044107E-5,6573.032570744047,-3840.1921899835334,-9.337024510219013E-8 +2023-01-01T01:03:30.000,-3270618.207545721,-6050767.123898147,2.7571294017954898E-5,6696.894111022775,-3619.867792113309,-9.5936754739604E-8 +2023-01-01T01:04:00.000,-3067945.5777525445,-6156008.103968753,2.465566065534913E-5,6813.373178544027,-3395.552947785752,-9.842546544030795E-8 +2023-01-01T01:04:30.000,-2861890.9283566484,-6254462.867710643,2.166658838816349E-5,6922.341369737935,-3167.4949355574695,-1.0083194853441996E-7 +2023-01-01T01:05:00.000,-2652681.4083738127,-6346022.881189307,1.8606609712054463E-5,7023.678560821581,-2935.945160364706,-1.0315183703108933E-7 +2023-01-01T01:05:30.000,-2440547.644669694,-6430587.211055176,1.5478387123369155E-5,7117.273040220963,-2701.158876381161,-1.0538083232224538E-7 +2023-01-01T01:06:00.000,-2225723.487722978,-6508062.635810201,1.228471096766292E-5,7203.02163171951,-2463.3949056324695,-1.0751471084081865E-7 +2023-01-01T01:06:30.000,-2008445.7538348832,-6578363.748573063,9.028497089271498E-6,7280.829808197466,-2222.9153526775317,-1.0954933066397914E-7 +2023-01-01T01:07:00.000,-1788953.964069195,-6641413.051229767,5.712784283728638E-6,7350.611795836699,-1979.9853156712325,-1.1148063805196509E-7 +2023-01-01T01:07:30.000,-1567490.0802106292,-6697141.039865807,2.3407315551023217E-6,7412.29066867608,-1734.8725941270632,-1.1330467391311829E-7 +2023-01-01T01:08:00.000,-1344298.2380325897,-6745486.281385732,-1.0843848193964521E-6,7465.798433413207,-1487.847393701801,-1.1501758018579886E-7 +2023-01-01T01:08:30.000,-1119624.4781683646,-6786395.481235656,-4.5591744148997015E-6,7511.076104358957,-1239.1820283276882,-1.1661560612791887E-7 +2023-01-01T01:09:00.000,-893716.4748824346,-6819823.542154035,-8.080135971553916E-6,7548.073768462286,-989.1506200204798,-1.1809511450491606E-7 +2023-01-01T01:09:30.000,-666823.2630408958,-6845733.61388596,-1.1643660891193663E-5,7576.750640333523,-738.0287966942678,-1.194525876670828E-7 +2023-01-01T01:10:00.000,-439194.9635819808,-6864097.13380617,-1.524603691456297E-5,7597.075107205584,-486.0933883162326,-1.2068463350727024E-7 +2023-01-01T01:10:30.000,-211082.50778930305,-6874893.858405977,-1.888345197536257E-5,7609.024763783466,-233.62212173625028,-1.2178799129010675E-7 +2023-01-01T01:11:00.000,17262.63932820852,-6878111.885609407,-2.255199822713708E-5,7612.586436943642,19.10668547221843,-1.2275953734400037E-7 +2023-01-01T01:11:30.000,245588.75624475407,-6873747.667893963,-2.6247676238756508E-5,7607.756200256135,271.81443182245306,-1.2359629060733833E-7 +2023-01-01T01:12:00.000,473644.14240889484,-6861806.016201527,-2.996639935399111E-5,7594.539378313226,524.2225390377941,-1.2429541802045012E-7 +2023-01-01T01:12:30.000,701177.3957116717,-6842300.094635107,-3.370399821042798E-5,7572.950540860063,776.0527591493901,-1.248542397550693E-7 +2023-01-01T01:13:00.000,927937.6896257382,-6815251.405947272,-3.745622541273273E-5,7543.013486733598,1027.0274812298314,-1.252702342732055E-7 +2023-01-01T01:13:30.000,1153675.0497099927,-6780689.76783625,-4.121876035501946E-5,7504.761217627618,1276.8700374245345,-1.255410432075306E-7 +2023-01-01T01:14:00.000,1378140.6291749033,-6738653.280075854,-4.498721418685862E-5,7458.235901712711,1525.3050079435131,-1.256644760555813E-7 +2023-01-01T01:14:30.000,1601086.983204738,-6689188.282515439,-4.875713491722428E-5,7403.488827151352,1772.0585246773178,-1.2563851468029498E-7 +2023-01-01T01:15:00.000,1822268.3417343039,-6632349.303996215,-5.2524012650461544E-5,7340.580345559292,2016.8585731024423,-1.2546131760961734E-7 +2023-01-01T01:15:30.000,2041440.880379492,-6568199.002240219,-5.6283284948140045E-5,7269.579805475619,2259.435292143389,-1.251312241281544E-7 +2023-01-01T01:16:00.000,2258362.989222947,-6496808.094778207,-6.00303423104525E-5,7190.565475914782,2499.521271660814,-1.2464675815408404E-7 +2023-01-01T01:16:30.000,2472795.539158577,-6418255.280992603,-6.376053377061775E-5,7103.624460084927,2736.8518472378305,-1.2400663189479961E-7 +2023-01-01T01:17:00.000,2684502.1455012783,-6332627.155361471,-6.746917259555523E-5,7008.852599367592,2971.165391939479,-1.2320974927501626E-7 +2023-01-01T01:17:30.000,2893249.42857128,-6240018.111999117,-7.115154208591431E-5,6906.354367664646,3202.203604723753,-1.2225520913134852E-7 +2023-01-01T01:18:00.000,3098807.270965858,-6140530.240598574,-7.480290146836646E-5,6796.242756228935,3429.7117951862347,-1.2114230816764624E-7 +2023-01-01T01:18:30.000,3300949.071234779,-6034273.213890665,-7.841849187290053E-5,6678.639149105603,3653.4391643244344,-1.198705436656686E-7 +2023-01-01T01:19:00.000,3499451.9936798676,-5921364.166743725,-8.199354238770395E-5,6553.673189321374,3873.1390810123416,-1.184396159459731E-7 +2023-01-01T01:19:30.000,3694097.214003294,-5801927.567037242,-8.552327618406353E-5,6421.482635969357,4088.569353880395,-1.1684943057420599E-7 +2023-01-01T01:20:00.000,3884670.1605337905,-5676095.078451771,-8.900291670357871E-5,6282.213212346858,4299.492498301162,-1.1510010030829224E-7 +2023-01-01T01:20:30.000,4070960.750764887,-5544005.415326377,-9.24276938998522E-5,6136.018445313668,4505.675998186412,-1.1319194678234728E-7 +2023-01-01T01:21:00.000,4252763.6229444,-5405804.189743614,-9.579285052669942E-5,5983.05949604787,4706.892562306959,-1.1112550192346051E-7 +2023-01-01T01:21:30.000,4429878.362459879,-5261643.751010606,-9.909364846481086E-5,5823.504982385766,4902.92037485277,-1.0890150909783535E-7 +2023-01-01T01:22:00.000,4602109.722770452,-5111683.01771318,-1.0232537507869829E-4,5657.530792941776,5093.543339957038,-1.0652092398311312E-7 +2023-01-01T01:22:30.000,4769267.840641507,-4956087.30252819,-1.0548334959566842E-4,5485.319893213186,5278.551319914771,-1.0398491516405322E-7 +2023-01-01T01:23:00.000,4931168.445444967,-4795028.129987184,-1.0856292949848486E-4,5307.062123883548,5457.7403668331735,-1.0129486444909528E-7 +2023-01-01T01:23:30.000,5087633.062294403,-4628683.047392222,-1.1155951692331444E-4,5122.953991547012,5630.912947458559,-9.845236690568513E-8 +2023-01-01T01:24:00.000,5238489.208791066,-4457235.429092438,-1.1446856505449144E-4,4933.19845208435,5797.878160931886,-9.545923061260691E-8 +2023-01-01T01:24:30.000,5383570.585163955,-4280874.274336928,-1.1728558450758946E-4,4738.004686929453,5958.451949232883,-9.231747612792987E-8 +2023-01-01T01:25:00.000,5522717.25759431,-4099793.9989269436,-1.2000614969225259E-4,4537.587872472934,6112.457300080789,-8.90293356715448E-8 +2023-01-01T01:25:30.000,5655775.834522426,-3914194.2208970245,-1.226259051462127E-4,4332.168942857049,6259.724442068022,-8.559725202163788E-8 +2023-01-01T01:26:00.000,5782599.635742464,-3724279.540461297,-1.2514057183190622E-4,4121.974346423438,6400.091031811676,-8.202387712482163E-8 +2023-01-01T01:26:30.000,5903048.85409882,-3530259.3144675787,-1.2754595338710053E-4,3907.2357960821464,6533.40233291652,-7.831207042001944E-8 +2023-01-01T01:27:00.000,6016990.70960582,-3332347.4256078727,-1.2983794232094837E-4,3688.1900138771484,6659.511386552243,-7.446489687657591E-8 +2023-01-01T01:27:30.000,6124299.595820834,-3130762.0466397214,-1.3201252614690917E-4,3465.0784700299405,6778.279173456863,-7.048562474744466E-8 +2023-01-01T01:28:00.000,6224857.21830947,-2925725.39987828,-1.3406579344400733E-4,3238.1471167488676,6889.574767187778,-6.637772303868232E-8 +2023-01-01T01:28:30.000,6318552.725050195,-2717463.512224296,-1.359939398379391E-4,3007.6461170976618,6993.275478451439,-6.214485869685585E-8 +2023-01-01T01:29:00.000,6405282.828634601,-2506205.965998,-1.3779327389359507E-4,2773.829569222039,7089.266990352612,-5.779089351635065E-8 +2023-01-01T01:29:30.000,6484951.920128675,-2292185.645853609,-1.394602229106295E-4,2536.9552262383986,7177.443484414098,-5.3319880768940075E-8 +2023-01-01T01:30:00.000,6557472.174469494,-2075638.482053425,-1.409913386137841E-4,2297.2842120933924,7257.707757227993,-4.873606155835694E-8 +2023-01-01T01:30:30.000,6622763.647281176,-1856803.1903845603,-1.4238330272976456E-4,2055.080733707606,7329.971327609919,-4.4043860903097954E-8 +2023-01-01T01:31:00.000,6680754.363003369,-1635921.0090049563,-1.4363293244255837E-4,1810.6117897206625,7394.154534138055,-3.924788355033654E-8 +2023-01-01T01:31:30.000,6731380.394235137,-1413235.4325088344,-1.4473718571920296E-4,1564.1468761588462,7450.186622969529,-3.43529095260225E-8 +2023-01-01T01:32:00.000,6774585.932206744,-1188991.9435047125,-1.456931664981334E-4,1315.9576893496906,7498.005825837273,-2.9363889424144454E-8 +2023-01-01T01:32:30.000,6810323.34830169,-963437.742001898,-1.464981297323612E-4,1066.3178264110404,7537.5594281414205,-2.428593944036119E-8 +2023-01-01T01:33:00.000,6838553.246561136,-736821.4729037697,-1.4714948627988716E-4,815.5024836447658,7568.80382706017,-1.9124336154808265E-8 +2023-01-01T01:33:30.000,6859244.507112884,-509392.95190826245,-1.4764480763390176E-4,563.7881531675949,7591.704579616056,-1.3884511069365213E-8 +2023-01-01T01:34:00.000,6872374.320477016,-281402.890117703,-1.4798183048549005E-4,311.4523181135152,7606.2364406446395,-8.57204490501576E-9 +2023-01-01T01:34:30.000,6877928.212710363,-53102.61766158911,-1.481584611117338E-4,58.77314674372582,7612.383390623779,-3.192661665273691E-9 +2023-01-01T01:35:00.000,6875900.061362106,175256.1933630216,-1.4817277958228473E-4,-193.97081419864372,7610.138653332782,2.2477775280181148E-9 +2023-01-01T01:35:30.000,6866292.102222927,403421.8063280885,-1.480230437776808E-4,-446.50094655101384,7599.50470332199,7.743280819880544E-9 +2023-01-01T01:36:00.000,6849114.926860245,631142.6975822919,-1.4770769321287777E-4,-698.5388678725357,7580.493263184582,1.328773222142739E-8 +2023-01-01T01:36:30.000,6824387.470942263,858167.8337239465,-1.472253526596844E-4,-949.8067383253898,7553.125290633546,1.8874898415862064E-8 +2023-01-01T01:37:00.000,6792136.993363721,1084246.9483334678,-1.465748355620097E-4,-1200.0275669579025,7517.4309553981375,2.449843576366823E-8 +2023-01-01T01:37:30.000,6752399.046196345,1309130.8178603277,-1.4575514723806532E-4,-1448.925517051846,7473.44960596526,3.015189749912409E-8 +2023-01-01T01:38:00.000,6705217.435497101,1532571.5363603693,-1.447654878639042E-4,-1696.2262101973106,7421.22972620242,3.582874110998232E-8 +2023-01-01T01:38:30.000,6650644.173017525,1754322.7887806194,-1.4360525523292582E-4,-1941.657028759951,7360.828881910119,4.152233589187916E-8 +2023-01-01T01:39:00.000,6588739.41886728,1974140.1224903357,-1.4227404728623755E-4,-2184.947416407173,7292.313657362555,4.7225970668767206E-8 +2023-01-01T01:39:30.000,6519571.415195205,2191781.216758959,-1.407716644090238E-4,-2425.829176361973,7215.7595819066455,5.293286167040793E-8 +2023-01-01T01:40:00.000,6443216.410960948,2407006.149883913,-1.3909811148834957E-4,-2664.036767055636,7131.251046700226,5.863616055771073E-8 +2023-01-01T01:40:30.000,6359758.577880108,2619577.663673768,-1.3725359972810422E-4,-2899.307594853382,7038.881211681269,6.432896258646891E-8 +2023-01-01T01:41:00.000,6269289.91763555,2829261.424995215,-1.3523854821707737E-4,-3131.382303530273,6938.751902870648,7.000431489981458E-8 +2023-01-01T01:41:30.000,6171910.160457197,3035826.2840955313,-1.3305358524645425E-4,-3360.0050601782546,6830.973500121669,7.565522493950096E-8 +2023-01-01T01:42:00.000,6067726.655182062,3239044.529415763,-1.3069954937331557E-4,-3584.923837229177,6715.664815440094,8.127466896591601E-8 +2023-01-01T01:42:30.000,5956854.250915772,3438692.138613729,-1.2817749022703525E-4,-3805.8906902828903,6592.952962008848,8.685560067654001E-8 +2023-01-01T01:43:00.000,5839415.17042599,3634549.025520136,-1.2548866905577743E-4,-4022.662031434155,6462.9732140617225,9.239095991238108E-8 +2023-01-01T01:43:30.000,5715538.875407308,3826399.282755553,-1.2263455901061405E-4,-4234.998897797046,6325.868857760599,9.787368144175557E-8 +2023-01-01T01:44:00.000,5585361.923766182,4014031.41974079,-1.1961684516510321E-4,-4442.667214930862,6181.7910332405745,1.032967038106268E-7 +2023-01-01T01:44:30.000,5449027.819083188,4197238.595838328,-1.164374242684957E-4,-4645.438054877121,6030.898567997086,1.0865297824857529E-7 +2023-01-01T01:45:00.000,5306686.852418561,4375818.848367771,-1.1309840423106562E-4,-4843.087888523222,5873.357801798757,1.139354776193458E-7 +2023-01-01T01:45:30.000,5158495.936635419,4549575.315243967,-1.096021033403957E-4,-5035.398832014541,5709.342403318918,1.1913720540480354E-7 +2023-01-01T01:46:00.000,5004618.433423301,4718316.45199237,-1.0595104920778345E-4,-5222.158886943354,5539.033178687987,1.2425120471103203E-7 +2023-01-01T01:46:30.000,4845223.97321269,4881856.242902428,-1.0214797744427387E-4,-5403.16217404981,5362.617872177736,1.2927056728521734E-7 +2023-01-01T01:47:00.000,4680488.268179078,5040014.406086178,-9.819583006616697E-5,-5578.209160177314,5180.290959237172,1.3418844253189556E-7 +2023-01-01T01:47:30.000,4510592.918542672,5192616.592216085,-9.409775363019055E-5,-5747.106878232121,4992.253432108181,1.3899804651707713E-7 +2023-01-01T01:48:00.000,4335725.212377291,5339494.576722944,-8.985709709887533E-5,-5909.669139904731,4798.712578257271,1.436926709487234E-7 +2023-01-01T01:48:30.000,4156077.919149154,5480486.445242039,-8.547740943701491E-5,-6065.716740918515,4599.881751867642,1.4826569212201902E-7 +2023-01-01T01:49:00.000,3971849.077213109,5615436.772103112,-8.09624369404401E-5,-6215.07765857934,4395.980138643529,1.5271057981787077E-7 +2023-01-01T01:49:30.000,3783241.775500619,5744196.791667377,-7.631612029868461E-5,-6357.587241408439,4187.232514186035,1.5702090614306274E-7 +2023-01-01T01:50:00.000,3590463.929640127,5866624.562322686,-7.154259139346582E-5,-6493.0883906494655,3973.8689962068615,1.6119035430051375E-7 +2023-01-01T01:50:30.000,3393728.0527565996,5982585.122956111,-6.664616983525015E-5,-6621.431733449645,3756.124790853063,1.6521272727811318E-7 +2023-01-01T01:51:00.000,3193251.02120294,6091950.641731391,-6.163135924051848E-5,-6742.475787524117,3534.2399334224633,1.6908195644465373E-7 +2023-01-01T01:51:30.000,2989253.8354814933,6194600.557007276,-5.6502843252689764E-5,-6856.0871171219615,3308.459023755589,1.7279211004144117E-7 +2023-01-01T01:52:00.000,2781961.3766192026,6290421.710241441,-5.126548131000336E-5,-6962.140480121962,3079.030956595782,1.7633740155823484E-7 +2023-01-01T01:52:30.000,2571602.158265001,6379308.470733401,-4.592430416399886E-5,-7060.5189660959495,2846.2086472147607,1.7971219798225957E-7 +2023-01-01T01:53:00.000,2358408.074782692,6461162.852068965,-4.048450915256915E-5,-7151.114125187562,2610.2487526060713,1.8291102790913495E-7 +2023-01-01T01:53:30.000,2142614.1456170226,6535894.620137842,-3.495145523189489E-5,-7233.826087664309,2371.4113885537827,1.8592858950468596E-7 +2023-01-01T01:54:00.000,1924458.256214767,6603421.392605333,-2.9330657771898048E-5,-7308.563674011171,2129.959842888333,1.8875975830672937E-7 +2023-01-01T01:54:30.000,1704180.8957864014,6663668.729728457,-2.3627783120176666E-5,-7375.244495444397,1886.1602852455903,1.9139959485607935E-7 +2023-01-01T01:55:00.000,1482024.8921974595,6716570.216416389,-1.7848642939704124E-5,-7433.795044734628,1640.2814736491243,1.9384335214617444E-7 +2023-01-01T01:55:30.000,1258235.1442818255,6762067.535444742,-1.1999188325890466E-5,-7484.15077723931,1392.5944582391014,1.9608648288090627E-7 +2023-01-01T01:56:00.000,1033058.3518720386,6800110.531743007,-6.085503708914235E-6,-7526.256182055004,1143.3722824744236,1.981246465304159E-7 +2023-01-01T01:56:30.000,806742.7438442267,6830657.267684269,-1.1380054753641405E-7,-7560.064843211188,892.889682137492,1.999537161748289E-7 +2023-01-01T01:57:00.000,579537.8044774631,6853674.069316244,5.909589179093785E-6,-7585.539490838101,641.4227824734011,2.0156978512611522E-7 +2023-01-01T01:57:30.000,351693.9984291925,6869135.56348269,1.1978219674840709E-5,-7602.652042252186,389.2487937974245,2.0296917331849046E-7 +2023-01-01T01:58:00.000,123462.49462991222,6877024.705794241,1.8085538218107124E-5,-7611.383632913887,136.64570590634509,2.0414843345801707E-7 +2023-01-01T01:58:30.000,-104905.11059852708,6877332.799417863,2.422489223412121E-5,-7611.7246372236405,-116.10801836949979,2.0510435692232047E-7 +2023-01-01T01:59:00.000,-333157.0708957712,6870059.504664204,3.038953654035624E-5,-7603.6746791331425,-368.7337501356422,2.0583397940160116E-7 +2023-01-01T01:59:30.000,-561041.7673812199,6855212.839362263,3.6572640757192925E-5,-7587.242632560205,-620.9530015859831,2.063345862724071E-7 +2023-01-01T02:00:00.000,-788307.9860317634,6832809.1700209705,4.2767296875682877E-5,-7562.446611606743,-872.4877329997729,2.0660371769592033E-7 diff --git a/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit/Models/Propagated/Orekit_Drag_Exponential_500km_2hr_run.csv b/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit/Models/Propagated/Orekit_Drag_Exponential_500km_2hr_run.csv new file mode 100644 index 000000000..bc36eeaca --- /dev/null +++ b/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit/Models/Propagated/Orekit_Drag_Exponential_500km_2hr_run.csv @@ -0,0 +1,242 @@ +DATE,POS_X,POS_Y,POS_Z,VEL_X,VEL_Y,VEL_Z +2023-01-01T00:00:00.000,6878137.0,0.0,0.0,-0.0,7612.608170359118,0.0 +2023-01-01T00:00:30.000,6874345.869406072,228336.2837964543,-1.856046696678136E-11,-252.71881900855786,7608.412198681022,8.354890985150848E-12 +2023-01-01T00:01:00.000,6862976.656865406,456420.85588209674,1.0765463744633143E-9,-505.15904766386524,7595.828931364627,7.423084502187452E-11 +2023-01-01T00:01:30.000,6844041.895483153,684002.2823591176,5.00909063906659E-9,-757.0424030937238,7574.872239855169,1.974826190564103E-10 +2023-01-01T00:02:00.000,6817562.45840862,910829.683983358,1.349658545150151E-8,-1008.0912163098047,7545.56522622016,3.7783838097186813E-10 +2023-01-01T00:02:30.000,6783567.535825212,1136653.012726376,2.8246495495908465E-8,-1258.0287383019122,7507.940197682023,6.149001592039272E-10 +2023-01-01T00:03:00.000,6742094.602771929,1361223.3274211956,5.095246218666244E-8,-1506.5794451180614,7462.0386310032,9.081445010661357E-10 +2023-01-01T00:03:30.000,6693189.377831887,1584293.0681878736,8.329055170780798E-8,-1753.4693415940583,7407.911126763038,1.2569233388165633E-9 +2023-01-01T00:04:00.000,6636905.7727333885,1805616.3293363657,1.2691553213507155E-7,-1998.426263397758,7345.6173535768785,1.6604650621919367E-9 +2023-01-01T00:04:30.000,6573305.832919105,2024949.1304458512,1.8345718581156822E-7,-2241.18017705504,7275.22598231878,2.11787579583169E-9 +2023-01-01T00:05:00.000,6502459.669148907,2242049.6853216914,2.545166630964649E-7,-2481.463477626766,7196.814610420445,2.628140879712792E-9 +2023-01-01T00:05:30.000,6424445.380211712,2456678.668533523,3.4166288354499437E-7,-2719.011283708555,7110.469676329779,3.1901265504171995E-9 +2023-01-01T00:06:00.000,6339348.966831568,2668599.479240671,4.4642899050842226E-7,-2953.5617294281965,7016.286364223392,3.80258182075777E-9 +2023-01-01T00:06:30.000,6247264.236862884,2877578.5020140433,5.703088650639484E-7,-3184.8562531188095,6914.368499078069,4.464140554995964E-9 +2023-01-01T00:07:00.000,6148292.701879313,3083385.3643669933,7.147537050971794E-7,-3412.6398823495047,6804.828432216896,5.1733237365958244E-9 +2023-01-01T00:07:30.000,6042543.465270279,3285793.1907112375,8.811686752638673E-7,-3636.6615149993695,6687.786917456224,5.92854192517421E-9 +2023-01-01T00:08:00.000,5930133.101968509,3484578.852457902,1.0709096334531966E-6,-3856.6741960649188,6563.372977989973,6.728097899027554E-9 +2023-01-01T00:08:30.000,5811185.529941179,3679523.213987973,1.2852799392621732E-6,-4072.435389895858,6431.723764158045,7.570189479339958E-9 +2023-01-01T00:09:00.000,5685831.873586293,3870411.3742210097,1.525527349869758E-6,-4283.707247559073,6292.9844022556435,8.452912531908489E-9 +2023-01-01T00:09:30.000,5554210.319184946,4057032.903515818,1.792841008570485E-6,-4490.256869036109,6147.307834550139,9.374264141957335E-9 +2023-01-01T00:10:00.000,5416465.96256874,4239182.075641945,2.088348531090582E-6,-4691.8565599650865,5994.854650681881,1.0332145957354826E-8 +2023-01-01T00:10:30.000,5272750.649170349,4416658.094566259,2.4131131946652415E-6,-4888.284082644061,5835.792910634777,1.1324367695296491E-8 +2023-01-01T00:11:00.000,5123222.80663352,4589265.3158046305,2.7681312347039007E-6,-5079.322901019098,5670.297959471824,1.234865080727233E-8 +2023-01-01T00:11:30.000,4968047.27016705,4756813.462094683,3.1543292537113655E-6,-5264.76241938703,5498.5522340398065,1.3402632296899801E-8 +2023-01-01T00:12:00.000,4807395.100835253,4919117.833151889,3.5725617469665784E-6,-5444.398214549719,5320.745061856243,1.448386868497371E-8 +2023-01-01T00:12:30.000,4641443.396985229,5075999.509277754,4.02360874928803E-6,-5618.032261163965,5137.072452400305,1.5589840115863143E-8 +2023-01-01T00:13:00.000,4470375.099018834,5227285.5485956725,4.5081736070354966E-6,-5785.47315003857,4947.736881037736,1.671795459917088E-8 +2023-01-01T00:13:30.000,4294378.787724527,5372809.1776969815,5.0268808793121264E-6,-5946.53629913798,4752.947065818016,1.786555238036578E-8 +2023-01-01T00:14:00.000,4113648.476391437,5512409.975487116,5.580274372139247E-6,-6101.044157059866,4552.917737389793,1.9029910433902176E-8 +2023-01-01T00:14:30.000,3928383.396934829,5645934.050029119,6.168815309178865E-6,-6248.826398762356,4347.869402288239,2.0208247072151994E-8 +2023-01-01T00:15:00.000,3738787.780268667,5773234.208189649,6.7928806423758985E-6,-6389.7201133251465,4138.028099855251,2.1397726663297617E-8 +2023-01-01T00:15:30.000,3545070.631167478,5894170.117900383,7.452761505684018E-6,-6523.569983537511,3923.625153060478,2.2595464451164258E-8 +2023-01-01T00:16:00.000,3347445.4978656424,6008608.462856028,8.148661814826007E-6,-6650.228457115253,3704.896913497867,2.3798531469811595E-8 +2023-01-01T00:16:30.000,3146130.236648108,6116423.089478332,8.880697015821814E-6,-6769.555909357834,3482.0845008388055,2.500395954555466E-8 +2023-01-01T00:17:00.000,2941346.7716920483,6217495.145984157,9.648892984795485E-6,-6881.42079706641,3255.43353702911,2.6208746378946065E-8 +2023-01-01T00:17:30.000,2733320.8504241975,6311713.213404245,1.0453185081346162E-5,-6985.699803553046,3025.1938755228616,2.740986069912177E-8 +2023-01-01T00:18:00.000,2522281.7946635503,6398973.4284082865,1.1293417357538595E-5,-7082.277974581311,2791.6193258515564,2.8604247482795706E-8 +2023-01-01T00:18:30.000,2308462.247823757,6479179.597800892,1.2169341924335604E-5,-7171.048845088372,2554.9673738322313,2.9788833230080436E-8 +2023-01-01T00:19:00.000,2092097.918453903,6552243.30456223,1.3080618477058647E-5,-7251.914556548882,2315.4988977229523,3.0960531289215033E-8 +2023-01-01T00:19:30.000,1873427.320400356,6618084.005316445,1.402681398122388E-5,-7324.785964851336,2073.477880638606,3.211624722219584E-8 +2023-01-01T00:20:00.000,1652691.5098761558,6676629.119120419,1.5007402519859816E-5,-7389.582738567905,1829.171119543996,3.325288420323188E-8 +2023-01-01T00:20:30.000,1430133.8197277575,6727814.107474989,1.6021765303169274E-5,-7446.233447509473,1582.847931145036,3.436734844188348E-8 +2023-01-01T00:21:00.000,1205999.5911920916,6771582.545470421,1.706919084115342E-5,-7494.675641468238,1334.779855002272,3.5456554622691104E-8 +2023-01-01T00:21:30.000,980535.9034396246,6807886.183987708,1.814887527956912E-5,-7534.855919061081,1085.240354193992,3.651743135306183E-8 +2023-01-01T00:22:00.000,753991.3012015685,6836685.002887126,1.9259922899343532E-5,-7566.729986597795,834.504513858912,3.754692661115193E-8 +2023-01-01T00:22:30.000,526615.5207815019,6857947.2551254295,2.040134677932168E-5,-7590.262706909305,582.8487379507504,3.854201318546746E-8 +2023-01-01T00:23:00.000,298659.2147534249,6871649.501753004,2.1572069621974208E-5,-7605.428138082036,330.55044453897716,3.9499694097899596E-8 +2023-01-01T00:23:30.000,70373.67564974108,6877776.637752491,2.277092474144428E-5,-7612.209562055747,77.88775999162704,4.041700800191672E-8 +2023-01-01T00:24:00.000,-157989.44105623924,6876321.908690273,2.3996657213064293E-5,-7610.59950305326,-174.86078762270387,4.129103454765521E-8 +2023-01-01T00:24:30.000,-386178.39436789864,6867286.91816258,2.5247925183225903E-5,-7600.5997358218365,-427.4165755756912,4.211889970567878E-8 +2023-01-01T00:25:00.000,-613941.6352772005,6850681.626027928,2.6523301338240463E-5,-7582.221283677064,-679.5011936244798,4.2897781041218686E-8 +2023-01-01T00:25:30.000,-841028.0840649438,6826524.337427897,2.7821274530582037E-5,-7555.484406351419,-930.8367509226578,4.3624912930759574E-8 +2023-01-01T00:26:00.000,-1067187.407083699,6794841.682608296,2.914025156066232E-5,-7520.418577660907,-1181.1461823586792,4.4297591712899744E-8 +2023-01-01T00:26:30.000,-1292170.292718306,6755668.587562996,3.0478559112045343E-5,-7477.062453014419,-1430.1535539840422,4.4913180765491346E-8 +2023-01-01T00:27:00.000,-1515728.7262197318,6709048.235532793,3.183444583777163E-5,-7425.4638268015615,-1677.5843671945272,4.5469115501152855E-8 +2023-01-01T00:27:30.000,-1737616.263109309,6655032.019401714,3.320608459522565E-5,-7365.6795797060095,-1923.1658613291793,4.596290827334397E-8 +2023-01-01T00:28:00.000,-1957588.3008519686,6593679.485043268,3.459157482674745E-5,-7297.7756160023855,-2166.6273143534545,4.6392153185304037E-8 +2023-01-01T00:28:30.000,-2175402.3484989884,6525058.265679089,3.598894508296052E-5,-7221.826790905855,-2407.7003412950817,4.6754530794274706E-8 +2023-01-01T00:29:00.000,-2390818.294003005,6449244.007322315,3.739615568556245E-5,-7137.916828054462,-2646.1191901036354,4.7047812703559646E-8 +2023-01-01T00:29:30.000,-2603598.6689106063,6366320.285387928,3.881110152610324E-5,-7046.138227215215,-2881.621034607696,4.7269866035115514E-8 +2023-01-01T00:30:00.000,-2813508.910140725,6276378.5125619285,4.023161499705994E-5,-6946.592162315648,-3113.946264246633,4.741865777552295E-8 +2023-01-01T00:30:30.000,-3020317.618560255,6179517.838030955,4.16554690513042E-5,-6839.388369913235,-3342.8387702576347,4.749225898840031E-8 +2023-01-01T00:31:00.000,-3223796.814071837,6075845.038183405,4.308038038584823E-5,-6724.6450282256565,-3568.046228002497,4.7488848886114724E-8 +2023-01-01T00:31:30.000,-3423722.186932619,5965474.398902558,4.4504012745560744E-5,-6602.488626855213,-3789.320375122936,4.740671875494229E-8 +2023-01-01T00:32:00.000,-3619873.3450269527,5848527.5895814365,4.5923980342344725E-5,-6473.053827351055,-4006.4172852178103,4.724427572632455E-8 +2023-01-01T00:32:30.000,-3812034.0568204205,5725133.528998318,4.733785138507375E-5,-6336.483314762864,-4219.097636740547,4.7000046388504385E-8 +2023-01-01T00:33:00.000,-3999992.4897273844,5595428.243200707,4.8743151715406E-5,-6192.927640349707,-4427.126976820359,4.667268023239687E-8 +2023-01-01T00:33:30.000,-4183541.4436292793,5459554.715554484,5.0137368544414866E-5,-6042.545055617387,-4630.275979716418,4.626095292588891E-8 +2023-01-01T00:34:00.000,-4362478.57928624,5317662.729123498,5.151795428480499E-5,-5885.501337867281,-4828.320699620078,4.576376941098967E-8 +2023-01-01T00:34:30.000,-4536606.641390247,5169908.701553339,5.28823304733186E-5,-5721.969607448947,-5021.042817526445,4.518016681849131E-8 +2023-01-01T00:35:00.000,-4705733.676013916,5016455.512641369,5.422789177778025E-5,-5552.130136917981,-5208.2298819031985,4.450931719504542E-8 +2023-01-01T00:35:30.000,-4869673.242215223,4857472.324783031,5.555201008307932E-5,-5376.170152309468,-5389.675542891293,4.3750530037812055E-8 +2023-01-01T00:36:00.000,-5028244.617564896,4693134.3964923965,5.6852038650247794E-5,-5194.283626746097,-5565.1797797794325,4.290325463209979E-8 +2023-01-01T00:36:30.000,-5181272.997369896,4523622.889202532,5.812531634265803E-5,-5006.671066608513,-5734.549121501484,4.196708218768189E-8 +2023-01-01T00:37:00.000,-5328589.687373385,4349124.66755863,5.9369171913239266E-5,-4813.539290503521,-5897.5968599138405,4.094174776974785E-8 +2023-01-01T00:37:30.000,-5470032.289718752,4169832.0934240716,6.05809283464946E-5,-4615.101201273912,-6054.143255617539,3.9827132020729456E-8 +2023-01-01T00:38:00.000,-5605444.881972675,3985942.8138265098,6.175790724899243E-5,-4411.57555130113,-6204.015736098313,3.862326266952742E-8 +2023-01-01T00:38:30.000,-5734678.189009874,3797659.543077723,6.289743328190542E-5,-4203.186701359593,-6347.049085966089,3.733031582495582E-8 +2023-01-01T00:39:00.000,-5857589.74757012,3605189.8393074083,6.399683862907942E-5,-3990.1643732884404,-6483.085629084274,3.594861705051881E-8 +2023-01-01T00:39:30.000,-5974044.063306009,3408745.875657291,6.505346749403327E-5,-3772.7433967533575,-6611.975402388016,3.447864221793564E-8 +2023-01-01T00:40:00.000,-6083912.760148466,3208544.206387744,6.606468061921666E-5,-3551.1634503776713,-6733.576321199829,3.2921018137136513E-8 +2023-01-01T00:40:30.000,-6187074.721825248,3004805.528154775,6.702785982078978E-5,-3325.668797528035,-6847.75433586036,3.1276522960761496E-8 +2023-01-01T00:41:00.000,-6283416.225376494,2797754.4367205333,6.79404125321347E-5,-3096.5080170460033,-6954.383579501613,2.954608636150873E-8 +2023-01-01T00:41:30.000,-6372831.066520102,2587619.1793655255,6.879977634926241E-5,-2863.933729222306,-7053.346506799743,2.773078948099499E-8 +2023-01-01T00:42:00.000,-6455220.6767287385,2374631.403275491,6.960342357124568E-5,-2628.2023173159005,-7144.534023554442,2.5831864649111208E-8 +2023-01-01T00:42:30.000,-6530494.231889444,2159025.9001802825,7.03488657287807E-5,-2389.5736449247984,-7227.845606952063,2.3850694873177223E-8 +2023-01-01T00:43:00.000,-6598568.752426002,1941040.3475262695,7.103365809396522E-5,-2148.3107695202175,-7303.189416379962,2.1788813096524428E-8 +2023-01-01T00:43:30.000,-6659369.194773749,1720915.0464675934,7.165540416437496E-5,-1904.6796524598512,-7370.482394669826,1.964790122645945E-8 +2023-01-01T00:44:00.000,-6712828.534105949,1498892.6569650844,7.22117601145221E-5,-1658.9488657999268,-7429.650359658405,1.7429788931888774E-8 +2023-01-01T00:44:30.000,-6758887.838220544,1275217.9302848752,7.270043920779526E-5,-1411.389296229255,-7480.628085964727,1.513645221121092E-8 +2023-01-01T00:45:00.000,-6797496.332505835,1050137.439191592,7.311921616200108E-5,-1162.2738464516456,-7523.359376893617,1.2770011731409351E-8 +2023-01-01T00:45:30.000,-6828611.455913483,823899.3061335487,7.346593146166218E-5,-911.8771343458657,-7557.797126386272,1.0332730939606366E-8 +2023-01-01T00:46:00.000,-6852198.907877101,596752.9297195887,7.373849561026804E-5,-660.4751902347914,-7583.90337094959,7.827013948663779E-9 +2023-01-01T00:46:30.000,-6868232.686124726,368948.7097890892,7.393489331572773E-5,-408.3451525974617,-7601.649331506991,5.255403198740922E-9 +2023-01-01T00:47:00.000,-6876695.115343505,140737.77137821334,7.405318760233685E-5,-155.7649625594791,-7611.015445124622,2.6205768970435307E-9 +2023-01-01T00:47:30.000,-6877576.866664956,-87628.31211330385,7.409152384264097E-5,96.98694250146009,-7611.991386577943,-7.465376168207149E-11 +2023-01-01T00:48:00.000,-6870876.967949358,-315897.7962496626,7.404813370266043E-5,349.63193589714683,-7604.576079734912,-2.827347591036567E-9 +2023-01-01T00:48:30.000,-6856602.804857904,-543819.0430750787,7.392133899403271E-5,601.8915087791861,-7588.777698743253,-5.63443662204873E-9 +2023-01-01T00:49:00.000,-6834770.11271146,-771140.7985125126,7.370955542672746E-5,853.4875771594765,-7564.613659020453,-8.492729521949607E-9 +2023-01-01T00:49:30.000,-6805402.959144876,-997612.4693392495,7.341129625610043E-5,1104.1427884623897,-7532.110598056439,-1.1398915218831114E-8 +2023-01-01T00:50:00.000,-6768533.717575977,-1222984.3994339989,7.302517581816993E-5,1353.5808272707216,-7491.304346050082,-1.4349566728076479E-8 +2023-01-01T00:50:30.000,-6724203.031518507,-1447008.1449909904,7.25499129471292E-5,1601.5267199283562,-7442.239886411933,-1.7341145176150434E-8 +2023-01-01T00:51:00.000,-6672459.769778312,-1669436.7483976749,7.198433426924266E-5,1847.7071376638696,-7384.9713061766515,-2.0370004017042962E-8 +2023-01-01T00:51:30.000,-6613360.972582211,-1890025.0104741072,7.132737736742125E-5,2091.8506979009053,-7319.561736379871,-2.3432393436371334E-8 +2023-01-01T00:52:00.000,-6546971.788698869,-2108529.7607739205,7.05780938109257E-5,2333.68826342318,-7246.083282465179,-2.6524464937862764E-8 +2023-01-01T00:52:30.000,-6473365.40362107,-2324710.1256488934,6.973565204480839E-5,2572.9532390643026,-7164.616944797918,-2.9642276106662833E-8 +2023-01-01T00:53:00.000,-6392622.958888484,-2538327.793781628,6.879934013387608E-5,2809.381865595371,-7075.25252937346,-3.2781795543645134E-8 +2023-01-01T00:53:30.000,-6304833.4626399055,-2749147.278893602,6.776856835613442E-5,3042.7135104863446,-6978.08854881837,-3.5938907964634765E-8 +2023-01-01T00:54:00.000,-6210093.691493553,-2956936.1793390033,6.664287164086061E-5,3272.690955220685,-6873.232113793582,-3.9109419458202765E-8 +2023-01-01T00:54:30.000,-6108508.083863606,-3161465.434298172,6.542191184664592E-5,3499.060678846527,-6760.798814919302,-4.2289062895440565E-8 +2023-01-01T00:55:00.000,-6000188.624830536,-3362509.5762882293,6.41054798749504E-5,3721.573137451783,-6640.912595351811,-4.547350348488467E-8 +2023-01-01T00:55:30.000,-5885254.72269223,-3559846.979712534,6.269349761492065E-5,3939.983039255126,-6513.70561415262,-4.865834446553002E-8 +2023-01-01T00:56:00.000,-5763833.077331913,-3753260.105174964,6.118601971543644E-5,4154.049615009564,-6379.318100600586,-5.183913293064864E-8 +2023-01-01T00:56:30.000,-5636057.540548012,-3942535.739289709,5.958323518057406E-5,4363.536883420537,-6237.898199607622,-5.501136577491678E-8 +2023-01-01T00:57:00.000,-5502068.968499928,-4127465.229722199,5.788546878490269E-5,4568.213911285936,-6089.601808408371,-5.8170495757150436E-8 +2023-01-01T00:57:30.000,-5362015.066432369,-4307844.715202078,5.609318230526257E-5,4767.855068071277,-5934.592404703888,-6.131193767075497E-8 +2023-01-01T00:58:00.000,-5216050.225849417,-4483475.350254645,5.4206975565914926E-5,4962.240274639375,-5773.040866448779,-6.443107461381068E-8 +2023-01-01T00:58:30.000,-5064335.354317821,-4654163.524403042,5.2227587294197696E-5,5151.155245860355,-5605.1252834804545,-6.752326435054245E-8 +2023-01-01T00:59:00.000,-4907037.698087142,-4819721.075599532,5.015589578407136E-5,5334.391726834489,-5431.030761198162,-7.058384575575935E-8 +2023-01-01T00:59:30.000,-4744330.657722274,-4979965.497650583,4.799291936519397E-5,5511.747722467536,-5250.949216508177,-7.360814533369679E-8 +2023-01-01T01:00:00.000,-4576393.596951604,-5134720.141407124,4.5739816675423566E-5,5683.027720145426,-5065.079166260169,-7.659148380255328E-8 +2023-01-01T01:00:30.000,-4403411.644941508,-5283814.409498136,4.339788673490937E-5,5848.042905262858,-4873.625508407872,-7.952918273588439E-8 +2023-01-01T01:01:00.000,-4225575.492215164,-5427083.944392945,4.09685688202001E-5,6006.611369368199,-4676.79929613539,-8.241657125189739E-8 +2023-01-01T01:01:30.000,-4043081.1804406503,-5564370.809584898,3.8453442137068195E-5,6158.55831069524,-4474.817505198058,-8.524899274158375E-8 +2023-01-01T01:02:00.000,-3856129.886320076,-5695523.663696677,3.5854225291021643E-5,6303.7162268607335,-4267.902794734394,-8.802181162653155E-8 +2023-01-01T01:02:30.000,-3664927.699817936,-5820397.927315324,3.317277555475199E-5,6441.925099515282,-4056.2832618127914,-9.073042013717804E-8 +2023-01-01T01:03:00.000,-3469685.396973228,-5938855.942373046,3.0411087932044107E-5,6573.032570744047,-3840.1921899835334,-9.337024510219013E-8 +2023-01-01T01:03:30.000,-3270618.207545721,-6050767.123898147,2.7571294017954898E-5,6696.894111022775,-3619.867792113309,-9.5936754739604E-8 +2023-01-01T01:04:00.000,-3067945.5777525445,-6156008.103968753,2.465566065534913E-5,6813.373178544027,-3395.552947785752,-9.842546544030795E-8 +2023-01-01T01:04:30.000,-2861890.9283566484,-6254462.867710643,2.166658838816349E-5,6922.341369737935,-3167.4949355574695,-1.0083194853441996E-7 +2023-01-01T01:05:00.000,-2652681.4083738127,-6346022.881189307,1.8606609712054463E-5,7023.678560821581,-2935.945160364706,-1.0315183703108933E-7 +2023-01-01T01:05:30.000,-2440547.644669694,-6430587.211055176,1.5478387123369155E-5,7117.273040220963,-2701.158876381161,-1.0538083232224538E-7 +2023-01-01T01:06:00.000,-2225723.487722978,-6508062.635810201,1.228471096766292E-5,7203.02163171951,-2463.3949056324695,-1.0751471084081865E-7 +2023-01-01T01:06:30.000,-2008445.7538348832,-6578363.748573063,9.028497089271498E-6,7280.829808197466,-2222.9153526775317,-1.0954933066397914E-7 +2023-01-01T01:07:00.000,-1788953.964069195,-6641413.051229767,5.712784283728638E-6,7350.611795836699,-1979.9853156712325,-1.1148063805196509E-7 +2023-01-01T01:07:30.000,-1567490.0802106292,-6697141.039865807,2.3407315551023217E-6,7412.29066867608,-1734.8725941270632,-1.1330467391311829E-7 +2023-01-01T01:08:00.000,-1344298.2380325897,-6745486.281385732,-1.0843848193964521E-6,7465.798433413207,-1487.847393701801,-1.1501758018579886E-7 +2023-01-01T01:08:30.000,-1119624.4781683646,-6786395.481235656,-4.5591744148997015E-6,7511.076104358957,-1239.1820283276882,-1.1661560612791887E-7 +2023-01-01T01:09:00.000,-893716.4748824346,-6819823.542154035,-8.080135971553916E-6,7548.073768462286,-989.1506200204798,-1.1809511450491606E-7 +2023-01-01T01:09:30.000,-666823.2630408958,-6845733.61388596,-1.1643660891193663E-5,7576.750640333523,-738.0287966942678,-1.194525876670828E-7 +2023-01-01T01:10:00.000,-439194.9635819808,-6864097.13380617,-1.524603691456297E-5,7597.075107205584,-486.0933883162326,-1.2068463350727024E-7 +2023-01-01T01:10:30.000,-211082.50778930305,-6874893.858405977,-1.888345197536257E-5,7609.024763783466,-233.62212173625028,-1.2178799129010675E-7 +2023-01-01T01:11:00.000,17262.63932820852,-6878111.885609407,-2.255199822713708E-5,7612.586436943642,19.10668547221843,-1.2275953734400037E-7 +2023-01-01T01:11:30.000,245588.75624475407,-6873747.667893963,-2.6247676238756508E-5,7607.756200256135,271.81443182245306,-1.2359629060733833E-7 +2023-01-01T01:12:00.000,473644.14240889484,-6861806.016201527,-2.996639935399111E-5,7594.539378313226,524.2225390377941,-1.2429541802045012E-7 +2023-01-01T01:12:30.000,701177.3957116717,-6842300.094635107,-3.370399821042798E-5,7572.950540860063,776.0527591493901,-1.248542397550693E-7 +2023-01-01T01:13:00.000,927937.6896257382,-6815251.405947272,-3.745622541273273E-5,7543.013486733598,1027.0274812298314,-1.252702342732055E-7 +2023-01-01T01:13:30.000,1153675.0497099927,-6780689.76783625,-4.121876035501946E-5,7504.761217627618,1276.8700374245345,-1.255410432075306E-7 +2023-01-01T01:14:00.000,1378140.6291749033,-6738653.280075854,-4.498721418685862E-5,7458.235901712711,1525.3050079435131,-1.256644760555813E-7 +2023-01-01T01:14:30.000,1601086.983204738,-6689188.282515439,-4.875713491722428E-5,7403.488827151352,1772.0585246773178,-1.2563851468029498E-7 +2023-01-01T01:15:00.000,1822268.3417343039,-6632349.303996215,-5.2524012650461544E-5,7340.580345559292,2016.8585731024423,-1.2546131760961734E-7 +2023-01-01T01:15:30.000,2041440.880379492,-6568199.002240219,-5.6283284948140045E-5,7269.579805475619,2259.435292143389,-1.251312241281544E-7 +2023-01-01T01:16:00.000,2258362.989222947,-6496808.094778207,-6.00303423104525E-5,7190.565475914782,2499.521271660814,-1.2464675815408404E-7 +2023-01-01T01:16:30.000,2472795.539158577,-6418255.280992603,-6.376053377061775E-5,7103.624460084927,2736.8518472378305,-1.2400663189479961E-7 +2023-01-01T01:17:00.000,2684502.1455012783,-6332627.155361471,-6.746917259555523E-5,7008.852599367592,2971.165391939479,-1.2320974927501626E-7 +2023-01-01T01:17:30.000,2893249.42857128,-6240018.111999117,-7.115154208591431E-5,6906.354367664646,3202.203604723753,-1.2225520913134852E-7 +2023-01-01T01:18:00.000,3098807.270965858,-6140530.240598574,-7.480290146836646E-5,6796.242756228935,3429.7117951862347,-1.2114230816764624E-7 +2023-01-01T01:18:30.000,3300949.071234779,-6034273.213890665,-7.841849187290053E-5,6678.639149105603,3653.4391643244344,-1.198705436656686E-7 +2023-01-01T01:19:00.000,3499451.9936798676,-5921364.166743725,-8.199354238770395E-5,6553.673189321374,3873.1390810123416,-1.184396159459731E-7 +2023-01-01T01:19:30.000,3694097.214003294,-5801927.567037242,-8.552327618406353E-5,6421.482635969357,4088.569353880395,-1.1684943057420599E-7 +2023-01-01T01:20:00.000,3884670.1605337905,-5676095.078451771,-8.900291670357871E-5,6282.213212346858,4299.492498301162,-1.1510010030829224E-7 +2023-01-01T01:20:30.000,4070960.750764887,-5544005.415326377,-9.24276938998522E-5,6136.018445313668,4505.675998186412,-1.1319194678234728E-7 +2023-01-01T01:21:00.000,4252763.6229444,-5405804.189743614,-9.579285052669942E-5,5983.05949604787,4706.892562306959,-1.1112550192346051E-7 +2023-01-01T01:21:30.000,4429878.362459879,-5261643.751010606,-9.909364846481086E-5,5823.504982385766,4902.92037485277,-1.0890150909783535E-7 +2023-01-01T01:22:00.000,4602109.722770452,-5111683.01771318,-1.0232537507869829E-4,5657.530792941776,5093.543339957038,-1.0652092398311312E-7 +2023-01-01T01:22:30.000,4769267.840641507,-4956087.30252819,-1.0548334959566842E-4,5485.319893213186,5278.551319914771,-1.0398491516405322E-7 +2023-01-01T01:23:00.000,4931168.445444967,-4795028.129987184,-1.0856292949848486E-4,5307.062123883548,5457.7403668331735,-1.0129486444909528E-7 +2023-01-01T01:23:30.000,5087633.062294403,-4628683.047392222,-1.1155951692331444E-4,5122.953991547012,5630.912947458559,-9.845236690568513E-8 +2023-01-01T01:24:00.000,5238489.208791066,-4457235.429092438,-1.1446856505449144E-4,4933.19845208435,5797.878160931886,-9.545923061260691E-8 +2023-01-01T01:24:30.000,5383570.585163955,-4280874.274336928,-1.1728558450758946E-4,4738.004686929453,5958.451949232883,-9.231747612792987E-8 +2023-01-01T01:25:00.000,5522717.25759431,-4099793.9989269436,-1.2000614969225259E-4,4537.587872472934,6112.457300080789,-8.90293356715448E-8 +2023-01-01T01:25:30.000,5655775.834522426,-3914194.2208970245,-1.226259051462127E-4,4332.168942857049,6259.724442068022,-8.559725202163788E-8 +2023-01-01T01:26:00.000,5782599.635742464,-3724279.540461297,-1.2514057183190622E-4,4121.974346423438,6400.091031811676,-8.202387712482163E-8 +2023-01-01T01:26:30.000,5903048.85409882,-3530259.3144675787,-1.2754595338710053E-4,3907.2357960821464,6533.40233291652,-7.831207042001944E-8 +2023-01-01T01:27:00.000,6016990.70960582,-3332347.4256078727,-1.2983794232094837E-4,3688.1900138771484,6659.511386552243,-7.446489687657591E-8 +2023-01-01T01:27:30.000,6124299.595820834,-3130762.0466397214,-1.3201252614690917E-4,3465.0784700299405,6778.279173456863,-7.048562474744466E-8 +2023-01-01T01:28:00.000,6224857.21830947,-2925725.39987828,-1.3406579344400733E-4,3238.1471167488676,6889.574767187778,-6.637772303868232E-8 +2023-01-01T01:28:30.000,6318552.725050195,-2717463.512224296,-1.359939398379391E-4,3007.6461170976618,6993.275478451439,-6.214485869685585E-8 +2023-01-01T01:29:00.000,6405282.828634601,-2506205.965998,-1.3779327389359507E-4,2773.829569222039,7089.266990352612,-5.779089351635065E-8 +2023-01-01T01:29:30.000,6484951.920128675,-2292185.645853609,-1.394602229106295E-4,2536.9552262383986,7177.443484414098,-5.3319880768940075E-8 +2023-01-01T01:30:00.000,6557472.174469494,-2075638.482053425,-1.409913386137841E-4,2297.2842120933924,7257.707757227993,-4.873606155835694E-8 +2023-01-01T01:30:30.000,6622763.647281176,-1856803.1903845603,-1.4238330272976456E-4,2055.080733707606,7329.971327609919,-4.4043860903097954E-8 +2023-01-01T01:31:00.000,6680754.363003369,-1635921.0090049563,-1.4363293244255837E-4,1810.6117897206625,7394.154534138055,-3.924788355033654E-8 +2023-01-01T01:31:30.000,6731380.394235137,-1413235.4325088344,-1.4473718571920296E-4,1564.1468761588462,7450.186622969529,-3.43529095260225E-8 +2023-01-01T01:32:00.000,6774585.932206744,-1188991.9435047125,-1.456931664981334E-4,1315.9576893496906,7498.005825837273,-2.9363889424144454E-8 +2023-01-01T01:32:30.000,6810323.34830169,-963437.742001898,-1.464981297323612E-4,1066.3178264110404,7537.5594281414205,-2.428593944036119E-8 +2023-01-01T01:33:00.000,6838553.246561136,-736821.4729037697,-1.4714948627988716E-4,815.5024836447658,7568.80382706017,-1.9124336154808265E-8 +2023-01-01T01:33:30.000,6859244.507112884,-509392.95190826245,-1.4764480763390176E-4,563.7881531675949,7591.704579616056,-1.3884511069365213E-8 +2023-01-01T01:34:00.000,6872374.320477016,-281402.890117703,-1.4798183048549005E-4,311.4523181135152,7606.2364406446395,-8.57204490501576E-9 +2023-01-01T01:34:30.000,6877928.212710363,-53102.61766158911,-1.481584611117338E-4,58.77314674372582,7612.383390623779,-3.192661665273691E-9 +2023-01-01T01:35:00.000,6875900.061362106,175256.1933630216,-1.4817277958228473E-4,-193.97081419864372,7610.138653332782,2.2477775280181148E-9 +2023-01-01T01:35:30.000,6866292.102222927,403421.8063280885,-1.480230437776808E-4,-446.50094655101384,7599.50470332199,7.743280819880544E-9 +2023-01-01T01:36:00.000,6849114.926860245,631142.6975822919,-1.4770769321287777E-4,-698.5388678725357,7580.493263184582,1.328773222142739E-8 +2023-01-01T01:36:30.000,6824387.470942263,858167.8337239465,-1.472253526596844E-4,-949.8067383253898,7553.125290633546,1.8874898415862064E-8 +2023-01-01T01:37:00.000,6792136.993363721,1084246.9483334678,-1.465748355620097E-4,-1200.0275669579025,7517.4309553981375,2.449843576366823E-8 +2023-01-01T01:37:30.000,6752399.046196345,1309130.8178603277,-1.4575514723806532E-4,-1448.925517051846,7473.44960596526,3.015189749912409E-8 +2023-01-01T01:38:00.000,6705217.435497101,1532571.5363603693,-1.447654878639042E-4,-1696.2262101973106,7421.22972620242,3.582874110998232E-8 +2023-01-01T01:38:30.000,6650644.173017525,1754322.7887806194,-1.4360525523292582E-4,-1941.657028759951,7360.828881910119,4.152233589187916E-8 +2023-01-01T01:39:00.000,6588739.41886728,1974140.1224903357,-1.4227404728623755E-4,-2184.947416407173,7292.313657362555,4.7225970668767206E-8 +2023-01-01T01:39:30.000,6519571.415195205,2191781.216758959,-1.407716644090238E-4,-2425.829176361973,7215.7595819066455,5.293286167040793E-8 +2023-01-01T01:40:00.000,6443216.410960948,2407006.149883913,-1.3909811148834957E-4,-2664.036767055636,7131.251046700226,5.863616055771073E-8 +2023-01-01T01:40:30.000,6359758.577880108,2619577.663673768,-1.3725359972810422E-4,-2899.307594853382,7038.881211681269,6.432896258646891E-8 +2023-01-01T01:41:00.000,6269289.91763555,2829261.424995215,-1.3523854821707737E-4,-3131.382303530273,6938.751902870648,7.000431489981458E-8 +2023-01-01T01:41:30.000,6171910.160457197,3035826.2840955313,-1.3305358524645425E-4,-3360.0050601782546,6830.973500121669,7.565522493950096E-8 +2023-01-01T01:42:00.000,6067726.655182062,3239044.529415763,-1.3069954937331557E-4,-3584.923837229177,6715.664815440094,8.127466896591601E-8 +2023-01-01T01:42:30.000,5956854.250915772,3438692.138613729,-1.2817749022703525E-4,-3805.8906902828903,6592.952962008848,8.685560067654001E-8 +2023-01-01T01:43:00.000,5839415.17042599,3634549.025520136,-1.2548866905577743E-4,-4022.662031434155,6462.9732140617225,9.239095991238108E-8 +2023-01-01T01:43:30.000,5715538.875407308,3826399.282755553,-1.2263455901061405E-4,-4234.998897797046,6325.868857760599,9.787368144175557E-8 +2023-01-01T01:44:00.000,5585361.923766182,4014031.41974079,-1.1961684516510321E-4,-4442.667214930862,6181.7910332405745,1.032967038106268E-7 +2023-01-01T01:44:30.000,5449027.819083188,4197238.595838328,-1.164374242684957E-4,-4645.438054877121,6030.898567997086,1.0865297824857529E-7 +2023-01-01T01:45:00.000,5306686.852418561,4375818.848367771,-1.1309840423106562E-4,-4843.087888523222,5873.357801798757,1.139354776193458E-7 +2023-01-01T01:45:30.000,5158495.936635419,4549575.315243967,-1.096021033403957E-4,-5035.398832014541,5709.342403318918,1.1913720540480354E-7 +2023-01-01T01:46:00.000,5004618.433423301,4718316.45199237,-1.0595104920778345E-4,-5222.158886943354,5539.033178687987,1.2425120471103203E-7 +2023-01-01T01:46:30.000,4845223.97321269,4881856.242902428,-1.0214797744427387E-4,-5403.16217404981,5362.617872177736,1.2927056728521734E-7 +2023-01-01T01:47:00.000,4680488.268179078,5040014.406086178,-9.819583006616697E-5,-5578.209160177314,5180.290959237172,1.3418844253189556E-7 +2023-01-01T01:47:30.000,4510592.918542672,5192616.592216085,-9.409775363019055E-5,-5747.106878232121,4992.253432108181,1.3899804651707713E-7 +2023-01-01T01:48:00.000,4335725.212377291,5339494.576722944,-8.985709709887533E-5,-5909.669139904731,4798.712578257271,1.436926709487234E-7 +2023-01-01T01:48:30.000,4156077.919149154,5480486.445242039,-8.547740943701491E-5,-6065.716740918515,4599.881751867642,1.4826569212201902E-7 +2023-01-01T01:49:00.000,3971849.077213109,5615436.772103112,-8.09624369404401E-5,-6215.07765857934,4395.980138643529,1.5271057981787077E-7 +2023-01-01T01:49:30.000,3783241.775500619,5744196.791667377,-7.631612029868461E-5,-6357.587241408439,4187.232514186035,1.5702090614306274E-7 +2023-01-01T01:50:00.000,3590463.929640127,5866624.562322686,-7.154259139346582E-5,-6493.0883906494655,3973.8689962068615,1.6119035430051375E-7 +2023-01-01T01:50:30.000,3393728.0527565996,5982585.122956111,-6.664616983525015E-5,-6621.431733449645,3756.124790853063,1.6521272727811318E-7 +2023-01-01T01:51:00.000,3193251.02120294,6091950.641731391,-6.163135924051848E-5,-6742.475787524117,3534.2399334224633,1.6908195644465373E-7 +2023-01-01T01:51:30.000,2989253.8354814933,6194600.557007276,-5.6502843252689764E-5,-6856.0871171219615,3308.459023755589,1.7279211004144117E-7 +2023-01-01T01:52:00.000,2781961.3766192026,6290421.710241441,-5.126548131000336E-5,-6962.140480121962,3079.030956595782,1.7633740155823484E-7 +2023-01-01T01:52:30.000,2571602.158265001,6379308.470733401,-4.592430416399886E-5,-7060.5189660959495,2846.2086472147607,1.7971219798225957E-7 +2023-01-01T01:53:00.000,2358408.074782692,6461162.852068965,-4.048450915256915E-5,-7151.114125187562,2610.2487526060713,1.8291102790913495E-7 +2023-01-01T01:53:30.000,2142614.1456170226,6535894.620137842,-3.495145523189489E-5,-7233.826087664309,2371.4113885537827,1.8592858950468596E-7 +2023-01-01T01:54:00.000,1924458.256214767,6603421.392605333,-2.9330657771898048E-5,-7308.563674011171,2129.959842888333,1.8875975830672937E-7 +2023-01-01T01:54:30.000,1704180.8957864014,6663668.729728457,-2.3627783120176666E-5,-7375.244495444397,1886.1602852455903,1.9139959485607935E-7 +2023-01-01T01:55:00.000,1482024.8921974595,6716570.216416389,-1.7848642939704124E-5,-7433.795044734628,1640.2814736491243,1.9384335214617444E-7 +2023-01-01T01:55:30.000,1258235.1442818255,6762067.535444742,-1.1999188325890466E-5,-7484.15077723931,1392.5944582391014,1.9608648288090627E-7 +2023-01-01T01:56:00.000,1033058.3518720386,6800110.531743007,-6.085503708914235E-6,-7526.256182055004,1143.3722824744236,1.981246465304159E-7 +2023-01-01T01:56:30.000,806742.7438442267,6830657.267684269,-1.1380054753641405E-7,-7560.064843211188,892.889682137492,1.999537161748289E-7 +2023-01-01T01:57:00.000,579537.8044774631,6853674.069316244,5.909589179093785E-6,-7585.539490838101,641.4227824734011,2.0156978512611522E-7 +2023-01-01T01:57:30.000,351693.9984291925,6869135.56348269,1.1978219674840709E-5,-7602.652042252186,389.2487937974245,2.0296917331849046E-7 +2023-01-01T01:58:00.000,123462.49462991222,6877024.705794241,1.8085538218107124E-5,-7611.383632913887,136.64570590634509,2.0414843345801707E-7 +2023-01-01T01:58:30.000,-104905.11059852708,6877332.799417863,2.422489223412121E-5,-7611.7246372236405,-116.10801836949979,2.0510435692232047E-7 +2023-01-01T01:59:00.000,-333157.0708957712,6870059.504664204,3.038953654035624E-5,-7603.6746791331425,-368.7337501356422,2.0583397940160116E-7 +2023-01-01T01:59:30.000,-561041.7673812199,6855212.839362263,3.6572640757192925E-5,-7587.242632560205,-620.9530015859831,2.063345862724071E-7 +2023-01-01T02:00:00.000,-788307.9860317634,6832809.1700209705,4.2767296875682877E-5,-7562.446611606743,-872.4877329997729,2.0660371769592033E-7 diff --git a/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Propagator.test.cpp b/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Propagator.test.cpp index 10c91b192..0fe7642fb 100644 --- a/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Propagator.test.cpp +++ b/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Propagator.test.cpp @@ -15,6 +15,10 @@ #include #include +#include +#include +#include +#include #include #include #include @@ -53,6 +57,10 @@ using ostk::math::obj::Matrix3d; using ostk::math::obj::Vector3d; using ostk::physics::Environment; +using ostk::physics::env::ephem::Analytical; +using EarthGravitationalModel = ostk::physics::environment::gravitational::Earth; +using EarthMagneticModel = ostk::physics::environment::magnetic::Earth; +using EarthAtmosphericModel = ostk::physics::environment::atmospheric::Earth; using ostk::physics::coord::Frame; using ostk::physics::coord::Position; using ostk::physics::coord::Velocity; @@ -270,7 +278,7 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagator, Calcul {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Test exception for unsorted instant array { @@ -451,7 +459,7 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagator, PropAc {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Create environment const Instant instantJ2000 = Instant::J2000(); @@ -640,7 +648,7 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagator, PropAc {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Create environment const Instant instantJ2000 = Instant::J2000(); @@ -855,7 +863,7 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagator, PropAc {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // EGM96 360x360 perturbation only vs GMAT { @@ -1150,7 +1158,7 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagator, PropAc {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // EGM84 70x70 perturbation only vs STK EGM84 { @@ -1343,7 +1351,7 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagator, PropAc {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Sun+Moon perturbation only vs GMAT { @@ -1434,7 +1442,7 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagator, PropAc {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Sun perturbation only vs GMAT { @@ -1523,7 +1531,7 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagator, PropAc {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Moon perturbation only vs GMAT { @@ -1606,6 +1614,218 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagator, PropAc } } +TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagator, PropAccuracy_Drag_Constant_Exponential_500km) +{ + const Composite satelliteGeometry(Cuboid( + {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} + )); + + // Constant Cd of 2.1 & constant surface area of 1m^2 + const SatelliteSystem satelliteSystem = { + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 1.0, 2.1}; + + // Earth with Exponential atmospheric drag compared against OREKit + { + // Current state and instant setup + const Instant startInstant = Instant::DateTime(DateTime::Parse("2023-01-01 00:00:00.000"), Scale::UTC); + + // Reference data setup + const Table referenceData = Table::Load( + File::Path(Path::Parse("/app/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit/Models/Propagated/" + "Orekit_Drag_Exponential_500km_2hr_run.csv")), + Table::Format::CSV, + true + ); + + Array instantArray = Array::Empty(); + Array referencePositionArray_GCRF = Array::Empty(); + Array referenceVelocityArray_GCRF = Array::Empty(); + + for (const auto& referenceRow : referenceData) + { + instantArray.add(Instant::DateTime( + DateTime::Parse(referenceRow[0].accessString(), DateTime::Format::ISO8601), Scale::UTC + )); + + referencePositionArray_GCRF.add( + Vector3d(referenceRow[1].accessReal(), referenceRow[2].accessReal(), referenceRow[3].accessReal()) + ); + referenceVelocityArray_GCRF.add( + Vector3d(referenceRow[4].accessReal(), referenceRow[5].accessReal(), referenceRow[6].accessReal()) + ); + } + + // Create environment + const Instant instantJ2000 = Instant::J2000(); + const Array> objects = {std::make_shared(Earth( + Earth::Models::Spherical::GravitationalParameter, + Earth::Models::Spherical::EquatorialRadius, + Earth::Models::Spherical::Flattening, + Earth::Models::Spherical::J2, + Earth::Models::Spherical::J4, + std::make_shared(Frame::ITRF()), + EarthGravitationalModel::Type::Spherical, + EarthMagneticModel::Type::Undefined, + EarthAtmosphericModel::Type::Exponential + ))}; + + const Environment customEnvironment = Environment(instantJ2000, objects); + + // Setup initial conditions + const State state = { + startInstant, + Position::Meters({referencePositionArray_GCRF[0]}, gcrfSPtr_), + Velocity::MetersPerSecond({referenceVelocityArray_GCRF[0]}, gcrfSPtr_)}; + + // Satellite dynamics setup + SatelliteDynamics satelliteDynamics = {customEnvironment, satelliteSystem}; + + // RK4 Numerical solver + NumericalSolver numericalSolver = { + NumericalSolver::LogType::NoLog, NumericalSolver::StepperType::RungeKutta4, 30.0, 1.0e-15, 1.0e-15}; + + // Setup Propagator model and orbit + const Propagator propagator = {satelliteDynamics, numericalSolver_}; + + // Propagate all states + const Array propagatedStateArray = propagator.calculateStatesAt(state, instantArray); + + // Validation loop + for (size_t i = 0; i < instantArray.getSize(); i++) + { + // GCRF Compare + const Position position_GCRF = propagatedStateArray[i].accessPosition(); + const Velocity velocity_GCRF = propagatedStateArray[i].accessVelocity(); + + const double positionError_GCRF = + (position_GCRF.accessCoordinates() - referencePositionArray_GCRF[i]).norm(); + const double velocityError_GCRF = + (velocity_GCRF.accessCoordinates() - referenceVelocityArray_GCRF[i]).norm(); + + ASSERT_EQ(*Frame::GCRF(), *position_GCRF.accessFrame()); + ASSERT_EQ(*Frame::GCRF(), *velocity_GCRF.accessFrame()); + + ASSERT_GT(2e-4, positionError_GCRF); + ASSERT_GT(2e-6, velocityError_GCRF); + + // Results console output + + // std::cout << "**************************************" << std::endl; + // std::cout.setf(std::ios::scientific,std::ios::floatfield); + // std::cout << "Position error is: " << positionError_GCRF << "m" << std::endl; + // std::cout << "Velocity error is: " << velocityError_GCRF << "m/s" << std::endl; + // std::cout.setf(std::ios::fixed,std::ios::floatfield); + // std::cout << "**************************************" << std::endl; + } + } +} + +TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagator, PropAccuracy_Drag_Constant_Exponential_320km) +{ + const Composite satelliteGeometry(Cuboid( + {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} + )); + + // Constant Cd of 2.1 & constant surface area of 1m^2 + const SatelliteSystem satelliteSystem = { + Mass(100.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 1.0, 2.1}; + + // Earth with Exponential atmospheric drag compared against OREKit + { + // Current state and instant setup + const Instant startInstant = Instant::DateTime(DateTime::Parse("2023-01-01 00:00:00.000"), Scale::UTC); + + // Reference data setup + const Table referenceData = Table::Load( + File::Path(Path::Parse("/app/test/OpenSpaceToolkit/Astrodynamics/Trajectory/Orbit/Models/Propagated/" + "Orekit_Drag_Exponential_320km_2hr_run.csv")), + Table::Format::CSV, + true + ); + + Array instantArray = Array::Empty(); + Array referencePositionArray_GCRF = Array::Empty(); + Array referenceVelocityArray_GCRF = Array::Empty(); + + for (const auto& referenceRow : referenceData) + { + instantArray.add(Instant::DateTime( + DateTime::Parse(referenceRow[0].accessString(), DateTime::Format::ISO8601), Scale::UTC + )); + + referencePositionArray_GCRF.add( + Vector3d(referenceRow[1].accessReal(), referenceRow[2].accessReal(), referenceRow[3].accessReal()) + ); + referenceVelocityArray_GCRF.add( + Vector3d(referenceRow[4].accessReal(), referenceRow[5].accessReal(), referenceRow[6].accessReal()) + ); + } + + // Create environment + const Instant instantJ2000 = Instant::J2000(); + const Array> objects = {std::make_shared(Earth( + Earth::Models::Spherical::GravitationalParameter, + Earth::Models::Spherical::EquatorialRadius, + Earth::Models::Spherical::Flattening, + Earth::Models::Spherical::J2, + Earth::Models::Spherical::J4, + std::make_shared(Frame::ITRF()), + EarthGravitationalModel::Type::Spherical, + EarthMagneticModel::Type::Undefined, + EarthAtmosphericModel::Type::Exponential + ))}; + + const Environment customEnvironment = Environment(instantJ2000, objects); + + // Setup initial conditions + const State state = { + startInstant, + Position::Meters({referencePositionArray_GCRF[0]}, gcrfSPtr_), + Velocity::MetersPerSecond({referenceVelocityArray_GCRF[0]}, gcrfSPtr_)}; + + // Satellite dynamics setup + SatelliteDynamics satelliteDynamics = {customEnvironment, satelliteSystem}; + + // RK4 Numerical solver + NumericalSolver numericalSolver = { + NumericalSolver::LogType::NoLog, NumericalSolver::StepperType::RungeKutta4, 30.0, 1.0e-15, 1.0e-15}; + + // Setup Propagator model and orbit + const Propagator propagator = {satelliteDynamics, numericalSolver_}; + + // Propagate all states + const Array propagatedStateArray = propagator.calculateStatesAt(state, instantArray); + + // Validation loop + for (size_t i = 0; i < instantArray.getSize(); i++) + { + // GCRF Compare + const Position position_GCRF = propagatedStateArray[i].accessPosition(); + const Velocity velocity_GCRF = propagatedStateArray[i].accessVelocity(); + + const double positionError_GCRF = + (position_GCRF.accessCoordinates() - referencePositionArray_GCRF[i]).norm(); + const double velocityError_GCRF = + (velocity_GCRF.accessCoordinates() - referenceVelocityArray_GCRF[i]).norm(); + + ASSERT_EQ(*Frame::GCRF(), *position_GCRF.accessFrame()); + ASSERT_EQ(*Frame::GCRF(), *velocity_GCRF.accessFrame()); + + ASSERT_GT(2e-4, positionError_GCRF); + ASSERT_GT(2e-6, velocityError_GCRF); + + // Results console output + + // std::cout << "**************************************" << std::endl; + // std::cout.setf(std::ios::scientific,std::ios::floatfield); + // std::cout << "Position error is: " << positionError_GCRF << "m" << std::endl; + // std::cout << "Velocity error is: " << velocityError_GCRF << "m/s" << std::endl; + // std::cout.setf(std::ios::fixed,std::ios::floatfield); + // std::cout << "**************************************" << std::endl; + } + } +} + /* Propagation Interval validation test */ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagator, PropAccuracy_TwoBody_IntervalSelfComparison) { @@ -1613,7 +1833,7 @@ TEST_F(OpenSpaceToolkit_Astrodynamics_Trajectory_Orbit_Models_Propagator, PropAc {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; // Test that calculateStatesAt returns the same answer if states are requested at short or long intervals { @@ -1784,7 +2004,7 @@ TEST_F( {0.0, 0.0, 0.0}, {Vector3d {1.0, 0.0, 0.0}, Vector3d {0.0, 1.0, 0.0}, Vector3d {0.0, 0.0, 1.0}}, {1.0, 2.0, 3.0} )); const SatelliteSystem satelliteSystem = { - Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 2.2}; + Mass(200.0, Mass::Unit::Kilogram), satelliteGeometry, Matrix3d::Identity(), 0.8, 0.0}; { // Current state and instant setup diff --git a/tools/development/start.sh b/tools/development/start.sh index 0f85a182c..58edc5e33 100755 --- a/tools/development/start.sh +++ b/tools/development/start.sh @@ -126,5 +126,5 @@ docker run \ --volume="${project_directory}:/app:delegated" \ --volume="${project_directory}/tools/development/helpers:/app/build/helpers:ro,delegated" \ --workdir="/app/build" \ - ${docker_development_image_repository}:${docker_image_version}-${target} \ + ${docker_development_image_repository}:${docker_image_version} \ /bin/bash -c "${command}"