File Venus.cpp¶
File List > astrea > astro > astro > systems > planetary_bodies > Venus > Venus.cpp
Go to the documentation of this file
/*
* The GNU Lesser General Public License (LGPL)
*
* Copyright (c) 2025 Jay Iuliano
*
* This file is part of Astrea.
* Astrea is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
* Astrea is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should
* have received a copy of the GNU General Public License along with Astrea. If not, see <https://www.gnu.org/licenses/>.
*/
#include <astro/systems/planetary_bodies/Venus/Venus.hpp>
#include <map>
#ifdef ASTREA_BUILD_VENUS_EPHEMERIS
#include <astro/state/orbital_elements/OrbitalElements.hpp>
#include <ephemerides/Venus/VenusEphemerisTable.hpp>
#endif // ASTREA_BUILD_VENUS_EPHEMERIS
namespace astrea {
namespace astro {
namespace planetary_bodies {
using mp_units::non_si::day;
using mp_units::si::unit_symbols::kg;
using mp_units::si::unit_symbols::km;
using mp_units::si::unit_symbols::m;
// Altitude Conditions(TABLE 7-4, Vallado)
static const std::map<Altitude, Density> venutianAtmosphere = { // km, kg/m^3
{ 3.0 * km, 5.53e1 * kg / (pow<3>(m)) }, { 6.0 * km, 4.75e1 * kg / (pow<3>(m)) },
{ 9.0 * km, 4.02e1 * kg / (pow<3>(m)) }, { 12.0 * km, 3.44e1 * kg / (pow<3>(m)) },
{ 15.0 * km, 2.91e1 * kg / (pow<3>(m)) }, { 18.0 * km, 2.46e1 * kg / (pow<3>(m)) },
{ 21.0 * km, 2.06e1 * kg / (pow<3>(m)) }, { 24.0 * km, 1.70e1 * kg / (pow<3>(m)) },
{ 27.0 * km, 1.405e1 * kg / (pow<3>(m)) }, { 30.0 * km, 1.115e1 * kg / (pow<3>(m)) },
{ 33.0 * km, 9.0 * kg / (pow<3>(m)) }, { 36.0 * km, 7.15 * kg / (pow<3>(m)) },
{ 39.0 * km, 5.15 * kg / (pow<3>(m)) }, { 42.0 * km, 4.34 * kg / (pow<3>(m)) },
{ 45.0 * km, 3.30 * kg / (pow<3>(m)) }, { 48.0 * km, 2.39 * kg / (pow<3>(m)) },
{ 51.0 * km, 1.88 * kg / (pow<3>(m)) }, { 54.0 * km, 1.38 * kg / (pow<3>(m)) },
{ 57.0 * km, 9.6e-1 * kg / (pow<3>(m)) }, { 60.0 * km, 6.2e-1 * kg / (pow<3>(m)) },
{ 70.0 * km, 1.2e-1 * kg / (pow<3>(m)) }, { 80.0 * km, 1.8e-2 * kg / (pow<3>(m)) },
{ 90.0 * km, 2.3e-3 * kg / (pow<3>(m)) }, { 100.0 * km, 3.1e-4 * kg / (pow<3>(m)) },
{ 110.0 * km, 4.4e-5 * kg / (pow<3>(m)) }, { 120.0 * km, 7.2e-6 * kg / (pow<3>(m)) },
{ 130.0 * km, 1.4e-6 * kg / (pow<3>(m)) }, { 140.0 * km, 3.0e-7 * kg / (pow<3>(m)) },
{ 150.0 * km, 8.0e-8 * kg / (pow<3>(m)) }, { 160.0 * km, 2.6e-8 * kg / (pow<3>(m)) },
{ 170.0 * km, 9.5e-9 * kg / (pow<3>(m)) }, { 180.0 * km, 4.0e-9 * kg / (pow<3>(m)) },
{ 190.0 * km, 1.9e-9 * kg / (pow<3>(m)) }, { 200.0 * km, 9.4e-10 * kg / (pow<3>(m)) },
{ 210.0 * km, 4.9e-10 * kg / (pow<3>(m)) }, { 220.0 * km, 2.6e-10 * kg / (pow<3>(m)) },
{ 230.0 * km, 1.4e-10 * kg / (pow<3>(m)) }, { 240.0 * km, 7.5e-11 * kg / (pow<3>(m)) },
{ 250.0 * km, 5.5e-11 * kg / (pow<3>(m)) }, { 260.0 * km, 4.1e-11 * kg / (pow<3>(m)) },
{ 270.0 * km, 2.2e-11 * kg / (pow<3>(m)) }, { 280.0 * km, 1.2e-11 * kg / (pow<3>(m)) },
{ 290.0 * km, 6.5e-12 * kg / (pow<3>(m)) }, { 300.0 * km, 3.5e-12 * kg / (pow<3>(m)) }
};
Density Venus::find_atmospheric_density(const Date& date, const Distance& altitude) const
{
const auto iter = venutianAtmosphere.upper_bound(altitude);
return (iter != venutianAtmosphere.end()) ? iter->second : 0.0 * kg / (m * m * m);
}
#ifdef ASTREA_BUILD_VENUS_EPHEMERIS
RadiusVector<frames::solar_system_barycenter::icrf> get_position_at(const Date& date) const
{
const auto positionVbFromSsb = get_position_at_impl<VenusEphemerisTable, frames::solar_system_barycenter::icrf>(date);
return positionVbFromSsb; // TODO: Add correction for Venus' position from Venus barycenter
}
#endif // ASTREA_BUILD_VENUS_EPHEMERIS
} // namespace planetary_bodies
} // namespace astro
} // namespace astrea