1 SUBROUTINE pclaschk( 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
16 INTEGER DESCA( * ), DESCX( * )
149 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
150 $ LLD_, MB_, M_, NB_, N_, RSRC_
151 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
152 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
153 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
155 PARAMETER ( ONE = ( 1.0e+0, 0.0e+0 ),
156 $ zero = ( 0.0e+0, 0.0e+0 ) )
159 INTEGER , IAROW, IB, ICOFF, , ICURCOL, IDUMM,
160 $ II, IIA, IIX, , IPA, IPB, IPW, IPX, IROFF,
161 $ ixcol, ixrow, j, jbrhs, jj, jja, jjx, ldx,
162 $ mycol, myrow, np, npcol, nprow, nq
163 REAL DIVISOR, EPS, RESID1
172 INTEGER ICAMAX, NUMROC
174 EXTERNAL icamax, numroc, pslamch
177 INTRINSIC abs,
max,
min, mod, real
183 ictxt = desca( ctxt_ )
186 eps = pslamch( ictxt,
'eps' )
188 divisor = anorm * eps * real( n )
190 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
192 CALL infog2l( ix, jx, descx, nprow, npcol, myrow, mycol, iix, jjx,
194 iroff = mod( ia-1, desca( mb_ ) )
195 icoff = mod( ja-1, desca( nb_ ) )
196 np = numroc( n+iroff, desca( mb_ ), myrow, iarow, nprow )
197 nq = numroc( n+icoff, desca( nb_ ), mycol, iacol, npcol )
201 ipx = ipb + np * descx( nb_ )
202 ipa = ipx + nq * descx( nb_ )
213 DO 40 j = 1, nrhs, descx( nb_ )
214 jbrhs =
min( descx( nb_ ), nrhs-j+1 )
218 ioffx = iix + ( jjx - 1 ) * descx( lld_ )
219 CALL pbctran( ictxt,
'Column', 'transpose
', N, JBRHS,
220 $ DESCX( MB_ ), X( IOFFX ), DESCX( LLD_ ), ZERO,
221 $ WORK( IPX ), JBRHS, IXROW, ICURCOL, -1, IACOL,
226.EQ.
IF( MYCOLICURCOL ) THEN
227 CALL PCMATGEN( ICTXT, 'n
', 'n
', DESCX( M_ ), DESCX( N_ ),
228 $ DESCX( MB_ ), DESCX( NB_ ), WORK( IPB ), LDX,
229 $ IXROW, IXCOL, IBSEED, IIX-1, NP, JJX-1,
230 $ JBRHS, MYROW, MYCOL, NPROW, NPCOL )
237 DO 10 II = IIA, IIA+NP-1, DESCA( MB_ )
238 IB = MIN( DESCA( MB_ ), IIA+NP-II )
242 CALL PCMATGEN( ICTXT, SYMM, DIAG, DESCA( M_ ),
243 $ DESCA( N_ ), DESCA( MB_ ), DESCA( NB_ ),
244 $ WORK( IPA ), IB, DESCA( RSRC_ ),
245 $ DESCA( CSRC_ ), IASEED, II-1, IB,
246 $ JJA-1, NQ, MYROW, MYCOL, NPROW, NPCOL )
250 CALL CGEMM( 'no transpose
', 'transpose
', IB, JBRHS, NQ,
251 $ -ONE, WORK( IPA ), IB, WORK( IPX ), JBRHS,
252 $ BETA, WORK( IPB+II-IIA ), LDX )
256.NE.
ELSE IF( MYCOLICURCOL ) THEN
258 CALL CLASET( 'all
', NP, JBRHS, ZERO, ZERO, WORK( IPB ),
265 CALL CGSUM2D( ICTXT, 'row
', ' ', NP, JBRHS, WORK( IPB ), LDX,
268.EQ.
IF( MYCOLICURCOL ) THEN
273 DO 20 JJ = 0, JBRHS - 1
275 II = ICAMAX( NP, WORK( IPB+JJ*LDX ), 1 )
276 WORK( IPA+JJ ) = ABS( WORK( IPB+II-1+JJ*LDX ) )
277 WORK( IPW+JJ ) = ABS( X( IOFFX + ICAMAX( NP,
278 $ X( IOFFX + JJ*DESCX( LLD_ ) ), 1 )-1+JJ*
281 WORK( IPA+JJ ) = ZERO
282 WORK( IPW+JJ ) = ZERO
290 CALL CGAMX2D( ICTXT, 'column
', ' ', 1, 2*JBRHS,
291 $ WORK( IPA ), 1, IDUMM, IDUMM, -1, 0, ICURCOL )
295.EQ.
IF( MYROW0 ) THEN
296 DO 30 JJ = 0, JBRHS - 1
297 RESID1 = REAL( WORK( IPA+JJ ) ) /
298 $ ( REAL( WORK( IPW+JJ ) )*DIVISOR )
299.LT.
IF( RESIDRESID1 )
303 $ CALL SGESD2D( ICTXT, 1, 1, RESID, 1, 0, 0 )
306.EQ..AND..EQ.
ELSE IF( MYROW0 MYCOL0 ) THEN
308 CALL SGERV2D( ICTXT, 1, 1, RESID1, 1, 0, ICURCOL )
309.LT.
IF( RESIDRESID1 )
314.EQ.
IF( MYCOLICURCOL )
316 ICURCOL = MOD( ICURCOL+1, NPCOL )
320.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
321 CALL SGEBS2D( ICTXT, 'all',
' ', 1, 1, resid, 1 )
323 CALL sgebr2d( ictxt,
'All',
' ', 1, 1, resid, 1, 0,
subroutine pcmatgen(ictxt, aform, diag, m, n, mb, nb, a, lda, iarow, iacol, iseed, iroff, irnum, icoff, icnum, myrow, mycol, nprow, npcol)
subroutine pbctran(icontxt, adist, trans, m, n, nb, a, lda, beta, c, ldc, iarow, iacol, icrow, iccol, work)
subroutine pclaschk(symm, diag, n, nrhs, x, ix, jx, descx, iaseed, ia, ja, desca, ibseed, anorm, resid, work)