3 SUBROUTINE pssepqtq( MS, NV, THRESH, Q, IQ, JQ, DESCQ, C, IC, JC,
4 $ DESCC, PROCDIST, ICLUSTR, GAP, WORK, LWORK,
13 INTEGER IC, INFO, IQ, JC, JQ, LWORK, MS, NV, RES
18 INTEGER DESCC( * ), DESCQ( * ), ICLUSTR( * ),
20 REAL C( * ), GAP( * ), Q( * ), WORK( * )
174 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
175 $ MB_, NB_, RSRC_, CSRC_, LLD_
176 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
177 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
178 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
179 REAL ZERO, ONE, NEGONE
180 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0,
188 INTEGER CLUSTER, FIRSTP, IMAX, IMIN, JMAX, JMIN, LWMIN,
189 $ MQ0, MYCOL, MYROW, NEXTP, NP0, NPCOL, NPROW
194 REAL PSLAMCH, PSLANGE
195 EXTERNAL numroc, pslamch, pslange
203 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
208 ulp = pslamch( descc( ctxt_ ),
'P' )
212 CALL chk1mat( ms, 1, ms, 2, iq, jq, descq, 7, info )
213 CALL chk1mat( nv, 1, ms, 2, ic, jc, descc, 11, info )
216 np0 = numroc( nv, descc( mb_ ), 0, 0, nprow )
217 mq0 = numroc( nv, descc( nb_ ), 0, 0, npcol )
219 lwmin = 2 +
max( descc( mb_ ), 2 )*( 2*np0+mq0 )
223 ELSE IF( jq.NE.1 )
THEN
225 ELSE IF( ic.NE.1 )
THEN
227 ELSE IF( jc.NE.1 )
THEN
229 ELSE IF( lwork.LT.lwmin )
THEN
235 CALL pxerbla( descc( ctxt_ ),
'PSSEPQTQ', -info )
241 CALL pslaset( 'a
', NV, NV, ZERO, ONE, C, IC, JC, DESCC )
245.GT.
IF( NV*MS0 ) THEN
246 CALL PSGEMM( 'transpose
', 'n
', NV, NV, MS, NEGONE, Q, 1, 1,
247 $ DESCQ, Q, 1, 1, DESCQ, ONE, C, 1, 1, DESCC )
252 NORM = PSLANGE( '1
', NV, NV, C, 1, 1, DESCC, WORK )
253 QTQNRM = NORM / ( REAL( MAX( MS, 1 ) )*ULP )
257 DO 20 FIRSTP = 1, NPROW*NPCOL
258.GE.
IF( PROCDIST( FIRSTP )ICLUSTR( 2*( CLUSTER-1 )+1 ) )
263 IMIN = ICLUSTR( 2*CLUSTER-1 )
264 JMAX = ICLUSTR( 2*CLUSTER )
270 DO 40 NEXTP = FIRSTP, NPROW*NPCOL
271 IMAX = PROCDIST( NEXTP )
275 CALL PSMATADD( IMAX-IMIN+1, JMAX-JMIN+1, ZERO, C, IMIN, JMIN,
276 $ DESCC, GAP( CLUSTER ) / 0.01E+0, C, IMIN, JMIN,
278 CALL PSMATADD( JMAX-JMIN+1, IMAX-IMIN+1, ZERO, C, JMIN, IMIN,
279 $ DESCC, GAP( CLUSTER ) / 0.01E+0, C, JMIN, IMIN,
283.LT.
IF( ICLUSTR( 2*CLUSTER )PROCDIST( NEXTP+1 ) )
288 CLUSTER = CLUSTER + 1
294 NORM = PSLANGE( '1
', NV, NV, C, 1, 1, DESCC, WORK )
296 QTQNRM2 = NORM / ( REAL( MAX( MS, 1 ) )*ULP )
298.GT.
IF( QTQNRM2THRESH ) THEN
subroutine pssepqtq(ms, nv, thresh, q, iq, jq, descq, c, ic, jc, descc, procdist, iclustr, gap, work, lwork, qtqnrm, info, res)