module Drasil.PDController.ODEs where

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

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