{-# LANGUAGE PostfixOperators #-}
module Drasil.PDController.IModel where

import Data.Drasil.Quantities.Physics (time)
import Drasil.PDController.Assumptions
import Drasil.PDController.Concepts
import Drasil.PDController.DataDefs
import Drasil.PDController.GenDefs
import Drasil.PDController.References
import Drasil.PDController.TModel
import Language.Drasil
import Theory.Drasil (InstanceModel, im, qwC, newDEModel')
import Utils.Drasil (weave)
import Language.Drasil.Chunk.Concept.NamedCombinators
import qualified Language.Drasil.Sentence.Combinators as S
import Drasil.PDController.Unitals

instanceModels :: [InstanceModel]
instanceModels :: [InstanceModel]
instanceModels = [InstanceModel
imPD]

----------------------------------------------

imPD :: InstanceModel
imPD :: InstanceModel
imPD
  = ModelKind Expr
-> Inputs
-> Output
-> OutputConstraints
-> [DecRef]
-> Maybe Derivation
-> String
-> [Sentence]
-> InstanceModel
im (DifferentialModel -> ModelKind Expr
forall e. DifferentialModel -> ModelKind e
newDEModel' DifferentialModel
imPDRC)
      [Output -> RealInterval Expr Expr -> Input
forall q.
(Quantity q, MayHaveUnit q) =>
q -> RealInterval Expr Expr -> Input
qwC Output
qdSetPointTD (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), Output -> RealInterval Expr Expr -> Input
forall q.
(Quantity q, MayHaveUnit q) =>
q -> RealInterval Expr Expr -> Input
qwC Output
qdPropGain (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),
       Output -> RealInterval Expr Expr -> Input
forall q.
(Quantity q, MayHaveUnit q) =>
q -> RealInterval Expr Expr -> Input
qwC Output
qdDerivGain (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)]
      (Output -> Output
forall q. (Quantity q, MayHaveUnit q) => q -> Output
qw Output
qdProcessVariableTD)
      [(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)]
      [Citation -> DecRef
forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> DecRef
dRef Citation
abbasi2015, Citation -> DecRef
forall r.
(HasUID r, HasRefAddress r, HasShortName r) =>
r -> DecRef
dRef Citation
johnson2008]
      (Derivation -> Maybe Derivation
forall a. a -> Maybe a
Just Derivation
imDeriv)
      "pdEquationIM"
      []

imPDRC :: DifferentialModel
imPDRC :: DifferentialModel
imPDRC
  = UnitalChunk
-> ConstrConcept
-> [CoeffDeriv]
-> Expr
-> String
-> NP
-> Sentence
-> DifferentialModel
makeLinear
      UnitalChunk
time
      ConstrConcept
opProcessVariable
      [Integer -> Expr
forall r. LiteralC r => Integer -> r
exactDbl 1 Expr -> Int -> CoeffDeriv
$* 2,
      (Integer -> Expr
forall r. LiteralC r => Integer -> r
exactDbl 1 Expr -> Expr -> Expr
forall r. ExprC r => r -> r -> r
`addRe` Output -> Expr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdDerivGain) Expr -> Int -> CoeffDeriv
$* 1,
      (Integer -> Expr
forall r. LiteralC r => Integer -> r
exactDbl 20 Expr -> Expr -> Expr
forall r. ExprC r => r -> r -> r
`addRe` Output -> Expr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdPropGain) Expr -> Int -> CoeffDeriv
$* 0]
      (Expr -> Expr
forall r. ExprC r => r -> r
neg (Output -> Expr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdSetPointTD) Expr -> Expr -> Expr
forall r. ExprC r => r -> r -> r
`mulRe` Output -> Expr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdPropGain)
      "imPDRC"
      (String -> NP
nounPhraseSP "Computation of the Process Variable as a function of time")
      Sentence
EmptyS

imDeriv :: Derivation
imDeriv :: Derivation
imDeriv
  = Sentence -> [Sentence] -> Derivation
mkDerivName (ConceptChunk -> Sentence
forall n. (HasUID n, NamedIdea n) => n -> Sentence
phrase ConceptChunk
processVariable)
      ([[Sentence]] -> [Sentence]
forall a. [[a]] -> [a]
weave [[Sentence]
imDerivStmts, (ModelExpr -> Sentence) -> [ModelExpr] -> [Sentence]
forall a b. (a -> b) -> [a] -> [b]
map ModelExpr -> Sentence
eS [ModelExpr]
imDerivEqns])

imDerivStmts :: [Sentence]
imDerivStmts :: [Sentence]
imDerivStmts = [Sentence
derivStmt1, Sentence
derivStmt2, Sentence
derivStmt3, Sentence
derivStmt4]

imDerivEqns :: [ModelExpr]
imDerivEqns :: [ModelExpr]
imDerivEqns = [ModelExpr
derivEqn1, ModelExpr
derivEqn2, ModelExpr
derivEqn3, ModelExpr
derivEqn4]

derivStmt1 :: Sentence
derivStmt1 :: Sentence
derivStmt1
  = [Sentence] -> Sentence
foldlSent
      [NP -> Sentence
forall n. NounPhrase n => n -> Sentence
atStartNP (ConceptChunk -> NP
forall t. NamedIdea t => t -> NP
the ConceptChunk
processVariable), Output -> Sentence
forall t. Express t => t -> Sentence
eS' Output
qdProcessVariableFD, String -> Sentence
S "in a", ConceptChunk -> Sentence
forall n. (HasUID n, NamedIdea n) => n -> Sentence
phrase ConceptChunk
pidCL Sentence -> Sentence -> Sentence
+:+
         String -> Sentence
S "is the product of the", ConceptChunk -> Sentence
forall n. (HasUID n, NamedIdea n) => n -> Sentence
phrase ConceptChunk
processError, DataDefinition -> Sentence
forall r. (Referable r, HasShortName r) => r -> Sentence
fromSource DataDefinition
ddErrSig Sentence -> Sentence -> Sentence
`sC`
         ConceptChunk -> Sentence
forall n. (HasUID n, NamedIdea n) => n -> Sentence
phrase ConceptChunk
controlVariable, DataDefinition -> Sentence
forall r. (Referable r, HasShortName r) => r -> Sentence
fromSource DataDefinition
ddCtrlVar Sentence -> Sentence -> Sentence
`sC` Sentence
EmptyS
         Sentence -> Sentence -> Sentence
`S.andThe` ConceptChunk -> Sentence
forall n. (HasUID n, NamedIdea n) => n -> Sentence
phrase ConceptChunk
powerPlant, GenDefn -> Sentence
forall r. (Referable r, HasShortName r) => r -> Sentence
fromSource GenDefn
gdPowerPlant]

derivEqn1 :: ModelExpr
derivEqn1 :: ModelExpr
derivEqn1
  = Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdProcessVariableFD
      ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
$= (Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdSetPointFD ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
$- Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdProcessVariableFD)
      ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`mulRe` (Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdPropGain ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`addRe` (Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdDerivGain ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`mulRe` Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdFreqDomain))
      ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`mulRe` ModelExpr -> ModelExpr
forall r. (ExprC r, LiteralC r) => r -> r
recip_ (ModelExpr -> ModelExpr
forall r. (ExprC r, LiteralC r) => r -> r
square (Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdFreqDomain) ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`addRe` Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdFreqDomain ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`addRe` Integer -> ModelExpr
forall r. LiteralC r => Integer -> r
exactDbl 20)

derivStmt2 :: Sentence
derivStmt2 :: Sentence
derivStmt2 = (String -> Sentence
S "Substituting the values and rearranging the equation" Sentence -> Sentence
!.)

derivEqn2 :: ModelExpr
derivEqn2 :: ModelExpr
derivEqn2
  = ModelExpr -> ModelExpr
forall r. (ExprC r, LiteralC r) => r -> r
square (Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdFreqDomain) ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`mulRe` Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdProcessVariableFD
      ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`addRe` ((Integer -> ModelExpr
forall r. LiteralC r => Integer -> r
exactDbl 1 ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`addRe` Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdDerivGain) ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`mulRe` Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdProcessVariableFD ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`mulRe` Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdFreqDomain)
      ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`addRe` ((Integer -> ModelExpr
forall r. LiteralC r => Integer -> r
exactDbl 20 ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`addRe` Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdPropGain) ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`mulRe` Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdProcessVariableFD)
      ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
$- (Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdSetPointFD ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`mulRe` Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdFreqDomain ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`mulRe` Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdDerivGain)
      ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
$- (Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdSetPointFD ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`mulRe` Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdPropGain) ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
$= Integer -> ModelExpr
forall r. LiteralC r => Integer -> r
exactDbl 0

derivStmt3 :: Sentence
derivStmt3 :: Sentence
derivStmt3
  = String -> Sentence
S "Computing the" Sentence -> Sentence -> Sentence
+:+ Output -> Sentence
forall n. (HasUID n, NamedIdea n) => n -> Sentence
phrase Output
qdInvLaplaceTransform Sentence -> Sentence -> Sentence
+:+
     TheoryModel -> Sentence
forall r. (Referable r, HasShortName r) => r -> Sentence
fromSource TheoryModel
tmInvLaplace Sentence -> Sentence -> Sentence
+:+. String -> Sentence
S "of the equation"

derivEqn3 :: ModelExpr
derivEqn3 :: ModelExpr
derivEqn3
  = ModelExpr -> UnitalChunk -> ModelExpr
forall r c. (ModelExprC r, HasUID c, HasSymbol c) => r -> c -> r
deriv (ModelExpr -> UnitalChunk -> ModelExpr
forall r c. (ModelExprC r, HasUID c, HasSymbol c) => r -> c -> r
deriv (Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdProcessVariableTD) UnitalChunk
time) UnitalChunk
time ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`addRe`
      (((Integer -> ModelExpr
forall r. LiteralC r => Integer -> r
exactDbl 1 ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`addRe` Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdDerivGain) ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`mulRe` ModelExpr -> UnitalChunk -> ModelExpr
forall r c. (ModelExprC r, HasUID c, HasSymbol c) => r -> c -> r
deriv (Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdProcessVariableTD) UnitalChunk
time)
      ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`addRe` ((Integer -> ModelExpr
forall r. LiteralC r => Integer -> r
exactDbl 20 ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`addRe` Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdPropGain) ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`mulRe` Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdProcessVariableTD))
      ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
$- (Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdDerivGain ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`mulRe` ModelExpr -> UnitalChunk -> ModelExpr
forall r c. (ModelExprC r, HasUID c, HasSymbol c) => r -> c -> r
deriv (Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdSetPointTD) UnitalChunk
time)
      ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
$- (Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdSetPointTD ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`mulRe` Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdPropGain) ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
$= Integer -> ModelExpr
forall r. LiteralC r => Integer -> r
exactDbl 0

derivStmt4 :: Sentence
derivStmt4 :: Sentence
derivStmt4
  = [Sentence] -> Sentence
foldlSent_
      [NP -> Sentence
forall n. NounPhrase n => n -> Sentence
atStartNP (ConceptChunk -> NP
forall t. NamedIdea t => t -> NP
the ConceptChunk
setPoint), Output -> Sentence
forall t. Express t => t -> Sentence
eS' Output
qdSetPointTD, String -> Sentence
S "is a step function and a constant" Sentence -> Sentence -> Sentence
+:+.
         ConceptInstance -> Sentence
forall r. (Referable r, HasShortName r) => r -> Sentence
fromSource ConceptInstance
aSP,
       String -> Sentence
S "Therefore the",
         String -> Sentence
S "differential of the set point is zero. Hence the equation",
         String -> Sentence
S "reduces to"]

derivEqn4 :: ModelExpr
derivEqn4 :: ModelExpr
derivEqn4
  = ModelExpr -> UnitalChunk -> ModelExpr
forall r c. (ModelExprC r, HasUID c, HasSymbol c) => r -> c -> r
deriv (ModelExpr -> UnitalChunk -> ModelExpr
forall r c. (ModelExprC r, HasUID c, HasSymbol c) => r -> c -> r
deriv (Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdProcessVariableTD) UnitalChunk
time) UnitalChunk
time ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`addRe`
      ((Integer -> ModelExpr
forall r. LiteralC r => Integer -> r
exactDbl 1 ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`addRe` Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdDerivGain) ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`mulRe` ModelExpr -> UnitalChunk -> ModelExpr
forall r c. (ModelExprC r, HasUID c, HasSymbol c) => r -> c -> r
deriv (Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdProcessVariableTD) UnitalChunk
time)
      ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`addRe` ((Integer -> ModelExpr
forall r. LiteralC r => Integer -> r
exactDbl 20 ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`addRe` Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdPropGain) ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`mulRe` Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdProcessVariableTD)
      ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
$- (Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdSetPointTD ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
`mulRe` Output -> ModelExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy Output
qdPropGain) ModelExpr -> ModelExpr -> ModelExpr
forall r. ExprC r => r -> r -> r
$= Integer -> ModelExpr
forall r. LiteralC r => Integer -> r
exactDbl 0