Annotation of rpl/lapack/lapack/dlasq5.f, revision 1.10

1.8       bertrand    1: *> \brief \b DLASQ5
                      2: *
                      3: *  =========== DOCUMENTATION ===========
                      4: *
                      5: * Online html documentation available at 
                      6: *            http://www.netlib.org/lapack/explore-html/ 
                      7: *
                      8: *> \htmlonly
                      9: *> Download DLASQ5 + dependencies 
                     10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlasq5.f"> 
                     11: *> [TGZ]</a> 
                     12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlasq5.f"> 
                     13: *> [ZIP]</a> 
                     14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlasq5.f"> 
                     15: *> [TXT]</a>
                     16: *> \endhtmlonly 
                     17: *
                     18: *  Definition:
                     19: *  ===========
                     20: *
1.10    ! bertrand   21: *       SUBROUTINE DLASQ5( I0, N0, Z, PP, TAU, SIGMA, DMIN, DMIN1, DMIN2, DN,
        !            22: *                          DNM1, DNM2, IEEE, EPS )
1.8       bertrand   23: * 
                     24: *       .. Scalar Arguments ..
                     25: *       LOGICAL            IEEE
                     26: *       INTEGER            I0, N0, PP
1.10    ! bertrand   27: *       DOUBLE PRECISION   DMIN, DMIN1, DMIN2, DN, DNM1, DNM2, TAU, SIGMA, EPS
1.8       bertrand   28: *       ..
                     29: *       .. Array Arguments ..
                     30: *       DOUBLE PRECISION   Z( * )
                     31: *       ..
                     32: *  
                     33: *
                     34: *> \par Purpose:
                     35: *  =============
                     36: *>
                     37: *> \verbatim
                     38: *>
                     39: *> DLASQ5 computes one dqds transform in ping-pong form, one
                     40: *> version for IEEE machines another for non IEEE machines.
                     41: *> \endverbatim
                     42: *
                     43: *  Arguments:
                     44: *  ==========
                     45: *
                     46: *> \param[in] I0
                     47: *> \verbatim
                     48: *>          I0 is INTEGER
                     49: *>        First index.
                     50: *> \endverbatim
                     51: *>
                     52: *> \param[in] N0
                     53: *> \verbatim
                     54: *>          N0 is INTEGER
                     55: *>        Last index.
                     56: *> \endverbatim
                     57: *>
                     58: *> \param[in] Z
                     59: *> \verbatim
                     60: *>          Z is DOUBLE PRECISION array, dimension ( 4*N )
                     61: *>        Z holds the qd array. EMIN is stored in Z(4*N0) to avoid
                     62: *>        an extra argument.
                     63: *> \endverbatim
                     64: *>
                     65: *> \param[in] PP
                     66: *> \verbatim
                     67: *>          PP is INTEGER
                     68: *>        PP=0 for ping, PP=1 for pong.
                     69: *> \endverbatim
                     70: *>
                     71: *> \param[in] TAU
                     72: *> \verbatim
                     73: *>          TAU is DOUBLE PRECISION
                     74: *>        This is the shift.
                     75: *> \endverbatim
                     76: *>
1.10    ! bertrand   77: *> \param[in] SIGMA
        !            78: *> \verbatim
        !            79: *>          SIGMA is DOUBLE PRECISION
        !            80: *>        This is the accumulated shift up to this step.
        !            81: *> \endverbatim
        !            82: *>
1.8       bertrand   83: *> \param[out] DMIN
                     84: *> \verbatim
                     85: *>          DMIN is DOUBLE PRECISION
                     86: *>        Minimum value of d.
                     87: *> \endverbatim
                     88: *>
                     89: *> \param[out] DMIN1
                     90: *> \verbatim
                     91: *>          DMIN1 is DOUBLE PRECISION
                     92: *>        Minimum value of d, excluding D( N0 ).
                     93: *> \endverbatim
                     94: *>
                     95: *> \param[out] DMIN2
                     96: *> \verbatim
                     97: *>          DMIN2 is DOUBLE PRECISION
                     98: *>        Minimum value of d, excluding D( N0 ) and D( N0-1 ).
                     99: *> \endverbatim
                    100: *>
                    101: *> \param[out] DN
                    102: *> \verbatim
                    103: *>          DN is DOUBLE PRECISION
                    104: *>        d(N0), the last value of d.
                    105: *> \endverbatim
                    106: *>
                    107: *> \param[out] DNM1
                    108: *> \verbatim
                    109: *>          DNM1 is DOUBLE PRECISION
                    110: *>        d(N0-1).
                    111: *> \endverbatim
                    112: *>
                    113: *> \param[out] DNM2
                    114: *> \verbatim
                    115: *>          DNM2 is DOUBLE PRECISION
                    116: *>        d(N0-2).
                    117: *> \endverbatim
                    118: *>
                    119: *> \param[in] IEEE
                    120: *> \verbatim
                    121: *>          IEEE is LOGICAL
                    122: *>        Flag for IEEE or non IEEE arithmetic.
                    123: *> \endverbatim
                    124: *
