~ubuntu-branches/ubuntu/wily/julia/wily

« back to all changes in this revision

Viewing changes to deps/openlibm/slatec/dstod.f

  • Committer: Package Import Robot
  • Author(s): Sébastien Villemot
  • Date: 2013-01-16 12:29:42 UTC
  • mfrom: (1.1.2)
  • Revision ID: package-import@ubuntu.com-20130116122942-x86e42akjq31repw
Tags: 0.0.0+20130107.gitd9656f41-1
* New upstream snashot
* No longer try to rebuild helpdb.jl.
   + debian/rules: remove helpdb.jl from build-arch rule
   + debian/control: move back python-sphinx to Build-Depends-Indep
* debian/copyright: reflect upstream changes
* Add Build-Conflicts on libatlas3-base (makes linalg tests fail)
* debian/rules: replace obsolete USE_DEBIAN makeflag by a list of
  USE_SYSTEM_* flags
* debian/rules: on non-x86 systems, use libm instead of openlibm
* dpkg-buildflags.patch: remove patch, applied upstream
* Refreshed other patches

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
*DECK DSTOD
 
2
      SUBROUTINE DSTOD (NEQ, Y, YH, NYH, YH1, EWT, SAVF, ACOR, WM, IWM,
 
3
     +   DF, DJAC, RPAR, IPAR)
 
4
C***BEGIN PROLOGUE  DSTOD
 
5
C***SUBSIDIARY
 
6
C***PURPOSE  Subsidiary to DDEBDF
 
7
C***LIBRARY   SLATEC
 
8
C***TYPE      DOUBLE PRECISION (STOD-S, DSTOD-D)
 
9
C***AUTHOR  Watts, H. A., (SNLA)
 
10
C***DESCRIPTION
 
11
C
 
12
C   DSTOD integrates a system of first order odes over one step in the
 
13
C   integrator package DDEBDF.
 
14
C ----------------------------------------------------------------------
 
15
C DSTOD  performs one step of the integration of an initial value
 
16
C problem for a system of ordinary differential equations.
 
17
C Note.. DSTOD  is independent of the value of the iteration method
 
18
C indicator MITER, when this is .NE. 0, and hence is independent
 
19
C of the type of chord method used, or the Jacobian structure.
 
20
C Communication with DSTOD  is done with the following variables..
 
21
C
 
22
C Y      = An array of length .GE. N used as the Y argument in
 
23
C          all calls to DF and DJAC.
 
24
C NEQ    = Integer array containing problem size in NEQ(1), and
 
25
C          passed as the NEQ argument in all calls to DF and DJAC.
 
26
C YH     = An NYH by LMAX array containing the dependent variables
 
27
C          and their approximate scaled derivatives, where
 
28
C          LMAX = MAXORD + 1.  YH(I,J+1) contains the approximate
 
29
C          J-th derivative of Y(I), scaled by H**J/FACTORIAL(J)
 
30
C          (J = 0,1,...,NQ).  On entry for the first step, the first
 
31
C          two columns of YH must be set from the initial values.
 
32
C NYH    = A constant integer .GE. N, the first dimension of YH.
 
33
C YH1    = A one-dimensional array occupying the same space as YH.
 
34
C EWT    = An array of N elements with which the estimated local
 
35
C          errors in YH are compared.
 
36
C SAVF   = An array of working storage, of length N.
 
37
C ACOR   = A work array of length N, used for the accumulated
 
38
C          corrections.  On a successful return, ACOR(I) contains
 
39
C          the estimated one-step local error in Y(I).
 
40
C WM,IWM = DOUBLE PRECISION and INTEGER work arrays associated with
 
41
C          matrix operations in chord iteration (MITER .NE. 0).
 
42
C DPJAC   = Name of routine to evaluate and preprocess Jacobian matrix
 
43
C          if a chord method is being used.
 
44
C DSLVS   = Name of routine to solve linear system in chord iteration.
 
45
C H      = The step size to be attempted on the next step.
 
46
C          H is altered by the error control algorithm during the
 
47
C          problem.  H can be either positive or negative, but its
 
48
C          sign must remain constant throughout the problem.
 
49
C HMIN   = The minimum absolute value of the step size H to be used.
 
50
C HMXI   = Inverse of the maximum absolute value of H to be used.
 
51
C          HMXI = 0.0 is allowed and corresponds to an infinite HMAX.
 
52
C          HMIN and HMXI may be changed at any time, but will not
 
53
C          take effect until the next change of H is considered.
 
54
C TN     = The independent variable. TN is updated on each step taken.
 
55
C JSTART = An integer used for input only, with the following
 
56
C          values and meanings..
 
57
C               0  Perform the first step.
 
58
C           .GT.0  Take a new step continuing from the last.
 
59
C              -1  Take the next step with a new value of H, MAXORD,
 
60
C                    N, METH, MITER, and/or matrix parameters.
 
61
C              -2  Take the next step with a new value of H,
 
62
C                    but with other inputs unchanged.
 
63
C          On return, JSTART is set to 1 to facilitate continuation.
 
64
C KFLAG  = a completion code with the following meanings..
 
65
C               0  The step was successful.
 
66
C              -1  The requested error could not be achieved.
 
