from benchmarks.comparative.implementations.gmat.base import (
build_task_result,
km_to_m_state,
m_to_km_state,
mu_si_to_gmat,
time_iterations,
)
MU_EARTH_SI = 3.986004418e14 MU_EARTH_GMAT = mu_si_to_gmat(MU_EARTH_SI)
_GMAT_FLAT = 0.0
_GMAT_REQ = 6378.1363
def _oe_si_to_gmat(oe_si):
a, e, i, raan, argp, M = oe_si
return [a / 1000.0, e, i, raan, argp, M]
def _oe_gmat_to_si(oe_gmat):
a, e, i, raan, argp, M = oe_gmat
return [a * 1000.0, e, i, raan, argp, M]
def _rvec6_to_list(rv6) -> list[float]:
n = rv6.GetSize()
return [rv6.GetElement(i) for i in range(n)]
def keplerian_to_cartesian(params: dict, iterations: int):
import gmatpy as gmat
elements_gmat = [_oe_si_to_gmat(oe) for oe in params["elements"]]
def run():
out = []
for oe in elements_gmat:
rv6 = gmat.StateConversionUtil.Convert(
oe, "Keplerian", "Cartesian",
MU_EARTH_GMAT, _GMAT_FLAT, _GMAT_REQ, "MA"
)
out.append(_rvec6_to_list(rv6))
return out
times, native_results = time_iterations(run, iterations)
results = [km_to_m_state(s) for s in native_results]
return build_task_result(
"orbits.keplerian_to_cartesian", iterations, times, results
)
def cartesian_to_keplerian(params: dict, iterations: int):
import gmatpy as gmat
states_gmat = [m_to_km_state(s) for s in params["states"]]
def run():
out = []
for s in states_gmat:
rv6 = gmat.StateConversionUtil.Convert(
s, "Cartesian", "Keplerian",
MU_EARTH_GMAT, _GMAT_FLAT, _GMAT_REQ, "MA"
)
out.append(_rvec6_to_list(rv6))
return out
times, native_results = time_iterations(run, iterations)
results = [_oe_gmat_to_si(oe) for oe in native_results]
return build_task_result(
"orbits.cartesian_to_keplerian", iterations, times, results
)