1 DOUBLE PRECISION FUNCTION pdqrt14( 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 DOUBLE PRECISION a( * ), work( * ), x( * )
173 INTEGER block_cyclic_2d, csrc_, ctxt_, dlen_, dtype_,
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 )
178 DOUBLE PRECISION one, zero
179 parameter( zero = 0.0d+0, one = 1.0d+0 )
183 INTEGER iacol, iarow, icoffa, ictxt, , 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
187 DOUBLE PRECISION amax, anrm, err, xnrm
190 INTEGER descw( dlen_ ), idum1( 1 ), idum2( 1 )
191 DOUBLE PRECISION rwork( 1 )
205 INTRINSIC abs, dble,
max,
min, mod
211 ictxt = desca( ctxt_ )
217 iroffa = mod( ia-1, desca( mb_ ) )
218 icoffa = mod( ja-1, desca( nb_ ) )
221 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia,
222 $ jja, iarow, iacol )
223 mpwa =
numroc( m+iroffa, desca( mb_ ), myrow, iarow, nprow )
224 nqwa =
numroc( n+icoffa, desca( nb_ ), mycol, iacol, npcol )
227 IF(
lsame( trans, 'n
' ) ) THEN
228.LE..OR..LE.
IF( N0 NRHS0 )
231 MPW = NUMROC( M+NRHS+IROFFA, DESCA( MB_ ), MYROW, IAROW,
241 CALL DESCSET( DESCW, M+NRHS+IROFFA, N+ICOFFA, DESCA( MB_ ),
242 $ DESCA( NB_ ), IAROW, IACOL, ICTXT, LDW )
244 ELSE IF( LSAME( TRANS, 't
' ) ) THEN
245.LE..OR..LE.
IF( M0 NRHS0 )
249 NQW = NUMROC( N+NRHS+ICOFFA, DESCA( NB_ ), MYCOL, IACOL,
258 CALL DESCSET( DESCW, M+IROFFA, N+NRHS+ICOFFA, DESCA( MB_ ),
259 $ DESCA( NB_ ), IAROW, IACOL, ICTXT, LDW )
261 CALL PXERBLA( ICTXT, 'pdqrt14', -1 )
267 IPTAU = IPWA + MPW*NQW
268 CALL PDLACPY( 'all
', M, N, A, IA, JA, DESCA, WORK( IPWA ), IWA,
271 ANRM = PDLANGE( 'm
', M, N, WORK( IPWA ), IWA, JWA, DESCW, RWORK )
273 $ CALL PDLASCL( 'g
', ANRM, ONE, M, N, WORK( IPWA ), IWA,
283 CALL PDCOPY( M, X, IX, JX+J-1, DESCX, 1, WORK( IPWA ), IWX,
284 $ JWX+J-1, DESCW, 1 )
286 XNRM = PDLANGE( 'm
', M, NRHS, WORK( IPWA ), IWX, JWX, DESCW,
289 $ CALL PDLASCL( 'g
', XNRM, ONE, M, NRHS, WORK( IPWA ), IWX,
294 MQW = NUMROC( M+ICOFFA, DESCA( NB_ ), MYCOL, IACOL, NPCOL )
295 IPW = IPTAU + MIN( MQW, NQW )
296 LWORK = DESCW( NB_ ) * ( MPW + NQW + DESCW( NB_ ) )
297 CALL PDGEQRF( M, N+NRHS, WORK( IPWA ), IWA, JWA, DESCW,
298 $ WORK( IPTAU ), WORK( IPW ), LWORK, INFO )
305 DO 20 J = JWX, JWA+N+NRHS-1
306 CALL PDAMAX( MIN(M-N,J-JWX+1), AMAX, IDUM, WORK( IPWA ),
307 $ IWA+N, J, DESCW, 1 )
308 ERR = MAX( ERR, ABS( AMAX ) )
311 CALL DGAMX2D( ICTXT, 'all
', ' ', 1, 1, ERR, 1, IDUM1, IDUM2,
319 CALL PDCOPY( N, X, IX, JX+J-1, DESCX, 1, WORK( IPWA ),
320 $ IWX+J-1, JWX, DESCW, DESCW( M_ ) )
323 XNRM = PDLANGE( 'm
', NRHS, N, WORK( IPWA ), IWX, JWX, DESCW,
326 $ CALL PDLASCL( 'g
', XNRM, ONE, NRHS, N, WORK( IPWA ), IWX,
331 NPW = NUMROC( N+IROFFA, DESCA( MB_ ), MYROW, IAROW, NPROW )
332 IPW = IPTAU + MIN( MPW, NPW )
333 LWORK = DESCW( MB_ ) * ( MPW + NQW + DESCW( MB_ ) )
334 CALL PDGELQF( M+NRHS, N, WORK( IPWA ), IWA, JWA, DESCW,
335 $ WORK( IPTAU ), WORK( IPW ), LWORK, INFO )
341 DO 40 J = JWA+M, MIN( JWA+N-1, JWA+M+NRHS-1 )
342 CALL PDAMAX( JWA+M+NRHS-J, AMAX, IDUM, WORK( IPWA ),
343 $ IWX+J-JWA-M, J, DESCW, 1 )
344 ERR = MAX( ERR, ABS( AMAX ) )
346 CALL DGAMX2D( ICTXT, 'all
', ' ', 1, 1, ERR, 1, IDUM1, IDUM2,
351 PDQRT14 = ERR / ( DBLE( MAX( M, N, NRHS ) ) *
352 $ PDLAMCH( ICTXT, 'epsilon
' ) )
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
subroutine pdlacpy(uplo, m, n, a, ia, ja, desca, b, ib, jb, descb)
double precision function pdqrt14(trans, m, n, nrhs, a, ia, ja, desca, x, ix, jx, descx, work)