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