67
C              -2  Corrector convergence could not be achieved.
 
68
C          A return with KFLAG = -1 or -2 means either
 
69
C          ABS(H) = HMIN or 10 consecutive failures occurred.
 
70
C          On a return with KFLAG negative, the values of TN and
 
71
C          the YH array are as of the beginning of the last
 
72
C          step, and H is the last step size attempted.
 
73
C MAXORD = The maximum order of integration method to be allowed.
 
74
C METH/MITER = The method flags.  See description in driver.
 
75
C N      = The number of first-order differential equations.
 
76
C ----------------------------------------------------------------------
 
77
C
 
78
C***SEE ALSO  DDEBDF
 
79
C***ROUTINES CALLED  DCFOD, DPJAC, DSLVS, DVNRMS
 
80
C***COMMON BLOCKS    DDEBD1
 
81
C***REVISION HISTORY  (YYMMDD)
 
82
C   820301  DATE WRITTEN
 
83
C   890531  Changed all specific intrinsics to generic.  (WRB)
 
84
C   890911  Removed unnecessary intrinsics.  (WRB)
 
85
C   891214  Prologue converted to Version 4.0 format.  (BAB)
 
86
C   900328  Added TYPE section.  (WRB)
 
87
C   910722  Updated AUTHOR section.  (ALS)
 
88
C   920422  Changed DIMENSION statement.  (WRB)
 
89
C***END PROLOGUE  DSTOD
 
90
C
 
91
      INTEGER I, I1, IALTH, IER, IOD, IOWND, IPAR, IPUP, IREDO, IRET,
 
92
     1      IWM, J, JB, JSTART, KFLAG, KSTEPS, L, LMAX, M, MAXORD,
 
93
     2      MEO, METH, MITER, N, NCF, NEQ, NEWQ, NFE, NJE, NQ, NQNYH,
 
94
     3      NQU, NST, NSTEPJ, NYH
 
95
      DOUBLE PRECISION ACOR, CONIT, CRATE, DCON, DDN,
 
96
     1      DEL, DELP, DSM, DUP, DVNRMS, EL, EL0, ELCO,
 
97
     2      EWT, EXDN, EXSM, EXUP, H, HMIN, HMXI, HOLD, HU, R, RC,
 
98
     3      RH, RHDN, RHSM, RHUP, RMAX, ROWND, RPAR, SAVF, TESCO,
 
99
     4      TN, TOLD, UROUND, WM, Y, YH, YH1
 
100
      EXTERNAL DF, DJAC
 
101
C
 
102
      DIMENSION Y(*),YH(NYH,*),YH1(*),EWT(*),SAVF(*),ACOR(*),WM(*),
 
103
     1          IWM(*),RPAR(*),IPAR(*)
 
104
      COMMON /DDEBD1/ ROWND,CONIT,CRATE,EL(13),ELCO(13,12),HOLD,RC,RMAX,
 
105
     1                TESCO(3,12),EL0,H,HMIN,HMXI,HU,TN,UROUND,IOWND(7),
 
106
     2                KSTEPS,IOD(6),IALTH,IPUP,LMAX,MEO,NQNYH,NSTEPJ,
 
107
     3                IER,JSTART,KFLAG,L,METH,MITER,MAXORD,N,NQ,NST,NFE,
 
108
     4                NJE,NQU
 
109
C
 
110
C
 
111
C     BEGIN BLOCK PERMITTING ...EXITS TO 690
 
112
C        BEGIN BLOCK PERMITTING ...EXITS TO 60
 
113
C***FIRST EXECUTABLE STATEMENT  DSTOD
 
114
            KFLAG = 0
 
115
            TOLD = TN
 
116
            NCF = 0
 
117
            IF (JSTART .GT. 0) GO TO 160
 
118
            IF (JSTART .EQ. -1) GO TO 10
 
119
               IF (JSTART .EQ. -2) GO TO 90
 
120
C              ---------------------------------------------------------
 
121
C               ON THE FIRST CALL, THE ORDER IS SET TO 1, AND OTHER
 
122
C               VARIABLES ARE INITIALIZED.  RMAX IS THE MAXIMUM RATIO BY
 
123
C               WHICH H CAN BE INCREASED IN A SINGLE STEP.  IT IS
 
124
C               INITIALLY 1.E4 TO COMPENSATE FOR THE SMALL INITIAL H,
 
125
C               BUT THEN IS NORMALLY EQUAL TO 10.  IF A FAILURE OCCURS
 
126
C               (IN CORRECTOR CONVERGENCE OR ERROR TEST), RMAX IS SET AT
 
127
C               2 FOR THE NEXT INCREASE.
 
128
C              ---------------------------------------------------------
 
129
               LMAX = MAXORD + 1
 
130
               NQ = 1
 
131
               L = 2
 
132
               IALTH = 2
 
133
               RMAX = 10000.0D0
 
134
               RC = 0.0D0
 
135
               EL0 = 1.0D0
 
136
               CRATE = 0.7D0
 
137
               DELP = 0.0D0
 
138
               HOLD = H
 
139
               MEO = METH
 
140
               NSTEPJ = 0
 
141
               IRET = 3
 
142
            GO TO 50
 
143
   10       CONTINUE
 
