sdntl.f 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. *DECK SDNTL
  2. SUBROUTINE SDNTL (EPS, F, FA, HMAX, HOLD, IMPL, JTASK, MATDIM,
  3. 8 MAXORD, MINT, MITER, ML, MU, N, NDE, SAVE1, T, UROUND, USERS,
  4. 8 Y, YWT, H, MNTOLD, MTROLD, NFE, RC, YH, A, CONVRG, EL, FAC,
  5. 8 IER, IPVT, NQ, NWAIT, RH, RMAX, SAVE2, TQ, TREND, ISWFLG,
  6. 8 JSTATE)
  7. C***BEGIN PROLOGUE SDNTL
  8. C***SUBSIDIARY
  9. C***PURPOSE Subroutine SDNTL is called to set parameters on the first
  10. C call to SDSTP, on an internal restart, or when the user has
  11. C altered MINT, MITER, and/or H.
  12. C***LIBRARY SLATEC (SDRIVE)
  13. C***TYPE SINGLE PRECISION (SDNTL-S, DDNTL-D, CDNTL-C)
  14. C***AUTHOR Kahaner, D. K., (NIST)
  15. C National Institute of Standards and Technology
  16. C Gaithersburg, MD 20899
  17. C Sutherland, C. D., (LANL)
  18. C Mail Stop D466
  19. C Los Alamos National Laboratory
  20. C Los Alamos, NM 87545
  21. C***DESCRIPTION
  22. C
  23. C On the first call, the order is set to 1 and the initial derivatives
  24. C are calculated. RMAX is the maximum ratio by which H can be
  25. C increased in one step. It is initially RMINIT to compensate
  26. C for the small initial H, but then is normally equal to RMNORM.
  27. C If a failure occurs (in corrector convergence or error test), RMAX
  28. C is set at RMFAIL for the next increase.
  29. C If the caller has changed MINT, or if JTASK = 0, SDCST is called
  30. C to set the coefficients of the method. If the caller has changed H,
  31. C YH must be rescaled. If H or MINT has been changed, NWAIT is
  32. C reset to NQ + 2 to prevent further increases in H for that many
  33. C steps. Also, RC is reset. RC is the ratio of new to old values of
  34. C the coefficient L(0)*H. If the caller has changed MITER, RC is
  35. C set to 0 to force the partials to be updated, if partials are used.
  36. C***ROUTINES CALLED SDCST, SDSCL, SGBFA, SGBSL, SGEFA, SGESL, SNRM2
  37. C***REVISION HISTORY (YYMMDD)
  38. C 790601 DATE WRITTEN
  39. C 900329 Initial submission to SLATEC.
  40. C***END PROLOGUE SDNTL
  41. INTEGER I, IFLAG, IMPL, INFO, ISWFLG, JSTATE, JTASK, MATDIM,
  42. 8 MAXORD, MINT, MITER, ML, MNTOLD, MTROLD, MU, N, NDE, NFE,
  43. 8 NQ, NWAIT
  44. REAL A(MATDIM,*), EL(13,12), EPS, FAC(*), H, HMAX,
  45. 8 HOLD, OLDL0, RC, RH, RMAX, RMINIT, SAVE1(*), SAVE2(*), SNRM2,
  46. 8 SUM, T, TQ(3,12), TREND, UROUND, Y(*), YH(N,*), YWT(*)
  47. INTEGER IPVT(*)
  48. LOGICAL CONVRG, IER
  49. PARAMETER(RMINIT = 10000.E0)
  50. C***FIRST EXECUTABLE STATEMENT SDNTL
  51. IER = .FALSE.
  52. IF (JTASK .GE. 0) THEN
  53. IF (JTASK .EQ. 0) THEN
  54. CALL SDCST (MAXORD, MINT, ISWFLG, EL, TQ)
  55. RMAX = RMINIT
  56. END IF
  57. RC = 0.E0
  58. CONVRG = .FALSE.
  59. TREND = 1.E0
  60. NQ = 1
  61. NWAIT = 3
  62. CALL F (N, T, Y, SAVE2)
  63. IF (N .EQ. 0) THEN
  64. JSTATE = 6
  65. RETURN
  66. END IF
  67. NFE = NFE + 1
  68. IF (IMPL .NE. 0) THEN
  69. IF (MITER .EQ. 3) THEN
  70. IFLAG = 0
  71. CALL USERS (Y, YH, YWT, SAVE1, SAVE2, T, H, EL, IMPL, N,
  72. 8 NDE, IFLAG)
  73. IF (IFLAG .EQ. -1) THEN
  74. IER = .TRUE.
  75. RETURN
  76. END IF
  77. IF (N .EQ. 0) THEN
  78. JSTATE = 10
  79. RETURN
  80. END IF
  81. ELSE IF (IMPL .EQ. 1) THEN
  82. IF (MITER .EQ. 1 .OR. MITER .EQ. 2) THEN
  83. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  84. IF (N .EQ. 0) THEN
  85. JSTATE = 9
  86. RETURN
  87. END IF
  88. CALL SGEFA (A, MATDIM, N, IPVT, INFO)
  89. IF (INFO .NE. 0) THEN
  90. IER = .TRUE.
  91. RETURN
  92. END IF
  93. CALL SGESL (A, MATDIM, N, IPVT, SAVE2, 0)
  94. ELSE IF (MITER .EQ. 4 .OR. MITER .EQ. 5) THEN
  95. CALL FA (N, T, Y, A(ML+1,1), MATDIM, ML, MU, NDE)
  96. IF (N .EQ. 0) THEN
  97. JSTATE = 9
  98. RETURN
  99. END IF
  100. CALL SGBFA (A, MATDIM, N, ML, MU, IPVT, INFO)
  101. IF (INFO .NE. 0) THEN
  102. IER = .TRUE.
  103. RETURN
  104. END IF
  105. CALL SGBSL (A, MATDIM, N, ML, MU, IPVT, SAVE2, 0)
  106. END IF
  107. ELSE IF (IMPL .EQ. 2) THEN
  108. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  109. IF (N .EQ. 0) THEN
  110. JSTATE = 9
  111. RETURN
  112. END IF
  113. DO 150 I = 1,NDE
  114. IF (A(I,1) .EQ. 0.E0) THEN
  115. IER = .TRUE.
  116. RETURN
  117. ELSE
  118. SAVE2(I) = SAVE2(I)/A(I,1)
  119. END IF
  120. 150 CONTINUE
  121. DO 155 I = NDE+1,N
  122. 155 A(I,1) = 0.E0
  123. ELSE IF (IMPL .EQ. 3) THEN
  124. IF (MITER .EQ. 1 .OR. MITER .EQ. 2) THEN
  125. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  126. IF (N .EQ. 0) THEN
  127. JSTATE = 9
  128. RETURN
  129. END IF
  130. CALL SGEFA (A, MATDIM, NDE, IPVT, INFO)
  131. IF (INFO .NE. 0) THEN
  132. IER = .TRUE.
  133. RETURN
  134. END IF
  135. CALL SGESL (A, MATDIM, NDE, IPVT, SAVE2, 0)
  136. ELSE IF (MITER .EQ. 4 .OR. MITER .EQ. 5) THEN
  137. CALL FA (N, T, Y, A(ML+1,1), MATDIM, ML, MU, NDE)
  138. IF (N .EQ. 0) THEN
  139. JSTATE = 9
  140. RETURN
  141. END IF
  142. CALL SGBFA (A, MATDIM, NDE, ML, MU, IPVT, INFO)
  143. IF (INFO .NE. 0) THEN
  144. IER = .TRUE.
  145. RETURN
  146. END IF
  147. CALL SGBSL (A, MATDIM, NDE, ML, MU, IPVT, SAVE2, 0)
  148. END IF
  149. END IF
  150. END IF
  151. DO 170 I = 1,NDE
  152. 170 SAVE1(I) = SAVE2(I)/MAX(1.E0, YWT(I))
  153. SUM = SNRM2(NDE, SAVE1, 1)/SQRT(REAL(NDE))
  154. IF (SUM .GT. EPS/ABS(H)) H = SIGN(EPS/SUM, H)
  155. DO 180 I = 1,N
  156. 180 YH(I,2) = H*SAVE2(I)
  157. IF (MITER .EQ. 2 .OR. MITER .EQ. 5 .OR. ISWFLG .EQ. 3) THEN
  158. DO 20 I = 1,N
  159. 20 FAC(I) = SQRT(UROUND)
  160. END IF
  161. ELSE
  162. IF (MITER .NE. MTROLD) THEN
  163. MTROLD = MITER
  164. RC = 0.E0
  165. CONVRG = .FALSE.
  166. END IF
  167. IF (MINT .NE. MNTOLD) THEN
  168. MNTOLD = MINT
  169. OLDL0 = EL(1,NQ)
  170. CALL SDCST (MAXORD, MINT, ISWFLG, EL, TQ)
  171. RC = RC*EL(1,NQ)/OLDL0
  172. NWAIT = NQ + 2
  173. END IF
  174. IF (H .NE. HOLD) THEN
  175. NWAIT = NQ + 2
  176. RH = H/HOLD
  177. CALL SDSCL (HMAX, N, NQ, RMAX, HOLD, RC, RH, YH)
  178. END IF
  179. END IF
  180. RETURN
  181. END