Annotation of rpl/lapack/lapack/zunmhr.f, revision 1.2
1.1 bertrand 1: SUBROUTINE ZUNMHR( SIDE, TRANS, M, N, ILO, IHI, A, LDA, TAU, C,
2: $ LDC, WORK, LWORK, INFO )
3: *
4: * -- LAPACK routine (version 3.2) --
5: * -- LAPACK is a software package provided by Univ. of Tennessee, --
6: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
7: * November 2006
8: *
9: * .. Scalar Arguments ..
10: CHARACTER SIDE, TRANS
11: INTEGER IHI, ILO, INFO, LDA, LDC, LWORK, M, N
12: * ..
13: * .. Array Arguments ..
14: COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
15: * ..
16: *
17: * Purpose
18: * =======
19: *
20: * ZUNMHR overwrites the general complex M-by-N matrix C with
21: *
22: * SIDE = 'L' SIDE = 'R'
23: * TRANS = 'N': Q * C C * Q
24: * TRANS = 'C': Q**H * C C * Q**H
25: *
26: * where Q is a complex unitary matrix of order nq, with nq = m if
27: * SIDE = 'L' and nq = n if SIDE = 'R'. Q is defined as the product of
28: * IHI-ILO elementary reflectors, as returned by ZGEHRD:
29: *
30: * Q = H(ilo) H(ilo+1) . . . H(ihi-1).
31: *
32: * Arguments
33: * =========
34: *
35: * SIDE (input) CHARACTER*1
36: * = 'L': apply Q or Q**H from the Left;
37: * = 'R': apply Q or Q**H from the Right.
38: *
39: * TRANS (input) CHARACTER*1
40: * = 'N': apply Q (No transpose)
41: * = 'C': apply Q**H (Conjugate transpose)
42: *
43: * M (input) INTEGER
44: * The number of rows of the matrix C. M >= 0.
45: *
46: * N (input) INTEGER
47: * The number of columns of the matrix C. N >= 0.
48: *
49: * ILO (input) INTEGER
50: * IHI (input) INTEGER
51: * ILO and IHI must have the same values as in the previous call
52: * of ZGEHRD. Q is equal to the unit matrix except in the
53: * submatrix Q(ilo+1:ihi,ilo+1:ihi).
54: * If SIDE = 'L', then 1 <= ILO <= IHI <= M, if M > 0, and
55: * ILO = 1 and IHI = 0, if M = 0;
56: * if SIDE = 'R', then 1 <= ILO <= IHI <= N, if N > 0, and
57: * ILO = 1 and IHI = 0, if N = 0.
58: *
59: * A (input) COMPLEX*16 array, dimension
60: * (LDA,M) if SIDE = 'L'
61: * (LDA,N) if SIDE = 'R'
62: * The vectors which define the elementary reflectors, as
63: * returned by ZGEHRD.
64: *
65: * LDA (input) INTEGER
66: * The leading dimension of the array A.
67: * LDA >= max(1,M) if SIDE = 'L'; LDA >= max(1,N) if SIDE = 'R'.
68: *
69: * TAU (input) COMPLEX*16 array, dimension
70: * (M-1) if SIDE = 'L'
71: * (N-1) if SIDE = 'R'
72: * TAU(i) must contain the scalar factor of the elementary
73: * reflector H(i), as returned by ZGEHRD.
74: *
75: * C (input/output) COMPLEX*16 array, dimension (LDC,N)
76: * On entry, the M-by-N matrix C.
77: * On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q.
78: *
79: * LDC (input) INTEGER
80: * The leading dimension of the array C. LDC >= max(1,M).
81: *
82: * WORK (workspace/output) COMPLEX*16 array, dimension (MAX(1,LWORK))
83: * On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
84: *
85: * LWORK (input) INTEGER
86: * The dimension of the array WORK.
87: * If SIDE = 'L', LWORK >= max(1,N);
88: * if SIDE = 'R', LWORK >= max(1,M).
89: * For optimum performance LWORK >= N*NB if SIDE = 'L', and
90: * LWORK >= M*NB if SIDE = 'R', where NB is the optimal
91: * blocksize.
92: *
93: * If LWORK = -1, then a workspace query is assumed; the routine
94: * only calculates the optimal size of the WORK array, returns
95: * this value as the first entry of the WORK array, and no error
96: * message related to LWORK is issued by XERBLA.
97: *
98: * INFO (output) INTEGER
99: * = 0: successful exit
100: * < 0: if INFO = -i, the i-th argument had an illegal value
101: *
102: * =====================================================================
103: *
104: * .. Local Scalars ..
105: LOGICAL LEFT, LQUERY
106: INTEGER I1, I2, IINFO, LWKOPT, MI, NB, NH, NI, NQ, NW
107: * ..
108: * .. External Functions ..
109: LOGICAL LSAME
110: INTEGER ILAENV
111: EXTERNAL LSAME, ILAENV
112: * ..
113: * .. External Subroutines ..
114: EXTERNAL XERBLA, ZUNMQR
115: * ..
116: * .. Intrinsic Functions ..
117: INTRINSIC MAX, MIN
118: * ..
119: * .. Executable Statements ..
120: *
121: * Test the input arguments
122: *
123: INFO = 0
124: NH = IHI - ILO
125: LEFT = LSAME( SIDE, 'L' )
126: LQUERY = ( LWORK.EQ.-1 )
127: *
128: * NQ is the order of Q and NW is the minimum dimension of WORK
129: *
130: IF( LEFT ) THEN
131: NQ = M
132: NW = N
133: ELSE
134: NQ = N
135: NW = M
136: END IF
137: IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
138: INFO = -1
139: ELSE IF( .NOT.LSAME( TRANS, 'N' ) .AND. .NOT.LSAME( TRANS, 'C' ) )
140: $ THEN
141: INFO = -2
142: ELSE IF( M.LT.0 ) THEN
143: INFO = -3
144: ELSE IF( N.LT.0 ) THEN
145: INFO = -4
146: ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, NQ ) ) THEN
147: INFO = -5
148: ELSE IF( IHI.LT.MIN( ILO, NQ ) .OR. IHI.GT.NQ ) THEN
149: INFO = -6
150: ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN
151: INFO = -8
152: ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
153: INFO = -11
154: ELSE IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
155: INFO = -13
156: END IF
157: *
158: IF( INFO.EQ.0 ) THEN
159: IF( LEFT ) THEN
160: NB = ILAENV( 1, 'ZUNMQR', SIDE // TRANS, NH, N, NH, -1 )
161: ELSE
162: NB = ILAENV( 1, 'ZUNMQR', SIDE // TRANS, M, NH, NH, -1 )
163: END IF
164: LWKOPT = MAX( 1, NW )*NB
165: WORK( 1 ) = LWKOPT
166: END IF
167: *
168: IF( INFO.NE.0 ) THEN
169: CALL XERBLA( 'ZUNMHR', -INFO )
170: RETURN
171: ELSE IF( LQUERY ) THEN
172: RETURN
173: END IF
174: *
175: * Quick return if possible
176: *
177: IF( M.EQ.0 .OR. N.EQ.0 .OR. NH.EQ.0 ) THEN
178: WORK( 1 ) = 1
179: RETURN
180: END IF
181: *
182: IF( LEFT ) THEN
183: MI = NH
184: NI = N
185: I1 = ILO + 1
186: I2 = 1
187: ELSE
188: MI = M
189: NI = NH
190: I1 = 1
191: I2 = ILO + 1
192: END IF
193: *
194: CALL ZUNMQR( SIDE, TRANS, MI, NI, NH, A( ILO+1, ILO ), LDA,
195: $ TAU( ILO ), C( I1, I2 ), LDC, WORK, LWORK, IINFO )
196: *
197: WORK( 1 ) = LWKOPT
198: RETURN
199: *
200: * End of ZUNMHR
201: *
202: END
CVSweb interface <joel.bertrand@systella.fr>