The G-Nut project was initiated in 2011 at Geodetic Observatory Pecny, RIGTC for implementing core software library in order to support developments of various end-user applications. The motivations for the project could be summarized as follows:
- to stimulate exploitation of highly efficient and autonomous PPP technique in various domains,
- to stimulate up-to-date and deep expertise and development in GOP towards a multi-GNSS constellation and real-time analyzes,
- to update GOP analysis center products contributing to various service (EUREF, IGS, E-GVAP etc.) with new or advanced solutions,
- to support an easy development of end-user applications targeted for geodesy, seismology, meteorology, climatology and other scientific areas either for GNSS experts or for other GNSS users,
- to contribute to a robust production of precise products for supporting PPP (in near future).
The G-Nut library is written in C++ taking advantages of object-oriented design and multi-thread processing. It is designed primarily for Linux operating systems and providing command-line applications since it is usually well suitable for scientific purposes. Some other platforms including Windows will be supported in near future. The library implementation is independent of any large software framework needed for the developing Graphical User Interface (GUI). However, the G-Nut initially exploited the Boost library Boost for a platform independent multi-thread implementation, which dependence has been removed for specific applications. Matrix representation and factorization methods are handled using New-Mat 09 matrix library developed by Davis (2009) within the G-Nut library. The pugixml light-weight C++ XML processing library by Kapoulkine (2012) is used for parsing XML configurations. The XML mark-up language was selected for the library classes as well as for end-user application settings due to its high flexibility, ease extension and support by various other editing and viewing user-tools.
Main characteristics are summarized as follows:
- object-oriented C++ design,
- support for multi-thread applications,
- flexible design supporting various end-user applications,
- adaptable internal structures for easy extensions in future,
- flexible data and product containers of self-contained elements,
- multi-GNSS data and processing support,
- integrated IO for various protocols (files, streams),
- integrated IO for various data/product formats (decoders and encoders),
- different adjustment models (LSQ, Kalman, Kalman/srcf, back-smoothing),
- dual-layer (library/application) configuration in XML format,
- GUI to be developed independently for prominent applications only.
First applications derived from the G-Nut library are based on the Precise Point Positioning technique. The post-processing as well as real-time processing has been implemented supporting static or kinematic positioning solutions. A real-time example is shown in the figure. The BKG Ntrip Client (BNC) is currently used as feeding engine for the raw real-time GNSS data and corrections streams (to be revised in future). In the offline mode, the RINEX data are processed with support of precise orbits in SP3 format, satellite clocks in RINEXC format, PCO+PCV models in ATX format and ocean tide loading in BLQ format.
The following applications were finished for a beta (lite-version) releases:
- G-Nut/Anubis - quality monitoring tool for GNSS observation data and navigation messages
- G-Nut/Apep - time-series data analysis tool
- G-Nut/Geb - precise positioning in real-time/post-processing using kinematic or static solution
- G-Nut/Tefnut - troposphere monitoring in (near) real-time/post-processing
- G-Nut/Shu - numerical weather data processing for troposphere corrections for GNSS
- G-Nut/ntrip-client - collects stream from NTRIP caster to a file
- G-Nut/ntrip-server - rotates file content to NTRIP caster as a stream
- G-Nut/ntrip-pipe - NTRIP pipe including threads of client and server forwarding any stream from one NTRIP caster to the other
The development has been focused on a core library and the first PPP solution. In future, a network solution based on undifferenced observation processing for serving regional/global products are foreseen based on the G-Nut library as well as support of real-time/offline processing and supporting multi-GNSS constellations. The application currently available for download are available via left menu.
Input/output structure, decoders and encoders
File and stream IO operations are represented using a virtual gio class which can be replaced in run time by an appropriate inherited class. In real-time this is represented by gtcp (TCP) implementation and gntrip (NTRIP) implementation (which is derived from the gtcp by re-implementing the initialization procedure for an authentication. Such implementation supports both real-time and post-processing approaches in a unique way for all user applications. The internal buffer of gio class supports the handling ASCII as well as BINARY data.
Additional special file classes - giof, glog and gxtr were implemented for additional IO operations providing time-specific file-masks, generic logging, summary extractions etc. The giof is also used internally in gio class for store/provide data between data streams and raw file. These are applied e.g. for logging stream content in ntrip-client or feeding data input in ntrip-client. The basic scheme of all IO classes is plotted in the figure (grey backgrounds).
If input data decoding (or output data encoding) is required, the gio object (or correctly its inherited object) is linked with any object derived from the generic gcoder class in order to provide specific decoder or encoder. All gcoders supports both stream and file IO operations while the main difference typically consists in handling of header and data parts. This is done separately in each decoder/encoder classes. The header operations are usually active only in the gfile class.
All encoders/decoders are derived from a single virtual gcoder representing various data, models or products formats and are plot in figure with a blue background. When gio instance is called with the decoder (encoder) capability, it needs an access to the relevant data structure which are plotted with a green background the figure left (bottom) and on the next page (figure 'data structure').
Figure left (bottom) shows the strategy to implement access to input data and products as well as output results. While post-processing solutions are based on files, real-time processing requires continuous data/products streams. In the first approach files could be read at once before the processing start up, but the second approach requires buffered input/output operations maintained during the whole run of the processing without disruptions of streams. Any operation on continuous streams could be handled using either with blocking or non-blocking access. The former is easier to implement, but requires a multi-thread application where each continuous stream is handled by an individual thread. The latter can be used also in a single thread application. By designing relevant classes as thread-safe objects within the G-Nut, both approaches are generally supported.
Data, models, products self-contained classes and their containers
The main virtual base gdata class (dark grey background) represents any data, model or product classes either as self-contained data/product elements or their containers. This class provides a common mutex, glog pointer for common and multi-thread logging and data type or group identification, which is later defined in each derived class.
Self-contained data/products elements (pink backgrounds) provides independent data such as e.g. all observation for a single station, satellite navigation message, RTCM position corrections, polynomials of precise ephemeris valid over a specific time, etc.
The containers (green backgrounds) are usually apply maps defined in a way to easy find the relevant self-contained element (pink backgrounds). In some classes (e.g. gallnav, gallprec) the cache is implemented to speed up the searching procedure, which is always done through an internal (find) function returning a pointer to specific data/product element.
Dousa J, Vaclavovic P (2014) Real-time zenith tropospheric delays in support of numerical weather prediction applications. Advances in Space Research (2014), Vol 53, No 9, pp 1347-1358, doi:10.1016/j.asr.2014.02.021, PDF.
Vaclavovic P, Dousa J (2014), G-Nut/Anubis - open-source tool for multi-GNSS data monitoring, In: IAG Symposia Series, Springer, Vol. 143, (accepted), PDF.
Vaclavovic P, Dousa J, Gyori G (2013), G-Nut software library - state of development and first results, Acta Geodynamica at Geomaterialia, pp 431-436, Vol. 10, No. 4 (172), doi:10.13168/AGG.2013.0042. PDF (or, alternatively, here).
Dousa J and Vaclavovic P (2013), Real-time ZTD estimates base on Precise Point Positioning and IGS real-time orbit and clock products, In: 4th International Colloquium Scientific and Fundamental Aspects of the Galileo Programme, 4-6 December 2013, Prague, Czech Republic. PDF.
Vaclavovic P and Dousa J (2013), Anubis – a tool for quality check of multi-GNSS observation and navigation data In: 4th International Colloquium Scientific and Fundamental Aspects of the Galileo Programme, 4-6 December 2013, Prague, Czech Republic. PDF.
Dousa J, Vaclavovic P and Gyori G (2013), G-Nut software library and its applications within context of EPOS (European Plate Observing System), EGU 2013 General Assembly, 7-12 April 2013, Vienna, Austira. PDF.