DTM2000 Implementation Validation

Hi all,

I’ve been working on validating my use of Orekit’s atmospheric density models, as I recently discovered that NRLMSISE-00 needs to be run in “storm mode” for the Ap index to switch from daily resolution to 3-hourly… (Would it be worth clarifying this in the documentation?)

Validating NRLMSISE-00 was straightforward using the pymsis package, but I’m struggling to validate my setup for DTM-2000.

I haven’t found any published results using DTM-2000 for relatively short arcs. The closest comparison I found is a DTM-2013 run from He et al. (2023; DOI: 10.1029/2023SW003521). My results are reasonably similar, but since they come from different models, I’m unsure whether my implementation is correct.

All I’m trying to do is query the density for a given ECI position and time while using the higher-resolution AGI space weather indices instead of the default msafe ones. Here’s my current implementation:

def query_dtm2000(position, datetime):
    frame = FramesFactory.getEME2000()
    wgs84Ellipsoid = ReferenceEllipsoid.getWgs84(FramesFactory.getITRF(IERSConventions.IERS_2010, True))
    cssi_sw_data = CssiSpaceWeatherData(CssiSpaceWeatherData.DEFAULT_SUPPORTED_NAMES)
    sun = CelestialBodyFactory.getSun()
    atmosphere = DTM2000(cssi_sw_data, sun, wgs84Ellipsoid)
    absolute_date = datetime_to_absolutedate(datetime)
    position_vector = Vector3D(float(position[0]), float(position[1]), float(position[2]))
    density = atmosphere.getDensity(absolute_date, position_vector, frame)
    return density

I realize this is a bit of an odd request, but if anyone has experience with this model, I’d love to see how you’ve implemented it. Any advice would be greatly appreciated! :smiley:

For context, here is the density profile from He et al. (2023):

And mine.