2 SUBROUTINE pcgesvd(JOBU,JOBVT,M,N,A,IA,JA,DESCA,S,U,IU,JU,DESCU,
3 + VT,IVT,JVT,DESCVT,WORK,LWORK,RWORK,INFO)
13 INTEGER IA,INFO,IU,IVT,JA,JU,JVT,LWORK,M,N
16 INTEGER DESCA(*),DESCU(*),DESCVT(*)
17 COMPLEX A(*),U(*),VT(*),WORK(*)
290 INTEGER BLOCK_CYCLIC_2D,DLEN_,DTYPE_,CTXT_,M_,N_,,NB_,RSRC_,
292 parameter(block_cyclic_2d=1,dlen_=9,dtype_=1,ctxt_=2,m_
293 + mb_=5,nb_=6,rsrc_=7,csrc_=8,lld_=9,ithval=10)
297 parameter(dzero=0.0d+0,done=1.0d+0)
301 INTEGER ,CONTEXTR,I,INDD,INDD2,INDE,INDE2,INDTAUP,INDTAUQ,
304 + myprowr,nb,ncvt,npcol,npcolc,npcolr,nprocs,nprow,nprowc,
305 + nprowr,nq,nru,
SIZE,sizeb,sizep,sizepos,sizeq,wantu,wantvt,
306 + watobd,wbdtosvd,wcbdsqr,wpcgebrd,wpclange,wpcormbrprt,
308 REAL ANRM,BIGNUM,EPS,RMAX,RMIN,SAFMIN,SIGMA,SMLNUM
311 INTEGER DESCTU(),DESCTVT(DLEN_),IDUM1(3),IDUM2(3)
327 INTRINSIC max,
min,sqrt,real
332 IF (block_cyclic_2d*dtype_*lld_*mb_*m_*nb_*n_.LT.0)
RETURN
338 IF (nprow.EQ.-1)
THEN
355 IF (lsame(jobu,
'V'))
THEN
360 IF (lsame(jobvt,
'V'))
THEN
366 CALL chk1mat(m,3,n,4,ia,ja,desca,8,info)
368 CALL chk1mat(m,3,
SIZE,sizepos,iu,ju,descu,13,info)
370 IF (wantvt.EQ.1)
THEN
371 CALL chk1mat(
SIZE,sizepos,n,4,ivt,jvt,descvt,17,info)
373 CALL igamx2d(desca(ctxt_),
'A',
' ',1,1,info,1,1,1,-1,-1,0)
380 inde = indd + sizeb + ioffd
381 indd2 = inde + sizeb + ioffe
382 inde2 = indd2 + sizeb + ioffd
385 indtaup = indtauq + sizeb + ja - 1
386 indwork = indtaup + sizeb + ia - 1
387 llwork = lwork - indwork + 1
391 CALL blacs_get(desca(ctxt_),10,contextc)
395 CALL blacs_get(desca(ctxt_),10,contextr)
397 CALL BLACS_GRIDINFO(CONTEXTR,NPROWR,NPCOLR,MYPROWR,
402 NRU = NUMROC(M,1,MYPROWC,0,NPROCS)
403 NCVT = NUMROC(N,1,MYPCOLR,0,NPROCS)
406 MP = NUMROC(M,MB,MYPROW,DESCA(RSRC_),NPROW)
407 NQ = NUMROC(N,NB,MYPCOL,DESCA(CSRC_),NPCOL)
408.EQ.
IF (WANTVT1) THEN
409 SIZEP = NUMROC(SIZE,DESCVT(MB_),MYPROW,DESCVT(RSRC_),
415 SIZEQ = NUMROC(SIZE,DESCU(NB_),MYPCOL,DESCU(CSRC_),
423.EQ..AND..EQ.
IF (MYPROW0 MYPCOL0) THEN
425 CALL IGEBS2D(DESCA(CTXT_),'all
',' ',1,1,MAXIM,1)
427 CALL IGEBR2D(DESCA(CTXT_),'all
',' ',1,1,MAXIM,1,0,0)
431 WPCGEBRD = NB* (MP+NQ+1) + NQ
432 WATOBD = MAX(MAX(WPCLANGE,WPCGEBRD),MAXIM)
434 WCBDSQR = MAX(1,4*SIZE)
435 WPCORMBRQLN = MAX((NB* (NB-1))/2, (SIZEQ+MP)*NB) + NB*NB
436 WPCORMBRPRT = MAX((MB* (MB-1))/2, (SIZEP+NQ)*MB) + MB*MB
437 WBDTOSVD = SIZE* (WANTU*NRU+WANTVT*NCVT) +
438 + MAX(WCBDSQR,MAX(WANTU*WPCORMBRQLN,
439 + WANTVT*WPCORMBRPRT))
443 LWMIN = 1 + 2*SIZEB + MAX(WATOBD,WBDTOSVD)
444 WORK(1) = CMPLX(LWMIN,0D+00)
445 RWORK(1) = REAL(1+4*SIZEB)
447.NE..AND..NOT.
IF (WANTU1 (LSAME(JOBU,'n
'))) THEN
449.NE..AND..NOT.
ELSE IF (WANTVT1 (LSAME(JOBVT,'n
'))) THEN
451.LT..AND..NE.
ELSE IF (LWORKLWMIN LWORK-1) THEN
459.EQ.
IF (LWORK-1) THEN
467 CALL PCHK1MAT(M,3,N,4,IA,JA,DESCA,8,3,IDUM1,IDUM2,INFO)
470 CALL PCHK1MAT(M,3,SIZE,4,IU,JU,DESCU,13,0,IDUM1,IDUM2,
473.EQ.
IF (WANTVT1) THEN
474 CALL PCHK1MAT(SIZE,3,N,4,IVT,JVT,DESCVT,17,0,IDUM1,
482 CALL PXERBLA(DESCA(CTXT_),'pcgesvd',-INFO)
484.EQ.
ELSE IF (LWORK-1) THEN
490.LE..OR..LE.
IF (M0 N0) GO TO 40
494 SAFMIN = PSLAMCH(DESCA(CTXT_),'safe minimum
')
495 EPS = PSLAMCH(DESCA(CTXT_),'precision
')
499 RMAX = MIN(SQRT(BIGNUM),DONE/SQRT(SQRT(SAFMIN)))
503 ANRM = PCLANGE('1
',M,N,A,IA,JA,DESCA,WORK(INDWORK))
504.GT..AND..LT.
IF (ANRMDZERO ANRMRMIN) THEN
507.GT.
ELSE IF (ANRMRMAX) THEN
512.EQ.
IF (ISCALE1) THEN
513 CALL PCLASCL('g
',DONE,SIGMA,M,N,A,IA,JA,DESCA,INFO)
516 CALL PCGEBRD(M,N,A,IA,JA,DESCA,RWORK(INDD),RWORK(INDE),
517 + WORK(INDTAUQ),WORK(INDTAUP),WORK(INDWORK),LLWORK,
528 CALL PSLARED1D(N+IOFFD,IA,JA,DESCA,RWORK(INDD),RWORK(INDD2),
529 + WORK(INDWORK),LLWORK)
531 CALL PSLARED2D(M+IOFFE,IA,JA,DESCA,RWORK(INDE),RWORK(INDE2),
532 + WORK(INDWORK),LLWORK)
535 CALL PSLARED2D(M+IOFFD,IA,JA,DESCA,RWORK(INDD),RWORK(INDD2),
536 + WORK(INDWORK),LLWORK)
538 CALL PSLARED1D(N+IOFFE,IA,JA,DESCA,RWORK(INDE),RWORK(INDE2),
539 + WORK(INDWORK),LLWORK)
551 INDV = INDU + SIZE*NRU*WANTU
552 INDWORK = INDV + SIZE*NCVT*WANTVT
557 CALL DESCINIT(DESCTU,M,SIZE,1,1,0,0,CONTEXTC,LDU,INFO)
558 CALL DESCINIT(DESCTVT,SIZE,N,1,1,0,0,CONTEXTR,LDVT,INFO)
561 CALL PCLASET('full
',M,SIZE,ZERO,ONE,WORK(INDU),1,1,DESCTU)
566.EQ.
IF (WANTVT1) THEN
567 CALL PCLASET('full
',SIZE,N,ZERO,ONE,WORK(INDV),1,1,DESCTVT)
572 CALL CBDSQR(UPLO,SIZE,NCVT,NRU,0,RWORK(INDD2+IOFFD),
573 + RWORK(INDE2+IOFFE),WORK(INDV),SIZE,WORK(INDU),LDU,C,1,
574 + WORK(INDWORK),INFO)
578.EQ.
IF (WANTU1) CALL PCGEMR2D(M,SIZE,WORK(INDU),1,1,DESCTU,U,IU,
579 + JU,DESCU,DESCU(CTXT_))
581.EQ.
IF (WANTVT1) CALL PCGEMR2D(SIZE,N,WORK(INDV),1,1,DESCTVT,VT,
582 + IVT,JVT,DESCVT,DESCVT(CTXT_))
586.GT..AND..EQ.
IF (MN WANTU1) THEN
587 CALL PCLASET('full
',M-SIZE,SIZE,ZERO,ZERO,U,IA+SIZE,JU,DESCU)
588.GT..AND..EQ.
ELSE IF (NM WANTVT1) THEN
589 CALL PCLASET('full
',SIZE,N-SIZE,ZERO,ZERO,VT,IVT,JVT+SIZE,
595.EQ.
IF (WANTU1) CALL PCUNMBR('q
','l
','n
',M,SIZE,N,A,IA,JA,DESCA,
596 + WORK(INDTAUQ),U,IU,JU,DESCU,
597 + WORK(INDWORK),LLWORK,INFO)
599.EQ.
IF (WANTVT1) CALL PCUNMBR('p
','r
','c
',SIZE,N,M,A,IA,JA,DESCA,
600 + WORK(INDTAUP),VT,IVT,JVT,DESCVT,
601 + WORK(INDWORK),LLWORK,INFO)
606 S(I) = RWORK(INDD2+IOFFD+I-1)
611.EQ.
IF (ISCALE1) THEN
612 CALL SSCAL(SIZE,ONE/SIGMA,S,1)
618.LE.
IF (SIZEITHVAL) THEN
627 RWORK(I+INDE) = S((I-1)*K+1)
628 RWORK(I+INDD2) = S((I-1)*K+1)
631 CALL SGAMN2D(DESCA(CTXT_),'a
',' ',J,1,RWORK(1+INDE),J,1,1,-1,-1,0)
632 CALL SGAMX2D(DESCA(CTXT_),'a
',' ',J,1,RWORK(1+INDD2),J,1,1,-1,-1,
636.NE.
IF ((RWORK(I+INDE)-RWORK(I+INDD2))DZERO) THEN
643 CALL BLACS_GRIDEXIT(CONTEXTC)
644 CALL BLACS_GRIDEXIT(CONTEXTR)
subroutine pcgesvd(jobu, jobvt, m, n, a, ia, ja, desca, s, u, iu, ju, descu, vt, ivt, jvt, descvt, work, lwork, rwork, info)
subroutine pcunmbr(vect, side, trans, m, n, k, a, ia, ja, desca, tau, c, ic, jc, descc, work, lwork, info)