des.f 14 KB

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