INTEGER FUNCTION STD_PATH_UPDATE(net,act) #include "dyna.inc" #include "network.inc" #include "activity.inc" RECORD /Road_Network/ net RECORD /Activity/ act INTEGER firstlist,seqlist(NU_LI) INTEGER dz,k,im,m,i,dn INTEGER curnode,bpc,nummove,imi,node REAL linkdist INTEGER nummove2,im2 LOGICAL connected INTEGER kp,mp INTEGER movecount,totmoves INTEGER li ! link index INTEGER curlink,newlink STD_PATH_UPDATE = 0 movecount = 0 totmoves = 0 CRlp------------- crmiCR - Loop over each destination crmi DO dz = 1,act.ndests crmi crmiCR - Set labels negative crmicr DO k = 1,net.spd.p.kay crmicr DO node = 1,net.spd.nd.noofnodes crmicr im = net.spd.bsd.backpointr(node+1)- crmicr + net.spd.bsd.backpointr(node)+1 crmicr DO m = 1,im crmicr net.spd.od.labelout(dz,node,k,m) = crmicr + -net.spd.od.labelout(dz,node,k,m) crmicr ENDDO crmicr ENDDO crmicr ENDDO crmi crmiCR - Clear sequence list crmi DO i = 1,NU_LI crmi seqlist(i) = 0 crmi ENDDO crmi crmi dn = act.destlist(dz) ! Get destination node crmi crmiCR - Initialize the sequence list of links to be examined crmi bpc = net.spd.bsd.backpointr(dn) crmi nummove = net.spd.bsd.backpointr(dn+1) - bpc crmi seqlist(bpc) = INFINITY crmi firstlist = bpc crmi DO im = 2,nummove crmi seqlist(bpc+im-1) = firstlist crmi firstlist = bpc+im-1 crmi ENDDO crmi crmiCR - Take link off sequence list crmi DO WHILE(firstlist.NE.INFINITY) crmi li = firstlist ! Link bstar index crmi curlink = net.fs.ifwdarc(li,2) ! Link number crmi curnode = net.link(curlink).idnod ! Downstream node of link crmi firstlist = seqlist(li) crmi seqlist(li) = -1 crmi imi = li - net.spd.bsd.backpointr(curnode)+1 crmi crmi node = net.spd.bsd.backstr1(li) ! Upstream node of link crmi linkdist = net.spd.bsd.backstr2(li) crmi crmiCR - Loop over movements connecting upstream links to node crmi nummove2 = net.spd.bsd.backpointr(node+1) - crmi + net.spd.bsd.backpointr(node) crmi connected = .FALSE. crmi DO im2 = 1,nummove2 crmi DO k = 1,net.spd.p.kay crmi crmiCR - Update movement stubs if they connect crmi IF (net.spd.od.pathpointerout(dz,node,k,1,im2) crmi + .EQ.curnode) THEN crmi kp = net.spd.od.pathpointerout(dz,node,k,2,im2) crmi mp = net.spd.od.pathpointerout(dz,node,k,3,im2) crmi net.spd.od.labelout(dz,node,k,im2) = crmi + net.spd.od.labelout(dz,curnode,kp,mp) crmi + + linkdist crmi + + net.spd.pn.penalty(li,im2) crmi crmi newlink = crmi + net.spd.bsd.backpointr(node)+im2-1 crmi IF (seqlist(newlink).EQ.0) THEN crmi seqlist(newlink) = firstlist crmi firstlist = newlink crmi ENDIF crmi movecount = movecount + 1 crmi ENDIF crmi totmoves = totmoves + 1 crmi ENDDO crmi ENDDO crmi ENDDO crmi CONTINUE crmi ENDDO WRITE(ostr,600) movecount,net.nmoves,totmoves,CHAR(0) 600 FORMAT('Set 'I6' moves of 'I6' in the network in 'I6' checks'A) CALL SIMMSG(STATUS,ostr) RETURN END