1 SUBROUTINE pdsvdtst( M, N, NPROW, NPCOL, NB, ISEED, THRESH, WORK,
2 $ RESULT, LWORK, NOUT )
10 INTEGER LWORK, M, N, , NOUT, NPCOL, NPROW
11 DOUBLE PRECISION THRESH
14 INTEGER ( 4 ), RESULT( 9 )
15 DOUBLE PRECISION WORK( * )
210 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
211 $ mb_, nb_, rsrc_, csrc_, lld_, ntypes
212 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
213 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
214 $ rsrc_ = 7, csrc_ = 8, lld_ = 9, ntypes = 6 )
215 DOUBLE PRECISION ZERO, ONE
216 parameter( zero = 0.0d0, one = 1.0d0 )
219 CHARACTER HETERO, JOBU, JOBVT
220 INTEGER CONTEXT, DINFO, I, IA, IAM, INFO, ITYPE, IU
222 $ llwork, lwmin, mycol, myrow, nnodes, nq, pass,
223 $ ptra, ptrac, ptrd, ptrwork, ptrs, ptrsc, ptru,
224 $ ptruc, ptrvt, ptrvtc, sethet,
SIZE, sizeq,
225 $ wpdgesvd, wpdlagge, wpdsvdchk, wpdsvdcmp
226 DOUBLE PRECISION CHK, DELTA, H, MTM, OVFL, RTOVFL, RTUNFL, ULP,
234 $ igamn2d, igamx2d, igebr2d, igebs2d,
pdelset,
240 DOUBLE PRECISION PDLAMCH
244 INTEGER DESCA( DLEN_ ), DESCU( DLEN_ ),
245 $ descvt( dlen_ ), itmp( 2 )
246 DOUBLE PRECISION CTIME( 1 ), WTIME( 1 )
249 INTRINSIC abs, int,
max,
min, sqrt
253 IF( block_cyclic_2d*csrc_*dtype_*lld_*mb_*m_*nb_*n_*rsrc_.LT.0 )
256 CALL blacs_pinfo( iam, nnodes )
257 CALL blacs_get( -1, 0, context )
263 IF( ( myrow.GE.nprow ) .OR. ( myrow.LT.0 ) .OR.
264 $ ( mycol.GE.npcol ) .OR. ( mycol.LT.0 ) )
GO TO 110
265 CALL blacs_set( context, 15, 1 )
272 ELSE IF( n.LE.0 )
THEN
274 ELSE IF( nprow.LE.0 )
THEN
276 ELSE IF( npcol.LE.0 )
THEN
278 ELSE IF( nb.LE.0 )
THEN
280 ELSE IF( thresh.LE.0 )
THEN
295 lda =
numroc( m, nb, myrow, 0, nprow )
297 nq =
numroc( n, nb, mycol, 0, npcol )
299 sizeq =
numroc(
SIZE, nb, mycol, 0, npcol )
300 ldvt =
numroc(
SIZE, nb, myrow, 0, nprow )
301 ldvt =
max( 1, ldvt )
302 CALL descinit( desca, m, n, nb, nb, 0, 0, context, lda, dinfo )
303 CALL descinit( descu, m,
SIZE, nb, nb, 0, 0, context, ldu, dinfo )
304 CALL descinit( descvt,
SIZE, n, nb, nb, 0, 0, context, ldvt,
310 ptrac = ptra + lda*nq
311 ptrd = ptrac + lda*nq
314 ptrwork = ptrsc +
SIZE
324 CALL pdlagge( m, n, work( ptrd ), work( ptra ), ia, ja, desca,
325 $ iseed,
SIZE, work( ptrwork ), -1, dinfo )
326 wpdlagge = int( work( ptrwork ) )
328 CALL pdgesvd( 'v
', 'v
', M, N, WORK( PTRA ), IA, JA, DESCA,
329 $ WORK( PTRS ), WORK( PTRU ), IU, JU, DESCU,
330 $ WORK( PTRVT ), IVT, JVT, DESCVT,
331 $ WORK( PTRWORK ), -1, DINFO )
332 WPDGESVD = INT( WORK( PTRWORK ) )
334 CALL PDSVDCHK( M, N, WORK( PTRAC ), IA, JA, DESCA, WORK( PTRUC ),
335 $ IU, JU, DESCU, WORK( PTRVT ), IVT, JVT, DESCVT,
336 $ WORK( PTRS ), THRESH, WORK( PTRWORK ), -1,
338 WPDSVDCHK = INT( WORK( PTRWORK ) )
340 CALL PDSVDCMP( M, N, 1, WORK( PTRS ), WORK( PTRSC ), WORK( PTRU ),
341 $ WORK( PTRUC ), IU, JU, DESCU, WORK( PTRVT ),
342 $ WORK( PTRVTC ), IVT, JVT, DESCVT, THRESH,
343 $ RESULT, DELTA, WORK( PTRWORK ), -1 )
344 WPDSVDCMP = INT( WORK( PTRWORK ) )
348 LWMIN = 1 + 2*LDA*NQ + 3*SIZE +
349 $ MAX( WPDLAGGE, LDU*SIZEQ+LDVT*NQ+MAX( LDU*SIZEQ,
350 $ LDVT*NQ )+WPDGESVD+MAX( WPDSVDCHK, WPDSVDCMP ) )
358.LT.
IF( LWORKLWMIN ) THEN
364 CALL PXERBLA( DESCA( CTXT_ ), 'pdsvdtst', -INFO )
368 ULP = PDLAMCH( CONTEXT, 'p
' )
369 UNFL = PDLAMCH( CONTEXT, 'safe
min' )
371 CALL DLABAD( UNFL, OVFL )
372 RTUNFL = SQRT( UNFL )
373 RTOVFL = SQRT( OVFL )
377.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
378 CALL IGEBS2D( CONTEXT, 'a
', ' ', 4, 1, ISEED, 4 )
380 CALL IGEBR2D( CONTEXT, 'a
', ' ', 4, 1, ISEED, 4, 0, 0 )
385 DO 100 ITYPE = 1, NTYPES
389 PTRWORK = PTRSC + SIZE
390 LLWORK = LWORK - PTRWORK + 1
394.EQ.
IF( ITYPE1 ) THEN
399 WORK( PTRD+I-1 ) = ZERO
402 CALL PDLASET( 'all
', M, N, ZERO, ZERO, WORK( PTRA ),
405.EQ.
ELSE IF( ITYPE2 ) THEN
410 WORK( PTRD+I-1 ) = ONE
413 CALL PDLASET( 'all
', M, N, ZERO, ONE, WORK( PTRA ),
416.GT.
ELSE IF( ITYPE2 ) THEN
421 H = ( ULP-1 ) / ( SIZE-1 )
423 WORK( PTRD+I-1 ) = 1 + H*( I-1 )
429.EQ.
IF( ITYPE3 ) THEN
433 CALL PDLASET( 'all
', M, N, ZERO, ZERO, WORK( PTRA ),
437 CALL PDELSET( WORK( PTRA ), I, I, DESCA,
441.EQ.
ELSE IF( ITYPE4 ) THEN
445 CALL PDLAGGE( M, N, WORK( PTRD ), WORK( PTRA ), IA, JA,
446 $ DESCA, ISEED, SIZE, WORK( PTRWORK ),
449.EQ.
ELSE IF( ITYPE5 ) THEN
453 CALL DSCAL( SIZE, RTOVFL, WORK( PTRD ), 1 )
455 CALL PDLAGGE( M, N, WORK( PTRD ), WORK( PTRA ), IA, JA,
456 $ DESCA, ISEED, SIZE, WORK( PTRWORK ),
459.EQ.
ELSE IF( ITYPE6 ) THEN
463 CALL DSCAL( SIZE, RTUNFL, WORK( PTRD ), 1 )
464 CALL PDLAGGE( M, N, WORK( PTRD ), WORK( PTRA ), IA, JA,
465 $ DESCA, ISEED, SIZE, WORK( PTRWORK ),
477.EQ.
IF( JOBTYPE1 ) THEN
480 PTRVT = PTRU + LDU*SIZEQ
481 PTRUC = PTRVT + LDVT*NQ
482 PTRWORK = PTRUC + LDU*SIZEQ
483 LLWORK = LWORK - PTRWORK + 1
484.EQ.
ELSE IF( JOBTYPE2 ) THEN
487.EQ.
ELSE IF( JOBTYPE3 ) THEN
491 PTRWORK = PTRVTC + LDVT*NQ
492 LLWORK = LWORK - PTRWORK + 1
493.EQ.
ELSE IF( JOBTYPE4 ) THEN
497 LLWORK = LWORK - PTRWORK + 1
502 CALL PDLACPY( 'a
', M, N, WORK( PTRA ), IA, JA, DESCA,
503 $ WORK( PTRAC ), IA, JA, DESCA )
508.EQ.
IF( JOBTYPE1 ) THEN
513 CALL BLACS_BARRIER( CONTEXT, 'all
' )
516 CALL PDGESVD( JOBU, JOBVT, M, N, WORK( PTRAC ), IA, JA,
517 $ DESCA, WORK( PTRS ), WORK( PTRU ), IU, JU,
518 $ DESCU, WORK( PTRVT ), IVT, JVT, DESCVT,
519 $ WORK( PTRWORK ), WPDGESVD, INFO )
522 CALL SLCOMBINE( CONTEXT, 'all
', '>
', 'w
', 1, 1, WTIME )
523 CALL SLCOMBINE( CONTEXT, 'all
', '>
', 'c
', 1, 1, CTIME )
531 CALL IGAMN2D( DESCA( CTXT_ ), 'a
', ' ', 1, 1, ITMP, 1, 1,
533 CALL IGAMX2D( DESCA( CTXT_ ), 'a
', ' ', 1, 1, ITMP( 2 ),
534 $ 1, 1, 1, -1, -1, 0 )
536.NE.
IF( ITMP( 1 )ITMP( 2 ) ) THEN
537.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
538 WRITE( NOUT, FMT = * )
539 $ 'different processes
return different info
'
548.EQ.
IF( INFO( SIZE+1 ) ) THEN
555.EQ.
IF( INFOZERO ) THEN
558 WORK( I+PTRWORK ) = WORK( I+PTRS-1 )
559 WORK( I+SIZE+PTRWORK ) = WORK( I+PTRS-1 )
562 CALL DGAMN2D( DESCA( CTXT_ ), 'a
', ' ', SIZE, 1,
563 $ WORK( 1+PTRWORK ), SIZE, 1, 1, -1, -1,
565 CALL DGAMX2D( DESCA( CTXT_ ), 'a
', ' ', SIZE, 1,
566 $ WORK( 1+SIZE+PTRWORK ), SIZE, 1, 1, -1,
570 IF( ABS( WORK( I+PTRWORK )-WORK( SIZE+I+
571.GT.
$ PTRWORK ) )ZERO ) THEN
572 WRITE( NOUT, FMT = * )'i=
', I, ' min=
',
573 $ WORK( I+PTRWORK ), ' max=
',
574 $ WORK( SIZE+I+PTRWORK )
590 CALL PDLACPY( 'a
', M, N, WORK( PTRA ), IA, JA, DESCA,
591 $ WORK( PTRAC ), IA, JA, DESCA )
597 CALL PDLACPY( 'a
', M, SIZE, WORK( PTRU ), IU, JU, DESCU,
598 $ WORK( PTRUC ), IU, JU, DESCU )
602 CALL PDSVDCHK( M, N, WORK( PTRAC ), IA, JA, DESCA,
603 $ WORK( PTRUC ), IU, JU, DESCU,
604 $ WORK( PTRVT ), IVT, JVT, DESCVT,
605 $ WORK( PTRS ), THRESH, WORK( PTRWORK ),
606 $ LLWORK, RESULT, CHK, MTM )
612 CALL PDGESVD( JOBU, JOBVT, M, N, WORK( PTRAC ), IA, JA,
613 $ DESCA, WORK( PTRSC ), WORK( PTRUC ), IU,
614 $ JU, DESCU, WORK( PTRVTC ), IVT, JVT,
615 $ DESCVT, WORK( PTRWORK ), WPDGESVD, INFO )
617 CALL PDSVDCMP( M, N, JOBTYPE, WORK( PTRS ),
618 $ WORK( PTRSC ), WORK( PTRU ),
619 $ WORK( PTRUC ), IU, JU, DESCU,
620 $ WORK( PTRVT ), WORK( PTRVTC ), IVT, JVT,
621 $ DESCVT, THRESH, RESULT, DELTA,
622 $ WORK( PTRWORK ), LLWORK )
628.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
630.EQ.
IF( RESULT( I )1 ) THEN
632 WRITE( NOUT, FMT = * )'test i =
', I, 'has failed
'
633 WRITE( NOUT, FMT = * )' '
637 WRITE( NOUT, FMT = 9999 )'passed
', WTIME( 1 ),
638 $ CTIME( 1 ), M, N, NPROW, NPCOL, NB, ITYPE, CHK, MTM,
643 CALL BLACS_GRIDEXIT( CONTEXT )
646 9999 FORMAT( A6, 2E10.3, 2I6, 2I4, I5, I6, 3F6.2, 4X, A1 )
subroutine pdgesvd(jobu, jobvt, m, n, a, ia, ja, desca, s, u, iu, ju, descu, vt, ivt, jvt, descvt, work, lwork, info)
subroutine pdsvdchk(m, n, a, ia, ja, desca, u, iu, ju, descu, vt, ivt, jvt, descvt, s, thresh, work, lwork, result, chk, mtm)
subroutine pdsvdcmp(m, n, jobtype, s, sc, u, uc, iu, ju, descu, vt, vtc, ivt, jvt, descvt, thresh, result, delta, work, lwork)