[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Orekit Developers] progress report on thread safety



Hi all,

Here is another progress report concerning one of the major Orekit issues now: thread safety.

Yesterday, a big step forward has been done with commit b27c9ead (see <https://www.orekit.org/forge/projects/orekit/repository/revisions/b27c9ead555f327e14a7f01e2a1d4fdc8ea22637>).

The core of this change was to remove the various caches spread amongst the frames classes and to use the new InterpolatingTransformProvider instead.

The responsibilities of the new classes are the following one:

 - CIRFProvider, ITRFProvider, MODProvider, TODProvider and all similar
   classes are the core computation engines for reference transforms
   (precession, nutation, sidereal time, pole motion ...), they only
   compute one transform at a time and don't care about cache or thread
   safety

 - TimeStampedCache is a general purpose cache for things that are time
   related, its main purpose is to provide in a thread safe manner a
   small local array of entries which surround a given date

 - InterpolatedTransformProvider combine one core transform computation
   engine and one time stamped cache to add several features to the
   core engine:
       * reduce computing cost by using interpolation instead of
         always doing the full computation
       * reduce computing cost by caching already done core computation
       * add thread safety

 - FactoryManagedFrame is a general frame implementation for predefined
   frames that uses a transform provider (either a core one or an
   interpolated one)

 - FramesFactory is the user level interface for creating predefined
   frames

The various providers and the TimeStampedCache are mainly internal classes (but users can of course use them to create their own frames using a similar architecture). They are new classes, but most users can simply ignore them. FactoryManagedFrame was slightly changed (to use a TransformProvider), but its purpose with the new thread-safe architecture is similar to what it was before the change. FramesFactory has been adapted to use the new architecture but its public API ant its behaviour have been preserved so users do not need to do any change in their code. Thread safety is almost transparent for them!

All the thread-safe caches are configured using the OrekitConfiguration.getCacheSlotsNumber() method to set up the number of independent slots used in the cache. This number is related to the number of concurrent threads that are expected to be used. If users did not do any custom configuration, this number is set to 100 which should be sufficient for most uses. If very few threads are really used and if simulation time evolves continuously, the extra slots will simply hold null pointers, so no memory is really wasted with this large number. If several threads are used or if simulation time jumps randomly to dates which are far away from each other, then new slots will be created as needed and more memory will be used. So in such cases, users should configure the numbers of slots in cache according to their needs.

Note that the interpolation feature does compute angular velocity even if the underlying core transform provider does not compute it (it is a by-product of the polynomial model). This implies that now frames like TOD or CIRF *do* include the very small precession/nutation velocity composition effects. This is an improvement for the library but it does change some numerical results (it is of the order of magnitude of 1.0e-5 to 1.0e-4 m/s in LEO, higher in GEO). We had to adjust some frames unit test thresholds as the reference results did not take this effect into account. So users may expect some tiny velocity changes in their own test cases. Please report if you think there is an error there.


The only caches that seem to remain now (unless I forgot some) are in the DTM2000 and Ephemeris classes.

The first one correspond to various intermediate data that are computed when getDensity is called, and reused when getTinf, getT, getMam and getPartialDensities methods are called. As there is specific scheduling of these methods to be fulfilled, it is not possible to use a class level synchronization. Of course, we may gather all these fields in one specific TimeStamped container and use a TimeStampedCache to hold them, but I am not sure this is worth the work. This class is intended to be used in force models for numerical propagation and propagators are not thread safe. Having complete thread-safe propagators seems unrealistic. What are the other developers opinions about this ?

The other cache is in the Ephemeris class. It is very similar to already modified classes and a perfect fit for TimeStampedCache (it is simply a collection of Spacecraft and an interpolation). I am working on it. The change will indeed improve the class as it will rely on the new interpolation capabilities of SpacecraftState which can use more than two points and preserve the type of the orbit (the current ephemeris creates only equinoctial orbits). Once this class is changed, I think I will finally set the status of issue #3 to resolved!

best regards,
Luc


----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.