home *** CD-ROM | disk | FTP | other *** search
- PROGRAM EXA3
- C////////////////////////////////////////////////////////////////
- C/ /
- C/ Program-id. Main of exmple 3 /
- C/ Date-written. 21th,Jan,1984 /
- C/ File-name. EXA3.FOR /
- C/ Remarks. a single-channel queueing situation. /
- C/ Simulation with GASP page 140. /
- C/ This example is for multiple run. /
- C/ /
- C////////////////////////////////////////////////////////////////
- C //FOR
- C *ONE WORD INTEGER
- C *LIST SOURCE PROGRAM
- C *IOCS PRINTER PC-8023C, CARD PC-8031 2W FLOPPY DRIVE
- INTEGER*1 FLNAME( 11 )
- INTEGER*4 NSET( 6,25 )
- COMMON /C1/ID,IM,INIT,JEVNT,JMNIT,MFA,MSTOP,MX,MXC,NCLCT,NHIST,
- $ NOQ,NORPT,NOT,NPRMS,NRUN,NRUNS,NSTAT,OUT,SCALE,ISEED,TNOW,
- $ TBEG,TFIN,MXX,NPRNT,NCRDR,NEP,VNQ(4)
- COMMON /C2/ATRIB(4),ENQ(4),INN(4),JCELS(5,22),KRANK(4),MAXNQ(4),
- $ MFE(4),MLC(4),MLE(4),NCELS(5),NQ(4),PARAM(20,4),QTIME(4),
- $ SSUMA(10,5),SUMA(10,5),NAME(6),NPROJ,MON,NDAY,NYR,JCLR
- common /c3/ xisys,bus
- DATA FLNAME(1),FLNAME(2),FLNAME(3),FLNAME(4),FLNAME(5),
- $ FLNAME(6),FLNAME(7),FLNAME(8),FLNAME(9),FLNAME(10),FLNAME(11)
- $ /'G','A','S','P',' ',' ',' ',' ','D','A','T'/
- C
- C --- Set NCRDR equal to the Floppy drive number and
- C NPRNT to the printer number.
- C
- NCRDR = 6
- C
- IDRIVE = 0
- WRITE(1,90)
- 90 FORMAT(1H0,'Output GASP data file to Display(3) or Printer(2)'
- $ ,/1H ,'Output Device number 3 or 2 : ' )
- READ( 1,95 ) NPRNT
- 95 FORMAT( I1 )
- WRITE(1,100)
- 100 FORMAT(1H0,'Input GASP data file name ( max 8 characters ) : ')
- READ(1,200) ( FLNAME( I ),I=1,8 )
- WRITE( 3,210 ) ( FLNAME(I),I=1,11 )
- 210 FORMAT(1H ,'Input GASP data file name : ',11A1 )
- 200 FORMAT( 8A1 )
- CALL OPEN( NCRDR,FLNAME,IDRIVE )
- C
- CALL GASP( NSET )
- CALL EXIT
- END
- SUBROUTINE ARRVL( NSET )
- C////////////////////////////////////////////////////////////////
- C/ /
- C/ Program-id. ARRVL /
- C/ Date-written. 23th,Jan,1984 /
- C/ File-name. ARRVL3.FOR /
- C/ Remarks. Subroutine ARRVL page 123 /
- C/ The arrival of items to the system is /
- C/ described in terms of the time between /
- C/ the arrivals, every arrival event must /
- C/ cause the next arrival event to occur. /
- C/ This is for Example-3 version. /
- C/ /
- C////////////////////////////////////////////////////////////////
- C //FOR
- C *ONE WORD INTEGERS
- C *LIST SOURCE PROGRAM
- INTEGER*4 NSET( 6,1 )
- COMMON /C1/ID,IM,INIT,JEVNT,JMNIT,MFA,MSTOP,MX,MXC,NCLCT,NHIST,
- $ NOQ,NORPT,NOT,NPRMS,NRUN,NRUNS,NSTAT,OUT,SCALE,ISEED,TNOW,
- $ TBEG,TFIN,MXX,NPRNT,NCRDR,NEP,VNQ(4)
- COMMON /C2/ATRIB(4),ENQ(4),INN(4),JCELS(5,22),KRANK(4),MAXNQ(4),
- $ MFE(4),MLC(4),MLE(4),NCELS(5),NQ(4),PARAM(20,4),QTIME(4),
- $ SSUMA(10,5),SUMA(10,5),NAME(6),NPROJ,MON,NDAY,NYR,JCLR
- COMMON /C3/ XISYS,BUS
- C
- C --- Since ARRVL is an endogenous event schedule the next
- C arrival. At TNOW plus number drawn from an exponential
- C distribution. The arrival time is stored in ATRIB(1).
- C The event code for an ARRVL is 1. Set ATRIB(2)
- C equal to 1.
- C
- CALL DRAND( ISEED,RNUM )
- ATRIB(1) = TNOW - PARAM(1,1) * ALOG( RNUM )
- ATRIB(2) = 1.0
- CALL FILEM( 1,NSET )
- C
- C --- Collect the statistics on the number in the system since
- C an arrival causes number in the system to change.
- C
- CALL TMST( XISYS,TNOW,1,NSET )
- IF ( XISYS ) 7,8,9
- 7 CALL ERROR(31,NSET)
- RETURN
- C
- C --- Increment the number in the system. Since the number in
- C the system was zero the server was not busy.
- C The server status will change due to the new arrival
- C therefore statistics on the time the server was busy
- C must be collected.
- C
- 8 XISYS = XISYS + 1.0
- CALL TMST( BUS,TNOW,2,NSET )
- C
- C --- Change the status of the server to busy. Collect
- C statistics on the waitting time of current arrival which
- C is zero since the server was not busy at his time of
- C arrival.
- C
- BUS = 1.0
- CALL COLCT( 0.0,2,NSET )
- C
- C --- Since the new arrival goes directly into service cause an
- C end of service event. Set ATRIB(2) equal to indicate an end
- C of service event. Set ATRIB(3) equal to TNOW the arrival
- C time of the customer.
- C
- CALL DRAND( ISEED,RNUM )
- ATRIB(1) = TNOW - PARAM(2,1) * ALOG( RNUM )
- ATRIB(2) = 2.0
- ATRIB(3) = TNOW
- CALL FILEM( 1,NSET )
- RETURN
- C
- C --- Increment the number in the system.
- C
- 9 XISYS = XISYS + 1.0
- C
- C --- Put new arrival in the queue waiting for the server to
- C become free. Set ATRIB(3) equal to the arrival time of
- C the customer.
- C
- ATRIB(3) = TNOW
- CALL FILEM( 2,NSET )
- RETURN
- END
- SUBROUTINE ENDSM( NSET )
- C////////////////////////////////////////////////////////////////
- C/ /
- C/ Program-id. ENDSM /
- C/ Date-written. 23th,Jan,1984 /
- C/ File-name. ENDSM3.FOR /
- C/ Remaeks. User defined subroutine, the completion /
- C/ of the simulation at a time specified /
- C/ by the programmer. /
- C/ page 128. /
- C/ This is for Example-3 version. /
- C/ /
- C////////////////////////////////////////////////////////////////
- C //FOR
- C *ONE WORD INTEGERS
- C *LIST SOURCE PROGRAM
- INTEGER*4 NSET( 6,1 )
- COMMON /C1/ID,IM,INIT,JEVNT,JMNIT,MFA,MSTOP,MX,MXC,NCLCT,NHIST,
- $ NOQ,NORPT,NOT,NPRMS,NRUN,NRUNS,NSTAT,OUT,SCALE,ISEED,TNOW,
- $ TBEG,TFIN,MXX,NPRNT,NCRDR,NEP,VNQ(4)
- COMMON /C2/ATRIB(4),ENQ(4),INN(4),JCELS(5,22),KRANK(4),MAXNQ(4),
- $ MFE(4),MLC(4),MLE(4),NCELS(5),NQ(4),PARAM(20,4),QTIME(4),
- $ SSUMA(10,5),SUMA(10,5),NAME(6),NPROJ,MON,NDAY,NYR,JCLR
- COMMON /C3/ XISYS,BUS
- 20 IF( NQ(1) ) 7,8,9
- 7 CALL ERROR( 3,NSET )
- C
- C --- Update statistics on number in system and status of server
- C to end of simulation time. Set control variable to stop
- C simulation and to yield final report.
- C
- 8 CALL TMST( XISYS,TNOW,1,NSET )
- CALL TMST( BUS,TNOW,2,NSET )
- MSTOP = -1
- NORPT = 0
- RETURN
- C
- C --- Remove all events from event file so that all customers
- C arriving before end of simulation time are included in
- C simulation statistics. Only end of service event need be
- C processed. If items are in the queue of the server they
- C will be removed in the end of service event where another
- C end of service event will be created.
- C
- 9 CALL RMOVE( MFE(1),1,NSET )
- TNOW = ATRIB(1)
- IF( ATRIB(2) - 2.0 ) 20,21,20
- 21 CALL ENDSV( NSET )
- GO TO 20
- END
- SUBROUTINE ENDSV( NSET )
- C////////////////////////////////////////////////////////////////
- C/ /
- C/ Program-id. ENDSV /
- C/ Date-written. 23th,Jan,1984 /
- C/ File-name. ENDSV3.FOR /
- C/ Remarks. Subroutine ENDSV page 126 /
- C/ In ENDSV( End_of_Service ) it is first /
- C/ necessary to collect statiscal infor- /
- C/ mation about the item completing /
- C/ processing. /
- C/ This is for Examle-3 version. /
- C/ /
- C////////////////////////////////////////////////////////////////
- C //FOR
- C *ONE WORD INTEGERS
- C *LIST SOURCE PROGRAM
- INTEGER*4 NSET( 6,1 )
- COMMON /C1/ID,IM,INIT,JEVNT,JMNIT,MFA,MSTOP,MX,MXC,NCLCT,NHIST,
- $ NOQ,NORPT,NOT,NPRMS,NRUN,NRUNS,NSTAT,OUT,SCALE,ISEED,TNOW,
- $ TBEG,TFIN,MXX,NPRNT,NCRDR,NEP,VNQ(4)
- COMMON /C2/ATRIB(4),ENQ(4),INN(4),JCELS(5,22),KRANK(4),MAXNQ(4),
- $ MFE(4),MLC(4),MLE(4),NCELS(5),NQ(4),PARAM(20,4),QTIME(4),
- $ SSUMA(10,5),SUMA(10,5),NAME(6),NPROJ,MON,NDAY,NYR,JCLR
- COMMON /C3/ XISYS,BUS
- C
- C --- Compute time in system equal to current time minus arrival
- C time of customer finishing service. Cmpute statistics on
- C in system.
- C
- TISYS = TNOW - ATRIB(3)
- CALL COLCT( TISYS,1,NSET )
- CALL HISTO( TISYS,2.0,1.0,1 )
- C
- C --- Since a customer will depart from the system due to the
- C end of service collect ststistics on number in system
- C and decrement the number in the system by one.
- C
- CALL TMST( XISYS,TNOW,1,NSET )
- XISYS = XISYS - 1.0
- C
- C --- Test to see if customer are waiting for service. If none
- C collect statistics on the busy time of the server and set
- C his status to idle by making bus equal zero.
- C If customer are waiting for service remove first customer
- C from the queue of the server which is file two.
- C
- IF( NQ(2) ) 7,8,9
- 7 CALL ERROR( 41,NSET )
- RETURN
- 8 CALL TMST( BUS,TNOW,2,NSET )
- BUS = 0.0
- RETURN
- 9 CALL RMOVE( MFE(2),2,NSET )
- C
- C --- Compute waiting time of customer and collect statistics
- C on waiting time. Put customer in service by scheduling
- C and end of service event for the customer.
- C
- WT = TNOW - ATRIB(3)
- CALL COLCT( WT,2,NSET )
- CALL DRAND( ISEED,RNUM )
- ATRIB( 1 ) = TNOW - PARAM(2,1) * ALOG( RNUM )
- ATRIB( 2 ) = 2.0
- CALL FILEM( 1,NSET )
- RETURN
- END
- SUBROUTINE EVNTS( IX,NSET )
- C////////////////////////////////////////////////////////////////
- C/ /
- C/ Program-id. EVNTS /
- C/ Date-written. 21th,Jan,1984 /
- C/ File-name. EVNTS3.FOR /
- C/ Remarks. Subroutine EVNTS page 121 /
- C/ Event code 1 siginifires an arrival /
- C/ event; event code 2 signifires an end /
- C/ of service event; /
- C/ and event code 3 signifires an end of /
- C/ simulation event. /
- C/ User subroutine for Example-3. /
- C/ /
- C////////////////////////////////////////////////////////////////
- C //FOR
- C *ONE WORD INTEGERS
- C *LIST SOURCE PROGRAM
- INTEGER*4 NSET( 6,1 )
- COMMON /C1/ID,IM,INIT,JEVNT,JMNIT,MFA,MSTOP,MX,MXC,NCLCT,NHIST,
- $ NOQ,NORPT,NOT,NPRMS,NRUN,NRUNS,NSTAT,OUT,SCALE,ISEED,TNOW,
- $ TBEG,TFIN,MXX,NPRNT,NCRDR,NEP,VNQ(4)
- COMMON /C2/ATRIB(4),ENQ(4),INN(4),JCELS(5,22),KRANK(4),MAXNQ(4),
- $ MFE(4),MLC(4),MLE(4),NCELS(5),NQ(4),PARAM(20,4),QTIME(4),
- $ SSUMA(10,5),SUMA(10,5),NAME(6),NPROJ,MON,NDAY,NYR,JCLR
- COMMON /C3/ XISYS,BUS
- C
- GO TO (1,2,3,4),IX
- 1 CALL ARRVL( NSET )
- RETURN
- 2 CALL ENDSV( NSET )
- RETURN
- 3 CALL ENDSM( NSET )
- RETURN
- 4 CALL STTUP( NSET )
- RETURN
- END
- SUBROUTINE OTPUT( NSET )
- C////////////////////////////////////////////////////////////////
- C/ /
- C/ Program-id. OTPUT /
- C/ Date-written. 23th,Jan,1984 /
- C/ File-name. OTPUT3.FOR /
- C/ Remarks. Subroutine OTPUT.FOR page 130 /
- C/ Written by a programmer to perform /
- C/ calculations and provide additional /
- C/ output at the end of a simulation run. /
- C/ This is for Example-3 version. /
- C/ /
- C////////////////////////////////////////////////////////////////
- C //FOR
- C *ONE WORD INTEGERS
- C *LIST SOURCE PROGRAM
- INTEGER*4 NSET( 6,1 )
- COMMON /C1/ID,IM,INIT,JEVNT,JMNIT,MFA,MSTOP,MX,MXC,NCLCT,NHIST,
- $ NOQ,NORPT,NOT,NPRMS,NRUN,NRUNS,NSTAT,OUT,SCALE,ISEED,TNOW,
- $ TBEG,TFIN,MXX,NPRNT,NCRDR,NEP,VNQ(4)
- COMMON /C2/ATRIB(4),ENQ(4),INN(4),JCELS(5,22),KRANK(4),MAXNQ(4),
- $ MFE(4),MLC(4),MLE(4),NCELS(5),NQ(4),PARAM(20,4),QTIME(4),
- $ SSUMA(10,5),SUMA(10,5),NAME(6),NPROJ,MON,NDAY,NYR,JCLR
- COMMON /C3/ XISYS,BUS
- C
- C --- Compute theoretical and simulation values of performance
- C measures for the queuing system.
- C
- ETISS = SUMA(1,1) / SUMA(1,3)
- EIDTS = ( SSUMA(2,1) - SSUMA(2,2) ) / ( SUMA(1,3) - 1.0 )
- EWTS = SUMA(2,1) / SUMA(2,3)
- EIDTC = PARAM(1,1) - PARAM(2,1)
- EWTC = ( 1.0/PARAM(1,1) ) / ( (1.0/PARAM(2,1) ) * ( 1.0/
- $ PARAM(2,1) - 1.0/PARAM(1,1) ) )
- ETISC = 1.0/( 1.0/PARAM(2,1) - 1.0/PARAM(1,1) )
- YA = ETISS / ( SSUMA(1,2) / SSUMA(1,1) )
- YS = ETISS - EWTS
- WRITE( NPRNT,85 )
- 85 FORMAT(/36X,'Simulated Value',4X,'Theoretical Value'/)
- WRITE( NPRNT,90 ) EIDTS,EIDTC
- 90 FORMAT(10X,'Expected idle time',11X,F8.3,12X,F8.3 )
- WRITE( NPRNT,95 ) EWTS,EWTC
- 95 FORMAT(10X,'Expected waiting time',8X,F8.3,12X,F8.3 )
- WRITE( NPRNT,96 ) ETISS,ETISC
- 96 FORMAT(10X,'Expected time in system',6X,F8.3,12X,F8.3 )
- WRITE( NPRNT,97 ) YA,PARAM(1,1)
- 97 FORMAT(10X,'Expected arrival time',8X,F8.3,12X,F8.3 )
- WRITE( NPRNT,98 ) YS,PARAM(2,1)
- 98 FORMAT(10X,'Expected service time',8X,F8.3,12X,F8.3 )
- RETURN
- END
- SUBROUTINE STTUP( NSET )
- C////////////////////////////////////////////////////////////////
- C/ /
- C/ Program-id. STTUP /
- C/ Date-written. 21th,Jan,1984 /
- C/ File-name. STTUP.FOR /
- C/ Remarks. Subroutine STTUP.FOR page 139 /
- C/ Subroutine STTUP for Reinitializing /
- C/ values for multiple runs. /
- C/ User subroutine for Example-3 /
- C/ /
- C////////////////////////////////////////////////////////////////
- C //FOR
- C *ONE WORD INTEGER
- C *LIST SOURCE PROGRAM
- INTEGER*4 NSET( 6,1 )
- COMMON /C1/ID,IM,INIT,JEVNT,JMNIT,MFA,MSTOP,MX,MXC,NCLCT,NHIST,
- $ NOQ,NORPT,NOT,NPRMS,NRUN,NRUNS,NSTAT,OUT,SCALE,ISEED,TNOW,
- $ TBEG,TFIN,MXX,NPRNT,NCRDR,NEP,VNQ(4)
- COMMON /C2/ATRIB(4),ENQ(4),INN(4),JCELS(5,22),KRANK(4),MAXNQ(4),
- $ MFE(4),MLC(4),MLE(4),NCELS(5),NQ(4),PARAM(20,4),QTIME(4),
- $ SSUMA(10,5),SUMA(10,5),NAME(6),NPROJ,MON,NDAY,NYR,JCLR
- C
- COMMON /C3/ XISYS,BUS
- C
- C --- Comment cards for starter subroutine
- C Initialize statiscal storage areas for each fiule used
- C in the simulation. This is required since the files are
- C not initilized by subroutine SET
- C
- DO 17 K=1,NOQ
- ENQ( K ) = 0.0
- VNQ( K ) = 0.0
- MAXNQ( K ) = NQ( K )
- 17 QTIME( K ) = TNOW
- C
- C --- Test to see if the event file is empty. If event file is
- C empty start up events are to be used. If event file is not
- C empty read in the number in the system and the status
- C of the server.
- C
- IF( NQ(1) ) 19,19,25
- 25 READ( NCRDR,91 ) XISYS,BUS
- 91 FORMAT( 2F5.0 )
- WRITE( 1,291 ) XISYS,BUS
- 291 FORMAT( 1H ,2F5.0 )
- 8 RETURN
- C
- C --- If start events is to be used the number in the system is
- C equal to the number of starter events minus the end of
- C simulation event and the arrival event.
- C If monitor events are used these must also be subtracted
- C
- 19 XISYS = NQ(3) - 2
- C
- C --- If number in system is greater than zero the server
- C status should be set to busy. Let nine equal the
- C number of initial entries.
- C
- BUS = 1.0
- IF( XISYS ) 18,18,7
- 18 BUS = 0.0
- 7 NINE = NQ(3)
- NC = 1
- 11 CALL RMOVE( MFE(3),3,NSET )
- J = 1
- IF( ATRIB(2) - 0.1 ) 20,20,21
- 20 J = 2
- 21 CALL FILEM( J,NSET )
- CALL FILEM( 3,NSET )
- IF( NC - NINE ) 9,8,8
- 9 NC = NC + 1
- GO TO 11
- END
-