1.10    ! bertrand  125: *> \param[in] EPS
        !           126: *> \verbatim
        !           127: *>          EPS is DOUBLE PRECISION
        !           128: *>        This is the value of epsilon used.
        !           129: *> \endverbatim
        !           130: *>
1.8       bertrand  131: *  Authors:
                    132: *  ========
                    133: *
                    134: *> \author Univ. of Tennessee 
                    135: *> \author Univ. of California Berkeley 
                    136: *> \author Univ. of Colorado Denver 
                    137: *> \author NAG Ltd. 
                    138: *
1.10    ! bertrand  139: *> \date April 2012
1.8       bertrand  140: *
                    141: *> \ingroup auxOTHERcomputational
                    142: *
                    143: *  =====================================================================
1.10    ! bertrand  144:       SUBROUTINE DLASQ5( I0, N0, Z, PP, TAU, SIGMA, DMIN, DMIN1, DMIN2,
        !           145:      $                   DN, DNM1, DNM2, IEEE, EPS )
1.1       bertrand  146: *
1.10    ! bertrand  147: *  -- LAPACK computational routine (version 3.4.1) --
1.1       bertrand  148: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
                    149: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
1.10    ! bertrand  150: *     April 2012
1.1       bertrand  151: *
                    152: *     .. Scalar Arguments ..
                    153:       LOGICAL            IEEE
                    154:       INTEGER            I0, N0, PP
1.10    ! bertrand  155:       DOUBLE PRECISION   DMIN, DMIN1, DMIN2, DN, DNM1, DNM2, TAU,
        !           156:      $                   SIGMA, EPS
1.1       bertrand  157: *     ..
                    158: *     .. Array Arguments ..
                    159:       DOUBLE PRECISION   Z( * )
                    160: *     ..
                    161: *
                    162: *  =====================================================================
                    163: *
                    164: *     .. Parameter ..
1.10    ! bertrand  165:       DOUBLE PRECISION   ZERO, HALF
        !           166:       PARAMETER          ( ZERO = 0.0D0, HALF = 0.5 )
1.1       bertrand  167: *     ..
                    168: *     .. Local Scalars ..
                    169:       INTEGER            J4, J4P2
1.10    ! bertrand  170:       DOUBLE PRECISION   D, EMIN, TEMP, DTHRESH
1.1       bertrand  171: *     ..
                    172: *     .. Intrinsic Functions ..
                    173:       INTRINSIC          MIN
                    174: *     ..
                    175: *     .. Executable Statements ..
                    176: *
                    177:       IF( ( N0-I0-1 ).LE.0 )
                    178:      $   RETURN
                    179: *
1.10    ! bertrand  180:       DTHRESH = EPS*(SIGMA+TAU)
        !           181:       IF( TAU.LT.DTHRESH*HALF ) TAU = ZERO
        !           182:       IF( TAU.NE.ZERO ) THEN
