File:  [local] / rpl / lapack / lapack / dlasq6.f
Revision 1.13: download - view: text, annotated - select for diffs - revision graph
Mon Jan 27 09:28:23 2014 UTC (10 years, 3 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_24, rpl-4_1_23, rpl-4_1_22, rpl-4_1_21, rpl-4_1_20, rpl-4_1_19, rpl-4_1_18, rpl-4_1_17, HEAD
Cohérence.

    1: *> \brief \b DLASQ6 computes one dqd transform in ping-pong form. Used by sbdsqr and sstegr.
    2: *
    3: *  =========== DOCUMENTATION ===========
    4: *
    5: * Online html documentation available at 
    6: *            http://www.netlib.org/lapack/explore-html/ 
    7: *
    8: *> \htmlonly
    9: *> Download DLASQ6 + dependencies 
   10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlasq6.f"> 
   11: *> [TGZ]</a> 
   12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlasq6.f"> 
   13: *> [ZIP]</a> 
   14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlasq6.f"> 
   15: *> [TXT]</a>
   16: *> \endhtmlonly 
   17: *
   18: *  Definition:
   19: *  ===========
   20: *
   21: *       SUBROUTINE DLASQ6( I0, N0, Z, PP, DMIN, DMIN1, DMIN2, DN,
   22: *                          DNM1, DNM2 )
   23:    24: *       .. Scalar Arguments ..
   25: *       INTEGER            I0, N0, PP
   26: *       DOUBLE PRECISION   DMIN, DMIN1, DMIN2, DN, DNM1, DNM2
   27: *       ..
   28: *       .. Array Arguments ..
   29: *       DOUBLE PRECISION   Z( * )
   30: *       ..
   31: *  
   32: *
   33: *> \par Purpose:
   34: *  =============
   35: *>
   36: *> \verbatim
   37: *>
   38: *> DLASQ6 computes one dqd (shift equal to zero) transform in
   39: *> ping-pong form, with protection against underflow and overflow.
   40: *> \endverbatim
   41: *
   42: *  Arguments:
   43: *  ==========
   44: *
   45: *> \param[in] I0
   46: *> \verbatim
   47: *>          I0 is INTEGER
   48: *>        First index.
   49: *> \endverbatim
   50: *>
   51: *> \param[in] N0
   52: *> \verbatim
   53: *>          N0 is INTEGER
   54: *>        Last index.
   55: *> \endverbatim
   56: *>
   57: *> \param[in] Z
   58: *> \verbatim
   59: *>          Z is DOUBLE PRECISION array, dimension ( 4*N )
   60: *>        Z holds the qd array. EMIN is stored in Z(4*N0) to avoid
   61: *>        an extra argument.
   62: *> \endverbatim
   63: *>
   64: *> \param[in] PP
   65: *> \verbatim
   66: *>          PP is INTEGER
   67: *>        PP=0 for ping, PP=1 for pong.
   68: *> \endverbatim
   69: *>
   70: *> \param[out] DMIN
   71: *> \verbatim
   72: *>          DMIN is DOUBLE PRECISION
   73: *>        Minimum value of d.
   74: *> \endverbatim
   75: *>
   76: *> \param[out] DMIN1
   77: *> \verbatim
   78: *>          DMIN1 is DOUBLE PRECISION
   79: *>        Minimum value of d, excluding D( N0 ).
   80: *> \endverbatim
   81: *>
   82: *> \param[out] DMIN2
   83: *> \verbatim
   84: *>          DMIN2 is DOUBLE PRECISION
   85: *>        Minimum value of d, excluding D( N0 ) and D( N0-1 ).
   86: *> \endverbatim
   87: *>
   88: *> \param[out] DN
   89: *> \verbatim
   90: *>          DN is DOUBLE PRECISION
   91: *>        d(N0), the last value of d.
   92: *> \endverbatim
   93: *>
   94: *> \param[out] DNM1
   95: *> \verbatim
   96: *>          DNM1 is DOUBLE PRECISION
   97: *>        d(N0-1).
   98: *> \endverbatim
   99: *>
  100: *> \param[out] DNM2
  101: *> \verbatim
  102: *>          DNM2 is DOUBLE PRECISION
  103: *>        d(N0-2).
  104: *> \endverbatim
  105: *
  106: *  Authors:
  107: *  ========
  108: *
  109: *> \author Univ. of Tennessee 
  110: *> \author Univ. of California Berkeley 
  111: *> \author Univ. of Colorado Denver 
  112: *> \author NAG Ltd. 
  113: *
  114: *> \date September 2012
  115: *
  116: *> \ingroup auxOTHERcomputational
  117: *
  118: *  =====================================================================
  119:       SUBROUTINE DLASQ6( I0, N0, Z, PP, DMIN, DMIN1, DMIN2, DN,
  120:      $                   DNM1, DNM2 )
  121: *
  122: *  -- LAPACK computational routine (version 3.4.2) --
  123: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
  124: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  125: *     September 2012
  126: *
  127: *     .. Scalar Arguments ..
  128:       INTEGER            I0, N0, PP
  129:       DOUBLE PRECISION   DMIN, DMIN1, DMIN2, DN, DNM1, DNM2
  130: *     ..
  131: *     .. Array Arguments ..
  132:       DOUBLE PRECISION   Z( * )
  133: *     ..
  134: *
  135: *  =====================================================================
  136: *
  137: *     .. Parameter ..
  138:       DOUBLE PRECISION   ZERO
  139:       PARAMETER          ( ZERO = 0.0D0 )
  140: *     ..
  141: *     .. Local Scalars ..
  142:       INTEGER            J4, J4P2
  143:       DOUBLE PRECISION   D, EMIN, SAFMIN, TEMP
  144: *     ..
  145: *     .. External Function ..
  146:       DOUBLE PRECISION   DLAMCH
  147:       EXTERNAL           DLAMCH
  148: *     ..
  149: *     .. Intrinsic Functions ..
  150:       INTRINSIC          MIN
  151: *     ..
  152: *     .. Executable Statements ..
  153: *
  154:       IF( ( N0-I0-1 ).LE.0 )
  155:      $   RETURN
  156: *
  157:       SAFMIN = DLAMCH( 'Safe minimum' )
  158:       J4 = 4*I0 + PP - 3
  159:       EMIN = Z( J4+4 ) 
  160:       D = Z( J4 )
  161:       DMIN = D
  162: *
  163:       IF( PP.EQ.0 ) THEN
  164:          DO 10 J4 = 4*I0, 4*( N0-3 ), 4
  165:             Z( J4-2 ) = D + Z( J4-1 ) 
  166:             IF( Z( J4-2 ).EQ.ZERO ) THEN
  167:                Z( J4 ) = ZERO
  168:                D = Z( J4+1 )
  169:                DMIN = D
  170:                EMIN = ZERO
  171:             ELSE IF( SAFMIN*Z( J4+1 ).LT.Z( J4-2 ) .AND.
  172:      $               SAFMIN*Z( J4-2 ).LT.Z( J4+1 ) ) THEN
  173:                TEMP = Z( J4+1 ) / Z( J4-2 )
  174:                Z( J4 ) = Z( J4-1 )*TEMP
  175:                D = D*TEMP
  176:             ELSE 
  177:                Z( J4 ) = Z( J4+1 )*( Z( J4-1 ) / Z( J4-2 ) )
  178:                D = Z( J4+1 )*( D / Z( J4-2 ) )
  179:             END IF
  180:             DMIN = MIN( DMIN, D )
  181:             EMIN = MIN( EMIN, Z( J4 ) )
  182:    10    CONTINUE
  183:       ELSE
  184:          DO 20 J4 = 4*I0, 4*( N0-3 ), 4
  185:             Z( J4-3 ) = D + Z( J4 ) 
  186:             IF( Z( J4-3 ).EQ.ZERO ) THEN
  187:                Z( J4-1 ) = ZERO
  188:                D = Z( J4+2 )
  189:                DMIN = D
  190:                EMIN = ZERO
  191:             ELSE IF( SAFMIN*Z( J4+2 ).LT.Z( J4-3 ) .AND.
  192:      $               SAFMIN*Z( J4-3 ).LT.Z( J4+2 ) ) THEN
  193:                TEMP = Z( J4+2 ) / Z( J4-3 )
  194:                Z( J4-1 ) = Z( J4 )*TEMP
  195:                D = D*TEMP
  196:             ELSE 
  197:                Z( J4-1 ) = Z( J4+2 )*( Z( J4 ) / Z( J4-3 ) )
  198:                D = Z( J4+2 )*( D / Z( J4-3 ) )
  199:             END IF
  200:             DMIN = MIN( DMIN, D )
  201:             EMIN = MIN( EMIN, Z( J4-1 ) )
  202:    20    CONTINUE
  203:       END IF
  204: *
  205: *     Unroll last two steps. 
  206: *
  207:       DNM2 = D
  208:       DMIN2 = DMIN
  209:       J4 = 4*( N0-2 ) - PP
  210:       J4P2 = J4 + 2*PP - 1
  211:       Z( J4-2 ) = DNM2 + Z( J4P2 )
  212:       IF( Z( J4-2 ).EQ.ZERO ) THEN
  213:          Z( J4 ) = ZERO
  214:          DNM1 = Z( J4P2+2 )
  215:          DMIN = DNM1
  216:          EMIN = ZERO
  217:       ELSE IF( SAFMIN*Z( J4P2+2 ).LT.Z( J4-2 ) .AND.
  218:      $         SAFMIN*Z( J4-2 ).LT.Z( J4P2+2 ) ) THEN
  219:          TEMP = Z( J4P2+2 ) / Z( J4-2 )
  220:          Z( J4 ) = Z( J4P2 )*TEMP
  221:          DNM1 = DNM2*TEMP
  222:       ELSE
  223:          Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
  224:          DNM1 = Z( J4P2+2 )*( DNM2 / Z( J4-2 ) )
  225:       END IF
  226:       DMIN = MIN( DMIN, DNM1 )
  227: *
  228:       DMIN1 = DMIN
  229:       J4 = J4 + 4
  230:       J4P2 = J4 + 2*PP - 1
  231:       Z( J4-2 ) = DNM1 + Z( J4P2 )
  232:       IF( Z( J4-2 ).EQ.ZERO ) THEN
  233:          Z( J4 ) = ZERO
  234:          DN = Z( J4P2+2 )
  235:          DMIN = DN
  236:          EMIN = ZERO
  237:       ELSE IF( SAFMIN*Z( J4P2+2 ).LT.Z( J4-2 ) .AND.
  238:      $         SAFMIN*Z( J4-2 ).LT.Z( J4P2+2 ) ) THEN
  239:          TEMP = Z( J4P2+2 ) / Z( J4-2 )
  240:          Z( J4 ) = Z( J4P2 )*TEMP
  241:          DN = DNM1*TEMP
  242:       ELSE
  243:          Z( J4 ) = Z( J4P2+2 )*( Z( J4P2 ) / Z( J4-2 ) )
  244:          DN = Z( J4P2+2 )*( DNM1 / Z( J4-2 ) )
  245:       END IF
  246:       DMIN = MIN( DMIN, DN )
  247: *
  248:       Z( J4+2 ) = DN
  249:       Z( 4*N0-PP ) = EMIN
  250:       RETURN
  251: *
  252: *     End of DLASQ6
  253: *
  254:       END

CVSweb interface <joel.bertrand@systella.fr>