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, mb_ = 5, nb_ = 6,
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
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
237 CALL BLACS_GRIDINFO( DESCA( CTXT_ ), NPROW, NPCOL, MYROW, MYCOL )
240.EQ..AND..EQ.
IF( MYROW0 MYCOL0 )
246.GE..OR..LT.
IF( MYROWNPROW MYROW0 )
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.LE.
IF( THRESH0 ) 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
' )
subroutine pcheevd(jobz, uplo, n, a, ia, ja, desca, w, z, iz, jz, descz, work, lwork, rwork, lrwork, iwork, liwork, info)
subroutine pclasizesep(desca, iprepad, ipostpad, sizemqrleft, sizemqrright, sizeqrf, sizetms, rsizeqtq, rsizechk, sizeheevx, rsizeheevx, isizeheevx, sizeheevd, rsizeheevd, isizeheevd, sizesubtst, rsizesubtst, isizesubtst, sizetst, rsizetst, isizetst)
subroutine pcsdpsubtst(wknown, uplo, n, thresh, abstol, a, copya, z, ia, ja, desca, win, wnew, iprepad, ipostpad, work, lwork, rwork, lrwork, lwork1, iwork, liwork, result, tstnrm, qtqnrm, nout)
subroutine pcsepchk(ms, nv, a, ia, ja, desca, epsnorma, thresh, q, iq, jq, descq, c, ic, jc, descc, w, work, lwork, tstnrm, result)
subroutine pcsepqtq(ms, nv, thresh, q, iq, jq, descq, c, ic, jc, descc, procdist, iclustr, gap, work, lwork, qtqnrm, info, res)