1 SUBROUTINE pdsvdcmp( M, N, JOBTYPE, S, SC, U, UC, IU, JU, DESCU,
2 $ VT, VTC, IVT, JVT, DESCVT, THRESH, RESULT,
11 INTEGER IU, IVT, JOBTYPE, JU, JVT, LWORK, M, N
12 DOUBLE PRECISION DELTA, THRESH
15 INTEGER DESCU( * ), DESCVT( * ), RESULT( * )
16 DOUBLE PRECISION S( * ), SC( * ), U( * ), UC( * ), VT( * ),
176 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
177 $ MB_, NB_, RSRC_, CSRC_, LLD_
178 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
179 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
180 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
183 INTEGER COLPTR, I, INFO, J, LWMIN, MYCOL, MYROW, NPCOL,
184 $ NPROW, NQ, RESULTS, SIZE, SIZEPOS, SIZEQ
185 DOUBLE PRECISION ACCUR, CMP, NORMDIFS, NORMDIFU, NORMDIFV,
190 DOUBLE PRECISION DLANGE, PDLAMCH, PDLANGE
191 EXTERNAL numroc, dlange, pdlamch, pdlange
201 IF( block_cyclic_2d*csrc_*dlen_*dtype_*mb_*m_*n_*rsrc_.LT.0 )
216 IF( nprow.EQ.-1 )
THEN
219 CALL chk1mat( m, 1,
SIZE, sizepos, 1, 1, descu, 8, info )
220 CALL chk1mat(
SIZE, sizepos, n, 2, 1, 1, descvt, 11, info )
227 sizeq = numroc(
SIZE, descu( nb_ ), mycol, 0, npcol )
228 nq = numroc( n, descvt( nb_ ), mycol, 0, npcol )
229 lwmin =
max( sizeq, nq ) + 4
233 IF( lwork.LT.lwmin )
THEN
235 ELSE IF( thresh.LE.0 )
THEN
241 CALL pxerbla( descu( ctxt_ ),
'PDSVDCMP', -info )
245 ulp = pdlamch( descu( ctxt_ ),
'P' )
249 norms = dlange( '1
', SIZE, 1, S, SIZE, WORK )
251 SC( I ) = S( I ) - SC( I )
254 NORMDIFS = DLANGE( '1
', SIZE, 1, SC, SIZE, WORK )
255 ACCUR = ULP*SIZE*NORMS*THRESH
257.GT.
IF( NORMDIFSACCUR )
259.EQ..AND..EQ.
IF( NORMDIFS0 ACCUR0 ) THEN
262 NORMDIFS = NORMDIFS / ACCUR
265.EQ.
IF( JOBTYPE2 ) THEN
267 RESULT( 5 ) = RESULTS
270 COLPTR = DESCU( LLD_ )*( J-1 )
271 DO 20 I = 1, DESCU( LLD_ )
272 UC( I+COLPTR ) = U( I+COLPTR ) - UC( I+COLPTR )
276 NORMDIFU = PDLANGE( '1
', M, SIZE, UC, IU, JU, DESCU, WORK )
278.GE.
IF( NORMDIFUACCUR )
280.EQ..AND..EQ.
IF( NORMDIFU0 ACCUR0 ) THEN
283 NORMDIFU = NORMDIFU / ACCUR
286.EQ.
ELSE IF( JOBTYPE3 ) THEN
288 RESULT( 7 ) = RESULTS
291 COLPTR = DESCVT( LLD_ )*( J-1 )
292 DO 40 I = 1, DESCVT( LLD_ )
293 VTC( I+COLPTR ) = VT( I+COLPTR ) - VTC( I+COLPTR )
297 NORMDIFV = PDLANGE( '1
', SIZE, N, VTC, IVT, JVT, DESCVT, WORK )
299.GE.
IF( NORMDIFVACCUR )
302.EQ..AND..EQ.
IF( NORMDIFV0 ACCUR0 ) THEN
305 NORMDIFV = NORMDIFV / ACCUR
308.EQ.
ELSE IF( JOBTYPE4 ) THEN
310 RESULT( 9 ) = RESULTS
314 CMP = MAX( NORMDIFV, NORMDIFU )
315 DELTA = MAX( CMP, NORMDIFS )
subroutine pdsvdcmp(m, n, jobtype, s, sc, u, uc, iu, ju, descu, vt, vtc, ivt, jvt, descvt, thresh, result, delta, work, lwork)