1#ifndef ISCE_CORE_DETAIL_INTERPOLATEORBIT_ICC
2#error "InterpolateOrbit.icc is an implementation detail of InterpolateOrbit.h"
8namespace isce3 {
namespace core {
namespace detail {
10NVCC_HD_WARNING_DISABLE
14isce3::error::ErrorCode
15interpolateOrbitHermite(Vec3 * position, Vec3 * velocity,
const Orbit & orbit,
double t)
19 idx = std::min(std::max(idx, 0), orbit.
size() - 4);
23 for (
int i = 0; i < 4; ++i) {
24 f1[i] = t - orbit.
time(idx + i);
29 for (
int i = 0; i < 4; ++i) {
32 for (
int j = 0; j < 4; ++j) {
33 if (j == i) {
continue; }
34 sum += 1. / (orbit.
time(idx + i) - orbit.
time(idx + j));
36 f0[i] = 1. - 2. * sum * (t - orbit.
time(idx + i));
41 for (
int i = 0; i < 4; ++i) {
44 for (
int j = 0; j < 4; ++j) {
45 if (j == i) {
continue; }
46 h[i] *= (t - orbit.
time(idx + j)) / (orbit.
time(idx + i) - orbit.
time(idx + j));
54 for (
int i = 0; i < 4; ++i) {
55 pos += h[i] * h[i] * (orbit.
position(idx + i) * f0[i] + orbit.
velocity(idx + i) * f1[i]);
62 return isce3::error::ErrorCode::Success;
67 for (
int i = 0; i < 4; ++i) {
70 for (
int j = 0; j < 4; ++j) {
71 if (j == i) {
continue; }
72 double prod = 1. / (orbit.
time(idx + i) - orbit.
time(idx + j));
74 for (
int k = 0; k < 4; ++k) {
75 if (k == i || k == j) {
continue; }
76 prod *= (t - orbit.
time(idx + k)) / (orbit.
time(idx + i) - orbit.
time(idx + k));
84 for (
int i = 0; i < 4; ++i) {
85 g1[i] = h[i] + 2. * hdot[i] * (t - orbit.
time(idx + i));
90 for (
int i = 0; i < 4; ++i) {
93 for (
int j = 0; j < 4; ++j) {
94 if (j == i) {
continue; }
95 sum += 1. / (orbit.
time(idx + i) - orbit.
time(idx + j));
97 g0[i] = 2. * (f0[i] * hdot[i] - sum * h[i]);
101 Vec3 vel(0., 0., 0.);
103 for (
int i = 0; i < 4; ++i) {
104 vel += h[i] * (orbit.
position(idx + i) * g0[i] + orbit.
velocity(idx + i) * g1[i]);
108 return isce3::error::ErrorCode::Success;
111NVCC_HD_WARNING_DISABLE
115isce3::error::ErrorCode
116interpolateOrbitLegendre(Vec3 * position, Vec3 * velocity,
const Orbit & orbit,
double t)
120 idx = std::min(std::max(idx, 0), orbit.
size() - 9);
122 double trel = 8. * (t - orbit.
time(idx)) / (orbit.
time(idx + 8) - orbit.
time(idx));
126 for (
int i = 0; i < 9; ++i) {
132 if (position) { *position = orbit.
position(idx + i); }
133 if (velocity) { *velocity = orbit.
velocity(idx + i); }
134 return isce3::error::ErrorCode::Success;
137 constexpr static double noemer[9] =
138 { 40320.0, -5040.0, 1440.0,
139 -720.0, 576.0, -720.0,
140 1440.0, -5040.0, 40320.0 };
142 Vec3 pos(0., 0., 0.);
143 Vec3 vel(0., 0., 0.);
145 for (
int i = 0; i < 9; ++i) {
146 double coeff = (teller / noemer[i]) / (trel - i);
147 pos += coeff * orbit.
position(idx + i);
148 vel += coeff * orbit.
velocity(idx + i);
151 if (position) { *position = pos; }
152 if (velocity) { *velocity = vel; }
154 return isce3::error::ErrorCode::Success;
160isce3::error::ErrorCode
161interpolateOrbit(Vec3 * position,
165 OrbitInterpBorderMode border_mode)
169 return isce3::error::ErrorCode::OrbitInterpSizeError;
174 if (border_mode == OrbitInterpBorderMode::FillNaN) {
175 constexpr static double nan = std::numeric_limits<double>::quiet_NaN();
176 if (position) { *position = {nan, nan, nan}; }
177 if (velocity) { *velocity = {nan, nan, nan}; }
179 if (border_mode != OrbitInterpBorderMode::Extrapolate) {
180 return isce3::error::ErrorCode::OrbitInterpDomainError;
186 case OrbitInterpMethod::Hermite :
187 return interpolateOrbitHermite(position, velocity, orbit, t);
188 case OrbitInterpMethod::Legendre :
189 return interpolateOrbitLegendre(position, velocity, orbit, t);
191 return isce3::error::ErrorCode::OrbitInterpUnknownMethod;
const Linspace< double > & time() const
Get state vector times relative to reference epoch (s)
Definition Orbit.h:157
const std::vector< Vec3 > & velocity() const
Get state vector velocities in ECEF coordinates (m/s)
Definition Orbit.h:163
const std::vector< Vec3 > & position() const
Get state vector positions in ECEF coordinates (m)
Definition Orbit.h:160
double startTime() const
Time of first state vector relative to reference epoch (s)
Definition Orbit.h:128
double endTime() const
Time of last state vector relative to reference epoch (s)
Definition Orbit.h:134
OrbitInterpMethod interpMethod() const
Interpolation method.
Definition Orbit.h:116
int size() const
Number of state vectors in orbit.
Definition Orbit.h:154
CUDA_HOSTDEV constexpr int search(U) const
Return the position where the specified value would be inserted in the sequence in order to maintain ...
Definition Linspace.icc:77
base interpolator is an abstract base class
Definition BinarySearchFunc.cpp:5