Computing tropospheric delay with Vienna model

I’m trying to use the ViennaThree (OREKIT 13.1.2 API) model to compute the tropospheric delay between a specific GPS satellite and a receiver at a specific time. I’m doing this because I want to compare the uncorrected measured pseudorange values to other measurements.

I’ve been able to do this successfully with the ITURP834PathDelay and CanonicalSaastamoinenModel models, which give very similar answers if I use the same PressureTemperatureHumidityProvider. For those who might find this post looking for how to use these models, here’s an exemplar code:

from org.orekit.models.earth.troposphere import CanonicalSaastamoinenModel, iturp834

weather_provider = iturp834.ITURP834WeatherParametersProvider(
    TimeScalesFactory.getUTC())

tropo_model_saast = CanonicalSaastamoinenModel(weather_provider)

This can then be used like this (skipping the SP3 reading for brevity):

# Find the GPS TX position relative to the receiver.
gps_tx_coords = receiver_topo_frame.getTrackingCoordinates(gps_tx_pv.getPosition(),
                                                           j2000, epoch)

# Compute tropospheric delay using different models.
params = []
delay_saast = tropo_model_saast.pathDelay(gps_tx_coords, receiver_geo_point,
                                          params, epoch)

All of this works fine. I’d like to use ViennaThree to see how much of a different result it gives because it uses different weather data. However, when I try to instantiate the ViennaThree model, I run into an issue. I think the ViennaAProvider aProvider and AzimuthalGradientProvider gProvider can both be instances of GlobalPressureTemperature3. I retrieved the gridded weather data from here: Index of /trop_products and was able to create instances of those:

VMF3_DATA_FNAME = 'gpt3_1.grd'
vmf3DataSource = DataSource(os.path.join(os.getcwd(), VMF3_DATA_FNAME))
vmf3 = GlobalPressureTemperature3(vmf3DataSource, TimeScalesFactory.getUTC())

These can then be used with the ViennaThree constructor. However, the zenithDelayProvider argument of the constructor is itself a TroposphericModel, just like ViennaThree. What argument should I provide to the constructor here to create a valid ViennaThree instance? Here’s the way I call I call the constructor:

zenithDelayProvider = None #TODO what is this meant to be?
tropo_model_vienna3 = ViennaThree(vmf3, vmf3, zenithDelayProvider,
                                  TimeScalesFactory.getUTC())

For anyone who might want to use this code for their own application: please be aware that the delay needs to be computed accounting for the lowest altitude the ray will traverse, as illustrated here: Computing ionospheric delay from a IONEX file - #5 by baubin