1996 Olympic Velodrome Curve Design

Design by:
Chris Nadovich, Project Engineer
J. Thomas Associates

Background

The velodrome at the 1996 Olympic Games in Atlanta was designed with Mathematica to facilitate simple setup and takedown. The 75-ton steel structure contains 236 unique sections that "snap'' together quickly to form a perfectly closed loop. All calculations of the track's shape—based on Fresnel integrals—and component specifications were done entirely in Mathematica.

Notes from the designer Chris Nadovich.

General Specifications

For specifications used below, lengths are in feet and angles are in radians. We use the Degree constant to specify degree-based angles and Meter to specify metric lengths.

Meter = 3.280839895;

Here is the desired lengths of the transition, turn radius, and straightaway, all in feet. For the purpose of this exercise, they will be specified as constants.

\(TransLength = 90; 
FinalRadius = 65; 
StraightLength = 60; \)

The Curve

A shape often used for a roadway curve is a straight line and a circle linked by a transition easement curve. The easement is in the shape of a  Cornu spiral. We begin our curve definition by creating a tangent angle function of arc length. This function is important for orienting sections that are tangent and normal to the roadway.

Tangent Angle

Since the tangent angle is the integral of curvature, the following tangent angle function is associated with the Cornu spiral, which has linear curvature which increases with arc length.

\(a = 1\/\(FinalRadius\ TransLength\); 

    Transφ[s_] := \(a\ s\^2\)\/2\)

This function pieces together the straight, Cornu, and circular turn sections giving tangent angle for the first quarter of the track. (This is actually the tangent angle minus 90 degrees, to be precise.)

\(Qφ[s_] := 
\ \ 
      If[s < StraightLength, 0, 
\ \ \ \ 
        If[s < \((StraightLength + TransLength)\), 
\ \ \ \ \ \ \ \ 
          Transφ[s - StraightLength], 
\ \ \ \ \ \ \ \ 
          Transφ[TransLength] + 
            \((s - StraightLength - TransLength)\)\/FinalRadius]]\)

The length of the circular turn section is a function of the length of the transition. The more transition — the less circular turn.

CircleLength = 
      FinalRadius ((π/2)  -  Transφ[TransLength]) // N;

And from all of the above, we can compute the arclength of one-fourth the whole track.

QuarterLength = StraightLength + TransLength + CircleLength;

For a 4-way symmetric track, it will be handy to have a function that maps a quarter of the track into the whole track.

WrapS[s_] := 
      If[Mod[s, 4 QuarterLength] ≠ s, 
        WrapS[Mod[s, 4 QuarterLength]], 
        If[s < QuarterLength, s, 
          If[s < 2 QuarterLength, 2 QuarterLength - s, 
            If[s < 3 QuarterLength, s - 2 QuarterLength, 
              4 QuarterLength - s]]]]

For the whole track, ϕ is given by:

ϕ[s_] := 
      If[s < QuarterLength, Qφ[s], 
        If[s < 2 QuarterLength, 
          N[π - Qφ[2 QuarterLength - s]], 
          If[s < 3 QuarterLength, 
            N[π + Qφ[s - 2 QuarterLength]], 
            N[2 π - Qφ[4 QuarterLength - s]]]]]

One lap is 360 degrees. The angle is constant in the two straightaways and varies as a linear ramp in the circular turns. The easements round off the corners.

Plot[(180/π) ϕ[s], {s,  0,  4 QuarterLength}]

Spiral Coordinates

The parametric X and Y coordinate functions of arc length for the Cornu spiral give the X/Y pole-line coordinates in the transition sections. These are  Fresnel Integrals which are somewhat slow to compute. We use an interpolation function as an approximation, however, making our coordinate lookups a lot faster.

The coorinate origin is a bit nutty initially — the origin is at the start of the transition in turn 1, with positive y in the direction of riding and parallel to the long track axis; positive x is toward the inside of the track.

\(TransitionX = 
      Interpolation[
        Table[{b, NIntegrate[Sin[\(a\ t\^2\)\/2], {t, 0, b}]}, {b, 0, 
            TransLength + 4, 1}]]; 


    TransitionY = 
      Interpolation[
        Table[{b, NIntegrate[Cos[\(a\ t\^2\)\/2], {t, 0, b}]}, {b, 0, 
            TransLength + 4, 1}]]; \)

