1 SUBROUTINE pdorglq( 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_
161 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
162 DOUBLE PRECISION ZERO
163 parameter( zero = 0.0d+0 )
167 CHARACTER COLBTOP, ROWBTOP
168 INTEGER I, IACOL, IAROW, IB, ICTXT, IINFO, IL, IN
173 INTEGER IDUM1( 2 ), ( 2 )
185 INTRINSIC dble,
max,
min, mod
191 ictxt = desca( ctxt_ )
197 IF( nprow.EQ.-1 )
THEN
200 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 7, info )
204 iacol = indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
206 mpa0 = numroc( m+mod( ia-1, desca( mb_ ) ), desca( mb_ ),
207 $ myrow, iarow, nprow )
208 nqa0 = numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
209 $ mycol, iacol, npcol )
210 lwmin = desca( mb_ ) * ( mpa0 + nqa0 + desca( mb_ ) )
212 work( 1 ) = dble( lwmin )
213 lquery = ( lwork.EQ.-1 )
216 ELSE IF( k.LT.0 .OR. k.GT.m )
THEN
218 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
224 IF( lwork.EQ.-1 )
THEN
230 CALL pchk1mat( m, 1, n, 2, ia, ja, desca, 7, 2, idum1, idum2,
235 CALL pxerbla( ictxt,
'PDORGLQ', -info )
237 ELSE IF( lquery )
THEN
246 ipw = desca( mb_ ) * desca( mb_ ) + 1
247 in =
min( iceil( ia, desca( mb_ ) ) * desca( mb_ ), ia+k-1 )
248 il =
max( ( (ia+k-2) / desca( mb_ ) ) * desca( mb_ ) + 1, ia )
249 CALL pb_topget( ictxt,
'Broadcast',
'Rowwise', rowbtop )
250 CALL pb_topget( ictxt,
'Broadcast',
'Columnwise', colbtop )
251 CALL pb_topset( ictxt,
'Broadcast',
'Rowwise',
' ' )
252 CALL pb_topset( ictxt,
'Broadcast', 'columnwise
', 'd-ring
' )
254 CALL PDLASET( 'all
', IA+M-IL, IL-IA, ZERO, ZERO, A, IL, JA,
259 CALL PDORGL2( IA+M-IL, N-IL+IA, IA+K-IL, A, IL, JA+IL-IA, DESCA,
260 $ TAU, WORK, LWORK, IINFO )
264.GT.
IF( ILIN+1 ) THEN
268 DO 10 I = IL-DESCA( MB_ ), IN+1, -DESCA( MB_ )
269 IB = MIN( DESCA( MB_ ), IA+M-I )
272.LE.
IF( I+IBIA+M-1 ) THEN
277 CALL PDLARFT( 'forward
', 'rowwise
', N-I+IA, IB, A, I, J,
278 $ DESCA, TAU, WORK, WORK( IPW ) )
282 CALL PDLARFB( 'right
', 'transpose
', 'forward
', 'rowwise
',
283 $ M-I-IB+IA, N-I+IA, IB, A, I, J, DESCA,
284 $ WORK, A, I+IB, J, DESCA, WORK( IPW ) )
289 CALL PDORGL2( IB, N-I+IA, IB, A, I, J, DESCA, TAU, WORK,
294 CALL PDLASET( 'all
', IB, I-IA, ZERO, ZERO, A, I, JA, DESCA )
308 CALL PDLARFT( 'forward
', 'rowwise
', N, IB, A, IA, JA, DESCA,
309 $ TAU, WORK, WORK( IPW ) )
313 CALL PDLARFB( 'right
', 'transpose
', 'forward
', 'rowwise
', M-IB,
314 $ N, IB, A, IA, JA, DESCA, WORK, A, IA+IB, JA,
315 $ DESCA, WORK( IPW ) )
319 CALL PDORGL2( IB, N, IB, A, IA, JA, DESCA, TAU, WORK, LWORK,
324 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
325 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
327 WORK( 1 ) = DBLE( LWMIN )
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
subroutine pdlarfb(side, trans, direct, storev, m, n, k, v, iv, jv, descv, t, c, ic, jc, descc, work)
subroutine pdlarft(direct, storev, n, k, v, iv, jv, descv, tau, t, work)
subroutine pdorgl2(m, n, k, a, ia, ja, desca, tau, work, lwork, info)
subroutine pdorglq(m, n, k, a, ia, ja, desca, tau, work, lwork, info)