lsod.f 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. *DECK LSOD
  2. SUBROUTINE LSOD (F, NEQ, T, Y, TOUT, RTOL, ATOL, IDID, YPOUT, YH,
  3. + YH1, EWT, SAVF, ACOR, WM, IWM, JAC, INTOUT, TSTOP, TOLFAC,
  4. + DELSGN, RPAR, IPAR)
  5. C***BEGIN PROLOGUE LSOD
  6. C***SUBSIDIARY
  7. C***PURPOSE Subsidiary to DEBDF
  8. C***LIBRARY SLATEC
  9. C***TYPE SINGLE PRECISION (LSOD-S, DLSOD-D)
  10. C***AUTHOR (UNKNOWN)
  11. C***DESCRIPTION
  12. C
  13. C DEBDF merely allocates storage for LSOD to relieve the user of
  14. C the inconvenience of a long call list. Consequently LSOD is used
  15. C as described in the comments for DEBDF .
  16. C
  17. C***SEE ALSO DEBDF
  18. C***ROUTINES CALLED HSTART, INTYD, R1MACH, STOD, VNWRMS, XERMSG
  19. C***COMMON BLOCKS DEBDF1
  20. C***REVISION HISTORY (YYMMDD)
  21. C 800901 DATE WRITTEN
  22. C 890531 Changed all specific intrinsics to generic. (WRB)
  23. C 890831 Modified array declarations. (WRB)
  24. C 891214 Prologue converted to Version 4.0 format. (BAB)
  25. C 900328 Added TYPE section. (WRB)
  26. C 900510 Convert XERRWV calls to XERMSG calls. (RWC)
  27. C***END PROLOGUE LSOD
  28. C
  29. C
  30. LOGICAL INTOUT
  31. C
  32. DIMENSION Y(*),YPOUT(*),YH(NEQ,6),YH1(*),EWT(*),SAVF(*),
  33. 1 ACOR(*),WM(*),IWM(*),RTOL(*),ATOL(*),RPAR(*),IPAR(*)
  34. CHARACTER*8 XERN1
  35. CHARACTER*16 XERN3, XERN4
  36. C
  37. COMMON /DEBDF1/ TOLD, ROWNS(210),
  38. 1 EL0, H, HMIN, HMXI, HU, X, U,
  39. 2 IQUIT, INIT, LYH, LEWT, LACOR, LSAVF, LWM, KSTEPS,
  40. 3 IBEGIN, ITOL, IINTEG, ITSTOP, IJAC, IBAND, IOWNS(6),
  41. 4 IER, JSTART, KFLAG, LDUM, METH, MITER, MAXORD, N, NQ, NST,
  42. 5 NFE, NJE, NQU
  43. C
  44. EXTERNAL F, JAC
  45. C
  46. C.......................................................................
  47. C
  48. C THE EXPENSE OF SOLVING THE PROBLEM IS MONITORED BY COUNTING THE
  49. C NUMBER OF STEPS ATTEMPTED. WHEN THIS EXCEEDS MAXNUM, THE COUNTER
  50. C IS RESET TO ZERO AND THE USER IS INFORMED ABOUT POSSIBLE EXCESSIVE
  51. C WORK.
  52. C
  53. SAVE MAXNUM
  54. DATA MAXNUM/500/
  55. C
  56. C.......................................................................
  57. C
  58. C***FIRST EXECUTABLE STATEMENT LSOD
  59. IF (IBEGIN .EQ. 0) THEN
  60. C
  61. C ON THE FIRST CALL , PERFORM INITIALIZATION --
  62. C DEFINE THE MACHINE UNIT ROUNDOFF QUANTITY U BY CALLING THE
  63. C FUNCTION ROUTINE R1MACH. THE USER MUST MAKE SURE THAT THE
  64. C VALUES SET IN R1MACH ARE RELEVANT TO THE COMPUTER BEING USED.
  65. C
  66. U = R1MACH(4)
  67. C -- SET ASSOCIATED MACHINE DEPENDENT PARAMETER
  68. WM(1) = SQRT(U)
  69. C -- SET TERMINATION FLAG
  70. IQUIT = 0
  71. C -- SET INITIALIZATION INDICATOR
  72. INIT = 0
  73. C -- SET COUNTER FOR ATTEMPTED STEPS
  74. KSTEPS = 0
  75. C -- SET INDICATOR FOR INTERMEDIATE-OUTPUT
  76. INTOUT = .FALSE.
  77. C -- SET START INDICATOR FOR STOD CODE
  78. JSTART = 0
  79. C -- SET BDF METHOD INDICATOR
  80. METH = 2
  81. C -- SET MAXIMUM ORDER FOR BDF METHOD
  82. MAXORD = 5
  83. C -- SET ITERATION MATRIX INDICATOR
  84. C
  85. IF (IJAC .EQ. 0 .AND. IBAND .EQ. 0) MITER = 2
  86. IF (IJAC .EQ. 1 .AND. IBAND .EQ. 0) MITER = 1
  87. IF (IJAC .EQ. 0 .AND. IBAND .EQ. 1) MITER = 5
  88. IF (IJAC .EQ. 1 .AND. IBAND .EQ. 1) MITER = 4
  89. C
  90. C -- SET OTHER NECESSARY ITEMS IN COMMON BLOCK
  91. N = NEQ
  92. NST = 0
  93. NJE = 0
  94. HMXI = 0.
  95. NQ = 1
  96. H = 1.
  97. C -- RESET IBEGIN FOR SUBSEQUENT CALLS
  98. IBEGIN=1
  99. ENDIF
  100. C
  101. C.......................................................................
  102. C
  103. C CHECK VALIDITY OF INPUT PARAMETERS ON EACH ENTRY
  104. C
  105. IF (NEQ .LT. 1) THEN
  106. WRITE (XERN1, '(I8)') NEQ
  107. CALL XERMSG ('SLATEC', 'LSOD',
  108. * 'IN DEBDF, THE NUMBER OF EQUATIONS MUST BE A POSITIVE ' //
  109. * 'INTEGER.$$YOU HAVE CALLED THE CODE WITH NEQ = ' // XERN1,
  110. * 6, 1)
  111. IDID=-33
  112. ENDIF
  113. C
  114. NRTOLP = 0
  115. NATOLP = 0
  116. DO 60 K = 1,NEQ
  117. IF (NRTOLP .LE. 0) THEN
  118. IF (RTOL(K) .LT. 0.) THEN
  119. WRITE (XERN1, '(I8)') K
  120. WRITE (XERN3, '(1PE15.6)') RTOL(K)
  121. CALL XERMSG ('SLATEC', 'LSOD',
  122. * 'IN DEBDF, THE RELATIVE ERROR TOLERANCES MUST ' //
  123. * 'BE NON-NEGATIVE.$$YOU HAVE CALLED THE CODE WITH ' //
  124. * 'RTOL(' // XERN1 // ') = ' // XERN3 // '$$IN THE ' //
  125. * 'CASE OF VECTOR ERROR TOLERANCES, NO FURTHER ' //
  126. * 'CHECKING OF RTOL COMPONENTS IS DONE.', 7, 1)
  127. IDID = -33
  128. IF (NATOLP .GT. 0) GO TO 70
  129. NRTOLP = 1
  130. ELSEIF (NATOLP .GT. 0) THEN
  131. GO TO 50
  132. ENDIF
  133. ENDIF
  134. C
  135. IF (ATOL(K) .LT. 0.) THEN
  136. WRITE (XERN1, '(I8)') K
  137. WRITE (XERN3, '(1PE15.6)') ATOL(K)
  138. CALL XERMSG ('SLATEC', 'LSOD',
  139. * 'IN DEBDF, THE ABSOLUTE ERROR ' //
  140. * 'TOLERANCES MUST BE NON-NEGATIVE.$$YOU HAVE CALLED ' //
  141. * 'THE CODE WITH ATOL(' // XERN1 // ') = ' // XERN3 //
  142. * '$$IN THE CASE OF VECTOR ERROR TOLERANCES, NO FURTHER '
  143. * // 'CHECKING OF ATOL COMPONENTS IS DONE.', 8, 1)
  144. IDID=-33
  145. IF (NRTOLP .GT. 0) GO TO 70
  146. NATOLP=1
  147. ENDIF
  148. 50 IF (ITOL .EQ. 0) GO TO 70
  149. 60 CONTINUE
  150. C
  151. 70 IF (ITSTOP .EQ. 1) THEN
  152. IF (SIGN(1.,TOUT-T) .NE. SIGN(1.,TSTOP-T) .OR.
  153. 1 ABS(TOUT-T) .GT. ABS(TSTOP-T)) THEN
  154. WRITE (XERN3, '(1PE15.6)') TOUT
  155. WRITE (XERN4, '(1PE15.6)') TSTOP
  156. CALL XERMSG ('SLATEC', 'LSOD',
  157. * 'IN DEBDF, YOU HAVE CALLED THE ' //
  158. * 'CODE WITH TOUT = ' // XERN3 // '$$BUT YOU HAVE ' //
  159. * 'ALSO TOLD THE CODE NOT TO INTEGRATE PAST THE POINT ' //
  160. * 'TSTOP = ' // XERN4 // ' BY SETTING INFO(4) = 1. ' //
  161. * 'THESE INSTRUCTIONS CONFLICT.', 14, 1)
  162. IDID=-33
  163. ENDIF
  164. ENDIF
  165. C
  166. C CHECK SOME CONTINUATION POSSIBILITIES
  167. C
  168. IF (INIT .NE. 0) THEN
  169. IF (T .EQ. TOUT) THEN
  170. WRITE (XERN3, '(1PE15.6)') T
  171. CALL XERMSG ('SLATEC', 'LSOD',
  172. * 'IN DEBDF, YOU HAVE CALLED THE CODE WITH T = TOUT = ' //
  173. * XERN3 // ' THIS IS NOT ALLOWED ON CONTINUATION CALLS.',
  174. * 9, 1)
  175. IDID=-33
  176. ENDIF
  177. C
  178. IF (T .NE. TOLD) THEN
  179. WRITE (XERN3, '(1PE15.6)') TOLD
  180. WRITE (XERN4, '(1PE15.6)') T
  181. CALL XERMSG ('SLATEC', 'LSOD',
  182. * 'IN DEBDF, YOU HAVE CHANGED THE VALUE OF T FROM ' //
  183. * XERN3 // ' TO ' // XERN4 //
  184. * ' THIS IS NOT ALLOWED ON CONTINUATION CALLS.', 10, 1)
  185. IDID=-33
  186. ENDIF
  187. C
  188. IF (INIT .NE. 1) THEN
  189. IF (DELSGN*(TOUT-T) .LT. 0.) THEN
  190. WRITE (XERN3, '(1PE15.6)') TOUT
  191. CALL XERMSG ('SLATEC', 'LSOD',
  192. * 'IN DEBDF, BY CALLING THE CODE WITH TOUT = ' //
  193. * XERN3 // ' YOU ARE ATTEMPTING TO CHANGE THE ' //
  194. * 'DIRECTION OF INTEGRATION.$$' //
  195. * 'THIS IS NOT ALLOWED WITHOUT RESTARTING.', 11, 1)
  196. IDID=-33
  197. ENDIF
  198. ENDIF
  199. ENDIF
  200. C
  201. IF (IDID .EQ. (-33)) THEN
  202. IF (IQUIT .NE. (-33)) THEN
  203. C INVALID INPUT DETECTED
  204. IQUIT=-33
  205. IBEGIN=-1
  206. ELSE
  207. CALL XERMSG ('SLATEC', 'LSOD',
  208. * 'IN DEBDF, INVALID INPUT WAS ' //
  209. * 'DETECTED ON SUCCESSIVE ENTRIES. IT IS IMPOSSIBLE ' //
  210. * 'TO PROCEED BECAUSE YOU HAVE NOT CORRECTED THE ' //
  211. * 'PROBLEM, SO EXECUTION IS BEING TERMINATED.', 12, 2)
  212. ENDIF
  213. RETURN
  214. ENDIF
  215. C
  216. C.......................................................................
  217. C
  218. C RTOL = ATOL = 0. IS ALLOWED AS VALID INPUT AND INTERPRETED AS
  219. C ASKING FOR THE MOST ACCURATE SOLUTION POSSIBLE. IN THIS CASE,
  220. C THE RELATIVE ERROR TOLERANCE RTOL IS RESET TO THE SMALLEST VALUE
  221. C 100*U WHICH IS LIKELY TO BE REASONABLE FOR THIS METHOD AND MACHINE
  222. C
  223. DO 170 K=1,NEQ
  224. IF (RTOL(K)+ATOL(K) .GT. 0.) GO TO 160
  225. RTOL(K)=100.*U
  226. IDID=-2
  227. 160 IF (ITOL .EQ. 0) GO TO 180
  228. 170 CONTINUE
  229. C
  230. 180 IF (IDID .NE. (-2)) GO TO 190
  231. C RTOL=ATOL=0 ON INPUT, SO RTOL IS CHANGED TO A
  232. C SMALL POSITIVE VALUE
  233. IBEGIN=-1
  234. RETURN
  235. C
  236. C BRANCH ON STATUS OF INITIALIZATION INDICATOR
  237. C INIT=0 MEANS INITIAL DERIVATIVES AND NOMINAL STEP SIZE
  238. C AND DIRECTION NOT YET SET
  239. C INIT=1 MEANS NOMINAL STEP SIZE AND DIRECTION NOT YET SET
  240. C INIT=2 MEANS NO FURTHER INITIALIZATION REQUIRED
  241. C
  242. 190 IF (INIT .EQ. 0) GO TO 200
  243. IF (INIT .EQ. 1) GO TO 220
  244. GO TO 240
  245. C
  246. C.......................................................................
  247. C
  248. C MORE INITIALIZATION --
  249. C -- EVALUATE INITIAL DERIVATIVES
  250. C
  251. 200 INIT=1
  252. CALL F(T,Y,YH(1,2),RPAR,IPAR)
  253. NFE=1
  254. IF (T .NE. TOUT) GO TO 220
  255. IDID=2
  256. DO 210 L = 1,NEQ
  257. 210 YPOUT(L) = YH(L,2)
  258. TOLD=T
  259. RETURN
  260. C
  261. C -- COMPUTE INITIAL STEP SIZE
  262. C -- SAVE SIGN OF INTEGRATION DIRECTION
  263. C -- SET INDEPENDENT AND DEPENDENT VARIABLES
  264. C X AND YH(*) FOR STOD
  265. C
  266. 220 LTOL = 1
  267. DO 225 L=1,NEQ
  268. IF (ITOL .EQ. 1) LTOL = L
  269. TOL = RTOL(LTOL)*ABS(Y(L)) + ATOL(LTOL)
  270. IF (TOL .EQ. 0.) GO TO 380
  271. 225 EWT(L) = TOL
  272. C
  273. BIG = SQRT(R1MACH(2))
  274. CALL HSTART (F,NEQ,T,TOUT,Y,YH(1,2),EWT,1,U,BIG,
  275. 1 YH(1,3),YH(1,4),YH(1,5),YH(1,6),RPAR,IPAR,H)
  276. C
  277. DELSGN = SIGN(1.0,TOUT-T)
  278. X = T
  279. DO 230 L = 1,NEQ
  280. YH(L,1) = Y(L)
  281. 230 YH(L,2) = H*YH(L,2)
  282. INIT = 2
  283. C
  284. C.......................................................................
  285. C
  286. C ON EACH CALL SET INFORMATION WHICH DETERMINES THE ALLOWED INTERVAL
  287. C OF INTEGRATION BEFORE RETURNING WITH AN ANSWER AT TOUT
  288. C
  289. 240 DEL = TOUT - T
  290. ABSDEL = ABS(DEL)
  291. C
  292. C.......................................................................
  293. C
  294. C IF ALREADY PAST OUTPUT POINT, INTERPOLATE AND RETURN
  295. C
  296. 250 IF (ABS(X-T) .LT. ABSDEL) GO TO 270
  297. CALL INTYD(TOUT,0,YH,NEQ,Y,INTFLG)
  298. CALL INTYD(TOUT,1,YH,NEQ,YPOUT,INTFLG)
  299. IDID = 3
  300. IF (X .NE. TOUT) GO TO 260
  301. IDID = 2
  302. INTOUT = .FALSE.
  303. 260 T = TOUT
  304. TOLD = T
  305. RETURN
  306. C
  307. C IF CANNOT GO PAST TSTOP AND SUFFICIENTLY CLOSE,
  308. C EXTRAPOLATE AND RETURN
  309. C
  310. 270 IF (ITSTOP .NE. 1) GO TO 290
  311. IF (ABS(TSTOP-X) .GE. 100.*U*ABS(X)) GO TO 290
  312. DT = TOUT - X
  313. DO 280 L = 1,NEQ
  314. 280 Y(L) = YH(L,1) + (DT/H)*YH(L,2)
  315. CALL F(TOUT,Y,YPOUT,RPAR,IPAR)
  316. NFE = NFE + 1
  317. IDID = 3
  318. T = TOUT
  319. TOLD = T
  320. RETURN
  321. C
  322. 290 IF (IINTEG .EQ. 0 .OR. .NOT.INTOUT) GO TO 300
  323. C
  324. C INTERMEDIATE-OUTPUT MODE
  325. C
  326. IDID = 1
  327. GO TO 500
  328. C
  329. C.......................................................................
  330. C
  331. C MONITOR NUMBER OF STEPS ATTEMPTED
  332. C
  333. 300 IF (KSTEPS .LE. MAXNUM) GO TO 330
  334. C
  335. C A SIGNIFICANT AMOUNT OF WORK HAS BEEN EXPENDED
  336. IDID=-1
  337. KSTEPS=0
  338. IBEGIN = -1
  339. GO TO 500
  340. C
  341. C.......................................................................
  342. C
  343. C LIMIT STEP SIZE AND SET WEIGHT VECTOR
  344. C
  345. 330 HMIN = 100.*U*ABS(X)
  346. HA = MAX(ABS(H),HMIN)
  347. IF (ITSTOP .NE. 1) GO TO 340
  348. HA = MIN(HA,ABS(TSTOP-X))
  349. 340 H = SIGN(HA,H)
  350. LTOL = 1
  351. DO 350 L = 1,NEQ
  352. IF (ITOL .EQ. 1) LTOL = L
  353. EWT(L) = RTOL(LTOL)*ABS(YH(L,1)) + ATOL(LTOL)
  354. IF (EWT(L) .LE. 0.0) GO TO 380
  355. 350 CONTINUE
  356. TOLFAC = U*VNWRMS(NEQ,YH,EWT)
  357. IF (TOLFAC .LE. 1.) GO TO 400
  358. C
  359. C TOLERANCES TOO SMALL
  360. IDID = -2
  361. TOLFAC = 2.*TOLFAC
  362. RTOL(1) = TOLFAC*RTOL(1)
  363. ATOL(1) = TOLFAC*ATOL(1)
  364. IF (ITOL .EQ. 0) GO TO 370
  365. DO 360 L = 2,NEQ
  366. RTOL(L) = TOLFAC*RTOL(L)
  367. 360 ATOL(L) = TOLFAC*ATOL(L)
  368. 370 IBEGIN = -1
  369. GO TO 500
  370. C
  371. C RELATIVE ERROR CRITERION INAPPROPRIATE
  372. 380 IDID = -3
  373. IBEGIN = -1
  374. GO TO 500
  375. C
  376. C.......................................................................
  377. C
  378. C TAKE A STEP
  379. C
  380. 400 CALL STOD(NEQ,Y,YH,NEQ,YH1,EWT,SAVF,ACOR,WM,IWM,F,JAC,RPAR,IPAR)
  381. C
  382. JSTART = -2
  383. INTOUT = .TRUE.
  384. IF (KFLAG .EQ. 0) GO TO 250
  385. C
  386. C.......................................................................
  387. C
  388. IF (KFLAG .EQ. -1) GO TO 450
  389. C
  390. C REPEATED CORRECTOR CONVERGENCE FAILURES
  391. IDID = -6
  392. IBEGIN = -1
  393. GO TO 500
  394. C
  395. C REPEATED ERROR TEST FAILURES
  396. 450 IDID = -7
  397. IBEGIN = -1
  398. C
  399. C.......................................................................
  400. C
  401. C STORE VALUES BEFORE RETURNING TO DEBDF
  402. 500 DO 555 L = 1,NEQ
  403. Y(L) = YH(L,1)
  404. 555 YPOUT(L) = YH(L,2)/H
  405. T = X
  406. TOLD = T
  407. INTOUT = .FALSE.
  408. RETURN
  409. END