1 SUBROUTINE pssdpsubtst( WKNOWN, UPLO, N, THRESH, ABSTOL, A,
2 $ COPYA, Z, IA, JA, DESCA, WIN, WNEW,
3 $ IPREPAD, IPOSTPAD, WORK, LWORK, LWORK1,
5 $ RESULT, TSTNRM, QTQNRM, NOUT )
15 INTEGER IA, IPOSTPAD, IPREPAD, JA, LWORK, LWORK1, N,
16 $ NOUT, RESULT, LIWORK
17 REAL ABSTOL, QTQNRM, THRESH, TSTNRM
20 INTEGER DESCA( * ), IWORK( * )
21 REAL A( * ), COPYA( * ), WIN( * ), WNEW( * ),
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 REAL FIVE, NEGONE, PADVAL, ZERO
152 parameter( padval = 13.5285e+0, five = 5.0e+0,
153 $ negone = -1.0e+0, zero = 0.0e+0 )
156 INTEGER I, IAM, INFO, ISIZESUBTST, ISIZESYEVX,
157 $ ISIZETST, J, 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,
163 REAL EPS, EPSNORMA, ERROR, MAXERROR, MINERROR,
167 INTEGER DESCZ( DLEN_ ), ITMP( 2 )
174EXTERNAL LSAME, NUMROC, PSLAMCH, PSLANSY
183 INTRINSIC abs,
max,
min, mod
187 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dt_*lld_*mb_*m_*nb_*n_*
189 CALL pslasizesqp( desca, iprepad, ipostpad, sizemqrleft,
190 $ sizemqrright, sizeqrf, sizetms, sizeqtq,
191 $ sizechk, sizesyevx, isizesyevx, sizesyev,
192 $ sizesyevd, isizesyevd, sizesubtst,
193 $ isizesubtst, sizetst, isizetst )
197 eps = pslamch( desca( ctxt_ ), 'eps
' )
198 SAFMIN = PSLAMCH( 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.3E+0
212 WNEW( I+IPREPAD ) = 3.14159E+0
215 CALL DESCINIT( DESCZ, DESCA( M_ ), DESCA( N_ ), DESCA( MB_ ),
216 $ DESCA( NB_ ), DESCA( RSRC_ ), DESCA( CSRC_ ),
217 $ DESCA( CTXT_ ), DESCA( LLD_ ), INFO )
219 CALL BLACS_GRIDINFO( DESCA( CTXT_ ), NPROW, NPCOL, MYROW, MYCOL )
222.EQ..AND..EQ.
IF( MYROW0 MYCOL0 )
227.GE..OR..LT.
IF( MYROWNPROW MYROW0 )
231 NP = NUMROC( N, DESCA( MB_ ), MYROW, 0, NPROW )
232 NQ = NUMROC( N, DESCA( NB_ ), MYCOL, 0, NPCOL )
233 MQ = NUMROC( N, DESCA( NB_ ), MYCOL, 0, NPCOL )
237 TRILWMIN = 3*N + MAX( DESCA( NB_ )*( NP+1 ), 3*DESCA( NB_ ) )
238 MINSIZE = MAX( 1 + 6*N + 2*NP*NQ, TRILWMIN ) + 2*N
240 CALL SLACPY( 'a
', NP, NQ, COPYA, DESCA( LLD_ ), A( 1+IPREPAD ),
243 CALL PSFILLPAD( DESCA( CTXT_ ), NP, NQ, A, DESCA( LLD_ ), IPREPAD,
246 CALL PSFILLPAD( DESCZ( CTXT_ ), NP, MQ, Z, DESCZ( LLD_ ), IPREPAD,
247 $ IPOSTPAD, PADVAL+1.0E+0 )
249 CALL PSFILLPAD( DESCA( CTXT_ ), N, 1, WNEW, N, IPREPAD, IPOSTPAD,
252 CALL PSFILLPAD( DESCA( CTXT_ ), LWORK1, 1, WORK, LWORK1, IPREPAD,
253 $ IPOSTPAD, PADVAL+4.0E+0 )
260 CALL PSELSET( Z( 1+IPREPAD ), I, J, DESCA, 13.0E+0 )
267 CALL PSSYEVD( 'v
', UPLO, N, A( 1+IPREPAD ), IA, JA, DESCA,
268 $ WNEW( 1+IPREPAD ), Z( 1+IPREPAD ), IA, JA, DESCA,
269 $ WORK( 1+IPREPAD ), LWORK1, IWORK( 1+IPREPAD ),
274.LE.
IF( THRESH0 ) THEN
277 CALL PSCHEKPAD( DESCA( CTXT_ ), 'pssyevd-a
', NP, NQ, A,
278 $ DESCA( LLD_ ), IPREPAD, IPOSTPAD, PADVAL )
280 CALL PSCHEKPAD( DESCZ( CTXT_ ), 'pssyevd-z
', NP, MQ, Z,
281 $ DESCZ( LLD_ ), IPREPAD, IPOSTPAD,
284 CALL PSCHEKPAD( DESCA( CTXT_ ), 'pssyevd-wnew
', N, 1, WNEW, N,
285 $ IPREPAD, IPOSTPAD, PADVAL+2.0E+0 )
287 CALL PSCHEKPAD( DESCA( CTXT_ ), 'pssyevd-work
', LWORK1, 1,
288 $ WORK, LWORK1, IPREPAD, IPOSTPAD,
299 CALL IGAMN2D( DESCA( CTXT_ ), 'a
', ' ', 1, 1, ITMP, 1, 1, 1,
301 CALL IGAMX2D( DESCA( CTXT_ ), 'a
', ' ', 1, 1, ITMP( 2 ), 1, 1,
305.NE.
IF( ITMP( 1 )ITMP( 2 ) ) THEN
307 $ WRITE( NOUT, FMT = * )
308 $ 'different processes
return different info
'
310.NE.
ELSE IF( INFO0 ) THEN
312 WRITE( NOUT, FMT = 9999 )INFO
314 $ WRITE( NOUT, FMT = 9994 )
317.EQ..AND..GE.
ELSE IF( INFO14 LWORK1MINSIZE ) THEN
319 $ WRITE( NOUT, FMT = 9996 )INFO
323.EQ..OR..GT.
IF( RESULT0 INFON ) THEN
329 WORK( I ) = WNEW( I+IPREPAD )
330 WORK( I+N ) = WNEW( I+IPREPAD )
333 CALL SGAMN2D( DESCA( CTXT_ ), 'a
', ' ', N, 1, WORK, N, 1,
335 CALL SGAMX2D( DESCA( CTXT_ ), 'a
', ' ', N, 1,
336 $ WORK( 1+N ), N, 1, 1, -1, -1, 0 )
340.GT.
IF( ABS( WORK( I )-WORK( N+I ) )ZERO ) THEN
342 $ WRITE( NOUT, FMT = 9995 )
350 CALL IGAMX2D( DESCA( CTXT_ ), 'a
', ' ', 1, 1, RESULT, 1, 1, 1,
358 EPSNORMA = PSLANSY( 'i
', UPLO, N, COPYA, IA, JA, DESCA,
375 CALL PSFILLPAD( DESCA( CTXT_ ), SIZECHK, 1, WORK, SIZECHK,
376 $ IPREPAD, IPOSTPAD, 4.3E+0 )
380 CALL PSSEPCHK( N, N, COPYA, IA, JA, DESCA,
381 $ MAX( ABSTOL+EPSNORMA, SAFMIN ), THRESH,
382 $ Z( 1+IPREPAD ), IA, JA, DESCZ,
383 $ A( 1+IPREPAD ), IA, JA, DESCA,
384 $ WNEW( 1+IPREPAD ), WORK( 1+IPREPAD ),
385 $ SIZECHK, TSTNRM, RESAQ )
387 CALL PSCHEKPAD( DESCA( CTXT_ ), 'pssepchk-work
', SIZECHK, 1,
388 $ WORK, SIZECHK, IPREPAD, IPOSTPAD, 4.3E+0 )
390.NE.
IF( RESAQ0 ) THEN
392 WRITE( NOUT, FMT = 9993 )
397 CALL PSFILLPAD( DESCA( CTXT_ ), SIZEQTQ, 1, WORK, SIZEQTQ,
398 $ IPREPAD, IPOSTPAD, 4.3E+0 )
404 IWORK( IPREPAD + I ) = 0
406 CALL PSSEPQTQ( N, N, THRESH, Z( 1+IPREPAD ), IA, JA, DESCZ,
407 $ A( 1+IPREPAD ), IA, JA, DESCA,
408 $ IWORK( 1 ), IWORK( 1 ), WORK( 1 ),
409 $ WORK( IPREPAD+1 ), SIZEQTQ, QTQNRM, INFO,
412 CALL PSCHEKPAD( DESCA( CTXT_ ), 'pssepqtq-work
', SIZEQTQ, 1,
413 $ WORK, SIZEQTQ, IPREPAD, IPOSTPAD, 4.3E+0 )
415.NE.
IF( RESQTQ0 ) THEN
417 WRITE( NOUT, FMT = 9992 )
422 $ WRITE( NOUT, FMT = 9998 )INFO
429.AND..GT.
IF( WKNOWN N0 ) THEN
440 ERROR = ABS( WIN( I+IPREPAD )-WNEW( I+IPREPAD ) )
441 MAXERROR = MAX( MAXERROR, ERROR )
443 MINERROR = MIN( MAXERROR, MINERROR )
445.GT.
IF( MINERRORNORMWIN*FIVE*THRESH*EPS ) THEN
447 $ WRITE( NOUT, FMT = 9997 )MINERROR, NORMWIN
454 CALL IGAMX2D( DESCA( CTXT_ ), 'a
', ' ', 1, 1, RESULT, 1, 1, 1, -1,
462 9999 FORMAT( 'pssyevd returned info=
', I7 )
464 9997 FORMAT( 'pssdpsubtst minerror =
', D11.2, ' normwin=
', D11.2 )
465 9996 FORMAT( 'pssyevd returned info=
', I7,
466 $ ' despite adequate workspace
' )
467 9995 FORMAT( 'different processes
return different eigenvalues
' )
468 9994 FORMAT( 'heterogeneity detected by
pssyevd' )
469 9993 FORMAT( 'pssyevd failed
the |aq -qe| test
' )
470 9992 FORMAT( 'pssyevd failed
the |qtq -i| test
' )
subroutine pslasizesqp(desca, iprepad, ipostpad, sizemqrleft, sizemqrright, sizeqrf, sizetms, sizeqtq, sizechk, sizesyevx, isizesyevx, sizesyev, sizesyevd, isizesyevd, sizesubtst, isizesubtst, sizetst, isizetst)
subroutine pssdpsubtst(wknown, uplo, n, thresh, abstol, a, copya, z, ia, ja, desca, win, wnew, iprepad, ipostpad, work, lwork, lwork1, iwork, liwork, result, tstnrm, qtqnrm, nout)
subroutine pssepchk(ms, nv, a, ia, ja, desca, epsnorma, thresh, q, iq, jq, descq, c, ic, jc, descc, w, work, lwork, tstnrm, result)
subroutine pssepqtq(ms, nv, thresh, q, iq, jq, descq, c, ic, jc, descc, procdist, iclustr, gap, work, lwork, qtqnrm, info, res)
subroutine pssyevd(jobz, uplo, n, a, ia, ja, desca, w, z, iz, jz, descz, work, lwork, iwork, liwork, info)