ddntl.f 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. *DECK DDNTL
  2. SUBROUTINE DDNTL (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 DDNTL
  8. C***SUBSIDIARY
  9. C***PURPOSE Subroutine DDNTL is called to set parameters on the first
  10. C call to DDSTP, 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 DOUBLE 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, DDCST 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
  37. C***ROUTINES CALLED DDCST, DDSCL, DGBFA, DGBSL, DGEFA, DGESL, DNRM2
  38. C***REVISION HISTORY (YYMMDD)
  39. C 790601 DATE WRITTEN
  40. C 900329 Initial submission to SLATEC.
  41. C***END PROLOGUE DDNTL
  42. INTEGER I, IFLAG, IMPL, INFO, ISWFLG, JSTATE, JTASK, MATDIM,
  43. 8 MAXORD, MINT, MITER, ML, MNTOLD, MTROLD, MU, N, NDE, NFE,
  44. 8 NQ, NWAIT
  45. DOUBLE PRECISION A(MATDIM,*), EL(13,12), EPS, FAC(*), H, HMAX,
  46. 8 HOLD, OLDL0, RC, RH, RMAX, RMINIT, SAVE1(*), SAVE2(*), DNRM2,
  47. 8 SUM, T, TQ(3,12), TREND, UROUND, Y(*), YH(N,*), YWT(*)
  48. INTEGER IPVT(*)
  49. LOGICAL CONVRG, IER
  50. PARAMETER(RMINIT = 10000.D0)
  51. C***FIRST EXECUTABLE STATEMENT DDNTL
  52. IER = .FALSE.
  53. IF (JTASK .GE. 0) THEN
  54. IF (JTASK .EQ. 0) THEN
  55. CALL DDCST (MAXORD, MINT, ISWFLG, EL, TQ)
  56. RMAX = RMINIT
  57. END IF
  58. RC = 0.D0
  59. CONVRG = .FALSE.
  60. TREND = 1.D0
  61. NQ = 1
  62. NWAIT = 3
  63. CALL F (N, T, Y, SAVE2)
  64. IF (N .EQ. 0) THEN
  65. JSTATE = 6
  66. RETURN
  67. END IF
  68. NFE = NFE + 1
  69. IF (IMPL .NE. 0) THEN
  70. IF (MITER .EQ. 3) THEN
  71. IFLAG = 0
  72. CALL USERS (Y, YH, YWT, SAVE1, SAVE2, T, H, EL, IMPL, N,
  73. 8 NDE, IFLAG)
  74. IF (IFLAG .EQ. -1) THEN
  75. IER = .TRUE.
  76. RETURN
  77. END IF
  78. IF (N .EQ. 0) THEN
  79. JSTATE = 10
  80. RETURN
  81. END IF
  82. ELSE IF (IMPL .EQ. 1) THEN
  83. IF (MITER .EQ. 1 .OR. MITER .EQ. 2) THEN
  84. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  85. IF (N .EQ. 0) THEN
  86. JSTATE = 9
  87. RETURN
  88. END IF
  89. CALL DGEFA (A, MATDIM, N, IPVT, INFO)
  90. IF (INFO .NE. 0) THEN
  91. IER = .TRUE.
  92. RETURN
  93. END IF
  94. CALL DGESL (A, MATDIM, N, IPVT, SAVE2, 0)
  95. ELSE IF (MITER .EQ. 4 .OR. MITER .EQ. 5) THEN
  96. CALL FA (N, T, Y, A(ML+1,1), MATDIM, ML, MU, NDE)
  97. IF (N .EQ. 0) THEN
  98. JSTATE = 9
  99. RETURN
  100. END IF
  101. CALL DGBFA (A, MATDIM, N, ML, MU, IPVT, INFO)
  102. IF (INFO .NE. 0) THEN
  103. IER = .TRUE.
  104. RETURN
  105. END IF
  106. CALL DGBSL (A, MATDIM, N, ML, MU, IPVT, SAVE2, 0)
  107. END IF
  108. ELSE IF (IMPL .EQ. 2) THEN
  109. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  110. IF (N .EQ. 0) THEN
  111. JSTATE = 9
  112. RETURN
  113. END IF
  114. DO 150 I = 1,NDE
  115. IF (A(I,1) .EQ. 0.D0) THEN
  116. IER = .TRUE.
  117. RETURN
  118. ELSE
  119. SAVE2(I) = SAVE2(I)/A(I,1)
  120. END IF
  121. 150 CONTINUE
  122. DO 155 I = NDE+1,N
  123. 155 A(I,1) = 0.D0
  124. ELSE IF (IMPL .EQ. 3) THEN
  125. IF (MITER .EQ. 1 .OR. MITER .EQ. 2) THEN
  126. CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
  127. IF (N .EQ. 0) THEN
  128. JSTATE = 9
  129. RETURN
  130. END IF
  131. CALL DGEFA (A, MATDIM, NDE, IPVT, INFO)
  132. IF (INFO .NE. 0) THEN
  133. IER = .TRUE.
  134. RETURN
  135. END IF
  136. CALL DGESL (A, MATDIM, NDE, IPVT, SAVE2, 0)
  137. ELSE IF (MITER .EQ. 4 .OR. MITER .EQ. 5) THEN
  138. CALL FA (N, T, Y, A(ML+1,1), MATDIM, ML, MU, NDE)
  139. IF (N .EQ. 0) THEN
  140. JSTATE = 9
  141. RETURN
  142. END IF
  143. CALL DGBFA (A, MATDIM, NDE, ML, MU, IPVT, INFO)
  144. IF (INFO .NE. 0) THEN
  145. IER = .TRUE.
  146. RETURN
  147. END IF
  148. CALL DGBSL (A, MATDIM, NDE, ML, MU, IPVT, SAVE2, 0)
  149. END IF
  150. END IF
  151. END IF
  152. DO 170 I = 1,NDE
  153. 170 SAVE1(I) = SAVE2(I)/MAX(1.D0, YWT(I))
  154. SUM = DNRM2(NDE, SAVE1, 1)/SQRT(DBLE(NDE))
  155. IF (SUM .GT. EPS/ABS(H)) H = SIGN(EPS/SUM, H)
  156. DO 180 I = 1,N
  157. 180 YH(I,2) = H*SAVE2(I)
  158. IF (MITER .EQ. 2 .OR. MITER .EQ. 5 .OR. ISWFLG .EQ. 3) THEN
  159. DO 20 I = 1,N
  160. 20 FAC(I) = SQRT(UROUND)
  161. END IF
  162. ELSE
  163. IF (MITER .NE. MTROLD) THEN
  164. MTROLD = MITER
  165. RC = 0.D0
  166. CONVRG = .FALSE.
  167. END IF
  168. IF (MINT .NE. MNTOLD) THEN
  169. MNTOLD = MINT
  170. OLDL0 = EL(1,NQ)
  171. CALL DDCST (MAXORD, MINT, ISWFLG, EL, TQ)
  172. RC = RC*EL(1,NQ)/OLDL0
  173. NWAIT = NQ + 2
  174. END IF
  175. IF (H .NE. HOLD) THEN
  176. NWAIT = NQ + 2
  177. RH = H/HOLD
  178. CALL DDSCL (HMAX, N, NQ, RMAX, HOLD, RC, RH, YH)
  179. END IF
  180. END IF
  181. RETURN
  182. END