void planet::get_eph(const epoch& when, array3D &r, array3D &v) const{ if(when.mjd2000() != cached_epoch.mjd2000() || cached_epoch.mjd2000() == 0) { double elements[6]; std::copy(keplerian_elements.begin(), keplerian_elements.end(), elements); double dt = (when.mjd2000() - ref_mjd2000) * ASTRO_DAY2SEC; elements[5] += mean_motion * dt; elements[5] = m2e(elements[5],elements[1]); par2ic(elements, mu_central_body, cached_r, cached_v); cached_epoch = when; } r = cached_r; v = cached_v; }
void keplerian::eph_impl(double mjd2000, array3D &r, array3D &v) const { double dt = (mjd2000 - m_ref_mjd2000) * ASTRO_DAY2SEC; if (m_keplerian_elements[1] > 1e-3 && m_keplerian_elements[2] > 1e-3) { double elements[6]; std::copy(m_keplerian_elements.begin(), m_keplerian_elements.end(), elements); elements[5] += m_mean_motion * dt; elements[5] = m2e(elements[5],elements[1]); par2ic(elements, get_mu_central_body(), r, v); } else { // Small inclinations and eccentricities (including nans), we use lagrangian propagation r = m_r; v = m_v; propagate_lagrangian(r, v, dt, get_mu_central_body()); } }
/// Computes the low-precision ephemerides void jpl_lp::eph_impl(double mjd2000, array3D &r, array3D &v) const { if (mjd2000 <=-73048.0 || mjd2000>=18263.0) { throw_value_error("Ephemeris are out of range [1800-2050]"); } // algorithm from http://ssd.jpl.nasa.gov/txt/p_elem_t1.txt downloded 2013 array6D elements, elements2; double dt = (mjd2000 - ref_mjd2000) / 36525.0; // Number of centuries passed since J2000.0 for(unsigned int i= 0;i<6;++i) { elements[i] = (jpl_elements[i] + jpl_elements_dot[i] * dt); } elements2[0] = elements[0] * ASTRO_AU; elements2[1] = elements[1]; elements2[2] = elements[2] * ASTRO_DEG2RAD; elements2[3] = elements[5] * ASTRO_DEG2RAD; elements2[4] = (elements[4] - elements[5]) * ASTRO_DEG2RAD; elements2[5] = (elements[3] - elements[4]) * ASTRO_DEG2RAD; elements2[5] = m2e(elements2[5],elements2[1]); par2ic(elements2, get_mu_central_body(), r, v); }