-- | Assigns symbols and units (quantities) to physical concepts.
module Data.Drasil.Quantities.Physics where

import Language.Drasil
import Language.Drasil.Display
import Language.Drasil.ShortHands
import qualified Data.Drasil.Concepts.Physics as CP (acceleration, angAccel,
  angDisp, angVelo, chgInVelocity, constAccel, constAccelV, displacement,
  distance, energy, fSpeed, fVel, force, frequency, gravitationalAccel, gravitationalConst,
  height, iPos, iSpeed, ixSpeed, iySpeed, iVel, impulseS, impulseV, ixPos, ixVel, iyPos, iyVel,
  kEnergy, linAccel, linDisp, linVelo, momentOfInertia, position, potEnergy,
  pressure, restitutionCoef, scalarAccel, scalarPos, speed, time, torque,
  velocity, weight, xAccel, xConstAccel, xDist, xPos, xVel, yAccel, yConstAccel, yDist, 
  yPos, yVel, momentum, moment, fOfGravity, positionVec, tension, angFreq, period, frequency, chgMomentum)

import Data.Drasil.SI_Units (joule, metre, newton, pascal, radian, second, hertz)
import Data.Drasil.Units.Physics (accelU, angAccelU, angVelU, gravConstU, 
    impulseU, momtInertU, torqueU, velU)

restitutionCoef :: DefinedQuantityDict
restitutionCoef :: DefinedQuantityDict
restitutionCoef = ConceptChunk -> Symbol -> Space -> DefinedQuantityDict
dqdNoUnit ConceptChunk
CP.restitutionCoef (Symbol -> Symbol -> Symbol
sub Symbol
cC (String -> Symbol
label "R")) Space
Real

-- | Collects all physical quantities defined in this file for easy use in Drasil.
physicscon :: [UnitalChunk]
physicscon :: [UnitalChunk]
physicscon = [UnitalChunk
acceleration, UnitalChunk
angularAccel, UnitalChunk
angularDisplacement, UnitalChunk
angularVelocity,
  UnitalChunk
chgInVelocity, UnitalChunk
constAccel, UnitalChunk
constAccelV, UnitalChunk
displacement, UnitalChunk
distance, UnitalChunk
energy, UnitalChunk
frequency,
  UnitalChunk
fSpeed, UnitalChunk
fVel, UnitalChunk
force, UnitalChunk
gravitationalAccel, UnitalChunk
gravitationalConst, UnitalChunk
height, UnitalChunk
iPos,
  UnitalChunk
iSpeed, UnitalChunk
ixSpeed, UnitalChunk
iySpeed, UnitalChunk
iVel, UnitalChunk
impulseS, UnitalChunk
impulseV, UnitalChunk
ixPos, UnitalChunk
ixVel, UnitalChunk
iyPos, UnitalChunk
iyVel, UnitalChunk
kEnergy,
  UnitalChunk
linearAccel, UnitalChunk
linearDisplacement, UnitalChunk
linearVelocity, UnitalChunk
momentOfInertia, UnitalChunk
position,
  UnitalChunk
potEnergy, UnitalChunk
pressure, UnitalChunk
scalarAccel, UnitalChunk
scalarPos, UnitalChunk
speed, UnitalChunk
time, UnitalChunk
torque, UnitalChunk
velocity,
  UnitalChunk
weight, UnitalChunk
xAccel, UnitalChunk
xConstAccel, UnitalChunk
xDist, UnitalChunk
xPos, UnitalChunk
xVel, UnitalChunk
yAccel, UnitalChunk
yConstAccel, UnitalChunk
yDist,
  UnitalChunk
yPos, UnitalChunk
yVel,UnitalChunk
momentum, UnitalChunk
moment, UnitalChunk
moment2D, UnitalChunk
fOfGravity, UnitalChunk
positionVec, UnitalChunk
tension,
  UnitalChunk
angularFrequency, UnitalChunk
period, UnitalChunk
frequency, UnitalChunk
chgMomentum]

-- * Physical Quantities (With Units)

acceleration, angularAccel, angularDisplacement, angularVelocity, chgInVelocity,
  constAccel, constAccelV, displacement, distance, energy, fSpeed, fVel, force,
  gravitationalAccel, gravitationalConst, height, iPos, iSpeed, ixSpeed, iySpeed,
  iVel, impulseS, impulseV, ixPos, ixVel, iyPos, iyVel, kEnergy, linearAccel, 
  linearDisplacement, linearVelocity, momentOfInertia, position, potEnergy, 
  pressure, scalarAccel, scalarPos, speed, time, torque, velocity, weight, xAccel, 
  xConstAccel, xDist, xPos, xVel, yAccel, yConstAccel, yDist, yPos, 
  yVel, momentum, moment, moment2D, fOfGravity, positionVec, tension, angularFrequency, 
  period, frequency, chgMomentum :: UnitalChunk

