siderust-cpp 0.8.0
Header-only C++ wrapper for siderust
Loading...
Searching...
No Matches
lambert.hpp
Go to the documentation of this file.
1#pragma once
2
23#include "ffi_core.hpp"
24
25#include <array>
26#include <cstdint>
27#include <ostream>
28
29namespace siderust {
30
33namespace lambert {
34
36enum class Branch : int {
37 Prograde = 0,
38 Retrograde = 1,
39};
40
43 std::uint32_t iterations;
44 double residual;
45 std::uint32_t revolutions;
46};
47
49struct Solution {
50 std::array<double, 3> v1_kms;
51 std::array<double, 3> v2_kms;
53};
54
55namespace detail {
56
57inline Solution solve_impl(const double *r1_km, const double *r2_km, double tof_s, double mu_km3_s2,
58 Branch branch) {
59 Solution sol{};
60 SiderustLambertDiagnostics diag{};
61 const auto status =
62 siderust_lambert_solve(r1_km, r2_km, tof_s, mu_km3_s2, static_cast<int>(branch),
63 sol.v1_kms.data(), sol.v2_kms.data(), &diag);
64 check_status(status, "lambert::solve");
65 sol.diag = {diag.iterations, diag.residual, diag.revolutions};
66 return sol;
67}
68
69} // namespace detail
70
84inline Solution solve(const double (&r1_km)[3], const double (&r2_km)[3], double tof_s,
85 double mu_km3_s2, Branch branch = Branch::Prograde) {
86 return detail::solve_impl(r1_km, r2_km, tof_s, mu_km3_s2, branch);
87}
88
90inline Solution solve(const std::array<double, 3> &r1_km, const std::array<double, 3> &r2_km,
91 double tof_s, double mu_km3_s2, Branch branch = Branch::Prograde) {
92 return detail::solve_impl(r1_km.data(), r2_km.data(), tof_s, mu_km3_s2, branch);
93}
94
98inline std::ostream &operator<<(std::ostream &os, const Solution &sol) {
99 os << "Lambert (v1=(" << sol.v1_kms[0] << ", " << sol.v1_kms[1] << ", " << sol.v1_kms[2]
100 << ") km/s, v2=(" << sol.v2_kms[0] << ", " << sol.v2_kms[1] << ", " << sol.v2_kms[2]
101 << ") km/s, iters=" << sol.diag.iterations << ", residual=" << sol.diag.residual << ')';
102 return os;
103}
104
105} // namespace lambert
107
108} // namespace siderust
Error handling and utility base for the siderust C++ wrapper.
Solution solve_impl(const double *r1_km, const double *r2_km, double tof_s, double mu_km3_s2, Branch branch)
Definition lambert.hpp:57
std::ostream & operator<<(std::ostream &os, const Solution &sol)
Stream a Lambert solution (velocities in km/s).
Definition lambert.hpp:98
Branch
Branch selector for the Lambert solver.
Definition lambert.hpp:36
@ Retrograde
Retrograde single-revolution transfer.
@ Prograde
Direct (prograde) single-revolution transfer.
Solution solve(const double(&r1_km)[3], const double(&r2_km)[3], double tof_s, double mu_km3_s2, Branch branch=Branch::Prograde)
Solve Lambert's single-revolution two-point boundary-value problem.
Definition lambert.hpp:84
void check_status(siderust_status_t status, const char *operation)
Definition ffi_core.hpp:111
Householder-iteration diagnostics accompanying a Lambert solution.
Definition lambert.hpp:42
std::uint32_t iterations
Number of Householder iterations performed.
Definition lambert.hpp:43
double residual
Final residual (dimensionless).
Definition lambert.hpp:44
std::uint32_t revolutions
Number of complete revolutions (0 = single-rev).
Definition lambert.hpp:45
Complete solution to a Lambert boundary-value problem.
Definition lambert.hpp:49
std::array< double, 3 > v1_kms
Departure velocity [vx, vy, vz], km/s.
Definition lambert.hpp:50
std::array< double, 3 > v2_kms
Arrival velocity [vx, vy, vz], km/s.
Definition lambert.hpp:51
Diagnostics diag
Solver diagnostics.
Definition lambert.hpp:52