1 SUBROUTINE pdpotrrv( UPLO, N, A, IA, JA, DESCA, WORK )
14 DOUBLE PRECISION A( * ), WORK( * )
116 INTEGER BLOCK_CYCLIC_2D, , CTXT_, DLEN_, DTYPE_,
117 $ LLD_, MB_, M_, NB_, N_, RSRC_
118 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
119 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
120 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
121 DOUBLE PRECISION ONE, ZERO
122 parameter( one = 1.0d+0, zero = 0.0d+0 )
126 CHARACTER COLBTOP, ROWBTOP
127 INTEGER IACOL, IAROW, ICTXT, IL, J, JB, , JN, MYCOL,
128 $ MYROW, NPCOL, NPROW
130 INTEGER DESCW( DLEN_ )
134 $ pdsyrk, pdtrmm, pb_topget, pb_topset
138 INTEGER ICEIL, INDXG2P
139 EXTERNAL iceil, indxg2p
148 ictxt = desca( ctxt_ )
151 CALL pb_topget( ictxt,
'Broadcast',
'Rowwise', rowbtop )
152 CALL pb_topget( ictxt,
'Broadcast',
'Columnwise', colbtop )
154 upper = lsame( uplo,
'U' )
155 jn =
min( iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
156 jl =
max( ( ( ja+n-2 ) / desca( nb_ ) ) * desca( nb_ ) + 1, ja )
157 il =
max( ( ( ia+n-2 ) / desca( mb_ ) ) * desca( mb_ ) + 1, ia )
158 iarow = indxg2p( il, desca( mb_ ), myrow, desca( rsrc_ ), nprow )
159 iacol = indxg2p( jl, desca( nb_ ), mycol, desca( csrc_ ), npcol )
163 CALL descset( descw, desca( mb_ ), desca( nb_ ), desca( mb_ ),
164 $ desca( nb_ ), iarow, iacol, ictxt, desca( mb_ ) )
170 CALL pb_topset( ictxt,
'Broadcast',
'Rowwise',
' ' )
171 CALL pb_topset( ictxt,
'Broadcast',
'Columnwise',
'S-ring' )
173 DO 10 j = jl, jn+1, -desca( nb_ )
175 jb =
min( ja+n-j, desca( nb_ ) )
179 CALL pdsyrk(
'Upper',
'Transpose', ja+n-j-jb, jb, one, a, il,
180 $ j+jb, desca, one, a, il+jb, j+jb, desca )
184 CALL pdlacpy(
'All', jb, jb, a, il, j, desca, work, 1, 1,
190 CALL pdlaset(
'Lower', jb-1, jb, zero, zero, a, il+1,
195 CALL pdtrmm(
'Left',
'Upper',
'Transpose',
'Non-Unit', jb,
196 $ n-j+ja, one, work, 1, 1, descw, a, il, j,
201 CALL pdlacpy(
'Lower', jb-1, jb, work, 2, 1, descw, a,
204 il = il - desca( mb_ )
205 descw( rsrc_ ) = mod( descw( rsrc_ ) + nprow - 1, nprow )
206 descw( csrc_ ) = mod( descw( csrc_ ) + npcol - 1, npcol )
212 jb =
min( jn-ja+1, desca( nb_ ) )
216 CALL pdsyrk(
'Upper',
'Transpose', n-jb, jb, one, a, ia, ja+jb,
227 CALL pdlaset(
'Lower', jb-1, jb, zero, zero, a, ia+1, ja,
232 CALL pdtrmm(
'Left',
'Upper',
'Transpose', 'non-unit
', JB,
233 $ N, ONE, WORK, 1, 1, DESCW, A, IA, JA, DESCA )
237 CALL PDLACPY( 'lower
', JB-1, JB, WORK, 2, 1, DESCW, A, IA+1,
244 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', 's-ring' )
245 CALL pb_topset( ictxt,
'Broadcast',
'Columnwise', '
' )
247 DO 20 J = JL, JN+1, -DESCA( NB_ )
249 JB = MIN( JA+N-J, DESCA( NB_ ) )
253 CALL PDSYRK( 'lower
', 'no transpose
', IA+N-IL-JB, JB, ONE, A,
254 $ IL+JB, J, DESCA, ONE, A, IL+JB, J+JB, DESCA )
258 CALL PDLACPY( 'all
', JB, JB, A, IL, J, DESCA, WORK, 1, 1,
264 CALL PDLASET( 'upper
', JB, JB-1, ZERO, ZERO, A, IL, J+1,
269 CALL PDTRMM( 'right
', 'lower
', 'transpose
', 'non-unit
',
270 $ IA+N-IL, JB, ONE, WORK, 1, 1, DESCW, A, IL,
275 CALL PDLACPY( 'upper
', JB, JB-1, WORK, 1, 2, DESCW, A,
278 IL = IL - DESCA( MB_ )
279 DESCW( RSRC_ ) = MOD( DESCW( RSRC_ ) + NPROW - 1, NPROW )
280 DESCW( CSRC_ ) = MOD( DESCW( CSRC_ ) + NPCOL - 1, NPCOL )
286 JB = MIN( JN-JA+1, DESCA( NB_ ) )
290 CALL PDSYRK( 'lower
', 'no transpose
', N-JB, JB, ONE, A,
291 $ IA+JB, JA, DESCA, ONE, A, IA+JB, JA+JB, DESCA )
295 CALL PDLACPY( 'all
', JB, JB, A, IA, JA, DESCA, WORK, 1, 1,
301 CALL PDLASET( 'upper
', JB, JB-1, ZERO, ZERO, A, IA, JA+1,
306 CALL PDTRMM( 'right
', 'lower
', 'transpose
', 'non-unit
', N, JB,
307 $ ONE, WORK, 1, 1, DESCW, A, IA, JA, DESCA )
311 CALL PDLACPY( 'upper
', JB, JB-1, WORK, 1, 2, DESCW, A, IA,
316 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
317 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )