Tuesday, August 31, 2010

crosswinds, stability, and trail from Bicycle Quarterly

Moving backwards through the four copies of Bicycle Quarterly I recently received, I came across a very interesting article in the Spring 2010 edition. It addressed a topic I'd been puzzled about before: the relationship between trail and cross-wind stability.

It's well established that trail contributes to bicycle stability. For example, this reference describes trail as a generally positive thing for stabiltiy: more trail = more stable. So if I'm riding in a cross-wind with deep-dish wheels, I should want a lot of trail, obviously.

Yet of my two bikes, a Ritchey Breakaway (somewhat slack 72.5° head tube angle) and my Fuji SL/1 (super-slack 71° head tube angle), the Ritchey seems to do better in cross-winds. What's up with that? Everything I'd read says trail is what makes bikes move in a straight line. That should apply to cross-winds as well as to other conditions, right?

Well, not quite.

What trail does is cause the bike to steer when it leans. This is normally a good thing for stability, since generally you want the bike to be vertical relative to gravity if it's going in a straight line: the bike starts to lean, the front wheel turns due to the trail, and the bike steers into the lean, moving the contact patches back under the center of mass and keeping the bike + rider upright. A bike with too much trail really, really "wants" to stay upright. If you push it without a rider, it will coast further before crashing than a bike with little trail, all other things equal.

But a cross-wind changes things. When a cross-wind hits a rider, the condition of static balance is for the rider to lean into the wind. With trail, the front wheel turns in response to the lean. This is not at all what's wanted: the rider therefore needs to turn the handlebars to fight the tendency of the bike to steer. Since "wheel flop" is generally greater with a bike with more trail (wheel flop = sin θ cos θ T, where θ is the head tube angle and T is the trail), and wheel flop determines how hard it is to straighten the handlebars when the bike is leaned over, a bike with more trail or a slacker head tube needs more force to keep the bike moving in a straight line. The Fuji has both more tail and a slacker head tube: a flop-double-whammy.

So while that slack head tube may be nice for carving lines through corners (some of that benefit lost due to the greater flop), it's not a good thing when there's a steady side-wind.

So my perceptions weren't so crazy after all: the Ritchey may well be, in theory as well as in practice, the better cross-wind frame.

Monday, August 30, 2010

Leulliot mass-versus-height for cyclists

After reading Cozy Beehive's review of a recent article, and having read editor/primary contributor Jan Heine's absolutely excellent The Competition Bicycle, I knew I had to subscribe to Bicycle Quarterly. So I jumped straight in: I ordered the past year's worth of back-issues and committed to a 2-year subscription. After having become acclimated to the usual commercial touchy-feely stuff which is the staple of most cycling publications, the analytic approach taken by Bicycle Quarterly is refreshing. Sure, any sort of analysis is going to be flawed in some way, but at least there's something with substance there to bite into. Plenty of stuff for blog posts.

First I checked out the Summer 2010 copy, since this is where the article analyzed by Cozy Beehive was printed. But there's a lot more there than just the analysis of Tour de France speeds. A real gem was a translation of an article from a 1939 Vélo, by Jean Leulliot: How to Become a Bicycle Racer. A lot of good stuff printed there, less different from much of today's advice than one might expect, but I'm attracted to math, and an interesting mathematical contribution was his recommended weight-versus-height formula:

mass = (height ‒ 100 cm) × (1 kg / cm).

These days recommendations are more typically made in terms of BMI:

mass = BMI × height².

So I decided to compare the two. How did Leulliot's formula compare to BMI?

Here's a plot:

Leulliot BMI vs. height

