module Drasil.PDController.ODEs where

import Language.Drasil (LiteralC(exactDbl), ExprC(sy))
import Language.Drasil.Code (odeInfo', odeOptions, quantvar, ODEInfo,
    ODEMethod(RK45), ODEOptions)
import Theory.Drasil (InitialValueProblem, makeAIVP)

import Drasil.PDController.Unitals (dqdSetPointTD, dqdPropGain, dqdDerivGain,
    dqdSimTime, dqdStepTime, odeRelTolConst, odeAbsTolConst)
import Drasil.PDController.IModel(imPDRC)

pidODEOptions :: ODEOptions
pidODEOptions :: ODEOptions
pidODEOptions = ODEMethod -> CodeExpr -> CodeExpr -> CodeExpr -> ODEOptions
odeOptions
  ODEMethod
RK45 (ConstQDef -> CodeExpr
forall c. (HasUID c, HasSymbol c) => c -> CodeExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy ConstQDef
odeAbsTolConst) (ConstQDef -> CodeExpr
forall c. (HasUID c, HasSymbol c) => c -> CodeExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy ConstQDef
odeRelTolConst) (DefinedQuantityDict -> CodeExpr
forall c. (HasUID c, HasSymbol c) => c -> CodeExpr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy DefinedQuantityDict
dqdStepTime)

pdIVP :: InitialValueProblem
pdIVP :: InitialValueProblem
pdIVP = Expr -> Expr -> [Expr] -> InitialValueProblem
makeAIVP (Integer -> Expr
forall r. LiteralC r => Integer -> r
exactDbl Integer
0) (DefinedQuantityDict -> Expr
forall c. (HasUID c, HasSymbol c) => c -> Expr
forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy DefinedQuantityDict
dqdSimTime) [Integer -> Expr
forall r. LiteralC r => Integer -> r
exactDbl Integer
0, Integer -> Expr
forall r. LiteralC r => Integer -> r
exactDbl Integer
0]

pidODEInfo :: ODEInfo
pidODEInfo :: ODEInfo
pidODEInfo = [CodeVarChunk]
-> ODEOptions
-> DifferentialModel
-> InitialValueProblem
-> ODEInfo
odeInfo'
  [DefinedQuantityDict -> CodeVarChunk
forall c.
(Quantity c, MayHaveUnit c, Concept c) =>
c -> CodeVarChunk
quantvar DefinedQuantityDict
dqdPropGain, DefinedQuantityDict -> CodeVarChunk
forall c.
(Quantity c, MayHaveUnit c, Concept c) =>
c -> CodeVarChunk
quantvar DefinedQuantityDict
dqdDerivGain, DefinedQuantityDict -> CodeVarChunk
forall c.
(Quantity c, MayHaveUnit c, Concept c) =>
c -> CodeVarChunk
quantvar DefinedQuantityDict
dqdSetPointTD]
  ODEOptions
pidODEOptions
  DifferentialModel
imPDRC
  InitialValueProblem
pdIVP