SUBROUTINE D3RPLY(L2, NZ, P, QP, K, QK, SVK) C COMPUTES UP TO L2 FIXED SHIFT K-POLYNOMIALS, C TESTING FOR CONVERGENCE IN THE LINEAR OR QUADRATIC C CASE. INITIATES ONE OF THE VARIABLE SHIFT C ITERATIONS AND RETURNS WITH THE NUMBER OF ZEROS C FOUND. C L2 - LIMIT OF FIXED SHIFT STEPS C NZ - NUMBER OF ZEROS FOUND COMMON /P77PLY/ SR, SI, U, 1 V, A, B, C, D, A1, A2, A3, A6, A7, E, F, G, 2 H, SZR, SZI, LZR, LZI, ETA, ARE, MRE, N, NN C INTEGER N, NN INTEGER L2, NZ, TYPE, I, J, IFLAG C DOUBLE PRECISION ETA, ARE, MRE DOUBLE PRECISION BETAS, BETAV, OSS, OVV, SS, VV, TS, TV, 1 OTS, OTV, TVV, TSS DOUBLE PRECISION P(1), QP(1), K(1), 1 QK(1), SVK(1), SR, SI, U, V, A, B, C, D, 2 A1, A2, A3, A6, A7, E, F, G, H, SZR, SZI, 3 LZR, LZI DOUBLE PRECISION SVU, SVV, UI, VI, S LOGICAL VPASS, SPASS, VTRY, STRY NZ = 0 BETAV = .25 BETAS = .25 OSS = SR OVV = V C EVALUATE POLYNOMIAL BY SYNTHETIC DIVISION CALL D8RPLY(NN, U, V, P, QP, A, B) CALL D2RPLY(TYPE, K, QK) DO 80 J=1,L2 C CALCULATE NEXT K POLYNOMIAL AND ESTIMATE V CALL D5RPLY(TYPE, P, QP, K, QK) CALL D2RPLY(TYPE, K, QK) CALL D4RPLY(TYPE, UI, VI, P, K) VV = VI C ESTIMATE S SS = 0. IF (K(N).NE.0.D0) SS = -P(NN)/K(N) TV = 1. TS = 1. IF (J.EQ.1 .OR. TYPE.EQ.3) GO TO 70 C COMPUTE RELATIVE MEASURES OF CONVERGENCE OF S AND V C SEQUENCES IF (VV.NE.0.) TV = ABS((VV-OVV)/VV) IF (SS.NE.0.) TS = ABS((SS-OSS)/SS) C IF DECREASING, MULTIPLY TWO MOST RECENT C CONVERGENCE MEASURES TVV = 1. IF (TV.LT.OTV) TVV = TV*OTV TSS = 1. IF (TS.LT.OTS) TSS = TS*OTS C COMPARE WITH CONVERGENCE CRITERIA VPASS = TVV.LT.BETAV SPASS = TSS.LT.BETAS IF (.NOT.(SPASS .OR. VPASS)) GO TO 70 C AT LEAST ONE SEQUENCE HAS PASSED THE CONVERGENCE C TEST. STORE VARIABLES BEFORE ITERATING SVU = U SVV = V DO 10 I=1,N SVK(I) = K(I) 10 CONTINUE S = SS C CHOOSE ITERATION ACCORDING TO THE FASTEST C CONVERGING SEQUENCE VTRY = .FALSE. STRY = .FALSE. IF (SPASS .AND. ((.NOT.VPASS) .OR. 1 TSS.LT.TVV)) GO TO 40 20 CALL D7RPLY(UI, VI, NZ, P, QP, K, QK, SVK) IF (NZ.GT.0) RETURN C QUADRATIC ITERATION HAS FAILED. FLAG THAT IT HAS C BEEN TRIED AND DECREASE THE CONVERGENCE CRITERION. VTRY = .TRUE. BETAV = BETAV*.25 C TRY LINEAR ITERATION IF IT HAS NOT BEEN TRIED AND C THE S SEQUENCE IS CONVERGING IF (STRY .OR. (.NOT.SPASS)) GO TO 50 DO 30 I=1,N K(I) = SVK(I) 30 CONTINUE 40 CALL D9RPLY(S, NZ, IFLAG, P, QP, K, QK) IF (NZ.GT.0) RETURN C LINEAR ITERATION HAS FAILED. FLAG THAT IT HAS BEEN C TRIED AND DECREASE THE CONVERGENCE CRITERION STRY = .TRUE. BETAS = BETAS*.25 IF (IFLAG.EQ.0) GO TO 50 C IF LINEAR ITERATION SIGNALS AN ALMOST DOUBLE REAL C ZERO ATTEMPT QUADRATIC INTERATION UI = -(S+S) VI = S*S GO TO 20 C RESTORE VARIABLES 50 U = SVU V = SVV DO 60 I=1,N K(I) = SVK(I) 60 CONTINUE C TRY QUADRATIC ITERATION IF IT HAS NOT BEEN TRIED C AND THE V SEQUENCE IS CONVERGING IF (VPASS .AND. (.NOT.VTRY)) GO TO 20 C RECOMPUTE QP AND SCALAR VALUES TO CONTINUE THE C SECOND STAGE CALL D8RPLY(NN, U, V, P, QP, A, B) CALL D2RPLY(TYPE, K, QK) 70 OVV = VV OSS = SS OTV = TV OTS = TS 80 CONTINUE RETURN END .