You can see his formula results in a higher BMI for taller riders than for shorter riders, at least up to the maximum height plotted of 2 meters (the recommended BMI would begin dropping beyond this, but the recommendations probably weren't intended for such exceptionally tall people).

Now this is hardly new. Robert Chung produced the following plot, showing BMI versus cyclists and NBA players (to expand the height range), showing BMI tends to increase with height:

Robert Chung BMI plot

However, there's nothing scientific about the BMI formula: it's heuristic, designed to be easy to calculate by hand. There's no fundamental reason the "2" be an integer. So I fit a curve to the Leulliot formula and got the following adjusted BMI:

mass = BMI' × height2.38.

Note the two BMI values have different units and so can't be directly compared to each other without establishing a reference height at which the two should agree. But while I won't take the time to plot it, this value does quite a nice job of reproducing the slim side of Chung's plot (I focus on the slim side since basketball players obviously tend towards more upper-body muscle than cyclists).

But here's a plot of Leulliot's formula superposed directly (hand-drawn) on Chung's plot:

Leulliot applied to Chung

Considering that some of the NBA players are likely too stocky to race the Tour de France, the Leulliot limit line does fairly well, arguably better than the constant BMI target assumption.

The issue with any height-weight formula, of course, is mass depends on body type, not just height. Longer legs and you're probably lighter, long torso and you're probably heavier, both with the same build. So all such formulas are fuzzy. But it is interesting around a mean height of 175 cm, the Leulliot formula seems to come closer to Chung's plot than the more currently accepted BMI formula, designed for more pragmatic purpose than scientific.

Sunday, August 22, 2010

Mt Tam Double Results: rank vs time (2)

Another quick one today. I shifted the distribution of results in the Mt Tam Double by assuming the slowest 35% of riders who would have completed the ride were either deterred by the time limit or failed to make the time limit. In reality, only 35 riders DNF'ed, some of them for mechanical reasons or for crashes, so the time limit wasn't necessarily an issue with all of them. But if I do make that assumption, that without a limit more slower riders would have participated, each at the long end of the Gaussian tail, then the rankings line up nicely with the Mt Hamilton Hillclimb.

after assumed truncation of Mt Tam Double results

So the argument about the relative speed versus power of the double century versus the hillclimb does not necessarily apply: there's a viable alternate explanation for the difference in distributions.

Saturday, August 21, 2010

Mt Tam Double Results: rank vs time

I've been a bit busy, but I got curious about the statistical spread of the times in the recent Mount Tam Double compared to other events. The Mount Tam double isn't a race, more a ride where the goal is to finish. But it has a deadline so riders at least must make an effort to hurry to some extent.

Anyway, without further delay, here's a quick plot:

rank versus time for three events

The result? The times are tighter in the Mt Tam Double than they are either for the 2008 Dolphin Running Club Embarcadero 10 km running race or for the 2009 Mount Hamilton Low-Key Hillclimb.

A simple explanation is in both the hillclimb and in the running race speed is somewhat proportional to power. On the other hand, the double century includes time descending and riding on the flats, at times with considerable wind, in which a proportionate difference in power results in a considerably lesser difference in speed. So the result's not a surprise.

Of course the cut-off time has an effect, as well. You can really see that to the right of the plot. The "long tail" of relatively slower finishers is missing from the double results. Those who would have finished slower didn't finish, or didn't bother to start.

Anyway, it's a mistake to over-analyze the data. I thought the plot was interesting.

Thursday, August 19, 2010

2010 Mount Tam Double Results: net time versus start time

I did some quick analysis on the relationship between the net time and the start time in the 2010 Mt Tam Double results. Unfortunately the start times of DNF's weren't provided, so all I can work with are numbers for ride finishers.

Riders were started potentially every 5 minutes. One rider, Harish Narayanaswamy, started at 6:15, 15 minutes after the official cut-off (but he still finished with daylight to spare); all others started within the official 4 am to 6 am start window. So I binned the riders by start time then did a weighted linear regression of the average net times. The result is plotted here:

Mt Tam 2010

Not surprisingly, faster riders tended to start later. Or perhaps riders who started later tended to be faster due to less riding in pre-dawn darkness, although I suspect more of the former. Obviously it takes a special motivation to get out there for a 4 am start, foregoing the advantage of the 5 am mass-start, and a nice source of such motivation is fear of riding after sunset on much more heavily trafficked roads, or fear of missing the 10:30 pm cut-off.

Note the slope is < ‒1 (value = ‒1.69, standard error = 0.21), which means riders who started later in the morning tended to finish earlier in the evening, so it isn't a simple matter of riders pushing up against sunset or the cut-off.

Interestingly only 59% of the 194 finishers started with the main 5 am group. 36% started earlier and 6% started later.

Wednesday, August 18, 2010

How to lose ride data from your Edge 500

The result of unfortunate experiment today:
  1. Make sure auto-pause (bike settings) and auto-power-down (system settings) are both set. This is the default.
  2. Start riding towards ride meeting place.
  3. Hit "start/stop" to start recording data.
  4. Reach your meeting point. Wait. Chat. First the system "auto-pauses", then finally the system auto-power-downs, but you don't notice because you're chatting.
  5. Start riding again.
  6. Notice system is off, so you turn it back on, figuring everything should be okay now.
  7. Begin your critical climbing interval (which for purposes of this work we'll refer to as "OLH"), you hit "lap". The system reports a lap time and everything seems fine.
  8. Finish your critical climbing interval, you hit "lap". However, no lap data have been saved. Indeed no data at all are being saved....

RoadBikeAction photo

It's a bit of a shock to get to the end of your ride only to find that you have data only up to your meeting place. That critical climbing interval, an important fitness test, one where you want to carefully analyze your pacing, is lost in the neverland of lost numbers. It's gone. Simply gone.

The solution? Shut off auto-power-down and/or shut off auto-pause. Auto-pause is what put the system into non-recording mode, and when it's in non-recording mode it auto-powers-down, and once it auto-powers-down it forgets that it had been recording.

I may be a nimrod at times, but the fact is I've never lost ride data in this way with the Saris Cervo "Little Yellow Computer". What would typically happen with that was if I would stop, it would shut off after 4 minutes, then after I started riding again I would take awhile before I realized I needed to turn it back on therefore I'd lose these segments of data. But if it was on, it was recording.

So my solution for the Edge 500 is to shut off auto-power-down. I'll just need to remember to shut it off when I'm done with my ride and I'm not going to plug it into a USB port from which it can draw current. Hopefully I avoid losing any more data in the future.

Sunday, August 15, 2010

2010 Mt Tam Double Results

results are posted for the Mt Tam Double, and consistent with the "not a race" philosophy of the event, net time, let alone a ranking by net time, is not provided. But of course I wanted to know in the end how I ended up: I'd been told eighth when I'd checked in, but with riders starting at various times, that had been impossible to determine.

So the numbers were there: a bit of Perl hacking and I reformatted them into ranking by net time.

Three guys who finished before me had started sufficiently earlier that their net time was greater. Bruno and Max Mehech, each starting at 4 am dark-and-early, may well have cost themselves several places with their early start: losing the benefit of a faster pack leaving at 5 am, of the control of traffic signals out to Lucas Valley Road, and of an hour extra daylight. Randy Moschetti started at 4:15 and also finished before me but with more net time.

On the other hand, Peter Burnett and Steven Smead each decided to forego the use of morning lights and started at the saner hour of 5:45. They never caught me but finished 7 minutes ahead of me in net time.

So I gained three spots, lost two, finishing with the seventh fastest time. So my goal of top ten was safe.

I'll look at some statistics in a future blog post, but for now here's my sorted results. I need to add the caveat that this was not a race, so I'm contradicting the intent of the promoters by listing them this way: Carl and Stephen, for example, who finished 1 minute after me were quite a bit more relaxed about it all. But data are data, and for what little it's worth, here's my sort:

place number name                   start finish net
1     10     Atkinson,Jim           5:00  16:15  11:15
1     29     Buck,Bryan             5:00  16:15  11:15
1     101    Hebenstreit,Bo         5:00  16:15  11:15
1     199    Pollock,Graham         5:00  16:15  11:15
5     34     Burnett,Peter          5:45  18:05  12:20
5     227    Smead,Steven           5:45  18:05  12:20
7     50     Connelly,Daniel        5:00  17:27  12:27
8     5      Andersen,Carl          5:00  17:28  12:28
8     266    Zavestoski,Stephen     5:00  17:28  12:28
10    274    Fischer,David          5:00  17:33  12:33
11    163    Mehech,Bruno           4:00  16:35  12:35
11    164    Mehech,Maximiliano     4:00  16:35  12:35
13    242    Talley,Joshua          5:00  17:41  12:41
14    150    Marsh,Kenneth          5:00  17:51  12:51
15    31     Buntrock,Robert        5:00  18:02  13:02
15    259    Wietrick,Matthew       5:00  18:02  13:02
17    176    Moschetti,Randy        4:15  17:18  13:03
18    200    Powell,Anthony         5:00  18:05  13:05
19    192    paterson,steve         4:00  17:15  13:15
20    58     Cowherd,Myles          5:00  18:18  13:18
20    246    Thakar,Tertius         5:00  18:18  13:18
22    24     Boussina,Benjamin      5:00  18:20  13:20
22    52     Conway,Michael         5:00  18:20  13:20
24    183    OConnell,Christopher   5:00  18:21  13:21
25    276    Durbin,Greg            5:00  18:23  13:23
26    247    Thompson,Karen         5:00  18:24  13:24
27    238    Sullivan,Joseph        5:00  18:31  13:31
28    214    Sauers,Dan             5:00  18:34  13:34
29    12     Bailey,Mike            5:00  18:36  13:36
29    54     corrales,Danny         5:00  18:36  13:36
31    179    narayanaswamy,harish   6:15  19:52  13:37
32    169    Merrill,Peter          5:00  18:39  13:39
32    229    solan,denis            5:35  19:14  13:39
34    56     Cottle,Steven          5:00  18:51  13:51
35    112    Jenkins,Darrin         5:00  18:53  13:53
36    202    Quinn,Anthony          4:00  17:58  13:58
36    225    Skaden,Erik            5:00  18:58  13:58
38    216    Scharf,Jennifer        5:05  19:04  13:59
39    182    Ochoa,Ramon            5:00  19:00  14:00
39    226    Sleboda,TJ             4:20  18:20  14:00
41    18     Benvenuto,Tom          5:15  19:18  14:03
42    32     Burger,Richard         5:00  19:04  14:04
42    65     de_Hooge,Ronan         5:00  19:04  14:04
42    244    Tanforan,Jeff          5:00  19:04  14:04
45    187    Oszaczky,Peter         5:00  19:05  14:05
46    165    Mehranpour,Hooshang    5:00  19:06  14:06
47    77     Emerson,Ken            5:00  19:07  14:07
48    103    Hernandez,Gustavo      5:00  19:08  14:08
49    237    stone,tim              5:00  19:12  14:12
50    263    Witkowicki,John        5:00  19:14  14:14
51    186    Oliver,Arthur          5:00  19:17  14:17
52    127    Kobayashi,Masayoshi    4:03  18:23  14:20
52    181    Nichols,Curt           5:00  19:20  14:20
54    105    Hoppe,Holger           5:00  19:22  14:22
54    228    Snyder,Andrew          5:00  19:22  14:22
54    272    Moore,Leonard          5:00  19:22  14:22
57    109    Irion,Stefan           5:00  19:26  14:26
57    215    Scarberry,Daniel       5:00  19:26  14:26
59    44     Cherry,Lori            5:00  19:28  14:28
59    67     Decker,Steven          5:00  19:28  14:28
59    231    Spence,Jeanine         5:00  19:28  14:28
62    96     Guske,Adam             5:00  19:30  14:30
62    206    Rennie,Kevin           5:00  19:30  14:30
64    73     Eastburn,Dennis        5:00  19:32  14:32
64    172    Mitchell,Donald        5:00  19:32  14:32
66    185    Okano,Robert           5:00  19:33  14:33
66    264    Wong,Harvey            5:00  19:33  14:33
68    8      Arnold,Megan           4:35  19:11  14:36
69    3      achilli,Andrea         5:00  19:48  14:48
69    55     cosgrove,mojo          5:00  19:48  14:48
71    117    Jordan,Mick            5:00  19:49  14:49
72    76     Elo,Mark               4:35  19:30  14:55
73    217    Schlunt,Jason          5:00  19:59  14:59
73    218    Schlunt,Michael        5:00  19:59  14:59
75    191    Pan,Dylan              5:00  20:00  15:00
76    204    Ramos,Rob              4:00  19:03  15:03
76    249    Tsang,Stanley          4:30  19:33  15:03
78    253    Vandershaf,David       5:00  20:05  15:05
79    38     Cabeen,Ken             5:00  20:06  15:06
79    220    Scott,Brian            5:00  20:06  15:06
81    102    Hedlund,Craig          5:00  20:08  15:08
81    236    Stocker,Eric           5:00  20:08  15:08
83    128    Kosai,Robert           4:40  19:55  15:15
84    197    Pleskovitch,Lyresa     5:00  20:18  15:18
84    221    Sellers,Debra          5:00  20:18  15:18
84    269    Gallardo,Benny         5:00  20:18  15:18
87    260    Wilson,Craig           5:00  20:20  15:20
88    63     Cushing,Bernard        5:00  20:21  15:21
89    30     Bulatov,Igor           5:00  20:25  15:25
89    104    Holbrook,Richard       5:00  20:25  15:25
89    177    Murphy,Stephen         5:00  20:25  15:25
89    219    Schwartz,Fred          5:00  20:25  15:25
93    211    Rosati,Paul            5:00  20:26  15:26
94    97     Haddadin,Bashar        4:05  19:32  15:27
95    145    Lutterman,John         5:00  20:28  15:28
96    142    Lopes,Tony             5:00  20:30  15:30
96    194    Piccinotti,Vernon      5:00  20:30  15:30
96    262    Withrington,Jonathan   5:00  20:30  15:30
99    22     Boal,Gary              4:40  20:11  15:31
99    268    Schwartz,Barry         4:40  20:11  15:31
101   28     Buchanan,Scott         4:40  20:12  15:32
101   60     Crain,Warren           4:40  20:12  15:32
101   178    Murray,Scott           4:40  20:12  15:32
104   47     Cleymaet,Robert        5:00  20:34  15:34
105   37     Bursley,Steven         4:00  19:36  15:36
105   125    Klebanoff,Jack         5:00  20:36  15:36
105   195    Pierce,Jason           4:00  19:36  15:36
108   134    Laudenslager,Gladden   4:30  20:07  15:37
109   275    Tuazon,Russell         5:00  20:38  15:38
110   2      Abrahams,Mark          5:00  20:39  15:39
110   265    Yu,Nancy               5:00  20:39  15:39
112   232    spinale,anthony        5:00  20:40  15:40
113   122    Kempkey,Edwin          5:00  20:41  15:41
114   258    Wickham,Jerry          5:00  20:44  15:44
115   155    McAuley,Bill           5:00  20:45  15:45
115   241    Symons,Andrea          5:25  21:10  15:45
115   273    Smith,Sean             4:40  20:25  15:45
118   100    Hastings,Kirk          5:00  20:46  15:46
118   124    Kinsella,Michael       5:00  20:46  15:46
120   129    Kresser,Michael        5:25  21:13  15:48
121   27     Brown,Scott            4:00  19:49  15:49
121   87     Friedly,Gabrielle      5:00  20:49  15:49
121   132    Landrum,Vaughan        5:00  20:49  15:49
124   15     Bass,Zach              5:00  20:50  15:50
125   147    Madsen-Steigmeyer,Tara 5:00  20:52  15:52
125   158    McKay,Paul             5:00  20:52  15:52
125   267    Zlotnick,Bradley       4:25  20:17  15:52
128   188    Owens,Robert           4:40  20:34  15:54
129   86     Freedman,Jules         5:00  20:57  15:57
129   136    Lee,Theran             5:00  20:57  15:57
131   190    Pagel,David            5:00  20:58  15:58
132   205    Reid,Kristina          4:50  20:49  15:59
133   43     Chavez,Phillip         4:30  20:30  16:00
133   49     Collum,David           5:00  21:00  16:00
133   118    Joseph,Jack            5:00  21:00  16:00
133   209    Rogers,M_Kelly         4:50  20:50  16:00
137   1      Abraham,Jay            5:00  21:05  16:05
138   48     Cliggett,Mark          5:00  21:08  16:08
139   20     Berka,Becky            5:00  21:10  16:10
139   111    Jacobson,Rick          5:00  21:10  16:10
139   234    Stewart,Anna           4:20  20:30  16:10
139   235    Stewart,Rick           4:20  20:30  16:10
143   143    Lopez-Bonilla,Jennifer 4:00  20:12  16:12
144   301    Goldman_Lonni          4:03  20:17  16:14
145   16     Bayless,Jim            5:05  21:20  16:15
145   57     Cove,Don               5:05  21:20  16:15
145   99     Hartigan,John          5:05  21:20  16:15
148   90     Gathercole,James       4:25  20:41  16:16
149   146    Mack,Michael           4:20  20:37  16:17
150   80     Estrada,Alfonso        4:00  20:18  16:18
150   198    Plumb,Alex             4:00  20:18  16:18
152   257    Wholey,Jim             5:00  21:20  16:20
153   151    martinez,anthony       4:20  20:41  16:21
154   71     Dunn,Michael           5:00  21:23  16:23
154   201    Pritchard,Joseph       5:00  21:23  16:23
156   66     de_la_Vega,Mireya      5:00  21:24  16:24
156   184    O'Connell,Michael      5:00  21:24  16:24
158   106    Huber,Kerin            4:15  20:45  16:30
158   131    lai,wei                4:00  20:30  16:30
160   11     Auriemma,Philip        5:00  21:31  16:31
160   88     Gallegos,Edward        5:00  21:31  16:31
160   135    Leach,Michael          5:00  21:31  16:31
163   137    Lehman,Alan            5:00  21:33  16:33
164   35     Burns,Cheryl           4:15  20:50  16:35
164   36     Burns,David            4:15  20:50  16:35
166   113    Johnson,Anthony        4:15  20:57  16:42
166   116    Johnson,Lisa           4:15  20:57  16:42
168   68     Dexter,Doug            4:00  20:45  16:45
169   107    Hunt,William           4:00  20:46  16:46
170   61     Cronander,Mark         4:40  21:32  16:52
171   19     Berg,Bruce             4:15  21:09  16:54
172   9      Arnold,Rick            4:00  21:00  17:00
172   168    Menigoz,Ron            4:20  21:20  17:00
174   222    Senter,Eric            4:30  21:32  17:02
175   14     banks,debra            4:30  21:33  17:03
176   64     de_Berry,Lawrence      4:00  21:19  17:19
176   167    Melville,Michael       4:00  21:19  17:19
178   159    McNamara,Colin         4:00  21:20  17:20
179   26     Boykins,Terri          4:00  21:22  17:22
179   53     Cooper,Aaron           4:00  21:22  17:22
179   240    Sundstrom,Steve        5:00  22:22  17:22
182   196    Pinney,George          4:00  21:23  17:23
182   255    von_Tress,Brian        4:45  22:08  17:23
184   83     Fitzpatrick,Matthew    4:00  21:25  17:25
185   250    Tunucci,Veronica       4:00  21:26  17:26
185   303    Kaplan_Zack            4:00  21:26  17:26
187   120    Kegley,Peggy           4:00  21:28  17:28
188   75     Eisenbarth,Chris       4:00  21:30  17:30
189   46     clemes,Dave            4:00  21:32  17:32
190   170    Miller,peg             4:00  21:35  17:35
191   42     Chapman,William        4:00  21:42  17:42
191   138    Lestishock,Lisa        4:00  21:42  17:42
193   213    Rutherford,David       4:00  22:08  18:08
194   174    Monsen,William         4:00  22:17  18:17

Wednesday, August 11, 2010

Fillmore: Fail!

Still recovering, obviously, from Mt. Tam on Saturday, I rode yesterday to Bike Nüt to try on some Bont A-1 Shoes they'd ordered for me: undrilled to allow custom drilling of a 4-hole Speedplay pattern, with straps, not buckles, to save weight. Issue is Bont sent the rounded-sole shoes rather than the flat-soled required for Speedplay pedals. But at least I wanted to try them on before having Bont sent the proper shoes. BTW, they were 217 grams each, quite impressive, and the fit is what I'd expect for the shoes pre-heat-molding, so I'm excited about those even if a bit dissappointed the delays mean I don't have them for key rides this season.

Bike Nüt is right off Fillmore Street on Filbert, only a block from Union, where the famous climb which had been featured in the late-great San Francisco Grand Prix. Despite my tired legs, I couldn't resist having a run at Dan Vigil's Strava record for the climb. This was more timely because I was on my Fuji SL/1, rather than my usual Ritchey Breakaway, which is around 3 lb heavier.

Fillmore StMeasured Fillmore profile

One thing I did correctly: Normally I climb Fillmore in a 23 or, if I'm feeling frisky, in a 21 cog with a 34 or 36 up front. Today I put it firmly in my 36/26 low gear. This was going to be about speed, and speed requires cadence, as opposed to my usual "the challenge of steep" approach where it's more fun to attempt it in a gear which doesn't exploit my compact crank.

But other than this, it all went dreadfully wrong.... I fell three seconds short.

A nice thing about Strava is it allows you to track your progress on a segment relative to the KOM leader, or relative to anyone else who's logged a personal best. One thing to keep in mind is GPS isn't perfect, and there will be some error in the relative position of each rider, so we won't be perfectly synchronized. Thus the actual "gaps" may be distorted by it thinking we're at the same place, whereas actually one rider is at a flat cross-street while the other's still at the start of finish of a steep block. But that aside, I think it's safe to assume the gross trends have validity.

In this case, Dan burst out to an almost immediate 2-second lead. By the first intersection, Green, I'd closed that to one second. But by the opposite side of that street he'd taken it back out to three seconds. He extended that by a single second during the beginning of the first 17% block, but I shut down the full gap by near the top. The next intersection, Vallejo, he shot off again, gaining four seconds on me. Amazingly I managed to catch, then pass him on the second 17% block, the third and last block of the climb. But he caught me at the top, riding at least twice my pace across Broadway to the finish of the segment on the opposite side of that street.

Obviously I was being too cautious at intersections (generally a good idea, but there's good visibility on these). But what else?

The power data tell the full story:

Power, cadence, speed, and altitude from Golden Cheetah.

On short efforts like these, it's really important to hit them hard right from the start, then suffer through. You can see the power in my first block (5-second averaging) is clearly less than the second two. This is non-optimal. Then you can see at the cross-streets my power drops substantially as I spin my low gear up to around 90 rpm. Obviously I should have up-shifted, punch it home.

Next time I won't make these mistakes. So with a bit of luck I won't be slowed by cross-traffic at the intersections (as I wasn't on this ride, just by my own caution), and will get that KOM.

Monday, August 9, 2010

2010 Mount Tam Double

Mount Tamalpais

Without a hint yet of the coming dawn, the lead police car led the main pack out of the Vallecito Elementary School parking lot, and we were off. The pack was considerably smaller than the 300 rider limit, but given the 10:30 pm finish deadline and the desire to minimize time spent on Marshal-Petaluma road after sunset, a large number of riders had already left. This is a sanctioned option, with riders allowed to check out at any time from 4 am to 6 am, but those starting at 5 am have the advantage police control through the traffic signals early on, not to mention the draft advantage of the pack.

Soon enough we were on Lucas Valley Road, the first climb of the day. In 2005 I'd done this ride without a light, figuring I'd simply utilize the illumination of proximate riders. But that had been an uncomfortable experiment, one which led me to go out too hard on the opening climb as I put too much value staying with the lead group and the lights of the pace vehicle. This year I'd borrowed a friend's NiteRider Newt dual-light system. The difference was amazing: I was able to ride my own pace on that climb. This still put me in sight of the leaders at the top, but only 5 miles into a nominal 200 mile ride, my goal was only to avoid a debt which would require high interest payments in the second half.

My Garmin 500 display wasn't visible (in retrospect I should have hit the "light" button; I wasn't thinking so well), so probably still rode a bit harder than I should have. But not too bad: I could still talk easily enough, a good indicator of being no worse than the low end of Z4.

I found some riders with which to share the pace over the southbound bumps of Nicasio Valley Road, the easy backside of Whites Grade, and then down into Fairfax. By now the day had reluctantly arrived through the low clouds: the first phase of the ride was done.

Usually Bolinas Road: the first climb to Pine Mountain, the rolling descent to the dam, and the climb to Ridgecrest seems like an endless grind. Today, it passed quickly, as I knew there was so much more yet to follow. Along the way, I stopped at the Pine Mountain rest stop, the first of the day, to pack my light into a paper bag for delivery back to the start. Then I hopped on to some passing riders and continued on.

Overcast clouds turned to fog as we hit Ridgecrest, the tree cover condensing the mist into a surprisingly steady rain. But by the second sister, the trees were behind me, and the rain stopped. The morning sun was shining brightly through the thin clouds, and by the intersection with Pan Toll road, I was riding in sunshine.

Here I was tempted to remove my vest, as I was warming quickly, but I was using the pockets, and it wasn't pressing enough for the hassle of transferring everthing to the pockets in my jersey underneath. This would be the last time I'd be tempted to remove the vest in 100 miles. On my legs I had full-length compression tights and high-calf compression socks over my bib shorts and regular socks, while on my upper body I had a long-sleeve undershirt, jersey, and arm warmers (turned inside out to hide the "Alto Velo": still waiting for that Voler order to come in!) in addition to the vest. Crazy amounts of clothing for August, but that's how it goes in San Francisco-Marin.

Soon after the climb to the golf ball (west peak) began, I began to see descending riders, some looking fairly fit. I was worried some of these had been with my start group at 5 am: that was a considerable time gap. But then as I approached the golf ball I saw Bo, the winner of the Terrible Two this year, and I knew everyone ahead of him was likely an early starter. I was riding fairly well, hopefully within myself. In preparation for Terrible Two, Bo did a training ride which included climbing Mount Hamilton Road, descending and reclimbing San Antonio Valley Road (the steep "backside" of Hamilton) four times. That's the sort of suffer-fest which allows a rider to hammer a double. Lacking that sort of disciplined preparation I had to be more careful, so I had no regrets about not matching Bo's pace.

After passing the golf ball, I descended a bit then climbed to the east peak parking lot, where there was a checkpoint. I quickly topped off my bottles with water (one contained Accelerade, the other Spiz, which is a "liquid food"), then back down. It was 7:30 am: a wonderful time to be on the mountain.

Back down upper Ridgecrest, the turn onto Pan Toll was a remarkable transformation. Within a second, I went from uncomfortably warm to cold: the fog-chilled wind blowing up from the coast. I slowed a bit to take inventory, decided I'd be okay, then continued on carefully on the wet roads, the sun now hidden behind the mist.

I feared things would be even worse in Muir Woods, but actually it was slightly warmer there, the roads a bit drier, as I'd passed through the clouds. The second rest stop was here: I ate some fruit, filled my bottles again, and added orange Perpeteum to my remaining chocolate Spiz. This seemed a good idea at the time... but I realized I'd have been better off adding the unflavoured Sustained Energy instead.

I was 50 miles in. The first quarter of the ride was in the bag.


A brief hesitation as I wasn't sure which way to go out of the rest stop (I am almost neurotically paranoid about wrong turns), but then I was soon to the Highway 1 intersection. I rode this north, mostly alone over the two significant climbs to Stinson Beach. After passing through that beach town I was overtaken by a group of three. We worked surprisingly well, picking up a few more along the way, and rolled into the rest stop at the Pt. Reyes Station public toilets together. I was much quicker here than the others, however, and (again after some seconds of confusion about which way to go) rolled out alone.

Back on Point Reyes - Petaluma Road (reverse Roasters), past Nicasio Valley Road I rejoined the Marin Century route. Marshall Wall was stacked with riders, mostly 50 k'ers, some walking their bikes. I have to admit this perked me up; what had felt like a slow pace now seemed not so slow.

That is, until I was passed by one guy from that group of three I'd left at the rest stop. Riding a relatively low-cost Performance bike, he motored up the wall. I simply had to let him go: I was keeping my power meter in the 200-230 watt range, a level of effort I thought I could hold on climbs through the day, and couldn't be digging myself deeper than I already had so early in the ride. If he could hold that pace he was fitter than me, and there was nothing to be done about that.

I probably should have reviewed the route sheet ahead of time: I was surprised when we passed Hicks Road without turning. Other riders were returning from the same road. I later learned they had reversed the direction of this portion of the course. In 2005 we'd turned onto Hicks, headed out to Highway 1 on Marshal-Petaluma Road, and returned via Petaluma. This year was the opposite: probably an improvement as it allows a southern leg on Highway 1 along the coast.

Lunch this year was in Petaluma, at mile 93. I got through quickly, only stopping to fill my bottles, down three Endurolytes, and stuff my pockets with some fig bars, dates, and a half-bagel. As I left I found myself again next to Performance guy, but once again, his relentless pace left me behind. A good sign at lunch: the volunteers in the "double century section" (with its powders, potions, and pills) was surprised to see me. There obviously weren't too many doublers ahead. I knew the Webcor pair of Bo H and Brian Buck were well ahead, but they make even quicker use of stops than I do, so were easily missed. But obviously I wasn't too far down.

Mile 100, somewhere in Chileno Valley Road: I was halfway. Of course, I was tired already: I rarely ride 100 miles in a day. But mid-way through a double I just forget about the route and focus on turning the pedals. Turn them enough times, eat and drink, and the finish will arrive.

Performance, Rivendell, and Roubaix

Somewhere near here I was caught by a Davis Rider on a Specialized Roubaix and another guy on a Rivendell. They were clicking along at a nice pace, so I joined in. I'd say we worked well together, but I did less pulling than the other two, who were content to zip along. We joined up with first one, later another century rider, making a nice group. As we rode I asked Rivendell why he rode that bike: he seemed stronger than most riders of the brand. He said his wife got it for him and he liked it because with its condiderable mass it was a bit of an equalizer between the two. I told him I appreciated the equalization myself.

We arrived together at Valley Ford rest stop. I stopped here for a can of Coca Cola (part of which I drank, the rest of which I added to my bottles), as well as a few more Endurolytes, then left alone. The Coke worked so well for me at mile 184 of Terrible Two, I wanted to tap into it a bit earlier here.

I never did see the century riders again: the century split off again. But I would rejoin the other two soon enough.

It was after a busy stretch on Highway 1, soon after we turned onto Joy Road. Honestly I don't remember Joy Road from 2005; it wasn't on the route in 2004 (see Felix Wong's route sheets). It gains 1047 feet climbing from Highway 1, much of it steep. The descent is also steep, with potholes overlapping other potholes, not the sort of thing you want to deal with 120 miles in. Actually, I was glad I'd installed latex tubes, which lose around 2 psi per hour: the lower pressure relative to the 105 psi I'd started with took off a bit of edge.

They descended ahead of me, but not too far, and I caught and passed them at the lowest slopes of Coleman Valley Road. Coleman Valley is nasty: sustained 12%+ (feeling steeper from 135 miles in the bank already) followed by a false summit and then two short climbs before the true descent. I just focused on spinning my 36/26, my lowest gear, which took me close to threshold in the 270 watt range. Truth be told I wanted to put up a good number for Strava on this section, a move which would end in tears. But that's for later.

The climb took a bit out of my limited reserves, however, and I was passed by the Rivendell guy on the rolling summit. As he passed, we could see Performance up ahead. Rivendell caught and passed Performance, but I followed at my sustainable pace.

The descent was much nicer than that of Joy, and other than my usual nagging worry about missing a turn, I enjoyed the ride. I caught sight of Performance at a key moment which convinced me I was still on track.

At mile 142, the day had finally began to warm and so as I rode I transferred the odd bits of food I had in my vest pockets into my jersey pockets underneath. Then I removed my vest and stuffed it into my center jersey pocket. From there it was just eight miles or so back at Valley Ford.

I could have skipped this stop, but I wanted more Coke and to try some of the Tums they had at all the rest stops. I was getting some stitches in my chest, and wanted a blast of calcium to see if that would helped. I'm not sure if the Tums helped, but while the stitches continued to be an issue, they never got really bad. On the Coke end I went a bit overboard, putting it in both bottles. Coke should be diluted at least 1:1 with water, more if combined with food, and I was over that concentration. But despite eating a fig bar and dates on the road following Valley Ford, I handled the Coke okay.

150 miles done, 50 to go. We were in the final quarter, but 50 miles is 50 miles is still a long way, longer with tired legs than with fresh legs, no matter how small the fraction of the total.

End Game

I didn't see any of my usual company as I left Valley Ford for this second time. Next was the long southern run down Highway 1, which in 2005 had been to the north. There's usually a northern wind on the coast, but today held up to what I'd seen from weather data for the day prior: wind from the south. A block headwind isn't what I really wanted to see at this point, but I just hunkered down and dealt the hand that was there. It was the same for everyone.

The route finally turned left off Highway 1 onto Marshal-Petaluma Road: a rather rude introduction as the grade went from zero to large within just a few pedal strokes. I had just overtaken two century riders at this point, so it was nice to have company for this. But I slogged along at my death-march pace and was on my own again.

At the Walker Creek rest stop I got some water to dilute my remaining Coke, and grabbed more dates. I asked when the next turn was and was told 18 miles. For some reason I found this discouraging; I prefer changing roads to mark progress than staying on the same road mile after mile. I was out quickly, though, putting it out of my head.

It turns out my question was misunderstood and the next turn, onto Hicks Road, wasn't far at all. Hicks soon T'ed into Pt Reyes-Petaluma and I knew I was in the end game. The eastern side of Marshall was easy compared to the eastern "Wall", then the descent and left turn onto Nicasio Valley Road. In 2005 I almost got taken out by an RV in this turn, but today no issue. I was getting really close.

PhotoCrazyOne last rest stop on Nicasio Valley Road. I wanted to blow past but decided to check to see if this was a mandatory checkpoint. Of course, had I checked the route sheet in my pocket I would have known this, but my brain really wasn't working well at all by this point. I had trouble getting anyone's attention, so spent more seconds here than I would have liked.

One more climb to go: Lucas Valley Road. I really wanted to blast this sucker: blitz it at or over threshold, but there simply wasn't anything left. I couldn't even hold 200 watts on the climb, a strong contrast to when I was strong on the final climb of Terrible Two, to Occidental. Instead I just focused on keeping the pedals going, knowing I was almost there.

Fire trucks were moving back and forth on the road near the summit, almost absurdly. One was approaching from behind, siren off, soon after another had descended the opposite direction (also siren off) and I disparately did not want it to pass me, as I knew I'd be much faster on the descent. At the summit, a volunteer pointing a flag at a "dangerous left turns! ride slowly!" sign, I thanked him and began my descent just ahead of the following truck.

The road was in excellent condition, making for solid cornering. I vividly remember getting passed on this descent in 2005 and I vowed to not let that happen again. Despite this, I showed more caution than required in the corners. It turns out there were approximately five crashes on this descent, several requiring medical treatment, despite warning signs at each of the tricky corners. But I didn't have the slightest issue other than that I should have taken it a bit faster.

The last few miles went easily. I was tired, unable to sustain power above Z3, but I could at least get into Z3. I was calculating as I went my chances for a sub-12:30 and it looked good.


I entered the school, crossed under the finishing banner, and with some bystanders cheering I gave a little fist-pump. I was glad to be done. But I wasn't really done until I'd checked in, so after asking directions to check-in, I went up onto the sidewalk, through the expo, and to the check-in table. My watch said "5:26", so 12:26 if we started on time.

"You're #8" the volunteer said. "Eighth?" I responded. I couldn't believe it: that was better than I'd thought. I was 17th finisher in 2005, so that's a nice improvement.

Davis and Rivendell finished soon after. Each of them had clearly been stronger than me but chose to enjoy the day a bit more. Still, my goal going in had been top 10, for whatever that is or is not worth, and I'd hit that goal. So success.

After hanging out at the finish for a few hours, in part waiting for my carpool partner to finish his double (on his 'cross bike!), it was time for the drive back to San Francisco.

I'd managed to do the entire ride without any wrong turns, always a major victory by my standards, but in an RTFM moment I shut down my Edge 500 without first hitting "stop" and "reset". This apparently caused my ride data to get purged. Now I've gone through periods of data aversion where all I want to do is ride, echewing metrology. But this isn't one of those periods: I'm riding well, I'd made a solid effort up Coleman I wanted to Strava-log, and I wanted to see how my power up the opening climbs compared to the power on the final climbs. Losing the data was such a disappointment I devoted an entire blog post to the subject.

Despite my dreadful lack of sleep the night before, I had trouble getting to sleep that night. Too much Coca-Cola, I suspect: a considerable caffeine dose in 20 ounces of the stuff. But part of it may have been the fitful mix of trauma and adrenalin from an extremely full day.

addendum (15 Aug 2010): When results were posted, it turned out I was the eighth finisher, but the seventh fastest time due to the option of alternate start times than the supported 5 am mass-start.

Sunday, August 8, 2010

Edge 500 data loss

Garmin Edge 500Yesterday: Edge 500 with current firmware:
  1. Hit start
  2. Ride 195 miles (Mt Tam Double); 8th finisher
  3. Severely depleted, didn't think to hit stop, or anything other than checking in and then recovering.
  4. 2 hours later, notice Edge is on, so I shut it off.
  5. Hooked up with car pool buddy, I drive home.
  6. Go to upload ride to Strava, but no data has been stored.

User error? Maybe. But obviously at the end of challenging almost-200 mile course the synapses aren't going to be firing with razor-like sharpness.

User interface design 101: Never, ever delete or otherwise discard data which has been recorded without warning the user. Here's what I propose, just in case Garmin engineers are reading this (or my post on Garmin forums):
  1. Create a Trash directory under Activities
  2. When data is about to be discarded, dump it into a FIT file in the Trash folder, warning the user
  3. When a FIT file in Trash becomes a week old, check with the user if he wants to clean it up.

Needless to say, with my recently acquired Strava addiction, I was not pleased to lose data from a 12+ hour ride with 14.5 kft of climbing.

StravaThe Edge 500 has wonderful features: an enormous improvement on the Saris Cervo ("little yellow computer"). For example, it was a rare long ride where at some point the Cervo wouldn't shut off and I'd forget to turn it back on before starting again, losing data. And the configurable Edge 500 display is fantastic (although I'd like to see the option for more than three page configurations: so much data...). And Strava is a real paradigm shift in cycling, something the GPS enables.

But prior to updating the firmware to version 2.40 I had the unit freeze up with me and I lose what may have been my best ride (avg power) for the time taken to climb Camino Alto in Marin, and then I lost the entire Mt Tam double.

They're still working out the kinks. I'm sure these weaknesses will be addressed in coming firmware updates. It's still frustrating, however.

Friday, August 6, 2010

Experimental data of effect of mass on climbing speed

Someone pointed this blog post out to me.

L'Alpe d'HuezClimb by Bike

Interesting experiment: the rider (Luke, who went on to finish 26th in the Tour of L'Avenir) did L'Alpe d'Huez four times, each at close to 275 watts average power (measured with Powertap), trying different "treatments". In sequence, in the same day:
  1. Normal bike + 1.8L extra water in tires: Yes, you read that correctly: water was put in the tires. The goal was to determine the difference between the effects of rotating mass and translational mass on climbing times. Now the theory is simple enough: rotating mass makes it harder to change speed. In other words, harder to speed up, harder to slow down. Typically during a climb you speed up and slow down a lot: a bit each pedal stroke, in fact. So the magnitude of these speed changes is fractionally less with more mass in the tires relative to on the frame. But one speed increase is not canceled by an offsetting speed increase: the net speed change from start to finish. Suppose the rider started at rest and finished the climb at 9 meters/second, riding at constant power. Then the approximate effect of 1.8 kg (the mass of 1.8 liters of water) at the rolling radius on climbing time is ½ M vf² / P, where vf is the final speed, M is the extra mass, and P is the power. Plugging in 270 watts, 1.8 kg, and 9 meters/second yields 0.28 seconds. This is less than the timing resolution, so we'd expect no effect. On the other hand, that water moving around in the tire is going to create friction, and friction generates heat, and heat requires power. This will be result in an effective increase in rolling resistance.
  2. Normal bike + 1.8L extra water on bike: Now the water was mounted on the seatpost. It's still going to slosh around, creating heat, requiring power, but it certainly seems this effect should be a small fraction of the energy going into moving water in a tire. But that's just speculation. If speculation was all we needed, we'd not need to conduct any experiments.
  3. Normal bike: Nothing to say about this.
  4. Normal bike, reduced tire pressure only 3 bars: Hardly subtle; 3 bars (44 psi) is much lower than normal tire pressure of 8 bars (116 psi). Indeed for climbing time trials I prefer 10 bars (145 psi). More pressure = less tire deformation = less heat generated = lower rolling resistance. That's bike physics 101. Rolling resistance tests on smooth rollers always show this result. But for riding on rough roads, it's less obvious. In this case if the pressure gets too high, the bike bounces, raising and lowering the mass of the rider. This can increase rolling resistance: imagine the case of riding on a solid metal tire. It would work great on a steel rail (which is why trains don't use rubber tires) but on the road, it would be inefficient (not to mention uncomfortable). Still, 3 bar is typical of cyclocross, not riding on well-maintained roadways like the road from Bourg d'Oisans to Alpe d'Huez.

Luke RoweLuke Rowe, who did four L'Alpe d'Huez repeats in one day in the name of science

So in these trials they got the following results:
  1. 52:01, 275w
  2. 51:34, 277w
  3. 49:40, 278w
  4. 50:38, 273w
where powers were measured with an SRM, which is at the crank.

Okay, so at first glance it appears the stuff designed to slow him down actually slowed him down. But then consider that the powers for each of the trials differ. Sure, they're fairly close, but then the times are fairly close, as well. So it's important to compensate for the differences in power.

First I'll use Tim Clark's Power-Speed converter to estimate the rider's weight. It comes conveniently programmed with the stats for L'Alpe d'Huez... So using the baseline run, assuming a baseline CRR = 0.4% and CDA = 0.36 m² with a drivetrain loss of 3%, and zero wind I get a rider + bike + equipment mass of 154 lb. Luke's a light guy, consistent with his photos.

So first I need to adjust for the difference in power among the different trials. I could do trial and error with Tim's script, but instead I'll use an analytic solution I blogged here. That result is a 1% change in power has an effect on speed of approximately 1% / (1 + 2 f), where f is the original fraction of power going into wind resistance. Using Tim's default parameters, I get approximately 6% of the power from these trials went into wind resistance, meaning a 1% change in power results in a 0.89% change in speed. With this conversion I get the following results for converting the power of each trial to 278 W:

normal bike: 49:40
3 bar: @ 9 sec (+0.3%)
water on bike: @ 1:44 (+3.5%)
water in wheels: @ 1:51 (+3.7%)

Again using the calculator I added 4 lb to the total weight (around 1.8 kg, adding only 14 g to the weight of water for the container and tape). The result was 1:04 added to the time. This differs considerably from the measured difference of 1:44. To match that difference, I need to boost the weight difference to 6.5 lb. So what's up with that?

One option might be that the container and tape is heavier than I give it credit for. Yet it seems unlikely that accounts for the full difference. Another possibility is that the rider lost weight between the second and third trials. Unless he was hydrating at 100% replacement level and did each ride with the same amount of water in his bottle, weight difference could easily account for at least half of this unaccounted weight difference. Another option is a difference in wind: even an imperceptible 1 mph headwind is worth 37 seconds. But an additional option is that the sloshing water is dissipating heat which comes in the end from the rider's power applied to the cranks. My money's on the principle factors being rider weight loss and a slight change in wind speed.

The most curious thing about these results to me is the small effect of a reduction in rolling resistance from approximately 8 bar (assumed) to 3 bar. Jobst Brandt's measurements showed a considerable increase of rolling resistance with this pressure reduction (the pressure axis uses units within 2% of bar):

Jobst Brandt rolling resistance measurements

Rolling resistance accounts for around 28 seconds per 0.1% change from the assumed value of 0.4%. Rolling resistance is a big deal, and we're not seeing much of an effect here from either low pressure, or for that matter from the water in the tires.

So overall an interesting experiment. The conclusion? Weight really does matter on climbs (as the equations predict) but tire pressure may be over-rated. I should do my own field test: after all, all that's needed is a power meter, a timer, and a scale.

Wednesday, August 4, 2010

CP model parameters from maximal power curve: iterative method

Last time I described in principle what I want to do in fitting critical power (CP) model parameters to maximal power data. Recall the idea is to derive a model which envelops the existing data: no data values should fall above the curve, but subject to that restriction, the curve should be as low as possible, touching at least two of the measured data values. The fit to the curve is most easily done using work versus time, rather than power versus time, where for each time duration work equals the product of average power over the interval and the duration of the interval. Typically units used are watts for power and seconds for time. Multiplying these gives work in joules, typically reported in units of 1000 called kilojoules (kJ).

So the first step is to derive the maximal work for each interval. One point which some codes miss is that work done can never decrease with increasing time. Obviously if someone did a certain number of kilojoules in a certain time, even if he got off his bike, for all longer intervals he at least did the same amount of work. So the code needs to check to make sure that an interval shorter than a time being considered may provide the highest work for that time.

Okay, so I have the curve. I then want to make sure I'm fitting a curve through a point with a high fraction of anaerobic work contributing to the power, and another point with a relatively high fraction of aerobic power. This will reduce the possibility of ambiguous results like the one I schematically showed last time, and will reduce the likelihood of wildly anomalous results associated with weakly populated data sets.

So I define two regions of the curve. The first is an anaerobic region in which anaerobic work is a sufficiently large contributer. I want this interval to be long enough that neuromuscular power, which is the primary contributor to large sprints, plays a relatively minor role. But it should not extend into the time range where aerobic power tends to dominate. The range I selected for this was between 1 minute and 6 minutes.

For the aerobic points I want a regime which is relatively inaffected by AWC, more strongly affected by CP. So I start the aerobic regime at 10 minutes. On the upper end there's no fundamental reason to set a limit, but using fewer points to be checked speeds the calculation, and there's not much reason to go beyond an hour. Additionally the contribution of AWC to power for efforts longer than one hour becomes small, anyway, so the potential error from ignoring these longer interval durations is small.

So now I have data extending from 1 minute to 6 minutes in duration for AWC extraction, and other data extending from 10 minutes to 60 minutes for CP extraction. The rest of the data I ignore.

Rather than some super-clever instant solution to the problem, I decided to solve it iteratively: solve for one parameter assuming the other is known, then solve for the other assuming the first is known. Then repeat until the values stop changing more than a small value (for example, I use the convergence criterion that AWC/CP changes by less than 1 µsec).

Actually, rather than solve for AWC and CP, I solve for AWC/CP (which I call τ) and CP. I do this because I figure while CP may vary a lot, perhaps AWC tends to be proportional to CP, so τ will vary less. The time-constant τ describes how "anaerobic" a rider is relative to his aerobic power. A high value of τ (say, more than 90 second) means the rider is "punchy" and has a strong attack, while a small value (say, less than 60 seconds) describes a rider who prefers steadier efforts. I find τ more intuitive than AWC, but either works.

So I start assuming τ = 0 (and therefore AWC = 0). Then I find the time interval which gives the best value of CP. Since AWC = 0, this is simply the point in the aerobic range with the most power, so it is most likely the point at 10 minutes.

Then I take that value of CP, and from the points in the anaerobic time range (1 to 6 minutes) I find the point which gives the best value of τ (also AWC). This could be any point in that range of times: even though points at low times tend to have higher average powers than for long times, they also have a larger time difference from the point used for the aerobic power, and therefore the derived value of AWC or τ may be less than it would for a point of lower power and longer duration within the "anaerobic" time interval.

After solving for both, I then check if τ has changed more than 1 µsec. It probably has, since I started assuming it was zero, so I iterate.

To iterate I now assume the value of τ (AWC/CP) I just calculated and find the point in the aerobic range which maximizes CP. This is equivalent of scaling the curve of work versus duration to touch one the most prominent point in the aerobic range. Here it is far less likely to be the point at 10 minutes: points of higher work and longer duration may be more prominent depending on how large the estimate of AWC/CP.

Then I assume this value of CP and find again the anaerobic point which maximizes τ (or AWC). This is the same as I did the first iteration.

I simply repeat this procedure until from one iteration to the next τ changes by less than 1 µsec, or after 100 iterations in which case I give up. In reality, it typically takes less than 10 iterations to converge.

The following sequence of plots show an example using the "toy" data I presented in the previous post. It shows data only out to 20 minutes, not 60, so assume for purposes of this example maximal work above 20 minutes increases relative slowly and the data don't contribute to the extraction.

First I define anaerobic and aerobic regions:

step 1

Then I assume AWC = 0 and solve for CP. This is equivalent to finding the line of maximum slope passing through the origin and a point in the "aerobic" range.

step 2

Then I move the curve up as far as I can while still passing through a point in the "anaerbic" region. This y-intercept is now AWC.

step 3

Then I multiply the curve by the largest scale factor (less than one) which allows it to still pass through a point in the aerobic region. This is equivalent to keeping a constant AWC/CP. I could just as well have assumed a constant AWC, in which case I would have pivoted the curve about its y-intercept.

step 4

Time for another iteration on AWC: slide the curve up to catch the most prominent point in the anaerobic regime:

step 5

And repeat these steps until the CP curve stops moving significantly:

final convergence

What's the primary weakness of this process? It's probably those missing points between 6 minutes and 10 minutes. It's possible that points in this range will fall above the critical power curve, proving the critical power curve is the wrong curve. So to correct for this, it would be possible to increase AWC or CP to bring the curve above the points in this range. But which do you increase? That's not clear, so a better solution is for a rider to increase his supply of quality data in the 1-6 minute and/or the 10+ minute range. To try and guess the best way to reconsile the points in the 6 to 10 minute range would potentially give virtually meaningless results. For example, the correction might result in a substantial overestimation of AWC with a compensating underestimation of CP.

The other issue is the rider needs to have at least one quality point in each of the two ranges: the anaerobic range from 1 to 6 minutes, and the aerobic range from 10 minutes to an hour. If there all you do are 20 minute climbs, then you're going to overestimate your CP and underestimate your AWC. On the other hand if all you do are 5 minute intervals, you'll overestimate AWC and underestimate CP. This leads to the counterintuitive result that you absolutely nail a 5 minute effort and CP drops. Since CP is used in Goldencheetah to derive power zones, the result may the power for each zone decreases similar to what you would expect with detraining. I believe this is part of the reason Andrew Coggan doesn't recommend using a derived CP value for power zone determination: he prefers 1 hour power, or 20 minute power. But in Golden Cheetah the CP value derived from the maximal power curve is not automatically used for power zone determination: the user has to request that it be used.

So the method is far from perfect, but no method is perfect. I think it provides the real advantage that one can still use those race-like efforts to contribute to CP extraction, even if they don't have efforts perfectly aligned with arbitrary values used in some CP-extraction spreadsheet.

Tuesday, August 3, 2010

CP model parameters from maximal power curve: introduction

GoldenCheetahThe critical power model is a very simple approach to estimating the amount of power one can produce in a given activity for different durations. For example in my experience it is most often applied to cycling. What I describe here I implemented in GoldenCheetah, an open source power data management program written in C++.

The model's assumption is there are two components to power:
  1. an anaerobic work component: The body has a certain amount of anaerbic fuel which it can use to produce power. Spending that fuel in a short time results in more average power, spending it over more time results in less average power. For steady anaerobic power, the product of the power and the duration it can be sustained equals the anaeronic work capacity (AWC) for the given individual at the given time.
  2. aerobic power: In addition to anaerobic power, there is a certain amount of "aerobic" power which can be sustained indefinitely.
Obviously this model breaks down at both short and long times. At short times, for example less than a minute, it becomes impossible to reach an anaerobic power high enough to "spend" the entire AWC. On the other hand for long efforts the aerobic power is no longer sustainable. Despite this, for efforts from around 2 minutes up to around 30 minutes the model does a fairly good job while still being simple enough for doing calculations in your head while on the bike with a bit of practice.

For example, if my CP = 260 W, and AWC = 20 kJ, if I'm riding for 200 seconds, the model predicts I can sustain 100 W over my CP, or 360 W.

But the question is then what values to use for CP and AWC. There exist a large number of web apps and spreadsheets to do the simple calculation: given a power derived from a short-time test (for example 5 minutes) and a longer-time test (for example 20 minutes) it's simple to fit a slope and intercept to work done versus 1/interval length to get CP and AWC.

But the problem is these spreadsheets require you to have a maximal effort at each of two precisely defined durations. This is difficult in practice: you need to guess what effort is sustainable for the target duration, and hope you can hold that effort for the full duration and no further. If you start too hard, you'll run out of steam before the finish (unable to sustain even CP), while if you start too slowly, you may end up finishing with too much left in the tank.

Suppose I go out and try to hold 300 watts, which is over my critical power. I'm not sure at the start how long I'll be able to keep it going: maybe 10 minutes, maybe 20. But at some point, no matter how hard I try to motivate myself, i am done. Then a few days later I go out and try to sustain 400 watts. That obviously doesn't last as long. Now I have a set of data comprising high powers for short durations (up to the duration of my latter effort), then moderate powers for durations of to that of the first effort. Since neither of these efforts was truly uniform, there is are different max sustained powers for each possible effort duration.

Or more typically I may go out and ride hard or race and hard efforts are randomly distributed among recovery segments. Certain durations end up with relatively high maximal powers, while others end up with relatively low maximal powers. The following plot shows an early example from my days of power meter use.

typical maximal power data

One approach which has been taken with data such as these is to do a regression: for each duration, determine the maximum work done during that duration (as opposed to maximal power), then over some set of durations (for example, from 3 minutes to 30 minutes) fit a line. The slope is then CP, the intercept AWC. However, a regression results in some data falling above the regression line, others below. Yet by definition no points should fall above the curve. The CP model represents the best possible effort for each duration, not a typical effort.

regression of maximal power data

So instead the goal is to come up with a line which touches the data at two or more points but above which none of the points lie. Think about it this way: suppose the values of maximum work done for each time duration form a surface, and I drop a meter stick onto that surface. It rests against the surface, likely at two points. The goal is to find the two points.

The following example shows how the same set of data can yield either of two fits. So the solution to the problem I pose is not intrinsically unique. I need to make some sort of assumptions to choose between the two. In one case, the fit results in a higher AWC and lower CP, in the other case, a lower AWC and higher CP. This is a pathological example, of course, and given a reasonably rich data set, the ambiguities will be far more subtle.

multiple solution example

I'll describe my algorithm next time.

Monday, August 2, 2010

Berner 15-T derailleur pulley upgrade: an analytic model

A lot of fuss was made in the Tour about the Berner SRAM derailleur upgrades used by Alberto Contador and Andy Schleck. By going from 11 teeth to 15 teeth on the lower rear pulley, the chain bends less upon entry and exit to the pulley while the pulley additionally turns more slowly. Each of these effects reduces drivetrain losses, and that means more of the power to the pedals goes to the road instead of to heating up the bike and air.

Berner modification to a Saxo Bank Specialized SL3Berner mod to a Red rear derailleur on a Team Saxo Bank SL/3 (BikeRadar)

SRAM has evaluated this and claims the results are inconclusive. So much for experimental data: what's a model show?

I spent several posts looking at a drivetrain model. I ended up with the following:
Ploss = (K / L) P (1 / Nf + 1 / Nr) + C T0 K (1 + Nf/Nr + Nf [ 1 / Ndt + 1 / Ndb ] ) + Kd C Nf [ 1 / Ndt + 1 / Ndb ] / 2

where I define:

Ploss = power lost to drivetrain,
Nf = chainring teeth,
Nr = cog teeth,
Ndb = bottom pulley teeth,
Ndt = top pulley teeth, and
C = cadence.

I used the constants:

K/L = 0.265,
T0 K = 0.322 J.

A key parameter is Kd. I previously derived:

Kd = 94 mJ/rev for Shimano Dura-Ace
Kd = 2.4 mJ/rev for CeramicSpeed pulleys

or using data measured by Mark Kelly:

Kd = 37 mJ/rev (standard bearings)
Kd = 6.4 mJ/rev (high quality steel bearings)

Another Red derailleur modification available from Dark Albert with 15-tooth pulley

I assume everyone uses the best ceramic bearings before even considering going to a Berner modification. So I'll use Kd = 2.4 mJ/rev.

The savings are calculated from the loss equation:

ΔP = C ( T0 K + Kd / 2) Nf ( 1 / 11 ‒ 1 / 15 ),

where if I assume C = 1.5 rev/second (90 rev/min), I get 0.48 watts for the 39-tooth ring and 0.66 watts for the 53 tooth ring. Bigger ring at the same cadence means the chain is moving through the pulleys faster. Note this calculation is for swapping one pulley, so going from 11-11 to 11-15 or 15-11, for example. Swapping both pulleys will yield a proportionally larger improvement.

Are these savings worth it? I assumed 300 W steady power, so the savings is around 0.2% of total power with this model. Of course, all of the savings are lost if the Berner pulley doesn't spin as well as your 11T pulley, or if you don't keep your drivetrain meticulously clean you'll squander any savings from this hefty investment.

But it does appear the benefit is real, if small.

Of course if the pulleys are clogged with dirt, things may be different. In the limit of an infinitely-mucked-up chain (T0 very large), the 15-toother saves 10% of lost power in a 53/23. So maybe it's the option of choice for cyclocross, mountain biking, or other races in the mud.