acceleration :: UnitalChunk
acceleration         = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.acceleration (Symbol -> Symbol
vec Symbol
lA) UnitDefn
accelU
angularAccel :: UnitalChunk
angularAccel         = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.angAccel Symbol
lAlpha UnitDefn
angAccelU
angularDisplacement :: UnitalChunk
angularDisplacement  = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.angDisp Symbol
lTheta UnitDefn
radian
angularFrequency :: UnitalChunk
angularFrequency     = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.angFreq Symbol
cOmega UnitDefn
second
angularVelocity :: UnitalChunk
angularVelocity      = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.angVelo Symbol
lOmega UnitDefn
angVelU
chgInVelocity :: UnitalChunk
chgInVelocity        = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.chgInVelocity (Decoration -> Symbol -> Symbol
Atop Decoration
Delta (Symbol -> Symbol) -> Symbol -> Symbol
forall a b. (a -> b) -> a -> b
$ Symbol -> Symbol
vec Symbol
lV) UnitDefn
velU
constAccel :: UnitalChunk
constAccel           = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.constAccel (Symbol -> Symbol -> Symbol
sup Symbol
lA Symbol
lC) UnitDefn
accelU
displacement :: UnitalChunk
displacement         = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.displacement (Symbol -> Symbol
vec Symbol
lU) UnitDefn
metre
distance :: UnitalChunk
distance             = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.distance Symbol
lD UnitDefn
metre
energy :: UnitalChunk
energy               = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.energy Symbol
cE UnitDefn
joule
force :: UnitalChunk
force                = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.force (Symbol -> Symbol
vec Symbol
cF) UnitDefn
newton
frequency :: UnitalChunk
frequency            = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.frequency Symbol
lF UnitDefn
hertz
gravitationalAccel :: UnitalChunk
gravitationalAccel   = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.gravitationalAccel (Symbol -> Symbol
vec Symbol
lG) UnitDefn
accelU
gravitationalConst :: UnitalChunk
gravitationalConst   = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.gravitationalConst Symbol
cG UnitDefn
gravConstU
height :: UnitalChunk
height               = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.height Symbol
lH UnitDefn
metre
impulseS :: UnitalChunk
impulseS             = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.impulseS Symbol
lJ UnitDefn
impulseU
impulseV :: UnitalChunk
impulseV             = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.impulseV (Symbol -> Symbol
vec Symbol
cJ) UnitDefn
impulseU
kEnergy :: UnitalChunk
kEnergy              = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.kEnergy  ([Symbol] -> Symbol
Concat [Symbol
cK, Symbol
cE]) UnitDefn
joule
linearAccel :: UnitalChunk
linearAccel          = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.linAccel ([Symbol] -> Symbol
Concat [Symbol -> Symbol
vec Symbol
lA, String -> Symbol
label "(", Symbol
lT, String -> Symbol
label ")"]) UnitDefn
accelU
linearDisplacement :: UnitalChunk
linearDisplacement   = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.linDisp  ([Symbol] -> Symbol
Concat [Symbol -> Symbol
vec Symbol
lU, String -> Symbol
label "(", Symbol
lT, String -> Symbol
label ")"]) UnitDefn
metre
linearVelocity :: UnitalChunk
linearVelocity       = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.linVelo  ([Symbol] -> Symbol
Concat [Symbol -> Symbol
vec Symbol
lV, String -> Symbol
label "(", Symbol
lT, String -> Symbol
label ")"]) UnitDefn
velU
momentOfInertia :: UnitalChunk
momentOfInertia      = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.momentOfInertia (Symbol -> Symbol
vec Symbol
cI) UnitDefn
momtInertU
chgMomentum :: UnitalChunk
chgMomentum          = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.chgMomentum ([Symbol] -> Symbol
Concat [Symbol
cDelta,Symbol -> Symbol
vec Symbol
cP]) UnitDefn
impulseU
momentum :: UnitalChunk
momentum             = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.momentum (Symbol -> Symbol
vec Symbol
cP) UnitDefn
impulseU
moment :: UnitalChunk
moment               = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.moment   (Symbol -> Symbol
vec Symbol
cM) UnitDefn
torqueU
moment2D :: UnitalChunk
moment2D             = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.moment   Symbol
cM       UnitDefn
torqueU
-- FIXME: moment2D should eventually be a specialization of moment, not separately defined
period :: UnitalChunk
period               = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.period Symbol
cT UnitDefn
second
position :: UnitalChunk
position             = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.position (Symbol -> Symbol
vec Symbol
lP) UnitDefn
metre
positionVec :: UnitalChunk
positionVec          = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.positionVec (Symbol -> Symbol
vec Symbol
lR) UnitDefn
metre
potEnergy :: UnitalChunk
potEnergy            = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.potEnergy ([Symbol] -> Symbol
Concat [Symbol
cP, Symbol
cE]) UnitDefn
joule
pressure :: UnitalChunk
pressure             = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.pressure Symbol
lP UnitDefn
pascal
speed :: UnitalChunk
speed                = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.speed Symbol
lV UnitDefn
velU
scalarAccel :: UnitalChunk
scalarAccel          = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.scalarAccel Symbol
lA UnitDefn
accelU
scalarPos :: UnitalChunk
scalarPos            = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.scalarPos Symbol
lP UnitDefn
metre
tension :: UnitalChunk
tension              = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.tension (Symbol -> Symbol
vec Symbol
cT) UnitDefn
newton
time :: UnitalChunk
time                 = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.time Symbol
lT UnitDefn
second
torque :: UnitalChunk
torque               = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.torque (Symbol -> Symbol
vec Symbol
lTau) UnitDefn
torqueU
velocity :: UnitalChunk
velocity             = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.velocity (Symbol -> Symbol
vec Symbol
lV) UnitDefn
velU
weight :: UnitalChunk
weight               = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.weight Symbol
cW UnitDefn
newton
fOfGravity :: UnitalChunk
fOfGravity           = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.fOfGravity (Symbol -> Symbol -> Symbol
sub (Symbol -> Symbol
vec Symbol
cF) (Symbol -> Symbol
vec Symbol
lG)) UnitDefn
newton

