aivika-gpss-0.3: examples/Example7-28Trans.hs
{-
TATYM TABLE M1,200,10,10
GENERATE ,,,1
Back1 MARK
SEIZE WORKR
SPLIT 1 Back1
ADVANCE 16,3
RELEASE WORKR
ASSEMBLE 12
TABULATE TATYM
TERMINATE
GENERATE 10000
TERMINATE 1
START 1
-}
import Prelude hiding (id)
import Control.Category
import Control.Monad.Trans
import Data.Maybe
import Simulation.Aivika.Trans
import Simulation.Aivika.Trans.GPSS
import Simulation.Aivika.IO
type DES = IO
specs = Specs { spcStartTime = 0.0,
spcStopTime = 10000.0,
spcDT = 1.0,
spcMethod = RungeKutta4,
spcGeneratorType = SimpleGenerator }
model :: Simulation DES (Results DES)
model =
do workr <- runEventInStartTime newFacility
stats <- newRef emptySamplingStats
let bottleStream = takeStream 1 $
randomUniformStream 0 0
let bottles = streamGeneratorBlock bottleStream 0
bottleChain =
Block (\a ->
do t <- liftDynamics time
return $ assignTransactValue a (const t)) >>>
seizeBlock workr >>>
splitBlock [bottleChain] >>>
advanceBlock (randomUniformProcess_ (16 - 3) (16 + 3)) >>>
releaseBlock workr >>>
assembleBlock 12 >>>
Block (\a ->
do t <- liftDynamics time
let t0 = transactValue a
liftEvent $
modifyRef stats $
addSamplingStats (t - t0)
return a) >>>
terminateBlock
runProcessInStartTime $
runGeneratorBlock bottles bottleChain
return $
results
[resultSource "workr" "WORKR" workr,
resultSource "stats" "TATYM" stats]
main =
printSimulationResultsInStopTime
printResultSourceInEnglish
model specs