144
C              BEGIN BLOCK PERMITTING ...EXITS TO 30
 
145
C                 ------------------------------------------------------
 
146
C                  THE FOLLOWING BLOCK HANDLES PRELIMINARIES NEEDED WHEN
 
147
C                  JSTART = -1.  IPUP IS SET TO MITER TO FORCE A MATRIX
 
148
C                  UPDATE.  IF AN ORDER INCREASE IS ABOUT TO BE
 
149
C                  CONSIDERED (IALTH = 1), IALTH IS RESET TO 2 TO
 
150
C                  POSTPONE CONSIDERATION ONE MORE STEP.  IF THE CALLER
 
151
C                  HAS CHANGED METH, DCFOD  IS CALLED TO RESET THE
 
152
C                  COEFFICIENTS OF THE METHOD.  IF THE CALLER HAS
 
153
C                  CHANGED MAXORD TO A VALUE LESS THAN THE CURRENT
 
154
C                  ORDER NQ, NQ IS REDUCED TO MAXORD, AND A NEW H CHOSEN
 
155
C                  ACCORDINGLY.  IF H IS TO BE CHANGED, YH MUST BE
 
156
C                  RESCALED.  IF H OR METH IS BEING CHANGED, IALTH IS
 
157
C                  RESET TO L = NQ + 1 TO PREVENT FURTHER CHANGES IN H
 
158
C                  FOR THAT MANY STEPS.
 
159
C                 ------------------------------------------------------
 
160
                  IPUP = MITER
 
161
                  LMAX = MAXORD + 1
 
162
                  IF (IALTH .EQ. 1) IALTH = 2
 
163
                  IF (METH .EQ. MEO) GO TO 20
 
164
                     CALL DCFOD(METH,ELCO,TESCO)
 
165
                     MEO = METH
 
166
C              ......EXIT
 
167
                     IF (NQ .GT. MAXORD) GO TO 30
 
168
                     IALTH = L
 
169
                     IRET = 1
 
170
C        ............EXIT
 
171
                     GO TO 60
 
172
   20             CONTINUE
 
173
                  IF (NQ .LE. MAXORD) GO TO 90
 
174
   30          CONTINUE
 
175
               NQ = MAXORD
 
176
               L = LMAX
 
177
               DO 40 I = 1, L
 
178
                  EL(I) = ELCO(I,NQ)
 
179
   40          CONTINUE
 
180
               NQNYH = NQ*NYH
 
181
               RC = RC*EL(1)/EL0
 
182
               EL0 = EL(1)
 
183
               CONIT = 0.5D0/(NQ+2)
 
184
               DDN = DVNRMS(N,SAVF,EWT)/TESCO(1,L)
 
185
               EXDN = 1.0D0/L
 
186
               RHDN = 1.0D0/(1.3D0*DDN**EXDN + 0.0000013D0)
 
187
               RH = MIN(RHDN,1.0D0)
 
188
               IREDO = 3
 
189
               IF (H .EQ. HOLD) GO TO 660
 
190
               RH = MIN(RH,ABS(H/HOLD))
 
191
               H = HOLD
 
192
               GO TO 100
 
193
   50       CONTINUE
 
194
C           ------------------------------------------------------------
 
195
C            DCFOD  IS CALLED TO GET ALL THE INTEGRATION COEFFICIENTS
 
196
C            FOR THE CURRENT METH.  THEN THE EL VECTOR AND RELATED
 
197
C            CONSTANTS ARE RESET WHENEVER THE ORDER NQ IS CHANGED, OR AT
 
198
C            THE START OF THE PROBLEM.
 
199
C           ------------------------------------------------------------
 
200
            CALL DCFOD(METH,ELCO,TESCO)
 
201
   60    CONTINUE
 
202
   70    CONTINUE
 
203
C           BEGIN BLOCK PERMITTING ...EXITS TO 680
 
204
               DO 80 I = 1, L
 
205
                  EL(I) = ELCO(I,NQ)
 
206
   80          CONTINUE
 
207
               NQNYH = NQ*NYH
 
208
               RC = RC*EL(1)/EL0
 
209
               EL0 = EL(1)
 
210
               CONIT = 0.5D0/(NQ+2)
 
211
               GO TO (90,660,160), IRET
 
212
C              ---------------------------------------------------------
 
213
C               IF H IS BEING CHANGED, THE H RATIO RH IS CHECKED AGAINST
 
214
C               RMAX, HMIN, AND HMXI, AND THE YH ARRAY RESCALED.  IALTH
 
215
C               IS SET TO L = NQ + 1 TO PREVENT A CHANGE OF H FOR THAT
 
216
C               MANY STEPS, UNLESS FORCED BY A CONVERGENCE OR ERROR TEST
 
217
C               FAILURE.
 
218
C              ---------------------------------------------------------
 
219
   90          CONTINUE
 
220
               IF (H .EQ. HOLD) GO TO 160
 
221
               RH = H/HOLD
 
222
               H = HOLD
 
223
               IREDO = 3
 
224
  100          CONTINUE
 
225
  110          CONTINUE
 
226
                  RH = MIN(RH,RMAX)
 
227
                  RH = RH/MAX(1.0D0,ABS(H)*HMXI*RH)
 
228
                  R = 1.0D0
 