-- Variants of distance, speed, and scalar acceleration
-- FIXME: Add variants of vector forms?
-- FIXME: Pull out commonalities?

xDist :: UnitalChunk
xDist = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.xDist (Symbol -> Symbol
subX Symbol
lR) UnitDefn
metre
yDist :: UnitalChunk
yDist = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.yDist (Symbol -> Symbol
subY Symbol
lR) UnitDefn
metre

iPos :: UnitalChunk
iPos = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.iPos (Symbol -> Symbol -> Symbol
sup Symbol
lP Symbol
initial) UnitDefn
metre
xPos :: UnitalChunk
xPos = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.xPos (Symbol -> Symbol
subX Symbol
lP) UnitDefn
metre
yPos :: UnitalChunk
yPos = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.yPos (Symbol -> Symbol
subY Symbol
lP) UnitDefn
metre

ixPos :: UnitalChunk
ixPos = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.ixPos (Symbol -> Symbol -> Symbol
sup (Symbol -> Symbol
subX Symbol
lP) Symbol
initial) UnitDefn
metre
iyPos :: UnitalChunk
iyPos = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.iyPos (Symbol -> Symbol -> Symbol
sup (Symbol -> Symbol
subY Symbol
lP) Symbol
initial) UnitDefn
metre

fSpeed :: UnitalChunk
fSpeed = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.fSpeed (Symbol -> Symbol -> Symbol
sup Symbol
lV Symbol
final) UnitDefn
velU
iSpeed :: UnitalChunk
iSpeed = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.iSpeed (Symbol -> Symbol -> Symbol
sup Symbol
lV Symbol
initial) UnitDefn
velU

ixSpeed :: UnitalChunk
ixSpeed = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.ixSpeed (Symbol -> Symbol -> Symbol
sub Symbol
lU Symbol
initial) UnitDefn
velU -- temporary use for avoiding having too many superscripts
iySpeed :: UnitalChunk
iySpeed = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.iySpeed (Symbol -> Symbol -> Symbol
sub Symbol
lW Symbol
initial) UnitDefn
velU -- temporary use for avoiding having too many superscripts

