packages feed

aivika-experiment-chart-0.4: examples/ChemicalReaction.hs

{-# LANGUAGE RecursiveDo #-}

import Simulation.Aivika.Specs
import Simulation.Aivika.Simulation
import Simulation.Aivika.Dynamics
import Simulation.Aivika.SystemDynamics

import Simulation.Aivika.Experiment
import Simulation.Aivika.Experiment.LastValueView
import Simulation.Aivika.Experiment.TableView
import Simulation.Aivika.Experiment.TimeSeriesView
import Simulation.Aivika.Experiment.XYChartView
import Simulation.Aivika.Experiment.ExperimentSpecsView

specs = Specs { spcStartTime = 0, 
                spcStopTime = 13, 
                spcDT = 0.01,
                spcMethod = RungeKutta4 }

experiment :: Experiment
experiment =
  defaultExperiment {
    experimentSpecs = specs,
    experimentRunCount = 1,
    experimentTitle = "Chemical Reaction",
    experimentDescription = "Chemical Reaction as described in " ++
                            "the 5-minute tutorial of Berkeley-Madonna",
    experimentGenerators = 
      [outputView defaultExperimentSpecsView,
       outputView $ defaultLastValueView {
         lastValueSeries = ["t", "a", "b", "c"] },
       outputView $ defaultTableView {
         tableSeries = ["t", "a", "b", "c"] }, 
       outputView $ defaultTimeSeriesView {
         timeSeriesTitle = "Time Series",
         timeSeries = [Left "a", Left "b", Left "c"] },
       -- outputView $ defaultTimeSeriesView {
       --   timeSeriesPlotTitle = "Variables a, b and c for t <= 5 or t >= 7",
       --   timeSeries = [Left "a", Left "b", Left "c"],
       --   timeSeriesPredicate =
       --     do t <- time
       --        return (t <= 5 || t >= 7) },
       outputView $ defaultXYChartView {
         xyChartTitle = "XYChart - 1",
         xyChartPlotTitle = "b=b(a), c=c(a)",
         xyChartXSeries = Just "a",
         xyChartYSeries = [Left "b", Right "c"] },
       outputView $ defaultXYChartView {
         xyChartTitle = "XYChart - 2",
         xyChartPlotTitle = "a=a(b), c=c(b)",
         xyChartXSeries = Just "b",
         xyChartYSeries = [Right "a", Right "c"] },
       outputView $ defaultXYChartView {
         xyChartTitle = "XYChart - 3",
         xyChartPlotTitle = "a=a(c), b=b(c)",
         xyChartXSeries = Just "c",
         xyChartYSeries = [Right "a", Left "b"] } ] }
       -- outputView $ defaultXYChartView {
       --   xyChartPlotTitle = "Functions a=a(c) and b=b(c) for t <= 2 or t >= 3",
       --   xyChartXSeries = Just "c",
       --   xyChartYSeries = [Right "a", Left "b"],
       --   xyChartPredicate = 
       --     do t <- time
       --        return (t <= 2 || t >= 3) } ] }

model :: Simulation ExperimentData
model =
  mdo a <- integ (- ka * a) 100
      b <- integ (ka * a - kb * b) 0
      c <- integ (kb * b) 0
      let ka = 1
          kb = 1
      experimentDataInStartTime
        [("t", seriesEntity "time" time),
         ("a", seriesEntity "a" a),
         ("b", seriesEntity "b" b),
         ("c", seriesEntity "c" c)]

main = runExperiment experiment model