Example: Design EFH Jump¶
The following page describes how to construct an example constant equivalent
fall height ski jump landing surface using the skijumpdesign
API. Make sure to install the library first.
Approach¶
Start by creating a 25 meter length of an approach path (also called the
in-run) which is flat and has a downward slope angle of 20 degrees. The
resulting surface can be visualized with the
plot()
method.
from skijumpdesign import FlatSurface
approach_ang = -np.deg2rad(20) # radians
approach_len = 25.0 # meters
approach = FlatSurface(approach_ang, approach_len)
approach.plot()
(Source code, png, hires.png, pdf)
Now that a surface has been created, a skier can be created. The skier can
“ski” along the approach surface using the
slide_on()
method which generates a skiing
simulation trajectory.
from skijumpdesign import Skier
skier = Skier()
approach_traj = skier.slide_on(approach)
approach_traj.plot_time_series()
Approach-Takeoff Transition¶
The approach-takeoff transition is constructed with a clothoid-circle-clothoid-flat surface to transition from the parent slope angle to the desired takeoff angle, in this case 15 degrees.
from skijumpdesign import TakeoffSurface
takeoff_entry_speed = skier.end_speed_on(approach)
takeoff_ang = np.deg2rad(15)
takeoff = TakeoffSurface(skier, approach_ang, takeoff_ang,
takeoff_entry_speed, init_pos=approach.end)
ax = approach.plot()
takeoff.plot(ax=ax)
(Source code, png, hires.png, pdf)
The trajectory of the skier on the takeoff can be examined also.
takeoff_traj = skier.slide_on(takeoff, takeoff_entry_speed)
takeoff_traj.plot_time_series()
Flight¶
Once the skier leaves the takeoff ramp at the maximum (design) speed they will
be in flight. The fly_to()
method can be used
to simulate this longest flight trajectory.
takeoff_vel = skier.end_vel_on(takeoff, init_speed=takeoff_entry_speed)
flight = skier.fly_to(approach, init_pos=takeoff.end,
init_vel=takeoff_vel)
flight.plot_time_series()
The design speed flight trajectory can be plotted as an extension of the approach and takeoff surfaces.
ax = approach.plot()
ax = takeoff.plot(ax=ax)
flight.plot(ax=ax, color='#9467bd')
(Source code, png, hires.png, pdf)
Landing Transition¶
The final part of this step is to determine the landing transition curve (shown in red below) which connects the optimum (cheapest) constant EFH landing surface to the parent slope. There are an infinite number of landing surfaces that satisfy the EFH differential equation and provide the desired equivalent fall height. The algorithm selects the one of these that is closest to the parent slope, and hence is least expensive to build (in terms of snow volume), but which still is able to transition back to the parent slope with slope continuity and simultaneously is constrained to experience limited normal acceleration.
from skijumpdesign import LandingTransitionSurface
fall_height = 0.5
landing_trans = LandingTransitionSurface(approach,
flight, fall_height, skier.tolerable_landing_acc)
ax = approach.plot()
ax = takeoff.plot(ax=ax)
ax = flight.plot(ax=ax, color='#9467bd')
landing_trans.plot(ax=ax, color='#d62728')
(Source code, png, hires.png, pdf)
Constant EFH Landing¶
Finally, the cheapest equivalent fall height landing surface (shown in green below) can be calculated. This surface is continuous in slope with the landing transition surface at the impact point. It accommodates all takeoff speeds below the maximum takeoff (design) speed above.
from skijumpdesign import LandingSurface
slope = FlatSurface(approach_ang, np.sqrt(landing_trans.end[0]**2 +
landing_trans.end[1]**2) + 1.0)
landing = LandingSurface(skier, takeoff.end, takeoff_ang,
landing_trans.start, fall_height,
surf=slope)
ax = approach.plot()
ax = takeoff.plot(ax=ax)
ax = flight.plot(ax=ax, color='#9467bd')
ax = landing_trans.plot(ax=ax, color='#d62728')
landing.plot(ax=ax, color='#2ca02c')
(Source code, png, hires.png, pdf)
The design calculates a landing surface shape that produces a constant
equivalent fall height. This can be verified using the
calculate_efh()
function that
calculates the equivalent fall height for the surface that was produced. See
the analyze jump page to learn more about this function.
from skijumpdesign.functions import plot_efh
dist, efh, speeds = landing.calculate_efh(takeoff_ang, takeoff.end,
skier, increment=1.0)
plot_efh(landing, np.rad2deg(takeoff_ang), takeoff.end, increment=1.0)
(Source code, png, hires.png, pdf)
Entire Jump¶
There is also convenience function for plotting the jump:
from skijumpdesign import plot_jump
plot_jump(slope, approach, takeoff, landing, landing_trans, flight)
(Source code, png, hires.png, pdf)