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

1.1       bertrand    1:       SUBROUTINE DLASV2( F, G, H, SSMIN, SSMAX, SNR, CSR, SNL, CSL )
                      2: *
                      3: *  -- LAPACK auxiliary routine (version 3.2) --
                      4: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
                      5: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
                      6: *     November 2006
                      7: *
                      8: *     .. Scalar Arguments ..
                      9:       DOUBLE PRECISION   CSL, CSR, F, G, H, SNL, SNR, SSMAX, SSMIN
                     10: *     ..
                     11: *
                     12: *  Purpose
                     13: *  =======
                     14: *
                     15: *  DLASV2 computes the singular value decomposition of a 2-by-2
                     16: *  triangular matrix
                     17: *     [  F   G  ]
                     18: *     [  0   H  ].
                     19: *  On return, abs(SSMAX) is the larger singular value, abs(SSMIN) is the
                     20: *  smaller singular value, and (CSL,SNL) and (CSR,SNR) are the left and
                     21: *  right singular vectors for abs(SSMAX), giving the decomposition
                     22: *
                     23: *     [ CSL  SNL ] [  F   G  ] [ CSR -SNR ]  =  [ SSMAX   0   ]
                     24: *     [-SNL  CSL ] [  0   H  ] [ SNR  CSR ]     [  0    SSMIN ].
                     25: *
                     26: *  Arguments
                     27: *  =========
                     28: *
                     29: *  F       (input) DOUBLE PRECISION
                     30: *          The (1,1) element of the 2-by-2 matrix.
                     31: *
                     32: *  G       (input) DOUBLE PRECISION
                     33: *          The (1,2) element of the 2-by-2 matrix.
                     34: *
                     35: *  H       (input) DOUBLE PRECISION
                     36: *          The (2,2) element of the 2-by-2 matrix.
                     37: *
                     38: *  SSMIN   (output) DOUBLE PRECISION
                     39: *          abs(SSMIN) is the smaller singular value.
                     40: *
                     41: *  SSMAX   (output) DOUBLE PRECISION
                     42: *          abs(SSMAX) is the larger singular value.
                     43: *
                     44: *  SNL     (output) DOUBLE PRECISION
                     45: *  CSL     (output) DOUBLE PRECISION
                     46: *          The vector (CSL, SNL) is a unit left singular vector for the
                     47: *          singular value abs(SSMAX).
                     48: *
                     49: *  SNR     (output) DOUBLE PRECISION
                     50: *  CSR     (output) DOUBLE PRECISION
                     51: *          The vector (CSR, SNR) is a unit right singular vector for the
                     52: *          singular value abs(SSMAX).
                     53: *
                     54: *  Further Details
                     55: *  ===============
                     56: *
                     57: *  Any input parameter may be aliased with any output parameter.
                     58: *
                     59: *  Barring over/underflow and assuming a guard digit in subtraction, all
                     60: *  output quantities are correct to within a few units in the last
                     61: *  place (ulps).
                     62: *
                     63: *  In IEEE arithmetic, the code works correctly if one matrix element is
                     64: *  infinite.
                     65: *
                     66: *  Overflow will not occur unless the largest singular value itself
                     67: *  overflows or is within a few ulps of overflow. (On machines with
                     68: *  partial overflow, like the Cray, overflow may occur if the largest
                     69: *  singular value is within a factor of 2 of overflow.)
                     70: *
                     71: *  Underflow is harmless if underflow is gradual. Otherwise, results
                     72: *  may correspond to a matrix modified by perturbations of size near
                     73: *  the underflow threshold.
                     74: *
                     75: * =====================================================================
                     76: *
                     77: *     .. Parameters ..
                     78:       DOUBLE PRECISION   ZERO
                     79:       PARAMETER          ( ZERO = 0.0D0 )
                     80:       DOUBLE PRECISION   HALF
                     81:       PARAMETER          ( HALF = 0.5D0 )
                     82:       DOUBLE PRECISION   ONE
                     83:       PARAMETER          ( ONE = 1.0D0 )
                     84:       DOUBLE PRECISION   TWO
                     85:       PARAMETER          ( TWO = 2.0D0 )
                     86:       DOUBLE PRECISION   FOUR
                     87:       PARAMETER          ( FOUR = 4.0D0 )
                     88: *     ..
                     89: *     .. Local Scalars ..
                     90:       LOGICAL            GASMAL, SWAP
                     91:       INTEGER            PMAX
                     92:       DOUBLE PRECISION   A, CLT, CRT, D, FA, FT, GA, GT, HA, HT, L, M,
                     93:      $                   MM, R, S, SLT, SRT, T, TEMP, TSIGN, TT
                     94: *     ..
                     95: *     .. Intrinsic Functions ..
                     96:       INTRINSIC          ABS, SIGN, SQRT
                     97: *     ..
                     98: *     .. External Functions ..
                     99:       DOUBLE PRECISION   DLAMCH
                    100:       EXTERNAL           DLAMCH
                    101: *     ..
                    102: *     .. Executable Statements ..
                    103: *
                    104:       FT = F
                    105:       FA = ABS( FT )
                    106:       HT = H
                    107:       HA = ABS( H )
                    108: *
                    109: *     PMAX points to the maximum absolute element of matrix
                    110: *       PMAX = 1 if F largest in absolute values
                    111: *       PMAX = 2 if G largest in absolute values
                    112: *       PMAX = 3 if H largest in absolute values
                    113: *
                    114:       PMAX = 1
                    115:       SWAP = ( HA.GT.FA )
                    116:       IF( SWAP ) THEN
                    117:          PMAX = 3
                    118:          TEMP = FT
                    119:          FT = HT
                    120:          HT = TEMP
                    121:          TEMP = FA
                    122:          FA = HA
                    123:          HA = TEMP
                    124: *
                    125: *        Now FA .ge. HA
                    126: *
                    127:       END IF
                    128:       GT = G
                    129:       GA = ABS( GT )
                    130:       IF( GA.EQ.ZERO ) THEN
                    131: *
                    132: *        Diagonal matrix
                    133: *
                    134:          SSMIN = HA
                    135:          SSMAX = FA
                    136:          CLT = ONE
                    137:          CRT = ONE
                    138:          SLT = ZERO
                    139:          SRT = ZERO
                    140:       ELSE
                    141:          GASMAL = .TRUE.
                    142:          IF( GA.GT.FA ) THEN
                    143:             PMAX = 2
                    144:             IF( ( FA / GA ).LT.DLAMCH( 'EPS' ) ) THEN
                    145: *
                    146: *              Case of very large GA
                    147: *
                    148:                GASMAL = .FALSE.
                    149:                SSMAX = GA
                    150:                IF( HA.GT.ONE ) THEN
                    151:                   SSMIN = FA / ( GA / HA )
                    152:                ELSE
                    153:                   SSMIN = ( FA / GA )*HA
                    154:                END IF
                    155:                CLT = ONE
                    156:                SLT = HT / GT
                    157:                SRT = ONE
                    158:                CRT = FT / GT
                    159:             END IF
                    160:          END IF
                    161:          IF( GASMAL ) THEN
                    162: *
                    163: *           Normal case
                    164: *
                    165:             D = FA - HA
                    166:             IF( D.EQ.FA ) THEN
                    167: *
                    168: *              Copes with infinite F or H
                    169: *
                    170:                L = ONE
                    171:             ELSE
                    172:                L = D / FA
                    173:             END IF
                    174: *
                    175: *           Note that 0 .le. L .le. 1
                    176: *
                    177:             M = GT / FT
                    178: *
                    179: *           Note that abs(M) .le. 1/macheps
                    180: *
                    181:             T = TWO - L
                    182: *
                    183: *           Note that T .ge. 1
                    184: *
                    185:             MM = M*M
                    186:             TT = T*T
                    187:             S = SQRT( TT+MM )
                    188: *
                    189: *           Note that 1 .le. S .le. 1 + 1/macheps
                    190: *
                    191:             IF( L.EQ.ZERO ) THEN
                    192:                R = ABS( M )
                    193:             ELSE
                    194:                R = SQRT( L*L+MM )
                    195:             END IF
                    196: *
                    197: *           Note that 0 .le. R .le. 1 + 1/macheps
                    198: *
                    199:             A = HALF*( S+R )
                    200: *
                    201: *           Note that 1 .le. A .le. 1 + abs(M)
                    202: *
                    203:             SSMIN = HA / A
                    204:             SSMAX = FA*A
                    205:             IF( MM.EQ.ZERO ) THEN
                    206: *
                    207: *              Note that M is very tiny
                    208: *
                    209:                IF( L.EQ.ZERO ) THEN
                    210:                   T = SIGN( TWO, FT )*SIGN( ONE, GT )
                    211:                ELSE
                    212:                   T = GT / SIGN( D, FT ) + M / T
                    213:                END IF
                    214:             ELSE
                    215:                T = ( M / ( S+T )+M / ( R+L ) )*( ONE+A )
                    216:             END IF
                    217:             L = SQRT( T*T+FOUR )
                    218:             CRT = TWO / L
                    219:             SRT = T / L
                    220:             CLT = ( CRT+SRT*M ) / A
                    221:             SLT = ( HT / FT )*SRT / A
                    222:          END IF
                    223:       END IF
                    224:       IF( SWAP ) THEN
                    225:          CSL = SRT
                    226:          SNL = CRT
                    227:          CSR = SLT
                    228:          SNR = CLT
                    229:       ELSE
                    230:          CSL = CLT
                    231:          SNL = SLT
                    232:          CSR = CRT
                    233:          SNR = SRT
                    234:       END IF
                    235: *
                    236: *     Correct signs of SSMAX and SSMIN
                    237: *
                    238:       IF( PMAX.EQ.1 )
                    239:      $   TSIGN = SIGN( ONE, CSR )*SIGN( ONE, CSL )*SIGN( ONE, F )
                    240:       IF( PMAX.EQ.2 )
                    241:      $   TSIGN = SIGN( ONE, SNR )*SIGN( ONE, CSL )*SIGN( ONE, G )
                    242:       IF( PMAX.EQ.3 )
                    243:      $   TSIGN = SIGN( ONE, SNR )*SIGN( ONE, SNL )*SIGN( ONE, H )
                    244:       SSMAX = SIGN( SSMAX, TSIGN )
                    245:       SSMIN = SIGN( SSMIN, TSIGN*SIGN( ONE, F )*SIGN( ONE, H ) )
                    246:       RETURN
                    247: *
                    248: *     End of DLASV2
                    249: *
                    250:       END

CVSweb interface <joel.bertrand@systella.fr>