Annotation of rpl/lapack/lapack/dlasv2.f, revision 1.12

1.11      bertrand    1: *> \brief \b DLASV2 computes the singular value decomposition of a 2-by-2 triangular matrix.
1.8       bertrand    2: *
                      3: *  =========== DOCUMENTATION ===========
                      4: *
                      5: * Online html documentation available at 
                      6: *            http://www.netlib.org/lapack/explore-html/ 
                      7: *
                      8: *> \htmlonly
                      9: *> Download DLASV2 + dependencies 
                     10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlasv2.f"> 
                     11: *> [TGZ]</a> 
                     12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlasv2.f"> 
                     13: *> [ZIP]</a> 
                     14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlasv2.f"> 
                     15: *> [TXT]</a>
                     16: *> \endhtmlonly 
                     17: *
                     18: *  Definition:
                     19: *  ===========
                     20: *
                     21: *       SUBROUTINE DLASV2( F, G, H, SSMIN, SSMAX, SNR, CSR, SNL, CSL )
                     22: * 
                     23: *       .. Scalar Arguments ..
                     24: *       DOUBLE PRECISION   CSL, CSR, F, G, H, SNL, SNR, SSMAX, SSMIN
                     25: *       ..
                     26: *  
                     27: *
                     28: *> \par Purpose:
                     29: *  =============
                     30: *>
                     31: *> \verbatim
                     32: *>
                     33: *> DLASV2 computes the singular value decomposition of a 2-by-2
                     34: *> triangular matrix
                     35: *>    [  F   G  ]
                     36: *>    [  0   H  ].
                     37: *> On return, abs(SSMAX) is the larger singular value, abs(SSMIN) is the
                     38: *> smaller singular value, and (CSL,SNL) and (CSR,SNR) are the left and
                     39: *> right singular vectors for abs(SSMAX), giving the decomposition
                     40: *>
                     41: *>    [ CSL  SNL ] [  F   G  ] [ CSR -SNR ]  =  [ SSMAX   0   ]
                     42: *>    [-SNL  CSL ] [  0   H  ] [ SNR  CSR ]     [  0    SSMIN ].
                     43: *> \endverbatim
                     44: *
                     45: *  Arguments:
                     46: *  ==========
                     47: *
                     48: *> \param[in] F
                     49: *> \verbatim
                     50: *>          F is DOUBLE PRECISION
                     51: *>          The (1,1) element of the 2-by-2 matrix.
                     52: *> \endverbatim
                     53: *>
                     54: *> \param[in] G
                     55: *> \verbatim
                     56: *>          G is DOUBLE PRECISION
                     57: *>          The (1,2) element of the 2-by-2 matrix.
                     58: *> \endverbatim
                     59: *>
                     60: *> \param[in] H
                     61: *> \verbatim
                     62: *>          H is DOUBLE PRECISION
                     63: *>          The (2,2) element of the 2-by-2 matrix.
                     64: *> \endverbatim
                     65: *>
                     66: *> \param[out] SSMIN
                     67: *> \verbatim
                     68: *>          SSMIN is DOUBLE PRECISION
                     69: *>          abs(SSMIN) is the smaller singular value.
                     70: *> \endverbatim
                     71: *>
                     72: *> \param[out] SSMAX
                     73: *> \verbatim
                     74: *>          SSMAX is DOUBLE PRECISION
                     75: *>          abs(SSMAX) is the larger singular value.
                     76: *> \endverbatim
                     77: *>
                     78: *> \param[out] SNL
                     79: *> \verbatim
                     80: *>          SNL is DOUBLE PRECISION
                     81: *> \endverbatim
                     82: *>
                     83: *> \param[out] CSL
                     84: *> \verbatim
                     85: *>          CSL is DOUBLE PRECISION
                     86: *>          The vector (CSL, SNL) is a unit left singular vector for the
                     87: *>          singular value abs(SSMAX).
                     88: *> \endverbatim
                     89: *>
                     90: *> \param[out] SNR
                     91: *> \verbatim
                     92: *>          SNR is DOUBLE PRECISION
                     93: *> \endverbatim
                     94: *>
                     95: *> \param[out] CSR
                     96: *> \verbatim
                     97: *>          CSR is DOUBLE PRECISION
                     98: *>          The vector (CSR, SNR) is a unit right singular vector for the
                     99: *>          singular value abs(SSMAX).
                    100: *> \endverbatim
                    101: *
                    102: *  Authors:
                    103: *  ========
                    104: *
                    105: *> \author Univ. of Tennessee 
                    106: *> \author Univ. of California Berkeley 
                    107: *> \author Univ. of Colorado Denver 
                    108: *> \author NAG Ltd. 
                    109: *
