Skip to main content

Pure Python International Geomagnetic Reference Field

DOI

Pure Python code to calculate IGRF model predictions. The IGRF is a model of the Earth's main magnetic field that is updated every 5 years.

References:

Note that this code now defaults to use IGRF-14

Install

The only dependencies are Numpy and Pandas. Install by either

pip install ppigrf

or clone the repository and run

python setup.py install

Also, if you don't want to install a module but use the code in your project, just grap ppigrf.py and the .shc file (from src/ppigrf) and place it in your working directory. That's all.

Example

All the above choices should enable you to import like this:

import ppigrf

IGRF model values depend on time and position. Time can be given as one or more datetimes. The position can be specified in either geodetic or geocentric coordinates. Example with geodetic coordinates:

from datetime import datetime
lon = 5.32415  # degrees east
lat = 60.39299 # degrees north
h   = 0        # kilometers above sea level
date = datetime(2021, 3, 28)

Be, Bn, Bu = ppigrf.igrf(lon, lat, h, date) # returns east, north, up

Geodetic coordinates take the ellipsoidal shape of the Earth into account. The northward component returned by the igrf function is tangential to the ellipsoid, and in general not tangential to an Earth centered sphere. The upward component is perpendicular to the ellipsoid, and in general not perpendicular to the sphere.

In some cases it is more convenient to work in geocentric coordinates, which are purely spherical. To do that, use the igrf_gc function:

r     = 6500 # kilometers from center of Earht
theta = 30   # colatitude in degrees
phi   = 4    # degrees east (same as lon)

Br, Btheta, Bphi = ppigrf.igrf_gc(r, theta, phi, date) # returns radial, south, east

It is also possible to calculate magnetic field values on a grid. The code uses broadcasting rules for the coordinate inputs. You can also pass multiple dates. If you pass K time stamps, together with coordinates with a combined shape of e.g., (L, M, N), the output will have shape (K, L, M, N). Example:

lon = np.array([20, 120, 220])
lat = np.array([[60, 60, 60], [-60, -60, -60]])
h   = 0
dates = [datetime(y, 1, 1) for y in np.arange(1960, 2021, 20)]
Be, Bn, Bu = ppigrf.igrf(lon, lat, h, dates)

The output will have shape (4, 2, 3).

How to test?

It is possible to run some tests that corroborates that ppigrf works as expected. To do so you need to install pytest. You can do so through pip:

pip install pytest

Then you need to clone this repository and install ppigrf:

python setup.py install

Finally you can test the installed version of ppigrf with:

pytest -v

Why?

There are lots of Python modules that can calculate IGRF values. Most are wrappers of Fortran code, which can be tricky to compile. This version is pure Python. For most applications it is still quite fast. I also prefer the ppigrf interface over the alternatives.

The code is also super portable: Just copy ppigrf.py and the .shc file to your project and you're done.

Notes

The model coefficients are read from an .shc file. This is a file format that is used for certain spherical harmonic magnetic field models. See a selection of .shc model files here: https://github.com/ESA-VirES/MagneticModel/blob/staging/eoxmagmod/eoxmagmod/data/

It should be straightforward to swap the IGRF .shc file with another model, but keep in mind that the time dependence may be implemented differently in other models. IGRF, and this code, uses linear interpolation between model updates, and changing the model file will not change the ppigrf interpolation setup.

The code is vectorized, so it will be quite fast, but probably not as fast as compiled Fortran code. One application which may require more optimization is field line tracing: In the current implementation, the coefficients are loaded and interpolated in time for every function call, which gives a lot of unnecessary overhead.

Thanks to Juha Vierinen for the setup script, and for making ppigrf available via PyPI.

Contact

If you find errors, please let me know!

You don't need permission to copy or use this code, but I would be happy to know if it is useful for anyone else.

karl.laundal at uib.no

Metadata

Release files for ppigrf 2.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ppigrf 2.1.0
File Size Uploaded
ppigrf-2.1.0.tar.gz 32.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ppigrf 2.1.0
File Interpreter ABI Platform
ppigrf-2.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 60.7 kB

Release files / ppigrf-2.1.0.tar.gz

Download URL ppigrf-2.1.0.tar.gz
Size 32.3 kB
Tags Source
SHA-256 checksum
How to use checksums
4e0f7eccaae7c793fce92ab1f953fae15ec02e24fd0af6c2a3f77db08fc0fb3e
BLAKE2b-256 checksum
How to use checksums
6bb389c4f2434e93f60b2efad4d9849e6aae8d93ba0ddcadc7c22f36f8983fc3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.5

Release files / ppigrf-2.1.0-py3-none-any.whl

Download URL ppigrf-2.1.0-py3-none-any.whl
Size 28.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
50ff8968380a90c50cc6085122ac4673b0890939e37efa375f24d5bee7b1e1d6
BLAKE2b-256 checksum
How to use checksums
c5c87c561c46a39ac4a21c0cf2c104bf81f76ef2183fa69c0c2bb7c583d52f69
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.5

Release history Release notifications | RSS feed

This release

2.1.0 This release

2 release files

2.0.0

2 release files

1.1.0

1 release file

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page