3 SUBROUTINE pdsqpsubtst( WKNOWN, JOBZ, UPLO, N, THRESH, ABSTOL, A,
4 $ COPYA, Z, IA, JA, DESCA, WIN, WNEW,
5 $ IPREPAD, IPOSTPAD, WORK, LWORK, LWORK1,
6 $ RESULT, TSTNRM, QTQNRM, NOUT )
16 INTEGER IA, IPOSTPAD, IPREPAD, JA, LWORK, LWORK1, N,
18 DOUBLE PRECISION ABSTOL, QTQNRM, THRESH, TSTNRM
22 DOUBLE PRECISION A( * ), COPYA(
146 INTEGER BLOCK_CYCLIC_2D, DLEN_, DT_, CTXT_, M_, N_,
147 $ MB_, NB_, RSRC_, CSRC_, LLD_
148 PARAMETER ( BLOCK_CYCLIC_2D = 1, dlen_ = 9, dt_ = 1,
149 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
150 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
151 DOUBLE PRECISION FIVE, NEGONE, PADVAL, ZERO
152 PARAMETER ( PADVAL = 13.5285d+0, five = 5.0d+0,
153 $ negone = -1.0d+0, zero = 0.0d+0 )
156 INTEGER I, IAM, INFO, ISIZESUBTST, ISIZESYEVX,
157 $ , J, EIGS, MINSIZE, MQ, MYCOL, MYROW,
158 $ NP, NPCOL, NPROW, NQ, RESAQ, RESQTQ,
159 $ sizechk, sizemqrleft, sizemqrright, sizeqrf,
160 $ sizeqtq, sizesubtst, sizesyev, sizesyevx,
161 $ sizetms, sizetst,sizesyevd, isizesyevd
162 DOUBLE PRECISION EPS, EPSNORMA, ERROR, MAXERROR, MINERROR,
166 INTEGER DESCZ( DLEN_ ), ITMP( 2 ),
173 DOUBLE PRECISION PDLAMCH, PDLANSY
174 EXTERNAL lsame, numroc, pdlamch, pdlansy
183 INTRINSIC abs,
max,
min, mod
187 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dt_*lld_*mb_*m_*nb_*n_*
189 CALL pdlasizesqp( desca, iprepad, ipostpad, sizemqrleft,
190 $ sizemqrright, sizeqrf, sizetms, sizeqtq,
191 $ sizechk, sizesyevx, isizesyevx, sizesyev,
192 $ sizesyevd, isizesyevd, sizesubtst, isizesubtst,
193 $ sizetst, isizetst )
197 eps = pdlamch( desca( ctxt_ ),
'Eps' )
198 safmin = pdlamch( desca( ctxt_ ),
'Safe min' )
200 normwin = safmin / eps
202 $ normwin =
max( abs( win( 1+iprepad ) ),
203 $ abs( win( n+iprepad ) ), normwin )
207 DO 10 i = 1, lwork1, 1
208 work( i+iprepad ) = 14.3d+0
212 wnew( i+iprepad ) = 3.14159d+0
219 IF( lsame( jobz,
'N' ) )
THEN
226 CALL descinit( descz, desca( m_ ), desca( n_ ), desca( mb_ ),
227 $ desca( nb_ ), desca( rsrc_ ), desca( csrc_ ),
228 $ desca( ctxt_ ), desca( lld_ ), info )
233 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
239 IF( myrow.GE.nprow .OR. myrow.LT.0 )
243 np = numroc( n, desca( mb_ ), myrow, 0, nprow )
244 nq = numroc( n, desca( nb_ ), mycol, 0, npcol )
245 mq = numroc( eigs, desca( nb_ ), mycol, 0, npcol )
251 CALL dlacpy(
'A', np, nq, copya, desca(
254 CALL pdfillpad( desca( ctxt_ ), np, nq, a, desca( lld_ ), iprepad,
257 CALL pdfillpad( descz( ctxt_ ), np, mq, z, descz( lld_ ), iprepad,
258 $ ipostpad, padval+1.0d+0 )
260 CALL pdfillpad( desca( ctxt_ ), n, 1, wnew, n, iprepad, ipostpad,
263 CALL pdfillpad( desca( ctxt_ ), lwork1, 1, work, lwork1, iprepad,
264 $ ipostpad, padval+4.0d+0 )
271 CALL pdelset( z( 1+iprepad ), i, j, desca, 13.0d+0 )
278 CALL pdsyev( jobz, uplo, n, a( 1+iprepad ), ia, ja, desca,
279 $ wnew( 1+iprepad ), z( 1+iprepad ), ia, ja, desca,
280 $ work( 1+iprepad ), lwork1, info )
284 IF( thresh.LE.0 )
THEN
287 CALL pdchekpad( desca( ctxt_ ),
'PDSYEV-A', np, nq, a,
288 $ desca( lld_ ), iprepad, ipostpad, padval )
290 CALL pdchekpad( descz( ctxt_ ),
'PDSYEV-Z', np, mq, z,
291 $ descz( lld_ ), iprepad, ipostpad,
294 CALL pdchekpad( desca( ctxt_ ),
'PDSYEV-WNEW'
295 $ iprepad, ipostpad, padval+2.0d+0 )
297 CALL pdchekpad( desca( ctxt_ ),
'PDSYEV-WORK'
309 CALL igamn2d( desca( ctxt_ ),
'a',
' ', 1, 1, itmp, 1, 1, 1,
311 CALL igamx2d( desca( ctxt_ ),
'a',
' ', 1, 1, itmp( 2 ), 1, 1,
315 IF( itmp( 1 ).NE.itmp( 2 ) )
THEN
317 $
WRITE( nout, fmt = * )
318 $ 'different processes
return different info
'
320.NE.
ELSE IF( INFO0 ) THEN
322 WRITE( NOUT, FMT = 9999 )INFO
324 $ WRITE( NOUT, FMT = 9994 )
327.EQ..AND..GE.
ELSE IF( INFO14 LWORK1MINSIZE ) THEN
329 $ WRITE( NOUT, FMT = 9996 )INFO
333.EQ..OR..GT.
IF( RESULT0 INFON ) THEN
339 WORK( I ) = WNEW( I+IPREPAD )
340 WORK( I+N ) = WNEW( I+IPREPAD )
343 CALL DGAMN2D( DESCA( CTXT_ ), 'a
', ' ', N, 1, WORK, N, 1,
345 CALL DGAMX2D( DESCA( CTXT_ ), 'a
', ' ', N, 1,
346 $ WORK( 1+N ), N, 1, 1, -1, -1, 0 )
350.GT.
IF( ABS( WORK( I )-WORK( N+I ) )ZERO ) THEN
352 $ WRITE( NOUT, FMT = 9995 )
360 CALL IGAMX2D( DESCA( CTXT_ ), 'a
', ' ', 1, 1, RESULT, 1, 1, 1,
368 EPSNORMA = PDLANSY( 'i
', UPLO, N, COPYA, IA, JA, DESCA,
382 IF( LSAME( JOBZ, 'v
' ) ) THEN
386 CALL PDFILLPAD( DESCA( CTXT_ ), SIZECHK, 1, WORK, SIZECHK,
387 $ IPREPAD, IPOSTPAD, 4.3D+0 )
391 CALL PDSEPCHK( N, N, COPYA, IA, JA, DESCA,
392 $ MAX( ABSTOL+EPSNORMA, SAFMIN ), THRESH,
393 $ Z( 1+IPREPAD ), IA, JA, DESCZ,
394 $ A( 1+IPREPAD ), IA, JA, DESCA,
395 $ WNEW( 1+IPREPAD ), WORK( 1+IPREPAD ),
396 $ SIZECHK, TSTNRM, RESAQ )
398 CALL PDCHEKPAD( DESCA( CTXT_ ), 'pdsepchk-work
', SIZECHK, 1,
399 $ WORK, SIZECHK, IPREPAD, IPOSTPAD, 4.3D+0 )
401.NE.
IF( RESAQ0 ) THEN
403 WRITE( NOUT, FMT = 9993 )
408 CALL PDFILLPAD( DESCA( CTXT_ ), SIZEQTQ, 1, WORK, SIZEQTQ,
409 $ IPREPAD, IPOSTPAD, 4.3D+0 )
413 CALL PDSEPQTQ( N, N, THRESH, Z( 1+IPREPAD ), IA, JA, DESCZ,
414 $ A( 1+IPREPAD ), IA, JA, DESCA,
415 $ IWORK( 1 ), IWORK( 1 ), WORK( 1 ),
416 $ WORK( IPREPAD+1 ), SIZEQTQ, QTQNRM, INFO,
419 CALL PDCHEKPAD( DESCA( CTXT_ ), 'pdsepqtq-work
', SIZEQTQ, 1,
420 $ WORK, SIZEQTQ, IPREPAD, IPOSTPAD, 4.3D+0 )
422.NE.
IF( RESQTQ0 ) THEN
424 WRITE( NOUT, FMT = 9992 )
429 $ WRITE( NOUT, FMT = 9998 )INFO
436.AND..GT.
IF( WKNOWN N0 ) THEN
445 ERROR = ABS( WIN( I+IPREPAD )-WNEW( I+IPREPAD ) )
446 MAXERROR = MAX( MAXERROR, ERROR )
448 MINERROR = MIN( MAXERROR, MINERROR )
450.GT.
IF( MINERRORNORMWIN*FIVE*THRESH*EPS ) THEN
452 $ WRITE( NOUT, FMT = 9997 )MINERROR, NORMWIN
460 CALL IGAMX2D( DESCA( CTXT_ ), 'a
', ' ', 1, 1, RESULT, 1, 1, 1, -1,
468 9999 FORMAT( 'pdsyev returned info=
', I7 )
470 9997 FORMAT( 'pdsqpsubtst minerror =
', D11.2, ' normwin=
', D11.2 )
471 9996 FORMAT( 'pdsyev returned info=
', I7,
472 $ ' despite adequate workspace
' )
473 9995 FORMAT( 'different processes
return different eigenvalues
' )
474 9994 FORMAT( 'heterogeneity detected by
pdsyev' )
475 9993 FORMAT( 'pdsyev failed
the |aq -qe| test
' )
476 9992 FORMAT( 'pdsyev failed
the |qtq -i| test
' )