1 SUBROUTINE pdorgr2( M, N, K, A, IA, JA, DESCA, TAU, WORK, LWORK,
10 INTEGER IA, INFO, JA, K, LWORK, M, N
14 DOUBLE PRECISION ( * ), TAU( * ), WORK( * )
157 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
158 $ lld_, mb_, m_, nb_, n_
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, I, ICTXT, II, LWMIN, MP, MPA0,
169 $ mycol, myrow, npcol, nprow, nqa0
170 DOUBLE PRECISION TAUI
178 INTEGER INDXG2L, , 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 = nqa0 +
max( 1, mpa0 )
209 work( 1 ) = dble( lwmin )
210 lquery = ( lwork.EQ.-1 )
213 ELSE IF( k.LT.0 .OR. k.GT.m )
THEN
215 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
221 CALL pxerbla( ictxt,
'PDORGR2', -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
', '' )
236 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', 'i-ring
' )
242 CALL PDLASET( 'all
', M-K, N-M, ZERO, ZERO, A, IA, JA, DESCA )
243 CALL PDLASET( 'all
', M-K, M, ZERO, ONE, A, IA, JA+N-M, DESCA )
248 MP = NUMROC( IA+M-1, DESCA( MB_ ), MYROW, DESCA( RSRC_ ), NPROW )
250 DO 10 I = IA+M-K, IA+M-1
254 CALL PDELSET( A, I, JA+N-M+I-IA, DESCA, ONE )
255 CALL PDLARF( 'right
', I-IA, I-IA+N-M+1, A, I, JA, DESCA,
256 $ DESCA( M_ ), TAU, A, IA, JA, DESCA, WORK )
257 II = INDXG2L( I, DESCA( MB_ ), MYROW, DESCA( RSRC_ ), NPROW )
258 IAROW = INDXG2P( I, DESCA( MB_ ), MYROW, DESCA( RSRC_ ),
261 $ TAUI = TAU( MIN( II, MP ) )
262 CALL PDSCAL( I-IA+N-M, -TAUI, A, I, JA, DESCA, DESCA( M_ ) )
263 CALL PDELSET( A, I, JA+N-M+I-IA, DESCA, ONE-TAUI )
267 CALL PDLASET( 'all
', 1, IA+M-1-I, ZERO, ZERO, A, I,
268 $ JA+N-M+I-IA+1, DESCA )
272 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
273 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
275 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 pdorgr2(m, n, k, a, ia, ja, desca, tau, work, lwork, info)