C ---------------------------------------------------------------------- INTEGER FUNCTION DYNASTEP(io,sim,net,act,veh) C ---------------------------------------------------------------------- C - Function to perform one DYNASMART time step on the network and C - activity system passed in the arguments C - INCLUDED FILES: #include "dyna.inc" #include "io.inc" #include "sim.inc" #include "network.inc" #include "activity.inc" #include "vehicle.inc" C - UNMODIFIED ARGUMENTS: RECORD /Io_Data/ io ! io data C - MODIFIED ARGUMENTS: RECORD /Sim_Data/ sim ! sim bookkeeping RECORD /Road_Network/ net ! network state data RECORD /Activity/ act ! network activity data RECORD /Vehicle_Data/ veh(NU_VE) ! vehicles on the network C - MODIFIED GLOBAL DATA: ! NONE C - LOCAL VARIABLES: INTEGER ires C - FUNCTIONS CALLED INTEGER PRE_STEP ! function INTEGER LINK_PASS_1 ! function INTEGER NODE_PASS ! function INTEGER LINK_PASS_2 ! function INTEGER POST_STEP ! function C - RETURN VALUE: ! The simulation status (see dyna.inc) C ---------------------------------------------------------------------- DYNASTEP = SIM_IN_PROGRESS IF (sim.status.EQ.SIM_UNINIT) THEN CALL SIMMSG(STATUS,'') ELSE IF (sim.status.EQ.SIM_ERROR) THEN CALL SIMMSG(STATUS,'') ELSE IF (sim.status.EQ.SIM_COMPLETE) THEN CALL SIMMSG(STATUS + ,'') ELSE IF (sim.status.EQ.SIM_MAX_TIME) THEN CALL SIMMSG(STATUS + ,'') + ELSE ires = PRE_STEP(io,sim,net,act,veh) IF (ires.EQ.SIM_IN_PROGRESS) + ires = LINK_PASS_1(io,sim,net,act,veh) IF (ires.EQ.SIM_IN_PROGRESS) + ires = NODE_PASS(io,sim,net,act,veh) IF (ires.EQ.SIM_IN_PROGRESS) + ires = LINK_PASS_2(io,sim,net,act,veh) IF (ires.EQ.SIM_IN_PROGRESS) + ires = POST_STEP(io,sim,net,act,veh) ENDIF DYNASTEP = sim.status RETURN END C ---------------------------------------------------------------------- INTEGER FUNCTION PRE_STEP(io,sim,net,act,veh) C ---------------------------------------------------------------------- C - Performs pre time-step bookkeeping C - INCLUDED FILES: #include "dyna.inc" #include "io.inc" #include "sim.inc" #include "network.inc" #include "activity.inc" #include "vehicle.inc" C - UNMODIFIED ARGUMENTS: ! NONE C - MODIFIED ARGUMENTS: RECORD /Io_Data/ io RECORD /Sim_Data/ sim RECORD /Road_Network/ net RECORD /Activity/ act RECORD /Vehicle_Data/ veh(NU_VE) C - MODIFIED GLOBAL DATA: ! NONE C - LOCAL VARIABLES: INTEGER i ! counter INTEGER ires C - FUNCTIONS CALLED: INTEGER PRE_STEP_HOOKS !function INTEGER UPDATEPATHS !function C - RETURN VALUE: ! Simulation status C ---------------------------------------------------------------------- PRE_STEP = sim.status C - Check terminating conditions IF (sim.status.NE.SIM_IN_PROGRESS) RETURN C - Increment the iteration counter sim.iter = sim.iter + 1 C - Update current simulation time sim.time.minutes = (sim.iter-1) * sim.timestep C --- ================================================================== C - SET UP THE DETECTOR STATION ARRAYS FOR PROCESSING C - Increment the pointer to the location in the cross array which C - stores the number of vehicles crossing the station during the C - last MAX_TIME_STEPS time steps net.rollpnt = net.rollpnt + 1 IF (net.rollpnt.GT.MAX_TIME_STEPS) net.rollpnt = 1 DO i = 1,net.nstations C - Zero the cross counter for the next step net.station(i).cross(net.rollpnt) = 0 ENDDO C - Increment the delay rolling horizon index sim.delayrhind = sim.delayrhind + 1 IF (sim.delayrhind.GT.NU_DS) sim.delayrhind = 1 C - Increment the movement volume rolling horizon index sim.volumerhind = sim.volumerhind + 1 IF (sim.volumerhind.GT.NU_DS) sim.volumerhind = 1 ires = PRE_STEP_HOOKS(io,sim,net,act,veh) IF (ires.NE.SIM_IN_PROGRESS) THEN CALL DYNA_ERROR('ERROR IN PRE_STEP_HOOKS'//CHAR(0) + ,DYNA_FATAL_ERROR + ,DYNA_UNKNOWN_ERROR + ,DYNA_UNKNOWN_ERROR) ENDIF C - Update the vehicle generation demand on the network CALL DEMAND(io,sim,net,act,veh) ires = UPDATEPATHS(io,sim,net,act,0) PRE_STEP = sim.status RETURN END C ---------------------------------------------------------------------- INTEGER FUNCTION LINK_PASS_1(io,sim,net,act,veh) C ---------------------------------------------------------------------- C - During the first link pass, new vehicles are generated onto links C - in the network, and all vehicle positions are updated. C - INCLUDED FILES: #include "dyna.inc" #include "io.inc" #include "sim.inc" #include "network.inc" #include "activity.inc" #include "vehicle.inc" C - UNMODIFIED ARGUMENTS: ! NONE C - MODIFIED ARGUMENTS: RECORD /Io_Data/ io RECORD /Sim_Data/ sim RECORD /Road_Network/ net RECORD /Activity/ act RECORD /Vehicle_Data/ veh(NU_VE) C - MODIFIED GLOBAL DATA: ! NONE C - LOCAL VARIABLES: INTEGER i ! link index INTEGER r1 ! result storage C - FUNCTIONS CALLED: INTEGER LINK_GENERATE !function INTEGER LINK_PARTCO !function C - RETURN VALUE: ! Simulation status C ---------------------------------------------------------------------- CR == FIRST LINK PASS == i = 1 DO WHILE (i.LE.net.nlinks + .AND. + sim.status.EQ.SIM_IN_PROGRESS) ! Generate vehicles r1 = LINK_GENERATE(io,sim,net,act,i,veh) IF (r1.EQ.SIM_IN_PROGRESS) + r1 = LINK_PARTCO(io,sim,net,act,veh,i) i = i + 1 ENDDO CALL DYNADETECT(sim,net) ! Do detection post-processing LINK_PASS_1 = sim.status RETURN END C ---------------------------------------------------------------------- INTEGER FUNCTION NODE_PASS(io,sim,net,act,veh) C ---------------------------------------------------------------------- C - During the node pass, signalization at each node is updated and C - the capacities for each movement through each node are determined C - based on signalization and link interactions C - INCLUDED FILES: #include "dyna.inc" #include "io.inc" #include "sim.inc" #include "network.inc" #include "activity.inc" #include "vehicle.inc" C - UNMODIFIED ARGUMENTS: ! NONE C - MODIFIED ARGUMENTS: RECORD /Io_Data/ io RECORD /Sim_Data/ sim RECORD /Road_Network/ net RECORD /Activity/ act RECORD /Vehicle_Data/ veh(NU_VE) C - MODIFIED GLOBAL DATA: ! NONE C - LOCAL VARIABLES: INTEGER i ! node index INTEGER r1 ! results C - FUNCTIONS CALLED: INTEGER NODE_SIGFUN !function INTEGER ADJUSTNODECAP !function C - RETURN VALUE: ! Simulation status C ---------------------------------------------------------------------- r1 = SIM_IN_PROGRESS CR == NODE PASS == i = 1 DO WHILE (i.LE.net.nnodes + .AND. + sim.status.EQ.SIM_IN_PROGRESS) ! Set green times IF (r1.EQ.SIM_IN_PROGRESS) + r1 = NODE_SIGFUN(sim,net,i) ! Determine movement ! capacities based on ! signalized, shared, and/or ! conflicting movements IF (r1.EQ.SIM_IN_PROGRESS) + r1 = ADJUSTNODECAP(sim,net,veh,i) i = i + 1 ENDDO NODE_PASS = sim.status RETURN END C ---------------------------------------------------------------------- INTEGER FUNCTION LINK_PASS_2(io,sim,net,act,veh) C ---------------------------------------------------------------------- C - During the second link pass, vehicles are moved between links C - based on prevailing capacities, link state variables are updated C - (e.g. density, speed, movement penalties etc.) C - INCLUDED FILES: #include "dyna.inc" #include "io.inc" #include "sim.inc" #include "network.inc" #include "activity.inc" #include "vehicle.inc" C - UNMODIFIED ARGUMENTS: ! NONE C - MODIFIED ARGUMENTS: RECORD /Io_Data/ io RECORD /Sim_Data/ sim RECORD /Road_Network/ net RECORD /Activity/ act RECORD /Vehicle_Data/ veh(NU_VE) C - MODIFIED GLOBAL DATA: ! NONE C - LOCAL VARIABLES: INTEGER i ! link index INTEGER r1 ! result storage C - FUNCTIONS CALLED: INTEGER LINK_LINK2LINK !function INTEGER LINK_LINKUPDATE !function INTEGER LINK_PENALTYCAL !function C - RETURN VALUE: ! Simulation status C ---------------------------------------------------------------------- CR == SECOND LINK PASS == i = 1 r1 = SIM_IN_PROGRESS DO WHILE (i.LE.net.nlinks + .AND. + sim.status.EQ.SIM_IN_PROGRESS) IF (r1.EQ.SIM_IN_PROGRESS) ! Move vehicles between links + r1 = LINK_LINK2LINK(io,sim,net,act,veh,i) IF (r1.EQ.SIM_IN_PROGRESS) ! update link states + r1 = LINK_LINKUPDATE(io,sim,net,act,veh,i) IF (r1.EQ.SIM_IN_PROGRESS) ! Calculate movement penalties + r1 = LINK_PENALTYCAL(sim,net,i) i = i + 1 ENDDO LINK_PASS_2 = sim.status RETURN END C ---------------------------------------------------------------------- INTEGER FUNCTION POST_STEP(io,sim,net,act,veh) C ---------------------------------------------------------------------- C - Performs POST time-step bookkeeping C - INCLUDED FILES: #include "dyna.inc" #include "io.inc" #include "sim.inc" #include "network.inc" #include "activity.inc" #include "vehicle.inc" C - UNMODIFIED ARGUMENTS: ! NONE C - MODIFIED ARGUMENTS: RECORD /Io_Data/ io RECORD /Sim_Data/ sim RECORD /Road_Network/ net RECORD /Activity/ act RECORD /Vehicle_Data/ veh(NU_VE) C - MODIFIED GLOBAL DATA: ! NONE C - LOCAL VARIABLES: INTEGER ires C - FUNCTIONS CALLED: INTEGER POST_STEP_HOOKS ! function C - RETURN VALUE: ! Simulation status C ---------------------------------------------------------------------- POST_STEP = sim.status C - Check terminating conditions IF (sim.status.NE.SIM_IN_PROGRESS) RETURN ires = POST_STEP_HOOKS(io,sim,net,act,veh) POST_STEP = ires RETURN END