1 SUBROUTINE pdtrtrs( UPLO, TRANS, DIAG, N, NRHS, A, IA, JA, DESCA,
2 $ B, IB, JB, DESCB, INFO )
10 CHARACTER DIAG, TRANS, UPLO
11 INTEGER IA, IB, INFO, JA, JB, N, NRHS
14 INTEGER DESCA( * ), DESCB( * )
15 DOUBLE PRECISION A( * ), B( * )
163 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
164 $ lld_, mb_, m_, nb_, n_, rsrc_
165 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
166 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
167 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
168 DOUBLE PRECISION ZERO, ONE
169 parameter( zero = 0.0d+0, one = 1.0d+0 )
172 LOGICAL NOTRAN, NOUNIT, UPPER
173 INTEGER I, IAROW, IBROW, ICOFFA, ICTXT, ICURCOL,
174 $ icurrow, iroffa, iroffb, idum, ii, ioffa, j,
175 $ jblk, jj, jn, lda, ll, mycol, myrow, npcol,
179 INTEGER IDUM1( 3 ), IDUM2( 3 )
187 INTEGER ICEIL, INDXG2P
188 EXTERNAL iceil, indxg2p, lsame
191 INTRINSIC ichar,
min, mod
197 ictxt = desca( ctxt_ )
203 IF( nprow.EQ.-1 )
THEN
206 upper = lsame( uplo,
'U' )
207 nounit = lsame( diag,
'N' )
208 notran = lsame( trans,
'N' )
210 CALL chk1mat( n, 4, n, 4, ia, ja, desca, 9, info )
211 CALL chk1mat( n, 4, nrhs, 5, ib, jb, descb, 13, info )
213 iroffa = mod( ia-1, desca( mb_ ) )
214 icoffa = mod( ja-1, desca( nb_ ) )
215 iroffb = mod( ib-1, descb( mb_ ) )
216 iarow = indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
218 ibrow = indxg2p( ib, descb( mb_ ), myrow, descb( rsrc_ ),
220 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
222 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) .AND.
223 $ .NOT.lsame( trans,
'C' ) )
THEN
225 ELSE IF( .NOT.nounit .AND. .NOT.lsame( diag,
'U' ) )
THEN
227 ELSE IF( iroffa.NE.icoffa .OR. iroffa.NE.0 )
THEN
229 ELSE IF( iroffa.NE.iroffb .OR. iarow.NE.ibrow )
THEN
231 ELSE IF( desca( mb_ ).NE.desca( nb_ ) )
THEN
233 ELSE IF( descb( mb_ ).NE.desca( nb_ ) )
THEN
239 idum1( 1 ) = ichar(
'U' )
241 idum1( 1 ) = ichar(
'L' )
245 idum1( 2 ) = ichar(
'N' )
246 ELSE IF( lsame( trans,
'T' ) )
THEN
247 idum1( 2 ) = ichar(
'T' )
248 ELSE IF( lsame( trans, 'c
' ) ) THEN
249 IDUM1( 2 ) = ICHAR( 'c
' )
253 IDUM1( 3 ) = ICHAR( 'n
' )
255 IDUM1( 3 ) = ICHAR( 'd
' )
258 CALL PCHK2MAT( N, 4, N, 4, IA, JA, DESCA, 9, N, 4, NRHS, 5,
259 $ IB, JB, DESCB, 13, 3, IDUM1, IDUM2, INFO )
263 CALL PXERBLA( ICTXT, 'pdtrtrs', -INFO )
269.EQ..OR..EQ.
IF( N0 NRHS0 )
275 CALL INFOG2L( IA, JA, DESCA, NPROW, NPCOL, MYROW, MYCOL,
276 $ II, JJ, ICURROW, ICURCOL )
277 JN = MIN( ICEIL( JA, DESCA( NB_ ) ) * DESCA( NB_ ), JA+N-1 )
279 IOFFA = II + ( JJ - 1 ) * LDA
284.EQ..AND..EQ.
IF( MYROWICURROW MYCOLICURCOL ) THEN
287.EQ..AND..EQ.
IF( A( LL )ZERO INFO0 )
292.EQ.
IF( MYROWICURROW )
293 $ IOFFA = IOFFA + JBLK
294.EQ.
IF( MYCOLICURCOL )
295 $ IOFFA = IOFFA + JBLK*LDA
296 ICURROW = MOD( ICURROW+1, NPROW )
297 ICURCOL = MOD( ICURCOL+1, NPCOL )
301 DO 30 J = JN+1, JA+N-1, DESCA( NB_ )
302 JBLK = MIN( JA+N-J, DESCA( NB_ ) )
303.EQ..AND..EQ.
IF( MYROWICURROW MYCOLICURCOL ) THEN
306.EQ..AND..EQ.
IF( A( LL )ZERO INFO0 )
307 $ INFO = J + I - JA + 1
311.EQ.
IF( MYROWICURROW )
312 $ IOFFA = IOFFA + JBLK
313.EQ.
IF( MYCOLICURCOL )
314 $ IOFFA = IOFFA + JBLK*LDA
315 ICURROW = MOD( ICURROW+1, NPROW )
316 ICURCOL = MOD( ICURCOL+1, NPCOL )
318 CALL IGAMX2D( ICTXT, 'all
', ' ', 1, 1, INFO, 1, IDUM, IDUM,
326 CALL PDTRSM( 'left
', UPLO, TRANS, DIAG, N, NRHS, ONE, A, IA, JA,
327 $ DESCA, B, IB, JB, DESCB )
subroutine pchk2mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, mb, mbpos0, nb, nbpos0, ib, jb, descb, descbpos0, nextra, ex, expos, info)
subroutine pdtrsm(side, uplo, transa, diag, m, n, alpha, a, ia, ja, desca, b, ib, jb, descb)
subroutine pdtrtrs(uplo, trans, diag, n, nrhs, a, ia, ja, desca, b, ib, jb, descb, info)