1 SUBROUTINE pcsdpsubtst( WKNOWN, UPLO, N, THRESH, ABSTOL, A, COPYA,
2 $ Z, IA, JA, DESCA, WIN, WNEW, IPREPAD,
3 $ IPOSTPAD, WORK, LWORK, RWORK, LRWORK,
4 $ LWORK1, IWORK, LIWORK, RESULT, TSTNRM,
15 INTEGER IA, IPOSTPAD, IPREPAD, JA, LIWORK, LRWORK,
16 $ LWORK, LWORK1, N, NOUT, RESULT
17 REAL ABSTOL, QTQNRM, THRESH, TSTNRM
20 INTEGER DESCA( * ), IWORK( * )
21 REAL RWORK( * ), WIN( * ), WNEW( * )
22 COMPLEX A( * ), COPYA( * ), WORK( * ), Z( * )
156 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
157 $ MB_, NB_, RSRC_, CSRC_, LLD_
158 PARAMETER ( BLOCK_CYCLIC_2D = 1, dlen_ = 9, dtype_ = 1,
159 $ ctxt_ = 2, m_ = 3, n_ = 4
160 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
161 REAL PADVAL, FIVE, NEGONE
162 parameter( padval = 13.5285e+0, five = 5.0e+0,
165 parameter( cpadval = ( 13.989e+0, 1.93e+0 ) )
167 PARAMETER ( IPADVAL = 927 )
168 COMPLEX CZERO, CONE, CNEGONE
169 parameter( czero = 0.0e+0, cone = 1.0e+0,
170 $ cnegone = -1.0e+0 )
173 INTEGER I, IAM, INFO, ISIZEHEEVD, ISIZEHEEVX,
174 $ ISIZESUBTST, ISIZETST, MYCOL, MYROW, NP, NPCOL,
175 $ NPROW, NQ, RES, RSIZECHK, RSIZEHEEVD,
176 $ RSIZEHEEVX, RSIZEQTQ, RSIZESUBTST, RSIZETST,
177 $ sizeheevd, sizeheevx, sizemqrleft,
178 $ sizemqrright, sizeqrf, sizesubtst, sizetms,
180 REAL EPS, EPSNORMA, ERROR, MAXERROR, MINERROR, NORM,
181 $ NORMWIN, SAFMIN, ULP
189 REAL PCLANGE, PCLANHE, PSLAMCH
190 EXTERNAL NUMROC, PCLANGE, PCLANHE, PSLAMCH
199 INTRINSIC abs,
max,
min, real
203 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
206 CALL pclasizesep( desca, iprepad, ipostpad, sizemqrleft,
207 $ sizemqrright, sizeqrf, sizetms, rsizeqtq,
208 $ rsizechk, sizeheevx, rsizeheevx, isizeheevx,
209 $ sizeheevd, rsizeheevd, isizeheevd, sizesubtst,
210 $ rsizesubtst, isizesubtst, sizetst, rsizetst,
215 eps = pslamch( desca( ctxt_ ),
'Eps' )
216 safmin = pslamch( desca( ctxt_ ),
'Safe min' )
218 normwin = safmin / eps
220 $ normwin =
max( abs( win( 1+iprepad ) ),
221 $ abs( win( n+iprepad ) ), normwin )
223 DO 10 i = 1, lwork1, 1
224 rwork( i+iprepad ) = 14.3e+0
226 DO 20 i = 1, liwork, 1
229 DO 30 i = 1, lwork, 1
230 work( i+iprepad ) = ( 15.63e+0, 1.1e+0 )
234 wnew( i+iprepad ) = 3.14159e+0
240 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
246 IF( myrow.GE.nprow .OR. myrow.LT.0 )
250 np = numroc( n, desca( mb_ ), myrow, 0, nprow )
251 nq = numroc( n, desca( nb_ ), mycol, 0, npcol )
253 CALL clacpy(
'A', np, nq, copya, desca( lld_ ), a( 1+iprepad ),
256 CALL pcfillpad( desca( ctxt_ ), np, nq, a, desca( lld_ ), iprepad,
257 $ ipostpad, cpadval )
259 CALL pcfillpad( desca( ctxt_ ), np, nq, z, desca( lld_ ), iprepad,
260 $ ipostpad, cpadval+1.0e+0 )
262 CALL psfillpad( desca( ctxt_ ), n, 1, wnew, n, iprepad, ipostpad,
265 CALL psfillpad( desca( ctxt_ ), lwork1, 1, rwork, lwork1, iprepad,
266 $ ipostpad, padval+4.0e+0 )
268 CALL pifillpad( desca( ctxt_ ), liwork, 1, iwork, liwork, iprepad,
269 $ ipostpad, ipadval )
271 CALL pcfillpad( desca( ctxt_ ), lwork, 1, work, lwork, iprepad,
272 $ ipostpad, cpadval+4.1e+0 )
278 CALL pcheevd(
'V', uplo, n, a( 1+iprepad ), ia, ja, desca,
279 $ wnew( 1+iprepad ), z( 1+iprepad ), ia, ja, desca,
280 $ work( 1+iprepad ), sizeheevd, rwork( 1+iprepad ),
281 $ lwork1, iwork( 1+iprepad ), liwork, info )
285 IF( thresh.LE.0 )
THEN
288 CALL pcchekpad( desca( ctxt_ ),
'PCHEEVD-A', np, nq, a,
289 $ desca( lld_ ), iprepad, ipostpad, cpadval )
291 CALL pcchekpad( desca( ctxt_ ),
'PCHEEVD-Z', np, nq, z,
292 $ desca( lld_ ), iprepad, ipostpad,
295 CALL pschekpad( desca( ctxt_ ),
'PCHEEVD-WNEW', n, 1, wnew, n,
296 $ iprepad, ipostpad, padval+2.0e+0 )
298 CALL pschekpad( desca( ctxt_ ),
'PCHEEVD-rWORK', lwork1, 1,
299 $ rwork, lwork1, iprepad, ipostpad,
302 CALL pcchekpad( desca( ctxt_ ),
'PCHEEVD-WORK', lwork, 1, work,
303 $ lwork, iprepad, ipostpad, cpadval+4.1e+0 )
305 CALL pichekpad( desca( ctxt_ ),
'PCHEEVD-IWORK', liwork, 1,
306 $ iwork, liwork, iprepad, ipostpad, ipadval )
315 CALL igamn2d( desca( ctxt_ ),
'a',
' ', 1, 1, itmp, 1, 1, 1,
317 CALL igamx2d( desca( ctxt_ ),
'a', '
', 1, 1, ITMP( 2 ), 1, 1,
321.NE.
IF( ITMP( 1 )ITMP( 2 ) ) THEN
323 $ WRITE( NOUT, FMT = * )
324 $ 'different processes
return different info
'
326.NE.
ELSE IF( INFO0 ) THEN
328 $ WRITE( NOUT, FMT = 9996 )INFO
337 EPSNORMA = PCLANHE( 'i
', UPLO, N, COPYA, IA, JA, DESCA,
352 CALL PSFILLPAD( DESCA( CTXT_ ), RSIZECHK, 1, RWORK, RSIZECHK,
353 $ IPREPAD, IPOSTPAD, 4.3E+0 )
355 CALL PCSEPCHK( N, N, COPYA, IA, JA, DESCA,
356 $ MAX( ABSTOL+EPSNORMA, SAFMIN ), THRESH,
357 $ Z( 1+IPREPAD ), IA, JA, DESCA, A( 1+IPREPAD ),
358 $ IA, JA, DESCA, WNEW( 1+IPREPAD ),
359 $ RWORK( 1+IPREPAD ), RSIZECHK, TSTNRM, RES )
361 CALL PSCHEKPAD( DESCA( CTXT_ ), 'pcsdpchk-rwork
', RSIZECHK, 1,
362 $ RWORK, RSIZECHK, IPREPAD, IPOSTPAD, 4.3E+0 )
366 WRITE( NOUT, FMT = 9995 )
371 CALL PSFILLPAD( DESCA( CTXT_ ), RSIZEQTQ, 1, RWORK, RSIZEQTQ,
372 $ IPREPAD, IPOSTPAD, 4.3E+0 )
376 ULP = PSLAMCH( DESCA( CTXT_ ), 'p
' )
377 CALL PCLASET( 'a
', N, N, CZERO, CONE, A( 1+IPREPAD ), IA, JA,
379 CALL PCGEMM( 'conjugate transpose
', 'n
', N, N, N, CNEGONE,
380 $ Z( 1+IPREPAD ), IA, JA, DESCA, Z( 1+IPREPAD ), IA,
381 $ JA, DESCA, CONE, A( 1+IPREPAD ), IA, JA, DESCA )
382 NORM = PCLANGE( '1
', N, N, A( 1+IPREPAD ), IA, JA, DESCA,
383 $ WORK( 1+IPREPAD ) )
384 QTQNRM = NORM / ( REAL( MAX( N, 1 ) )*ULP )
385.GT.
IF( QTQNRMTHRESH ) THEN
388 CALL PSCHEKPAD( DESCA( CTXT_ ), 'pcsepqtq-rwork
', RSIZEQTQ, 1,
389 $ RWORK, RSIZEQTQ, IPREPAD, IPOSTPAD, 4.3E+0 )
393 WRITE( NOUT, FMT = 9994 )
398 $ WRITE( NOUT, FMT = 9998 )INFO
404 $ WRITE( NOUT, FMT = 9998 )INFO
411.AND..GT.
IF( WKNOWN N0 ) THEN
420 ERROR = ABS( WIN( I+IPREPAD )-WNEW( I+IPREPAD ) )
421 MAXERROR = MAX( MAXERROR, ERROR )
423 MINERROR = MIN( MAXERROR, MINERROR )
425.GT.
IF( MINERRORNORMWIN*FIVE*THRESH*EPS ) THEN
427 $ WRITE( NOUT, FMT = 9997 )MINERROR, NORMWIN
435 CALL IGAMX2D( DESCA( CTXT_ ), 'a
', ' ', 1, 1, RESULT, 1, 1, 1, -1,
442 9999 FORMAT( 'pcheevd returned info=
', I7 )
443 9998 FORMAT( 'pcsepqtq returned info=
', I7 )
444 9997 FORMAT( 'pcsdpsubtst minerror =
', D11.2, ' normwin=
', D11.2 )
445 9996 FORMAT( 'pcheevd returned info=
', I7,
446 $ ' despite adequate workspace
' )
447 9995 FORMAT( 'pcheevd failed
the |aq -qe| test
' )
448 9994 FORMAT( 'pcheevd failed
the |qtq -i| test
' )