The straightaway is straight, of course.

\(StraightX[s_] := 0
\)StraightY[s_] := s - StraightLength

The circular turn centerpoint is computed relative to the end of the transition.

\(CenterX = 
      N[TransitionX[TransLength] + 
          FinalRadius\ Cos[Transφ[TransLength]]]; 


    CenterY = 
      N[TransitionY[TransLength] - 
          FinalRadius\ Sin[Transφ[TransLength]]]; \)

From the coordinates of the center of the circular turn, we can compute the coordinates of the poll line on that portion of the track.

\(CircleX[s_] := 
      CenterX - 
        FinalRadius\ Cos[s\/FinalRadius + Transφ[TransLength]]
		
    \)CircleY[s_] := 
      CenterY + 
        FinalRadius Sin[(s/FinalRadius) + Transφ[TransLength]]

Piecing everything together, here is the poll line coordinate function that works for a quarter lap of the track.

OffsetInnerXY[s_] := 
      If[s < StraightLength, {StraightX[s], StraightY[s]}, 
        If[s < StraightLength + TransLength, {
            TransitionX[s - StraightLength], 
            TransitionY[s - StraightLength]}, {
            CircleX[s - StraightLength - TransLength], 
            CircleY[s - StraightLength - TransLength]}]]

ParametricPlot[
      OffsetInnerXY[s], {s, -StraightLength, QuarterLength}, 
      AxesOrigin -> {-10, 0}, AspectRatio -> 1, 
      PlotRange -> {{-120, 120}, {-120, 120}}, 
      Frame -> True, Axes -> False, GridLines -> Automatic, 
      Compiled -> False, PlotStyle -> {Thickness[0.052], Hue[0.82]}]

Now, let's fix up the origin to make it the center of the track. Positive y will be in the direction of riding and parallel to the long axis, and x will point to the outside of the track. This will make z point up into the air.

\(StartOIXY = OffsetInnerXY[0]; 


    EndOIXY = OffsetInnerXY[QuarterLength]; 


    CenteredInnerXY[s_] := 
      \(({First[EndOIXY], Last[StartOIXY]} - OffsetInnerXY[s])\)\ {1, \(-1\)}
          \)

ParametricPlot[
      CenteredInnerXY[s], {s, -StraightLength, QuarterLength}, 
      AspectRatio -> 1, 
      PlotRange -> {{-150, 150}, {-100, 200}}, 
      Frame -> True, GridLines -> Automatic, 
      Compiled -> False, PlotStyle -> {Thickness[0.052], Hue[0.82]}]

And finally, we make this function work for the whole track.

InnerXY[s_] := 
      If[s < QuarterLength, CenteredInnerXY[s], 
        If[s < 2 QuarterLength, {-1, 1} 
            CenteredInnerXY[2 QuarterLength - s], 
          If[s < 3 QuarterLength, {-1, -1} 
              CenteredInnerXY[s - 2 QuarterLength], {1, -1} 
              CenteredInnerXY[4 QuarterLength - s]]]]

Here's our first look at the shape of the pole line.

ParametricPlot[InnerXY[s], {s, 0, 4 QuarterLength}, 
      AspectRatio -> 1, 
      PlotStyle -> {Thickness[0.025], RGBColor[0.7, 0, 0.7]}, 
      PlotRange -> {{-200, 200}, {-200, 200}}, 
      Compiled -> False]

Notes

Cornu spiral

The spiral of Cornu (also known as a clothoid) is a fascinating curve that can be defined parametrically using Fresnel integrals.

Cornu[ν_, α_, t_] := 
      α (∫_0
            ^t){Sin[((x^(ν + 1))/(ν + 1))], 
              Cos[((x^(ν + 1))/(ν + 1))]} \[DifferentialD]x

Cornu[1, α, t]

And here is a plot of the spiral of Cornu (the first clothoid).

