LAPACK 3.3.0

dlasq6.f

Go to the documentation of this file.
00001       SUBROUTINE DLASQ6( I0, N0, Z, PP, DMIN, DMIN1, DMIN2, DN,
00002      $                   DNM1, DNM2 )
00003 *
00004 *  -- LAPACK routine (version 3.2)                                    --
00005 *
00006 *  -- Contributed by Osni Marques of the Lawrence Berkeley National   --
00007 *  -- Laboratory and Beresford Parlett of the Univ. of California at  --
00008 *  -- Berkeley                                                        --
00009 *  -- November 2008                                                   --
00010 *
00011 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
00012 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
00013 *
00014 *     .. Scalar Arguments ..
00015       INTEGER            I0, N0, PP
00016       DOUBLE PRECISION   DMIN, DMIN1, DMIN2, DN, DNM1, DNM2
00017 *     ..
00018 *     .. Array Arguments ..
00019       DOUBLE PRECISION   Z( * )
00020 *     ..
00021 *
00022 *  Purpose
00023 *  =======
00024 *
00025 *  DLASQ6 computes one dqd (shift equal to zero) transform in
00026 *  ping-pong form, with protection against underflow and overflow.
00027 *
00028 *  Arguments
00029 *  =========
00030 *
00031 *  I0    (input) INTEGER
00032 *        First index.
00033 *
00034 *  N0    (input) INTEGER
00035 *        Last index.
00036 *
00037 *  Z     (input) DOUBLE PRECISION array, dimension ( 4*N )
00038 *        Z holds the qd array. EMIN is stored in Z(4*N0) to avoid
00039 *        an extra argument.
00040 *
00041 *  PP    (input) INTEGER
00042 *        PP=0 for ping, PP=1 for pong.
00043 *
00044 *  DMIN  (output) DOUBLE PRECISION
00045 *        Minimum value of d.
00046 *
00047 *  DMIN1 (output) DOUBLE PRECISION
00048 *        Minimum value of d, excluding D( N0 ).
00049 *
00050 *  DMIN2 (output) DOUBLE PRECISION
00051 *        Minimum value of d, excluding D( N0 ) and D( N0-1 ).
00052 *
00053 *  DN    (output) DOUBLE PRECISION
00054 *        d(N0), the last value of d.
00055 *
00056 *  DNM1  (output) DOUBLE PRECISION
00057 *        d(N0-1).
00058 *
00059 *  DNM2  (output) DOUBLE PRECISION
00060 *        d(N0-2).
00061 *
00062 *  =====================================================================
00063 *
00064 *     .. Parameter ..
00065       DOUBLE PRECISION   ZERO
00066       PARAMETER          ( ZERO = 0.0D0 )
00067 *     ..
00068 *     .. Local Scalars ..
00069       INTEGER            J4, J4P2
00070       DOUBLE PRECISION   D, EMIN, SAFMIN, TEMP
00071 *     ..
00072 *     .. External Function ..
00073       DOUBLE PRECISION   DLAMCH
00074       EXTERNAL           DLAMCH
00075 *     ..
00076 *     .. Intrinsic Functions ..
00077       INTRINSIC          MIN
00078 *     ..
00079 *     .. Executable Statements ..
00080 *
00081       IF( ( N0-I0-1 ).LE.0 )
00082      $   RETURN
00083 *
00084       SAFMIN = DLAMCH( 'Safe minimum' )
00085       J4 = 4*I0 + PP - 3
00086       EMIN = Z( J4+4 ) 
00087       D = Z( J4 )
00088       DMIN = D
00089 *
00090       IF( PP.EQ.0 ) THEN
00091          DO 10 J4 = 4*I0, 4*( N0-3 ), 4
00092             Z( J4-2 ) = D + Z( J4-1 ) 
00093             IF( Z( J4-2 ).EQ.ZERO ) THEN
00094                Z( J4 ) = ZERO
00095                D = Z( J4+1 )
00096                DMIN = D
00097                EMIN = ZERO
00098             ELSE IF( SAFMIN*Z( J4+1 ).LT.Z( J4-2 ) .AND.
00099      $               SAFMIN*Z( J4-2 ).LT.Z( J4+1 ) ) THEN
00100                TEMP = Z( J4+1 ) / Z( J4-2 )
00101                Z( J4 ) = Z( J4-1 )*TEMP
00102                D = D*TEMP
00103             ELSE 
00104                Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) )
00105                D = Z( J4+1 )*( D / Z( J4-2 ) )
00106             END IF
00107             DMIN = MIN( DMIN, D )
00108             EMIN = MIN( EMIN, Z( J4 ) )
00109    10    CONTINUE
00110       ELSE
00111          DO 20 J4 = 4*I0, 4*( N0-3 ), 4
00112             Z( J4-3 ) = D + Z( J4 ) 
00113             IF( Z( J4-3 ).EQ.ZERO ) THEN
00114                Z( J4-1 ) = ZERO
00115                D = Z( J4+2 )
00116                DMIN = D
00117                EMIN = ZERO
00118             ELSE IF( SAFMIN*Z( J4+2 ).LT.Z( J4-3 ) .AND.
00119      $               SAFMIN*Z( J4-3 ).LT.Z( J4+2 ) ) THEN
00120                TEMP = Z( J4+2 ) / Z( J4-3 )
00121                Z( J4-1 ) = Z( J4 )*TEMP
00122                D = D*TEMP
00123             ELSE 
00124                Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) )
00125                D = Z( J4+2 )*( D / Z( J4-3 ) )
00126             END IF
00127             DMIN = MIN( DMIN, D )
00128             EMIN = MIN( EMIN, Z( J4-1 ) )
00129    20    CONTINUE
00130       END IF
00131 *
00132 *     Unroll last two steps. 
00133 *
00134       DNM2 = D
00135       DMIN2 = DMIN
00136       J4 = 4*( N0-2 ) - PP
00137       J4P2 = J4 + 2*PP - 1
00138       Z( J4-2 ) = DNM2 + Z( J4P2 )
00139       IF( Z( J4-2 ).EQ.ZERO ) THEN
00140          Z( J4 ) = ZERO
00141          DNM1 = Z( J4P2+2 )
00142          DMIN = DNM1
00143          EMIN = ZERO
00144       ELSE IF( SAFMIN*Z( J4P2+2 ).LT.Z( J4-2 ) .AND.
00145      $         SAFMIN*Z( J4-2 ).LT.Z( J4P2+2 ) ) THEN
00146          TEMP = Z( J4P2+2 ) / Z( J4-2 )
00147          Z( J4 ) = Z( J4P2 )*TEMP
00148          DNM1 = DNM2*TEMP
00149       ELSE
00150          Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
00151          DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) )
00152       END IF
00153       DMIN = MIN( DMIN, DNM1 )
00154 *
00155       DMIN1 = DMIN
00156       J4 = J4 + 4
00157       J4P2 = J4 + 2*PP - 1
00158       Z( J4-2 ) = DNM1 + Z( J4P2 )
00159       IF( Z( J4-2 ).EQ.ZERO ) THEN
00160          Z( J4 ) = ZERO
00161          DN = Z( J4P2+2 )
00162          DMIN = DN
00163          EMIN = ZERO
00164       ELSE IF( SAFMIN*Z( J4P2+2 ).LT.Z( J4-2 ) .AND.
00165      $         SAFMIN*Z( J4-2 ).LT.Z( J4P2+2 ) ) THEN
00166          TEMP = Z( J4P2+2 ) / Z( J4-2 )
00167          Z( J4 ) = Z( J4P2 )*TEMP
00168          DN = DNM1*TEMP
00169       ELSE
00170          Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
00171          DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) )
00172       END IF
00173       DMIN = MIN( DMIN, DN )
00174 *
00175       Z( J4+2 ) = DN
00176       Z( 4*N0-PP ) = EMIN
00177       RETURN
00178 *
00179 *     End of DLASQ6
00180 *
00181       END
 All Files Functions