{-# LANGUAGE PostfixOperators #-}
module Drasil.DblPendulum.IMods (iMods, angularAccelIM_1, angularAccelIM_2) where
import Prelude hiding (cos, sin)
import Language.Drasil
import Theory.Drasil
import Utils.Drasil (weave)
import qualified Language.Drasil.Sentence.Combinators as S
import Drasil.DblPendulum.Expressions (angularAccelExpr_1, angularAccelExpr_2,
forceDerivExpr1, forceDerivExpr2,
cosAngleExpr1, sinAngleExpr1, cosAngleExpr2, sinAngleExpr2)
import Drasil.DblPendulum.Derivations (angularAccelDerivEqns)
import Drasil.DblPendulum.Unitals (pendDisAngle_1, pendDisAngle_2, lenRod_1, lenRod_2,
massObj_1, massObj_2, angularAccel_1, angularAccel_2, angularVel_1, angularVel_2)
import Drasil.DblPendulum.GenDefs (xForceGD_2, yForceGD_2, xForceGD_1, yForceGD_1, accelXGD_1, accelXGD_2, accelYGD_1, accelYGD_2)
iMods :: [InstanceModel]
iMods :: [InstanceModel]
iMods = [InstanceModel
angularAccelIM_1, InstanceModel
angularAccelIM_2]
angularAccelDerivSents :: [Sentence]
angularAccelDerivSents :: [Sentence]
angularAccelDerivSents = [Sentence
angularAccelDerivSent1, Sentence
EmptyS, Sentence
angularAccelDerivSent2, Sentence
EmptyS, Sentence
angularAccelDerivSent3,
Sentence
angularAccelDerivSent4, Sentence
EmptyS, Sentence
angularAccelDerivSent5, Sentence
angularAccelDerivSent6]
angularAccelDerivSent1, angularAccelDerivSent2, angularAccelDerivSent3,
angularAccelDerivSent4, angularAccelDerivSent5, angularAccelDerivSent6 :: Sentence
angularAccelDerivSent1 :: Sentence
angularAccelDerivSent1 = [Sentence] -> Sentence
foldlSentCol [String -> Sentence
S "By solving equations" Sentence -> Sentence -> Sentence
+:+ GenDefn -> Sentence
forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence
refS GenDefn
xForceGD_2 Sentence -> Sentence -> Sentence
`S.and_` GenDefn -> Sentence
forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence
refS GenDefn
yForceGD_2
Sentence -> Sentence -> Sentence
`S.for` ModelExpr -> Sentence
eS ModelExpr
PExpr
forceDerivExpr1 Sentence -> Sentence -> Sentence
`S.and_` ModelExpr -> Sentence
eS ModelExpr
PExpr
forceDerivExpr2 Sentence -> Sentence -> Sentence
`S.and_` String -> Sentence
S "then substituting into eqaution" Sentence -> Sentence -> Sentence
+:+
GenDefn -> Sentence
forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence
refS GenDefn
xForceGD_1 Sentence -> Sentence -> Sentence
`S.and_` GenDefn -> Sentence
forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence
refS GenDefn
yForceGD_1 Sentence -> Sentence -> Sentence
+:+ String -> Sentence
S ", We can get equations 1 and 2"]
angularAccelDerivSent2 :: Sentence
angularAccelDerivSent2 = [Sentence] -> Sentence
foldlSentCol [String -> Sentence
S "Multiply the equation 1 by" Sentence -> Sentence -> Sentence
+:+
ModelExpr -> Sentence
eS ModelExpr
PExpr
cosAngleExpr1 Sentence -> Sentence -> Sentence
`S.and_` String -> Sentence
S "the equation 2 by" Sentence -> Sentence -> Sentence
+:+ ModelExpr -> Sentence
eS ModelExpr
PExpr
sinAngleExpr1 Sentence -> Sentence -> Sentence
`S.and_`
String -> Sentence
S "rearrange to get"]
angularAccelDerivSent3 :: Sentence
angularAccelDerivSent3 = String -> Sentence
S "This leads to the equation 3"
angularAccelDerivSent4 :: Sentence
angularAccelDerivSent4 = [Sentence] -> Sentence
foldlSentCol[String -> Sentence
S "Next, multiply equation" Sentence -> Sentence -> Sentence
+:+ GenDefn -> Sentence
forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence
refS GenDefn
xForceGD_2 Sentence -> Sentence -> Sentence
+:+ String -> Sentence
S "by" Sentence -> Sentence -> Sentence
+:+
ModelExpr -> Sentence
eS ModelExpr
PExpr
cosAngleExpr2 Sentence -> Sentence -> Sentence
`S.and_` String -> Sentence
S "equation" Sentence -> Sentence -> Sentence
+:+ GenDefn -> Sentence
forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence
refS GenDefn
yForceGD_2 Sentence -> Sentence -> Sentence
+:+ String -> Sentence
S "by" Sentence -> Sentence -> Sentence
+:+
ModelExpr -> Sentence
eS ModelExpr
PExpr
sinAngleExpr2 Sentence -> Sentence -> Sentence
`S.and_` String -> Sentence
S "rearrange to get"]
angularAccelDerivSent5 :: Sentence
angularAccelDerivSent5 = String -> Sentence
S "which leads to equation 4"
angularAccelDerivSent6 :: Sentence
angularAccelDerivSent6 = [Sentence] -> Sentence
foldlSentCol[String -> Sentence
S "By giving equations" Sentence -> Sentence -> Sentence
+:+ GenDefn -> Sentence
forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence
refS GenDefn
accelXGD_1 Sentence -> Sentence -> Sentence
`S.and_` GenDefn -> Sentence
forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence
refS GenDefn
accelXGD_2 Sentence -> Sentence -> Sentence
`S.and_`
GenDefn -> Sentence
forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence
refS GenDefn
accelYGD_1 Sentence -> Sentence -> Sentence
`S.and_` GenDefn -> Sentence
forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence
refS GenDefn
accelYGD_2 Sentence -> Sentence -> Sentence
+:+
String -> Sentence
S "plus additional two equations, 3 and 4, we can get" Sentence -> Sentence -> Sentence
+:+ InstanceModel -> Sentence
forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence
refS InstanceModel
angularAccelIM_1 Sentence -> Sentence -> Sentence
`S.and_`
InstanceModel -> Sentence
forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> Sentence
refS InstanceModel
angularAccelIM_2 Sentence -> Sentence -> Sentence
+:+ String -> Sentence
S "via a computer algebra program"]
angularAccelIM_1 :: InstanceModel
angularAccelIM_1 :: InstanceModel
angularAccelIM_1 = ModelKind Expr
-> Inputs
-> Output
-> OutputConstraints
-> Maybe Derivation
-> String
-> [Sentence]
-> InstanceModel
imNoRefs ModelKind Expr
angularAccelMK_1
[UnitalChunk -> RealInterval Expr Expr -> Input
forall q.
(Quantity q, MayHaveUnit q) =>
q -> RealInterval Expr Expr -> Input
qwC UnitalChunk
lenRod_1 (RealInterval Expr Expr -> Input)
-> RealInterval Expr Expr -> Input
forall a b. (a -> b) -> a -> b
$ (Inclusive, Expr) -> RealInterval Expr Expr
forall b a. (Inclusive, b) -> RealInterval a b
UpFrom (Inclusive
Exc, Integer -> Expr
forall r. LiteralC r => Integer -> r
exactDbl 0),
UnitalChunk -> RealInterval Expr Expr -> Input
forall q.
(Quantity q, MayHaveUnit q) =>
q -> RealInterval Expr Expr -> Input
qwC UnitalChunk
lenRod_2 (RealInterval Expr Expr -> Input)
-> RealInterval Expr Expr -> Input
forall a b. (a -> b) -> a -> b
$ (Inclusive, Expr) -> RealInterval Expr Expr
forall b a. (Inclusive, b) -> RealInterval a b
UpFrom (Inclusive
Exc, Integer -> Expr
forall r. LiteralC r => Integer -> r
exactDbl 0),
UnitalChunk -> RealInterval Expr Expr -> Input
forall q.
(Quantity q, MayHaveUnit q) =>
q -> RealInterval Expr Expr -> Input
qwC UnitalChunk
massObj_1 (RealInterval Expr Expr -> Input)
-> RealInterval Expr Expr -> Input
forall a b. (a -> b) -> a -> b
$ (Inclusive, Expr) -> RealInterval Expr Expr
forall b a. (Inclusive, b) -> RealInterval a b
UpFrom (Inclusive
Exc, Integer -> Expr
forall r. LiteralC r => Integer -> r
exactDbl 0),
UnitalChunk -> RealInterval Expr Expr -> Input
forall q.
(Quantity q, MayHaveUnit q) =>
q -> RealInterval Expr Expr -> Input
qwC UnitalChunk
massObj_2 (RealInterval Expr Expr -> Input)
-> RealInterval Expr Expr -> Input
forall a b. (a -> b) -> a -> b
$ (Inclusive, Expr) -> RealInterval Expr Expr
forall b a. (Inclusive, b) -> RealInterval a b
UpFrom (Inclusive
Exc, Integer -> Expr
forall r. LiteralC r => Integer -> r
exactDbl 0),
UnitalChunk -> Input
forall q. (Quantity q, MayHaveUnit q) => q -> Input
qwUC UnitalChunk
pendDisAngle_1,
UnitalChunk -> Input
forall q. (Quantity q, MayHaveUnit q) => q -> Input
qwUC UnitalChunk
pendDisAngle_2]
(UnitalChunk -> Output
forall q. (Quantity q, MayHaveUnit q) => q -> Output
qw UnitalChunk
angularAccel_1) [(Inclusive, Expr) -> RealInterval Expr Expr
forall b a. (Inclusive, b) -> RealInterval a b
UpFrom (Inclusive
Exc, Integer -> Expr
forall r. LiteralC r => Integer -> r
exactDbl 0)]
Maybe Derivation
forall a. Maybe a
Nothing "calOfAngularAcceleration1" []
angularAccelMK_1 :: ModelKind Expr
angularAccelMK_1 :: ModelKind Expr
angularAccelMK_1 = String -> NP -> QDefinition Expr -> ModelKind Expr
forall e. String -> NP -> QDefinition e -> ModelKind e
equationalModel "angularAccelerationIM1"
(String -> NP
nounPhraseSP "calculation of angular acceleration") QDefinition Expr
angularAccelFD_1
angularAccelFD_1 :: SimpleQDef
angularAccelFD_1 :: QDefinition Expr
angularAccelFD_1 = UnitalChunk -> [UnitalChunk] -> Expr -> QDefinition Expr
forall c i e.
(Quantity c, MayHaveUnit c, HasSpace c, Quantity i, HasSpace i) =>
c -> [i] -> e -> QDefinition e
mkFuncDefByQ UnitalChunk
angularAccel_1
[UnitalChunk
pendDisAngle_1, UnitalChunk
pendDisAngle_2, UnitalChunk
angularVel_1, UnitalChunk
angularVel_2] Expr
PExpr
angularAccelExpr_1
angularAccelIM_2 :: InstanceModel
angularAccelIM_2 :: InstanceModel
angularAccelIM_2 = ModelKind Expr
-> Inputs
-> Output
-> OutputConstraints
-> Maybe Derivation
-> String
-> [Sentence]
-> InstanceModel
imNoRefs ModelKind Expr
angularAccelMK_2
[UnitalChunk -> RealInterval Expr Expr -> Input
forall q.
(Quantity q, MayHaveUnit q) =>
q -> RealInterval Expr Expr -> Input
qwC UnitalChunk
lenRod_1 (RealInterval Expr Expr -> Input)
-> RealInterval Expr Expr -> Input
forall a b. (a -> b) -> a -> b
$ (Inclusive, Expr) -> RealInterval Expr Expr
forall b a. (Inclusive, b) -> RealInterval a b
UpFrom (Inclusive
Exc, Integer -> Expr
forall r. LiteralC r => Integer -> r
exactDbl 0),
UnitalChunk -> RealInterval Expr Expr -> Input
forall q.
(Quantity q, MayHaveUnit q) =>
q -> RealInterval Expr Expr -> Input
qwC UnitalChunk
lenRod_2 (RealInterval Expr Expr -> Input)
-> RealInterval Expr Expr -> Input
forall a b. (a -> b) -> a -> b
$ (Inclusive, Expr) -> RealInterval Expr Expr
forall b a. (Inclusive, b) -> RealInterval a b
UpFrom (Inclusive
Exc, Integer -> Expr
forall r. LiteralC r => Integer -> r
exactDbl 0),
UnitalChunk -> RealInterval Expr Expr -> Input
forall q.
(Quantity q, MayHaveUnit q) =>
q -> RealInterval Expr Expr -> Input
qwC UnitalChunk
massObj_1 (RealInterval Expr Expr -> Input)
-> RealInterval Expr Expr -> Input
forall a b. (a -> b) -> a -> b
$ (Inclusive, Expr) -> RealInterval Expr Expr
forall b a. (Inclusive, b) -> RealInterval a b
UpFrom (Inclusive
Exc, Integer -> Expr
forall r. LiteralC r => Integer -> r
exactDbl 0),
UnitalChunk -> RealInterval Expr Expr -> Input
forall q.
(Quantity q, MayHaveUnit q) =>
q -> RealInterval Expr Expr -> Input
qwC UnitalChunk
massObj_2 (RealInterval Expr Expr -> Input)
-> RealInterval Expr Expr -> Input
forall a b. (a -> b) -> a -> b
$ (Inclusive, Expr) -> RealInterval Expr Expr
forall b a. (Inclusive, b) -> RealInterval a b
UpFrom (Inclusive
Exc, Integer -> Expr
forall r. LiteralC r => Integer -> r
exactDbl 0),
UnitalChunk -> Input
forall q. (Quantity q, MayHaveUnit q) => q -> Input
qwUC UnitalChunk
pendDisAngle_1,
UnitalChunk -> Input
forall q. (Quantity q, MayHaveUnit q) => q -> Input
qwUC UnitalChunk
pendDisAngle_2]
(UnitalChunk -> Output
forall q. (Quantity q, MayHaveUnit q) => q -> Output
qw UnitalChunk
angularAccel_2) [(Inclusive, Expr) -> RealInterval Expr Expr
forall b a. (Inclusive, b) -> RealInterval a b
UpFrom (Inclusive
Exc, Integer -> Expr
forall r. LiteralC r => Integer -> r
exactDbl 0)]
(Derivation -> Maybe Derivation
forall a. a -> Maybe a
Just Derivation
angularAccelDeriv_2) "calOfAngularAcceleration2" []
angularAccelMK_2 :: ModelKind Expr
angularAccelMK_2 :: ModelKind Expr
angularAccelMK_2 = String -> NP -> QDefinition Expr -> ModelKind Expr
forall e. String -> NP -> QDefinition e -> ModelKind e
equationalModel "angularAccelerationIM2"
(String -> NP
nounPhraseSP "calculation of angular acceleration") QDefinition Expr
angularAccelFD_2
angularAccelFD_2 :: SimpleQDef
angularAccelFD_2 :: QDefinition Expr
angularAccelFD_2 = UnitalChunk -> [UnitalChunk] -> Expr -> QDefinition Expr
forall c i e.
(Quantity c, MayHaveUnit c, HasSpace c, Quantity i, HasSpace i) =>
c -> [i] -> e -> QDefinition e
mkFuncDefByQ UnitalChunk
angularAccel_2
[UnitalChunk
pendDisAngle_1, UnitalChunk
pendDisAngle_2, UnitalChunk
angularVel_1, UnitalChunk
angularVel_2] Expr
PExpr
angularAccelExpr_2
angularAccelDeriv_2 :: Derivation
angularAccelDeriv_2 :: Derivation
angularAccelDeriv_2 = Sentence -> [Sentence] -> Derivation
mkDerivName (UnitalChunk -> Sentence
forall n. (HasUID n, NamedIdea n) => n -> Sentence
phrase UnitalChunk
pendDisAngle_2) ([[Sentence]] -> [Sentence]
forall a. [[a]] -> [a]
weave [[Sentence]
angularAccelDerivSents, (ModelExpr -> Sentence) -> [ModelExpr] -> [Sentence]
forall a b. (a -> b) -> [a] -> [b]
map ModelExpr -> Sentence
eS [ModelExpr]
angularAccelDerivEqns])