{-# 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