48f504ea713e2034de0bfd666c90cd3cce3b56cc
[platform/upstream/lapack.git] / SRC / dorghr.f
1 *> \brief \b DORGHR
2 *
3 *  =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at 
6 *            http://www.netlib.org/lapack/explore-html/ 
7 *
8 *> \htmlonly
9 *> Download DORGHR + dependencies 
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dorghr.f"> 
11 *> [TGZ]</a> 
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dorghr.f"> 
13 *> [ZIP]</a> 
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dorghr.f"> 
15 *> [TXT]</a>
16 *> \endhtmlonly 
17 *
18 *  Definition:
19 *  ===========
20 *
21 *       SUBROUTINE DORGHR( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
22
23 *       .. Scalar Arguments ..
24 *       INTEGER            IHI, ILO, INFO, LDA, LWORK, N
25 *       ..
26 *       .. Array Arguments ..
27 *       DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
28 *       ..
29 *  
30 *
31 *> \par Purpose:
32 *  =============
33 *>
34 *> \verbatim
35 *>
36 *> DORGHR generates a real orthogonal matrix Q which is defined as the
37 *> product of IHI-ILO elementary reflectors of order N, as returned by
38 *> DGEHRD:
39 *>
40 *> Q = H(ilo) H(ilo+1) . . . H(ihi-1).
41 *> \endverbatim
42 *
43 *  Arguments:
44 *  ==========
45 *
46 *> \param[in] N
47 *> \verbatim
48 *>          N is INTEGER
49 *>          The order of the matrix Q. N >= 0.
50 *> \endverbatim
51 *>
52 *> \param[in] ILO
53 *> \verbatim
54 *>          ILO is INTEGER
55 *> \endverbatim
56 *>
57 *> \param[in] IHI
58 *> \verbatim
59 *>          IHI is INTEGER
60 *>
61 *>          ILO and IHI must have the same values as in the previous call
62 *>          of DGEHRD. Q is equal to the unit matrix except in the
63 *>          submatrix Q(ilo+1:ihi,ilo+1:ihi).
64 *>          1 <= ILO <= IHI <= N, if N > 0; ILO=1 and IHI=0, if N=0.
65 *> \endverbatim
66 *>
67 *> \param[in,out] A
68 *> \verbatim
69 *>          A is DOUBLE PRECISION array, dimension (LDA,N)
70 *>          On entry, the vectors which define the elementary reflectors,
71 *>          as returned by DGEHRD.
72 *>          On exit, the N-by-N orthogonal matrix Q.
73 *> \endverbatim
74 *>
75 *> \param[in] LDA
76 *> \verbatim
77 *>          LDA is INTEGER
78 *>          The leading dimension of the array A. LDA >= max(1,N).
79 *> \endverbatim
80 *>
81 *> \param[in] TAU
82 *> \verbatim
83 *>          TAU is DOUBLE PRECISION array, dimension (N-1)
84 *>          TAU(i) must contain the scalar factor of the elementary
85 *>          reflector H(i), as returned by DGEHRD.
86 *> \endverbatim
87 *>
88 *> \param[out] WORK
89 *> \verbatim
90 *>          WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
91 *>          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
92 *> \endverbatim
93 *>
94 *> \param[in] LWORK
95 *> \verbatim
96 *>          LWORK is INTEGER
97 *>          The dimension of the array WORK. LWORK >= IHI-ILO.
98 *>          For optimum performance LWORK >= (IHI-ILO)*NB, where NB is
99 *>          the optimal blocksize.
100 *>
101 *>          If LWORK = -1, then a workspace query is assumed; the routine
102 *>          only calculates the optimal size of the WORK array, returns
103 *>          this value as the first entry of the WORK array, and no error
104 *>          message related to LWORK is issued by XERBLA.
105 *> \endverbatim
106 *>
107 *> \param[out] INFO
108 *> \verbatim
109 *>          INFO is INTEGER
110 *>          = 0:  successful exit
111 *>          < 0:  if INFO = -i, the i-th argument had an illegal value
112 *> \endverbatim
113 *
114 *  Authors:
115 *  ========
116 *
117 *> \author Univ. of Tennessee 
118 *> \author Univ. of California Berkeley 
119 *> \author Univ. of Colorado Denver 
120 *> \author NAG Ltd. 
121 *
122 *> \date November 2011
123 *
124 *> \ingroup doubleOTHERcomputational
125 *
126 *  =====================================================================
127       SUBROUTINE DORGHR( N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO )
128 *
129 *  -- LAPACK computational routine (version 3.4.0) --
130 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
131 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
132 *     November 2011
133 *
134 *     .. Scalar Arguments ..
135       INTEGER            IHI, ILO, INFO, LDA, LWORK, N
136 *     ..
137 *     .. Array Arguments ..
138       DOUBLE PRECISION   A( LDA, * ), TAU( * ), WORK( * )
139 *     ..
140 *
141 *  =====================================================================
142 *
143 *     .. Parameters ..
144       DOUBLE PRECISION   ZERO, ONE
145       PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0 )
146 *     ..
147 *     .. Local Scalars ..
148       LOGICAL            LQUERY
149       INTEGER            I, IINFO, J, LWKOPT, NB, NH
150 *     ..
151 *     .. External Subroutines ..
152       EXTERNAL           DORGQR, XERBLA
153 *     ..
154 *     .. External Functions ..
155       INTEGER            ILAENV
156       EXTERNAL           ILAENV
157 *     ..
158 *     .. Intrinsic Functions ..
159       INTRINSIC          MAX, MIN
160 *     ..
161 *     .. Executable Statements ..
162 *
163 *     Test the input arguments
164 *
165       INFO = 0
166       NH = IHI - ILO
167       LQUERY = ( LWORK.EQ.-1 )
168       IF( N.LT.0 ) THEN
169          INFO = -1
170       ELSE IF( ILO.LT.1 .OR. ILO.GT.MAX( 1, N ) ) THEN
171          INFO = -2
172       ELSE IF( IHI.LT.MIN( ILO, N ) .OR. IHI.GT.N ) THEN
173          INFO = -3
174       ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
175          INFO = -5
176       ELSE IF( LWORK.LT.MAX( 1, NH ) .AND. .NOT.LQUERY ) THEN
177          INFO = -8
178       END IF
179 *
180       IF( INFO.EQ.0 ) THEN
181          NB = ILAENV( 1, 'DORGQR', ' ', NH, NH, NH, -1 )
182          LWKOPT = MAX( 1, NH )*NB
183          WORK( 1 ) = LWKOPT
184       END IF
185 *
186       IF( INFO.NE.0 ) THEN
187          CALL XERBLA( 'DORGHR', -INFO )
188          RETURN
189       ELSE IF( LQUERY ) THEN
190          RETURN
191       END IF
192 *
193 *     Quick return if possible
194 *
195       IF( N.EQ.0 ) THEN
196          WORK( 1 ) = 1
197          RETURN
198       END IF
199 *
200 *     Shift the vectors which define the elementary reflectors one
201 *     column to the right, and set the first ilo and the last n-ihi
202 *     rows and columns to those of the unit matrix
203 *
204       DO 40 J = IHI, ILO + 1, -1
205          DO 10 I = 1, J - 1
206             A( I, J ) = ZERO
207    10    CONTINUE
208          DO 20 I = J + 1, IHI
209             A( I, J ) = A( I, J-1 )
210    20    CONTINUE
211          DO 30 I = IHI + 1, N
212             A( I, J ) = ZERO
213    30    CONTINUE
214    40 CONTINUE
215       DO 60 J = 1, ILO
216          DO 50 I = 1, N
217             A( I, J ) = ZERO
218    50    CONTINUE
219          A( J, J ) = ONE
220    60 CONTINUE
221       DO 80 J = IHI + 1, N
222          DO 70 I = 1, N
223             A( I, J ) = ZERO
224    70    CONTINUE
225          A( J, J ) = ONE
226    80 CONTINUE
227 *
228       IF( NH.GT.0 ) THEN
229 *
230 *        Generate Q(ilo+1:ihi,ilo+1:ihi)
231 *
232          CALL DORGQR( NH, NH, NH, A( ILO+1, ILO+1 ), LDA, TAU( ILO ),
233      $                WORK, LWORK, IINFO )
234       END IF
235       WORK( 1 ) = LWKOPT
236       RETURN
237 *
238 *     End of DORGHR
239 *
240       END