123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695 |
- *DECK DSTOD
- SUBROUTINE DSTOD (NEQ, Y, YH, NYH, YH1, EWT, SAVF, ACOR, WM, IWM,
- + DF, DJAC, RPAR, IPAR)
- C***BEGIN PROLOGUE DSTOD
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to DDEBDF
- C***LIBRARY SLATEC
- C***TYPE DOUBLE PRECISION (STOD-S, DSTOD-D)
- C***AUTHOR Watts, H. A., (SNLA)
- C***DESCRIPTION
- C
- C DSTOD integrates a system of first order odes over one step in the
- C integrator package DDEBDF.
- C ----------------------------------------------------------------------
- C DSTOD performs one step of the integration of an initial value
- C problem for a system of ordinary differential equations.
- C Note.. DSTOD is independent of the value of the iteration method
- C indicator MITER, when this is .NE. 0, and hence is independent
- C of the type of chord method used, or the Jacobian structure.
- C Communication with DSTOD is done with the following variables..
- C
- C Y = An array of length .GE. N used as the Y argument in
- C all calls to DF and DJAC.
- C NEQ = Integer array containing problem size in NEQ(1), and
- C passed as the NEQ argument in all calls to DF and DJAC.
- C YH = An NYH by LMAX array containing the dependent variables
- C and their approximate scaled derivatives, where
- C LMAX = MAXORD + 1. YH(I,J+1) contains the approximate
- C J-th derivative of Y(I), scaled by H**J/FACTORIAL(J)
- C (J = 0,1,...,NQ). On entry for the first step, the first
- C two columns of YH must be set from the initial values.
- C NYH = A constant integer .GE. N, the first dimension of YH.
- C YH1 = A one-dimensional array occupying the same space as YH.
- C EWT = An array of N elements with which the estimated local
- C errors in YH are compared.
- C SAVF = An array of working storage, of length N.
- C ACOR = A work array of length N, used for the accumulated
- C corrections. On a successful return, ACOR(I) contains
- C the estimated one-step local error in Y(I).
- C WM,IWM = DOUBLE PRECISION and INTEGER work arrays associated with
- C matrix operations in chord iteration (MITER .NE. 0).
- C DPJAC = Name of routine to evaluate and preprocess Jacobian matrix
- C if a chord method is being used.
- C DSLVS = Name of routine to solve linear system in chord iteration.
- C H = The step size to be attempted on the next step.
- C H is altered by the error control algorithm during the
- C problem. H can be either positive or negative, but its
- C sign must remain constant throughout the problem.
- C HMIN = The minimum absolute value of the step size H to be used.
- C HMXI = Inverse of the maximum absolute value of H to be used.
- C HMXI = 0.0 is allowed and corresponds to an infinite HMAX.
- C HMIN and HMXI may be changed at any time, but will not
- C take effect until the next change of H is considered.
- C TN = The independent variable. TN is updated on each step taken.
- C JSTART = An integer used for input only, with the following
- C values and meanings..
- C 0 Perform the first step.
- C .GT.0 Take a new step continuing from the last.
- C -1 Take the next step with a new value of H, MAXORD,
- C N, METH, MITER, and/or matrix parameters.
- C -2 Take the next step with a new value of H,
- C but with other inputs unchanged.
- C On return, JSTART is set to 1 to facilitate continuation.
- C KFLAG = a completion code with the following meanings..
- C 0 The step was successful.
- C -1 The requested error could not be achieved.
- C -2 Corrector convergence could not be achieved.
- C A return with KFLAG = -1 or -2 means either
- C ABS(H) = HMIN or 10 consecutive failures occurred.
- C On a return with KFLAG negative, the values of TN and
- C the YH array are as of the beginning of the last
- C step, and H is the last step size attempted.
- C MAXORD = The maximum order of integration method to be allowed.
- C METH/MITER = The method flags. See description in driver.
- C N = The number of first-order differential equations.
- C ----------------------------------------------------------------------
- C
- C***SEE ALSO DDEBDF
- C***ROUTINES CALLED DCFOD, DPJAC, DSLVS, DVNRMS
- C***COMMON BLOCKS DDEBD1
- C***REVISION HISTORY (YYMMDD)
- C 820301 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890911 Removed unnecessary intrinsics. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900328 Added TYPE section. (WRB)
- C 910722 Updated AUTHOR section. (ALS)
- C 920422 Changed DIMENSION statement. (WRB)
- C***END PROLOGUE DSTOD
- C
- INTEGER I, I1, IALTH, IER, IOD, IOWND, IPAR, IPUP, IREDO, IRET,
- 1 IWM, J, JB, JSTART, KFLAG, KSTEPS, L, LMAX, M, MAXORD,
- 2 MEO, METH, MITER, N, NCF, NEQ, NEWQ, NFE, NJE, NQ, NQNYH,
- 3 NQU, NST, NSTEPJ, NYH
- DOUBLE PRECISION ACOR, CONIT, CRATE, DCON, DDN,
- 1 DEL, DELP, DSM, DUP, DVNRMS, EL, EL0, ELCO,
- 2 EWT, EXDN, EXSM, EXUP, H, HMIN, HMXI, HOLD, HU, R, RC,
- 3 RH, RHDN, RHSM, RHUP, RMAX, ROWND, RPAR, SAVF, TESCO,
- 4 TN, TOLD, UROUND, WM, Y, YH, YH1
- EXTERNAL DF, DJAC
- C
- DIMENSION Y(*),YH(NYH,*),YH1(*),EWT(*),SAVF(*),ACOR(*),WM(*),
- 1 IWM(*),RPAR(*),IPAR(*)
- COMMON /DDEBD1/ ROWND,CONIT,CRATE,EL(13),ELCO(13,12),HOLD,RC,RMAX,
- 1 TESCO(3,12),EL0,H,HMIN,HMXI,HU,TN,UROUND,IOWND(7),
- 2 KSTEPS,IOD(6),IALTH,IPUP,LMAX,MEO,NQNYH,NSTEPJ,
- 3 IER,JSTART,KFLAG,L,METH,MITER,MAXORD,N,NQ,NST,NFE,
- 4 NJE,NQU
- C
- C
- C BEGIN BLOCK PERMITTING ...EXITS TO 690
- C BEGIN BLOCK PERMITTING ...EXITS TO 60
- C***FIRST EXECUTABLE STATEMENT DSTOD
- KFLAG = 0
- TOLD = TN
- NCF = 0
- IF (JSTART .GT. 0) GO TO 160
- IF (JSTART .EQ. -1) GO TO 10
- IF (JSTART .EQ. -2) GO TO 90
- C ---------------------------------------------------------
- C ON THE FIRST CALL, THE ORDER IS SET TO 1, AND OTHER
- C VARIABLES ARE INITIALIZED. RMAX IS THE MAXIMUM RATIO BY
- C WHICH H CAN BE INCREASED IN A SINGLE STEP. IT IS
- C INITIALLY 1.E4 TO COMPENSATE FOR THE SMALL INITIAL H,
- C BUT THEN IS NORMALLY EQUAL TO 10. IF A FAILURE OCCURS
- C (IN CORRECTOR CONVERGENCE OR ERROR TEST), RMAX IS SET AT
- C 2 FOR THE NEXT INCREASE.
- C ---------------------------------------------------------
- LMAX = MAXORD + 1
- NQ = 1
- L = 2
- IALTH = 2
- RMAX = 10000.0D0
- RC = 0.0D0
- EL0 = 1.0D0
- CRATE = 0.7D0
- DELP = 0.0D0
- HOLD = H
- MEO = METH
- NSTEPJ = 0
- IRET = 3
- GO TO 50
- 10 CONTINUE
- C BEGIN BLOCK PERMITTING ...EXITS TO 30
- C ------------------------------------------------------
- C THE FOLLOWING BLOCK HANDLES PRELIMINARIES NEEDED WHEN
- C JSTART = -1. IPUP IS SET TO MITER TO FORCE A MATRIX
- C UPDATE. IF AN ORDER INCREASE IS ABOUT TO BE
- C CONSIDERED (IALTH = 1), IALTH IS RESET TO 2 TO
- C POSTPONE CONSIDERATION ONE MORE STEP. IF THE CALLER
- C HAS CHANGED METH, DCFOD IS CALLED TO RESET THE
- C COEFFICIENTS OF THE METHOD. IF THE CALLER HAS
- C CHANGED MAXORD TO A VALUE LESS THAN THE CURRENT
- C ORDER NQ, NQ IS REDUCED TO MAXORD, AND A NEW H CHOSEN
- C ACCORDINGLY. IF H IS TO BE CHANGED, YH MUST BE
- C RESCALED. IF H OR METH IS BEING CHANGED, IALTH IS
- C RESET TO L = NQ + 1 TO PREVENT FURTHER CHANGES IN H
- C FOR THAT MANY STEPS.
- C ------------------------------------------------------
- IPUP = MITER
- LMAX = MAXORD + 1
- IF (IALTH .EQ. 1) IALTH = 2
- IF (METH .EQ. MEO) GO TO 20
- CALL DCFOD(METH,ELCO,TESCO)
- MEO = METH
- C ......EXIT
- IF (NQ .GT. MAXORD) GO TO 30
- IALTH = L
- IRET = 1
- C ............EXIT
- GO TO 60
- 20 CONTINUE
- IF (NQ .LE. MAXORD) GO TO 90
- 30 CONTINUE
- NQ = MAXORD
- L = LMAX
- DO 40 I = 1, L
- EL(I) = ELCO(I,NQ)
- 40 CONTINUE
- NQNYH = NQ*NYH
- RC = RC*EL(1)/EL0
- EL0 = EL(1)
- CONIT = 0.5D0/(NQ+2)
- DDN = DVNRMS(N,SAVF,EWT)/TESCO(1,L)
- EXDN = 1.0D0/L
- RHDN = 1.0D0/(1.3D0*DDN**EXDN + 0.0000013D0)
- RH = MIN(RHDN,1.0D0)
- IREDO = 3
- IF (H .EQ. HOLD) GO TO 660
- RH = MIN(RH,ABS(H/HOLD))
- H = HOLD
- GO TO 100
- 50 CONTINUE
- C ------------------------------------------------------------
- C DCFOD IS CALLED TO GET ALL THE INTEGRATION COEFFICIENTS
- C FOR THE CURRENT METH. THEN THE EL VECTOR AND RELATED
- C CONSTANTS ARE RESET WHENEVER THE ORDER NQ IS CHANGED, OR AT
- C THE START OF THE PROBLEM.
- C ------------------------------------------------------------
- CALL DCFOD(METH,ELCO,TESCO)
- 60 CONTINUE
- 70 CONTINUE
- C BEGIN BLOCK PERMITTING ...EXITS TO 680
- DO 80 I = 1, L
- EL(I) = ELCO(I,NQ)
- 80 CONTINUE
- NQNYH = NQ*NYH
- RC = RC*EL(1)/EL0
- EL0 = EL(1)
- CONIT = 0.5D0/(NQ+2)
- GO TO (90,660,160), IRET
- C ---------------------------------------------------------
- C IF H IS BEING CHANGED, THE H RATIO RH IS CHECKED AGAINST
- C RMAX, HMIN, AND HMXI, AND THE YH ARRAY RESCALED. IALTH
- C IS SET TO L = NQ + 1 TO PREVENT A CHANGE OF H FOR THAT
- C MANY STEPS, UNLESS FORCED BY A CONVERGENCE OR ERROR TEST
- C FAILURE.
- C ---------------------------------------------------------
- 90 CONTINUE
- IF (H .EQ. HOLD) GO TO 160
- RH = H/HOLD
- H = HOLD
- IREDO = 3
- 100 CONTINUE
- 110 CONTINUE
- RH = MIN(RH,RMAX)
- RH = RH/MAX(1.0D0,ABS(H)*HMXI*RH)
- R = 1.0D0
- DO 130 J = 2, L
- R = R*RH
- DO 120 I = 1, N
- YH(I,J) = YH(I,J)*R
- 120 CONTINUE
- 130 CONTINUE
- H = H*RH
- RC = RC*RH
- IALTH = L
- IF (IREDO .NE. 0) GO TO 150
- RMAX = 10.0D0
- R = 1.0D0/TESCO(2,NQU)
- DO 140 I = 1, N
- ACOR(I) = ACOR(I)*R
- 140 CONTINUE
- C ...............EXIT
- GO TO 690
- 150 CONTINUE
- C ------------------------------------------------------
- C THIS SECTION COMPUTES THE PREDICTED VALUES BY
- C EFFECTIVELY MULTIPLYING THE YH ARRAY BY THE PASCAL
- C TRIANGLE MATRIX. RC IS THE RATIO OF NEW TO OLD
- C VALUES OF THE COEFFICIENT H*EL(1). WHEN RC DIFFERS
- C FROM 1 BY MORE THAN 30 PERCENT, IPUP IS SET TO MITER
- C TO FORCE DPJAC TO BE CALLED, IF A JACOBIAN IS
- C INVOLVED. IN ANY CASE, DPJAC IS CALLED AT LEAST
- C EVERY 20-TH STEP.
- C ------------------------------------------------------
- 160 CONTINUE
- 170 CONTINUE
- C BEGIN BLOCK PERMITTING ...EXITS TO 610
- C BEGIN BLOCK PERMITTING ...EXITS TO 490
- IF (ABS(RC-1.0D0) .GT. 0.3D0) IPUP = MITER
- IF (NST .GE. NSTEPJ + 20) IPUP = MITER
- TN = TN + H
- I1 = NQNYH + 1
- DO 190 JB = 1, NQ
- I1 = I1 - NYH
- DO 180 I = I1, NQNYH
- YH1(I) = YH1(I) + YH1(I+NYH)
- 180 CONTINUE
- 190 CONTINUE
- KSTEPS = KSTEPS + 1
- C ---------------------------------------------
- C UP TO 3 CORRECTOR ITERATIONS ARE TAKEN. A
- C CONVERGENCE TEST IS MADE ON THE R.M.S. NORM
- C OF EACH CORRECTION, WEIGHTED BY THE ERROR
- C WEIGHT VECTOR EWT. THE SUM OF THE
- C CORRECTIONS IS ACCUMULATED IN THE VECTOR
- C ACOR(I). THE YH ARRAY IS NOT ALTERED IN THE
- C CORRECTOR LOOP.
- C ---------------------------------------------
- 200 CONTINUE
- M = 0
- DO 210 I = 1, N
- Y(I) = YH(I,1)
- 210 CONTINUE
- CALL DF(TN,Y,SAVF,RPAR,IPAR)
- NFE = NFE + 1
- IF (IPUP .LE. 0) GO TO 220
- C ---------------------------------------
- C IF INDICATED, THE MATRIX P = I -
- C H*EL(1)*J IS REEVALUATED AND
- C PREPROCESSED BEFORE STARTING THE
- C CORRECTOR ITERATION. IPUP IS SET TO 0
- C AS AN INDICATOR THAT THIS HAS BEEN
- C DONE.
- C ---------------------------------------
- IPUP = 0
- RC = 1.0D0
- NSTEPJ = NST
- CRATE = 0.7D0
- CALL DPJAC(NEQ,Y,YH,NYH,EWT,ACOR,SAVF,
- 1 WM,IWM,DF,DJAC,RPAR,IPAR)
- C ......EXIT
- IF (IER .NE. 0) GO TO 440
- 220 CONTINUE
- DO 230 I = 1, N
- ACOR(I) = 0.0D0
- 230 CONTINUE
- 240 CONTINUE
- IF (MITER .NE. 0) GO TO 270
- C ------------------------------------
- C IN THE CASE OF FUNCTIONAL
- C ITERATION, UPDATE Y DIRECTLY FROM
- C THE RESULT OF THE LAST FUNCTION
- C EVALUATION.
- C ------------------------------------
- DO 250 I = 1, N
- SAVF(I) = H*SAVF(I) - YH(I,2)
- Y(I) = SAVF(I) - ACOR(I)
- 250 CONTINUE
- DEL = DVNRMS(N,Y,EWT)
- DO 260 I = 1, N
- Y(I) = YH(I,1) + EL(1)*SAVF(I)
- ACOR(I) = SAVF(I)
- 260 CONTINUE
- GO TO 300
- 270 CONTINUE
- C ------------------------------------
- C IN THE CASE OF THE CHORD METHOD,
- C COMPUTE THE CORRECTOR ERROR, AND
- C SOLVE THE LINEAR SYSTEM WITH THAT
- C AS RIGHT-HAND SIDE AND P AS
- C COEFFICIENT MATRIX.
- C ------------------------------------
- DO 280 I = 1, N
- Y(I) = H*SAVF(I)
- 1 - (YH(I,2) + ACOR(I))
- 280 CONTINUE
- CALL DSLVS(WM,IWM,Y,SAVF)
- C ......EXIT
- IF (IER .NE. 0) GO TO 430
- DEL = DVNRMS(N,Y,EWT)
- DO 290 I = 1, N
- ACOR(I) = ACOR(I) + Y(I)
- Y(I) = YH(I,1) + EL(1)*ACOR(I)
- 290 CONTINUE
- 300 CONTINUE
- C ---------------------------------------
- C TEST FOR CONVERGENCE. IF M.GT.0, AN
- C ESTIMATE OF THE CONVERGENCE RATE
- C CONSTANT IS STORED IN CRATE, AND THIS
- C IS USED IN THE TEST.
- C ---------------------------------------
- IF (M .NE. 0)
- 1 CRATE = MAX(0.2D0*CRATE,DEL/DELP)
- DCON = DEL*MIN(1.0D0,1.5D0*CRATE)
- 1 /(TESCO(2,NQ)*CONIT)
- IF (DCON .GT. 1.0D0) GO TO 420
- C ------------------------------------
- C THE CORRECTOR HAS CONVERGED. IPUP
- C IS SET TO -1 IF MITER .NE. 0, TO
- C SIGNAL THAT THE JACOBIAN INVOLVED
- C MAY NEED UPDATING LATER. THE LOCAL
- C ERROR TEST IS MADE AND CONTROL
- C PASSES TO STATEMENT 500 IF IT
- C FAILS.
- C ------------------------------------
- IF (MITER .NE. 0) IPUP = -1
- IF (M .EQ. 0) DSM = DEL/TESCO(2,NQ)
- IF (M .GT. 0)
- 1 DSM = DVNRMS(N,ACOR,EWT)
- 2 /TESCO(2,NQ)
- IF (DSM .GT. 1.0D0) GO TO 380
- C BEGIN BLOCK
- C PERMITTING ...EXITS TO 360
- C ------------------------------
- C AFTER A SUCCESSFUL STEP,
- C UPDATE THE YH ARRAY.
- C CONSIDER CHANGING H IF IALTH
- C = 1. OTHERWISE DECREASE
- C IALTH BY 1. IF IALTH IS THEN
- C 1 AND NQ .LT. MAXORD, THEN
- C ACOR IS SAVED FOR USE IN A
- C POSSIBLE ORDER INCREASE ON
- C THE NEXT STEP. IF A CHANGE
- C IN H IS CONSIDERED, AN
- C INCREASE OR DECREASE IN ORDER
- C BY ONE IS CONSIDERED ALSO. A
- C CHANGE IN H IS MADE ONLY IF
- C IT IS BY A FACTOR OF AT LEAST
- C 1.1. IF NOT, IALTH IS SET TO
- C 3 TO PREVENT TESTING FOR THAT
- C MANY STEPS.
- C ------------------------------
- KFLAG = 0
- IREDO = 0
- NST = NST + 1
- HU = H
- NQU = NQ
- DO 320 J = 1, L
- DO 310 I = 1, N
- YH(I,J) = YH(I,J)
- 1 + EL(J)
- 2 *ACOR(I)
- 310 CONTINUE
- 320 CONTINUE
- IALTH = IALTH - 1
- IF (IALTH .NE. 0) GO TO 340
- C ---------------------------
- C REGARDLESS OF THE SUCCESS
- C OR FAILURE OF THE STEP,
- C FACTORS RHDN, RHSM, AND
- C RHUP ARE COMPUTED, BY
- C WHICH H COULD BE
- C MULTIPLIED AT ORDER NQ -
- C 1, ORDER NQ, OR ORDER NQ +
- C 1, RESPECTIVELY. IN THE
- C CASE OF FAILURE, RHUP =
- C 0.0 TO AVOID AN ORDER
- C INCREASE. THE LARGEST OF
- C THESE IS DETERMINED AND
- C THE NEW ORDER CHOSEN
- C ACCORDINGLY. IF THE ORDER
- C IS TO BE INCREASED, WE
- C COMPUTE ONE ADDITIONAL
- C SCALED DERIVATIVE.
- C ---------------------------
- RHUP = 0.0D0
- C .....................EXIT
- IF (L .EQ. LMAX) GO TO 490
- DO 330 I = 1, N
- SAVF(I) = ACOR(I)
- 1 - YH(I,LMAX)
- 330 CONTINUE
- DUP = DVNRMS(N,SAVF,EWT)
- 1 /TESCO(3,NQ)
- EXUP = 1.0D0/(L+1)
- RHUP = 1.0D0
- 1 /(1.4D0*DUP**EXUP
- 2 + 0.0000014D0)
- C .....................EXIT
- GO TO 490
- 340 CONTINUE
- C ...EXIT
- IF (IALTH .GT. 1) GO TO 360
- C ...EXIT
- IF (L .EQ. LMAX) GO TO 360
- DO 350 I = 1, N
- YH(I,LMAX) = ACOR(I)
- 350 CONTINUE
- 360 CONTINUE
- R = 1.0D0/TESCO(2,NQU)
- DO 370 I = 1, N
- ACOR(I) = ACOR(I)*R
- 370 CONTINUE
- C .................................EXIT
- GO TO 690
- 380 CONTINUE
- C ------------------------------------
- C THE ERROR TEST FAILED. KFLAG KEEPS
- C TRACK OF MULTIPLE FAILURES.
- C RESTORE TN AND THE YH ARRAY TO
- C THEIR PREVIOUS VALUES, AND PREPARE
- C TO TRY THE STEP AGAIN. COMPUTE THE
- C OPTIMUM STEP SIZE FOR THIS OR ONE
- C LOWER ORDER. AFTER 2 OR MORE
- C FAILURES, H IS FORCED TO DECREASE
- C BY A FACTOR OF 0.2 OR LESS.
- C ------------------------------------
- KFLAG = KFLAG - 1
- TN = TOLD
- I1 = NQNYH + 1
- DO 400 JB = 1, NQ
- I1 = I1 - NYH
- DO 390 I = I1, NQNYH
- YH1(I) = YH1(I) - YH1(I+NYH)
- 390 CONTINUE
- 400 CONTINUE
- RMAX = 2.0D0
- IF (ABS(H) .GT. HMIN*1.00001D0)
- 1 GO TO 410
- C ---------------------------------
- C ALL RETURNS ARE MADE THROUGH
- C THIS SECTION. H IS SAVED IN
- C HOLD TO ALLOW THE CALLER TO
- C CHANGE H ON THE NEXT STEP.
- C ---------------------------------
- KFLAG = -1
- C .................................EXIT
- GO TO 690
- 410 CONTINUE
- C ...............EXIT
- IF (KFLAG .LE. -3) GO TO 610
- IREDO = 2
- RHUP = 0.0D0
- C ............EXIT
- GO TO 490
- 420 CONTINUE
- M = M + 1
- C ...EXIT
- IF (M .EQ. 3) GO TO 430
- C ...EXIT
- IF (M .GE. 2 .AND. DEL .GT. 2.0D0*DELP)
- 1 GO TO 430
- DELP = DEL
- CALL DF(TN,Y,SAVF,RPAR,IPAR)
- NFE = NFE + 1
- GO TO 240
- 430 CONTINUE
- C ------------------------------------------
- C THE CORRECTOR ITERATION FAILED TO
- C CONVERGE IN 3 TRIES. IF MITER .NE. 0 AND
- C THE JACOBIAN IS OUT OF DATE, DPJAC IS
- C CALLED FOR THE NEXT TRY. OTHERWISE THE
- C YH ARRAY IS RETRACTED TO ITS VALUES
- C BEFORE PREDICTION, AND H IS REDUCED, IF
- C POSSIBLE. IF H CANNOT BE REDUCED OR 10
- C FAILURES HAVE OCCURRED, EXIT WITH KFLAG =
- C -2.
- C ------------------------------------------
- C ...EXIT
- IF (IPUP .EQ. 0) GO TO 440
- IPUP = MITER
- GO TO 200
- 440 CONTINUE
- TN = TOLD
- NCF = NCF + 1
- RMAX = 2.0D0
- I1 = NQNYH + 1
- DO 460 JB = 1, NQ
- I1 = I1 - NYH
- DO 450 I = I1, NQNYH
- YH1(I) = YH1(I) - YH1(I+NYH)
- 450 CONTINUE
- 460 CONTINUE
- IF (ABS(H) .GT. HMIN*1.00001D0) GO TO 470
- KFLAG = -2
- C ........................EXIT
- GO TO 690
- 470 CONTINUE
- IF (NCF .NE. 10) GO TO 480
- KFLAG = -2
- C ........................EXIT
- GO TO 690
- 480 CONTINUE
- RH = 0.25D0
- IPUP = MITER
- IREDO = 1
- C .........EXIT
- GO TO 650
- 490 CONTINUE
- EXSM = 1.0D0/L
- RHSM = 1.0D0/(1.2D0*DSM**EXSM + 0.0000012D0)
- RHDN = 0.0D0
- IF (NQ .EQ. 1) GO TO 500
- DDN = DVNRMS(N,YH(1,L),EWT)/TESCO(1,NQ)
- EXDN = 1.0D0/NQ
- RHDN = 1.0D0/(1.3D0*DDN**EXDN + 0.0000013D0)
- 500 CONTINUE
- IF (RHSM .GE. RHUP) GO TO 550
- IF (RHUP .LE. RHDN) GO TO 540
- NEWQ = L
- RH = RHUP
- IF (RH .GE. 1.1D0) GO TO 520
- IALTH = 3
- R = 1.0D0/TESCO(2,NQU)
- DO 510 I = 1, N
- ACOR(I) = ACOR(I)*R
- 510 CONTINUE
- C ...........................EXIT
- GO TO 690
- 520 CONTINUE
- R = EL(L)/L
- DO 530 I = 1, N
- YH(I,NEWQ+1) = ACOR(I)*R
- 530 CONTINUE
- NQ = NEWQ
- L = NQ + 1
- IRET = 2
- C ..................EXIT
- GO TO 680
- 540 CONTINUE
- GO TO 580
- 550 CONTINUE
- IF (RHSM .LT. RHDN) GO TO 580
- NEWQ = NQ
- RH = RHSM
- IF (KFLAG .EQ. 0 .AND. RH .LT. 1.1D0)
- 1 GO TO 560
- IF (KFLAG .LE. -2) RH = MIN(RH,0.2D0)
- C ------------------------------------------
- C IF THERE IS A CHANGE OF ORDER, RESET NQ,
- C L, AND THE COEFFICIENTS. IN ANY CASE H
- C IS RESET ACCORDING TO RH AND THE YH ARRAY
- C IS RESCALED. THEN EXIT FROM 680 IF THE
- C STEP WAS OK, OR REDO THE STEP OTHERWISE.
- C ------------------------------------------
- C ............EXIT
- IF (NEWQ .EQ. NQ) GO TO 650
- NQ = NEWQ
- L = NQ + 1
- IRET = 2
- C ..................EXIT
- GO TO 680
- 560 CONTINUE
- IALTH = 3
- R = 1.0D0/TESCO(2,NQU)
- DO 570 I = 1, N
- ACOR(I) = ACOR(I)*R
- 570 CONTINUE
- C .....................EXIT
- GO TO 690
- 580 CONTINUE
- NEWQ = NQ - 1
- RH = RHDN
- IF (KFLAG .LT. 0 .AND. RH .GT. 1.0D0) RH = 1.0D0
- IF (KFLAG .EQ. 0 .AND. RH .LT. 1.1D0) GO TO 590
- IF (KFLAG .LE. -2) RH = MIN(RH,0.2D0)
- C ---------------------------------------------
- C IF THERE IS A CHANGE OF ORDER, RESET NQ, L,
- C AND THE COEFFICIENTS. IN ANY CASE H IS
- C RESET ACCORDING TO RH AND THE YH ARRAY IS
- C RESCALED. THEN EXIT FROM 680 IF THE STEP
- C WAS OK, OR REDO THE STEP OTHERWISE.
- C ---------------------------------------------
- C .........EXIT
- IF (NEWQ .EQ. NQ) GO TO 650
- NQ = NEWQ
- L = NQ + 1
- IRET = 2
- C ...............EXIT
- GO TO 680
- 590 CONTINUE
- IALTH = 3
- R = 1.0D0/TESCO(2,NQU)
- DO 600 I = 1, N
- ACOR(I) = ACOR(I)*R
- 600 CONTINUE
- C ..................EXIT
- GO TO 690
- 610 CONTINUE
- C ---------------------------------------------------
- C CONTROL REACHES THIS SECTION IF 3 OR MORE FAILURES
- C HAVE OCCURRED. IF 10 FAILURES HAVE OCCURRED, EXIT
- C WITH KFLAG = -1. IT IS ASSUMED THAT THE
- C DERIVATIVES THAT HAVE ACCUMULATED IN THE YH ARRAY
- C HAVE ERRORS OF THE WRONG ORDER. HENCE THE FIRST
- C DERIVATIVE IS RECOMPUTED, AND THE ORDER IS SET TO
- C 1. THEN H IS REDUCED BY A FACTOR OF 10, AND THE
- C STEP IS RETRIED, UNTIL IT SUCCEEDS OR H REACHES
- C HMIN.
- C ---------------------------------------------------
- IF (KFLAG .NE. -10) GO TO 620
- C ------------------------------------------------
- C ALL RETURNS ARE MADE THROUGH THIS SECTION. H
- C IS SAVED IN HOLD TO ALLOW THE CALLER TO CHANGE
- C H ON THE NEXT STEP.
- C ------------------------------------------------
- KFLAG = -1
- C ..................EXIT
- GO TO 690
- 620 CONTINUE
- RH = 0.1D0
- RH = MAX(HMIN/ABS(H),RH)
- H = H*RH
- DO 630 I = 1, N
- Y(I) = YH(I,1)
- 630 CONTINUE
- CALL DF(TN,Y,SAVF,RPAR,IPAR)
- NFE = NFE + 1
- DO 640 I = 1, N
- YH(I,2) = H*SAVF(I)
- 640 CONTINUE
- IPUP = MITER
- IALTH = 5
- C ......EXIT
- IF (NQ .NE. 1) GO TO 670
- GO TO 170
- 650 CONTINUE
- 660 CONTINUE
- RH = MAX(RH,HMIN/ABS(H))
- GO TO 110
- 670 CONTINUE
- NQ = 1
- L = 2
- IRET = 3
- 680 CONTINUE
- GO TO 70
- 690 CONTINUE
- HOLD = H
- JSTART = 1
- RETURN
- C ----------------------- END OF SUBROUTINE DSTOD
- C -----------------------
- END
|