Annotation of rpl/lapack/lapack/dlasq5.f, revision 1.1
1.1 ! bertrand 1: SUBROUTINE DLASQ5( I0, N0, Z, PP, TAU, DMIN, DMIN1, DMIN2, DN,
! 2: $ DNM1, DNM2, IEEE )
! 3: *
! 4: * -- LAPACK routine (version 3.2) --
! 5: *
! 6: * -- Contributed by Osni Marques of the Lawrence Berkeley National --
! 7: * -- Laboratory and Beresford Parlett of the Univ. of California at --
! 8: * -- Berkeley --
! 9: * -- November 2008 --
! 10: *
! 11: * -- LAPACK is a software package provided by Univ. of Tennessee, --
! 12: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
! 13: *
! 14: * .. Scalar Arguments ..
! 15: LOGICAL IEEE
! 16: INTEGER I0, N0, PP
! 17: DOUBLE PRECISION DMIN, DMIN1, DMIN2, DN, DNM1, DNM2, TAU
! 18: * ..
! 19: * .. Array Arguments ..
! 20: DOUBLE PRECISION Z( * )
! 21: * ..
! 22: *
! 23: * Purpose
! 24: * =======
! 25: *
! 26: * DLASQ5 computes one dqds transform in ping-pong form, one
! 27: * version for IEEE machines another for non IEEE machines.
! 28: *
! 29: * Arguments
! 30: * =========
! 31: *
! 32: * I0 (input) INTEGER
! 33: * First index.
! 34: *
! 35: * N0 (input) INTEGER
! 36: * Last index.
! 37: *
! 38: * Z (input) DOUBLE PRECISION array, dimension ( 4*N )
! 39: * Z holds the qd array. EMIN is stored in Z(4*N0) to avoid
! 40: * an extra argument.
! 41: *
! 42: * PP (input) INTEGER
! 43: * PP=0 for ping, PP=1 for pong.
! 44: *
! 45: * TAU (input) DOUBLE PRECISION
! 46: * This is the shift.
! 47: *
! 48: * DMIN (output) DOUBLE PRECISION
! 49: * Minimum value of d.
! 50: *
! 51: * DMIN1 (output) DOUBLE PRECISION
! 52: * Minimum value of d, excluding D( N0 ).
! 53: *
! 54: * DMIN2 (output) DOUBLE PRECISION
! 55: * Minimum value of d, excluding D( N0 ) and D( N0-1 ).
! 56: *
! 57: * DN (output) DOUBLE PRECISION
! 58: * d(N0), the last value of d.
! 59: *
! 60: * DNM1 (output) DOUBLE PRECISION
! 61: * d(N0-1).
! 62: *
! 63: * DNM2 (output) DOUBLE PRECISION
! 64: * d(N0-2).
! 65: *
! 66: * IEEE (input) LOGICAL
! 67: * Flag for IEEE or non IEEE arithmetic.
! 68: *
! 69: * =====================================================================
! 70: *
! 71: * .. Parameter ..
! 72: DOUBLE PRECISION ZERO
! 73: PARAMETER ( ZERO = 0.0D0 )
! 74: * ..
! 75: * .. Local Scalars ..
! 76: INTEGER J4, J4P2
! 77: DOUBLE PRECISION D, EMIN, TEMP
! 78: * ..
! 79: * .. Intrinsic Functions ..
! 80: INTRINSIC MIN
! 81: * ..
! 82: * .. Executable Statements ..
! 83: *
! 84: IF( ( N0-I0-1 ).LE.0 )
! 85: $ RETURN
! 86: *
! 87: J4 = 4*I0 + PP - 3
! 88: EMIN = Z( J4+4 )
! 89: D = Z( J4 ) - TAU
! 90: DMIN = D
! 91: DMIN1 = -Z( J4 )
! 92: *
! 93: IF( IEEE ) THEN
! 94: *
! 95: * Code for IEEE arithmetic.
! 96: *
! 97: IF( PP.EQ.0 ) THEN
! 98: DO 10 J4 = 4*I0, 4*( N0-3 ), 4
! 99: Z( J4-2 ) = D + Z( J4-1 )
! 100: TEMP = Z( J4+1 ) / Z( J4-2 )
! 101: D = D*TEMP - TAU
! 102: DMIN = MIN( DMIN, D )
! 103: Z( J4 ) = Z( J4-1 )*TEMP
! 104: EMIN = MIN( Z( J4 ), EMIN )
! 105: 10 CONTINUE
! 106: ELSE
! 107: DO 20 J4 = 4*I0, 4*( N0-3 ), 4
! 108: Z( J4-3 ) = D + Z( J4 )
! 109: TEMP = Z( J4+2 ) / Z( J4-3 )
! 110: D = D*TEMP - TAU
! 111: DMIN = MIN( DMIN, D )
! 112: Z( J4-1 ) = Z( J4 )*TEMP
! 113: EMIN = MIN( Z( J4-1 ), EMIN )
! 114: 20 CONTINUE
! 115: END IF
! 116: *
! 117: * Unroll last two steps.
! 118: *
! 119: DNM2 = D
! 120: DMIN2 = DMIN
! 121: J4 = 4*( N0-2 ) - PP
! 122: J4P2 = J4 + 2*PP - 1
! 123: Z( J4-2 ) = DNM2 + Z( J4P2 )
! 124: Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
! 125: DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
! 126: DMIN = MIN( DMIN, DNM1 )
! 127: *
! 128: DMIN1 = DMIN
! 129: J4 = J4 + 4
! 130: J4P2 = J4 + 2*PP - 1
! 131: Z( J4-2 ) = DNM1 + Z( J4P2 )
! 132: Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
! 133: DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
! 134: DMIN = MIN( DMIN, DN )
! 135: *
! 136: ELSE
! 137: *
! 138: * Code for non IEEE arithmetic.
! 139: *
! 140: IF( PP.EQ.0 ) THEN
! 141: DO 30 J4 = 4*I0, 4*( N0-3 ), 4
! 142: Z( J4-2 ) = D + Z( J4-1 )
! 143: IF( D.LT.ZERO ) THEN
! 144: RETURN
! 145: ELSE
! 146: Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) )
! 147: D = Z( J4+1 )*( D / Z( J4-2 ) ) - TAU
! 148: END IF
! 149: DMIN = MIN( DMIN, D )
! 150: EMIN = MIN( EMIN, Z( J4 ) )
! 151: 30 CONTINUE
! 152: ELSE
! 153: DO 40 J4 = 4*I0, 4*( N0-3 ), 4
! 154: Z( J4-3 ) = D + Z( J4 )
! 155: IF( D.LT.ZERO ) THEN
! 156: RETURN
! 157: ELSE
! 158: Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) )
! 159: D = Z( J4+2 )*( D / Z( J4-3 ) ) - TAU
! 160: END IF
! 161: DMIN = MIN( DMIN, D )
! 162: EMIN = MIN( EMIN, Z( J4-1 ) )
! 163: 40 CONTINUE
! 164: END IF
! 165: *
! 166: * Unroll last two steps.
! 167: *
! 168: DNM2 = D
! 169: DMIN2 = DMIN
! 170: J4 = 4*( N0-2 ) - PP
! 171: J4P2 = J4 + 2*PP - 1
! 172: Z( J4-2 ) = DNM2 + Z( J4P2 )
! 173: IF( DNM2.LT.ZERO ) THEN
! 174: RETURN
! 175: ELSE
! 176: Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
! 177: DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
! 178: END IF
! 179: DMIN = MIN( DMIN, DNM1 )
! 180: *
! 181: DMIN1 = DMIN
! 182: J4 = J4 + 4
! 183: J4P2 = J4 + 2*PP - 1
! 184: Z( J4-2 ) = DNM1 + Z( J4P2 )
! 185: IF( DNM1.LT.ZERO ) THEN
! 186: RETURN
! 187: ELSE
! 188: Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
! 189: DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
! 190: END IF
! 191: DMIN = MIN( DMIN, DN )
! 192: *
! 193: END IF
! 194: *
! 195: Z( J4+2 ) = DN
! 196: Z( 4*N0-PP ) = EMIN
! 197: RETURN
! 198: *
! 199: * End of DLASQ5
! 200: *
! 201: END
CVSweb interface <joel.bertrand@systella.fr>