File:  [local] / rpl / lapack / lapack / dlasv2.f
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue Jan 26 15:22:46 2010 UTC (14 years, 4 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Initial revision

    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>