📄 simulation.f
字号:
TEMP1 =1.D0/BETA(I) STEP 355
IP1 = I+1 STEP 356
DO 305 L = 1,NEQN STEP 357
305 PHI(L,I) = TEMP1*(PHI(L,I) - PHI(L,IP1)) STEP 358
310 CONTINUE STEP 359
IF(K .LT. 2) GO TO 320 STEP 360
DO 315 I = 2,K STEP 361
315 PSI(I-1) = PSI(I) - H STEP 362
C STEP 363
C ON THIRD FAILURE, SET ORDER TO ONE. THEREAFTER, USE OPTIMAL STEP STEP 364
C SIZE STEP 365
C STEP 366
320 IFAIL = IFAIL + 1 STEP 367
TEMP2 = 0.5D0 STEP 368
IF(IFAIL - 3) 335,330,325 STEP 369
325 IF(P5EPS .LT. .25D0*ERK)TEMP2 =DSQRT(P5EPS/ERK) STEP 370
330 KNEW = 1 STEP 371
335 H = TEMP2*H STEP 372
K = KNEW STEP 373
IF(DABS(H) .GE. FOURU*DABS(X)) GO TO 340 STEP 374
CRASH = .TRUE. STEP 375
H =DSIGN(FOURU*DABS(X),H) STEP 376
EPS = EPS + EPS STEP 377
RETURN STEP 378
340 GO TO 100 STEP 379
C *** END BLOCK 3 *** STEP 380
C STEP 381
C *** BEGIN BLOCK 4 *** STEP 382
C THE STEP IS SUCCESSFUL. CORRECT THE PREDICTED SOLUTION, EVALUATE STEP 383
C THE DERIVATIVES USING THE CORRECTED SOLUTION AND UPDATE THE STEP 384
C DIFFERENCES. DETERMINE BEST ORDER AND STEP SIZE FOR NEXT STEP. STEP 385
C *** STEP 386
400 KOLD = K STEP 387
HOLD = H STEP 388
C STEP 389
C CORRECT AND EVALUATE STEP 390
C STEP 391
TEMP1 = H*G(KP1) STEP 392
IF(NORND) GO TO 410 STEP 393
DO 405 L = 1,NEQN STEP 394
RHO = TEMP1*(YP(L) - PHI(L,1)) - PHI(L,16) STEP 395
Y(L) = P(L) + RHO STEP 396
405 PHI(L,15) = (Y(L) - P(L)) - RHO STEP 397
GO TO 420 STEP 398
410 DO 415 L = 1,NEQN STEP 399
415 Y(L) = P(L) + TEMP1*(YP(L) - PHI(L,1)) STEP 400
420 CONTINUE
IPRDCT=0
CALL F(X,Y,YP) STEP 401
C STEP 402
C UPDATE DIFFERENCES FOR NEXT STEP STEP 403
C STEP 404
DO 425 L = 1,NEQN STEP 405
PHI(L,KP1) = YP(L) - PHI(L,1) STEP 406
425 PHI(L,KP2) = PHI(L,KP1) - PHI(L,KP2) STEP 407
DO 435 I = 1,K STEP 408
DO 430 L = 1,NEQN STEP 409
430 PHI(L,I) = PHI(L,I) + PHI(L,KP1) STEP 410
435 CONTINUE STEP 411
C STEP 412
C ESTIMATE ERROR AT ORDER K+1 UNLESS: STEP 413
C IN FIRST PHASE WHEN ALWAYS RAISE ORDER, STEP 414
C ALREADY DECIDED TO LOWER ORDER, STEP 415
C STEP SIZE NOT CONSTANT SO ESTIMATE UNRELIABLE STEP 416
C STEP 417
ERKP1 = 0.0D0 STEP 418
IF(KNEW .EQ. KM1 .OR. K .EQ. 12) PHASE1 = .FALSE. STEP 419
IF(PHASE1) GO TO 450 STEP 420
IF(KNEW .EQ. KM1) GO TO 455 STEP 421
IF(KP1 .GT. NS) GO TO 460 STEP 422
DO 440 L = 1,NEQN STEP 423
440 ERKP1 = ERKP1 + (PHI(L,KP2)/WT(L))**2 STEP 424
ERKP1 = ABSH*GSTR(KP1)*DSQRT(ERKP1) STEP 425
C STEP 426
C USING ESTIMATED ERROR AT ORDER K+1, DETERMINE APPROPRIATE ORDER STEP 427
C FOR NEXT STEP STEP 428
C STEP 429
IF(K .GT. 1) GO TO 445 STEP 430
IF(ERKP1 .GE. .5D0*ERK)GO TO 460 STEP 431
GO TO 450 STEP 432
445 IF(ERKM1 .LE. DMIN1(ERK,ERKP1)) GO TO 455 STEP 433
IF(ERKP1 .GE. ERK .OR. K .EQ. 12) GO TO 460 STEP 434
C STEP 435
C HERE ERKP1 .LT. ERK .LT. AMAX1(ERKM1,ERKM2) ELSE ORDER WOULD HAVE STEP 436
C BEEN LOWERED IN BLOCK 2. THUS ORDER IS TO BE RAISED STEP 437
C STEP 438
C RAISE ORDER STEP 439
C STEP 440
450 K = KP1 STEP 441
ERK = ERKP1 STEP 442
GO TO 460 STEP 443
C STEP 444
C LOWER ORDER STEP 445
C STEP 446
455 K = KM1 STEP 447
ERK = ERKM1 STEP 448
C STEP 449
C WITH NEW ORDER DETERMINE APPROPRIATE STEP SIZE FOR NEXT STEP STEP 450
C STEP 451
460 HNEW = H + H STEP 452
IF(PHASE1) GO TO 465 STEP 453
IF(P5EPS .GE. ERK*TWO(K+1)) GO TO 465 STEP 454
HNEW = H STEP 455
IF(P5EPS .GE. ERK) GO TO 465 STEP 456
TEMP2 = K+1 STEP 457
R = (P5EPS/ERK)**(1D0/TEMP2) STEP 458
HNEW=ABSH*DMAX1(0.5D0,DMIN1(0.9D0,R)) STEP 459
HNEW =DSIGN(DMAX1(HNEW,FOURU*DABS(X)),H) STEP 460
465 H = HNEW STEP 461
RETURN STEP 462
C *** END BLOCK 4 *** STEP 463
END STEP 464
SUBROUTINE INTRP2(X,Y,XOUT,YOUT,YPOUT,NEQN,KOLD,PHI,PSI) INTR 1
C INTR 2
C THE METHODS IN SUBROUTINE STEP APPROXIMATE THE SOLUTION NEAR X INTR 3
C BY A POLYNOMIAL. SUBROUTINE INTRP APPROXIMATES THE SOLUTION AT INTR 4
C XOUT BY EVALUATING THE POLYNOMIAL THERE. INFORMATION DEFINING THISINTR 5
C POLYNOMIAL IS PASSED FROM STEP SO INTRP CANNOT BE USED ALONE. INTR 6
C INTR 7
C THIS CODE IS COMPLETELY EXPLAINED AND DOCUMENTED IN THE TEXT, INTR 8
C COMPUTER SOLUTION OF ORDINARY DIFFERENTIAL EQUATIONS: THE INITIAL INTR 9
C VALUE PROBLEM BY L. F. SHAMPINE AND M. K. GORDON. INTR 10
C INTR 11
C INPUT TO INTRP -- INTR 12
C INTR 13
C THE USER PROVIDES STORAGE IN THE CALLING PROGRAM FOR THE ARRAYS IN INTR 14
C THE CALL LIST INTR 15
IMPLICIT DOUBLE PRECISION(A-H,O-Z)
DIMENSION Y(NEQN),YOUT(NEQN),YPOUT(NEQN),PHI(NEQN,16),PSI(12) INTR 16
C AND DEFINES INTR 17
C XOUT -- POINT AT WHICH SOLUTION IS DESIRED. INTR 18
C THE REMAINING PARAMETERS ARE DEFINED IN STEP AND PASSED TO INTRP INTR 19
C FROM THAT SUBROUTINE INTR 20
C INTR 21
C OUTPUT FROM INTRP -- INTR 22
C INTR 23
C YOUT(*) -- SOLUTION AT XOUT INTR 24
C YPOUT(*) -- DERIVATIVE OF SOLUTION AT XOUT INTR 25
C THE REMAINING PARAMETERS ARE RETURNED UNALTERED FROM THEIR INPUT INTR 26
C VALUES. INTEGRATION WITH STEP MAY BE CONTINUED. INTR 27
C INTR 28
DIMENSION G(13),W(13),RHO(13) INTR 29
SAVE
DATA G(1)/1D0/,RHO(1)/1D0/ INTR 30
C INTR 31
HI = XOUT - X INTR 32
KI = KOLD + 1 INTR 33
KIP1 = KI + 1 INTR 34
C INTR 35
C INITIALIZE W(*) FOR COMPUTING G(*) INTR 36
C INTR 37
DO 5 I = 1,KI INTR 38
TEMP1 = I INTR 39
5 W(I) =1.D0/TEMP1 INTR 40
TERM = 0.0D0 INTR 41
C INTR 42
C COMPUTE G(*) INTR 43
C INTR 44
DO 15 J = 2,KI INTR 45
JM1 = J - 1 INTR 46
PSIJM1 = PSI(JM1) INTR 47
GAMMA = (HI + TERM)/PSIJM1 INTR 48
ETA = HI/PSIJM1 INTR 49
LIMIT1 = KIP1 - J INTR 50
DO 10 I = 1,LIMIT1 INTR 51
10 W(I) = GAMMA*W(I) - ETA*W(I+1) INTR 52
G(J) = W(1) INTR 53
RHO(J) = GAMMA*RHO(JM1) INTR 54
15 TERM = PSIJM1 INTR 55
C INTR 56
C INTERPOLATE INTR 57
C INTR 58
DO 20 L = 1,NEQN INTR 59
YPOUT(L) = 0.0D0 INTR 60
20 YOUT(L) = 0.0D0 INTR 61
DO 30 J = 1,KI INTR 62
I = KIP1 - J INTR 63
TEMP2 = G(I)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -