1 SUBROUTINE pdlaschk( SYMM, DIAG, N, NRHS, X, IX, JX, DESCX,
2 $ IASEED, IA, JA, DESCA, IBSEED, ANORM, RESID,
12 INTEGER IA, IASEED, IBSEED, IX, JA, JX, N, NRHS
13 DOUBLE PRECISION ANORM, RESID
16 INTEGER DESCA( * ), DESCX( * )
17 DOUBLE PRECISION WORK( * ), X( * )
149 INTEGER BLOCK_CYCLIC_2D,
152 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
153 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
154 DOUBLE PRECISION ZERO, ONE
155 PARAMETER ( ONE = 1.0d+0, zero = 0.0d+0 )
158 INTEGER IACOL, IAROW, IB, ICOFF, ICTXT, ICURCOL, IDUMM,
159 $ II, IIA, IIX, IOFFX, IPA, IPB, IPW, IPX, IROFF,
160 $ ixcol, ixrow, j, jbrhs, jj, jja, jjx, ldx,
161 $ mycol, myrow, np, npcol, nprow, nq
162 DOUBLE PRECISION BETA, DIVISOR, EPS, RESID1
171 DOUBLE PRECISION PDLAMCH
172 EXTERNAL idamax,
numroc, pdlamch
175 INTRINSIC abs, dble,
max,
min, mod
181 ictxt = desca( ctxt_ )
184 eps = pdlamch( ictxt,
'eps' )
186 divisor = anorm * eps * dble( n )
188 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
190 CALL infog2l( ix, jx, descx, nprow, npcol, myrow, mycol, iix, jjx,
192 iroff = mod( ia-1, desca( mb_ ) )
193 icoff = mod( ja-1, desca( nb_ ) )
194 np =
numroc( n+iroff, desca( mb_ ), myrow, iarow, nprow )
195 nq =
numroc( n+icoff, desca( nb_ ), mycol, iacol, npcol )
199 ipx = ipb + np * descx( nb_ )
200 ipa = ipx + nq * descx( nb_ )
211 DO 40 j = 1, nrhs, descx( nb_ )
212 jbrhs =
min( descx( nb_ ), nrhs-j+1 )
216 ioffx = iix + ( jjx - 1 ) * descx( lld_ )
217 CALL pbdtran( ictxt,
'Column',
'Transpose', n, jbrhs,
218 $ descx( mb_ ), x( ioffx ), descx( lld_ ), zero,
219 $ work( ipx ), jbrhs, ixrow, icurcol, -1, iacol,
224 IF( mycol.EQ.icurcol )
THEN
225 CALL pdmatgen( ictxt, 'n
', 'n
', DESCX( M_ ), DESCX( N_ ),
226 $ DESCX( MB_ ), DESCX( NB_ ), WORK( IPB ), LDX,
227 $ IXROW, IXCOL, IBSEED, IIX-1, NP, JJX-1,
228 $ JBRHS, MYROW, MYCOL, NPROW, NPCOL )
235 DO 10 II = IIA, IIA+NP-1, DESCA( MB_ )
236 IB = MIN( DESCA( MB_ ), IIA+NP-II )
240 CALL PDMATGEN( ICTXT, SYMM, DIAG, DESCA( M_ ),
241 $ DESCA( N_ ), DESCA( MB_ ), DESCA( NB_ ),
242 $ WORK( IPA ), IB, DESCA( RSRC_ ),
243 $ DESCA( CSRC_ ), IASEED, II-1, IB,
244 $ JJA-1, NQ, MYROW, MYCOL, NPROW, NPCOL )
248 CALL DGEMM( 'no transpose
', 'transpose
', IB, JBRHS, NQ,
249 $ -ONE, WORK( IPA ), IB, WORK( IPX ), JBRHS,
250 $ BETA, WORK( IPB+II-IIA ), LDX )
254.NE.
ELSE IF( MYCOLICURCOL ) THEN
256 CALL DLASET( 'all
', NP, JBRHS, ZERO, ZERO, WORK( IPB ),
263 CALL DGSUM2D( ICTXT, 'row
', ' ', NP, JBRHS, WORK( IPB ), LDX,
266.EQ.
IF( MYCOLICURCOL ) THEN
271 DO 20 JJ = 0, JBRHS - 1
273 II = IDAMAX( NP, WORK( IPB+JJ*LDX ), 1 )
274 WORK( IPA+JJ ) = ABS( WORK( IPB+II-1+JJ*LDX ) )
275 WORK( IPW+JJ ) = ABS( X( IOFFX + IDAMAX( NP,
276 $ X( IOFFX + JJ*DESCX( LLD_ ) ), 1 )-1+JJ*
279 WORK( IPA+JJ ) = ZERO
280 WORK( IPW+JJ ) = ZERO
288 CALL DGAMX2D( ICTXT, 'column
', ' ', 1, 2*JBRHS,
289 $ WORK( IPA ), 1, IDUMM, IDUMM, -1, 0, ICURCOL )
293.EQ.
IF( MYROW0 ) THEN
294 DO 30 JJ = 0, JBRHS - 1
295 RESID1 = WORK( IPA+JJ ) / ( WORK( IPW+JJ )*DIVISOR )
296.LT.
IF( RESIDRESID1 )
300 $ CALL DGESD2D( ICTXT, 1, 1, RESID, 1, 0, 0 )
303.EQ..AND..EQ.
ELSE IF( MYROW0 MYCOL0 ) THEN
305 CALL DGERV2D( ICTXT, 1, 1, RESID1, 1, 0, ICURCOL )
306.LT.
IF( RESIDRESID1 )
311.EQ.
IF( MYCOLICURCOL )
313 ICURCOL = MOD( ICURCOL+1, NPCOL )
317.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
318 CALL DGEBS2D( ICTXT, 'all
', ' ', 1, 1, RESID, 1 )
320 CALL DGEBR2D( ICTXT, 'all
', ' ', 1, 1, RESID, 1, 0, 0 )
subroutine pdmatgen(ictxt, aform, diag, m, n, mb, nb, a, lda, iarow, iacol, iseed, iroff, irnum, icoff, icnum, myrow, mycol, nprow, npcol)
subroutine pbdtran(icontxt, adist, trans, m, n, nb, a, lda, beta, c, ldc, iarow, iacol, icrow, iccol, work)
subroutine pdlaschk(symm, diag, n, nrhs, x, ix, jx, descx, iaseed, ia, ja, desca, ibseed, anorm, resid, work)