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, dlen_ = 9, dtype_ = 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,
221 $ ivt, ja, jobtype, ju, jvt, lda, ldu, ldvt,
222 $ llwork, lwmin, mycol, myrow, nnodes, nq, pass,
223 $ ptra, ptrac, ptrd, ptrs, ptrsc, ptru, ptruc,
224 $ ptrvt, ptrvtc, ptrwork, sethet,
SIZE, sizeq,
225 $ wpsgesvd, wpslagge, wpssvdchk, wpssvdcmp
226 REAL CHK, DELTA, H, MTM, OVFL, RTOVFL, RTUNFL, ULP,
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 IF( lwork.LT.lwmin )
THEN
364 CALL pxerbla( desca( ctxt_ ),
'PSSVDTST', -info )
368 ulp = pslamch( context,
'P' )
369 unfl = pslamch( context,
'Safe min' )
372 rtunfl = sqrt( unfl )
373 rtovfl = sqrt( ovfl )
377 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
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 IF( itype.EQ.1 )
THEN
399 work( ptrd+i-1 ) = zero
402 CALL pslaset(
'All', m, n, zero, zero, work( ptra ),
405 ELSE IF( itype.EQ.2 )
THEN
410 work( ptrd+i-1 ) = one
413 CALL pslaset(
'All', m, n, zero, one, work( ptra ),
416 ELSE IF( itype.GT.2 )
THEN
421 h = ( ulp-1 ) / ( size-1 )
423 work( ptrd+i-1 ) = 1 + h*( i-1 )
429 IF( itype.EQ.3 )
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 )