ParametricPlot[Evaluate[Cornu[1, 1, t]], {t, -10, 10}, 
      AspectRatio -> Automatic, Frame -> True, Axes -> False, 
      PlotStyle -> {Hue[0]}]

Back to ``The Curve.''

Notes from the designer:
Key features of Mathematica used for the Olympic Velodrome.

Multidimensional Symbolic Arrays

Every one of the approximately 20,000 unique pieces of steel tubing was specified in Mathematica by a multidimensional data structure that gave the piece's shape, as well as its position, and orientation in 3D. Some of the entries in this data structure were numerical, but some were symbolic. For example, the diameter of the tubing was known numerically, in advance, but neither the number of tubes, nor their position nor other dimensions (including angles for triple mitered end-cuts) were known. These unknowns were specified symbolically.

Our venue considerations (overall shape and size), cycling ridability considerations, and mechanical fabrication design ideas were then incorporated to constrain and link the positions of the pieces into an overall model. This was done, in large measure, by applying symbolic manipulations from analytic geometry to the basic pieces. Essentially, I cut, lifted, rotated, and translated the 75 tons of steel using symbolic coordinate transforms and other algebraic techniques. I can say from personal experience that lifting a 24 foot steel beam with a coordinate transform is a lot easier than lifting it by hand.

Non-linear Equation Solving

The resulting hybrid symbolic/numerical model of the track resulted in a system of thousands of non-linear equations that would be impossible for a human to cast, let alone solve. However, in Mathematica, I was never forced to arbitrarily break up the problem into separate symbolic and numerical problems. I could leave the problem statement and constraints in their natural form and let the machine do the algebraic spadework as needed.

My method to use symbolic equations became essential when, during the course of the project, various constraints had to be changed. Since my Mathematica code contained no a priori numerical reductions of symbolic constraints, I was able to quickly and easily recast the problem and solve it again.

Embedded Graphics

Another feature of Mathematica that I used to great advantage was the ability to embed dynamically computed graphics along with the model. At various crucial places within the track model, I added notes and graphics that monitored various parameters of the track (e.g. lengths, angles, curves, and even some 3D renderings) for the purpose of quality assurance. If I varied an input constraint in such a way that caused the overall design to vary in a strange, unexpected way, I was able to quickly pinpoint the cause of the behavior by scanning through the graphs of intermediate results that I scattered through the notebook.

Interpolation Functions

Some of the equations that described the track were impossible to solve analytically and slow to solve numerically. To avoid this potential roadblock, I made liberal use of the Interpolation function feature of Mathematica to create quick-to-compute, invertable interpolation functions that were (within my tolerances) numerically identical to the functions they modeled. For example, the Fresnel integrals that were the basis of the velodrome curve are expensive to compute. They can be transformed into invertable, relatively inexpensive interpolation functions like so:

CurveX = 
      Interpolation[
        Table[{b, NIntegrate[Sin[((a (t^2))/2)], {t, 0, b}]}, {b, -L, L, 
            dl}]];

With proper choice of dl, these interpolation functions, CurveX[t] becomes a fast, accurate replacement for the real Fresnel integral. This feature of Mathematica alone reduced the overall computation time by several orders of magnitude, without sacrificing any significant accuracy. Often, people complain that symbolic math engines can leave you high and dry when your problem reduces to a symbolically or numerically intractable form; I found that with Mathematica the tools were always there to get me out of any jam I created for myself.

Flexible Output Formatting

The final result of the calculations performed by Mathematica was a completely numerical specification of every unique piece of steel in the track. The flexible output formatting capabilities of Mathematica were used to produce output in the form of multidimensional 3D-face lists. These lists were input directly into a CAD application to conveniently produce mechanical fabrication drawings.

I should emphasize that unlike the way mechanical design is usually done today, the CAD application was not used to layout the track surface in any way or perform any dimensional calculations. Its use was restricted solely to final quality assurance, adding official drawing borders, notes, labels, and title blocks, and producing the final official plotter rendering. In a sense, Mathematica served as an automated CAD operator; it translated my high level engineering design into a specific and complete, part-by-part set of blueprints---the work normally done by a human designer.

Image of the Velodrome under Construction

Back to top