dlsod.f 17 KB

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