229
                  DO 130 J = 2, L
 
230
                     R = R*RH
 
231
                     DO 120 I = 1, N
 
232
                        YH(I,J) = YH(I,J)*R
 
233
  120                CONTINUE
 
234
  130             CONTINUE
 
235
                  H = H*RH
 
236
                  RC = RC*RH
 
237
                  IALTH = L
 
238
                  IF (IREDO .NE. 0) GO TO 150
 
239
                     RMAX = 10.0D0
 
240
                     R = 1.0D0/TESCO(2,NQU)
 
241
                     DO 140 I = 1, N
 
242
                        ACOR(I) = ACOR(I)*R
 
243
  140                CONTINUE
 
244
C     ...............EXIT
 
245
                     GO TO 690
 
246
  150             CONTINUE
 
247
C                 ------------------------------------------------------
 
248
C                  THIS SECTION COMPUTES THE PREDICTED VALUES BY
 
249
C                  EFFECTIVELY MULTIPLYING THE YH ARRAY BY THE PASCAL
 
250
C                  TRIANGLE MATRIX.  RC IS THE RATIO OF NEW TO OLD
 
251
C                  VALUES OF THE COEFFICIENT  H*EL(1).  WHEN RC DIFFERS
 
252
C                  FROM 1 BY MORE THAN 30 PERCENT, IPUP IS SET TO MITER
 
253
C                  TO FORCE DPJAC TO BE CALLED, IF A JACOBIAN IS
 
254
C                  INVOLVED.  IN ANY CASE, DPJAC IS CALLED AT LEAST
 
255
C                  EVERY 20-TH STEP.
 
256
C                 ------------------------------------------------------
 
257
  160             CONTINUE
 
258
  170             CONTINUE
 
259
C                    BEGIN BLOCK PERMITTING ...EXITS TO 610
 
260
C                       BEGIN BLOCK PERMITTING ...EXITS TO 490
 
261
                           IF (ABS(RC-1.0D0) .GT. 0.3D0) IPUP = MITER
 
262
                           IF (NST .GE. NSTEPJ + 20) IPUP = MITER
 
263
                           TN = TN + H
 
264
                           I1 = NQNYH + 1
 
265
                           DO 190 JB = 1, NQ
 
266
                              I1 = I1 - NYH
 
267
                              DO 180 I = I1, NQNYH
 
268
                                 YH1(I) = YH1(I) + YH1(I+NYH)
 
269
  180                         CONTINUE
 
270
  190                      CONTINUE
 
271
                           KSTEPS = KSTEPS + 1
 
272
C                          ---------------------------------------------
 
273
C                           UP TO 3 CORRECTOR ITERATIONS ARE TAKEN.  A
 
274
C                           CONVERGENCE TEST IS MADE ON THE R.M.S. NORM
 
275
C                           OF EACH CORRECTION, WEIGHTED BY THE ERROR
 
276
C                           WEIGHT VECTOR EWT.  THE SUM OF THE
 
277
C                           CORRECTIONS IS ACCUMULATED IN THE VECTOR
 
278
C                           ACOR(I).  THE YH ARRAY IS NOT ALTERED IN THE
 
279
C                           CORRECTOR LOOP.
 
280
C                          ---------------------------------------------
 
281
  200                      CONTINUE
 
282
                              M = 0
 
283
                              DO 210 I = 1, N
 
284
                                 Y(I) = YH(I,1)
 
285
  210                         CONTINUE
 
286
                              CALL DF(TN,Y,SAVF,RPAR,IPAR)
 
287
                              NFE = NFE + 1
 
288
                              IF (IPUP .LE. 0) GO TO 220
 
289
C                                ---------------------------------------
 
290
C                                 IF INDICATED, THE MATRIX P = I -
 
291
C                                 H*EL(1)*J IS REEVALUATED AND
 
292
C                                 PREPROCESSED BEFORE STARTING THE
 
293
C                                 CORRECTOR ITERATION.  IPUP IS SET TO 0
 
294
C                                 AS AN INDICATOR THAT THIS HAS BEEN
 
295
C                                 DONE.
 
296
C                                ---------------------------------------
 
297
                                 IPUP = 0
 
298
                                 RC = 1.0D0
 
299
                                 NSTEPJ = NST
 
300
                                 CRATE = 0.7D0
 
301
                                 CALL DPJAC(NEQ,Y,YH,NYH,EWT,ACOR,SAVF,
 
302
     1                                      WM,IWM,DF,DJAC,RPAR,IPAR)
 
303
C                          ......EXIT
 
304
                                 IF (IER .NE. 0) GO TO 440
 
305
  220                         CONTINUE
 
306
                              DO 230 I = 1, N
 
307
                                 ACOR(I) = 0.0D0
 
308
  230                         CONTINUE
 
309
  240                         CONTINUE
 
310
                                 IF (MITER .NE. 0) GO TO 270
 
311
C                                   ------------------------------------
 
312
C                                    IN THE CASE OF FUNCTIONAL
 
313
C                                    ITERATION, UPDATE Y DIRECTLY FROM
 
314
C                                    THE RESULT OF THE LAST FUNCTION
 
315
C                                    EVALUATION.
 
316
C                                   ------------------------------------
 
