Changelog
All notable changes to GeoPulse will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.1.0a2] - 2026-07-26
Metadata-only release. Publishes updated package authorship to PyPI.
Changed
pyproject.tomlauthorslist now includes Xueling Shi and Michael Hartinger alongside Shibaji Chakraborty and David Boteler. The prose citation string in README.md and the docs landing page had already been updated to the same list in7c84841; this bump is what lands the change on PyPI package metadata (which is per-version immutable).
[0.1.0a1] - 2026-07-26
Infrastructure release — no user-facing API changes. First release published to real PyPI via OIDC Trusted Publishing.
Added
Docs site at https://geopulse.readthedocs.io/ — 107-page Sphinx build (landing + getting-started walkthrough + 54 auto-generated API pages).
.readthedocs.yaml+ fulldocs/conf.pywith autosummary, myst-parser, intersphinx to numpy/scipy/h5py/matplotlib.OIDC Trusted Publishing workflow:
.github/workflows/release.ymlbuilds sdist+wheel on everyv*tag push and publishes to PyPI without long-lived API tokens. Manualworkflow_dispatchpublishes to TestPyPI for rehearsal.Pre-commit gate: 8-hook pipeline (ruff lint + format, whitespace, EOF, YAML/TOML, large-file guard, mypy) + a
pre-commitstage cleanup hook and twopre-pushsmoke checks (wheel build, Sphinx docs build).[docs]optional dependency group so RTD installs only what the build needs;buildandtwineadded to[dev].
Changed
CONTRIBUTING.md now documents GitHub flow (
main+feature/*) as the current branch strategy, with gitflow described as the planned model once contributor count justifies it. PR checklist points topre-commit run --all-filesinstead of enumerating ruff commands.WGS84 curvature-radius helpers now
float(...)-cast their returns to satisfy strict mypy.Layered1D.compute_impedancereturn type narrowed fromImpedancetoScalarImpedance(covariant return; unblocks.Z_valuesaccess inCoastalCorrection2D).
Fixed
9 mypy errors flagged by CI (and newer numpy type stubs): missing
float()casts ingeo.py, wide return type inlayered_1d.py, unbounded-TypeVar# type: ignoreannotations inuq/uncertain.py,np.ndarraycast inpipeline.py,import-untypedon yaml.12 empty
__init__.py/.gitkeepfiles were missing terminal newlines (fixed by the newend-of-file-fixerpre-commit hook).ruff-pre-commitpin bumped fromv0.4.0tov0.16.0to match the local dev env; the old pin didn’t recogniseUP045inruff.toml.
[0.1.0a0] - 2026-07-25
First alpha release. Base engine is pip-installable, imports cleanly in a fresh virtualenv, ships with 100 passing tests, and reproduces two published benchmarks (Horton 2012 Table VII and Boteler 1997 DSTL) at sub-1 % relative error.
Added
Sources:
SyntheticSource(Gaussian, step, sinusoid), plusINTERMAGNETSource(IAGA-2002) andSuperMAGSource(CSV) with XYZF/HDZF frame conversion and sentinel handling.Earth:
Layered1D(Wait 1954 recursion, matches uniform half-space analytic atrtol=1e-12), model registry (get_model("quebec_7layer")etc.),CoastalCorrection2D(Boteler-Pirjola-style TE/TM interpolation →TensorImpedance).Impedance: full
ImpedanceABC +ScalarImpedance(with HDF5 roundtrip) +TensorImpedance(2×2 tensor per frequency, HDF5, apply, reduces to ScalarImpedance in the anti-diagonal limit).Network:
PowerGridNetworkwith MATPOWER-GMD (epri21.m) loader handling the “row-position vs AC-bus” quirk;PipelineNetworkwith DSTL equivalent-π discretisation.Solver:
LPMSolverwith delta-winding-safe active-subspace solve;Solver.solve()ABC signature accepts theConductorNetwork.Devices:
TransformerModelport of Mate 2021 top-oil + hot-spot (bilinear/Tustin discretisation,ThermalParams).DeviceResponseextended withtop_oil_C/hotspot_Cfields.Geo: WGS84 projection helpers (
meridian_radius_m,prime_vertical_radius_m,latlon_to_local_xy_wgs84_m) — networks now use per-segment WGS84 line integrals matching Horton (2012) Appendix.UQ:
Uncertain[T]generic +propagate_uncertaintyMC.I/O: schema-versioned HDF5 reader/writer, MATPOWER-GMD parser, IAGA-2002 parser.
CLI:
geopulse run|validate|info|earth list.Benchmarks: Horton 2012 EPRI21 test case +
expected_gic.csvfrom paper Table VII; passing test atrtol=1e-2.Examples:
01_first_gic.py(Gaussian pulse smoke test),04_pipeline_dstl.py(DSTL vs analytic profile),05_transformer_hotspot.py(Mate 2021 hot-spot reproduction).Packaging:
py.typedmarker; wheel + sdist build clean viapython -m build; installs in a fresh venv.Docs: Sphinx scaffold with logo + favicon.
Deferred (stubs raise NotImplementedYetError with WP reference)
CableNetwork(WP2),RailwayNetwork(WP4).MNASolver(WP3),PySpiceSolver(WP3).RectifierModel,CathodicProtectionModel, harmonics (WP3).KernelImpedance+Unstructured3D(WP3).Structured2Dfull FD MT solver (WP-future —CoastalCorrection2Dis the pragmatic stand-in).metrics/*summary statistics (WP2/3/4).viz/*plotting helpers (WP1/2).
[0.0.1] - 2026-07-24
Added
Initial scaffold.
Repository layout:
src/geopulse/,tests/,examples/,benchmarks/,docs/.Core constants (
MU_0,EPSILON_0,R_EARTH_M, unit conversions).Type aliases (
FloatArray,ComplexArray,LatLon).Exception hierarchy (
GeoPulseError,ConfigurationError,DataError,ShapeMismatchError,ConvergenceError,NotImplementedYetError).Abstract base classes for
BFieldSource,EarthModel,ConductorNetwork,Solver,DeviceModel.ImpedanceABC withScalarImpedancefully implemented;TensorImpedanceandKernelImpedancestubs.Uncertain[T]generic wrapper andpropagate_uncertainty()Monte Carlo helper.Schema-versioned HDF5 I/O.
YAML config loader (dataclass-based, no pydantic).
argparse-based CLI:
run,validate,info,earth list.Tooling:
pyproject.toml,ruff.toml,mypy.ini,.pre-commit-config.yaml.Conda environments (
environment.yml,environment-minimal.yml).Apache-2.0 license, contributing guide, README.