1 SUBROUTINE pssvdchk( M, N, A, IA, JA, DESCA, U, IU, JU, DESCU, VT,
2 $ IVT, JVT, DESCVT, S, THRESH, WORK, LWORK,
11 INTEGER IA, IU, IVT, JA, JU, JVT, LWORK, M, N
15 INTEGER DESCA( * ), DESCU( * ), DESCVT( * ),
17 REAL A( * ), S( * ), U( * ), VT( * ), WORK( * )
201 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
202 $ MB_, NB_, RSRC_, CSRC_, LLD_
203 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
204 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
205 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
207 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0, mone = -1.0e0 )
210 INTEGER I, INFO, LDR, LOCALCOL, LWMIN, MP, MX, MYCOL,
211 $ MYROW, NPCOL, NPROW, NQ, PCOL, PTRR, PTRWORK,
212 $
SIZE, sizep, sizepos, sizeq
213 REAL FIRST, NORMA, NORMAI, NORMU, NORMVT, SECOND,
217 INTEGER DESCR( DLEN_ )
220 INTEGER INDXG2L, INDXG2P, NUMROC
222 EXTERNAL indxg2l, indxg2p, numroc,
pslamch, pslange
243 IF( nprow.EQ.-1 )
THEN
246 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 6, info )
247 CALL chk1mat( m, 1,
SIZE, sizepos, iu, ju, descu, 10, info )
248 CALL chk1mat(
SIZE, sizepos, n, 2, ivt, jvt, descvt, 14, info )
255 mp = numroc( m, desca( mb_ ), myrow, 0, nprow )
256 nq = numroc( n, desca( nb_ ), mycol, 0, npcol )
257 sizep = numroc(
SIZE, descvt( mb_ ), myrow, 0, nprow )
258 sizeq = numroc(
SIZE, descu( nb_ ), mycol, 0, npcol )
259 mx =
max( sizeq, nq )
260 lwmin = 2 + sizeq*sizep +
max( 2, mx )
264 IF( lwork.LT.lwmin )
THEN
266 ELSE IF( thresh.LE.0 )
THEN
271 CALL pxerbla( desca( ctxt_ ),
'PSSVDCHK', -info )
275 ldr =
max( 1, sizep )
276 ulp =
pslamch( desca( ctxt_ ),
'P' )
277 normai = pslange(
'1', m, n, a, 1, 1, desca, work )
282 ptrwork = ptrr + sizeq*sizep
284 CALL descinit( descr,
SIZE,
SIZE, descvt( mb_ ), descu( nb_ ),
285 $ 0, desca( ctxt_ ), ldr, info )
289 CALL pslaset(
'Full',
SIZE,
SIZE, zero, one,
291 CALL psgemm( 't
', 'n
', SIZE, SIZE, M, ONE, U, 1, 1, DESCU, U, 1,
292 $ 1, DESCU, MONE, WORK( PTRR ), 1, 1, DESCR )
294 NORMU = PSLANGE( '1
', SIZE, SIZE, WORK( PTRR ), 1, 1, DESCR,
297 NORMU = NORMU / ULP / SIZE / THRESH
303 CALL PSLASET( 'full
', SIZE, SIZE, ZERO, ONE, WORK( PTRR ), 1, 1,
305 CALL PSGEMM( 'n
', 't
', SIZE, SIZE, N, ONE, VT, 1, 1, DESCVT, VT,
306 $ 1, 1, DESCVT, MONE, WORK( PTRR ), 1, 1, DESCR )
307 NORMVT = PSLANGE( '1
', SIZE, SIZE, WORK( PTRR ), 1, 1, DESCR,
310 NORMVT = NORMVT / ULP / SIZE / THRESH
314 MTM = MAX( NORMVT, NORMU )*THRESH
319 CALL PSLASET( 'full
', SIZE, SIZE, ZERO, ZERO, WORK( PTRR ), 1, 1,
323 CALL PSELSET( WORK( PTRR ), I, I, DESCR, S( I ) )
329 PCOL = INDXG2P( I, DESCU( NB_ ), 0, 0, NPCOL )
330 LOCALCOL = INDXG2L( I, DESCU( NB_ ), 0, 0, NPCOL )
331.EQ.
IF( MYCOLPCOL ) THEN
332 CALL SSCAL( MP, S( I ), U( ( LOCALCOL-1 )*DESCU( LLD_ )+1 ),
339 CALL PSGEMM( 'n
', 'n
', M, N, SIZE, ONE, U, 1, 1, DESCU, VT, 1, 1,
340 $ DESCVT, MONE, A, 1, 1, DESCA )
342 NORMA = PSLANGE( '1
', M, N, A, 1, 1, DESCA, WORK( PTRWORK ) )
343 THRESHA = NORMAI*MAX( M, N )*ULP*THRESH
345.GT.
IF( NORMATHRESHA )
348.EQ.
IF( THRESHA0 ) THEN
351 CHK = NORMA / THRESHA*THRESH
356 DO 30 I = 1, SIZE - 1
359.LT.
IF( FIRSTSECOND )
subroutine pssvdchk(m, n, a, ia, ja, desca, u, iu, ju, descu, vt, ivt, jvt, descvt, s, thresh, work, lwork, result, chk, mtm)