1.11      bertrand  110: *> \date September 2012
1.8       bertrand  111: *
                    112: *> \ingroup auxOTHERauxiliary
                    113: *
                    114: *> \par Further Details:
                    115: *  =====================
                    116: *>
                    117: *> \verbatim
                    118: *>
                    119: *>  Any input parameter may be aliased with any output parameter.
                    120: *>
                    121: *>  Barring over/underflow and assuming a guard digit in subtraction, all
                    122: *>  output quantities are correct to within a few units in the last
                    123: *>  place (ulps).
                    124: *>
                    125: *>  In IEEE arithmetic, the code works correctly if one matrix element is
                    126: *>  infinite.
                    127: *>
                    128: *>  Overflow will not occur unless the largest singular value itself
                    129: *>  overflows or is within a few ulps of overflow. (On machines with
                    130: *>  partial overflow, like the Cray, overflow may occur if the largest
                    131: *>  singular value is within a factor of 2 of overflow.)
                    132: *>
                    133: *>  Underflow is harmless if underflow is gradual. Otherwise, results
                    134: *>  may correspond to a matrix modified by perturbations of size near
                    135: *>  the underflow threshold.
                    136: *> \endverbatim
                    137: *>
                    138: *  =====================================================================
1.1       bertrand  139:       SUBROUTINE DLASV2( F, G, H, SSMIN, SSMAX, SNR, CSR, SNL, CSL )
                    140: *
1.11      bertrand  141: *  -- LAPACK auxiliary routine (version 3.4.2) --
1.1       bertrand  142: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
                    143: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
