1 SUBROUTINE pdlabrd( M, N, NB, A, IA, JA, DESCA, D, E, TAUQ, TAUP,
2 $ X, IX, JX, DESCX, Y, IY, JY, DESCY, WORK )
10 INTEGER IA, IX, IY, , JX, JY, M, N, NB
13 INTEGER DESCA( * ), DESCX( * ), DESCY( * )
14 DOUBLE PRECISION A( * ), D( * ), E( * ), TAUP( * ),
248 INTEGER BLOCK_CYCLIC_2D, , CTXT_, DLEN_, DTYPE_,
249 $ lld_, mb_, m_, nb_, n_, rsrc_
250 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
251 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
252 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
253 DOUBLE PRECISION ONE, ZERO
254 parameter( one = 1.0d+0, zero = 0.0d+0 )
257 INTEGER I, IACOL, IAROW, ICTXT, II, IPY, IW, J, JJ,
258 $ jwy, k, mycol, myrow, npcol, nprow
259 DOUBLE PRECISION ALPHA, TAU
260 INTEGER DESCD( DLEN_ ), DESCE( DLEN_ ),
261 $ desctp( dlen_ ), desctq( dlen_ ),
262 $ descw( dlen_ ), descwy( dlen_ )
276 IF( m.LE.0 .OR. n.LE.0 )
279 ictxt = desca( ctxt_ )
281 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, ii, jj,
283 ipy = desca( mb_ ) + 1
284 iw = mod( ia-1, desca( nb_ ) ) + 1
287 CALL descset( descwy, 1, n+mod( ia-1, descy( nb_ ) ), 1,
288 $ desca( nb_ ), iarow, iacol, ictxt, 1 )
289 CALL descset( descw, desca( mb_ ), 1, desca( mb_ ), 1, iarow,
290 $ iacol, ictxt, desca( mb_ ) )
291 CALL descset( desctq, 1, ja+
min(m,n)-1, 1, desca( nb_ ), iarow,
292 $ desca( csrc_ ), desca( ctxt_ ), 1 )
293 CALL descset( desctp, ia+
min(m,n)-1, 1, desca( mb_ ), 1,
294 $ desca( rsrc_ ), iacol, desca( ctxt_ ),
301 CALL descset( descd, 1, ja+
min(m,n)-1, 1, desca( nb_
302 $ desca( csrc_ ), desca( ctxt_ ), 1 )
303 CALL descset( desce, ia+
min(m,n)-1, 1, desca( mb_ ), 1,
304 $ desca( rsrc_ ), mycol, desca( ctxt_ ),
314 CALL pdgemv(
'No transpose', m-k+1, k-1, -one, a, i, ja,
315 $ desca, y, iy, jy+k-1, descy, 1, one, a, i,
317 CALL pdgemv(
'No transpose', m-k+1, k-1, -one, x, ix+k-1,
318 $ jx, descx, a, ia, j, desca, 1, one, a, i, j,
320 CALL pdelset( a, i-1, j, desca, alpha )
325 CALL pdlarfg( m-k+1, alpha, i, j, a, i+1, j, desca, 1,
327 CALL pdelset( d, 1, j, descd, alpha )
328 CALL pdelset( a, i, j, desca, one )
332 CALL pdgemv(
'Transpose', m-k+1, n-k, one, a, i, j+1, desca,
333 $ a, i, j, desca, 1, zero, work( ipy ), 1, jwy,
334 $ descwy, descwy( m_ ) )
335 CALL pdgemv(
'Transpose', m-k+1, k-1, one, a, i, ja, desca,
336 $ a, i, j, desca, 1, zero, work, iw, 1, descw,
338 CALL pdgemv(
'Transpose', k-1, n-k, -one, y, iy, jy+k,
339 $ descy, work, iw, 1, descw, 1, one, work( ipy ),
340 $ 1, jwy, descwy, descwy( m_ ) )
341 CALL pdgemv(
'Transpose', m-k+1, k-1, one, x, ix+k-1, jx,
344 CALL pdgemv(
'Transpose', k-1, n-k, -one, a, ia, j+1, desca,
345 $ work, iw, 1, descw, 1, one, work( ipy ), 1,
346 $ jwy, descwy, descwy( m_ ) )
348 CALL pdelget(
'Rowwise', '
', TAU, TAUQ, 1, J, DESCTQ )
349 CALL PDSCAL( N-K, TAU, WORK( IPY ), 1, JWY, DESCWY,
351 CALL PDCOPY( N-K, WORK( IPY ), 1, JWY, DESCWY, DESCWY( M_ ),
352 $ Y, IY+K-1, JY+K, DESCY, DESCY( M_ ) )
356 CALL PDGEMV( 'transpose
', K, N-K, -ONE, Y, IY, JY+K, DESCY,
357 $ A, I, JA, DESCA, DESCA( M_ ), ONE, A, I, J+1,
358 $ DESCA, DESCA( M_ ) )
359 CALL PDGEMV( 'transpose
', K-1, N-K, -ONE, A, IA, J+1, DESCA,
360 $ X, IX+K-1, JX, DESCX, DESCX( M_ ), ONE, A, I,
361 $ J+1, DESCA, DESCA( M_ ) )
362 CALL PDELSET( A, I, J, DESCA, ALPHA )
366 CALL PDLARFG( N-K, ALPHA, I, J+1, A, I,
367 $ MIN( J+2, N+JA-1 ), DESCA, DESCA( M_ ), TAUP )
368 CALL PDELSET( E, I, 1, DESCE, ALPHA )
369 CALL PDELSET( A, I, J+1, DESCA, ONE )
373 CALL PDGEMV( 'no transpose
', M-K, N-K, ONE, A, I+1, J+1,
374 $ DESCA, A, I, J+1, DESCA, DESCA( M_ ), ZERO, X,
375 $ IX+K, JX+K-1, DESCX, 1 )
376 CALL PDGEMV( 'no transpose
', K, N-K, ONE, Y, IY, JY+K,
377 $ DESCY, A, I, J+1, DESCA, DESCA( M_ ), ZERO,
378 $ WORK, IW, 1, DESCW, 1 )
379 CALL PDGEMV( 'no transpose
', M-K, K, -ONE, A, I+1, JA,
380 $ DESCA, WORK, IW, 1, DESCW, 1, ONE, X, IX+K,
382 CALL PDGEMV( 'no transpose
', K-1, N-K, ONE, A, IA, J+1,
383 $ DESCA, A, I, J+1, DESCA, DESCA( M_ ), ZERO,
384 $ WORK, IW, 1, DESCW, 1 )
385 CALL PDGEMV( 'no transpose
', M-K, K-1, -ONE, X, IX+K, JX,
386 $ DESCX, WORK, IW, 1, DESCW, 1, ONE, X, IX+K,
389 CALL PDELGET( 'columnwise
', ' ', TAU, TAUP, I, 1, DESCTP )
390 CALL PDSCAL( M-K, TAU, X, IX+K, JX+K-1, DESCX, 1 )
397 CALL DESCSET( DESCD, IA+MIN(M,N)-1, 1, DESCA( MB_ ), 1,
398 $ DESCA( RSRC_ ), MYCOL, DESCA( CTXT_ ),
400 CALL DESCSET( DESCE, 1, JA+MIN(M,N)-1, 1, DESCA( NB_ ), MYROW,
401 $ DESCA( CSRC_ ), DESCA( CTXT_ ), 1 )
410 CALL PDGEMV( 'transpose
', K-1, N-K+1, -ONE, Y, IY,
411 $ JY+K-1, DESCY, A, I, JA, DESCA, DESCA( M_ ),
412 $ ONE, A, I, J, DESCA, DESCA( M_ ) )
413 CALL PDGEMV( 'transpose
', K-1, N-K+1, -ONE, A, IA, J,
414 $ DESCA, X, IX+K-1, JX, DESCX, DESCX( M_ ),
415 $ ONE, A, I, J, DESCA, DESCA( M_ ) )
416 CALL PDELSET( A, I, J-1, DESCA, ALPHA )
421 CALL PDLARFG( N-K+1, ALPHA, I, J, A, I, J+1, DESCA,
422 $ DESCA( M_ ), TAUP )
423 CALL PDELSET( D, I, 1, DESCD, ALPHA )
424 CALL PDELSET( A, I, J, DESCA, ONE )
428 CALL PDGEMV( 'no transpose
', M-K, N-K+1, ONE, A, I+1, J,
429 $ DESCA, A, I, J, DESCA, DESCA( M_ ), ZERO, X,
430 $ IX+K, JX+K-1, DESCX, 1 )
431 CALL PDGEMV( 'no transpose
', K-1, N-K+1, ONE, Y, IY, JY+K-1,
432 $ DESCY, A, I, J, DESCA, DESCA( M_ ), ZERO,
433 $ WORK, IW, 1, DESCW, 1 )
434 CALL PDGEMV( 'no transpose
', M-K, K-1, -ONE, A, I+1, JA,
435 $ DESCA, WORK, IW, 1, DESCW, 1, ONE, X, IX+K,
437 CALL PDGEMV( 'no transpose
', K-1, N-K+1, ONE, A, IA, J,
438 $ DESCA, A, I, J, DESCA, DESCA( M_ ), ZERO,
439 $ WORK, IW, 1, DESCW, 1 )
440 CALL PDGEMV( 'no transpose
', M-K, K-1, -ONE, X, IX+K, JX,
441 $ DESCX, WORK, IW, 1, DESCW, 1, ONE, X, IX+K,
444 CALL PDELGET( 'columnwise
', ' ', TAU, TAUP, I, 1, DESCTP )
445 CALL PDSCAL( M-K, TAU, X, IX+K, JX+K-1, DESCX, 1 )
449 CALL PDGEMV( 'no transpose
', M-K, K-1, -ONE, A, I+1, JA,
450 $ DESCA, Y, IY, JY+K-1, DESCY, 1, ONE, A, I+1, J,
452 CALL PDGEMV( 'no transpose
', M-K, K, -ONE, X, IX+K, JX,
453 $ DESCX, A, IA, J, DESCA, 1, ONE, A, I+1, J,
455 CALL PDELSET( A, I, J, DESCA, ALPHA )
459 CALL PDLARFG( M-K, ALPHA, I+1, J, A, MIN( I+2, M+IA-1 ),
460 $ J, DESCA, 1, TAUQ )
461 CALL PDELSET( E, 1, J, DESCE, ALPHA )
462 CALL PDELSET( A, I+1, J, DESCA, ONE )
466 CALL PDGEMV( 'transpose
', M-K, N-K, ONE, A, I+1, J+1, DESCA,
467 $ A, I+1, J, DESCA, 1, ZERO, WORK( IPY ), 1,
468 $ JWY, DESCWY, DESCWY( M_ ) )
469 CALL PDGEMV( 'transpose
', M-K, K-1, ONE, A, I+1, JA, DESCA,
470 $ A, I+1, J, DESCA, 1, ZERO, WORK, IW, 1, DESCW,
472 CALL PDGEMV( 'transpose
', K-1, N-K, -ONE, Y, IY, JY+K,
473 $ DESCY, WORK, IW, 1, DESCW, 1, ONE, WORK( IPY ),
474 $ 1, JWY, DESCWY, DESCWY( M_ ) )
475 CALL PDGEMV( 'transpose
', M-K, K, ONE, X, IX+K, JX, DESCX,
476 $ A, I+1, J, DESCA, 1, ZERO, WORK, IW, 1, DESCW,
478 CALL PDGEMV( 'transpose
', K, N-K, -ONE, A, IA, J+1, DESCA,
479 $ WORK, IW, 1, DESCW, 1, ONE, WORK( IPY ), 1,
480 $ JWY, DESCWY, DESCWY( M_ ) )
482 CALL PDELGET( 'rowwise
', ' ', TAU, TAUQ, 1, J, DESCTQ )
483 CALL PDSCAL( N-K, TAU, WORK( IPY ), 1, JWY, DESCWY,
485 CALL PDCOPY( N-K, WORK( IPY ), 1, JWY, DESCWY, DESCWY( M_ ),
486 $ Y, IY+K-1, JY+K, DESCY, DESCY( M_ ) )