This page documents the complete ultra-distance pacing algorithm implemented in our GPX Analyzer. The algorithm predicts realistic finish times and provides section-by-section pacing strategies for ultra-distance trail races.
Ultra-distance racing requires fundamentally different pacing strategies than shorter distances. Unlike marathons where runners can maintain relatively consistent effort, ultra races demand:
The algorithm prioritizes completion over speed. It models realistic performance degradation based on empirical data from major ultra races (UTMB, CCC, OCC) and applies safety constraints to prevent strategies that lead to injury or DNF.
Key Design Principles:
What you enter: The distance (in km) you can sustain for exactly 1 hour at maximum effort.
Examples:
Why this works: Your 1-hour max distance represents your anaerobic threshold - the physiological boundary between steady-state and accumulating-fatigue efforts. This single metric captures your aerobic fitness, running economy, and sustainable pace better than any other simple measure.
The algorithm automatically analyzes your GPX file to extract:
Your AT pace determines which performance cohort you belong to:
| Cohort | AT Pace Range | Description | Experience Level |
|---|---|---|---|
| 1 | ≤3:15/km | Elite | Professional/sub-elite |
| 2 | 3:15-3:45/km | Sub-Elite | Highly competitive |
| 3 | 3:45-4:15/km | Competitive | Strong club runner |
| 4 | 4:15-4:45/km | Strong | Good club runner |
| 5 | 4:45-5:15/km | Mid-Pack+ | Average competitive |
| 6 | 5:15-5:45/km | Mid-Pack | Average recreational |
| 7 | 5:45-6:15/km | Mid-Pack- | Slower recreational |
| 8 | 6:15-6:45/km | Back-of-Pack+ | Beginner competitive |
| 9 | 6:45-7:30/km | Back-of-Pack | Recreational/social |
| 10 | >7:30/km | Survival Mode | Walking/completion focus |
Each cohort has different expected performance drops based on race distance. These are derived from actual UTMB/CCC/OCC finishing data:
| Distance | Cohort 1 (Elite) | Cohort 5 (Mid-Pack+) | Cohort 10 (Survival) |
|---|---|---|---|
| 56km (OCC) | -12% | -26% | -50% |
| 101km (CCC) | -20% | -36% | -58% |
| 171km (UTMB) | -32% | -48% | -70% |
What this means: A Cohort 5 runner on a 100km course will average 48% slower than their AT pace by the end of the race.
Your cohort determines what percentage of AT pace you should target:
| Cohort | Target IF | Meaning |
|---|---|---|
| 1-3 (Elite/Competitive) | 0.71-0.74 | Can sustain ~72% of AT pace |
| 4-6 (Strong/Mid-Pack) | 0.68-0.70 | Should target ~69% of AT pace |
| 7-10 (Recreational/Survival) | 0.64-0.67 | Must pace at ~66% of AT pace |
Example: Cohort 5 runner with 4:37 AT pace → Target IF 0.69 → Target average pace 6:42/km
The algorithm models fatigue as an S-curve, not linear degradation:
Phase 1 (0-25% distance): Minimal fatigue, settling into rhythm
Phase 2 (25-60% distance): Steady degradation, maintaining sustainable effort
Phase 3 (60-85% distance): Accelerated fatigue, digging into reserves
Phase 4 (85-100% distance): Deep fatigue, survival mode
For each section, the algorithm:
The foundation is Alberto Minetti's 2002 research measuring energy cost of running on gradients:
Minetti Polynomial:
Cost(g) = 155.4g⁵ - 30.4g⁴ - 43.3g³ + 46.3g² + 19.5g + 3.6
Where g = gradient as decimal (0.10 for 10% grade)
Key insight: The relationship between gradient and energy cost is highly non-linear. A 10% uphill requires 1.8× the energy of flat running, while a -10% downhill saves only ~20% energy.
The algorithm implements several corrections to standard GAP:
Incorrect (common error):
degraded_pace = base_pace × (1 + degradation%)
Correct (physiologically accurate):
degraded_speed = base_speed × (1 - degradation%)
degraded_pace = 60 / degraded_speed
This correction can change predictions by 30+ minutes on 100km races.
Incorrect:
terrain_pace = flat_pace × gap_factor
Correct:
terrain_speed = flat_speed / gap_factor
terrain_pace = 60 / terrain_speed
This ensures downhills correctly predict faster paces, uphills predict slower paces.
Pure GAP calculations often predict impossibly fast downhill paces that would destroy legs or cause injury. The algorithm implements experience-based speed caps:
| Gradient | Elite Max Benefit | Recreational Max Benefit |
|---|---|---|
| -5% to -10% | 18% faster | 8% faster |
| -10% to -15% | 25% faster | 12% faster |
| -15% to -20% | 20% faster | 5% faster |
| -20% to -25% | 15% faster | Same as flat |
| -25%+ | 10% faster | 5% slower (technical) |
Steep downhills become proportionally harder as the race progresses due to accumulated eccentric muscle damage:
Additional slowdown in final 40% of race:
The algorithm automatically recommends hiking when running becomes inefficient:
| Runner Level | Always Hike | Hike if >15min | Hike if >8min |
|---|---|---|---|
| Elite (1-3) | 28%+ | 20%+ | 15%+ |
| Competitive (4-6) | 25%+ | 15%+ | 12%+ |
| Recreational (7-10) | 20%+ | 12%+ | 10%+ |
Performance degradation by cohort and distance (as percentage slower than AT pace):
OCC Distance (56km)
| Cohort | Expected Drop |
|---|---|
| 1 (Elite) | -12% |
| 2 (Sub-Elite) | -16% |
| 3 (Competitive) | -20% |
| 4 (Strong) | -24% |
| 5 (Mid-Pack+) | -26% |
| 6 (Mid-Pack) | -28% |
| 7 (Mid-Pack-) | -32% |
| 8 (Back-of-Pack+) | -36% |
| 9 (Back-of-Pack) | -42% |
| 10 (Survival) | -50% |
CCC Distance (101km)
| Cohort | Expected Drop |
|---|---|
| 1 (Elite) | -20% |
| 2 (Sub-Elite) | -25% |
| 3 (Competitive) | -29% |
| 4 (Strong) | -33% |
| 5 (Mid-Pack+) | -36% |
| 6 (Mid-Pack) | -39% |
| 7 (Mid-Pack-) | -43% |
| 8 (Back-of-Pack+) | -47% |
| 9 (Back-of-Pack) | -52% |
| 10 (Survival) | -58% |
UTMB Distance (171km)
| Cohort | Expected Drop | Finish Time (4:37 AT) | Strategy Notes |
|---|---|---|---|
| 1 (Elite) | -32% | ~18 hours | Aggressive pacing possible |
| 2 (Sub-Elite) | -37% | ~20 hours | Confident race strategy |
| 3 (Competitive) | -41% | ~22 hours | Balanced approach |
| 4 (Strong) | -45% | ~25 hours | Conservative strategy |
| 5 (Mid-Pack+) | -48% | ~28 hours | Safety-first pacing |
| 6 (Mid-Pack) | -51% | ~30 hours | Cutoff management |
| 7 (Mid-Pack-) | -55% | ~33 hours | Extreme conservation |
| 8 (Back-of-Pack+) | -59% | ~36 hours | Survival focus |
| 9 (Back-of-Pack) | -64% | ~40 hours | Walking emphasis |
| 10 (Survival) | -70% | ~45 hours | Completion only |
Additional performance penalty based on course vertical gain per km:
| Elevation/km | Fatigue Factor | Course Examples |
|---|---|---|
| <20m/km | 1.00 (no penalty) | Flat ultra, road 100K |
| 20-40m/km | 0.98 (2% penalty) | Rolling trail ultra |
| 40-60m/km | 0.95 (5% penalty) | Moderate mountain ultra |
| 60-80m/km | 0.92 (8% penalty) | UTMB-level vertical |
| >80m/km | 0.88 (12% penalty) | Extreme mountain ultra |
Minetti, A.E., et al. (2002) - "Energy cost of walking and running at extreme uphill and downhill slopes" - Journal of Applied Physiology
UTMB Performance Analysis - Race data from 2019-2024
Strava GAP Methodology (2017) - Population-based heart rate analysis
Pandolf, K.B. et al. (1977) - "Predicting energy expenditure with loads while standing or walking very slowly"
ACSM Guidelines - Exercise prescription standards
McGregor, S. - Normalized Graded Pace (NGP)
The algorithm synthesizes these sources while adding ultra-specific modifications:
The algorithm has been validated against actual race results:
Test Case 1: UTMB 2024 Mid-Pack Finisher
Test Case 2: CCC 2023 Competitive Runner
The algorithm intentionally trends conservative to prioritize completion over speed.
This algorithm powers the ultra pacing feature in our GPX Analyzer. To use it:
The algorithm provides both conservative pace targets and identifies critical sections requiring special attention (steep climbs, dangerous descents, late-race challenges).
Last updated: October 2025 | Algorithm version: v2.8