317
                                    DO 250 I = 1, N
 
318
                                       SAVF(I) = H*SAVF(I) - YH(I,2)
 
319
                                       Y(I) = SAVF(I) - ACOR(I)
 
320
  250                               CONTINUE
 
321
                                    DEL = DVNRMS(N,Y,EWT)
 
322
                                    DO 260 I = 1, N
 
323
                                       Y(I) = YH(I,1) + EL(1)*SAVF(I)
 
324
                                       ACOR(I) = SAVF(I)
 
325
  260                               CONTINUE
 
326
                                 GO TO 300
 
327
  270                            CONTINUE
 
328
C                                   ------------------------------------
 
329
C                                    IN THE CASE OF THE CHORD METHOD,
 
330
C                                    COMPUTE THE CORRECTOR ERROR, AND
 
331
C                                    SOLVE THE LINEAR SYSTEM WITH THAT
 
332
C                                    AS RIGHT-HAND SIDE AND P AS
 
333
C                                    COEFFICIENT MATRIX.
 
334
C                                   ------------------------------------
 
335
                                    DO 280 I = 1, N
 
336
                                       Y(I) = H*SAVF(I)
 
337
     1                                        - (YH(I,2) + ACOR(I))
 
338
  280                               CONTINUE
 
339
                                    CALL DSLVS(WM,IWM,Y,SAVF)
 
340
C                             ......EXIT
 
341
                                    IF (IER .NE. 0) GO TO 430
 
342
                                    DEL = DVNRMS(N,Y,EWT)
 
343
                                    DO 290 I = 1, N
 
344
                                       ACOR(I) = ACOR(I) + Y(I)
 
345
                                       Y(I) = YH(I,1) + EL(1)*ACOR(I)
 
346
  290                               CONTINUE
 
347
  300                            CONTINUE
 
348
C                                ---------------------------------------
 
349
C                                 TEST FOR CONVERGENCE.  IF M.GT.0, AN
 
350
C                                 ESTIMATE OF THE CONVERGENCE RATE
 
351
C                                 CONSTANT IS STORED IN CRATE, AND THIS
 
352
C                                 IS USED IN THE TEST.
 
353
C                                ---------------------------------------
 
354
                                 IF (M .NE. 0)
 
355
     1                              CRATE = MAX(0.2D0*CRATE,DEL/DELP)
 
356
                                 DCON = DEL*MIN(1.0D0,1.5D0*CRATE)
 
357
     1                                  /(TESCO(2,NQ)*CONIT)
 
358
                                 IF (DCON .GT. 1.0D0) GO TO 420
 
359
C                                   ------------------------------------
 
360
C                                    THE CORRECTOR HAS CONVERGED.  IPUP
 
361
C                                    IS SET TO -1 IF MITER .NE. 0, TO
 
362
C                                    SIGNAL THAT THE JACOBIAN INVOLVED
 
363
C                                    MAY NEED UPDATING LATER.  THE LOCAL
 
364
C                                    ERROR TEST IS MADE AND CONTROL
 
365
C                                    PASSES TO STATEMENT 500 IF IT
 
366
C                                    FAILS.
 
367
C                                   ------------------------------------
 
368
                                    IF (MITER .NE. 0) IPUP = -1
 
369
                                    IF (M .EQ. 0) DSM = DEL/TESCO(2,NQ)
 
370
                                    IF (M .GT. 0)
 
371
     1                                 DSM = DVNRMS(N,ACOR,EWT)
 
372
     2                                       /TESCO(2,NQ)
 
373
                                    IF (DSM .GT. 1.0D0) GO TO 380
 
374
C                                      BEGIN BLOCK
 
375
C                                      PERMITTING ...EXITS TO 360
 
376
C                                         ------------------------------
 
377
C                                          AFTER A SUCCESSFUL STEP,
 
378
C                                          UPDATE THE YH ARRAY.
 
379
C                                          CONSIDER CHANGING H IF IALTH
 
380
C                                          = 1.  OTHERWISE DECREASE
 
381
C                                          IALTH BY 1.  IF IALTH IS THEN
 
382
C                                          1 AND NQ .LT. MAXORD, THEN
 
383
C                                          ACOR IS SAVED FOR USE IN A
 
384
C                                          POSSIBLE ORDER INCREASE ON
 
385
C                                          THE NEXT STEP.  IF A CHANGE
 
386
C                                          IN H IS CONSIDERED, AN
 
387
C                                          INCREASE OR DECREASE IN ORDER
 
388
C                                          BY ONE IS CONSIDERED ALSO.  A
 
389
C                                          CHANGE IN H IS MADE ONLY IF
 
390
C                                          IT IS BY A FACTOR OF AT LEAST
 
391
C                                          1.1.  IF NOT, IALTH IS SET TO
 
392
C                                          3 TO PREVENT TESTING FOR THAT
 
393
C                                          MANY STEPS.
 
394
C                                         ------------------------------
 
395
                                          KFLAG = 0
 
396
                                          IREDO = 0
 
397
                                          NST = NST + 1
 
398
                                          HU = H
 
399
                                          NQU = NQ
 
400
                                          DO 320 J = 1, L
 
401
                                             DO 310 I = 1, N
 
402
                                                YH(I,J) = YH(I,J)
 
