コード例 #1
0
ファイル: tle.cpp プロジェクト: dhennes/pykep
/**
 * Construct a planet_tle from two strings containing the two line elements
 * \param[in] line1 first line
 * \param[in] line2 second line
 */
tle::tle(const std::string& line1, const std::string& line2)
try : base(), m_line1(line1), m_line2(line2), m_tle(Tle("TLE satellite", line1, line2)), m_sgp4_propagator(SGP4(m_tle))
{
	// We read the osculating elements of the satellite
	array6D keplerian_elements;
	double mu_central_body = kMU*1E09; // (m^3/s^2)
	double mean_motion = m_tle.MeanMotion() * 2 * kPI / kSECONDS_PER_DAY; // [rad/s]
	keplerian_elements[0] = std::pow(mu_central_body / (mean_motion*mean_motion),1./3); // a [m]
	keplerian_elements[1] = m_tle.Eccentricity(); // e
	keplerian_elements[2] = m_tle.Inclination(false); // i [rad]
	keplerian_elements[3] = m_tle.RightAscendingNode(false); // Om [rad]
	keplerian_elements[4] = m_tle.ArgumentPerigee(false); // om [rad]
	keplerian_elements[5] = m_tle.MeanAnomaly(false); // M [rad]

    std::string year_str = m_tle.IntDesignator().substr(0,2);
    int year_int = std::stoi(year_str);
    std::string rest = m_tle.IntDesignator().substr(2);
    int prefix = (year_int > 50)?(19):(20); 

    std::string object_name(std::to_string(prefix)+year_str+std::string("-")+rest);
	set_mu_central_body(mu_central_body);
	set_name(object_name);
	m_ref_mjd2000 = epoch(m_tle.Epoch().ToJulian(),epoch::JD).mjd2000();

}
catch (TleException& e)
{
		std::cout << "TleException cought in planet_tle constructor" << std::endl;
		throw_value_error(e.what());
}	
catch (SatelliteException& e)
{
		std::cout << "SatelliteException cought in planet_tle constructor" << std::endl;
		throw_value_error(e.what());
}
コード例 #2
0
/**
 * Construct a planet from its common name (e.g. VENUS)
 *
 * \param[in] name a string describing a planet
 */
jpl_lp::jpl_lp(const std::string& name) : ref_mjd2000(epoch(2451545.0,epoch::JD).mjd2000())
{
	std::map<std::string, int> mapped_planets;
	mapped_planets["mercury"] = 1; mapped_planets["venus"] = 2; mapped_planets["earth"] = 3;
	mapped_planets["mars"] = 4; mapped_planets["jupiter"] = 5; mapped_planets["saturn"] = 6;
	mapped_planets["uranus"] = 7; mapped_planets["neptune"] = 8; mapped_planets["pluto"] = 9;

	double mu_central_body;
	double mu_self;
	double radius;
	double safe_radius;
	std::string lower_case_name = name;
	boost::algorithm::to_lower(lower_case_name);
	switch ( mapped_planets[lower_case_name] ) {
	case (1): {
			std::copy(mercury_el,mercury_el+6,&jpl_elements[0]);
			std::copy(mercury_el_dot,mercury_el_dot+6,&jpl_elements_dot[0]);
			radius = 2440000.;
			safe_radius = 1.1;
			mu_self = 22032e9;
			mu_central_body = ASTRO_MU_SUN;
		}
		break;
	case (2): {
			std::copy(venus_el,venus_el+6,&jpl_elements[0]);
			std::copy(venus_el_dot,venus_el_dot+6,&jpl_elements_dot[0]);
			radius = 6052000.;
			safe_radius = 1.1;
			mu_self = 324859e9;
			mu_central_body = ASTRO_MU_SUN;
		}
		break;
	case (3): {
			std::copy(earth_moon_el,earth_moon_el+6,&jpl_elements[0]);
			std::copy(earth_moon_el_dot,earth_moon_el_dot+6,&jpl_elements_dot[0]);
			radius = 6378000.;
			safe_radius = 1.1;
			mu_self = 398600.4418e9;
			mu_central_body = ASTRO_MU_SUN;
		}
		break;
	case (4): {
			std::copy(mars_el,mars_el+6,&jpl_elements[0]);
			std::copy(mars_el_dot,mars_el_dot+6,&jpl_elements_dot[0]);
			radius = 3397000.;
			safe_radius = 1.1;
			mu_self = 42828e9;
			mu_central_body = ASTRO_MU_SUN;
		}
		break;
	case (5): {
			std::copy(jupiter_el,jupiter_el+6,&jpl_elements[0]);
			std::copy(jupiter_el_dot,jupiter_el_dot+6,&jpl_elements_dot[0]);
			radius = 71492000.;
			safe_radius = 9.;
			mu_self = 126686534e9;
			mu_central_body = ASTRO_MU_SUN;
		}
		break;
	case (6): {
			std::copy(saturn_el,saturn_el+6,&jpl_elements[0]);
			std::copy(saturn_el_dot,saturn_el_dot+6,&jpl_elements_dot[0]);
			radius = 60330000.;
			safe_radius = 1.1;
			mu_self = 37931187e9;
			mu_central_body = ASTRO_MU_SUN;
		}
		break;
	case (7): {
			std::copy(uranus_el,uranus_el+6,&jpl_elements[0]);
			std::copy(uranus_el_dot,uranus_el_dot+6,&jpl_elements_dot[0]);
			radius = 25362000.;
			safe_radius = 1.1;
			mu_self = 5793939e9;
			mu_central_body = ASTRO_MU_SUN;
		}
		break;
	case (8): {
			std::copy(neptune_el,neptune_el+6,&jpl_elements[0]);
			std::copy(neptune_el_dot,neptune_el_dot+6,&jpl_elements_dot[0]);
			radius = 24622000.;
			safe_radius = 1.1;
			mu_self = 6836529e9;
			mu_central_body = ASTRO_MU_SUN;
		}
		break;
	case (9): {
			std::copy(pluto_el,pluto_el+6,&jpl_elements[0]);
			std::copy(pluto_el_dot,pluto_el_dot+6,&jpl_elements_dot[0]);
			radius = 1153000.;
			safe_radius = 1.1;
			mu_self = 871e9;
			mu_central_body = ASTRO_MU_SUN;
		}
		break;
	default : {
		throw_value_error(std::string("unknown planet name: ") + name);
		}
	}
	set_mu_central_body(mu_central_body);
	set_mu_self(mu_self);
	set_radius(radius);
	set_safe_radius(safe_radius);
	set_name(lower_case_name);
}