libflame revision_anchor
Functions
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 */
298 /* Local variables */
302 extern logical lsame_(char *, char *);
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 *);
308 extern /* Subroutine */
311 extern /* Subroutine */
314 extern /* Subroutine */
317 extern /* Subroutine */
320 char signst[1], transt[1];
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 }
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;
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
524 itauq2 = itauq1 + max(1,*q);
525 /* Computing MAX */
526 i__1 = 1;
527 i__2 = *m - *q; // , expr subst
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);
538 /* Computing MAX */
539 i__1 = 1;
540 i__2 = *m - *q; // , expr subst
542 /* Computing MAX */
543 i__1 = 1;
544 i__2 = *m - *q; // , expr subst
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);
555 /* Computing MAX */
556 i__1 = 1;
557 i__2 = *m - *q; // , expr subst
559 /* Computing MAX */
560 i__1 = 1;
561 i__2 = *m - *q; // , expr subst
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);
593 /* Computing MAX */
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 */
600 i__1 = max( i__1,i__2);
601 i__2 = ibbcsd + lbbcsdworkmin; // ; expr subst
602 lworkmin = max(i__1,i__2) - 1;
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 */
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);
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;
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;
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;
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);
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;
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;
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;
728 }
729 }
730 /* Compute the CSD of the matrix in bidiagonal-block form */
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 i
Definition bl1_axmyv2.c:145
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(), dorgqr_fla(), and i.

Referenced by dorcsd_().