1.1       bertrand  183:       J4 = 4*I0 + PP - 3
                    184:       EMIN = Z( J4+4 ) 
                    185:       D = Z( J4 ) - TAU
                    186:       DMIN = D
                    187:       DMIN1 = -Z( J4 )
                    188: *
                    189:       IF( IEEE ) THEN
                    190: *
                    191: *        Code for IEEE arithmetic.
                    192: *
                    193:          IF( PP.EQ.0 ) THEN
                    194:             DO 10 J4 = 4*I0, 4*( N0-3 ), 4
                    195:                Z( J4-2 ) = D + Z( J4-1 ) 
                    196:                TEMP = Z( J4+1 ) / Z( J4-2 )
                    197:                D = D*TEMP - TAU
                    198:                DMIN = MIN( DMIN, D )
                    199:                Z( J4 ) = Z( J4-1 )*TEMP
                    200:                EMIN = MIN( Z( J4 ), EMIN )
                    201:    10       CONTINUE
                    202:          ELSE
                    203:             DO 20 J4 = 4*I0, 4*( N0-3 ), 4
                    204:                Z( J4-3 ) = D + Z( J4 ) 
                    205:                TEMP = Z( J4+2 ) / Z( J4-3 )
                    206:                D = D*TEMP - TAU
                    207:                DMIN = MIN( DMIN, D )
                    208:                Z( J4-1 ) = Z( J4 )*TEMP
                    209:                EMIN = MIN( Z( J4-1 ), EMIN )
                    210:    20       CONTINUE
                    211:          END IF
                    212: *
                    213: *        Unroll last two steps. 
                    214: *
                    215:          DNM2 = D
                    216:          DMIN2 = DMIN
                    217:          J4 = 4*( N0-2 ) - PP
                    218:          J4P2 = J4 + 2*PP - 1
                    219:          Z( J4-2 ) = DNM2 + Z( J4P2 )
                    220:          Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
                    221:          DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
                    222:          DMIN = MIN( DMIN, DNM1 )
                    223: *
                    224:          DMIN1 = DMIN
                    225:          J4 = J4 + 4
                    226:          J4P2 = J4 + 2*PP - 1
                    227:          Z( J4-2 ) = DNM1 + Z( J4P2 )
                    228:          Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
                    229:          DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
                    230:          DMIN = MIN( DMIN, DN )
                    231: *
                    232:       ELSE
                    233: *
                    234: *        Code for non IEEE arithmetic.
                    235: *
                    236:          IF( PP.EQ.0 ) THEN
                    237:             DO 30 J4 = 4*I0, 4*( N0-3 ), 4
                    238:                Z( J4-2 ) = D + Z( J4-1 ) 
                    239:                IF( D.LT.ZERO ) THEN
                    240:                   RETURN
                    241:                ELSE 
                    242:                   Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) )
                    243:                   D = Z( J4+1 )*( D / Z( J4-2 ) ) - TAU
                    244:                END IF
                    245:                DMIN = MIN( DMIN, D )
                    246:                EMIN = MIN( EMIN, Z( J4 ) )
                    247:    30       CONTINUE
                    248:          ELSE
                    249:             DO 40 J4 = 4*I0, 4*( N0-3 ), 4
                    250:                Z( J4-3 ) = D + Z( J4 ) 
                    251:                IF( D.LT.ZERO ) THEN
                    252:                   RETURN
                    253:                ELSE 
                    254:                   Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) )
                    255:                   D = Z( J4+2 )*( D / Z( J4-3 ) ) - TAU
                    256:                END IF
                    257:                DMIN = MIN( DMIN, D )
                    258:                EMIN = MIN( EMIN, Z( J4-1 ) )
                    259:    40       CONTINUE
                    260:          END IF
                    261: *
                    262: *        Unroll last two steps. 
                    263: *
                    264:          DNM2 = D
                    265:          DMIN2 = DMIN
                    266:          J4 = 4*( N0-2 ) - PP
                    267:          J4P2 = J4 + 2*PP - 1
                    268:          Z( J4-2 ) = DNM2 + Z( J4P2 )
                    269:          IF( DNM2.LT.ZERO ) THEN
                    270:             RETURN
                    271:          ELSE
                    272:             Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
                    273:             DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
                    274:          END IF
                    275:          DMIN = MIN( DMIN, DNM1 )
                    276: *
                    277:          DMIN1 = DMIN
                    278:          J4 = J4 + 4
                    279:          J4P2 = J4 + 2*PP - 1
                    280:          Z( J4-2 ) = DNM1 + Z( J4P2 )
                    281:          IF( DNM1.LT.ZERO ) THEN
                    282:             RETURN
                    283:          ELSE
                    284:             Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
                    285:             DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
                    286:          END IF
                    287:          DMIN = MIN( DMIN, DN )
                    288: *
                    289:       END IF
