Unified engine for geomagnetically induced currents across grounded infrastructure
Project description
GeoPulse
Unified engine for geomagnetically induced currents across grounded infrastructure.
GeoPulse computes geomagnetically induced currents (GIC), induced voltages,
and total harmonic distortion (THD) across grounded infrastructure —
submarine cables, power grids, oil/gas pipelines, and electrified railways —
from a single, modular, extensible core. Every stage carries uncertainty via
the Uncertain[T] type, and the surface impedance Z is a single
polymorphic abstraction spanning 1-D scalar, 2-D tensor, and 3-D kernel
representations. The engine is intended to be an open, reproducible reference
implementation that ships alongside peer-reviewed papers.
Architecture
SOURCES EARTH E-FIELD NETWORK SOLVER DEVICES METRICS
┌────────┐ ┌────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│SuperMAG│ │ 1-D │ │Plane-wave│ │Cables │ │LPM │ │Transform.│ │GIC / THD │
│INTERMAG│──▶│ Layered│ ──▶ │Convolut. │──▶│Power grid│──▶ │MNA │──▶│CP units │──▶│Hotspot │
│SWMF MHD│ │ 2-D │ │Coastal │ │Pipelines │ │PySpice │ │Rectifier │ │Exceedance│
│Synth. │ │ 3-D │ │Non-unif. │ │Railways │ │ │ │ │ │ │
└────────┘ └────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘
B(t) → σ(r) → E(r,t) → V_th=∫E·dℓ → I=(1+Y·Z)⁻¹Jₑ → i_m(λ) → THD
Installation
Four supported install paths:
# 1. Core only — minimal, for reproduction (six deps: numpy, scipy,
# matplotlib, h5py, pyyaml, loguru)
pip install geopulse
# 2. With optional data tools (xarray, netCDF4, pandas)
pip install geopulse[data]
# 3. Full development environment (conda + editable + pre-commit)
git clone https://github.com/shibaji7/geopulse.git
cd geopulse
conda env create -f environment.yml
conda activate geopulse-dev
pip install -e ".[dev]"
pre-commit install
# 4. Paper-reproduction environment (pinned)
conda env create -f environment-minimal.yml
conda activate geopulse
python examples/reproduce_horton2012.py
Available optional extras: [data], [viz], [earth3d], [spice],
[service], [dev], [all].
Quick start (Phase 1+ — the smoke-test chain)
from geopulse.sources.synthetic import SyntheticSource
from geopulse.earth.library import get_model
from geopulse.efield.planewave import compute_efield_planewave
from scipy.fft import irfft
import matplotlib.pyplot as plt
# 1. Gaussian B-field pulse (500 nT peak, 1 h window, 1 Hz sampling)
source = SyntheticSource(waveform="gaussian_pulse", amplitude_nT=500.0)
b_data = source.load(start_s=0, end_s=3600, dt_s=1.0)
# 2. Load a 1-D Earth model and compute surface impedance
earth = get_model("quebec_7layer")
freqs, Bx_f, By_f = source.to_frequency_domain(b_data)
impedance = earth.compute_impedance(freqs)
# 3. Plane-wave E-field
Ex_f, Ey_f = compute_efield_planewave(freqs, Bx_f, By_f, impedance)
Ex_t = irfft(Ex_f, n=len(b_data.time_s))
# 4. Plot
fig, axes = plt.subplots(2, 1, sharex=True)
axes[0].plot(b_data.time_s / 60, b_data.bx_T * 1e9, label="Bx (nT)")
axes[1].plot(b_data.time_s / 60, Ex_t * 1e3, label="Ex (mV/m)")
plt.savefig("first_gic.png")
Note: this quick-start runs after Phase 1 lands. Phase 0 ships the scaffold,
constants, exceptions, ABCs, Impedance, Uncertain[T], HDF5 I/O, config,
and CLI.
Infrastructure targets
- Submarine cables (SCUBAS refactor →
geopulse.network.cable) - Bulk power grids (
geopulse.network.powergrid) - Oil & gas pipelines with DSTL (
geopulse.network.pipeline) - Electrified railways with track circuits (
geopulse.network.railway)
Contributing
See CONTRIBUTING.md for the branch model, commit conventions, PR checklist, and coding standards.
Citation
If you use GeoPulse in your research, please cite: Chakraborty, S. & Boteler, D. (in preparation). GeoPulse: A unified engine for geomagnetically induced currents across grounded infrastructure.
License
Apache-2.0. The explicit patent grant is deliberate — GeoPulse is intended for use by industry partners as well as academics.
Acknowledgments
Principal Investigator: Shibaji Chakraborty (ERAU / CSAR). Primary Collaborator: David Boteler (NRCan Geomagnetism).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file geopulse-0.1.0a1.tar.gz.
File metadata
- Download URL: geopulse-0.1.0a1.tar.gz
- Upload date:
- Size: 67.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5621b452282c685a3534efd59bb9a9e8555ac6d897a2c3b9c8a049148bfaab93
|
|
| MD5 |
e90b90831d5fc2c2329d2dfdb424b0f9
|
|
| BLAKE2b-256 |
65e8ce3ff9418c4c3ce943ecfe468f54fdc1a5c95ebd93fa4ad163263ab4e837
|
Provenance
The following attestation bundles were made for geopulse-0.1.0a1.tar.gz:
Publisher:
release.yml on shibaji7/geopulse
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
geopulse-0.1.0a1.tar.gz -
Subject digest:
5621b452282c685a3534efd59bb9a9e8555ac6d897a2c3b9c8a049148bfaab93 - Sigstore transparency entry: 2255242245
- Sigstore integration time:
-
Permalink:
shibaji7/geopulse@a78de59a2ff304ef354bdd792681c67688677662 -
Branch / Tag:
refs/tags/v0.1.0a1 - Owner: https://github.com/shibaji7
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a78de59a2ff304ef354bdd792681c67688677662 -
Trigger Event:
push
-
Statement type:
File details
Details for the file geopulse-0.1.0a1-py3-none-any.whl.
File metadata
- Download URL: geopulse-0.1.0a1-py3-none-any.whl
- Upload date:
- Size: 87.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
64931ca622c13b48f92fc8b85430e4853ad55d2ec9e776739b8ccc1d431d5364
|
|
| MD5 |
d173db15a0bb280c4e14cbebc8e59234
|
|
| BLAKE2b-256 |
2a17b1afa2cd26cb6f64f76a1ed0f413fc8322bd22e6c446a64cd666a78ec4cd
|
Provenance
The following attestation bundles were made for geopulse-0.1.0a1-py3-none-any.whl:
Publisher:
release.yml on shibaji7/geopulse
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
geopulse-0.1.0a1-py3-none-any.whl -
Subject digest:
64931ca622c13b48f92fc8b85430e4853ad55d2ec9e776739b8ccc1d431d5364 - Sigstore transparency entry: 2255242260
- Sigstore integration time:
-
Permalink:
shibaji7/geopulse@a78de59a2ff304ef354bdd792681c67688677662 -
Branch / Tag:
refs/tags/v0.1.0a1 - Owner: https://github.com/shibaji7
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a78de59a2ff304ef354bdd792681c67688677662 -
Trigger Event:
push
-
Statement type: