/mosgim2

Global Ionospheric Mapping with GNSS

Primary LanguagePythonMIT LicenseMIT

MosGIM2

Global Ionopsheric Mapping with GNSS.

MosGIM sample output

About

This code implements an original method for constructing Global Ionospheric Maps (GIM) of Total Electron Content (TEC) based on the analysis of solely phase measurements of GNSS signals at a pair of coherent frequencies, which does not require satellite/receiver DCBs estimations and thus makes it easier to combine different GNSS systems within single reconstruction algorithm. This method uses the representation of the ionosphere as one or two thin layers with the electron content in each of them given by a truncated expansion into a series of spherical harmonics in Sun-fixed coordinate system. The expansion coefficients are determined by least squares with inequality constrains representing the positivity of TEC, implemented by solving the corresponding linear complementarity problem (LCP). Algorithm description for single thin layer model is given in (cite if using code for your research):

Padokhin, A. M., E. S. Andreeva, M. O. Nazarenko, and S. A. Kalashnikova. "Phase-Difference Approach for GNSS Global Ionospheric Total Electron Content Mapping." Radiophysics and Quantum Electronics, 65(7): 481-495, 2023

Find full text paper here

Prerequirements

Code and launch were tested for Linux (Mint) and python3.6.9 Code uses numpy, scipy, matplotlib, cartopy, h5py, lemkelcp and pyIGRF packages. If you get TypeError: 'range' object does not support item assignment when calling process.py, adjust lines 8&9 lemkelcp.py in python dist-packages accordingly:

self.wPos = list(range(n))
self.zPos = list(range(n,2*n)) 

Use test data

Test data is the output data (in TXT format) from the tec-suite package developed by SIMuRG team. To use with MosGIM2 you need to change default output of tec-suite in its configuration file tecs.cfg as following:

recFields = 'datetime, sat.x, sat.y, sat.z, tec.l1l2'

You can download test dataset obtained with tec-suite for approximately 300 IGS stations and suitable to use with MosGIM2 via this link Note that you can alter list of stations to work with in /mosgim2/data/tec_prepare.py. Observations (rinex files) from the very same set of stations should be downloaded from one of the IGS datacenters and processed with tec-suite, please refer to tec-suite manual for more information.

Run processing

Set necessary parameters in config.py. Unzip test dataset to data_path directory, and adjust res_path to the directory where you wish to store results in HDF5 format. All other parameters are explained in comments and could be left as provided for running test example.

If you want to work in modip coordinates, you need to generate file modip.npz with the grid of modip latitudes. Use modip.py script for it, arguments are year and altitude in kilometeres. Such file for year=2017 and alt=300km is provided within repo.

python modip.py --year 2017 --alt  300.

Use process.py to solve for coefficients of spherical harmonics expansion of GIM in MLT coordinate system, which will be stored in res_file

python process.py

Script plot.py is provided for your convinience to give an example of converting SH coefficients from res_file, obtained at the previous step, to plot GIMs in spherical coordinate system.

python plot.py --in_file res_file --out_file somefile.gif