Architecture
Overview
User (Python)
│
├── Trajectory (gtracr/trajectory.py)
│ Sets up initial conditions (6-vector in spherical geocentric coords),
│ selects the integrator, calls get_trajectory()
│
├── GMRC (gtracr/geomagnetic_cutoffs.py)
│ Monte Carlo over random (zenith, azimuth) angles;
│ for each direction, scans rigidities to find the cutoff.
│ Two evaluation modes:
│ evaluate() — Python-orchestrated (ProcessPool or ThreadPool)
│ evaluate_batch() — entire MC loop in C++ (BatchGMRC)
│
└── pybind11 extension: gtracr.lib._libgtracr
│
├── TrajectoryTracer (C++) ← primary integrator
│ RK4/Boris/RK45 integration of the Lorentz ODE.
│
├── BatchGMRC (C++) ← batch evaluator
│ Entire GMRC MC loop in C++: RNG, coordinate transforms,
│ rigidity scanning, std::thread parallelism.
│
├── IGRF (C++) ← direct B-field model
│ Degree-13 spherical harmonic expansion (IGRF-13).
│
└── IGRF Table (C++) ← tabulated B-field model
3D lookup table with trilinear interpolation.
Coordinate system
All integration is in geocentric spherical coordinates (r, theta, phi):
| Component | Description | Units |
|---|---|---|
r |
Radial distance from Earth's center | meters |
theta |
Polar angle / colatitude (0 = north pole) | radians |
phi |
Azimuthal angle / longitude | radians |
The 6-vector state is (r, theta, phi, p_r, p_theta, p_phi) where p is
relativistic momentum in SI units.
Magnetic field models
| Model | bfield_type= |
C++ class | Description |
|---|---|---|---|
| Dipole | "dipole" |
MagneticField |
Ideal dipole, 1/r^3 falloff |
| Direct IGRF | "igrf" |
IGRF |
IGRF-13 spherical harmonics, degree 13 |
| Tabulated IGRF | "table" |
igrf_table |
3D lookup table (64x128x256), trilinear interpolation |
The tabulated field is ~7x faster than direct IGRF evaluation. It is
generated once from the direct model and cached to disk as
gtracr/data/igrf_table_<year>.npy.
Python / C++ boundary
The _libgtracr pybind11 extension exposes:
TrajectoryTracer— constructs from physical parameters (charge, mass, field type, solver type), thenevaluate()orevaluate_and_get_trajectory()integrates one trajectory.batch_gmrc_evaluate()— runs the full GMRC Monte Carlo in C++ withstd::threadparallelism.generate_igrf_table()— generates the 3D lookup table from IGRF coefficients.
The GIL is released during C++ integration, allowing true parallelism with
ThreadPoolExecutor when using the tabulated field.
Integration termination
- Escaped:
r > 10 * EARTH_RADIUS— trajectory is allowed - Returned:
r < start_altitude + EARTH_RADIUS— trajectory is forbidden - Timeout:
max_itersteps reached — trajectory is forbidden
Data files
| File | Description |
|---|---|
gtracr/data/igrf13.json |
IGRF-13 coefficients (loaded by C++ at runtime) |
gtracr/data/IGRF13.shc |
Spherical harmonic coefficients (Python IGRF) |
gtracr/data/igrf_table_<year>.npy |
Cached 3D lookup table (auto-generated) |
gtracr/data/igrf_table_<year>_params.npz |
Grid metadata for cached table |