123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- *DECK COMPB
- SUBROUTINE COMPB (N, IERROR, AN, BN, CN, B, AH, BH)
- C***BEGIN PROLOGUE COMPB
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BLKTRI
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (COMPB-S, CCMPB-C)
- C***AUTHOR (UNKNOWN)
- C***DESCRIPTION
- C
- C COMPB computes the roots of the B polynomials using subroutine
- C TEVLS which is a modification the EISPACK program TQLRAT.
- C IERROR is set to 4 if either TEVLS fails or if A(J+1)*C(J) is
- C less than zero for some J. AH,BH are temporary work arrays.
- C
- C***SEE ALSO BLKTRI
- C***ROUTINES CALLED INDXB, PPADD, R1MACH, TEVLS
- C***COMMON BLOCKS CBLKT
- C***REVISION HISTORY (YYMMDD)
- C 801001 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE COMPB
- C
- DIMENSION AN(*) ,BN(*) ,CN(*) ,B(*) ,
- 1 AH(*) ,BH(*)
- COMMON /CBLKT/ NPP ,K ,EPS ,CNV ,
- 1 NM ,NCMPLX ,IK
- C***FIRST EXECUTABLE STATEMENT COMPB
- EPS = R1MACH(4)
- BNORM = ABS(BN(1))
- DO 102 J=2,NM
- BNORM = MAX(BNORM,ABS(BN(J)))
- ARG = AN(J)*CN(J-1)
- IF (ARG) 119,101,101
- 101 B(J) = SIGN(SQRT(ARG),AN(J))
- 102 CONTINUE
- CNV = EPS*BNORM
- IF = 2**K
- KDO = K-1
- DO 108 L=1,KDO
- IR = L-1
- I2 = 2**IR
- I4 = I2+I2
- IPL = I4-1
- IFD = IF-I4
- DO 107 I=I4,IFD,I4
- CALL INDXB (I,L,IB,NB)
- IF (NB) 108,108,103
- 103 JS = I-IPL
- JF = JS+NB-1
- LS = 0
- DO 104 J=JS,JF
- LS = LS+1
- BH(LS) = BN(J)
- AH(LS) = B(J)
- 104 CONTINUE
- CALL TEVLS (NB,BH,AH,IERROR)
- IF (IERROR) 118,105,118
- 105 LH = IB-1
- DO 106 J=1,NB
- LH = LH+1
- B(LH) = -BH(J)
- 106 CONTINUE
- 107 CONTINUE
- 108 CONTINUE
- DO 109 J=1,NM
- B(J) = -BN(J)
- 109 CONTINUE
- IF (NPP) 117,110,117
- 110 NMP = NM+1
- NB = NM+NMP
- DO 112 J=1,NB
- L1 = MOD(J-1,NMP)+1
- L2 = MOD(J+NM-1,NMP)+1
- ARG = AN(L1)*CN(L2)
- IF (ARG) 119,111,111
- 111 BH(J) = SIGN(SQRT(ARG),-AN(L1))
- AH(J) = -BN(L1)
- 112 CONTINUE
- CALL TEVLS (NB,AH,BH,IERROR)
- IF (IERROR) 118,113,118
- 113 CALL INDXB (IF,K-1,J2,LH)
- CALL INDXB (IF/2,K-1,J1,LH)
- J2 = J2+1
- LH = J2
- N2M2 = J2+NM+NM-2
- 114 D1 = ABS(B(J1)-B(J2-1))
- D2 = ABS(B(J1)-B(J2))
- D3 = ABS(B(J1)-B(J2+1))
- IF ((D2 .LT. D1) .AND. (D2 .LT. D3)) GO TO 115
- B(LH) = B(J2)
- J2 = J2+1
- LH = LH+1
- IF (J2-N2M2) 114,114,116
- 115 J2 = J2+1
- J1 = J1+1
- IF (J2-N2M2) 114,114,116
- 116 B(LH) = B(N2M2+1)
- CALL INDXB (IF,K-1,J1,J2)
- J2 = J1+NMP+NMP
- CALL PPADD (NM+1,IERROR,AN,CN,B(J1),B(J1),B(J2))
- 117 RETURN
- 118 IERROR = 4
- RETURN
- 119 IERROR = 5
- RETURN
- END
|