libflame revision_anchor
dorcsd.c File Reference

(r)

Functions

int dorcsd_ (char *jobu1, char *jobu2, char *jobv1t, char *jobv2t, char *trans, char *signs, integer *m, integer *p, integer *q, doublereal *x11, integer *ldx11, doublereal *x12, integer *ldx12, doublereal *x21, integer *ldx21, doublereal *x22, integer *ldx22, doublereal *theta, doublereal *u1, integer *ldu1, doublereal *u2, integer *ldu2, doublereal *v1t, integer *ldv1t, doublereal *v2t, integer *ldv2t, doublereal *work, integer *lwork, integer *iwork, integer *info)
 

Function Documentation

◆ dorcsd_()

int dorcsd_ ( char * jobu1,
char * jobu2,
char * jobv1t,
char * jobv2t,
char * trans,
char * signs,
integer * m,
integer * p,
integer * q,
doublereal * x11,
integer * ldx11,
doublereal * x12,
integer * ldx12,
doublereal * x21,
integer * ldx21,
doublereal * x22,
integer * ldx22,
doublereal * theta,
doublereal * u1,
integer * ldu1,
doublereal * u2,
integer * ldu2,
doublereal * v1t,
integer * ldv1t,
doublereal * v2t,
integer * ldv2t,
doublereal * work,
integer * lwork,
integer * iwork,
integer * info )
295{
296 /* System generated locals */
297 integer u1_dim1, u1_offset, u2_dim1, u2_offset, v1t_dim1, v1t_offset, v2t_dim1, v2t_offset, x11_dim1, x11_offset, x12_dim1, x12_offset, x21_dim1, x21_offset, x22_dim1, x22_offset, i__1, i__2, i__3, i__4, i__5, i__6;
298 /* Local variables */
299 logical colmajor;
300 integer lworkmin, lworkopt, i__, j, childinfo, lbbcsdwork, lorbdbwork, lorglqwork, lorgqrwork, ib11d, ib11e, ib12d, ib12e, ib21d, ib21e, ib22d, ib22e, iphi;
301 logical defaultsigns;
302 extern logical lsame_(char *, char *);
303 integer lbbcsdworkmin, itaup1, itaup2, itauq1, itauq2, lorbdbworkmin, lbbcsdworkopt;
304 logical wantu1, wantu2;
305 extern /* Subroutine */
306 int dbbcsd_(char *, char *, char *, char *, char * , integer *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, doublereal *, integer *, integer *);
307 integer ibbcsd, lorbdbworkopt;
308 extern /* Subroutine */
310 integer iorbdb, lorglqworkmin, lorgqrworkmin;
311 extern /* Subroutine */
312 int dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), dlapmr_(logical *, integer *, integer *, doublereal *, integer *, integer *), xerbla_(char *, integer *), dlapmt_(logical *, integer *, integer *, doublereal *, integer *, integer *);
313 integer lorglqworkopt;
314 extern /* Subroutine */
316 integer lorgqrworkopt, iorglq;
317 extern /* Subroutine */
319 integer iorgqr;
320 char signst[1], transt[1];
321 logical lquery, wantv1t, wantv2t;
322 /* -- LAPACK computational routine (version 3.5.0) -- */
323 /* -- LAPACK is a software package provided by Univ. of Tennessee, -- */
324 /* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- */
325 /* November 2013 */
326 /* .. Scalar Arguments .. */
327 /* .. */
328 /* .. Array Arguments .. */
329 /* .. */
330 /* =================================================================== */
331 /* .. Parameters .. */
332 /* .. */
333 /* .. Local Scalars .. */
334 /* .. */
335 /* .. External Subroutines .. */
336 /* .. */
337 /* .. External Functions .. */
338 /* .. */
339 /* .. Intrinsic Functions */
340 /* .. */
341 /* .. Executable Statements .. */
342 /* Test input arguments */
343 /* Parameter adjustments */
344 x11_dim1 = *ldx11;
345 x11_offset = 1 + x11_dim1;
346 x11 -= x11_offset;
347 x12_dim1 = *ldx12;
348 x12_offset = 1 + x12_dim1;
349 x12 -= x12_offset;
350 x21_dim1 = *ldx21;
351 x21_offset = 1 + x21_dim1;
352 x21 -= x21_offset;
353 x22_dim1 = *ldx22;
354 x22_offset = 1 + x22_dim1;
355 x22 -= x22_offset;
356 --theta;
357 u1_dim1 = *ldu1;
358 u1_offset = 1 + u1_dim1;
359 u1 -= u1_offset;
360 u2_dim1 = *ldu2;
361 u2_offset = 1 + u2_dim1;
362 u2 -= u2_offset;
363 v1t_dim1 = *ldv1t;
364 v1t_offset = 1 + v1t_dim1;
365 v1t -= v1t_offset;
366 v2t_dim1 = *ldv2t;
367 v2t_offset = 1 + v2t_dim1;
368 v2t -= v2t_offset;
369 --work;
370 --iwork;
371 /* Function Body */
372 *info = 0;
373 wantu1 = lsame_(jobu1, "Y");
374 wantu2 = lsame_(jobu2, "Y");
375 wantv1t = lsame_(jobv1t, "Y");
376 wantv2t = lsame_(jobv2t, "Y");
377 colmajor = ! lsame_(trans, "T");
378 defaultsigns = ! lsame_(signs, "O");
379 lquery = *lwork == -1;
380 if (*m < 0)
381 {
382 *info = -7;
383 }
384 else if (*p < 0 || *p > *m)
385 {
386 *info = -8;
387 }
388 else if (*q < 0 || *q > *m)
389 {
390 *info = -9;
391 }
392 else if (colmajor && *ldx11 < max(1,*p))
393 {
394 *info = -11;
395 }
396 else if (! colmajor && *ldx11 < max(1,*q))
397 {
398 *info = -11;
399 }
400 else if (colmajor && *ldx12 < max(1,*p))
401 {
402 *info = -13;
403 }
404 else /* if(complicated condition) */
405 {
406 /* Computing MAX */
407 i__1 = 1;
408 i__2 = *m - *q; // , expr subst
409 if (! colmajor && *ldx12 < max(i__1,i__2))
410 {
411 *info = -13;
412 }
413 else /* if(complicated condition) */
414 {
415 /* Computing MAX */
416 i__1 = 1;
417 i__2 = *m - *p; // , expr subst
418 if (colmajor && *ldx21 < max(i__1,i__2))
419 {
420 *info = -15;
421 }
422 else if (! colmajor && *ldx21 < max(1,*q))
423 {
424 *info = -15;
425 }
426 else /* if(complicated condition) */
427 {
428 /* Computing MAX */
429 i__1 = 1;
430 i__2 = *m - *p; // , expr subst
431 if (colmajor && *ldx22 < max(i__1,i__2))
432 {
433 *info = -17;
434 }
435 else /* if(complicated condition) */
436 {
437 /* Computing MAX */
438 i__1 = 1;
439 i__2 = *m - *q; // , expr subst
440 if (! colmajor && *ldx22 < max(i__1,i__2))
441 {
442 *info = -17;
443 }
444 else if (wantu1 && *ldu1 < *p)
445 {
446 *info = -20;
447 }
448 else if (wantu2 && *ldu2 < *m - *p)
449 {
450 *info = -22;
451 }
452 else if (wantv1t && *ldv1t < *q)
453 {
454 *info = -24;
455 }
456 else if (wantv2t && *ldv2t < *m - *q)
457 {
458 *info = -26;
459 }
460 }
461 }
462 }
463 }
464 /* Work with transpose if convenient */
465 /* Computing MIN */
466 i__1 = *p;
467 i__2 = *m - *p; // , expr subst
468 /* Computing MIN */
469 i__3 = *q;
470 i__4 = *m - *q; // , expr subst
471 if (*info == 0 && min(i__1,i__2) < min(i__3,i__4))
472 {
473 if (colmajor)
474 {
475 *(unsigned char *)transt = 'T';
476 }
477 else
478 {
479 *(unsigned char *)transt = 'N';
480 }
481 if (defaultsigns)
482 {
483 *(unsigned char *)signst = 'O';
484 }
485 else
486 {
487 *(unsigned char *)signst = 'D';
488 }
489 dorcsd_(jobv1t, jobv2t, jobu1, jobu2, transt, signst, m, q, p, &x11[ x11_offset], ldx11, &x21[x21_offset], ldx21, &x12[x12_offset], ldx12, &x22[x22_offset], ldx22, &theta[1], &v1t[v1t_offset], ldv1t, &v2t[v2t_offset], ldv2t, &u1[u1_offset], ldu1, &u2[ u2_offset], ldu2, &work[1], lwork, &iwork[1], info);
490 return 0;
491 }
492 /* Work with permutation [ 0 I;
493 I 0 ] * X * [ 0 I;
494 I 0 ] if */
495 /* convenient */
496 if (*info == 0 && *m - *q < *q)
497 {
498 if (defaultsigns)
499 {
500 *(unsigned char *)signst = 'O';
501 }
502 else
503 {
504 *(unsigned char *)signst = 'D';
505 }
506 i__1 = *m - *p;
507 i__2 = *m - *q;
508 dorcsd_(jobu2, jobu1, jobv2t, jobv1t, trans, signst, m, &i__1, &i__2, &x22[x22_offset], ldx22, &x21[x21_offset], ldx21, &x12[ x12_offset], ldx12, &x11[x11_offset], ldx11, &theta[1], &u2[ u2_offset], ldu2, &u1[u1_offset], ldu1, &v2t[v2t_offset], ldv2t, &v1t[v1t_offset], ldv1t, &work[1], lwork, &iwork[1], info);
509 return 0;
510 }
511 /* Compute workspace */
512 if (*info == 0)
513 {
514 iphi = 2;
515 /* Computing MAX */
516 i__1 = 1;
517 i__2 = *q - 1; // , expr subst
518 itaup1 = iphi + max(i__1,i__2);
519 itaup2 = itaup1 + max(1,*p);
520 /* Computing MAX */
521 i__1 = 1;
522 i__2 = *m - *p; // , expr subst
523 itauq1 = itaup2 + max(i__1,i__2);
524 itauq2 = itauq1 + max(1,*q);
525 /* Computing MAX */
526 i__1 = 1;
527 i__2 = *m - *q; // , expr subst
528 iorgqr = itauq2 + max(i__1,i__2);
529 i__1 = *m - *q;
530 i__2 = *m - *q;
531 i__3 = *m - *q;
532 /* Computing MAX */
533 i__5 = 1;
534 i__6 = *m - *q; // , expr subst
535 i__4 = max(i__5,i__6);
536 dorgqr_fla(&i__1, &i__2, &i__3, &u1[u1_offset], &i__4, &u1[u1_offset], & work[1], &c_n1, &childinfo);
537 lorgqrworkopt = (integer) work[1];
538 /* Computing MAX */
539 i__1 = 1;
540 i__2 = *m - *q; // , expr subst
541 lorgqrworkmin = max(i__1,i__2);
542 /* Computing MAX */
543 i__1 = 1;
544 i__2 = *m - *q; // , expr subst
545 iorglq = itauq2 + max(i__1,i__2);
546 i__1 = *m - *q;
547 i__2 = *m - *q;
548 i__3 = *m - *q;
549 /* Computing MAX */
550 i__5 = 1;
551 i__6 = *m - *q; // , expr subst
552 i__4 = max(i__5,i__6);
553 dorglq_fla(&i__1, &i__2, &i__3, &u1[u1_offset], &i__4, &u1[u1_offset], & work[1], &c_n1, &childinfo);
554 lorglqworkopt = (integer) work[1];
555 /* Computing MAX */
556 i__1 = 1;
557 i__2 = *m - *q; // , expr subst
558 lorglqworkmin = max(i__1,i__2);
559 /* Computing MAX */
560 i__1 = 1;
561 i__2 = *m - *q; // , expr subst
562 iorbdb = itauq2 + max(i__1,i__2);
563 dorbdb_(trans, signs, m, p, q, &x11[x11_offset], ldx11, &x12[ x12_offset], ldx12, &x21[x21_offset], ldx21, &x22[x22_offset], ldx22, &theta[1], &v1t[v1t_offset], &u1[u1_offset], &u2[ u2_offset], &v1t[v1t_offset], &v2t[v2t_offset], &work[1], & c_n1, &childinfo);
564 lorbdbworkopt = (integer) work[1];
565 lorbdbworkmin = lorbdbworkopt;
566 /* Computing MAX */
567 i__1 = 1;
568 i__2 = *m - *q; // , expr subst
569 ib11d = itauq2 + max(i__1,i__2);
570 ib11e = ib11d + max(1,*q);
571 /* Computing MAX */
572 i__1 = 1;
573 i__2 = *q - 1; // , expr subst
574 ib12d = ib11e + max(i__1,i__2);
575 ib12e = ib12d + max(1,*q);
576 /* Computing MAX */
577 i__1 = 1;
578 i__2 = *q - 1; // , expr subst
579 ib21d = ib12e + max(i__1,i__2);
580 ib21e = ib21d + max(1,*q);
581 /* Computing MAX */
582 i__1 = 1;
583 i__2 = *q - 1; // , expr subst
584 ib22d = ib21e + max(i__1,i__2);
585 ib22e = ib22d + max(1,*q);
586 /* Computing MAX */
587 i__1 = 1;
588 i__2 = *q - 1; // , expr subst
589 ibbcsd = ib22e + max(i__1,i__2);
590 dbbcsd_(jobu1, jobu2, jobv1t, jobv2t, trans, m, p, q, &theta[1], & theta[1], &u1[u1_offset], ldu1, &u2[u2_offset], ldu2, &v1t[ v1t_offset], ldv1t, &v2t[v2t_offset], ldv2t, &u1[u1_offset], & u1[u1_offset], &u1[u1_offset], &u1[u1_offset], &u1[u1_offset], &u1[u1_offset], &u1[u1_offset], &u1[u1_offset], &work[1], & c_n1, &childinfo);
591 lbbcsdworkopt = (integer) work[1];
592 lbbcsdworkmin = lbbcsdworkopt;
593 /* Computing MAX */
594 i__1 = iorgqr + lorgqrworkopt, i__2 = iorglq + lorglqworkopt, i__1 = max(i__1,i__2), i__2 = iorbdb + lorbdbworkopt;
595 i__1 = max( i__1,i__2);
596 i__2 = ibbcsd + lbbcsdworkopt; // ; expr subst
597 lworkopt = max(i__1,i__2) - 1;
598 /* Computing MAX */
599 i__1 = iorgqr + lorgqrworkmin, i__2 = iorglq + lorglqworkmin, i__1 = max(i__1,i__2), i__2 = iorbdb + lorbdbworkopt;
600 i__1 = max( i__1,i__2);
601 i__2 = ibbcsd + lbbcsdworkmin; // ; expr subst
602 lworkmin = max(i__1,i__2) - 1;
603 work[1] = (doublereal) max(lworkopt,lworkmin);
604 if (*lwork < lworkmin && ! lquery)
605 {
606 *info = -22;
607 }
608 else
609 {
610 lorgqrwork = *lwork - iorgqr + 1;
611 lorglqwork = *lwork - iorglq + 1;
612 lorbdbwork = *lwork - iorbdb + 1;
613 lbbcsdwork = *lwork - ibbcsd + 1;
614 }
615 }
616 /* Abort if any illegal arguments */
617 if (*info != 0)
618 {
619 i__1 = -(*info);
620 xerbla_("DORCSD", &i__1);
621 return 0;
622 }
623 else if (lquery)
624 {
625 return 0;
626 }
627 /* Transform to bidiagonal block form */
628 dorbdb_(trans, signs, m, p, q, &x11[x11_offset], ldx11, &x12[x12_offset], ldx12, &x21[x21_offset], ldx21, &x22[x22_offset], ldx22, &theta[1] , &work[iphi], &work[itaup1], &work[itaup2], &work[itauq1], &work[ itauq2], &work[iorbdb], &lorbdbwork, &childinfo);
629 /* Accumulate Householder reflectors */
630 if (colmajor)
631 {
632 if (wantu1 && *p > 0)
633 {
634 dlacpy_("L", p, q, &x11[x11_offset], ldx11, &u1[u1_offset], ldu1);
635 dorgqr_fla(p, p, q, &u1[u1_offset], ldu1, &work[itaup1], &work[ iorgqr], &lorgqrwork, info);
636 }
637 if (wantu2 && *m - *p > 0)
638 {
639 i__1 = *m - *p;
640 dlacpy_("L", &i__1, q, &x21[x21_offset], ldx21, &u2[u2_offset], ldu2);
641 i__1 = *m - *p;
642 i__2 = *m - *p;
643 dorgqr_fla(&i__1, &i__2, q, &u2[u2_offset], ldu2, &work[itaup2], & work[iorgqr], &lorgqrwork, info);
644 }
645 if (wantv1t && *q > 0)
646 {
647 i__1 = *q - 1;
648 i__2 = *q - 1;
649 dlacpy_("U", &i__1, &i__2, &x11[(x11_dim1 << 1) + 1], ldx11, &v1t[ (v1t_dim1 << 1) + 2], ldv1t);
650 v1t[v1t_dim1 + 1] = 1.;
651 i__1 = *q;
652 for (j = 2;
653 j <= i__1;
654 ++j)
655 {
656 v1t[j * v1t_dim1 + 1] = 0.;
657 v1t[j + v1t_dim1] = 0.;
658 }
659 i__1 = *q - 1;
660 i__2 = *q - 1;
661 i__3 = *q - 1;
662 dorglq_fla(&i__1, &i__2, &i__3, &v1t[(v1t_dim1 << 1) + 2], ldv1t, & work[itauq1], &work[iorglq], &lorglqwork, info);
663 }
664 if (wantv2t && *m - *q > 0)
665 {
666 i__1 = *m - *q;
667 dlacpy_("U", p, &i__1, &x12[x12_offset], ldx12, &v2t[v2t_offset], ldv2t);
668 if (*m - *p > *q)
669 {
670 i__1 = *m - *p - *q;
671 i__2 = *m - *p - *q;
672 dlacpy_("U", &i__1, &i__2, &x22[*q + 1 + (*p + 1) * x22_dim1], ldx22, &v2t[*p + 1 + (*p + 1) * v2t_dim1], ldv2t);
673 }
674 if (*m > *q)
675 {
676 i__1 = *m - *q;
677 i__2 = *m - *q;
678 i__3 = *m - *q;
679 dorglq_fla(&i__1, &i__2, &i__3, &v2t[v2t_offset], ldv2t, &work[ itauq2], &work[iorglq], &lorglqwork, info);
680 }
681 }
682 }
683 else
684 {
685 if (wantu1 && *p > 0)
686 {
687 dlacpy_("U", q, p, &x11[x11_offset], ldx11, &u1[u1_offset], ldu1);
688 dorglq_fla(p, p, q, &u1[u1_offset], ldu1, &work[itaup1], &work[ iorglq], &lorglqwork, info);
689 }
690 if (wantu2 && *m - *p > 0)
691 {
692 i__1 = *m - *p;
693 dlacpy_("U", q, &i__1, &x21[x21_offset], ldx21, &u2[u2_offset], ldu2);
694 i__1 = *m - *p;
695 i__2 = *m - *p;
696 dorglq_fla(&i__1, &i__2, q, &u2[u2_offset], ldu2, &work[itaup2], & work[iorglq], &lorglqwork, info);
697 }
698 if (wantv1t && *q > 0)
699 {
700 i__1 = *q - 1;
701 i__2 = *q - 1;
702 dlacpy_("L", &i__1, &i__2, &x11[x11_dim1 + 2], ldx11, &v1t[( v1t_dim1 << 1) + 2], ldv1t);
703 v1t[v1t_dim1 + 1] = 1.;
704 i__1 = *q;
705 for (j = 2;
706 j <= i__1;
707 ++j)
708 {
709 v1t[j * v1t_dim1 + 1] = 0.;
710 v1t[j + v1t_dim1] = 0.;
711 }
712 i__1 = *q - 1;
713 i__2 = *q - 1;
714 i__3 = *q - 1;
715 dorgqr_fla(&i__1, &i__2, &i__3, &v1t[(v1t_dim1 << 1) + 2], ldv1t, & work[itauq1], &work[iorgqr], &lorgqrwork, info);
716 }
717 if (wantv2t && *m - *q > 0)
718 {
719 i__1 = *m - *q;
720 dlacpy_("L", &i__1, p, &x12[x12_offset], ldx12, &v2t[v2t_offset], ldv2t);
721 i__1 = *m - *p - *q;
722 i__2 = *m - *p - *q;
723 dlacpy_("L", &i__1, &i__2, &x22[*p + 1 + (*q + 1) * x22_dim1], ldx22, &v2t[*p + 1 + (*p + 1) * v2t_dim1], ldv2t);
724 i__1 = *m - *q;
725 i__2 = *m - *q;
726 i__3 = *m - *q;
727 dorgqr_fla(&i__1, &i__2, &i__3, &v2t[v2t_offset], ldv2t, &work[ itauq2], &work[iorgqr], &lorgqrwork, info);
728 }
729 }
730 /* Compute the CSD of the matrix in bidiagonal-block form */
731 dbbcsd_(jobu1, jobu2, jobv1t, jobv2t, trans, m, p, q, &theta[1], &work[ iphi], &u1[u1_offset], ldu1, &u2[u2_offset], ldu2, &v1t[ v1t_offset], ldv1t, &v2t[v2t_offset], ldv2t, &work[ib11d], &work[ ib11e], &work[ib12d], &work[ib12e], &work[ib21d], &work[ib21e], & work[ib22d], &work[ib22e], &work[ibbcsd], &lbbcsdwork, info);
732 /* Permute rows and columns to place identity submatrices in top- */
733 /* left corner of (1,1)-block and/or bottom-right corner of (1,2)- */
734 /* block and/or bottom-right corner of (2,1)-block and/or top-left */
735 /* corner of (2,2)-block */
736 if (*q > 0 && wantu2)
737 {
738 i__1 = *q;
739 for (i__ = 1;
740 i__ <= i__1;
741 ++i__)
742 {
743 iwork[i__] = *m - *p - *q + i__;
744 }
745 i__1 = *m - *p;
746 for (i__ = *q + 1;
747 i__ <= i__1;
748 ++i__)
749 {
750 iwork[i__] = i__ - *q;
751 }
752 if (colmajor)
753 {
754 i__1 = *m - *p;
755 i__2 = *m - *p;
756 dlapmt_(&c_false, &i__1, &i__2, &u2[u2_offset], ldu2, &iwork[1]);
757 }
758 else
759 {
760 i__1 = *m - *p;
761 i__2 = *m - *p;
762 dlapmr_(&c_false, &i__1, &i__2, &u2[u2_offset], ldu2, &iwork[1]);
763 }
764 }
765 if (*m > 0 && wantv2t)
766 {
767 i__1 = *p;
768 for (i__ = 1;
769 i__ <= i__1;
770 ++i__)
771 {
772 iwork[i__] = *m - *p - *q + i__;
773 }
774 i__1 = *m - *q;
775 for (i__ = *p + 1;
776 i__ <= i__1;
777 ++i__)
778 {
779 iwork[i__] = i__ - *p;
780 }
781 if (! colmajor)
782 {
783 i__1 = *m - *q;
784 i__2 = *m - *q;
785 dlapmt_(&c_false, &i__1, &i__2, &v2t[v2t_offset], ldv2t, &iwork[1] );
786 }
787 else
788 {
789 i__1 = *m - *q;
790 i__2 = *m - *q;
791 dlapmr_(&c_false, &i__1, &i__2, &v2t[v2t_offset], ldv2t, &iwork[1] );
792 }
793 }
794 return 0;
795 /* End DORCSD */
796}
double doublereal
Definition FLA_f2c.h:31
int integer
Definition FLA_f2c.h:25
int logical
Definition FLA_f2c.h:36
int dorcsd_(char *jobu1, char *jobu2, char *jobv1t, char *jobv2t, char *trans, char *signs, integer *m, integer *p, integer *q, doublereal *x11, integer *ldx11, doublereal *x12, integer *ldx12, doublereal *x21, integer *ldx21, doublereal *x22, integer *ldx22, doublereal *theta, doublereal *u1, integer *ldu1, doublereal *u2, integer *ldu2, doublereal *v1t, integer *ldv1t, doublereal *v2t, integer *ldv2t, doublereal *work, integer *lwork, integer *iwork, integer *info)
Definition dorcsd.c:294
int dorglq_fla(integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info)
Definition dorglq.c:122
int dorgqr_fla(integer *m, integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, integer *info)
Definition dorgqr.c:123

References dorcsd_(), dorglq_fla(), and dorgqr_fla().

Referenced by dorcsd_().