403
     1                                                    + EL(J)
 
404
     2                                                      *ACOR(I)
 
405
  310                                        CONTINUE
 
406
  320                                     CONTINUE
 
407
                                          IALTH = IALTH - 1
 
408
                                          IF (IALTH .NE. 0) GO TO 340
 
409
C                                            ---------------------------
 
410
C                                             REGARDLESS OF THE SUCCESS
 
411
C                                             OR FAILURE OF THE STEP,
 
412
C                                             FACTORS RHDN, RHSM, AND
 
413
C                                             RHUP ARE COMPUTED, BY
 
414
C                                             WHICH H COULD BE
 
415
C                                             MULTIPLIED AT ORDER NQ -
 
416
C                                             1, ORDER NQ, OR ORDER NQ +
 
417
C                                             1, RESPECTIVELY.  IN THE
 
418
C                                             CASE OF FAILURE, RHUP =
 
419
C                                             0.0 TO AVOID AN ORDER
 
420
C                                             INCREASE.  THE LARGEST OF
 
421
C                                             THESE IS DETERMINED AND
 
422
C                                             THE NEW ORDER CHOSEN
 
423
C                                             ACCORDINGLY.  IF THE ORDER
 
424
C                                             IS TO BE INCREASED, WE
 
425
C                                             COMPUTE ONE ADDITIONAL
 
426
C                                             SCALED DERIVATIVE.
 
427
C                                            ---------------------------
 
428
                                             RHUP = 0.0D0
 
429
C                       .....................EXIT
 
430
                                             IF (L .EQ. LMAX) GO TO 490
 
431
                                             DO 330 I = 1, N
 
432
                                                SAVF(I) = ACOR(I)
 
433
     1                                                    - YH(I,LMAX)
 
434
  330                                        CONTINUE
 
435
                                             DUP = DVNRMS(N,SAVF,EWT)
 
436
     1                                             /TESCO(3,NQ)
 
437
                                             EXUP = 1.0D0/(L+1)
 
438
                                             RHUP = 1.0D0
 
439
     1                                              /(1.4D0*DUP**EXUP
 
440
     2                                                + 0.0000014D0)
 
441
C                       .....................EXIT
 
442
                                             GO TO 490
 
443
  340                                     CONTINUE
 
444
C                                      ...EXIT
 
445
                                          IF (IALTH .GT. 1) GO TO 360
 
446
C                                      ...EXIT
 
447
                                          IF (L .EQ. LMAX) GO TO 360
 
448
                                          DO 350 I = 1, N
 
449
                                             YH(I,LMAX) = ACOR(I)
 
450
  350                                     CONTINUE
 
451
  360                                  CONTINUE
 
452
                                       R = 1.0D0/TESCO(2,NQU)
 
453
                                       DO 370 I = 1, N
 
454
                                          ACOR(I) = ACOR(I)*R
 
455
  370                                  CONTINUE
 
456
C     .................................EXIT
 
457
                                       GO TO 690
 
458
  380                               CONTINUE
 
459
C                                   ------------------------------------
 
460
C                                    THE ERROR TEST FAILED.  KFLAG KEEPS
 
461
C                                    TRACK OF MULTIPLE FAILURES.
 
462
C                                    RESTORE TN AND THE YH ARRAY TO
 
463
C                                    THEIR PREVIOUS VALUES, AND PREPARE
 
464
C                                    TO TRY THE STEP AGAIN.  COMPUTE THE
 
465
C                                    OPTIMUM STEP SIZE FOR THIS OR ONE
 
466
C                                    LOWER ORDER.  AFTER 2 OR MORE
 
467
C                                    FAILURES, H IS FORCED TO DECREASE
 
468
C                                    BY A FACTOR OF 0.2 OR LESS.
 
469
C                                   ------------------------------------
 
470
                                    KFLAG = KFLAG - 1
 
471
                                    TN = TOLD
 
472
                                    I1 = NQNYH + 1
 
473
                                    DO 400 JB = 1, NQ
 
474
                                       I1 = I1 - NYH
 
475
                                       DO 390 I = I1, NQNYH
 
476
                                          YH1(I) = YH1(I) - YH1(I+NYH)
 
477
  390                                  CONTINUE
 
478
  400                               CONTINUE
 
479
                                    RMAX = 2.0D0
 
480
                                    IF (ABS(H) .GT. HMIN*1.00001D0)
 
481
     1                                 GO TO 410
 
482
C                                      ---------------------------------
 
483
C                                       ALL RETURNS ARE MADE THROUGH
 
484
C                                       THIS SECTION.  H IS SAVED IN
 
485
C                                       HOLD TO ALLOW THE CALLER TO
 
486
C                                       CHANGE H ON THE NEXT STEP.
 
487
C                                      ---------------------------------
 
488
                                       KFLAG = -1
 
489
C     .................................EXIT
 
490
                                       GO TO 690
 
491
  410                               CONTINUE
 
492
C                    ...............EXIT
 
493
                                    IF (KFLAG .LE. -3) GO TO 610
 
494
                                    IREDO = 2
 
495
                                    RHUP = 0.0D0
 
496
C                       ............EXIT
 
497
                                    GO TO 490
 
