module Data.Drasil.Equations.Defining.Derivations where

import Language.Drasil (ExprC(..), LiteralC(..), ModelExpr, vec2D)
import qualified Data.Drasil.Quantities.Math as QM (unitVectj)
import qualified Data.Drasil.Quantities.Physics as QP (acceleration, gravitationalAccel, weight)
import qualified Data.Drasil.Quantities.PhysicalProperties as QPP (density,
  mass, specWeight, vol)

-- * Weight equation derivation
weightDerivAccelEqn, weightDerivNewtonEqn, weightDerivReplaceMassEqn, weightDerivSpecWeightEqn :: ModelExpr
weightDerivNewtonEqn :: ModelExpr
weightDerivNewtonEqn      = DefinedQuantityDict -> ModelExpr
forall c. (IsChunk c, HasSymbol c) => c -> ModelExpr
forall r c. (ExprC r, IsChunk c, HasSymbol c) => c -> r
sy DefinedQuantityDict
QP.weight ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
$= DefinedQuantityDict -> ModelExpr
forall c. (IsChunk c, HasSymbol c) => c -> ModelExpr
forall r c. (ExprC r, IsChunk c, HasSymbol c) => c -> r
sy DefinedQuantityDict
QPP.mass ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
$* DefinedQuantityDict -> ModelExpr
forall c. (IsChunk c, HasSymbol c) => c -> ModelExpr
forall r c. (ExprC r, IsChunk c, HasSymbol c) => c -> r
sy DefinedQuantityDict
QP.gravitationalAccel
weightDerivReplaceMassEqn :: ModelExpr
weightDerivReplaceMassEqn = DefinedQuantityDict -> ModelExpr
forall c. (IsChunk c, HasSymbol c) => c -> ModelExpr
forall r c. (ExprC r, IsChunk c, HasSymbol c) => c -> r
sy DefinedQuantityDict
QP.weight ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
$= DefinedQuantityDict -> ModelExpr
forall c. (IsChunk c, HasSymbol c) => c -> ModelExpr
forall r c. (ExprC r, IsChunk c, HasSymbol c) => c -> r
sy DefinedQuantityDict
QPP.density ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
$* DefinedQuantityDict -> ModelExpr
forall c. (IsChunk c, HasSymbol c) => c -> ModelExpr
forall r c. (ExprC r, IsChunk c, HasSymbol c) => c -> r
sy DefinedQuantityDict
QPP.vol ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
$* DefinedQuantityDict -> ModelExpr
forall c. (IsChunk c, HasSymbol c) => c -> ModelExpr
forall r c. (ExprC r, IsChunk c, HasSymbol c) => c -> r
sy DefinedQuantityDict
QP.gravitationalAccel
weightDerivSpecWeightEqn :: ModelExpr
weightDerivSpecWeightEqn  = DefinedQuantityDict -> ModelExpr
forall c. (IsChunk c, HasSymbol c) => c -> ModelExpr
forall r c. (ExprC r, IsChunk c, HasSymbol c) => c -> r
sy DefinedQuantityDict
QP.weight ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
$= DefinedQuantityDict -> ModelExpr
forall c. (IsChunk c, HasSymbol c) => c -> ModelExpr
forall r c. (ExprC r, IsChunk c, HasSymbol c) => c -> r
sy DefinedQuantityDict
QPP.vol ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
$* DefinedQuantityDict -> ModelExpr
forall c. (IsChunk c, HasSymbol c) => c -> ModelExpr
forall r c. (ExprC r, IsChunk c, HasSymbol c) => c -> r
sy DefinedQuantityDict
QPP.specWeight
weightDerivAccelEqn :: ModelExpr
weightDerivAccelEqn = DefinedQuantityDict -> ModelExpr
forall c. (IsChunk c, HasSymbol c) => c -> ModelExpr
forall r c. (ExprC r, IsChunk c, HasSymbol c) => c -> r
sy DefinedQuantityDict
QP.acceleration ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
$= ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
vec2D (Integer -> ModelExpr
forall r. LiteralC r => Integer -> r
exactDbl Integer
0) (DefinedQuantityDict -> ModelExpr
forall c. (IsChunk c, HasSymbol c) => c -> ModelExpr
forall r c. (ExprC r, IsChunk c, HasSymbol c) => c -> r
sy DefinedQuantityDict
QP.gravitationalAccel ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
$* DefinedQuantityDict -> ModelExpr
forall c. (IsChunk c, HasSymbol c) => c -> ModelExpr
forall r c. (ExprC r, IsChunk c, HasSymbol c) => c -> r
sy DefinedQuantityDict
QM.unitVectj)