parachuteHat.frink

Download or view parachuteHat.frink in plain text format

/** This is a 2-dimensional ballistics / aerospace simulation that accurately
    models air resistance (using the U.S. Standard Atmosphere as implemented
    in StandardAtmosphere.frink ) and the curvature of the earth (in 2
    dimensions.)  It is based on the more general-purpose ballistics2D.frink

    It can be used to model anything from orbital decay to hypervelocity meteor
    impacts to orbital decay due to atmosphere.

    This calculates the effect that a parachute hat would have on slowing a fall.

    The variant meteorCrater.frink 
    models a hypervelocity impactor for Meteor Crater, Arizona and shows
    the huge amount of energy radiated by pushing through atmosphere.
*/


use StandardAtmosphere.frink

// h is height above ground (initial height)
h = 80 m

// m1 is the mass of the person plus parachute
m1 = 140 lb

// Cd is drag coefficient of parachute
Cd = 1

// Size of parachute
parachuteDiameter = 5 feet
parachuteRadius = parachuteDiameter/2
area = pi parachuteRadius^2

// Initial velocity in the x direction (horizontal)
vx = 0 m/s

// Initial velocity in the y direction (vertical, positive is up)
vy = 0 m/s

// We're on Earth
planetmass = earthmass
r = earthradius

// Thickness of his silly little shoes
shoeThickness = 6 inches

// x and y are a cartesian coordinate system with the center of the planet
// at x=0 m, y=0 m.  The projectile typically begins its journey at x=0 and
// at a given height-above-ground.
x = 0 m
y = r + h

initialGeopotentialHeight = (r * h) / (r + h)
//println["Geopotential height = " + (geopotentialHeight -> "ft")]
initialGeopotentialEnergy = m1 gravity initialGeopotentialHeight

initialKineticEnergy = 1/2 m1 sqrt[vx^2 + vy^2]^2

timestep = .1 s

t = 0 s

// Energy lost to drag
Edrag = 0 J

do
{
   // l is distance from center of earth
   l2 = x^2 + y^2
   l = sqrt[l2]
   h = l - r

   // Angle with respect to center of the earth
   alpha = arctan[x,y]

   // Force due to gravity
   fg = - G m1 planetmass / l2

   // Acceleration due to gravity
   ag =  fg / m1
   agx = ag sin[alpha]
   agy = ag cos[alpha]

   // Calculate total velocity
   v2 = vx^2 + vy^2
   v = sqrt[v2]

   // Angle of travel (0 is in x direction, 90 degrees in y direction)
   theta = arctan[vy, vx]

   [temp, pressure] = StandardAtmosphere.getTemperatureAndPressure[h]
   density = StandardAtmosphere.getDensity[h, temp, pressure]

   // Force of drag
   fdrag = 1/2 density v2 Cd area

   // Acceleration due to drag
   adrag =  -fdrag / m1
   adragx = adrag cos[theta]
   adragy = adrag sin[theta]

   t = t + timestep

   // Total acceleration
   axtotal = agx + adragx
   aytotal = agy + adragy
   atotal = sqrt[axtotal^2 + aytotal^2]

   // Change in velocity over timestep
   dvx = axtotal timestep
   dvy = aytotal timestep
   vx = vx + dvx
   vy = vy + dvy

   // Change in position over timestep
   dx = vx timestep
   dy = vy timestep
   x = x + dx
   y = y + dy

   // Energy lost to drag
   // E = f * d = f * v * t
   dragpow = fdrag v
   Edrag = Edrag + fdrag v timestep

   // Calculate equivalent height (diminished by weakening gravity with height)
   geopotentialHeight = (r * h) / (r + h)
   geopotentialEnergy = m1 gravity geopotentialHeight

   kineticEnergy = 1/2 m1 (vx^2 + vy^2)

   totalEnergy = geopotentialEnergy + kineticEnergy

   println[format[t,"s",2] + "\t" + format[h,"m",2] + "\t" + format[adrag,"gee",3] + "\t" + format[v,"mph",3] + "\t" + format[Edrag, "J", 3] + "\t" + format[dragpow,"W", 3]]
} while h >= 0 ft

initialEnergy = initialGeopotentialEnergy + initialKineticEnergy
equivHeight = 1/2  v^2 / gravity
impactAccel = 1/2 v^2 / shoeThickness

println[]
println["Initial potential energy = $initialGeopotentialEnergy"]
println["Initial kinetic energy   = $initialKineticEnergy"]
println["Final kinetic energy     = " + (1/2 m1 v2)]
println["Initial energy           = " + initialEnergy]
println["Energy lost to drag      = $Edrag"]
println["Fraction of energy lost to drag = " + format[Edrag / initialEnergy, "percent", 4]]
println["Final velocity is equivalent to falling from " + formatFix[equivHeight, "m", 2]]
println["Final impact acceleration due to shoes: " + formatFix[impactAccel, "gee", 2]]


Download or view parachuteHat.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 20217 days, 23 hours, 34 minutes ago.