498
  420                            CONTINUE
 
499
                                 M = M + 1
 
500
C                             ...EXIT
 
501
                                 IF (M .EQ. 3) GO TO 430
 
502
C                             ...EXIT
 
503
                                 IF (M .GE. 2 .AND. DEL .GT. 2.0D0*DELP)
 
504
     1                              GO TO 430
 
505
                                 DELP = DEL
 
506
                                 CALL DF(TN,Y,SAVF,RPAR,IPAR)
 
507
                                 NFE = NFE + 1
 
508
                              GO TO 240
 
509
  430                         CONTINUE
 
510
C                             ------------------------------------------
 
511
C                              THE CORRECTOR ITERATION FAILED TO
 
512
C                              CONVERGE IN 3 TRIES.  IF MITER .NE. 0 AND
 
513
C                              THE JACOBIAN IS OUT OF DATE, DPJAC IS
 
514
C                              CALLED FOR THE NEXT TRY.  OTHERWISE THE
 
515
C                              YH ARRAY IS RETRACTED TO ITS VALUES
 
516
C                              BEFORE PREDICTION, AND H IS REDUCED, IF
 
517
C                              POSSIBLE.  IF H CANNOT BE REDUCED OR 10
 
518
C                              FAILURES HAVE OCCURRED, EXIT WITH KFLAG =
 
519
C                              -2.
 
520
C                             ------------------------------------------
 
521
C                          ...EXIT
 
522
                              IF (IPUP .EQ. 0) GO TO 440
 
523
                              IPUP = MITER
 
524
                           GO TO 200
 
525
  440                      CONTINUE
 
526
                           TN = TOLD
 
527
                           NCF = NCF + 1
 
528
                           RMAX = 2.0D0
 
529
                           I1 = NQNYH + 1
 
530
                           DO 460 JB = 1, NQ
 
531
                              I1 = I1 - NYH
 
532
                              DO 450 I = I1, NQNYH
 
533
                                 YH1(I) = YH1(I) - YH1(I+NYH)
 
534
  450                         CONTINUE
 
535
  460                      CONTINUE
 
536
                           IF (ABS(H) .GT. HMIN*1.00001D0) GO TO 470
 
537
                              KFLAG = -2
 
538
C     ........................EXIT
 
539
                              GO TO 690
 
540
  470                      CONTINUE
 
541
                           IF (NCF .NE. 10) GO TO 480
 
542
                              KFLAG = -2
 
543
C     ........................EXIT
 
544
                              GO TO 690
 
545
  480                      CONTINUE
 
546
                           RH = 0.25D0
 
547
                           IPUP = MITER
 
548
                           IREDO = 1
 
549
C                 .........EXIT
 
550
                           GO TO 650
 
551
  490                   CONTINUE
 
552
                        EXSM = 1.0D0/L
 
553
                        RHSM = 1.0D0/(1.2D0*DSM**EXSM + 0.0000012D0)
 
554
                        RHDN = 0.0D0
 
555
                        IF (NQ .EQ. 1) GO TO 500
 
556
                           DDN = DVNRMS(N,YH(1,L),EWT)/TESCO(1,NQ)
 
557
                           EXDN = 1.0D0/NQ
 
558
                           RHDN = 1.0D0/(1.3D0*DDN**EXDN + 0.0000013D0)
 
559
  500                   CONTINUE
 
560
                        IF (RHSM .GE. RHUP) GO TO 550
 
561
                           IF (RHUP .LE. RHDN) GO TO 540
 
562
                              NEWQ = L
 
563
                              RH = RHUP
 
564
                              IF (RH .GE. 1.1D0) GO TO 520
 
565
                                 IALTH = 3
 
566
                                 R = 1.0D0/TESCO(2,NQU)
 
567
                                 DO 510 I = 1, N
 
568
                                    ACOR(I) = ACOR(I)*R
 
569
  510                            CONTINUE
 
570
C     ...........................EXIT
 
571
                                 GO TO 690
 
572
  520                         CONTINUE
 
573
                              R = EL(L)/L
 
574
                              DO 530 I = 1, N
 
575
                                 YH(I,NEWQ+1) = ACOR(I)*R
 
576
  530                         CONTINUE
 
577
                              NQ = NEWQ
 
578
                              L = NQ + 1
 
579
                              IRET = 2
 
580
C           ..................EXIT
 
581
                              GO TO 680
 
582
  540                      CONTINUE
 
583
                        GO TO 580
 
584
  550                   CONTINUE
 
585
                        IF (RHSM .LT. RHDN) GO TO 580
 
586
                           NEWQ = NQ
 
587
                           RH = RHSM
 
588
                           IF (KFLAG .EQ. 0 .AND. RH .LT. 1.1D0)
 
589
     1                        GO TO 560
 
590
                              IF (KFLAG .LE. -2) RH = MIN(RH,0.2D0)
 
591
C                             ------------------------------------------
 
592
C                              IF THERE IS A CHANGE OF ORDER, RESET NQ,
 
593
C                              L, AND THE COEFFICIENTS.  IN ANY CASE H
 
594
C                              IS RESET ACCORDING TO RH AND THE YH ARRAY
 
595
C                              IS RESCALED.  THEN EXIT FROM 680 IF THE
 