fVel :: UnitalChunk
fVel = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.fVel (Symbol -> Symbol -> Symbol
sup (Symbol -> Symbol
vec Symbol
lV) Symbol
final) UnitDefn
velU
iVel :: UnitalChunk
iVel = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.iVel (Symbol -> Symbol -> Symbol
sup (Symbol -> Symbol
vec Symbol
lV) Symbol
initial) UnitDefn
velU
xVel :: UnitalChunk
xVel = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.xVel (Symbol -> Symbol
subX Symbol
lV) UnitDefn
velU
yVel :: UnitalChunk
yVel = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.yVel (Symbol -> Symbol
subY Symbol
lV) UnitDefn
velU

ixVel :: UnitalChunk
ixVel = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.ixVel (Symbol -> Symbol -> Symbol
sup (Symbol -> Symbol
subX Symbol
lV) Symbol
initial) UnitDefn
velU
iyVel :: UnitalChunk
iyVel = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.iyVel (Symbol -> Symbol -> Symbol
sup (Symbol -> Symbol
subY Symbol
lV) Symbol
initial) UnitDefn
velU

xAccel :: UnitalChunk
xAccel = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.xAccel (Symbol -> Symbol
subX Symbol
lA) UnitDefn
accelU
yAccel :: UnitalChunk
yAccel = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.yAccel (Symbol -> Symbol
subY Symbol
lA) UnitDefn
accelU

constAccelV :: UnitalChunk
constAccelV = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.constAccelV (Symbol -> Symbol -> Symbol
sup (Symbol -> Symbol
vec  Symbol
lA) Symbol
constant) UnitDefn
accelU
xConstAccel :: UnitalChunk
xConstAccel = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.xConstAccel (Symbol -> Symbol -> Symbol
sup (Symbol -> Symbol
subX Symbol
lA) Symbol
constant) UnitDefn
accelU
yConstAccel :: UnitalChunk
yConstAccel = ConceptChunk -> Symbol -> UnitDefn -> UnitalChunk
forall c u.
(Concept c, IsUnit u) =>
c -> Symbol -> u -> UnitalChunk
uc ConceptChunk
CP.yConstAccel (Symbol -> Symbol -> Symbol
sup (Symbol -> Symbol
subY Symbol
lA) Symbol
constant) UnitDefn
accelU

constant, final, initial :: Symbol
constant :: Symbol
constant = String -> Symbol
label "c"
final :: Symbol
final    = String -> Symbol
label "f"
initial :: Symbol
initial  = String -> Symbol
label "i"

-- * Helpers

-- Helpers for common modifiers
subMax, subMin, subX, subY, subZ, supMax, supMin :: Symbol -> Symbol
subMax :: Symbol -> Symbol
subMax s :: Symbol
s = Symbol -> Symbol -> Symbol
sub Symbol
s (String -> Symbol
label "max")
subMin :: Symbol -> Symbol
subMin s :: Symbol
s = Symbol -> Symbol -> Symbol
sub Symbol
s (String -> Symbol
label "min")
subX :: Symbol -> Symbol
subX   s :: Symbol
s = Symbol -> Symbol -> Symbol
sub Symbol
s (String -> Symbol
label "x")
subY :: Symbol -> Symbol
subY   s :: Symbol
s = Symbol -> Symbol -> Symbol
sub Symbol
s (String -> Symbol
label "y")
subZ :: Symbol -> Symbol
subZ   s :: Symbol
s = Symbol -> Symbol -> Symbol
sub Symbol
s (String -> Symbol
label "z")
supMax :: Symbol -> Symbol
supMax s :: Symbol
s = Symbol -> Symbol -> Symbol
sup Symbol
s (String -> Symbol
label "max")
supMin :: Symbol -> Symbol
supMin s :: Symbol
s = Symbol -> Symbol -> Symbol
sup Symbol
s (String -> Symbol
label "min")

-- * Constants

gravitationalConstValue :: ConstQDef
gravitationalConstValue :: ConstQDef
gravitationalConstValue = UnitalChunk -> Literal -> ConstQDef
forall c e. (Quantity c, MayHaveUnit c) => c -> e -> QDefinition e
mkQuantDef UnitalChunk
gravitationalConst (Double -> Literal
forall r. LiteralC r => Double -> r
dbl 6.6743E-11)
--(dbl 6.673 * 10E-11)
--(dbl 0.00000000006673)
gravitationalAccelConst :: ConstQDef
gravitationalAccelConst :: ConstQDef
gravitationalAccelConst = UnitalChunk -> Literal -> ConstQDef
forall c e. (Quantity c, MayHaveUnit c) => c -> e -> QDefinition e
mkQuantDef UnitalChunk
gravitationalAccel (Double -> Literal
forall r. LiteralC r => Double -> r
dbl 9.8)