main.f 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  1. PROGRAM SCBD
  2. IMPLICIT REAL*8 (A-H,O-Z)
  3. INTEGER IT,ITMAX
  4. DOUBLE PRECISION DEMAND, QUADERR
  5. DOUBLE PRECISION MUSC, MUCE, MUSE, POPSC0, POPCE0, POPSE0, EPS
  6. COMMON /PB/ NPROB
  7. INCLUDE "param.inc"
  8. DIMENSION X(10), W(3000), IACT(51)
  9. DIMENSION XL(10), XU(10)
  10. CHARACTER LINE0,LINE1,LINE2,LINE3
  11. DIMENSION LINE0(90),LINE1(90),LINE2(90),LINE3(90)
  12. ZERO=0.0D0
  13. ONE=1.0D0
  14. TWO=2.0D0
  15. EPS = 1.0D-5
  16. ITMAX = 100
  17. CALL PARAM("scbd.dat",PSC,PCE,PSE,BB,TAUSC,TAUCE,TAUSE,
  18. 1 FSC,FCE,FSE,AA)
  19. CW = VAL * CW
  20. SC = VAL * SC
  21. ASCR = VAL * ASCR
  22. ACER = VAL * ACER
  23. ASER = VAL * ASER
  24. POPSC0 = POPSC
  25. POPCE0 = POPCE
  26. POPSE0 = POPSE
  27. MUSC = 0.20D0
  28. MUCE = 0.20D0
  29. MUSE = 0.20D0
  30. DO 1, I=1,90
  31. LINE0(I)='-'
  32. LINE1(I)='='
  33. LINE2(I)='='
  34. LINE3(I)='='
  35. 1 CONTINUE
  36. LINE2(20)='N'
  37. LINE2(21)='0'
  38. LINE2(23)='T'
  39. LINE2(24)='R'
  40. LINE2(25)='A'
  41. LINE2(26)='I'
  42. LINE2(27)='N'
  43. LINE2(29)='S'
  44. LINE2(30)='E'
  45. LINE3(18)='W'
  46. LINE3(19)='I'
  47. LINE3(20)='T'
  48. LINE3(21)='H'
  49. LINE3(23)='T'
  50. LINE3(24)='R'
  51. LINE3(25)='A'
  52. LINE3(26)='I'
  53. LINE3(27)='N'
  54. LINE3(29)='S'
  55. LINE3(30)='E'
  56. C (* fixed costs, free-flow travel times *)
  57. dTse=DSQRT(dTsc*dTsc+dTce*dTce-2*dTsc*dTce*DCOS(theta))
  58. dRse=DSQRT(dRsc*dRsc+dRce*dRce-2*dRsc*dRce*DCOS(theta))
  59. Fsct=dTsc/sTsc*val
  60. Fcet=dTce/sTce*val
  61. Fset=dTse/sTse*val
  62. Fscr=dRsc/sRsc*val
  63. Fcer=dRce/sRce*val
  64. Fser=dRse/sRse*val
  65. C Fser=(theta*dRsc)/sRse*val
  66. POP = POPSC+POPCE+POPSE
  67. PRINT '(6F9.2)', FSCT, FCET, FSET, FSCR, FCER, FSER
  68. C ------------------------
  69. C Head of the output table
  70. C ------------------------
  71. PRINT '(90A)', LINE1
  72. WRITE (*, '(3X,A10,9X,A15,22X,A15)') 'ADM REGIME','TRAIN','ROADS'
  73. PRINT '(90A)', LINE0
  74. WRITE (*, '(16X,4A8,5X,4A8)') 'SC','CE','SE','AGR',
  75. & 'SC','CE','SE','AGR'
  76. PRINT '(90A)', LINE2
  77. C ------------------------
  78. C 1 -- COMPUTE THE OPTIMUM
  79. C ------------------------
  80. ID=1
  81. IT = 0
  82. 305 CONTINUE
  83. CALL OPTIMUM (TC,USCT,UCET,USET,FSC,FCE,FSE,AA,
  84. 1 PSC,PCE,BB,TAUSC,TAUCE,TAUSE,ID)
  85. C1T=FSCT+CW/(TWO*FSC)+ASCT*(USCT+USET)/FSC
  86. C2T=FCET+CW/(TWO*FCE)+ACET*(UCET+USET)/FCE
  87. C3T=C1T+C2T-AA*CW/(TWO*FSC)+(ONE-AA)*SC
  88. CT =(USCT*C1T+UCET*C2T+USET*C3T)/(USCT+UCET+USET)
  89. C1R=FSCR+ASCR*(POPSC-USCT)
  90. C2R=FCER+ACER*(POPCE-UCET)
  91. C3R=FSER+ASER*(POPSE-USET)
  92. CR =((POPSC-USCT)*C1R+(POPCE-UCET)*C2R+(POPSE-USET)*C3R)/
  93. & (POPSC+POPCE+POPSE-USCT-UCET-USET)
  94. POPSCOLD = POPSC
  95. POPCEOLD = POPCE
  96. POPSEOLD = POPSE
  97. POPSC = DEMAND(POPSC0, MUSC , FSCT, C1T)
  98. POPCE = DEMAND(POPCE0, MUCE , FCET, C2T)
  99. POPSE = DEMAND(POPSE0, MUSE , FSCT+FCET, C3T)
  100. ERR = ZERO
  101. ERR = ERR + QUADERR(POPSC,POPSCOLD)
  102. ERR = ERR + QUADERR(POPCE,POPCEOLD)
  103. ERR = ERR + QUADERR(POPSE,POPSEOLD)
  104. IT = IT + 1
  105. IF(IT.LE.ITMAX.AND.ERR.GT.EPS) GOTO 305
  106. WRITE (*, '(A12,35X,F8.4)' ) 'Optimum', TC
  107. POPTRAIN = USCT+UCET+USET
  108. POPCAR = POP-POPTRAIN
  109. WRITE (*, '(11X,A5,4F8.2,5X,4F8.2)') 'Users',
  110. & USCT,UCET,USET,POPTRAIN,
  111. & POPSC-USCT,POPCE-UCET,POPSE-USET,POPCAR
  112. WRITE (*, '(11X,A5,4F8.2,5X,4F8.2,5X)') 'Costs',
  113. & C1T,C2T,C3T,CT,C1R,C2R,C3R,CR
  114. WRITE (*, '(11X,A5,4F8.2)') 'Fares',PSC,PCE,BB*(PSC+PCE),
  115. & PSC*USCT+PCE*UCET+PSE*USET
  116. WRITE (*, '(11X,A5,37X,4F8.2)') 'Tolls',TAUSC,TAUCE,TAUSE,
  117. & (POPSC-USCT)*TAUSC+(POPCE-UCET)*TAUCE+(POPSE-USET)*TAUSE
  118. PRINT*, 'Populations --> ', POPSC, POPCE, POPSE, IT
  119. PRINT '(90A)', LINE0
  120. C Reset population
  121. POPSC = POPSC0
  122. POPCE = POPCE0
  123. POPSE = POPSE0
  124. C ------------------------
  125. C 2 -- BETA LIMITED: BETA <= BETA_MAX
  126. C ------------------------
  127. TAUSC=ZERO
  128. TAUCE=ZERO
  129. TAUSE=ZERO
  130. PSC =ZERO
  131. PCE =ZERO
  132. BB = 1.0D0
  133. CALL BETAFIXED (FSC,FCE,AA,PSC,PCE,BB,TAUSC,TAUCE,TAUSE,
  134. 1 USCT,UCET,USET,TC)
  135. WRITE (*, '(A12,35X,F8.4)' ) 'Beta bounded',TC
  136. POPTRAIN = USCT+UCET+USET
  137. POPCAR = POP-POPTRAIN
  138. WRITE (*, '(11X,A5,4F8.2,5X,4F8.2)') 'Users',
  139. & USCT,UCET,USET,POPTRAIN,
  140. & POPSC-USCT,POPCE-UCET,POPSE-USET,POPCAR
  141. C1T=FSCT+CW/(TWO*FSC)+ASCT*(USCT+USET)/FSC
  142. C2T=FCET+CW/(TWO*FCE)+ACET*(UCET+USET)/FCE
  143. C3T=C1T+C2T-AA*CW/(TWO*FSC)+(ONE-AA)*SC
  144. CT =(USCT*C1T+UCET*C2T+USET*C3T)/(USCT+UCET+USET)
  145. C1R=FSCR+ASCR*(POPSC-USCT)
  146. C2R=FCER+ACER*(POPCE-UCET)
  147. C3R=FSER+ASER*(POPSE-USET)
  148. CR =((POPSC-USCT)*C1R+(POPCE-UCET)*C2R+(POPSE-USET)*C3R)/
  149. & (POPSC+POPCE+POPSE-USCT-UCET-USET)
  150. WRITE (*, '(11X,A5,4F8.2,5X,4F8.2,5X)') 'Costs',
  151. & C1T,C2T,C3T,CT,C1R,C2R,C3R,CR
  152. WRITE (*, '(11X,A5,4F8.2)') 'Fares',PSC,PCE,BB*(PSC+PCE),
  153. & PSC*USCT+PCE*UCET+PSE*USET
  154. WRITE (*, '(11X,A5,37X,4F8.2)') 'Tolls',TAUSC,TAUCE,TAUSE,
  155. & (POPSC-USCT)*TAUSC+(POPCE-UCET)*TAUCE+(POPSE-USET)*TAUSE
  156. PRINT '(90A)', LINE0
  157. CC -------------------------
  158. CC 2 -- UNPRICED EQUILIBRIUM
  159. CC -------------------------
  160. ID = 2
  161. IT = 0
  162. 300 CONTINUE
  163. C PRINT*, "-->", IT, POPSC, POPCE, POPSE, ERR
  164. CALL EQUILIBRIUM (TC,USCT,UCET,USET,FSC,FCE,FSE,AA,
  165. 1 ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ID)
  166. POPTRAIN = USCT+UCET+USET
  167. POPCAR = POP-POPTRAIN
  168. C1T=FSCT+CW/(TWO*FSC)+ASCT*(USCT+USET)/FSC
  169. C2T=FCET+CW/(TWO*FCE)+ACET*(UCET+USET)/FCE
  170. C3T=C1T+C2T-AA*CW/(TWO*FSC)+(ONE-AA)*SC
  171. CT =(USCT*C1T+UCET*C2T+USET*C3T)/(USCT+UCET+USET)
  172. C1R=FSCR+ASCR*(POPSC-USCT)
  173. C2R=FCER+ACER*(POPCE-UCET)
  174. C3R=FSER+ASER*(POPSE-USET)
  175. CR =((POPSC-USCT)*C1R+(POPCE-UCET)*C2R+(POPSE-USET)*C3R)/
  176. & (POPSC+POPCE+POPSE-USCT-UCET-USET)
  177. POPSCOLD = POPSC
  178. POPCEOLD = POPCE
  179. POPSEOLD = POPSE
  180. POPSC = DEMAND(POPSC0, MUSC , FSCT, C1T)
  181. POPCE = DEMAND(POPCE0, MUCE , FCET, C2T)
  182. POPSE = DEMAND(POPSE0, MUSE , FSCT+FCET, C3T)
  183. ERR = ZERO
  184. ERR = ERR + QUADERR(POPSC,POPSCOLD)
  185. ERR = ERR + QUADERR(POPCE,POPCEOLD)
  186. ERR = ERR + QUADERR(POPSE,POPSEOLD)
  187. IT = IT + 1
  188. IF(IT.LE.ITMAX.AND.ERR.GT.EPS) GOTO 300
  189. WRITE (*, '(A12,35X,F8.4)' ) 'Unpriced', TC
  190. WRITE (*, '(11X,A5,4F8.2,5X,4F8.2)') 'Users',
  191. & USCT,UCET,USET,POPTRAIN,
  192. & POPSC-USCT,POPCE-UCET,POPSE-USET,POPCAR
  193. WRITE (*, '(11X,A5,4F8.2,5X,4F8.2)') 'Costs',
  194. & C1T,C2T,C3T,CT,C1R,C2R,C3R,CR
  195. PRINT*, 'Populations --> ', POPSC, POPCE, POPSE, IT
  196. PRINT '(90A)', LINE0
  197. C Reset population
  198. POPSC = POPSC0
  199. POPCE = POPCE0
  200. POPSE = POPSE0
  201. CC -----------------------
  202. CC 2 -- PRICED EQUILIBRIUM
  203. CC -----------------------
  204. C TAUSC= ZERO
  205. C TAUCE= ZERO
  206. C TAUSE= ZERO
  207. C PSC = -0.97D0
  208. C PCE = -0.97D0
  209. C BB = 0.74D0
  210. C PRINT*, '---------PRICED EQUIL'
  211. C CALL EQUILIBRIUM (TC,USCT,UCET,USET,FSC,FCE,AA,
  212. C 1 PSC,PCE,BB,TAUSC,TAUCE,TAUSE)
  213. C WRITE (*,'(4F9.4)') TC, USCT,UCET,USET
  214. CC -----------------------
  215. CC 2 -- ROAD PROFIT
  216. CC -----------------------
  217. IT = 0
  218. 310 CONTINUE
  219. CALL PRFROAD (PRFR,TC,USCT,UCET,USET,FSC,FCE,AA,
  220. 1 ZERO,ZERO,ZERO,TAUSC,TAUCE,TAUSE)
  221. C WRITE (*,'(8F9.4)') TC, USCT,UCET,USET,PRFR,TAUSC,TAUCE,TAUSE
  222. C1T=FSCT+CW/(TWO*FSC)+ASCT*(USCT+USET)/FSC
  223. C2T=FCET+CW/(TWO*FCE)+ACET*(UCET+USET)/FCE
  224. C3T=C1T+C2T-AA*CW/(TWO*FSC)+(ONE-AA)*SC
  225. CT =(USCT*C1T+UCET*C2T+USET*C3T)/(USCT+UCET+USET)
  226. C1R=FSCR+ASCR*(POPSC-USCT)
  227. C2R=FCER+ACER*(POPCE-UCET)
  228. C3R=FSER+ASER*(POPSE-USET)
  229. CR =((POPSC-USCT)*C1R+(POPCE-UCET)*C2R+(POPSE-USET)*C3R)/
  230. & (POPSC+POPCE+POPSE-USCT-UCET-USET)
  231. POPSCOLD = POPSC
  232. POPCEOLD = POPCE
  233. POPSEOLD = POPSE
  234. POPSC = DEMAND(POPSC0, MUSC , FSCT, C1T)
  235. POPCE = DEMAND(POPCE0, MUCE , FCET, C2T)
  236. POPSE = DEMAND(POPSE0, MUSE , FSCT+FCET, C3T)
  237. ERR = ZERO
  238. ERR = ERR + QUADERR(POPSC,POPSCOLD)
  239. ERR = ERR + QUADERR(POPCE,POPCEOLD)
  240. ERR = ERR + QUADERR(POPSE,POPSEOLD)
  241. IT = IT + 1
  242. IF(IT.LE.ITMAX.AND.ERR.GT.EPS) GOTO 310
  243. WRITE (*, '(A12,35X,F8.4)' ) 'Road prf', TC
  244. POPTRAIN = USCT+UCET+USET
  245. POPCAR = POP-POPTRAIN
  246. WRITE (*, '(11X,A5,4F8.2,5X,4F8.2)') 'Users',
  247. & USCT,UCET,USET,POPTRAIN,
  248. & POPSC-USCT,POPCE-UCET,POPSE-USET,POPCAR
  249. WRITE (*, '(11X,A5,4F8.2,5X,4F8.2,5X)') 'Costs',
  250. & C1T,C2T,C3T,CT,C1R,C2R,C3R,CR
  251. WRITE (*, '(11X,A5,37X,4F8.2)') 'Tolls',TAUSC,TAUCE,TAUSE,PRFR
  252. PRINT*, 'Populations --> ', POPSC, POPCE, POPSE, IT
  253. PRINT '(90A)', LINE0
  254. C Reset population
  255. POPSC = POPSC0
  256. POPCE = POPCE0
  257. POPSE = POPSE0
  258. CC --------------------
  259. CC 2 -- TRAIN PROFIT
  260. CC --------------------
  261. IT = 0
  262. 320 CONTINUE
  263. CALL PRFTRAIN (PRFT,TC,USCT,UCET,USET,FSC,FCE,AA,
  264. 1 PSC,PCE,BB,ZERO,ZERO,ZERO)
  265. C1T=FSCT+CW/(TWO*FSC)+ASCT*(USCT+USET)/FSC
  266. C2T=FCET+CW/(TWO*FCE)+ACET*(UCET+USET)/FCE
  267. C3T=C1T+C2T-AA*CW/(TWO*FSC)+(ONE-AA)*SC
  268. CT =(USCT*C1T+UCET*C2T+USET*C3T)/(USCT+UCET+USET)
  269. C1R=FSCR+ASCR*(POPSC-USCT)
  270. C2R=FCER+ACER*(POPCE-UCET)
  271. C3R=FSER+ASER*(POPSE-USET)
  272. CR =((POPSC-USCT)*C1R+(POPCE-UCET)*C2R+(POPSE-USET)*C3R)/
  273. & (POPSC+POPCE+POPSE-USCT-UCET-USET)
  274. POPSCOLD = POPSC
  275. POPCEOLD = POPCE
  276. POPSEOLD = POPSE
  277. POPSC = DEMAND(POPSC0, MUSC , FSCT, C1T + PSC)
  278. POPCE = DEMAND(POPCE0, MUCE , FCET, C2T + PCE)
  279. POPSE = DEMAND(POPSE0, MUSE , FSCT+FCET, C3T + PSC + PCE )
  280. ERR = ZERO
  281. ERR = ERR + QUADERR(POPSC,POPSCOLD)
  282. ERR = ERR + QUADERR(POPCE,POPCEOLD)
  283. ERR = ERR + QUADERR(POPSE,POPSEOLD)
  284. IT = IT + 1
  285. IF(IT.LE.ITMAX.AND.ERR.GT.EPS) GOTO 320
  286. WRITE (*, '(A12,35X,F8.4)' ) 'Train prf', TC
  287. POPTRAIN = USCT+UCET+USET
  288. POPCAR = POP-POPTRAIN
  289. WRITE (*, '(11X,A5,4F8.2,5X,4F8.2)') 'Users',
  290. & USCT,UCET,USET,POPTRAIN,
  291. & POPSC-USCT,POPCE-UCET,POPSE-USET,POPCAR
  292. WRITE (*, '(11X,A5,4F8.2,5X,4F8.2,5X)') 'Costs',
  293. & C1T,C2T,C3T,CT,C1R,C2R,C3R,CR
  294. WRITE (*, '(11X,A5,4F8.2)') 'Fares',PSC,PCE,BB*(PSC+PCE),PRFT
  295. PRINT*, 'Populations --> ', POPSC, POPCE, POPSE, IT
  296. PRINT '(90A)', LINE0
  297. C Reset population
  298. POPSC = POPSC0
  299. POPCE = POPCE0
  300. POPSE = POPSE0
  301. CC --------------------
  302. CC 2 -- SEMI-PUBLIC
  303. CC --------------------
  304. PSC = ZERO
  305. PCE = ZERO
  306. PSE = ZERO
  307. IT = 0
  308. 330 CONTINUE
  309. CALL SEMIPUBLIC (PRFT,PRFR,TC,USCT,UCET,USET,FSC,FCE,AA,
  310. 1 PSC,PCE,BB,TAUSC,TAUCE,TAUSE)
  311. C1T=FSCT+CW/(TWO*FSC)+ASCT*(USCT+USET)/FSC
  312. C2T=FCET+CW/(TWO*FCE)+ACET*(UCET+USET)/FCE
  313. C3T=C1T+C2T-AA*CW/(TWO*FSC)+(ONE-AA)*SC
  314. CT =(USCT*C1T+UCET*C2T+USET*C3T)/(USCT+UCET+USET)
  315. C1R=FSCR+ASCR*(POPSC-USCT)
  316. C2R=FCER+ACER*(POPCE-UCET)
  317. C3R=FSER+ASER*(POPSE-USET)
  318. CR =((POPSC-USCT)*C1R+(POPCE-UCET)*C2R+(POPSE-USET)*C3R)/
  319. & (POPSC+POPCE+POPSE-USCT-UCET-USET)
  320. POPSCOLD = POPSC
  321. POPCEOLD = POPCE
  322. POPSEOLD = POPSE
  323. POPSC = DEMAND(POPSC0, MUSC , FSCT, C1T+PSC)
  324. POPCE = DEMAND(POPCE0, MUCE , FCET, C2T+PCE)
  325. POPSE = DEMAND(POPSE0, MUSE , FSCT+FCET, C3T+PSC+PCE)
  326. ERR = ZERO
  327. ERR = ERR + QUADERR(POPSC,POPSCOLD)
  328. ERR = ERR + QUADERR(POPCE,POPCEOLD)
  329. ERR = ERR + QUADERR(POPSE,POPSEOLD)
  330. IT = IT + 1
  331. IF(IT.LE.ITMAX.AND.ERR.GT.EPS) GOTO 330
  332. WRITE (*, '(A12,35X,F8.4)' ) 'Semi-pub', TC
  333. POPTRAIN = USCT+UCET+USET
  334. POPCAR = POP-POPTRAIN
  335. WRITE (*, '(11X,A5,4F8.2,5X,4F8.2)') 'Users',
  336. & USCT,UCET,USET,POPTRAIN,
  337. & POPSC-USCT,POPCE-UCET,POPSE-USET,POPCAR
  338. WRITE (*, '(11X,A5,4F8.2,5X,4F8.2,5X)') 'Costs',
  339. & C1T,C2T,C3T,CT,C1R,C2R,C3R,CR
  340. WRITE (*, '(11X,A5,4F8.2)') 'Fares',PSC,PCE,BB*(PSC+PCE),PRFT
  341. WRITE (*, '(11X,A5,37X,4F8.2)') 'Tolls',TAUSC,TAUCE,TAUSE,PRFR
  342. PRINT*, 'Populations --> ', POPSC, POPCE, POPSE, IT
  343. PRINT '(90A)', LINE0
  344. C Reset population
  345. POPSC = POPSC0
  346. POPCE = POPCE0
  347. POPSE = POPSE0
  348. CC --------------------
  349. CC 2 -- DUOPOLY
  350. CC --------------------
  351. IT = 0
  352. 340 CONTINUE
  353. CALL DUOPOLY (PRFT,PRFR,TC,USCT,UCET,USET,FSC,FCE,AA,
  354. 1 PSC,PCE,BB,TAUSC,TAUCE,TAUSE)
  355. C1T=FSCT+CW/(TWO*FSC)+ASCT*(USCT+USET)/FSC
  356. C2T=FCET+CW/(TWO*FCE)+ACET*(UCET+USET)/FCE
  357. C3T=C1T+C2T-AA*CW/(TWO*FSC)+(ONE-AA)*SC
  358. CT =(USCT*C1T+UCET*C2T+USET*C3T)/(USCT+UCET+USET)
  359. C1R=FSCR+ASCR*(POPSC-USCT)
  360. C2R=FCER+ACER*(POPCE-UCET)
  361. C3R=FSER+ASER*(POPSE-USET)
  362. CR =((POPSC-USCT)*C1R+(POPCE-UCET)*C2R+(POPSE-USET)*C3R)/
  363. & (POPSC+POPCE+POPSE-USCT-UCET-USET)
  364. POPSCOLD = POPSC
  365. POPCEOLD = POPCE
  366. POPSEOLD = POPSE
  367. POPSC = DEMAND(POPSC0, MUSC , FSCT, C1T+PSC)
  368. POPCE = DEMAND(POPCE0, MUCE , FCET, C2T+PCE)
  369. POPSE = DEMAND(POPSE0, MUSE , FSCT+FCET, C3T+PSC+PCE)
  370. ERR = ZERO
  371. ERR = ERR + QUADERR(POPSC,POPSCOLD)
  372. ERR = ERR + QUADERR(POPCE,POPCEOLD)
  373. ERR = ERR + QUADERR(POPSE,POPSEOLD)
  374. IT = IT + 1
  375. IF(IT.LE.ITMAX.AND.ERR.GT.EPS) GOTO 340
  376. WRITE (*, '(A12,35X,F8.4)' ) 'Duopoly', TC
  377. POPTRAIN = USCT+UCET+USET
  378. POPCAR = POP-POPTRAIN
  379. WRITE (*, '(11X,A5,4F8.2,5X,4F8.2)') 'Users',
  380. & USCT,UCET,USET,POPTRAIN,
  381. & POPSC-USCT,POPCE-UCET,POPSE-USET,POPCAR
  382. WRITE (*, '(11X,A5,4F8.2,5X,4F8.2,5X)') 'Costs',
  383. & C1T,C2T,C3T,CT,C1R,C2R,C3R,CR
  384. WRITE (*, '(11X,A5,4F8.2)') 'Fares',PSC,PCE,BB*(PSC+PCE),PRFT
  385. WRITE (*, '(11X,A5,37X,4F8.2)') 'Tolls',TAUSC,TAUCE,TAUSE,PRFR
  386. PRINT*, 'Populations --> ', POPSC, POPCE, POPSE, IT
  387. PRINT '(90A)', LINE3
  388. WRITE (*, '(16X,4A8,5X,4A8)') 'SC','CE','SE','AGR',
  389. & 'SC','CE','SE','AGR'
  390. PRINT '(90A)', LINE0
  391. C Reset population
  392. POPSC = POPSC0
  393. POPCE = POPCE0
  394. POPSE = POPSE0
  395. C ---------------------------------------------
  396. C 1 -- COMPUTE THE OPTIMUM WITH DIRECT TRAIN SE
  397. C ---------------------------------------------
  398. ID=10
  399. IT = 0
  400. 400 CONTINUE
  401. CALL OPTIMUM (TC,USCT,UCET,USET,FSC,FCE,FSE,AA,
  402. 1 PSC,PCE,BB,TAUSC,TAUCE,TAUSE,ID)
  403. C1T=FSCT+CW/(TWO*FSC)+ASCT*USCT/FSC
  404. C2T=FCET+CW/(TWO*FCE)+ACET*UCET/FCE
  405. C3T=FSET+CW/(TWO*FSE)+ASET*USET/FCE
  406. CT =(USCT*C1T+UCET*C2T+USET*C3T)/(USCT+UCET+USET)
  407. C1R=FSCR+ASCR*(POPSC-USCT)
  408. C2R=FCER+ACER*(POPCE-UCET)
  409. C3R=FSER+ASER*(POPSE-USET)
  410. CR =((POPSC-USCT)*C1R+(POPCE-UCET)*C2R+(POPSE-USET)*C3R)/
  411. & (POPSC+POPCE+POPSE-USCT-UCET-USET)
  412. POPSCOLD = POPSC
  413. POPCEOLD = POPCE
  414. POPSEOLD = POPSE
  415. POPSC = DEMAND(POPSC0, MUSC , FSCT, C1T)
  416. POPCE = DEMAND(POPCE0, MUCE , FCET, C2T)
  417. POPSE = DEMAND(POPSE0, MUSE , FSET, C3T)
  418. ERR = ZERO
  419. ERR = ERR + QUADERR(POPSC,POPSCOLD)
  420. ERR = ERR + QUADERR(POPCE,POPCEOLD)
  421. ERR = ERR + QUADERR(POPSE,POPSEOLD)
  422. IT = IT + 1
  423. IF(IT.LE.ITMAX.AND.ERR.GT.EPS) GOTO 400
  424. WRITE (*, '(A12,35X,F8.4)' ) 'Optimum', TC
  425. POPTRAIN = USCT+UCET+USET
  426. POPCAR = POP-POPTRAIN
  427. WRITE (*, '(11X,A5,4F8.2,5X,4F8.2)') 'Users',
  428. & USCT,UCET,USET,POPTRAIN,
  429. & POPSC-USCT,POPCE-UCET,POPSE-USET,POPCAR
  430. WRITE (*, '(11X,A5,4F8.2,5X,4F8.2)') 'Costs',
  431. & C1T,C2T,C3T,CT,C1R,C2R,C3R,CR
  432. WRITE (*, '(11X,A5,4F8.2)') 'Fares',PSC,PCE,BB,
  433. & PSC*USCT+PCE*UCET+PSE*USET
  434. WRITE (*, '(11X,A5,37X,4F8.2)') 'Tolls',TAUSC,TAUCE,TAUSE,
  435. & (POPSC-USCT)*TAUSC+(POPCE-UCET)*TAUCE+(POPSE-USET)*TAUSE
  436. PRINT*, 'Populations --> ', POPSC, POPCE, POPSE, IT
  437. PRINT '(90A)', LINE0
  438. C Reset population
  439. POPSC = POPSC0
  440. POPCE = POPCE0
  441. POPSE = POPSE0
  442. CC ----------------------------------------------
  443. CC 2 -- UNPRICED EQUILIBRIUM WITH DIRECT TRAIN SE
  444. CC ----------------------------------------------
  445. ID = 11
  446. IT = 0
  447. 410 CONTINUE
  448. CALL EQUILIBRIUM (TC,USCT,UCET,USET,FSC,FCE,FSE,AA,
  449. 1 ZERO,ZERO,ZERO,ZERO,ZERO,ZERO,ID)
  450. C1T=FSCT+CW/(TWO*FSC)+ASCT*USCT/FSC
  451. C2T=FCET+CW/(TWO*FCE)+ACET*UCET/FCE
  452. C3T=FSET+CW/(TWO*FSE)+ASET*USET/FCE
  453. CT =(USCT*C1T+UCET*C2T+USET*C3T)/(USCT+UCET+USET)
  454. C1R=FSCR+ASCR*(POPSC-USCT)
  455. C2R=FCER+ACER*(POPCE-UCET)
  456. C3R=FSER+ASER*(POPSE-USET)
  457. CR =((POPSC-USCT)*C1R+(POPCE-UCET)*C2R+(POPSE-USET)*C3R)/
  458. & (POPSC+POPCE+POPSE-USCT-UCET-USET)
  459. POPSCOLD = POPSC
  460. POPCEOLD = POPCE
  461. POPSEOLD = POPSE
  462. POPSC = DEMAND(POPSC0, MUSC , FSCT, C1T)
  463. POPCE = DEMAND(POPCE0, MUCE , FCET, C2T)
  464. POPSE = DEMAND(POPSE0, MUSE , FSET, C3T)
  465. ERR = ZERO
  466. ERR = ERR + QUADERR(POPSC,POPSCOLD)
  467. ERR = ERR + QUADERR(POPCE,POPCEOLD)
  468. ERR = ERR + QUADERR(POPSE,POPSEOLD)
  469. IT = IT + 1
  470. IF(IT.LE.ITMAX.AND.ERR.GT.EPS) GOTO 410
  471. WRITE (*, '(A12,35X,F8.4)' ) 'Unpriced', TC
  472. POPTRAIN = USCT+UCET+USET
  473. POPCAR = POP-POPTRAIN
  474. WRITE (*, '(11X,A5,4F8.2,5X,4F8.2)') 'Users',
  475. & USCT,UCET,USET,POPTRAIN,
  476. & POPSC-USCT,POPCE-UCET,POPSE-USET,POPCAR
  477. WRITE (*, '(11X,A5,4F8.2,5X,4F8.2,5X)') 'Costs',
  478. & C1T,C2T,C3T,CT,C1R,C2R,C3R,CR
  479. PRINT*, 'Populations --> ', POPSC, POPCE, POPSE, IT
  480. PRINT '(90A)', LINE1
  481. C Reset population (No need at the end of the program)
  482. C POPSC = POPSC0
  483. C POPCE = POPCE0
  484. C POPSE = POPSE0
  485. END
  486. FUNCTION DEMAND(POP, MU, C0, C)
  487. IMPLICIT NONE
  488. DOUBLE PRECISION DEMAND, POP, MU, C0, C
  489. C DEMAND = POP ** ( 1.0D0 - MU * ( C/C0 - 1.0D0) )
  490. DEMAND = POP * ( C/C0 ) ** ( - MU )
  491. RETURN
  492. END
  493. FUNCTION QUADERR(X1, X2)
  494. IMPLICIT NONE
  495. DOUBLE PRECISION QUADERR, X1, X2
  496. QUADERR = DSQRT( (X1-X2) ** 2 )
  497. RETURN
  498. END