Annotation of rpl/lapack/lapack/ztgsy2.f, revision 1.1
1.1 ! bertrand 1: SUBROUTINE ZTGSY2( TRANS, IJOB, M, N, A, LDA, B, LDB, C, LDC, D,
! 2: $ LDD, E, LDE, F, LDF, SCALE, RDSUM, RDSCAL,
! 3: $ INFO )
! 4: *
! 5: * -- LAPACK auxiliary routine (version 3.2) --
! 6: * -- LAPACK is a software package provided by Univ. of Tennessee, --
! 7: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
! 8: * November 2006
! 9: *
! 10: * .. Scalar Arguments ..
! 11: CHARACTER TRANS
! 12: INTEGER IJOB, INFO, LDA, LDB, LDC, LDD, LDE, LDF, M, N
! 13: DOUBLE PRECISION RDSCAL, RDSUM, SCALE
! 14: * ..
! 15: * .. Array Arguments ..
! 16: COMPLEX*16 A( LDA, * ), B( LDB, * ), C( LDC, * ),
! 17: $ D( LDD, * ), E( LDE, * ), F( LDF, * )
! 18: * ..
! 19: *
! 20: * Purpose
! 21: * =======
! 22: *
! 23: * ZTGSY2 solves the generalized Sylvester equation
! 24: *
! 25: * A * R - L * B = scale * C (1)
! 26: * D * R - L * E = scale * F
! 27: *
! 28: * using Level 1 and 2 BLAS, where R and L are unknown M-by-N matrices,
! 29: * (A, D), (B, E) and (C, F) are given matrix pairs of size M-by-M,
! 30: * N-by-N and M-by-N, respectively. A, B, D and E are upper triangular
! 31: * (i.e., (A,D) and (B,E) in generalized Schur form).
! 32: *
! 33: * The solution (R, L) overwrites (C, F). 0 <= SCALE <= 1 is an output
! 34: * scaling factor chosen to avoid overflow.
! 35: *
! 36: * In matrix notation solving equation (1) corresponds to solve
! 37: * Zx = scale * b, where Z is defined as
! 38: *
! 39: * Z = [ kron(In, A) -kron(B', Im) ] (2)
! 40: * [ kron(In, D) -kron(E', Im) ],
! 41: *
! 42: * Ik is the identity matrix of size k and X' is the transpose of X.
! 43: * kron(X, Y) is the Kronecker product between the matrices X and Y.
! 44: *
! 45: * If TRANS = 'C', y in the conjugate transposed system Z'y = scale*b
! 46: * is solved for, which is equivalent to solve for R and L in
! 47: *
! 48: * A' * R + D' * L = scale * C (3)
! 49: * R * B' + L * E' = scale * -F
! 50: *
! 51: * This case is used to compute an estimate of Dif[(A, D), (B, E)] =
! 52: * = sigma_min(Z) using reverse communicaton with ZLACON.
! 53: *
! 54: * ZTGSY2 also (IJOB >= 1) contributes to the computation in ZTGSYL
! 55: * of an upper bound on the separation between to matrix pairs. Then
! 56: * the input (A, D), (B, E) are sub-pencils of two matrix pairs in
! 57: * ZTGSYL.
! 58: *
! 59: * Arguments
! 60: * =========
! 61: *
! 62: * TRANS (input) CHARACTER*1
! 63: * = 'N', solve the generalized Sylvester equation (1).
! 64: * = 'T': solve the 'transposed' system (3).
! 65: *
! 66: * IJOB (input) INTEGER
! 67: * Specifies what kind of functionality to be performed.
! 68: * =0: solve (1) only.
! 69: * =1: A contribution from this subsystem to a Frobenius
! 70: * norm-based estimate of the separation between two matrix
! 71: * pairs is computed. (look ahead strategy is used).
! 72: * =2: A contribution from this subsystem to a Frobenius
! 73: * norm-based estimate of the separation between two matrix
! 74: * pairs is computed. (DGECON on sub-systems is used.)
! 75: * Not referenced if TRANS = 'T'.
! 76: *
! 77: * M (input) INTEGER
! 78: * On entry, M specifies the order of A and D, and the row
! 79: * dimension of C, F, R and L.
! 80: *
! 81: * N (input) INTEGER
! 82: * On entry, N specifies the order of B and E, and the column
! 83: * dimension of C, F, R and L.
! 84: *
! 85: * A (input) COMPLEX*16 array, dimension (LDA, M)
! 86: * On entry, A contains an upper triangular matrix.
! 87: *
! 88: * LDA (input) INTEGER
! 89: * The leading dimension of the matrix A. LDA >= max(1, M).
! 90: *
! 91: * B (input) COMPLEX*16 array, dimension (LDB, N)
! 92: * On entry, B contains an upper triangular matrix.
! 93: *
! 94: * LDB (input) INTEGER
! 95: * The leading dimension of the matrix B. LDB >= max(1, N).
! 96: *
! 97: * C (input/output) COMPLEX*16 array, dimension (LDC, N)
! 98: * On entry, C contains the right-hand-side of the first matrix
! 99: * equation in (1).
! 100: * On exit, if IJOB = 0, C has been overwritten by the solution
! 101: * R.
! 102: *
! 103: * LDC (input) INTEGER
! 104: * The leading dimension of the matrix C. LDC >= max(1, M).
! 105: *
! 106: * D (input) COMPLEX*16 array, dimension (LDD, M)
! 107: * On entry, D contains an upper triangular matrix.
! 108: *
! 109: * LDD (input) INTEGER
! 110: * The leading dimension of the matrix D. LDD >= max(1, M).
! 111: *
! 112: * E (input) COMPLEX*16 array, dimension (LDE, N)
! 113: * On entry, E contains an upper triangular matrix.
! 114: *
! 115: * LDE (input) INTEGER
! 116: * The leading dimension of the matrix E. LDE >= max(1, N).
! 117: *
! 118: * F (input/output) COMPLEX*16 array, dimension (LDF, N)
! 119: * On entry, F contains the right-hand-side of the second matrix
! 120: * equation in (1).
! 121: * On exit, if IJOB = 0, F has been overwritten by the solution
! 122: * L.
! 123: *
! 124: * LDF (input) INTEGER
! 125: * The leading dimension of the matrix F. LDF >= max(1, M).
! 126: *
! 127: * SCALE (output) DOUBLE PRECISION
! 128: * On exit, 0 <= SCALE <= 1. If 0 < SCALE < 1, the solutions
! 129: * R and L (C and F on entry) will hold the solutions to a
! 130: * slightly perturbed system but the input matrices A, B, D and
! 131: * E have not been changed. If SCALE = 0, R and L will hold the
! 132: * solutions to the homogeneous system with C = F = 0.
! 133: * Normally, SCALE = 1.
! 134: *
! 135: * RDSUM (input/output) DOUBLE PRECISION
! 136: * On entry, the sum of squares of computed contributions to
! 137: * the Dif-estimate under computation by ZTGSYL, where the
! 138: * scaling factor RDSCAL (see below) has been factored out.
! 139: * On exit, the corresponding sum of squares updated with the
! 140: * contributions from the current sub-system.
! 141: * If TRANS = 'T' RDSUM is not touched.
! 142: * NOTE: RDSUM only makes sense when ZTGSY2 is called by
! 143: * ZTGSYL.
! 144: *
! 145: * RDSCAL (input/output) DOUBLE PRECISION
! 146: * On entry, scaling factor used to prevent overflow in RDSUM.
! 147: * On exit, RDSCAL is updated w.r.t. the current contributions
! 148: * in RDSUM.
! 149: * If TRANS = 'T', RDSCAL is not touched.
! 150: * NOTE: RDSCAL only makes sense when ZTGSY2 is called by
! 151: * ZTGSYL.
! 152: *
! 153: * INFO (output) INTEGER
! 154: * On exit, if INFO is set to
! 155: * =0: Successful exit
! 156: * <0: If INFO = -i, input argument number i is illegal.
! 157: * >0: The matrix pairs (A, D) and (B, E) have common or very
! 158: * close eigenvalues.
! 159: *
! 160: * Further Details
! 161: * ===============
! 162: *
! 163: * Based on contributions by
! 164: * Bo Kagstrom and Peter Poromaa, Department of Computing Science,
! 165: * Umea University, S-901 87 Umea, Sweden.
! 166: *
! 167: * =====================================================================
! 168: *
! 169: * .. Parameters ..
! 170: DOUBLE PRECISION ZERO, ONE
! 171: INTEGER LDZ
! 172: PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0, LDZ = 2 )
! 173: * ..
! 174: * .. Local Scalars ..
! 175: LOGICAL NOTRAN
! 176: INTEGER I, IERR, J, K
! 177: DOUBLE PRECISION SCALOC
! 178: COMPLEX*16 ALPHA
! 179: * ..
! 180: * .. Local Arrays ..
! 181: INTEGER IPIV( LDZ ), JPIV( LDZ )
! 182: COMPLEX*16 RHS( LDZ ), Z( LDZ, LDZ )
! 183: * ..
! 184: * .. External Functions ..
! 185: LOGICAL LSAME
! 186: EXTERNAL LSAME
! 187: * ..
! 188: * .. External Subroutines ..
! 189: EXTERNAL XERBLA, ZAXPY, ZGESC2, ZGETC2, ZLATDF, ZSCAL
! 190: * ..
! 191: * .. Intrinsic Functions ..
! 192: INTRINSIC DCMPLX, DCONJG, MAX
! 193: * ..
! 194: * .. Executable Statements ..
! 195: *
! 196: * Decode and test input parameters
! 197: *
! 198: INFO = 0
! 199: IERR = 0
! 200: NOTRAN = LSAME( TRANS, 'N' )
! 201: IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN
! 202: INFO = -1
! 203: ELSE IF( NOTRAN ) THEN
! 204: IF( ( IJOB.LT.0 ) .OR. ( IJOB.GT.2 ) ) THEN
! 205: INFO = -2
! 206: END IF
! 207: END IF
! 208: IF( INFO.EQ.0 ) THEN
! 209: IF( M.LE.0 ) THEN
! 210: INFO = -3
! 211: ELSE IF( N.LE.0 ) THEN
! 212: INFO = -4
! 213: ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
! 214: INFO = -5
! 215: ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
! 216: INFO = -8
! 217: ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
! 218: INFO = -10
! 219: ELSE IF( LDD.LT.MAX( 1, M ) ) THEN
! 220: INFO = -12
! 221: ELSE IF( LDE.LT.MAX( 1, N ) ) THEN
! 222: INFO = -14
! 223: ELSE IF( LDF.LT.MAX( 1, M ) ) THEN
! 224: INFO = -16
! 225: END IF
! 226: END IF
! 227: IF( INFO.NE.0 ) THEN
! 228: CALL XERBLA( 'ZTGSY2', -INFO )
! 229: RETURN
! 230: END IF
! 231: *
! 232: IF( NOTRAN ) THEN
! 233: *
! 234: * Solve (I, J) - system
! 235: * A(I, I) * R(I, J) - L(I, J) * B(J, J) = C(I, J)
! 236: * D(I, I) * R(I, J) - L(I, J) * E(J, J) = F(I, J)
! 237: * for I = M, M - 1, ..., 1; J = 1, 2, ..., N
! 238: *
! 239: SCALE = ONE
! 240: SCALOC = ONE
! 241: DO 30 J = 1, N
! 242: DO 20 I = M, 1, -1
! 243: *
! 244: * Build 2 by 2 system
! 245: *
! 246: Z( 1, 1 ) = A( I, I )
! 247: Z( 2, 1 ) = D( I, I )
! 248: Z( 1, 2 ) = -B( J, J )
! 249: Z( 2, 2 ) = -E( J, J )
! 250: *
! 251: * Set up right hand side(s)
! 252: *
! 253: RHS( 1 ) = C( I, J )
! 254: RHS( 2 ) = F( I, J )
! 255: *
! 256: * Solve Z * x = RHS
! 257: *
! 258: CALL ZGETC2( LDZ, Z, LDZ, IPIV, JPIV, IERR )
! 259: IF( IERR.GT.0 )
! 260: $ INFO = IERR
! 261: IF( IJOB.EQ.0 ) THEN
! 262: CALL ZGESC2( LDZ, Z, LDZ, RHS, IPIV, JPIV, SCALOC )
! 263: IF( SCALOC.NE.ONE ) THEN
! 264: DO 10 K = 1, N
! 265: CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ),
! 266: $ C( 1, K ), 1 )
! 267: CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ),
! 268: $ F( 1, K ), 1 )
! 269: 10 CONTINUE
! 270: SCALE = SCALE*SCALOC
! 271: END IF
! 272: ELSE
! 273: CALL ZLATDF( IJOB, LDZ, Z, LDZ, RHS, RDSUM, RDSCAL,
! 274: $ IPIV, JPIV )
! 275: END IF
! 276: *
! 277: * Unpack solution vector(s)
! 278: *
! 279: C( I, J ) = RHS( 1 )
! 280: F( I, J ) = RHS( 2 )
! 281: *
! 282: * Substitute R(I, J) and L(I, J) into remaining equation.
! 283: *
! 284: IF( I.GT.1 ) THEN
! 285: ALPHA = -RHS( 1 )
! 286: CALL ZAXPY( I-1, ALPHA, A( 1, I ), 1, C( 1, J ), 1 )
! 287: CALL ZAXPY( I-1, ALPHA, D( 1, I ), 1, F( 1, J ), 1 )
! 288: END IF
! 289: IF( J.LT.N ) THEN
! 290: CALL ZAXPY( N-J, RHS( 2 ), B( J, J+1 ), LDB,
! 291: $ C( I, J+1 ), LDC )
! 292: CALL ZAXPY( N-J, RHS( 2 ), E( J, J+1 ), LDE,
! 293: $ F( I, J+1 ), LDF )
! 294: END IF
! 295: *
! 296: 20 CONTINUE
! 297: 30 CONTINUE
! 298: ELSE
! 299: *
! 300: * Solve transposed (I, J) - system:
! 301: * A(I, I)' * R(I, J) + D(I, I)' * L(J, J) = C(I, J)
! 302: * R(I, I) * B(J, J) + L(I, J) * E(J, J) = -F(I, J)
! 303: * for I = 1, 2, ..., M, J = N, N - 1, ..., 1
! 304: *
! 305: SCALE = ONE
! 306: SCALOC = ONE
! 307: DO 80 I = 1, M
! 308: DO 70 J = N, 1, -1
! 309: *
! 310: * Build 2 by 2 system Z'
! 311: *
! 312: Z( 1, 1 ) = DCONJG( A( I, I ) )
! 313: Z( 2, 1 ) = -DCONJG( B( J, J ) )
! 314: Z( 1, 2 ) = DCONJG( D( I, I ) )
! 315: Z( 2, 2 ) = -DCONJG( E( J, J ) )
! 316: *
! 317: *
! 318: * Set up right hand side(s)
! 319: *
! 320: RHS( 1 ) = C( I, J )
! 321: RHS( 2 ) = F( I, J )
! 322: *
! 323: * Solve Z' * x = RHS
! 324: *
! 325: CALL ZGETC2( LDZ, Z, LDZ, IPIV, JPIV, IERR )
! 326: IF( IERR.GT.0 )
! 327: $ INFO = IERR
! 328: CALL ZGESC2( LDZ, Z, LDZ, RHS, IPIV, JPIV, SCALOC )
! 329: IF( SCALOC.NE.ONE ) THEN
! 330: DO 40 K = 1, N
! 331: CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ), C( 1, K ),
! 332: $ 1 )
! 333: CALL ZSCAL( M, DCMPLX( SCALOC, ZERO ), F( 1, K ),
! 334: $ 1 )
! 335: 40 CONTINUE
! 336: SCALE = SCALE*SCALOC
! 337: END IF
! 338: *
! 339: * Unpack solution vector(s)
! 340: *
! 341: C( I, J ) = RHS( 1 )
! 342: F( I, J ) = RHS( 2 )
! 343: *
! 344: * Substitute R(I, J) and L(I, J) into remaining equation.
! 345: *
! 346: DO 50 K = 1, J - 1
! 347: F( I, K ) = F( I, K ) + RHS( 1 )*DCONJG( B( K, J ) ) +
! 348: $ RHS( 2 )*DCONJG( E( K, J ) )
! 349: 50 CONTINUE
! 350: DO 60 K = I + 1, M
! 351: C( K, J ) = C( K, J ) - DCONJG( A( I, K ) )*RHS( 1 ) -
! 352: $ DCONJG( D( I, K ) )*RHS( 2 )
! 353: 60 CONTINUE
! 354: *
! 355: 70 CONTINUE
! 356: 80 CONTINUE
! 357: END IF
! 358: RETURN
! 359: *
! 360: * End of ZTGSY2
! 361: *
! 362: END
CVSweb interface <joel.bertrand@systella.fr>