193{
194
195 integer a_dim1, a_offset, i__1, i__2, i__3, i__4, i__5;
197
198 integer i__, j, nb, kk, nx, iws;
199 extern logical lsame_(
char *,
char *);
202 extern
203 int zhetd2_fla(
char *,
integer *,
doublecomplex *,
integer *,
doublereal *,
doublereal *,
doublecomplex *,
integer *), zher2k_(
char *,
char *,
integer *,
integer *,
doublecomplex *,
doublecomplex *,
integer *,
doublecomplex *,
integer *,
doublereal *,
doublecomplex *,
integer *), xerbla_(
char *,
integer *);
205 extern
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231 a_dim1 = *lda;
232 a_offset = 1 + a_dim1;
233 a -= a_offset;
234 --d__;
235 --e;
236 --tau;
237 --work;
238
239 *info = 0;
240 upper = lsame_(uplo, "U");
241 lquery = *lwork == -1;
242 if (! upper && ! lsame_(uplo, "L"))
243 {
244 *info = -1;
245 }
246 else if (*n < 0)
247 {
248 *info = -2;
249 }
250 else if (*lda < max(1,*n))
251 {
252 *info = -4;
253 }
254 else if (*lwork < 1 && ! lquery)
255 {
256 *info = -9;
257 }
258 if (*info == 0)
259 {
260
261 nb = ilaenv_(&c__1, "ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1);
262 lwkopt = *n * nb;
265 }
266 if (*info != 0)
267 {
268 i__1 = -(*info);
269 xerbla_("ZHETRD", &i__1);
270 return 0;
271 }
272 else if (lquery)
273 {
274 return 0;
275 }
276
277 if (*n == 0)
278 {
281 return 0;
282 }
283 nx = *n;
284 iws = 1;
285 if (nb > 1 && nb < *n)
286 {
287
288
289
290 i__1 = nb;
291 i__2 = ilaenv_(&c__3, "ZHETRD", uplo, n, &c_n1, &c_n1, & c_n1);
292 nx = max(i__1,i__2);
293 if (nx < *n)
294 {
295
296 ldwork = *n;
297 iws = ldwork * nb;
298 if (*lwork < iws)
299 {
300
301
302
303
304 i__1 = *lwork / ldwork;
305 nb = max(i__1,1);
306 nbmin = ilaenv_(&c__2, "ZHETRD", uplo, n, &c_n1, &c_n1, &c_n1);
307 if (nb < nbmin)
308 {
309 nx = *n;
310 }
311 }
312 }
313 else
314 {
315 nx = *n;
316 }
317 }
318 else
319 {
320 nb = 1;
321 }
322 if (upper)
323 {
324
325
326 kk = *n - (*n - nx + nb - 1) / nb * nb;
327 i__1 = kk + 1;
328 i__2 = -nb;
329 for (i__ = *n - nb + 1;
330 i__2 < 0 ? i__ >= i__1 : i__ <= i__1;
331 i__ += i__2)
332 {
333
334
335
336 i__3 = i__ + nb - 1;
337 zlatrd_(uplo, &i__3, &nb, &a[a_offset], lda, &e[1], &tau[1], & work[1], &ldwork);
338
339
340 i__3 = i__ - 1;
343 zher2k_(uplo, "No transpose", &i__3, &nb, &z__1, &a[i__ * a_dim1 + 1], lda, &work[1], &ldwork, &c_b23, &a[a_offset], lda);
344
345
346 i__3 = i__ + nb - 1;
347 for (j = i__;
348 j <= i__3;
349 ++j)
350 {
351 i__4 = j - 1 + j * a_dim1;
352 i__5 = j - 1;
355 i__4 = j;
356 i__5 = j + j * a_dim1;
357 d__[i__4] = a[i__5].
r;
358
359 }
360
361 }
362
363 zhetd2_fla(uplo, &kk, &a[a_offset], lda, &d__[1], &e[1], &tau[1], &iinfo);
364 }
365 else
366 {
367
368 i__2 = *n - nx;
369 i__1 = nb;
370 for (i__ = 1;
371 i__1 < 0 ? i__ >= i__2 : i__ <= i__2;
372 i__ += i__1)
373 {
374
375
376
377 i__3 = *n - i__ + 1;
378 zlatrd_(uplo, &i__3, &nb, &a[i__ + i__ * a_dim1], lda, &e[i__], & tau[i__], &work[1], &ldwork);
379
380
381 i__3 = *n - i__ - nb + 1;
384 zher2k_(uplo, "No transpose", &i__3, &nb, &z__1, &a[i__ + nb + i__ * a_dim1], lda, &work[nb + 1], &ldwork, &c_b23, &a[ i__ + nb + (i__ + nb) * a_dim1], lda);
385
386
387 i__3 = i__ + nb - 1;
388 for (j = i__;
389 j <= i__3;
390 ++j)
391 {
392 i__4 = j + 1 + j * a_dim1;
393 i__5 = j;
396 i__4 = j;
397 i__5 = j + j * a_dim1;
398 d__[i__4] = a[i__5].
r;
399
400 }
401
402 }
403
404 i__1 = *n - i__ + 1;
405 zhetd2_fla(uplo, &i__1, &a[i__ + i__ * a_dim1], lda, &d__[i__], &e[i__], &tau[i__], &iinfo);
406 }
409 return 0;
410
411}
double doublereal
Definition FLA_f2c.h:31
int integer
Definition FLA_f2c.h:25
int logical
Definition FLA_f2c.h:36
doublereal i
Definition FLA_f2c.h:33
doublereal r
Definition FLA_f2c.h:33
int zhetd2_fla(char *uplo, integer *n, doublecomplex *a, integer *lda, doublereal *d__, doublereal *e, doublecomplex *tau, integer *info)
Definition zhetd2.c:174