Open-source pavement structure and operating-cost analysis toolkit for mine haul roads
Project description
HaulPave
Open-source pavement structure and operating-cost analysis toolkit for mine haul roads.
What HaulPave Does
- Computes traffic loading (CESA and design coverages) from a mining fleet composition.
- Determines pavement layer thicknesses using USACE CBR and TRH 14 empirical methods.
- Estimates comparative operating costs (tire, fuel, maintenance) across road surface scenarios.
- Generates structured design summaries with full versioning metadata.
What HaulPave Does NOT Do
HaulPave is not a complete haul road engineering tool. It does not cover geometric design, drainage, berm design, intersection layout, grade control, or traffic operations. All outputs require review by a qualified engineer. See SCOPE.md.
Installation
pip install haulpave
Quick Start
from haulpave.vehicle_registry import list_all, find_by_id
from haulpave.models.traffic import FleetUnit, TrafficInput
from haulpave.traffic.cesa import compute_cesa
from haulpave.pavement import cbr_thickness_from_coverages
from haulpave.economics import compare_scenarios, RoadScenario
from haulpave.reporting import build_design_summary
# 1. Pick a vehicle from the built-in registry
cat797f = find_by_id("cat-797f") # Caterpillar 797F, 6104 kN GVW
# 2. Compute CESA from fleet
traffic = TrafficInput(
fleet=[FleetUnit(vehicle=cat797f.vehicle, trips_per_day=30)],
design_life_years=10,
working_days_per_year=250,
)
result = compute_cesa(traffic)
print(f"Design CESA: {result.total_cesa:.2e}")
# 3. CBR pavement thickness
thickness_mm = cbr_thickness_from_coverages(
subgrade_cbr=8.0,
design_coverages=result.total_cesa,
)
print(f"Required thickness: {thickness_mm:.0f} mm")
# 4. Compare surface scenarios
scenarios = [
RoadScenario(name="Asphalt", surface="asphalt", thickness_mm=thickness_mm,
haul_distance_km=10, trips_per_day=30),
RoadScenario(name="Gravel", surface="gravel", thickness_mm=400,
haul_distance_km=10, trips_per_day=30),
]
comparison = compare_scenarios(scenarios)
for s in comparison.scenarios:
print(f"{s.name}: fuel ${s.fuel_cost_usd_per_year:,.0f}/yr")
# 5. Build a versioned summary
summary = build_design_summary(
inputs={"subgrade_cbr": 8.0},
results={"thickness_mm": thickness_mm},
)
print(summary.package_version, summary.generated_at)
API Overview
| Module | Key symbols |
|---|---|
haulpave.vehicle_registry |
list_all(), find_by_id(id), VehicleEntry |
haulpave.traffic.cesa |
compute_cesa(TrafficInput) → CesaResult |
haulpave.traffic.coverages |
compute_coverages(TrafficInput) → CoveragesResult |
haulpave.pavement |
cbr_thickness_from_coverages(), trh14_thickness_from_coverages(), design_pavement() |
haulpave.economics |
compare_scenarios([RoadScenario]) → ComparisonResult |
haulpave.reporting |
build_design_summary(inputs, results) → DesignSummary |
Built-in Vehicle Registry
Four OEM mining trucks with GVW and 25/75 front/rear axle-load split (CAT Performance Handbook Ed. 47):
| ID | Model | GVW (kN) |
|---|---|---|
cat-797f |
Caterpillar 797F | 6 104 |
kom-960e |
Komatsu 960E | 5 925 |
cat-789d |
Caterpillar 789D | 3 304 |
cat-785d |
Caterpillar 785D | 2 641 |
Status
| Phase | Content | Status |
|---|---|---|
| Phase 0 — Benchmark Foundation | Benchmarks 01–05, Pydantic models, USACE CBR curves | ✅ Done (v0.1.0) |
| Phase 1 — MVP | CESA engine, coverages engine, CBR pavement design | ✅ Done (v0.1.0) |
| Phase 2 — TRH 14 + comparison | TRH 14 engine, USACE vs TRH 14 comparison | ✅ Done (v0.2.0) |
| Phase 3 — Economics + registry | Vehicle registry, rolling-resistance cost model, design summary | ✅ Done (v0.3.0) |
| Phase 4 — Docs + community | MkDocs site, case studies, CLI polish | ⏳ Planned (2026-Q4) |
Design Principles
- Benchmark-first: every calculation method is tested against hand-computed examples before engine code is written.
- Confidence labeling:
benchmark_tested/method_implemented/experimentalon all outputs. - Honest documentation: explicit assumptions, limitations, and method references.
- SI units internally: mm, km, kN, kPa, tonnes — no implicit unit mixing.
- Open-source hygiene: no proprietary data redistribution; OEM data requires source attribution.
License
MIT — see LICENSE.
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 haulpave-0.3.0.tar.gz.
File metadata
- Download URL: haulpave-0.3.0.tar.gz
- Upload date:
- Size: 69.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b700b046be88409ad7bfb1c23f1fa4c3b2f9e461426af592488c7e9dadf439c7
|
|
| MD5 |
5c545ab8020d2da1686f317b0bc94b25
|
|
| BLAKE2b-256 |
bdb29ab59b6e5f65c0c14d1cb10aa076a5d4cd874b66714eb76899dde86b66f6
|
File details
Details for the file haulpave-0.3.0-py3-none-any.whl.
File metadata
- Download URL: haulpave-0.3.0-py3-none-any.whl
- Upload date:
- Size: 38.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f6436e8e2ca0e7993f9f3346b201041df842ab28eca6b6d196e54ca3ec828db5
|
|
| MD5 |
2861008756e74e85afeda425c9f645bd
|
|
| BLAKE2b-256 |
bfe9ede5ec8660074dece9e147e6105cc1dc9ac5610f40a93fbed524add7a65c
|