ddes.f 14 KB

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