Annotation of rpl/lapack/lapack/dormhr.f, revision 1.16
1.8 bertrand 1: *> \brief \b DORMHR
2: *
3: * =========== DOCUMENTATION ===========
4: *
1.14 bertrand 5: * Online html documentation available at
6: * http://www.netlib.org/lapack/explore-html/
1.8 bertrand 7: *
8: *> \htmlonly
1.14 bertrand 9: *> Download DORMHR + dependencies
10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dormhr.f">
11: *> [TGZ]</a>
12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dormhr.f">
13: *> [ZIP]</a>
14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dormhr.f">
1.8 bertrand 15: *> [TXT]</a>
1.14 bertrand 16: *> \endhtmlonly
1.8 bertrand 17: *
18: * Definition:
19: * ===========
20: *
21: * SUBROUTINE DORMHR( SIDE, TRANS, M, N, ILO, IHI, A, LDA, TAU, C,
22: * LDC, WORK, LWORK, INFO )
1.14 bertrand 23: *
1.8 bertrand 24: * .. Scalar Arguments ..
25: * CHARACTER SIDE, TRANS
26: * INTEGER IHI, ILO, INFO, LDA, LDC, LWORK, M, N
27: * ..
28: * .. Array Arguments ..
29: * DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
30: * ..
1.14 bertrand 31: *
1.8 bertrand 32: *
33: *> \par Purpose:
34: * =============
35: *>
36: *> \verbatim
37: *>
38: *> DORMHR overwrites the general real M-by-N matrix C with
39: *>
40: *> SIDE = 'L' SIDE = 'R'
41: *> TRANS = 'N': Q * C C * Q
42: *> TRANS = 'T': Q**T * C C * Q**T
43: *>
44: *> where Q is a real orthogonal matrix of order nq, with nq = m if
45: *> SIDE = 'L' and nq = n if SIDE = 'R'. Q is defined as the product of
46: *> IHI-ILO elementary reflectors, as returned by DGEHRD:
47: *>
48: *> Q = H(ilo) H(ilo+1) . . . H(ihi-1).
49: *> \endverbatim
50: *
51: * Arguments:
52: * ==========
53: *
54: *> \param[in] SIDE
55: *> \verbatim
56: *> SIDE is CHARACTER*1
57: *> = 'L': apply Q or Q**T from the Left;
58: *> = 'R': apply Q or Q**T from the Right.
59: *> \endverbatim
60: *>
61: *> \param[in] TRANS
62: *> \verbatim
63: *> TRANS is CHARACTER*1
64: *> = 'N': No transpose, apply Q;
65: *> = 'T': Transpose, apply Q**T.
66: *> \endverbatim
67: *>
68: *> \param[in] M
69: *> \verbatim
70: *> M is INTEGER
71: *> The number of rows of the matrix C. M >= 0.
72: *> \endverbatim
73: *>
74: *> \param[in] N
75: *> \verbatim
76: *> N is INTEGER
77: *> The number of columns of the matrix C. N >= 0.
78: *> \endverbatim
79: *>
80: *> \param[in] ILO
81: *> \verbatim
82: *> ILO is INTEGER
83: *> \endverbatim
84: *>
85: *> \param[in] IHI
86: *> \verbatim
87: *> IHI is INTEGER
88: *>
89: *> ILO and IHI must have the same values as in the previous call
90: *> of DGEHRD. Q is equal to the unit matrix except in the
91: *> submatrix Q(ilo+1:ihi,ilo+1:ihi).
92: *> If SIDE = 'L', then 1 <= ILO <= IHI <= M, if M > 0, and
93: *> ILO = 1 and IHI = 0, if M = 0;
94: *> if SIDE = 'R', then 1 <= ILO <= IHI <= N, if N > 0, and
95: *> ILO = 1 and IHI = 0, if N = 0.
96: *> \endverbatim
97: *>
98: *> \param[in] A
99: *> \verbatim
100: *> A is DOUBLE PRECISION array, dimension
101: *> (LDA,M) if SIDE = 'L'
102: *> (LDA,N) if SIDE = 'R'
103: *> The vectors which define the elementary reflectors, as
104: *> returned by DGEHRD.
105: *> \endverbatim
106: *>
107: *> \param[in] LDA
108: *> \verbatim
109: *> LDA is INTEGER
110: *> The leading dimension of the array A.
111: *> LDA >= max(1,M) if SIDE = 'L'; LDA >= max(1,N) if SIDE = 'R'.
112: *> \endverbatim
113: *>
114: *> \param[in] TAU
115: *> \verbatim
116: *> TAU is DOUBLE PRECISION array, dimension
117: *> (M-1) if SIDE = 'L'
118: *> (N-1) if SIDE = 'R'
119: *> TAU(i) must contain the scalar factor of the elementary
120: *> reflector H(i), as returned by DGEHRD.
121: *> \endverbatim
122: *>
123: *> \param[in,out] C
124: *> \verbatim
125: *> C is DOUBLE PRECISION array, dimension (LDC,N)
126: *> On entry, the M-by-N matrix C.
127: *> On exit, C is overwritten by Q*C or Q**T*C or C*Q**T or C*Q.
128: *> \endverbatim
129: *>
130: *> \param[in] LDC
131: *> \verbatim
132: *> LDC is INTEGER
133: *> The leading dimension of the array C. LDC >= max(1,M).
134: *> \endverbatim
135: *>
136: *> \param[out] WORK
137: *> \verbatim
138: *> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
139: *> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
140: *> \endverbatim
141: *>
142: *> \param[in] LWORK
143: *> \verbatim
144: *> LWORK is INTEGER
145: *> The dimension of the array WORK.
146: *> If SIDE = 'L', LWORK >= max(1,N);
147: *> if SIDE = 'R', LWORK >= max(1,M).
148: *> For optimum performance LWORK >= N*NB if SIDE = 'L', and
149: *> LWORK >= M*NB if SIDE = 'R', where NB is the optimal
150: *> blocksize.
151: *>
152: *> If LWORK = -1, then a workspace query is assumed; the routine
153: *> only calculates the optimal size of the WORK array, returns
154: *> this value as the first entry of the WORK array, and no error
155: *> message related to LWORK is issued by XERBLA.
156: *> \endverbatim
157: *>
158: *> \param[out] INFO
159: *> \verbatim
160: *> INFO is INTEGER
161: *> = 0: successful exit
162: *> < 0: if INFO = -i, the i-th argument had an illegal value
163: *> \endverbatim
164: *
165: * Authors:
166: * ========
167: *
1.14 bertrand 168: *> \author Univ. of Tennessee
169: *> \author Univ. of California Berkeley
170: *> \author Univ. of Colorado Denver
171: *> \author NAG Ltd.
1.8 bertrand 172: *
1.14 bertrand 173: *> \date December 2016
1.8 bertrand 174: *
175: *> \ingroup doubleOTHERcomputational
176: *
177: * =====================================================================
1.1 bertrand 178: SUBROUTINE DORMHR( SIDE, TRANS, M, N, ILO, IHI, A, LDA, TAU, C,
179: $ LDC, WORK, LWORK, INFO )
180: *
1.14 bertrand 181: * -- LAPACK computational routine (version 3.7.0) --
1.1 bertrand 182: * -- LAPACK is a software package provided by Univ. of Tennessee, --
183: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
1.14 bertrand 184: * December 2016
1.1 bertrand 185: *
186: * .. Scalar Arguments ..
187: CHARACTER SIDE, TRANS
188: INTEGER IHI, ILO, INFO, LDA, LDC, LWORK, M, N
189: * ..
190: * .. Array Arguments ..
191: DOUBLE PRECISION A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * )
192: * ..
193: *
194: * =====================================================================
195: *
196: * .. Local Scalars ..
197: LOGICAL LEFT, LQUERY
198: INTEGER I1, I2, IINFO, LWKOPT, MI, NB, NH, NI, NQ, NW
199: * ..
200: * .. External Functions ..
201: LOGICAL LSAME
202: INTEGER ILAENV
203: EXTERNAL LSAME, ILAENV
204: * ..
205: * .. External Subroutines ..
206: EXTERNAL DORMQR, XERBLA
207: * ..
208: * .. Intrinsic Functions ..
209: INTRINSIC MAX, MIN
210: * ..
211: * .. Executable Statements ..
212: *
213: * Test the input arguments
214: *
215: INFO = 0
216: NH = IHI - ILO
217: LEFT = LSAME( SIDE, 'L' )
218: LQUERY = ( LWORK.EQ.-1 )
219: *
220: * NQ is the order of Q and NW is the minimum dimension of WORK
221: *
222: IF( LEFT ) THEN
223: NQ = M
224: NW = N
225: ELSE
226: NQ = N
227: NW = M
228: END IF
229: IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN
230: INFO = -1
231: ELSE IF( .NOT.LSAME( TRANS, 'N' ) .AND. .NOT.LSAME( TRANS, 'T' ) )
232: $ THEN
233: INFO = -2
234: ELSE IF( M.LT.0 ) THEN
235: INFO = -3
236: ELSE IF( N.LT.0 ) THEN
237: INFO = -4
238: ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, NQ ) ) THEN
239: INFO = -5
240: ELSE IF( IHI.LT.MIN( ILO, NQ ) .OR. IHI.GT.NQ ) THEN
241: INFO = -6
242: ELSE IF( LDA.LT.MAX( 1, NQ ) ) THEN
243: INFO = -8
244: ELSE IF( LDC.LT.MAX( 1, M ) ) THEN
245: INFO = -11
246: ELSE IF( LWORK.LT.MAX( 1, NW ) .AND. .NOT.LQUERY ) THEN
247: INFO = -13
248: END IF
249: *
250: IF( INFO.EQ.0 ) THEN
251: IF( LEFT ) THEN
252: NB = ILAENV( 1, 'DORMQR', SIDE // TRANS, NH, N, NH, -1 )
253: ELSE
254: NB = ILAENV( 1, 'DORMQR', SIDE // TRANS, M, NH, NH, -1 )
255: END IF
256: LWKOPT = MAX( 1, NW )*NB
257: WORK( 1 ) = LWKOPT
258: END IF
259: *
260: IF( INFO.NE.0 ) THEN
261: CALL XERBLA( 'DORMHR', -INFO )
262: RETURN
263: ELSE IF( LQUERY ) THEN
264: RETURN
265: END IF
266: *
267: * Quick return if possible
268: *
269: IF( M.EQ.0 .OR. N.EQ.0 .OR. NH.EQ.0 ) THEN
270: WORK( 1 ) = 1
271: RETURN
272: END IF
273: *
274: IF( LEFT ) THEN
275: MI = NH
276: NI = N
277: I1 = ILO + 1
278: I2 = 1
279: ELSE
280: MI = M
281: NI = NH
282: I1 = 1
283: I2 = ILO + 1
284: END IF
285: *
286: CALL DORMQR( SIDE, TRANS, MI, NI, NH, A( ILO+1, ILO ), LDA,
287: $ TAU( ILO ), C( I1, I2 ), LDC, WORK, LWORK, IINFO )
288: *
289: WORK( 1 ) = LWKOPT
290: RETURN
291: *
292: * End of DORMHR
293: *
294: END
CVSweb interface <joel.bertrand@systella.fr>