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,
7
C***BEGIN PROLOGUE SDNTL
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)
19
C Los Alamos National Laboratory
20
C Los Alamos, NM 87545
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)
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,
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(*)
49
PARAMETER(RMINIT = 10000.E0)
50
C***FIRST EXECUTABLE STATEMENT SDNTL
52
IF (JTASK .GE. 0) THEN
53
IF (JTASK .EQ. 0) THEN
54
CALL SDCST (MAXORD, MINT, ISWFLG, EL, TQ)
62
CALL F (N, T, Y, SAVE2)
69
IF (MITER .EQ. 3) THEN
71
CALL USERS (Y, YH, YWT, SAVE1, SAVE2, T, H, EL, IMPL, N,
73
IF (IFLAG .EQ. -1) THEN
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)
88
CALL SGEFA (A, MATDIM, N, IPVT, INFO)
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)
100
CALL SGBFA (A, MATDIM, N, ML, MU, IPVT, INFO)
101
IF (INFO .NE. 0) THEN
105
CALL SGBSL (A, MATDIM, N, ML, MU, IPVT, SAVE2, 0)
107
ELSE IF (IMPL .EQ. 2) THEN
108
CALL FA (N, T, Y, A, MATDIM, ML, MU, NDE)
114
IF (A(I,1) .EQ. 0.E0) THEN
118
SAVE2(I) = SAVE2(I)/A(I,1)
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)
130
CALL SGEFA (A, MATDIM, NDE, IPVT, INFO)
131
IF (INFO .NE. 0) THEN
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)
142
CALL SGBFA (A, MATDIM, NDE, ML, MU, IPVT, INFO)
143
IF (INFO .NE. 0) THEN
147
CALL SGBSL (A, MATDIM, NDE, ML, MU, IPVT, SAVE2, 0)
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)
156
180 YH(I,2) = H*SAVE2(I)
157
IF (MITER .EQ. 2 .OR. MITER .EQ. 5 .OR. ISWFLG .EQ. 3) THEN
159
20 FAC(I) = SQRT(UROUND)
162
IF (MITER .NE. MTROLD) THEN
167
IF (MINT .NE. MNTOLD) THEN
170
CALL SDCST (MAXORD, MINT, ISWFLG, EL, TQ)
171
RC = RC*EL(1,NQ)/OLDL0
174
IF (H .NE. HOLD) THEN
177
CALL SDSCL (HMAX, N, NQ, RMAX, HOLD, RC, RH, YH)