2
    3
    4
    5
    6
    7
    8
    9      CHARACTER          DIAG, UPLO
   10      INTEGER            IA, INFO, JA, N
   11
   12
   13      INTEGER            DESCA( * )
   14      DOUBLE PRECISION   A( * )
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128      INTEGER            BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
  129     $                   LLD_, MB_, M_, NB_, N_, RSRC_
  130      parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
  131     $                     ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
  132     $                     rsrc_ = 7, csrc_ = 8, lld_ = 9 )
  133      DOUBLE PRECISION   ONE
  134      parameter( one = 1.0d+0 )
  135
  136
  137      LOGICAL            NOUNIT, UPPER
  138      INTEGER            IACOL, IAROW, ICTXT, ICURR, IDIAG, IIA, IOFFA,
  139     $                   JJA, LDA, MYCOL, MYROW, NA, NPCOL, NPROW
  140      DOUBLE PRECISION   AJJ
  141
  142
  143      EXTERNAL           blacs_abort, blacs_gridinfo, 
chk1mat, dscal,
 
  145
  146
  147      LOGICAL            LSAME
  149
  150
  151
  152
  153
  154      ictxt = desca( ctxt_ )
  155      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
  156
  157
  158
  159      info = 0
  160      IF( nprow.EQ.-1 ) THEN
  161         info = -(700+ctxt_)
  162      ELSE
  163         CALL chk1mat( n, 3, n, 3, ia, ja, desca, 7, info )
 
  164         upper = 
lsame( uplo, 
'U' )
 
  165         nounit = 
lsame( diag, 
'N' )
 
  166         IF( .NOT.upper .AND. .NOT.
lsame( uplo, 
'L' ) ) 
THEN 
  167            info = -1
  168         ELSE IF( .NOT.nounit .AND. .NOT.
lsame( diag, 
'U' ) ) 
THEN 
  169            info = -2
  170         END IF
  171      END IF
  172
  173      IF( info.NE.0 ) THEN
  174         CALL pxerbla( ictxt, 
'PDTRTI2', -info )
 
  175         CALL blacs_abort( ictxt, 1 )
  176         RETURN
  177      END IF
  178
  179
  180
  181      CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
 
  182     $              iarow, iacol )
  183
  184      IF( myrow.EQ.iarow .AND. mycol.EQ.iacol ) THEN
  185
  186         lda = desca( lld_ )
  187
  188         IF( upper ) THEN
  189
  190            ioffa = iia + ( jja - 1 ) * lda
  191            icurr = ioffa + lda
  192
  193            IF( nounit ) THEN
  194
  195
  196
  197               a( ioffa ) = one / a( ioffa )
  198               idiag = icurr + 1
  199               DO 10 na = 1, n-1
  200                  a( idiag ) = one / a( idiag )
  201                  ajj = -a( idiag )
  202
  203
  204
  205                  CALL dtrmv( 'Upper', 'No transpose', diag, na,
  206     $                        a( ioffa ), lda, a( icurr ), 1 )
  207                  CALL dscal( na, ajj, a( icurr ), 1 )
  208                  idiag = idiag + lda + 1
  209                  icurr = icurr + lda
  210   10          CONTINUE
  211
  212            ELSE
  213
  214
  215
  216               DO 20 na = 1, n-1
  217
  218
  219
  220                  CALL dtrmv( 'Upper', 'No transpose', diag, na,
  221     $                        a( ioffa ), lda, a( icurr ), 1 )
  222                  CALL dscal( na, -one, a( icurr ), 1 )
  223                  icurr = icurr + lda
  224   20          CONTINUE
  225
  226            END IF
  227
  228         ELSE
  229
  230            icurr = iia + n - 1 + ( jja + n - 2 ) * lda
  231            ioffa = icurr - lda
  232
  233            IF( nounit ) THEN
  234
  235
  236
  237               a( icurr ) = one / a( icurr )
  238               idiag = ioffa - 1
  239               DO 30 na = 1, n-1
  240                  a( idiag ) = one / a( idiag )
  241                  ajj = -a( idiag )
  242
  243
  244
  245                  CALL dtrmv( 'Lower', 'No transpose', diag, na,
  246     $                        a( icurr ), lda, a( ioffa ), 1 )
  247                  CALL dscal( na, ajj, a( ioffa ), 1 )
  248                  icurr = idiag
  249                  idiag = idiag - lda - 1
  250                  ioffa = idiag + 1
  251   30          CONTINUE
  252
  253            ELSE
  254
  255
  256
  257               DO 40 na = 1, n-1
  258
  259
  260
  261                  CALL dtrmv( 'Lower', 'No transpose', diag, na,
  262     $                     a( icurr ), lda, a( ioffa ), 1 )
  263                  CALL dscal( na, -one, a( ioffa ), 1 )
  264                  icurr = icurr - lda - 1
  265                  ioffa = icurr - lda
  266   40          CONTINUE
  267
  268            END IF
  269
  270         END IF
  271
  272      END IF
  273
  274
  275
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
 
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
 
subroutine pxerbla(ictxt, srname, info)