1 SUBROUTINE pssvdtst( M, N, NPROW, NPCOL, NB, ISEED, THRESH, WORK,
2 $ RESULT, LWORK, NOUT )
10 INTEGER LWORK, M, N, NB, NOUT, NPCOL, NPROW
14 INTEGER ISEED( 4 ), RESULT( 9 )
210 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
211 $ mb_, nb_, rsrc_, csrc_, lld_, ntypes
212 parameter( block_cyclic_2d = 1
213 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
214 $ rsrc_ = 7, csrc_ = 8, lld_ = 9, ntypes = 6 )
216 parameter( zero = 0.0e0, one = 1.0e0 )
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, ptrs, ptrsc, ptru, ptruc,
224 $ ptrvt, ptrvtc, ptrwork
SIZE, sizeq,
225 $ wpsgesvd, wpslagge, wpssvdchk, wpssvdcmp
226 REAL CHK, DELTA, H, MTM, , RTOVFL, RTUNFL, ,
234 $ igamn2d, igamx2d, igebr2d, igebs2d,
pselset,
241 EXTERNAL numroc, pslamch
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 pslagge( m, n, work( ptrd ), work( ptra ), ia, ja, desca,
325 $ iseed,
SIZE, work( ptrwork ), -1, dinfo )
326 wpslagge = int( work( ptrwork ) )
328 CALL psgesvd( '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 WPSGESVD = INT( WORK( PTRWORK ) )
334 CALL PSSVDCHK( 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 WPSSVDCHK = INT( WORK( PTRWORK ) )
340 CALL PSSVDCMP( 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 WPSSVDCMP = INT( WORK( PTRWORK ) )
348 LWMIN = 1 + 2*LDA*NQ + 3*SIZE +
349 $ MAX( WPSLAGGE, LDU*SIZEQ+LDVT*NQ+MAX( LDU*SIZEQ,
350 $ LDVT*NQ )+WPSGESVD+MAX( WPSSVDCHK, WPSSVDCMP ) )
358.LT.
IF( LWORKLWMIN ) THEN
364 CALL PXERBLA( DESCA( CTXT_ ), 'pssvdtst', -INFO )
368 ULP = PSLAMCH( CONTEXT, 'p
' )
369 UNFL = PSLAMCH( CONTEXT, 'safe
min' )
371 CALL SLABAD( 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 PSLASET( 'all
', M, N, ZERO, ZERO, WORK( PTRA ),
405.EQ.
ELSE IF( ITYPE2 ) THEN
410 WORK( PTRD+I-1 ) = ONE
413 CALL PSLASET( '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 PSLASET( 'all
', M, N, ZERO, ZERO, WORK( PTRA ),
437 CALL PSELSET( WORK( PTRA ), I, I, DESCA,
441.EQ.
ELSE IF( ITYPE4 ) THEN
445 CALL PSLAGGE( M, N, WORK( PTRD ), WORK( PTRA ), IA, JA,
446 $ DESCA, ISEED, SIZE, WORK( PTRWORK ),
449.EQ.
ELSE IF( ITYPE5 ) THEN
453 CALL SSCAL( SIZE, RTOVFL, WORK( PTRD ), 1 )
455 CALL PSLAGGE( M, N, WORK( PTRD ), WORK( PTRA ), IA, JA,
456 $ DESCA, ISEED, SIZE, WORK( PTRWORK ),
459.EQ.
ELSE IF( ITYPE6 ) THEN
463 CALL SSCAL( SIZE, RTUNFL, WORK( PTRD ), 1 )
464 CALL PSLAGGE( 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 PSLACPY( 'a
', M, N, WORK( PTRA ), IA, JA, DESCA,
503 $ WORK( PTRAC ), IA, JA, DESCA )
508.EQ.
IF( JOBTYPE1 ) THEN
512 CALL BLACS_BARRIER( CONTEXT, 'all
' )
515 CALL PSGESVD( JOBU, JOBVT, M, N, WORK( PTRAC ), IA, JA,
516 $ DESCA, WORK( PTRS ), WORK( PTRU ), IU, JU,
517 $ DESCU, WORK( PTRVT ), IVT, JVT, DESCVT,
518 $ WORK( PTRWORK ), WPSGESVD, INFO )
521 CALL SLCOMBINE( CONTEXT, 'all
', '>
', 'w
', 1, 1, WTIME )
522 CALL SLCOMBINE( CONTEXT, 'all
', '>
', 'c
', 1, 1, CTIME )
530 CALL IGAMN2D( DESCA( CTXT_ ), 'a
', ' ', 1, 1, ITMP, 1, 1,
532 CALL IGAMX2D( DESCA( CTXT_ ), 'a
', ' ', 1, 1, ITMP( 2 ),
533 $ 1, 1, 1, -1, -1, 0 )
535.NE.
IF( ITMP( 1 )ITMP( 2 ) ) THEN
536.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
537 WRITE( NOUT, FMT = * )
538 $ 'different processes
return different info
'
547.EQ.
IF( INFO( SIZE+1 ) ) THEN
554.EQ.
IF( INFOZERO ) THEN
557 WORK( I+PTRWORK ) = WORK( I+PTRS-1 )
558 WORK( I+SIZE+PTRWORK ) = WORK( I+PTRS-1 )
561 CALL SGAMN2D( DESCA( CTXT_ ), 'a
', ' ', SIZE, 1,
562 $ WORK( 1+PTRWORK ), SIZE, 1, 1, -1, -1,
564 CALL SGAMX2D( DESCA( CTXT_ ), 'a
', ' ', SIZE, 1,
565 $ WORK( 1+SIZE+PTRWORK ), SIZE, 1, 1, -1,
569 IF( ABS( WORK( I+PTRWORK )-WORK( SIZE+I+
570.GT.
$ PTRWORK ) )ZERO ) THEN
571 WRITE( NOUT, FMT = * )'i=
', I, ' min=
',
572 $ WORK( I+PTRWORK ), ' max=
',
573 $ WORK( SIZE+I+PTRWORK )
589 CALL PSLACPY( 'a
', M, N, WORK( PTRA ), IA, JA, DESCA,
590 $ WORK( PTRAC ), IA, JA, DESCA )
596 CALL PSLACPY( 'a
', M, SIZE, WORK( PTRU ), IU, JU, DESCU,
597 $ WORK( PTRUC ), IU, JU, DESCU )
601 CALL PSSVDCHK( M, N, WORK( PTRAC ), IA, JA, DESCA,
602 $ WORK( PTRUC ), IU, JU, DESCU,
603 $ WORK( PTRVT ), IVT, JVT, DESCVT,
604 $ WORK( PTRS ), THRESH, WORK( PTRWORK ),
605 $ LLWORK, RESULT, CHK, MTM )
611 CALL PSGESVD( JOBU, JOBVT, M, N, WORK( PTRAC ), IA, JA,
612 $ DESCA, WORK( PTRSC ), WORK( PTRUC ), IU,
613 $ JU, DESCU, WORK( PTRVTC ), IVT, JVT,
614 $ DESCVT, WORK( PTRWORK ), WPSGESVD, INFO )
616 CALL PSSVDCMP( M, N, JOBTYPE, WORK( PTRS ),
617 $ WORK( PTRSC ), WORK( PTRU ),
618 $ WORK( PTRUC ), IU, JU, DESCU,
619 $ WORK( PTRVT ), WORK( PTRVTC ), IVT, JVT,
620 $ DESCVT, THRESH, RESULT, DELTA,
621 $ WORK( PTRWORK ), LLWORK )
627.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
629.EQ.
IF( RESULT( I )1 ) THEN
631 WRITE( NOUT, FMT = * )'test i =
', I, 'has failed
'
632 WRITE( NOUT, FMT = * )' '
636 WRITE( NOUT, FMT = 9999 )'passed
', WTIME( 1 ),
637 $ CTIME( 1 ), M, N, NPROW, NPCOL, NB, ITYPE, CHK, MTM,
642 CALL BLACS_GRIDEXIT( CONTEXT )
645 9999 FORMAT( A6, 2E10.3, 2I6, 2I4, I5, I6, 3F6.2, 4X, A1 )
subroutine psgesvd(jobu, jobvt, m, n, a, ia, ja, desca, s, u, iu, ju, descu, vt, ivt, jvt, descvt, work, lwork, info)
subroutine pssvdchk(m, n, a, ia, ja, desca, u, iu, ju, descu, vt, ivt, jvt, descvt, s, thresh, work, lwork, result, chk, mtm)
subroutine pssvdcmp(m, n, jobtype, s, sc, u, uc, iu, ju, descu, vt, vtc, ivt, jvt, descvt, thresh, result, delta, work, lwork)