1 SUBROUTINE psptlaschk( SYMM, UPLO, N, BWL, BWU, NRHS, X, IX, JX,
2 $ DESCX, IASEED, A, IA, JA, DESCA, IBSEED,
3 $ ANORM, RESID, WORK, WORKSIZ )
13 INTEGER BWL, BWU, IA, IASEED, IBSEED,
14 $ ix, ja, jx, n, nrhs, worksiz
18 INTEGER DESCA( * ), DESCX( * )
19 REAL A( * ), WORK( * ), X( * )
162 PARAMETER ( ONE = 1.0e+0, zero = 0.0e+0 )
163 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
164 $ lld_, mb_, m_, nb_, n_, rsrc_
165 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
166 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
167 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
169 PARAMETER ( INT_ONE = 1 )
172 INTEGER IACOL, IAROW, ICTXT,
175 $ mycol, myrow, nb, np, npcol, nprow, nq
177 INTEGER BW, INFO, IPPRODUCT, WORK_MIN
178 REAL DIVISOR, EPS, RESID1, NORMX
185 $ sgerv2d, sgesd2d, sgsum2d,
slaset
188 INTEGER ISAMAX, NUMROC
190 EXTERNAL isamax, numroc, pslamch
193 INTRINSIC abs,
max,
min, mod, real
199 ictxt = desca( ctxt_ )
202 IF( lsame( symm,
'S' ) )
THEN
205 work_min =
max(5,nb)+2*nb
208 IF( lsame( uplo,
'D' ))
THEN
213 work_min =
max(5,nb)+2*nb
216 IF ( worksiz .LT. work_min )
THEN
217 CALL pxerbla( ictxt,
'PSTLASCHK', -18 )
223 eps = pslamch( ictxt,
'eps' )
225 divisor = anorm * eps * real( n )
227 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
229 CALL infog2l( ix, jx, descx, nprow, npcol, myrow, mycol, iix, jjx,
231 np = numroc( (2), desca( mb_ ), myrow, 0, nprow )
232 nq = numroc( n, desca( nb_ ), mycol, 0, npcol )
235 ipproduct = 1 + desca( nb_ )
236 ipw = 1 + 2*desca( nb_ )
242 IF( lsame( symm,
'S' ))
THEN
243 CALL psbmatgen( ictxt, uplo, 'd
', BW, BW, N, BW+1,
244 $ DESCA( NB_ ), A, DESCA( LLD_ ), 0, 0,
245 $ IASEED, MYROW, MYCOL, NPROW, NPCOL )
248 CALL PSBMATGEN( ICTXT, 'n
', UPLO, BWL, BWU, N,
249 $ DESCA( MB_ ), DESCA( NB_ ), A,
250 $ DESCA( LLD_ ), 0, 0, IASEED, MYROW,
251 $ MYCOL, NPROW, NPCOL )
253 IF( LSAME( UPLO, 'u
' ) ) THEN
261.LT.
IF( MYCOLNPCOL-1 ) THEN
262 CALL SGESD2D( ICTXT, 1, 1,
263 $ A( START+( DESCA( NB_ )-1 )*LDA ),
264 $ LDA, MYROW, MYCOL+1 )
269 DO 230 I=DESCA( NB_ )-1,0,-1
270 A( START+(I+1)*LDA ) = A( START+(I)*LDA )
275.GT.
IF( MYCOL0 ) THEN
276 CALL SGERV2D( ICTXT, 1, 1, A( START), LDA,
291 CALL PSPBDCMV( BW+1, BW, UPLO, N, A, 1, DESCA,
292 $ 1, X( 1 + (J-1)*DESCX( LLD_ )), 1, DESCX,
293 $ WORK( IPPRODUCT ), WORK( IPW ), (BW+2)*BW, INFO )
298 CALL PSMATGEN( DESCX( CTXT_ ), 'no
', 'no', descx( m_ ),
299 $ descx( n_ ), descx( mb_ ), descx( nb_ ),
300 $ work( ipb ), descx( lld_ ), descx( rsrc_ ),
301 $ descx( csrc_ ), ibseed, 0, nq, j-1, 1, mycol,
302 $ myrow, npcol, nprow )
306 CALL psaxpy( n, -one, work( ipproduct ), 1, 1, descx, 1,
307 $ work( ipb ), 1, 1, descx, 1 )
310 $ x, 1, j, descx, 1 )
313 $ work( ipb ), 1, 1, descx, 1 )
318 resid1 = resid1 / ( normx*divisor )
320 resid =
max( resid, resid1 )
subroutine psmatgen(ictxt, aform, diag, m, n, mb, nb, a, lda, iarow, iacol, iseed, iroff, irnum, icoff, icnum, myrow, mycol, nprow, npcol)
subroutine psbmatgen(ictxt, aform, aform2, bwl, bwu, n, mb, nb, a, lda, iarow, iacol, iseed, myrow, mycol, nprow, npcol)
subroutine psptlaschk(symm, uplo, n, bwl, bwu, nrhs, x, ix, jx, descx, iaseed, a, ia, ja, desca, ibseed, anorm, resid, work, worksiz)