2
SUBROUTINE SDASTP (X, Y, YPRIME, NEQ, RES, JAC, H, WT, JSTART,
3
* IDID, RPAR, IPAR, PHI, DELTA, E, WM, IWM, ALPHA, BETA, GAMMA,
4
* PSI, SIGMA, CJ, CJOLD, HOLD, S, HMIN, UROUND, IPHASE, JCALC, K,
5
* KOLD, NS, NONNEG, NTEMP)
6
C***BEGIN PROLOGUE SDASTP
8
C***PURPOSE Perform one step of the SDASSL integration.
9
C***LIBRARY SLATEC (DASSL)
10
C***TYPE SINGLE PRECISION (SDASTP-S, DDASTP-D)
11
C***AUTHOR Petzold, Linda R., (LLNL)
13
C-----------------------------------------------------------------------
14
C SDASTP SOLVES A SYSTEM OF DIFFERENTIAL/
15
C ALGEBRAIC EQUATIONS OF THE FORM
16
C G(X,Y,YPRIME) = 0, FOR ONE STEP (NORMALLY
19
C THE METHODS USED ARE MODIFIED DIVIDED
20
C DIFFERENCE,FIXED LEADING COEFFICIENT
21
C FORMS OF BACKWARD DIFFERENTIATION
22
C FORMULAS. THE CODE ADJUSTS THE STEPSIZE
23
C AND ORDER TO CONTROL THE LOCAL ERROR PER
27
C THE PARAMETERS REPRESENT
28
C X -- INDEPENDENT VARIABLE
29
C Y -- SOLUTION VECTOR AT X
30
C YPRIME -- DERIVATIVE OF SOLUTION VECTOR
31
C AFTER SUCCESSFUL STEP
32
C NEQ -- NUMBER OF EQUATIONS TO BE INTEGRATED
33
C RES -- EXTERNAL USER-SUPPLIED SUBROUTINE
34
C TO EVALUATE THE RESIDUAL. THE CALL IS
35
C CALL RES(X,Y,YPRIME,DELTA,IRES,RPAR,IPAR)
36
C X,Y,YPRIME ARE INPUT. DELTA IS OUTPUT.
37
C ON INPUT, IRES=0. RES SHOULD ALTER IRES ONLY
38
C IF IT ENCOUNTERS AN ILLEGAL VALUE OF Y OR A
39
C STOP CONDITION. SET IRES=-1 IF AN INPUT VALUE
40
C OF Y IS ILLEGAL, AND SDASTP WILL TRY TO SOLVE
41
C THE PROBLEM WITHOUT GETTING IRES = -1. IF
42
C IRES=-2, SDASTP RETURNS CONTROL TO THE CALLING
43
C PROGRAM WITH IDID = -11.
44
C JAC -- EXTERNAL USER-SUPPLIED ROUTINE TO EVALUATE
45
C THE ITERATION MATRIX (THIS IS OPTIONAL)
46
C THE CALL IS OF THE FORM
47
C CALL JAC(X,Y,YPRIME,PD,CJ,RPAR,IPAR)
48
C PD IS THE MATRIX OF PARTIAL DERIVATIVES,
49
C PD=DG/DY+CJ*DG/DYPRIME
50
C H -- APPROPRIATE STEP SIZE FOR NEXT STEP.
51
C NORMALLY DETERMINED BY THE CODE
52
C WT -- VECTOR OF WEIGHTS FOR ERROR CRITERION.
53
C JSTART -- INTEGER VARIABLE SET 0 FOR
54
C FIRST STEP, 1 OTHERWISE.
55
C IDID -- COMPLETION CODE WITH THE FOLLOWING MEANINGS:
56
C IDID= 1 -- THE STEP WAS COMPLETED SUCCESSFULLY
57
C IDID=-6 -- THE ERROR TEST FAILED REPEATEDLY
58
C IDID=-7 -- THE CORRECTOR COULD NOT CONVERGE
59
C IDID=-8 -- THE ITERATION MATRIX IS SINGULAR
60
C IDID=-9 -- THE CORRECTOR COULD NOT CONVERGE.
61
C THERE WERE REPEATED ERROR TEST
62
C FAILURES ON THIS STEP.
63
C IDID=-10-- THE CORRECTOR COULD NOT CONVERGE
64
C BECAUSE IRES WAS EQUAL TO MINUS ONE
65
C IDID=-11-- IRES EQUAL TO -2 WAS ENCOUNTERED,
66
C AND CONTROL IS BEING RETURNED TO
68
C RPAR,IPAR -- REAL AND INTEGER PARAMETER ARRAYS THAT
69
C ARE USED FOR COMMUNICATION BETWEEN THE
70
C CALLING PROGRAM AND EXTERNAL USER ROUTINES
71
C THEY ARE NOT ALTERED BY SDASTP
72
C PHI -- ARRAY OF DIVIDED DIFFERENCES USED BY
73
C SDASTP. THE LENGTH IS NEQ*(K+1),WHERE
74
C K IS THE MAXIMUM ORDER
75
C DELTA,E -- WORK VECTORS FOR SDASTP OF LENGTH NEQ
76
C WM,IWM -- REAL AND INTEGER ARRAYS STORING
77
C MATRIX INFORMATION SUCH AS THE MATRIX
78
C OF PARTIAL DERIVATIVES,PERMUTATION
79
C VECTOR, AND VARIOUS OTHER INFORMATION.
81
C THE OTHER PARAMETERS ARE INFORMATION
82
C WHICH IS NEEDED INTERNALLY BY SDASTP TO
83
C CONTINUE FROM STEP TO STEP.
85
C-----------------------------------------------------------------------
86
C***ROUTINES CALLED SDAJAC, SDANRM, SDASLV, SDATRP
87
C***REVISION HISTORY (YYMMDD)
89
C 901009 Finished conversion to SLATEC 4.0 format (F.N.Fritsch)
90
C 901019 Merged changes made by C. Ulrich with SLATEC 4.0 format.
91
C 901026 Added explicit declarations for all variables and minor
92
C cosmetic changes to prologue. (FNF)
93
C***END PROLOGUE SDASTP
95
INTEGER NEQ, JSTART, IDID, IPAR(*), IWM(*), IPHASE, JCALC, K,
96
* KOLD, NS, NONNEG, NTEMP
97
REAL X, Y(*), YPRIME(*), H, WT(*), RPAR(*), PHI(NEQ,*), DELTA(*),
98
* E(*), WM(*), ALPHA(*), BETA(*), GAMMA(*), PSI(*), SIGMA(*), CJ,
99
* CJOLD, HOLD, S, HMIN, UROUND
102
EXTERNAL SDAJAC, SDANRM, SDASLV, SDATRP
105
INTEGER I, IER, IRES, J, J1, KDIFF, KM1, KNEW, KP1, KP2, LCTF,
106
* LETF, LMXORD, LNJE, LNRE, LNST, M, MAXIT, NCF, NEF, NSF, NSP1
107
REAL ALPHA0, ALPHAS, CJLAST, CK, DELNRM, ENORM, ERK, ERKM1,
108
* ERKM2, ERKP1, ERR, EST, HNEW, OLDNRM, PNORM, R, RATE, TEMP1,
109
* TEMP2, TERK, TERKM1, TERKM2, TERKP1, XOLD, XRATE
126
C-----------------------------------------------------------------------
128
C INITIALIZE. ON THE FIRST CALL,SET
129
C THE ORDER TO 1 AND INITIALIZE
131
C-----------------------------------------------------------------------
133
C INITIALIZATIONS FOR ALL CALLS
134
C***FIRST EXECUTABLE STATEMENT SDASTP
140
IF(JSTART .NE. 0) GO TO 120
142
C IF THIS IS THE FIRST STEP,PERFORM
143
C OTHER INITIALIZATIONS
164
C-----------------------------------------------------------------------
166
C COMPUTE COEFFICIENTS OF FORMULAS FOR
168
C-----------------------------------------------------------------------
174
IF(H.NE.HOLD.OR.K .NE. KOLD) NS = 0
177
IF(KP1 .LT. NS)GO TO 230
187
BETA(I)=BETA(I-1)*PSI(I-1)/TEMP2
190
SIGMA(I)=(I-1)*SIGMA(I-1)*ALPHA(I)
191
GAMMA(I)=GAMMA(I-1)+ALPHA(I-1)/H
196
C COMPUTE ALPHAS, ALPHA0
200
ALPHAS = ALPHAS - 1.0E0/I
201
ALPHA0 = ALPHA0 - ALPHA(I)
204
C COMPUTE LEADING COEFFICIENT CJ
208
C COMPUTE VARIABLE STEPSIZE ERROR COEFFICIENT CK
209
CK = ABS(ALPHA(KP1) + ALPHAS - ALPHA0)
210
CK = MAX(CK,ALPHA(KP1))
212
C DECIDE WHETHER NEW JACOBIAN IS NEEDED
213
TEMP1 = (1.0E0 - XRATE)/(1.0E0 + XRATE)
215
IF (CJ/CJOLD .LT. TEMP1 .OR. CJ/CJOLD .GT. TEMP2) JCALC = -1
216
IF (CJ .NE. CJLAST) S = 100.E0
218
C CHANGE PHI TO PHI STAR
219
IF(KP1 .LT. NSP1) GO TO 280
222
260 PHI(I,J)=BETA(J)*PHI(I,J)
233
C-----------------------------------------------------------------------
235
C PREDICT THE SOLUTION AND DERIVATIVE,
236
C AND SOLVE THE CORRECTOR EQUATION
237
C-----------------------------------------------------------------------
239
C FIRST,PREDICT THE SOLUTION AND DERIVATIVE
247
320 YPRIME(I)=YPRIME(I)+GAMMA(J)*PHI(I,J)
249
PNORM = SDANRM (NEQ,Y,WT,RPAR,IPAR)
253
C SOLVE THE CORRECTOR EQUATION USING A
254
C MODIFIED NEWTON SCHEME.
257
IWM(LNRE)=IWM(LNRE)+1
259
CALL RES(X,Y,YPRIME,DELTA,IRES,RPAR,IPAR)
260
IF (IRES .LT. 0) GO TO 380
263
C IF INDICATED,REEVALUATE THE
264
C ITERATION MATRIX PD = DG/DY + CJ*DG/DYPRIME
265
C (WHERE G(X,Y,YPRIME)=0). SET
266
C JCALC TO 0 AS AN INDICATOR THAT
267
C THIS HAS BEEN DONE.
268
IF(JCALC .NE. -1)GO TO 340
269
IWM(LNJE)=IWM(LNJE)+1
271
CALL SDAJAC(NEQ,X,Y,YPRIME,DELTA,CJ,H,
272
* IER,WT,E,WM,IWM,RES,IRES,UROUND,JAC,RPAR,
276
IF (IRES .LT. 0) GO TO 380
277
IF(IER .NE. 0)GO TO 380
281
C INITIALIZE THE ERROR ACCUMULATION VECTOR E.
290
C MULTIPLY RESIDUAL BY TEMP1 TO ACCELERATE CONVERGENCE
291
TEMP1 = 2.0E0/(1.0E0 + CJ/CJOLD)
293
355 DELTA(I) = DELTA(I) * TEMP1
295
C COMPUTE A NEW ITERATE (BACK-SUBSTITUTION).
296
C STORE THE CORRECTION IN DELTA.
297
CALL SDASLV(NEQ,DELTA,WM,IWM)
299
C UPDATE Y, E, AND YPRIME
303
360 YPRIME(I)=YPRIME(I)-CJ*DELTA(I)
305
C TEST FOR CONVERGENCE OF THE ITERATION
306
DELNRM=SDANRM(NEQ,DELTA,WT,RPAR,IPAR)
307
IF (DELNRM .LE. 100.E0*UROUND*PNORM) GO TO 375
308
IF (M .GT. 0) GO TO 365
311
365 RATE = (DELNRM/OLDNRM)**(1.0E0/M)
312
IF (RATE .GT. 0.90E0) GO TO 370
313
S = RATE/(1.0E0 - RATE)
314
367 IF (S*DELNRM .LE. 0.33E0) GO TO 375
316
C THE CORRECTOR HAS NOT YET CONVERGED.
317
C UPDATE M AND TEST WHETHER THE
318
C MAXIMUM NUMBER OF ITERATIONS HAVE
321
IF(M.GE.MAXIT)GO TO 370
323
C EVALUATE THE RESIDUAL
324
C AND GO BACK TO DO ANOTHER ITERATION
325
IWM(LNRE)=IWM(LNRE)+1
327
CALL RES(X,Y,YPRIME,DELTA,IRES,
329
IF (IRES .LT. 0) GO TO 380
333
C THE CORRECTOR FAILED TO CONVERGE IN MAXIT
334
C ITERATIONS. IF THE ITERATION MATRIX
335
C IS NOT CURRENT,RE-DO THE STEP WITH
336
C A NEW ITERATION MATRIX.
338
IF(JCALC.EQ.0)GO TO 380
343
C THE ITERATION HAS CONVERGED. IF NONNEGATIVITY OF SOLUTION IS
344
C REQUIRED, SET THE SOLUTION NONNEGATIVE, IF THE PERTURBATION
345
C TO DO IT IS SMALL ENOUGH. IF THE CHANGE IS TOO LARGE, THEN
346
C CONSIDER THE CORRECTOR ITERATION TO HAVE FAILED.
347
375 IF(NONNEG .EQ. 0) GO TO 390
349
377 DELTA(I) = MIN(Y(I),0.0E0)
350
DELNRM = SDANRM(NEQ,DELTA,WT,RPAR,IPAR)
351
IF(DELNRM .GT. 0.33E0) GO TO 380
353
378 E(I) = E(I) - DELTA(I)
358
C NO CONVERGENCE WITH CURRENT ITERATION
359
C MATRIX,OR SINGULAR ITERATION MATRIX
362
IF(.NOT.CONVGD)GO TO 600
368
C-----------------------------------------------------------------------
370
C ESTIMATE THE ERRORS AT ORDERS K,K-1,K-2
371
C AS IF CONSTANT STEPSIZE WAS USED. ESTIMATE
372
C THE LOCAL ERROR AT ORDER K AND TEST
373
C WHETHER THE CURRENT STEP IS SUCCESSFUL.
374
C-----------------------------------------------------------------------
376
C ESTIMATE ERRORS AT ORDERS K,K-1,K-2
377
ENORM = SDANRM(NEQ,E,WT,RPAR,IPAR)
378
ERK = SIGMA(K+1)*ENORM
382
IF(K .EQ. 1)GO TO 430
384
405 DELTA(I) = PHI(I,KP1) + E(I)
385
ERKM1=SIGMA(K)*SDANRM(NEQ,DELTA,WT,RPAR,IPAR)
387
IF(K .GT. 2)GO TO 410
388
IF(TERKM1 .LE. 0.5E0*TERK)GO TO 420
392
415 DELTA(I) = PHI(I,K) + DELTA(I)
393
ERKM2=SIGMA(K-1)*SDANRM(NEQ,DELTA,WT,RPAR,IPAR)
395
IF(MAX(TERKM1,TERKM2).GT.TERK)GO TO 430
402
C CALCULATE THE LOCAL ERROR FOR THE CURRENT STEP
403
C TO SEE IF THE STEP WAS SUCCESSFUL
406
IF(ERR .GT. 1.0E0)GO TO 600
412
C-----------------------------------------------------------------------
414
C THE STEP IS SUCCESSFUL. DETERMINE
415
C THE BEST ORDER AND STEPSIZE FOR
416
C THE NEXT STEP. UPDATE THE DIFFERENCES
418
C-----------------------------------------------------------------------
420
IWM(LNST)=IWM(LNST)+1
426
C ESTIMATE THE ERROR AT ORDER K+1 UNLESS:
427
C ALREADY DECIDED TO LOWER ORDER, OR
428
C ALREADY USING MAXIMUM ORDER, OR
429
C STEPSIZE NOT CONSTANT, OR
430
C ORDER RAISED IN PREVIOUS STEP
431
IF(KNEW.EQ.KM1.OR.K.EQ.IWM(LMXORD))IPHASE=1
432
IF(IPHASE .EQ. 0)GO TO 545
433
IF(KNEW.EQ.KM1)GO TO 540
434
IF(K.EQ.IWM(LMXORD)) GO TO 550
435
IF(KP1.GE.NS.OR.KDIFF.EQ.1)GO TO 550
437
510 DELTA(I)=E(I)-PHI(I,KP2)
438
ERKP1 = (1.0E0/(K+2))*SDANRM(NEQ,DELTA,WT,RPAR,IPAR)
441
IF(TERKP1.GE.0.5E0*TERK)GO TO 550
443
520 IF(TERKM1.LE.MIN(TERK,TERKP1))GO TO 540
444
IF(TERKP1.GE.TERK.OR.K.EQ.IWM(LMXORD))GO TO 550
456
C IF IPHASE = 0, INCREASE ORDER BY ONE AND MULTIPLY STEPSIZE BY
464
C DETERMINE THE APPROPRIATE STEPSIZE FOR
468
R=(2.0E0*EST+0.0001E0)**(-1.0E0/TEMP2)
469
IF(R .LT. 2.0E0) GO TO 555
472
555 IF(R .GT. 1.0E0) GO TO 560
473
R = MAX(0.5E0,MIN(0.9E0,R))
478
C UPDATE DIFFERENCES FOR NEXT STEP
480
IF(KOLD.EQ.IWM(LMXORD))GO TO 585
485
590 PHI(I,KP1)=PHI(I,KP1)+E(I)
489
595 PHI(I,J)=PHI(I,J)+PHI(I,J+1)
496
C-----------------------------------------------------------------------
498
C THE STEP IS UNSUCCESSFUL. RESTORE X,PSI,PHI
499
C DETERMINE APPROPRIATE STEPSIZE FOR
500
C CONTINUING THE INTEGRATION, OR EXIT WITH
501
C AN ERROR FLAG IF THERE HAVE BEEN MANY
503
C-----------------------------------------------------------------------
508
IF(KP1.LT.NSP1)GO TO 630
512
610 PHI(I,J)=TEMP1*PHI(I,J)
516
640 PSI(I-1)=PSI(I)-H
519
C TEST WHETHER FAILURE IS DUE TO CORRECTOR ITERATION
522
IWM(LCTF)=IWM(LCTF)+1
525
C THE NEWTON ITERATION FAILED TO CONVERGE WITH
526
C A CURRENT ITERATION MATRIX. DETERMINE THE CAUSE
527
C OF THE FAILURE AND TAKE APPROPRIATE ACTION.
528
IF(IER.EQ.0)GO TO 650
530
C THE ITERATION MATRIX IS SINGULAR. REDUCE
531
C THE STEPSIZE BY A FACTOR OF 4. IF
532
C THIS HAPPENS THREE TIMES IN A ROW ON
533
C THE SAME STEP, RETURN WITH AN ERROR FLAG
537
IF (NSF .LT. 3 .AND. ABS(H) .GE. HMIN) GO TO 690
542
C THE NEWTON ITERATION FAILED TO CONVERGE FOR A REASON
543
C OTHER THAN A SINGULAR ITERATION MATRIX. IF IRES = -2, THEN
544
C RETURN. OTHERWISE, REDUCE THE STEPSIZE AND TRY AGAIN, UNLESS
545
C TOO MANY FAILURES HAVE OCCURRED.
547
IF (IRES .GT. -2) GO TO 655
553
IF (NCF .LT. 10 .AND. ABS(H) .GE. HMIN) GO TO 690
555
IF (IRES .LT. 0) IDID = -10
556
IF (NEF .GE. 3) IDID = -9
560
C THE NEWTON SCHEME CONVERGED, AND THE CAUSE
561
C OF THE FAILURE WAS THE ERROR ESTIMATE
562
C EXCEEDING THE TOLERANCE.
564
IWM(LETF)=IWM(LETF)+1
565
IF (NEF .GT. 1) GO TO 665
567
C ON FIRST ERROR TEST FAILURE, KEEP CURRENT ORDER OR LOWER
568
C ORDER BY ONE. COMPUTE NEW STEPSIZE BASED ON DIFFERENCES
572
R = 0.90E0*(2.0E0*EST+0.0001E0)**(-1.0E0/TEMP2)
573
R = MAX(0.25E0,MIN(0.9E0,R))
575
IF (ABS(H) .GE. HMIN) GO TO 690
579
C ON SECOND ERROR TEST FAILURE, USE THE CURRENT ORDER OR
580
C DECREASE ORDER BY ONE. REDUCE THE STEPSIZE BY A FACTOR OF
582
665 IF (NEF .GT. 2) GO TO 670
585
IF (ABS(H) .GE. HMIN) GO TO 690
589
C ON THIRD AND SUBSEQUENT ERROR TEST FAILURES, SET THE ORDER TO
590
C ONE AND REDUCE THE STEPSIZE BY A FACTOR OF FOUR.
593
IF (ABS(H) .GE. HMIN) GO TO 690
600
C FOR ALL CRASHES, RESTORE Y TO ITS LAST VALUE,
601
C INTERPOLATE TO FIND YPRIME AT LAST X, AND RETURN
603
CALL SDATRP(X,X,Y,YPRIME,NEQ,K,PHI,PSI)
607
C GO BACK AND TRY THIS STEP AGAIN
610
C------END OF SUBROUTINE SDASTP------