Program Listing for File mean_osc_conversions.cc¶
↰ Return to documentation for file (conversions/mean_osc_conversions.cc)
#include "lupnt/conversions/mean_osc_conversions.h"
#include "lupnt/conversions/state_conversions.h"
namespace lupnt {
// Mean and Osculating
Vec6 MeanToOsculating(const Vec6 &coe_m, Real GM, Real J2) {
Vec6 coe_o;
if (J2 > 0) {
// TODO: Implement the transformation from mean to osculating
// Vec6 meanEquioe = ClassicalToEquinoctial(coe_m, GM);
Vec6 oscEquioe; // = MeanOscClosedEqui(meanEquioe, J2);
coe_o = EquinoctialToClassical(oscEquioe, GM);
} else {
coe_o = coe_m;
}
return coe_o;
}
ClassicalOE MeanToOsculating(const ClassicalOE &coe_m, Real GM, Real J2) {
return ClassicalOE(MeanToOsculating(Vec6(coe_m), GM, J2), coe_m.GetFrame());
}
Vec6 osc2mean_NRiterator(const Vec6 &osc_equi_elem, double tol) {
Vec6 mean_equi_elem = osc_equi_elem;
double R = 1.0;
int niter = 0;
while (std::abs(R) > tol) {
niter++;
Vec6 osc_loop;
// std::tie(std::ignore, osc_loop, std::ignore) =
// transformationmatrix_osc2mean_equinoctial(mean_equi_elem);
Vec6 delta = osc_equi_elem - osc_loop;
// R = delta.norm_inf(); // Assuming the library provides an infinity
// norm function
mean_equi_elem = mean_equi_elem + delta;
if (niter > 100) {
std::cout << "OscTMean iterations > 100" << std::endl;
break;
}
}
return mean_equi_elem;
}
Vec6 OsculatingToMean(const Vec6 &coe_o, Real GM, Real J2) {
Vec6 coe_m;
double tol = 1e-8;
if (J2 > 0) {
Vec6 eqoe_o = ClassicalToEquinoctial(coe_o, GM);
Vec6 eqoe_m = osc2mean_NRiterator(eqoe_o, tol);
coe_m = EquinoctialToClassical(eqoe_m, GM);
} else {
coe_m = coe_o;
}
return coe_m;
}
ClassicalOE OsculatingToMean(const ClassicalOE &coe_o, Real GM, Real J2) {
return ClassicalOE(OsculatingToMean(Vec6(coe_o), GM, J2), coe_o.GetFrame());
}
} // namespace lupnt