1 SUBROUTINE pspotrrv( UPLO, N, A, IA, JA, DESCA, WORK )
14 REAL A( * ), WORK( * )
116 INTEGER BLOCK_CYCLIC_2D, CSRC_, , 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 )
122 parameter( one = 1.0e+0, zero = 0.0e+0 )
126 CHARACTER COLBTOP, ROWBTOP
127 INTEGER IACOL, IAROW, ICTXT, IL, J, JB, JL, JN, MYCOL,
128 $ MYROW, NPCOL, NPROW
138INTEGER ICEIL, INDXG2P
139 EXTERNAL iceil, indxg2p, lsame
148 ictxt = desca( ctxt_ )
151 CALL pb_topget( ictxt,
'Broadcast',
'Rowwise', rowbtop )
152 CALL pb_topget( ictxt,
'Broadcast''Columnwise'
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 pssyrk(
'Upper',
'Transpose', ja+n-j-jb, jb, one, a, il,
180 $ j+jb, desca, one, a, il+jb, j+jb, desca )
184 CALL pslacpy( 'all
', JB, JB, A, IL, J, DESCA, WORK, 1, 1,
190 CALL PSLASET( 'lower
', JB-1, JB, ZERO, ZERO, A, IL+1, J,
195 CALL PSTRMM( 'left
', 'upper
', 'transpose
', 'non-unit
', JB,
196 $ N-J+JA, ONE, WORK, 1, 1, DESCW, A, IL, J,
201 CALL PSLACPY( '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 PSSYRK( 'upper
', 'transpose
', N-JB, JB, ONE, A, IA, JA+JB,
217 $ DESCA, ONE, A, IA+JB, JA+JB, DESCA )
221 CALL PSLACPY( 'all
', JB, JB, A, IA, JA, DESCA, WORK, 1, 1,
227 CALL PSLASET( 'lower
', JB-1, JB, ZERO, ZERO, A, IA+1, JA,
232 CALL PSTRMM( 'left
', 'upper
', 'transpose
', 'non-unit
', JB,
233 $ N, ONE, WORK, 1, 1, DESCW, A, IA, JA, DESCA )
237 CALL PSLACPY( '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 PSSYRK( 'lower
', 'no transpose
', IA+N-IL-JB, JB, ONE, A,
254 $ IL+JB, J, DESCA, ONE, A, IL+JB, J+JB, DESCA )
258 CALL PSLACPY( 'all
', JB, JB, A, IL, J, DESCA, WORK, 1, 1,
264 CALL PSLASET( 'upper
', JB, JB-1, ZERO, ZERO, A, IL, J+1,
269 CALL PSTRMM( 'right
', 'lower
', 'transpose
', 'non-unit
',
270 $ IA+N-IL, JB, ONE, WORK, 1, 1, DESCW, A, IL,
275 CALL PSLACPY( '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 PSSYRK( 'lower
', 'no transpose
', N-JB, JB, ONE, A,
291 $ IA+JB, JA, DESCA, ONE, A, IA+JB, JA+JB, DESCA )
295 CALL PSLACPY( 'all
', JB, JB, A, IA, JA, DESCA, WORK, 1, 1,
301 CALL PSLASET( 'upper
', JB, JB-1, ZERO, ZERO, A, IA, JA+1,
306 CALL PSTRMM( 'right
', 'lower
', 'transpose
', 'non-unit
', N, JB,
307 $ ONE, WORK, 1, 1, DESCW, A, IA, JA, DESCA )
311 CALL PSLACPY( '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 )
subroutine descset(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld)
subroutine pslacpy(uplo, m, n, a, ia, ja, desca, b, ib, jb, descb)