from benchmarks.comparative.implementations.gmat.base import (
build_task_result,
gmat_clear,
km_to_m_state,
m_to_km_state,
time_iterations,
)
_GMAT_JD_REF = 2430000.0
def _jd_to_a1mjd(jd: float) -> float:
import gmatpy as gmat
tcv = gmat.TimeSystemConverter.Instance()
gmat_utcmjd = jd - _GMAT_JD_REF
return float(tcv.Convert(gmat_utcmjd, tcv.UTCMJD, tcv.A1MJD))
def _build_systems():
import gmatpy as gmat
ss = gmat.GetSolarSystem()
cs_eci = gmat.Construct("CoordinateSystem", "EciCs", "Earth", "MJ2000Eq")
cs_eci.SetSolarSystem(ss)
cs_eci.Initialize()
cs_ecef = gmat.Construct("CoordinateSystem", "EcefCs", "Earth", "BodyFixed")
cs_ecef.SetSolarSystem(ss)
cs_ecef.Initialize()
return cs_eci, cs_ecef
def _rvec6_to_list(rv6) -> list[float]:
return [float(rv6.GetElement(i)) for i in range(6)]
def state_eci_to_ecef(params: dict, iterations: int):
import gmatpy as gmat
cases = params["cases"]
prepared = [
(_jd_to_a1mjd(c["jd"]), m_to_km_state(c["state"]))
for c in cases
]
def run():
out = []
for a1mjd, state_km in prepared:
gmat_clear()
cs_eci, cs_ecef = _build_systems()
rv_in = gmat.Rvector6(*state_km)
rv_out = gmat.Rvector6()
gmat.CoordinateConverter().Convert(a1mjd, rv_in, cs_eci, rv_out, cs_ecef)
out.append(km_to_m_state(_rvec6_to_list(rv_out)))
return out
times, results = time_iterations(run, iterations)
return build_task_result(
"frames.state_eci_to_ecef",
iterations,
times,
results,
extra_metadata={"earth_fixed_frame": "EarthFixed (FK5/IAU 1980)"},
)
def state_ecef_to_eci(params: dict, iterations: int):
import gmatpy as gmat
cases = params["cases"]
prepared = [
(_jd_to_a1mjd(c["jd"]), m_to_km_state(c["state"]))
for c in cases
]
def run():
out = []
for a1mjd, state_km in prepared:
gmat_clear()
cs_eci, cs_ecef = _build_systems()
rv_in = gmat.Rvector6(*state_km)
rv_out = gmat.Rvector6()
gmat.CoordinateConverter().Convert(a1mjd, rv_in, cs_ecef, rv_out, cs_eci)
out.append(km_to_m_state(_rvec6_to_list(rv_out)))
return out
times, results = time_iterations(run, iterations)
return build_task_result(
"frames.state_ecef_to_eci",
iterations,
times,
results,
extra_metadata={"earth_fixed_frame": "EarthFixed (FK5/IAU 1980)"},
)