1 REAL function
pcqrt14( trans, m, n, nrhs, a, ia, ja,
2 $ desca, x, ix, jx, descx, work )
11 INTEGER ia, ix, ja, jx, m, n, nrhs
14 INTEGER desca( * ), descx( * )
15 COMPLEX a( * ), work( * ), x( * )
173 INTEGER block_cyclic_2d, csrc_, ctxt_, dlen_, dtype_,
174 $ lld_, mb_, m_, nb_, n_, rsrc_
175 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
176 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
177 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
179 parameter( zero = 0.0e+0, one = 1.0e+0 )
183 INTEGER iacol, iarow, icoffa, ictxt, idum, iia, info,
184 $ iptau, ipw, ipwa, iroffa, iwa, iwx, j, jja,
185 $ jwa, jwx, ldw, lwork, mpwa, mpw, mqw, mycol,
186 $ myrow, npcol, nprow, npw, nqwa, nqw
191 INTEGER descw( dlen_ ), idum1( 1 ), idum2( 1 )
206 INTRINSIC abs,
max,
min, mod, real
212 ictxt = desca( ctxt_ )
218 iroffa = mod( ia-1, desca( mb_ ) )
219 icoffa = mod( ja-1, desca( nb_ ) )
222 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia,
223 $ jja, iarow, iacol )
224 mpwa =
numroc( m+iroffa, desca( mb_ ), myrow, iarow, nprow )
225 nqwa =
numroc( n+icoffa, desca( nb_ ), mycol, iacol, npcol )
228 IF(
lsame( trans,
'N' ) )
THEN
229 IF( n.LE.0 .OR. nrhs.LE.0 )
232 mpw =
numroc( m+nrhs+iroffa, desca( mb_ ), myrow, iarow,
242 CALL descset( descw, m+nrhs+iroffa, n+icoffa, desca( mb_ ),
243 $ desca( nb_ ), iarow, iacol, ictxt, ldw )
245 ELSE IF(
lsame( trans,
'C' ) )
THEN
246 IF( m.LE.0 .OR. nrhs.LE.0 )
250 nqw =
numroc( n+nrhs+icoffa, desca( nb_ ), mycol, iacol,
259 CALL descset( descw, m+iroffa, n+nrhs+icoffa, desca( mb_ ),
260 $ desca( nb_ ), iarow, iacol, ictxt, ldw )
262 CALL pxerbla( ictxt,
'PCQRT14', -1 )
268 iptau = ipwa + mpw*nqw
269 CALL pclacpy(
'All', m, n, a, ia, ja, desca, work( ipwa ), iwa,
272 anrm =
pclange(
'M', m, n, work( ipwa ), iwa, jwa, descw, rwork )
274 $
CALL pclascl( 'g
', ANRM, ONE, M, N, WORK( IPWA ), IWA,
284 CALL PCCOPY( M, X, IX, JX+J-1, DESCX, 1, WORK( IPWA ), IWX,
285 $ JWX+J-1, DESCW, 1 )
287 XNRM = PCLANGE( 'm
', M, NRHS, WORK( IPWA ), IWX, JWX, DESCW,
290 $ CALL PCLASCL( 'g
', XNRM, ONE, M, NRHS, WORK( IPWA ), IWX,
295 MQW = NUMROC( M+ICOFFA, DESCA( NB_ ), MYCOL, IACOL, NPCOL )
296 IPW = IPTAU + MIN( MQW, NQW )
297 LWORK = DESCW( NB_ ) * ( MPW + NQW + DESCW( NB_ ) )
298 CALL PCGEQRF( M, N+NRHS, WORK( IPWA ), IWA, JWA, DESCW,
299 $ WORK( IPTAU ), WORK( IPW ), LWORK, INFO )
306 DO 20 J = JWX, JWA+N+NRHS-1
307 CALL PCMAX1( MIN(M-N,J-JWX+1), AMAX, IDUM, WORK( IPWA ),
308 $ IWA+N, J, DESCW, 1 )
309 ERR = MAX( ERR, ABS( AMAX ) )
312 CALL SGAMX2D( ICTXT, 'all
', ' ', 1, 1, ERR, 1, IDUM1, IDUM2,
320 CALL PCCOPY( N, X, IX, JX+J-1, DESCX, 1, WORK( IPWA ),
321 $ IWX+J-1, JWX, DESCW, DESCW( M_ ) )
322 CALL PCLACGV( N, WORK( IPWA ), IWX+J-1, JWX, DESCW,
326 XNRM = PCLANGE( 'm
', NRHS, N, WORK( IPWA ), IWX, JWX, DESCW,
329 $ CALL PCLASCL( 'g
', XNRM, ONE, NRHS, N, WORK( IPWA ), IWX,
334 NPW = NUMROC( N+IROFFA, DESCA( MB_ ), MYROW, IAROW, NPROW )
335 IPW = IPTAU + MIN( MPW, NPW )
336 LWORK = DESCW( MB_ ) * ( MPW + NQW + DESCW( MB_ ) )
337 CALL PCGELQF( M+NRHS, N, WORK( IPWA ), IWA, JWA, DESCW,
338 $ WORK( IPTAU ), WORK( IPW ), LWORK, INFO )
344 DO 40 J = JWA+M, MIN( JWA+N-1, JWA+M+NRHS-1 )
345 CALL PCMAX1( JWA+M+NRHS-J, AMAX, IDUM, WORK( IPWA ),
346 $ IWX+J-JWA-M, J, DESCW, 1 )
347 ERR = MAX( ERR, ABS( AMAX ) )
349 CALL SGAMX2D( ICTXT, 'all
', ' ', 1, 1, ERR, 1, IDUM1, IDUM2,
354 PCQRT14 = ERR / ( REAL( MAX( M, N, NRHS ) ) *
355 $ PSLAMCH( ICTXT, 'epsilon
' ) )