3 SUBROUTINE pzgsepchk( IBTYPE, MS, NV, A, IA, JA, DESCA, B, IB, JB,
4 $ DESCB, THRESH, Q, IQ, JQ, DESCQ, C, IC, JC,
5 $ DESCC, W, WORK, LWORK, TSTNRM, RESULT )
13 INTEGER IA, IB, IBTYPE, IC, IQ, JA, JB, JC, JQ, LWORK,
15 DOUBLE PRECISION THRESH, TSTNRM
19 INTEGER DESCA( * ), DESCB( * ), DESCC( * ), DESCQ( * )
20 DOUBLE PRECISION W( * ), WORK( * )
21 COMPLEX*16 A( * ), B( * ), C( * ), Q( * )
217 INTEGER I, INFO, MYCOL, MYROW, NPCOL, NPROW, NQ
218 DOUBLE PRECISION ANORM, ULP
221 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
222 $ MB_, NB_, RSRC_, , LLD_
223 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
224 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
225 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
226 DOUBLE PRECISION ONE, ZERO
227 PARAMETER ( ONE = 1.0d+0, zero = 0.0d+0 )
228 COMPLEX*16 CONE, CNEGONE, CZERO
229 parameter( cone = 1.0d+0, cnegone = -1.0d+0,
234 DOUBLE PRECISION DLAMCH, PZLANGE
235 EXTERNAL numroc, dlamch, pzlange
246 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
254 CALL chk1mat( ms, 1, ms, 2, ia, ja, desca, 7, info )
255 CALL chk1mat( ms, 1, ms, 2, ib, jb, descb, 11, info )
256 CALL chk1mat( ms, 1, nv, 2, iq, jq, descq, 16, info )
257 CALL chk1mat( ms, 1, nv, 2, ib, jb, descb, 20, info )
261 nq = numroc( nv, desca( nb_ ), mycol, 0, npcol )
265 ELSE IF( jq.NE.1 )
THEN
267 ELSE IF( ia.NE.1 )
THEN
269 ELSE IF( ja.NE.1 )
THEN
271 ELSE IF( ib.NE.1 )
THEN
273 ELSE IF( jb.NE.1 )
THEN
275 ELSE IF( lwork.LT.nq )
THEN
281 CALL pxerbla( desca( ctxt_ ),
'PZGSEPCHK', -info )
286 ulp = dlamch(
'Epsilon' )
290 anorm = pzlange(
'M', ms, ms, a, ia, ja, desca, work )*
291 $ pzlange(
'M', ms, nv, q
295 IF( ibtype.EQ.1 )
THEN
301 CALL pzgemm( 'n
', 'n
', MS, NV, MS, CONE, A, IA, JA, DESCA, Q,
302 $ IQ, JQ, DESCQ, CZERO, C, IC, JC, DESCC )
307 CALL PZDSCAL( MS, W( I ), Q, IQ, JQ+I-1, DESCQ, 1 )
312 CALL PZGEMM( 'n
', 'n
', MS, NV, MS, CONE, B, IB, JB, DESCB, Q,
313 $ IQ, JQ, DESCQ, CNEGONE, C, IC, JC, DESCC )
315 TSTNRM = ( PZLANGE( 'm
', MS, NV, C, IC, JC, DESCC, WORK ) /
316 $ ANORM ) / ( MAX( MS, 1 )*ULP )
319.EQ.
ELSE IF( IBTYPE2 ) THEN
326 CALL PZGEMM( 'n
', 'n
', MS, NV, MS, CONE, B, IB, JB, DESCB, Q,
327 $ IQ, JQ, DESCQ, CZERO, C, IC, JC, DESCC )
332 CALL PZDSCAL( MS, W( I ), Q, IQ, JQ+I-1, DESCQ, 1 )
337 CALL PZGEMM( 'n
', 'n
', MS, NV, MS, CONE, A, IA, JA, DESCA, C,
338 $ IC, JC, DESCC, CNEGONE, Q, IQ, JQ, DESCQ )
340 TSTNRM = ( PZLANGE( 'm
', MS, NV, Q, IQ, JQ, DESCQ, WORK ) /
341 $ ANORM ) / ( MAX( MS, 1 )*ULP )
343.EQ.
ELSE IF( IBTYPE3 ) THEN
350 CALL PZGEMM( 'n
', 'n
', MS, NV, MS, CONE, A, IA, JA, DESCA, Q,
351 $ IQ, JQ, DESCQ, CZERO, C, IC, JC, DESCC )
356 CALL PZDSCAL( MS, W( I ), Q, IQ, JQ+I-1, DESCQ, 1 )
361 CALL PZGEMM( 'n
', 'n
', MS, NV, MS, CONE, B, IB, JB, DESCB, C,
362 $ IC, JC, DESCC, CNEGONE, Q, IQ, JQ, DESCQ )
364 TSTNRM = ( PZLANGE( 'm
', MS, NV, Q, IQ, JQ, DESCQ, WORK ) /
365 $ ANORM ) / ( MAX( MS, 1 )*ULP )
369.GT..OR..NE.
IF( TSTNRMTHRESH ( TSTNRM-TSTNRM0.0D0 ) ) THEN
subroutine pzgsepchk(ibtype, ms, nv, a, ia, ja, desca, b, ib, jb, descb, thresh, q, iq, jq, descq, c, ic, jc, descc, w, work, lwork, tstnrm, result)