1 SUBROUTINE pdorg2l( M, N, K, A, IA, JA, DESCA, TAU, WORK, LWORK,
10 INTEGER IA, INFO, JA, K, LWORK, M, N
14 DOUBLE PRECISION A( * ), TAU( * ), WORK( * )
157 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
158 $ lld_, mb_, m_, nb_, n_, rsrc_
159 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
160 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
161 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
162 DOUBLE PRECISION ONE, ZERO
163 parameter( one = 1.0d+0, zero = 0.0d+0 )
167 CHARACTER COLBTOP, ROWBTOP
168 INTEGER IACOL, IAROW, ICTXT, J, JJ, LWMIN, MPA0, MYCOL,
169 $ myrow, npcol, nprow, nqa0
178 INTEGER , INDXG2P, NUMROC
179 EXTERNAL indxg2l, indxg2p, numroc
182 INTRINSIC dble,
max,
min, mod
188 ictxt = desca( ctxt_ )
194 IF( nprow.EQ.-1 )
THEN
197 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 7, info )
199 iarow = indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
201 iacol = indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
203 mpa0 = numroc( m+mod( ia-1, desca( mb_ ) ), desca( mb_ ),
204 $ myrow, iarow, nprow )
205 nqa0 = numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
206 $ mycol, iacol, npcol )
207 lwmin = mpa0 +
max( 1, nqa0 )
209 work( 1 ) = dble( lwmin )
210 lquery = ( lwork.EQ.-1 )
213 ELSE IF( k.LT.0 .OR. k.GT.n )
THEN
215 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
221 CALL pxerbla( ictxt,
'PDORG2L', -info )
222 CALL blacs_abort( ictxt, 1 )
224 ELSE IF( lquery )
THEN
233 CALL pb_topget( ictxt,
'Broadcast',
'Rowwise', rowbtop )
234 CALL pb_topget( ictxt,
'Broadcast',
'Columnwise', colbtop )
235 CALL pb_topset( ictxt,
'Broadcast',
'Rowwise',
'I-ring' )
236 CALL pb_topset( ictxt,
'Broadcast',
'Columnwise',
' ' )
240 CALL pdlaset( 'all
', M-N, N-K, ZERO, ZERO, A, IA, JA, DESCA )
241 CALL PDLASET( 'all
', N, N-K, ZERO, ONE, A, IA+M-N, JA, DESCA )
244 NQA0 = MAX( 1, NUMROC( JA+N-1, DESCA( NB_ ), MYCOL,
245 $ DESCA( CSRC_ ), NPCOL ) )
246 DO 10 J = JA+N-K, JA+N-1
250 CALL PDELSET( A, IA+M-N+J-JA, J, DESCA, ONE )
251 CALL PDLARF( 'left
', M-N+J-JA+1, J-JA, A, IA, J, DESCA, 1, TAU,
252 $ A, IA, JA, DESCA, WORK )
254 JJ = INDXG2L( J, DESCA( NB_ ), MYCOL, DESCA( CSRC_ ), NPCOL )
255 IACOL = INDXG2P( J, DESCA( NB_ ), MYCOL, DESCA( CSRC_ ),
258 $ TAUJ = TAU( MIN( JJ, NQA0 ) )
259 CALL PDSCAL( M-N+J-JA, -TAUJ, A, IA, J, DESCA, 1 )
260 CALL PDELSET( A, IA+M-N+J-JA, J, DESCA, ONE-TAUJ )
264 CALL PDLASET( 'all
', JA+N-1-J, 1, ZERO, ZERO, A, IA+M-N+J-JA+1,
269 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
270 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
272 WORK( 1 ) = DBLE( LWMIN )
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
subroutine pdlarf(side, m, n, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)
subroutine pdorg2l(m, n, k, a, ia, ja, desca, tau, work, lwork, info)