3
    4
    5
    6
    7
    8
    9
   10      CHARACTER          TRANS
   11      INTEGER            IA, IB, INFO, JA, JB, N, NRHS
   12
   13
   14      INTEGER            DESCA( * ), DESCB( * ), IPIV( * )
   15      DOUBLE PRECISION   A( * ), B( * )
   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
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138
  139
  140
  141
  142
  143
  144
  145
  146
  147
  148
  149
  150
  151
  152      INTEGER            BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
  153     $                   LLD_, MB_, M_, NB_, N_, RSRC_
  154      parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
  155     $                     ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
  156     $                     rsrc_ = 7, csrc_ = 8, lld_ = 9 )
  157      DOUBLE PRECISION   ONE
  158      parameter( one = 1.0d+0 )
  159
  160
  161      LOGICAL            NOTRAN
  162      INTEGER            IAROW, IBROW, ICOFFA, ICTXT, IROFFA, IROFFB,
  163     $                   MYCOL, MYROW, NPCOL, NPROW
  164
  165
  166      INTEGER            DESCIP( DLEN_ ), IDUM1( 1 ), IDUM2( 1 )
  167
  168
  171
  172
  173      LOGICAL            LSAME
  174      INTEGER            INDXG2P, NUMROC
  176
  177
  178      INTRINSIC          ichar, mod
  179
  180
  181
  182
  183
  184      ictxt = desca( ctxt_ )
  185      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
  186
  187
  188
  189      info = 0
  190      IF( nprow.EQ.-1 ) THEN
  191         info = -(700+ctxt_)
  192      ELSE
  193         notran = 
lsame( trans, 
'N' )
 
  194         CALL chk1mat( n, 2, n, 2, ia, ja, desca, 7, info )
 
  195         CALL chk1mat( n, 2, nrhs, 3, ib, jb, descb, 12, info )
 
  196         IF( info.EQ.0 ) THEN
  197            iarow = 
indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
 
  198     $                       nprow )
  199            ibrow = 
indxg2p( ib, descb( mb_ ), myrow, descb( rsrc_ ),
 
  200     $                       nprow )
  201            iroffa = mod( ia-1, desca( mb_ ) )
  202            icoffa = mod( ja-1, desca( nb_ ) )
  203            iroffb = mod( ib-1, descb( mb_ ) )
  204            IF( .NOT.notran .AND. .NOT.
lsame( trans, 
'T' ) .AND. .NOT.
 
  205     $         
lsame( trans, 
'C' ) ) 
THEN 
  206               info = -1
  207            ELSE IF( iroffa.NE.0 ) THEN
  208               info = -5
  209            ELSE IF( icoffa.NE.0 ) THEN
  210               info = -6
  211            ELSE IF( desca( mb_ ).NE.desca( nb_ ) ) THEN
  212               info = -(700+nb_)
  213            ELSE IF( iroffb.NE.0 .OR. ibrow.NE.iarow ) THEN
  214               info = -10
  215            ELSE IF( descb( mb_ ).NE.desca( nb_ ) ) THEN
  216               info = -(1200+nb_)
  217            ELSE IF( ictxt.NE.descb( ctxt_ ) ) THEN
  218               info = -(1200+ctxt_)
  219            END IF
  220         END IF
  221         IF( notran ) THEN
  222            idum1( 1 ) = ichar( 'N' )
  223         ELSE IF( 
lsame( trans, 
'T' ) ) 
THEN 
  224            idum1( 1 ) = ichar( 'T' )
  225         ELSE
  226            idum1( 1 ) = ichar( 'C' )
  227         END IF
  228         idum2( 1 ) = 1
  229         CALL pchk2mat( n, 2, n, 2, ia, ja, desca, 7, n, 2, nrhs, 3,
 
  230     $                  ib, jb, descb, 12, 1, idum1, idum2, info )
  231      END IF
  232
  233      IF( info.NE.0 ) THEN
  234         CALL pxerbla( ictxt, 
'PDGETRS', -info )
 
  235         RETURN
  236      END IF
  237
  238
  239
  240      IF( n.EQ.0 .OR. nrhs.EQ.0 )
  241     $   RETURN
  242
  243      CALL descset( descip, desca( m_ ) + desca( mb_ )*nprow, 1,
 
  244     $              desca( mb_ ), 1, desca( rsrc_ ), mycol, ictxt,
  245     $              desca( mb_ ) + 
numroc( desca( m_ ), desca( mb_ ),
 
  246     $              myrow, desca( rsrc_ ), nprow ) )
  247
  248      IF( notran ) THEN
  249
  250
  251
  252
  253
  254         CALL pdlapiv( 
'Forward', 
'Row', 
'Col', n, nrhs, b, ib, jb,
 
  255     $                 descb, ipiv, ia, 1, descip, idum1 )
  256
  257
  258
  259         CALL pdtrsm( 'Left', 'Lower', 'No transpose', 'Unit', n, nrhs,
  260     $                one, a, ia, ja, desca, b, ib, jb, descb )
  261
  262
  263
  264         CALL pdtrsm( 'Left', 'Upper', 'No transpose', 'Non-unit', n,
  265     $                nrhs, one, a, ia, ja, desca, b, ib, jb, descb )
  266      ELSE
  267
  268
  269
  270
  271
  272         CALL pdtrsm( 'Left', 'Upper', 'Transpose', 'Non-unit', n, nrhs,
  273     $                one, a, ia, ja, desca, b, ib, jb, descb )
  274
  275
  276
  277         CALL pdtrsm( 'Left', 'Lower', 'Transpose', 'Unit', n, nrhs,
  278     $                one, a, ia, ja, desca, b, ib, jb, descb )
  279
  280
  281
  282         CALL pdlapiv( 
'Backward', 
'Row', 
'Col', n, nrhs, b, ib, jb,
 
  283     $                 descb, ipiv, ia, 1, descip, idum1 )
  284
  285      END IF
  286
  287      RETURN
  288
  289
  290
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
 
subroutine descset(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld)
 
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
 
integer function numroc(n, nb, iproc, isrcproc, nprocs)
 
subroutine pchk2mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, mb, mbpos0, nb, nbpos0, ib, jb, descb, descbpos0, nextra, ex, expos, info)
 
subroutine pdlapiv(direc, rowcol, pivroc, m, n, a, ia, ja, desca, ipiv, ip, jp, descip, iwork)
 
subroutine pxerbla(ictxt, srname, info)