1.11      bertrand  144: *     September 2012
1.1       bertrand  145: *
                    146: *     .. Scalar Arguments ..
                    147:       DOUBLE PRECISION   CSL, CSR, F, G, H, SNL, SNR, SSMAX, SSMIN
                    148: *     ..
                    149: *
                    150: * =====================================================================
                    151: *
                    152: *     .. Parameters ..
                    153:       DOUBLE PRECISION   ZERO
                    154:       PARAMETER          ( ZERO = 0.0D0 )
                    155:       DOUBLE PRECISION   HALF
                    156:       PARAMETER          ( HALF = 0.5D0 )
                    157:       DOUBLE PRECISION   ONE
                    158:       PARAMETER          ( ONE = 1.0D0 )
                    159:       DOUBLE PRECISION   TWO
                    160:       PARAMETER          ( TWO = 2.0D0 )
                    161:       DOUBLE PRECISION   FOUR
                    162:       PARAMETER          ( FOUR = 4.0D0 )
                    163: *     ..
                    164: *     .. Local Scalars ..
                    165:       LOGICAL            GASMAL, SWAP
                    166:       INTEGER            PMAX
                    167:       DOUBLE PRECISION   A, CLT, CRT, D, FA, FT, GA, GT, HA, HT, L, M,
                    168:      $                   MM, R, S, SLT, SRT, T, TEMP, TSIGN, TT
                    169: *     ..
                    170: *     .. Intrinsic Functions ..
                    171:       INTRINSIC          ABS, SIGN, SQRT
                    172: *     ..
                    173: *     .. External Functions ..
                    174:       DOUBLE PRECISION   DLAMCH
                    175:       EXTERNAL           DLAMCH
                    176: *     ..
                    177: *     .. Executable Statements ..
                    178: *
                    179:       FT = F
                    180:       FA = ABS( FT )
                    181:       HT = H
                    182:       HA = ABS( H )
                    183: *
                    184: *     PMAX points to the maximum absolute element of matrix
                    185: *       PMAX = 1 if F largest in absolute values
                    186: *       PMAX = 2 if G largest in absolute values
                    187: *       PMAX = 3 if H largest in absolute values
                    188: *
                    189:       PMAX = 1
                    190:       SWAP = ( HA.GT.FA )
                    191:       IF( SWAP ) THEN
                    192:          PMAX = 3
                    193:          TEMP = FT
                    194:          FT = HT
                    195:          HT = TEMP
                    196:          TEMP = FA
                    197:          FA = HA
                    198:          HA = TEMP
                    199: *
                    200: *        Now FA .ge. HA
                    201: *
                    202:       END IF
                    203:       GT = G
                    204:       GA = ABS( GT )
                    205:       IF( GA.EQ.ZERO ) THEN
                    206: *
                    207: *        Diagonal matrix
                    208: *
                    209:          SSMIN = HA
                    210:          SSMAX = FA
                    211:          CLT = ONE
                    212:          CRT = ONE
                    213:          SLT = ZERO
                    214:          SRT = ZERO
                    215:       ELSE
                    216:          GASMAL = .TRUE.
                    217:          IF( GA.GT.FA ) THEN
                    218:             PMAX = 2
                    219:             IF( ( FA / GA ).LT.DLAMCH( 'EPS' ) ) THEN
                    220: *
                    221: *              Case of very large GA
                    222: *
                    223:                GASMAL = .FALSE.
                    224:                SSMAX = GA
                    225:                IF( HA.GT.ONE ) THEN
                    226:                   SSMIN = FA / ( GA / HA )
                    227:                ELSE
                    228:                   SSMIN = ( FA / GA )*HA
                    229:                END IF
                    230:                CLT = ONE
                    231:                SLT = HT / GT
                    232:                SRT = ONE
                    233:                CRT = FT / GT
                    234:             END IF
                    235:          END IF
                    236:          IF( GASMAL ) THEN
                    237: *
                    238: *           Normal case
                    239: *
                    240:             D = FA - HA
                    241:             IF( D.EQ.FA ) THEN
                    242: *
                    243: *              Copes with infinite F or H
                    244: *
                    245:                L = ONE
                    246:             ELSE
                    247:                L = D / FA
                    248:             END IF
                    249: *
                    250: *           Note that 0 .le. L .le. 1
                    251: *
                    252:             M = GT / FT
                    253: *
                    254: *           Note that abs(M) .le. 1/macheps
                    255: *
                    256:             T = TWO - L
                    257: *
                    258: *           Note that T .ge. 1
                    259: *
                    260:             MM = M*M
                    261:             TT = T*T
                    262:             S = SQRT( TT+MM )
                    263: *
                    264: *           Note that 1 .le. S .le. 1 + 1/macheps
                    265: *
                    266:             IF( L.EQ.ZERO ) THEN
                    267:                R = ABS( M )
                    268:             ELSE
                    269:                R = SQRT( L*L+MM )
                    270:             END IF
                    271: *
                    272: *           Note that 0 .le. R .le. 1 + 1/macheps
                    273: *
                    274:             A = HALF*( S+R )
                    275: *
                    276: *           Note that 1 .le. A .le. 1 + abs(M)
                    277: *
                    278:             SSMIN = HA / A
                    279:             SSMAX = FA*A
                    280:             IF( MM.EQ.ZERO ) THEN
                    281: *
                    282: *              Note that M is very tiny
                    283: *
                    284:                IF( L.EQ.ZERO ) THEN
                    285:                   T = SIGN( TWO, FT )*SIGN( ONE, GT )
                    286:                ELSE
                    287:                   T = GT / SIGN( D, FT ) + M / T
                    288:                END IF
                    289:             ELSE
                    290:                T = ( M / ( S+T )+M / ( R+L ) )*( ONE+A )
                    291:             END IF
                    292:             L = SQRT( T*T+FOUR )
                    293:             CRT = TWO / L
                    294:             SRT = T / L
                    295:             CLT = ( CRT+SRT*M ) / A
                    296:             SLT = ( HT / FT )*SRT / A
                    297:          END IF
                    298:       END IF
                    299:       IF( SWAP ) THEN
                    300:          CSL = SRT
                    301:          SNL = CRT
                    302:          CSR = SLT
                    303:          SNR = CLT
                    304:       ELSE
                    305:          CSL = CLT
                    306:          SNL = SLT
                    307:          CSR = CRT
                    308:          SNR = SRT
                    309:       END IF
                    310: *
                    311: *     Correct signs of SSMAX and SSMIN
                    312: *
                    313:       IF( PMAX.EQ.1 )
                    314:      $   TSIGN = SIGN( ONE, CSR )*SIGN( ONE, CSL )*SIGN( ONE, F )
                    315:       IF( PMAX.EQ.2 )
                    316:      $   TSIGN = SIGN( ONE, SNR )*SIGN( ONE, CSL )*SIGN( ONE, G )
                    317:       IF( PMAX.EQ.3 )
                    318:      $   TSIGN = SIGN( ONE, SNR )*SIGN( ONE, SNL )*SIGN( ONE, H )
                    319:       SSMAX = SIGN( SSMAX, TSIGN )
                    320:       SSMIN = SIGN( SSMIN, TSIGN*SIGN( ONE, F )*SIGN( ONE, H ) )
                    321:       RETURN
                    322: *
                    323: *     End of DLASV2
                    324: *
                    325:       END

CVSweb interface <joel.bertrand@systella.fr>