{-# LANGUAGE RecursiveDo #-} import Data.Array import Simulation.Aivika import Simulation.Aivika.SystemDynamics specs = Specs { spcStartTime = 0, spcStopTime = 13, spcDT = 0.01, -- spcDT = 0.000005, spcMethod = RungeKutta4, spcGeneratorType = SimpleGenerator } model :: Simulation Results model = mdo let annualProfit = profit area = 100 carryingCapacity = 1000 catchPerShip = lookupDynamics density $ listArray (1, 11) [(0.0, -0.048), (1.2, 10.875), (2.4, 17.194), (3.6, 20.548), (4.8, 22.086), (6.0, 23.344), (7.2, 23.903), (8.4, 24.462), (9.6, 24.882), (10.8, 25.301), (12.0, 25.86)] deathFraction = lookupDynamics (fish / carryingCapacity) $ listArray (1, 11) [(0.0, 5.161), (0.1, 5.161), (0.2, 5.161), (0.3, 5.161), (0.4, 5.161), (0.5, 5.161), (0.6, 5.118), (0.7, 5.247), (0.8, 5.849), (0.9, 6.151), (10.0, 6.194)] density = fish / area fish <- integ (fishHatchRate - fishDeathRate - totalCatchPerYear) 1000 let fishDeathRate = maxDynamics 0 (fish * deathFraction) fishHatchRate = maxDynamics 0 (fish * hatchFraction) fishPrice = 20 fractionInvested = 0.2 hatchFraction = 6 operatingCost = ships * 250 profit = revenue - operatingCost revenue = totalCatchPerYear * fishPrice ships <- integ shipBuildingRate 10 let shipBuildingRate = maxDynamics 0 (profit * fractionInvested / shipCost) shipCost = 300 totalProfit <- integ annualProfit 0 let totalCatchPerYear = maxDynamics 0 (ships * catchPerShip) -- results -- return $ results [resultSource "fish" "fish" fish, resultSource "annualProfit" "the annual profit" annualProfit, resultSource "totalProfit" "the total profit" totalProfit] main = flip runSimulation specs $ model >>= \results -> do printResultsInStartTime printResultSourceInEnglish results printResultsInStopTime printResultSourceInEnglish results