00001
00002
00003
00004
00005 SUBROUTINE DDSTP(X,Y,YPRIME,NEQ,RES,JAC,PSOL,H,WT,VT,
00006 * JSTART,IDID,RPAR,IPAR,PHI,SAVR,DELTA,E,WM,IWM,
00007 * ALPHA,BETA,GAMMA,PSI,SIGMA,CJ,CJOLD,HOLD,S,HMIN,UROUND,
00008 * EPLI,SQRTN,RSQRTN,EPCON,IPHASE,JCALC,JFLG,K,KOLD,NS,NONNEG,
00009 * NTYPE,NLS)
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077 IMPLICIT DOUBLE PRECISION(A-H,O-Z)
00078 DIMENSION Y(*),YPRIME(*),WT(*),VT(*)
00079 DIMENSION PHI(NEQ,*),SAVR(*),DELTA(*),E(*)
00080 DIMENSION WM(*),IWM(*)
00081 DIMENSION PSI(*),ALPHA(*),BETA(*),GAMMA(*),SIGMA(*)
00082 DIMENSION RPAR(*),IPAR(*)
00083 EXTERNAL RES, JAC, PSOL, NLS
00084
00085 PARAMETER (LMXORD=3)
00086 PARAMETER (LNST=11, LETF=14, LCFN=15)
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 XOLD=X
00099 NCF=0
00100 NEF=0
00101 IF(JSTART .NE. 0) GO TO 120
00102
00103
00104
00105
00106 K=1
00107 KOLD=0
00108 HOLD=0.0D0
00109 PSI(1)=H
00110 CJ = 1.D0/H
00111 IPHASE = 0
00112 NS=0
00113 120 CONTINUE
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124 200 CONTINUE
00125 KP1=K+1
00126 KP2=K+2
00127 KM1=K-1
00128 IF(H.NE.HOLD.OR.K .NE. KOLD) NS = 0
00129 NS=MIN0(NS+1,KOLD+2)
00130 NSP1=NS+1
00131 IF(KP1 .LT. NS)GO TO 230
00132
00133 BETA(1)=1.0D0
00134 ALPHA(1)=1.0D0
00135 TEMP1=H
00136 GAMMA(1)=0.0D0
00137 SIGMA(1)=1.0D0
00138 DO 210 I=2,KP1
00139 TEMP2=PSI(I-1)
00140 PSI(I-1)=TEMP1
00141 BETA(I)=BETA(I-1)*PSI(I-1)/TEMP2
00142 TEMP1=TEMP2+H
00143 ALPHA(I)=H/TEMP1
00144 SIGMA(I)=(I-1)*SIGMA(I-1)*ALPHA(I)
00145 GAMMA(I)=GAMMA(I-1)+ALPHA(I-1)/H
00146 210 CONTINUE
00147 PSI(KP1)=TEMP1
00148 230 CONTINUE
00149
00150
00151
00152 ALPHAS = 0.0D0
00153 ALPHA0 = 0.0D0
00154 DO 240 I = 1,K
00155 ALPHAS = ALPHAS - 1.0D0/I
00156 ALPHA0 = ALPHA0 - ALPHA(I)
00157 240 CONTINUE
00158
00159
00160
00161 CJLAST = CJ
00162 CJ = -ALPHAS/H
00163
00164
00165
00166 CK = ABS(ALPHA(KP1) + ALPHAS - ALPHA0)
00167 CK = MAX(CK,ALPHA(KP1))
00168
00169
00170
00171 IF(KP1 .LT. NSP1) GO TO 280
00172 DO 270 J=NSP1,KP1
00173 DO 260 I=1,NEQ
00174 260 PHI(I,J)=BETA(J)*PHI(I,J)
00175 270 CONTINUE
00176 280 CONTINUE
00177
00178
00179
00180 X=X+H
00181
00182
00183
00184 IDID = 1
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196 CALL NLS(X,Y,YPRIME,NEQ,
00197 * RES,JAC,PSOL,H,WT,JSTART,IDID,RPAR,IPAR,PHI,GAMMA,
00198 * SAVR,DELTA,E,WM,IWM,CJ,CJOLD,CJLAST,S,
00199 * UROUND,EPLI,SQRTN,RSQRTN,EPCON,JCALC,JFLG,KP1,
00200 * NONNEG,NTYPE,IERNLS)
00201
00202 IF(IERNLS .NE. 0)GO TO 600
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 ENORM = DDWNRM(NEQ,E,VT,RPAR,IPAR)
00219 ERK = SIGMA(K+1)*ENORM
00220 TERK = (K+1)*ERK
00221 EST = ERK
00222 KNEW=K
00223 IF(K .EQ. 1)GO TO 430
00224 DO 405 I = 1,NEQ
00225 405 DELTA(I) = PHI(I,KP1) + E(I)
00226 ERKM1=SIGMA(K)*DDWNRM(NEQ,DELTA,VT,RPAR,IPAR)
00227 TERKM1 = K*ERKM1
00228 IF(K .GT. 2)GO TO 410
00229 IF(TERKM1 .LE. 0.5*TERK)GO TO 420
00230 GO TO 430
00231 410 CONTINUE
00232 DO 415 I = 1,NEQ
00233 415 DELTA(I) = PHI(I,K) + DELTA(I)
00234 ERKM2=SIGMA(K-1)*DDWNRM(NEQ,DELTA,VT,RPAR,IPAR)
00235 TERKM2 = (K-1)*ERKM2
00236 IF(MAX(TERKM1,TERKM2).GT.TERK)GO TO 430
00237
00238
00239
00240 420 CONTINUE
00241 KNEW=K-1
00242 EST = ERKM1
00243
00244
00245
00246
00247
00248 430 CONTINUE
00249 ERR = CK * ENORM
00250 IF(ERR .GT. 1.0D0)GO TO 600
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263 IDID=1
00264 IWM(LNST)=IWM(LNST)+1
00265 KDIFF=K-KOLD
00266 KOLD=K
00267 HOLD=H
00268
00269
00270
00271
00272
00273
00274
00275
00276 IF(KNEW.EQ.KM1.OR.K.EQ.IWM(LMXORD))IPHASE=1
00277 IF(IPHASE .EQ. 0)GO TO 545
00278 IF(KNEW.EQ.KM1)GO TO 540
00279 IF(K.EQ.IWM(LMXORD)) GO TO 550
00280 IF(KP1.GE.NS.OR.KDIFF.EQ.1)GO TO 550
00281 DO 510 I=1,NEQ
00282 510 DELTA(I)=E(I)-PHI(I,KP2)
00283 ERKP1 = (1.0D0/(K+2))*DDWNRM(NEQ,DELTA,VT,RPAR,IPAR)
00284 TERKP1 = (K+2)*ERKP1
00285 IF(K.GT.1)GO TO 520
00286 IF(TERKP1.GE.0.5D0*TERK)GO TO 550
00287 GO TO 530
00288 520 IF(TERKM1.LE.MIN(TERK,TERKP1))GO TO 540
00289 IF(TERKP1.GE.TERK.OR.K.EQ.IWM(LMXORD))GO TO 550
00290
00291
00292
00293 530 K=KP1
00294 EST = ERKP1
00295 GO TO 550
00296
00297
00298
00299 540 K=KM1
00300 EST = ERKM1
00301 GO TO 550
00302
00303
00304
00305
00306 545 K = KP1
00307 HNEW = H*2.0D0
00308 H = HNEW
00309 GO TO 575
00310
00311
00312
00313
00314
00315 550 HNEW=H
00316 TEMP2=K+1
00317 R=(2.0D0*EST+0.0001D0)**(-1.0D0/TEMP2)
00318 IF(R .LT. 2.0D0) GO TO 555
00319 HNEW = 2.0D0*H
00320 GO TO 560
00321 555 IF(R .GT. 1.0D0) GO TO 560
00322 R = MAX(0.5D0,MIN(0.9D0,R))
00323 HNEW = H*R
00324 560 H=HNEW
00325
00326
00327
00328
00329 575 CONTINUE
00330 IF(KOLD.EQ.IWM(LMXORD))GO TO 585
00331 DO 580 I=1,NEQ
00332 580 PHI(I,KP2)=E(I)
00333 585 CONTINUE
00334 DO 590 I=1,NEQ
00335 590 PHI(I,KP1)=PHI(I,KP1)+E(I)
00336 DO 595 J1=2,KP1
00337 J=KP1-J1+1
00338 DO 595 I=1,NEQ
00339 595 PHI(I,J)=PHI(I,J)+PHI(I,J+1)
00340 JSTART = 1
00341 RETURN
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355 600 IPHASE = 1
00356
00357
00358
00359 X=XOLD
00360 IF(KP1.LT.NSP1)GO TO 630
00361 DO 620 J=NSP1,KP1
00362 TEMP1=1.0D0/BETA(J)
00363 DO 610 I=1,NEQ
00364 610 PHI(I,J)=TEMP1*PHI(I,J)
00365 620 CONTINUE
00366 630 CONTINUE
00367 DO 640 I=2,KP1
00368 640 PSI(I-1)=PSI(I)-H
00369
00370
00371
00372
00373
00374 IF(IERNLS .EQ. 0)GO TO 660
00375 IWM(LCFN)=IWM(LCFN)+1
00376
00377
00378
00379
00380
00381
00382
00383 IF (IERNLS .LT. 0) GO TO 675
00384 NCF = NCF + 1
00385 R = 0.25D0
00386 H = H*R
00387 IF (NCF .LT. 10 .AND. ABS(H) .GE. HMIN) GO TO 690
00388 IF (IDID .EQ. 1) IDID = -7
00389 IF (NEF .GE. 3) IDID = -9
00390 GO TO 675
00391
00392
00393
00394
00395
00396
00397 660 NEF=NEF+1
00398 IWM(LETF)=IWM(LETF)+1
00399 IF (NEF .GT. 1) GO TO 665
00400
00401
00402
00403
00404
00405 K = KNEW
00406 TEMP2 = K + 1
00407 R = 0.90D0*(2.0D0*EST+0.0001D0)**(-1.0D0/TEMP2)
00408 R = MAX(0.25D0,MIN(0.9D0,R))
00409 H = H*R
00410 IF (ABS(H) .GE. HMIN) GO TO 690
00411 IDID = -6
00412 GO TO 675
00413
00414
00415
00416
00417
00418 665 IF (NEF .GT. 2) GO TO 670
00419 K = KNEW
00420 R = 0.25D0
00421 H = R*H
00422 IF (ABS(H) .GE. HMIN) GO TO 690
00423 IDID = -6
00424 GO TO 675
00425
00426
00427
00428
00429 670 K = 1
00430 R = 0.25D0
00431 H = R*H
00432 IF (ABS(H) .GE. HMIN) GO TO 690
00433 IDID = -6
00434 GO TO 675
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447 675 CONTINUE
00448 CALL DDATRP(X,X,Y,YPRIME,NEQ,K,PHI,PSI)
00449 JSTART = 1
00450 IF (IDID .GE. 0) IDID = -7
00451 RETURN
00452
00453
00454
00455
00456
00457 690 IF (KOLD .EQ. 0) THEN
00458 PSI(1) = H
00459 DO 695 I = 1,NEQ
00460 695 PHI(I,2) = R*PHI(I,2)
00461 ENDIF
00462 GO TO 200
00463
00464
00465 END