1.10    ! bertrand  290:       ELSE
        !           291: *     This is the version that sets d's to zero if they are small enough
        !           292:          J4 = 4*I0 + PP - 3
        !           293:          EMIN = Z( J4+4 ) 
        !           294:          D = Z( J4 ) - TAU
        !           295:          DMIN = D
        !           296:          DMIN1 = -Z( J4 )
        !           297:          IF( IEEE ) THEN
        !           298: *     
        !           299: *     Code for IEEE arithmetic.
        !           300: *     
        !           301:             IF( PP.EQ.0 ) THEN
        !           302:                DO 50 J4 = 4*I0, 4*( N0-3 ), 4
        !           303:                   Z( J4-2 ) = D + Z( J4-1 ) 
        !           304:                   TEMP = Z( J4+1 ) / Z( J4-2 )
        !           305:                   D = D*TEMP - TAU
        !           306:                   IF( D.LT.DTHRESH ) D = ZERO
        !           307:                   DMIN = MIN( DMIN, D )
        !           308:                   Z( J4 ) = Z( J4-1 )*TEMP
        !           309:                   EMIN = MIN( Z( J4 ), EMIN )
        !           310:  50            CONTINUE
        !           311:             ELSE
        !           312:                DO 60 J4 = 4*I0, 4*( N0-3 ), 4
        !           313:                   Z( J4-3 ) = D + Z( J4 ) 
        !           314:                   TEMP = Z( J4+2 ) / Z( J4-3 )
        !           315:                   D = D*TEMP - TAU
        !           316:                   IF( D.LT.DTHRESH ) D = ZERO
        !           317:                   DMIN = MIN( DMIN, D )
        !           318:                   Z( J4-1 ) = Z( J4 )*TEMP
        !           319:                   EMIN = MIN( Z( J4-1 ), EMIN )
        !           320:  60            CONTINUE
        !           321:             END IF
        !           322: *     
        !           323: *     Unroll last two steps. 
        !           324: *     
        !           325:             DNM2 = D
        !           326:             DMIN2 = DMIN
        !           327:             J4 = 4*( N0-2 ) - PP
        !           328:             J4P2 = J4 + 2*PP - 1
        !           329:             Z( J4-2 ) = DNM2 + Z( J4P2 )
        !           330:             Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
        !           331:             DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
        !           332:             DMIN = MIN( DMIN, DNM1 )
        !           333: *     
        !           334:             DMIN1 = DMIN
        !           335:             J4 = J4 + 4
        !           336:             J4P2 = J4 + 2*PP - 1
        !           337:             Z( J4-2 ) = DNM1 + Z( J4P2 )
        !           338:             Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
        !           339:             DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
        !           340:             DMIN = MIN( DMIN, DN )
        !           341: *     
        !           342:          ELSE
        !           343: *     
        !           344: *     Code for non IEEE arithmetic.
        !           345: *     
        !           346:             IF( PP.EQ.0 ) THEN
        !           347:                DO 70 J4 = 4*I0, 4*( N0-3 ), 4
        !           348:                   Z( J4-2 ) = D + Z( J4-1 ) 
        !           349:                   IF( D.LT.ZERO ) THEN
        !           350:                      RETURN
        !           351:                   ELSE 
        !           352:                      Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) )
        !           353:                      D = Z( J4+1 )*( D / Z( J4-2 ) ) - TAU
        !           354:                   END IF
        !           355:                   IF( D.LT.DTHRESH) D = ZERO
        !           356:                   DMIN = MIN( DMIN, D )
        !           357:                   EMIN = MIN( EMIN, Z( J4 ) )
        !           358:  70            CONTINUE
        !           359:             ELSE
        !           360:                DO 80 J4 = 4*I0, 4*( N0-3 ), 4
        !           361:                   Z( J4-3 ) = D + Z( J4 ) 
        !           362:                   IF( D.LT.ZERO ) THEN
        !           363:                      RETURN
        !           364:                   ELSE 
        !           365:                      Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) )
        !           366:                      D = Z( J4+2 )*( D / Z( J4-3 ) ) - TAU
        !           367:                   END IF
        !           368:                   IF( D.LT.DTHRESH) D = ZERO
        !           369:                   DMIN = MIN( DMIN, D )
        !           370:                   EMIN = MIN( EMIN, Z( J4-1 ) )
        !           371:  80            CONTINUE
        !           372:             END IF
        !           373: *     
        !           374: *     Unroll last two steps. 
        !           375: *     
        !           376:             DNM2 = D
        !           377:             DMIN2 = DMIN
        !           378:             J4 = 4*( N0-2 ) - PP
        !           379:             J4P2 = J4 + 2*PP - 1
        !           380:             Z( J4-2 ) = DNM2 + Z( J4P2 )
        !           381:             IF( DNM2.LT.ZERO ) THEN
        !           382:                RETURN
        !           383:             ELSE
        !           384:                Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
        !           385:                DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) ) - TAU
        !           386:             END IF
        !           387:             DMIN = MIN( DMIN, DNM1 )
        !           388: *     
        !           389:             DMIN1 = DMIN
        !           390:             J4 = J4 + 4
        !           391:             J4P2 = J4 + 2*PP - 1
        !           392:             Z( J4-2 ) = DNM1 + Z( J4P2 )
        !           393:             IF( DNM1.LT.ZERO ) THEN
        !           394:                RETURN
        !           395:             ELSE
        !           396:                Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
        !           397:                DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) ) - TAU
        !           398:             END IF
        !           399:             DMIN = MIN( DMIN, DN )
        !           400: *     
        !           401:          END IF
        !           402:       END IF
        !           403: *     
1.1       bertrand  404:       Z( J4+2 ) = DN
                    405:       Z( 4*N0-PP ) = EMIN
                    406:       RETURN
                    407: *
                    408: *     End of DLASQ5
                    409: *
                    410:       END

CVSweb interface <joel.bertrand@systella.fr>