siderust-cpp 0.8.0
Header-only C++ wrapper for siderust
Loading...
Searching...
No Matches
runtime_ephemeris.hpp
Go to the documentation of this file.
1#pragma once
2
19#include "coordinates.hpp"
20#include "ffi_core.hpp"
21#include "time.hpp"
22
23#include <cstdint>
24#include <memory>
25#include <string>
26
27namespace siderust {
28
35 double vx;
36 double vy;
37 double vz;
38 siderust_frame_t frame;
39
41 static CartesianVelocity from_c(const siderust_cartesian_vel_t &v) {
42 return {v.vx, v.vy, v.vz, v.frame};
43 }
44};
45
57public:
58 // -- Constructors ----------------------------------------------------------
59
65 explicit RuntimeEphemeris(const std::string &path) : handle_(nullptr) {
66 siderust_runtime_ephemeris_t *h = nullptr;
67 check_status(siderust_runtime_ephemeris_load_bsp(path.c_str(), &h), "RuntimeEphemeris(path)");
68 handle_ = h;
69 }
70
77 RuntimeEphemeris(const uint8_t *data, size_t len) : handle_(nullptr) {
78 siderust_runtime_ephemeris_t *h = nullptr;
79 check_status(siderust_runtime_ephemeris_load_bytes(data, len, &h), "RuntimeEphemeris(bytes)");
80 handle_ = h;
81 }
82
83 // -- Move semantics --------------------------------------------------------
84
85 RuntimeEphemeris(RuntimeEphemeris &&other) noexcept : handle_(other.handle_) {
86 other.handle_ = nullptr;
87 }
88
90 if (this != &other) {
91 reset();
92 handle_ = other.handle_;
93 other.handle_ = nullptr;
94 }
95 return *this;
96 }
97
98 // Non-copyable
101
102 // -- Destructor ------------------------------------------------------------
103
104 ~RuntimeEphemeris() { reset(); }
105
106 // -- Queries ---------------------------------------------------------------
107
112 sun_barycentric(const Time<TT, JD> &jd) const {
113 siderust_cartesian_pos_t out;
114 check_status(siderust_runtime_ephemeris_sun_barycentric(handle_, jd.value(), &out),
115 "RuntimeEphemeris::sun_barycentric");
117 }
118
124 siderust_cartesian_pos_t out;
125 check_status(siderust_runtime_ephemeris_earth_barycentric(handle_, jd.value(), &out),
126 "RuntimeEphemeris::earth_barycentric");
128 }
129
135 siderust_cartesian_pos_t out;
136 check_status(siderust_runtime_ephemeris_earth_heliocentric(handle_, jd.value(), &out),
137 "RuntimeEphemeris::earth_heliocentric");
139 }
140
145 moon_geocentric(const Time<TT, JD> &jd) const {
146 siderust_cartesian_pos_t out;
147 check_status(siderust_runtime_ephemeris_moon_geocentric(handle_, jd.value(), &out),
148 "RuntimeEphemeris::moon_geocentric");
150 }
151
159 siderust_cartesian_vel_t out{};
160 check_status(siderust_runtime_ephemeris_earth_barycentric_velocity(handle_, jd.value(), &out),
161 "RuntimeEphemeris::earth_barycentric_velocity");
162 return CartesianVelocity::from_c(out);
163 }
164
165 // -- Validity --------------------------------------------------------------
166
170 explicit operator bool() const noexcept { return handle_ != nullptr; }
171
172private:
173 siderust_runtime_ephemeris_t *handle_;
174
175 void reset() noexcept {
176 if (handle_) {
177 siderust_runtime_ephemeris_free(handle_);
178 handle_ = nullptr;
179 }
180 }
181};
182
183} // namespace siderust
Runtime-loaded JPL DE4xx ephemeris.
RuntimeEphemeris(const std::string &path)
Load a runtime ephemeris from a BSP file on disk.
cartesian::position::HelioBarycentric< qtty::AstronomicalUnit > sun_barycentric(const Time< TT, JD > &jd) const
Sun's barycentric position (EclipticMeanJ2000, AU).
cartesian::position::GeoBarycentric< qtty::AstronomicalUnit > earth_barycentric(const Time< TT, JD > &jd) const
Earth's barycentric position (EclipticMeanJ2000, AU).
cartesian::position::EclipticMeanJ2000< qtty::AstronomicalUnit > earth_heliocentric(const Time< TT, JD > &jd) const
Earth's heliocentric position (EclipticMeanJ2000, AU).
cartesian::position::MoonGeocentric< qtty::Kilometer > moon_geocentric(const Time< TT, JD > &jd) const
Moon's geocentric position (EclipticMeanJ2000, km).
RuntimeEphemeris & operator=(RuntimeEphemeris &&other) noexcept
RuntimeEphemeris(RuntimeEphemeris &&other) noexcept
RuntimeEphemeris & operator=(const RuntimeEphemeris &)=delete
RuntimeEphemeris(const uint8_t *data, size_t len)
Load a runtime ephemeris from raw BSP bytes in memory.
CartesianVelocity earth_barycentric_velocity(const Time< TT, JD > &jd) const
Earth's barycentric velocity (EclipticMeanJ2000, AU/day).
RuntimeEphemeris(const RuntimeEphemeris &)=delete
Coordinate module umbrella.
Error handling and utility base for the siderust C++ wrapper.
tempoch::EncodedTime< Scale, Format > Time
Definition time.hpp:36
void check_status(siderust_status_t status, const char *operation)
Definition ffi_core.hpp:111
Cartesian velocity in AU/day, tagged by reference frame.
double vx
X component (AU/day).
double vy
Y component (AU/day).
static CartesianVelocity from_c(const siderust_cartesian_vel_t &v)
Construct from the raw C struct.
double vz
Z component (AU/day).
A 3D Cartesian position, compile-time tagged by center, frame, unit.
static Position from_c(const siderust_cartesian_pos_t &c)
Create from C FFI struct (ignoring runtime frame/center - trust the type).
Public siderust time tags and typed time/period aliases.