118{
119
120 integer a_dim1, a_offset, i__1, i__2, i__3, i__4;
121
123 extern logical lsame_(
char *,
char *);
126 extern
127 int xerbla_(
char *,
integer *);
129 extern
130 int cungql_(
integer *,
integer *,
integer *,
complex *,
integer *,
complex *,
complex *,
integer *,
integer *),
cungqr_fla(
integer *,
integer *,
integer *,
complex *,
integer *,
complex *,
complex *,
integer *,
integer *);
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155 a_dim1 = *lda;
156 a_offset = 1 + a_dim1;
157 a -= a_offset;
158 --tau;
159 --work;
160
161 *info = 0;
162 lquery = *lwork == -1;
163 upper = lsame_(uplo, "U");
164 if (! upper && ! lsame_(uplo, "L"))
165 {
166 *info = -1;
167 }
168 else if (*n < 0)
169 {
170 *info = -2;
171 }
172 else if (*lda < max(1,*n))
173 {
174 *info = -4;
175 }
176 else
177 {
178
179 i__1 = 1;
180 i__2 = *n - 1;
181 if (*lwork < max(i__1,i__2) && ! lquery)
182 {
183 *info = -7;
184 }
185 }
186 if (*info == 0)
187 {
188 if (upper)
189 {
190 i__1 = *n - 1;
191 i__2 = *n - 1;
192 i__3 = *n - 1;
193 nb = ilaenv_(&c__1, "CUNGQL", " ", &i__1, &i__2, &i__3, &c_n1);
194 }
195 else
196 {
197 i__1 = *n - 1;
198 i__2 = *n - 1;
199 i__3 = *n - 1;
200 nb = ilaenv_(&c__1, "CUNGQR", " ", &i__1, &i__2, &i__3, &c_n1);
201 }
202
203 i__1 = 1;
204 i__2 = *n - 1;
205 lwkopt = max(i__1,i__2) * nb;
206 work[1].
r = (
real) lwkopt;
208 }
209 if (*info != 0)
210 {
211 i__1 = -(*info);
212 xerbla_("CUNGTR", &i__1);
213 return 0;
214 }
215 else if (lquery)
216 {
217 return 0;
218 }
219
220 if (*n == 0)
221 {
224 return 0;
225 }
226 if (upper)
227 {
228
229
230
231
232 i__1 = *n - 1;
233 for (j = 1;
234 j <= i__1;
235 ++j)
236 {
237 i__2 = j - 1;
238 for (i__ = 1;
239 i__ <= i__2;
240 ++i__)
241 {
242 i__3 = i__ + j * a_dim1;
243 i__4 = i__ + (j + 1) * a_dim1;
244 a[i__3].
r = a[i__4].
r;
245 a[i__3].
i = a[i__4].
i;
246
247 }
248 i__2 = *n + j * a_dim1;
251
252 }
253 i__1 = *n - 1;
254 for (i__ = 1;
255 i__ <= i__1;
256 ++i__)
257 {
258 i__2 = i__ + *n * a_dim1;
261
262 }
263 i__1 = *n + *n * a_dim1;
266
267 i__1 = *n - 1;
268 i__2 = *n - 1;
269 i__3 = *n - 1;
270 cungql_(&i__1, &i__2, &i__3, &a[a_offset], lda, &tau[1], &work[1], lwork, &iinfo);
271 }
272 else
273 {
274
275
276
277
278 for (j = *n;
279 j >= 2;
280 --j)
281 {
282 i__1 = j * a_dim1 + 1;
285 i__1 = *n;
286 for (i__ = j + 1;
287 i__ <= i__1;
288 ++i__)
289 {
290 i__2 = i__ + j * a_dim1;
291 i__3 = i__ + (j - 1) * a_dim1;
292 a[i__2].
r = a[i__3].
r;
293 a[i__2].
i = a[i__3].
i;
294
295 }
296
297 }
298 i__1 = a_dim1 + 1;
301 i__1 = *n;
302 for (i__ = 2;
303 i__ <= i__1;
304 ++i__)
305 {
306 i__2 = i__ + a_dim1;
309
310 }
311 if (*n > 1)
312 {
313
314 i__1 = *n - 1;
315 i__2 = *n - 1;
316 i__3 = *n - 1;
317 cungqr_fla(&i__1, &i__2, &i__3, &a[(a_dim1 << 1) + 2], lda, &tau[1], &work[1], lwork, &iinfo);
318 }
319 }
320 work[1].
r = (
real) lwkopt;
322 return 0;
323
324}
int integer
Definition FLA_f2c.h:25
int logical
Definition FLA_f2c.h:36
float real
Definition FLA_f2c.h:30
int cungqr_fla(integer *m, integer *n, integer *k, complex *a, integer *lda, complex *tau, complex *work, integer *lwork, integer *info)
Definition cungqr.c:123
real r
Definition FLA_f2c.h:32
real i
Definition FLA_f2c.h:32