596
C                              STEP WAS OK, OR REDO THE STEP OTHERWISE.
 
597
C                             ------------------------------------------
 
598
C                 ............EXIT
 
599
                              IF (NEWQ .EQ. NQ) GO TO 650
 
600
                              NQ = NEWQ
 
601
                              L = NQ + 1
 
602
                              IRET = 2
 
603
C           ..................EXIT
 
604
                              GO TO 680
 
605
  560                      CONTINUE
 
606
                           IALTH = 3
 
607
                           R = 1.0D0/TESCO(2,NQU)
 
608
                           DO 570 I = 1, N
 
609
                              ACOR(I) = ACOR(I)*R
 
610
  570                      CONTINUE
 
611
C     .....................EXIT
 
612
                           GO TO 690
 
613
  580                   CONTINUE
 
614
                        NEWQ = NQ - 1
 
615
                        RH = RHDN
 
616
                        IF (KFLAG .LT. 0 .AND. RH .GT. 1.0D0) RH = 1.0D0
 
617
                        IF (KFLAG .EQ. 0 .AND. RH .LT. 1.1D0) GO TO 590
 
618
                           IF (KFLAG .LE. -2) RH = MIN(RH,0.2D0)
 
619
C                          ---------------------------------------------
 
620
C                           IF THERE IS A CHANGE OF ORDER, RESET NQ, L,
 
621
C                           AND THE COEFFICIENTS.  IN ANY CASE H IS
 
622
C                           RESET ACCORDING TO RH AND THE YH ARRAY IS
 
623
C                           RESCALED.  THEN EXIT FROM 680 IF THE STEP
 
624
C                           WAS OK, OR REDO THE STEP OTHERWISE.
 
625
C                          ---------------------------------------------
 
626
C                 .........EXIT
 
627
                           IF (NEWQ .EQ. NQ) GO TO 650
 
628
                           NQ = NEWQ
 
629
                           L = NQ + 1
 
630
                           IRET = 2
 
631
C           ...............EXIT
 
632
                           GO TO 680
 
633
  590                   CONTINUE
 
634
                        IALTH = 3
 
635
                        R = 1.0D0/TESCO(2,NQU)
 
636
                        DO 600 I = 1, N
 
637
                           ACOR(I) = ACOR(I)*R
 
638
  600                   CONTINUE
 
639
C     ..................EXIT
 
640
                        GO TO 690
 
641
  610                CONTINUE
 
642
C                    ---------------------------------------------------
 
643
C                     CONTROL REACHES THIS SECTION IF 3 OR MORE FAILURES
 
644
C                     HAVE OCCURRED.  IF 10 FAILURES HAVE OCCURRED, EXIT
 
645
C                     WITH KFLAG = -1.  IT IS ASSUMED THAT THE
 
646
C                     DERIVATIVES THAT HAVE ACCUMULATED IN THE YH ARRAY
 
647
C                     HAVE ERRORS OF THE WRONG ORDER.  HENCE THE FIRST
 
648
C                     DERIVATIVE IS RECOMPUTED, AND THE ORDER IS SET TO
 
649
C                     1.  THEN H IS REDUCED BY A FACTOR OF 10, AND THE
 
650
C                     STEP IS RETRIED, UNTIL IT SUCCEEDS OR H REACHES
 
651
C                     HMIN.
 
652
C                    ---------------------------------------------------
 
653
                     IF (KFLAG .NE. -10) GO TO 620
 
654
C                       ------------------------------------------------
 
655
C                        ALL RETURNS ARE MADE THROUGH THIS SECTION.  H
 
656
C                        IS SAVED IN HOLD TO ALLOW THE CALLER TO CHANGE
 
657
C                        H ON THE NEXT STEP.
 
658
C                       ------------------------------------------------
 
659
                        KFLAG = -1
 
660
C     ..................EXIT
 
661
                        GO TO 690
 
662
  620                CONTINUE
 
663
                     RH = 0.1D0
 
664
                     RH = MAX(HMIN/ABS(H),RH)
 
665
                     H = H*RH
 
666
                     DO 630 I = 1, N
 
667
                        Y(I) = YH(I,1)
 
668
  630                CONTINUE
 
669
                     CALL DF(TN,Y,SAVF,RPAR,IPAR)
 
670
                     NFE = NFE + 1
 
671
                     DO 640 I = 1, N
 
672
                        YH(I,2) = H*SAVF(I)
 
673
  640                CONTINUE
 
674
                     IPUP = MITER
 
675
                     IALTH = 5
 
676
C              ......EXIT
 
677
                     IF (NQ .NE. 1) GO TO 670
 
678
                  GO TO 170
 
679
  650             CONTINUE
 
680
  660             CONTINUE
 
681
                  RH = MAX(RH,HMIN/ABS(H))
 
682
               GO TO 110
 
683
  670          CONTINUE
 
684
               NQ = 1
 
685
               L = 2
 
686
               IRET = 3
 
687
  680       CONTINUE
 
688
         GO TO 70
 
689
  690 CONTINUE
 
690
      HOLD = H
 
691
      JSTART = 1
 
692
      RETURN
 
693
C     ----------------------- END OF SUBROUTINE DSTOD
 
694
C     -----------------------
 
695
      END