from benchmarks.comparative.implementations.gmat.base import (
build_task_result,
time_iterations,
)
_MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
_A1MJD_TO_JD = 2430000.0
_GPS_TAI_OFFSET_DAYS = -19.0 / 86400.0
def _dt_to_gmat_greg(dt: dict) -> str:
total_sec = dt["second"] + dt["nanosecond"] * 1e-9
return (
f"{dt['day']:02d} {_MONTHS[dt['month'] - 1]} {dt['year']:04d} "
f"{dt['hour']:02d}:{dt['minute']:02d}:{total_sec:06.3f}"
)
def _tcv():
import gmatpy as gmat
return gmat.TimeSystemConverter.Instance()
def epoch_creation(params: dict, iterations: int):
import gmatpy as gmat
datetimes = params["datetimes"]
greg_strings = [_dt_to_gmat_greg(dt) for dt in datetimes]
tcv = gmat.TimeSystemConverter.Instance()
def run():
return [
tcv.ConvertGregorianToMjd(g) + _A1MJD_TO_JD
for g in greg_strings
]
times, results = time_iterations(run, iterations)
return build_task_result("time.epoch_creation", iterations, times, results)
def utc_to_tai(params: dict, iterations: int):
tcv = _tcv()
src = tcv.UTC
dst = tcv.TAI
datetimes = params["datetimes"]
utc_a1mjds = [
tcv.ConvertGregorianToMjd(_dt_to_gmat_greg(dt)) for dt in datetimes
]
def run():
return [
tcv.Convert(mjd, src, dst) + _A1MJD_TO_JD
for mjd in utc_a1mjds
]
times, results = time_iterations(run, iterations)
return build_task_result("time.utc_to_tai", iterations, times, results)
def utc_to_tt(params: dict, iterations: int):
tcv = _tcv()
src = tcv.UTC
dst = tcv.TT
datetimes = params["datetimes"]
utc_a1mjds = [
tcv.ConvertGregorianToMjd(_dt_to_gmat_greg(dt)) for dt in datetimes
]
def run():
return [
tcv.Convert(mjd, src, dst) + _A1MJD_TO_JD
for mjd in utc_a1mjds
]
times, results = time_iterations(run, iterations)
return build_task_result("time.utc_to_tt", iterations, times, results)
def utc_to_gps(params: dict, iterations: int):
tcv = _tcv()
src = tcv.UTC
dst = tcv.TAI
datetimes = params["datetimes"]
utc_a1mjds = [
tcv.ConvertGregorianToMjd(_dt_to_gmat_greg(dt)) for dt in datetimes
]
def run():
return [
tcv.Convert(mjd, src, dst) + _GPS_TAI_OFFSET_DAYS + _A1MJD_TO_JD
for mjd in utc_a1mjds
]
times, results = time_iterations(run, iterations)
return build_task_result("time.utc_to_gps", iterations, times, results)
def utc_to_ut1(params: dict, iterations: int):
tcv = _tcv()
src = tcv.UTC
dst = tcv.UT1
datetimes = params["datetimes"]
utc_a1mjds = [
tcv.ConvertGregorianToMjd(_dt_to_gmat_greg(dt)) for dt in datetimes
]
def run():
return [
tcv.Convert(mjd, src, dst) + _A1MJD_TO_JD
for mjd in utc_a1mjds
]
times, results = time_iterations(run, iterations)
return build_task_result("time.utc_to_ut1", iterations, times, results)