Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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);
}