2
    3
    4
    5
    6
    7
    8
    9      CHARACTER          UPLO
   10      INTEGER            IA, INFO, JA, N
   11
   12
   13      INTEGER            DESCA( * )
   14      COMPLEX            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
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138      INTEGER            BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
  139     $                   LLD_, MB_, M_, NB_, N_, RSRC_
  140      parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
  141     $                     ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
  142     $                     rsrc_ = 7, csrc_ = 8, lld_ = 9 )
  143      REAL               ONE, ZERO
  144      parameter( one = 1.0e+0, zero = 0.0e+0 )
  145      COMPLEX            CONE
  146      parameter( cone = 1.0e+0 )
  147
  148
  149      LOGICAL            UPPER
  150      CHARACTER          COLBTOP, ROWBTOP
  151      INTEGER            IACOL, IAROW, ICOFF, ICTXT, ICURR, IDIAG, IIA,
  152     $                   IOFFA, IROFF, J, JJA, LDA, MYCOL, MYROW,
  153     $                   NPCOL, NPROW
  154      REAL               AJJ
  155
  156
  157      EXTERNAL           blacs_abort, blacs_gridinfo, 
chk1mat, cgemv,
 
  158     $                   clacgv, csscal, igebr2d, igebs2d,
  160
  161
  162      INTRINSIC          mod, real, sqrt
  163
  164
  165      LOGICAL            LSAME
  166      COMPLEX            CDOTC
  167      EXTERNAL           lsame, cdotc
 
  168
  169
  170
  171
  172
  173      ictxt = desca( ctxt_ )
  174      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
  175
  176
  177
  178      info = 0
  179      IF( nprow.EQ.-1 ) THEN
  180         info = -(600+ctxt_)
  181      ELSE
  182         CALL chk1mat( n, 2, n, 2, ia, ja, desca, 6, info )
 
  183         IF( info.EQ.0 ) THEN
  184            upper = 
lsame( uplo, 
'U' )
 
  185            iroff = mod( ia-1, desca( mb_ ) )
  186            icoff = mod( ja-1, desca( nb_ ) )
  187            IF ( .NOT.upper .AND. .NOT.
lsame( uplo, 
'L' ) ) 
THEN 
  188               info = -1
  189            ELSE IF( n+icoff.GT.desca( nb_ ) ) THEN
  190               info = -2
  191            ELSE IF( iroff.NE.0 ) THEN
  192               info = -4
  193            ELSE IF( icoff.NE.0 ) THEN
  194               info = -5
  195            ELSE IF( desca( mb_ ).NE.desca( nb_ ) ) THEN
  196               info = -(600+nb_)
  197            END IF
  198         END IF
  199      END IF
  200
  201      IF( info.NE.0 ) THEN
  202         CALL pxerbla( ictxt, 
'PCPOTF2', -info )
 
  203         CALL blacs_abort( ictxt, 1 )
  204         RETURN
  205      END IF
  206
  207
  208
  209      IF( n.EQ.0 )
  210     $   RETURN
  211
  212
  213
  214      CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
 
  215     $              iarow, iacol )
  216      CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rowbtop )
  217      CALL pb_topget( ictxt, 'Broadcast', 'Columnwise', colbtop )
  218
  219      IF ( upper ) THEN
  220
  221
  222
  223         IF( myrow.EQ.iarow ) THEN
  224            IF( mycol.EQ.iacol ) THEN
  225
  226
  227
  228               lda = desca( lld_ )
  229               idiag = iia + ( jja - 1 ) * lda
  230               ioffa = idiag
  231
  232               DO 10 j = ja, ja+n-1
  233
  234
  235
  236                  ajj = real( a( idiag ) ) -
  237     $                  cdotc( j-ja, a( ioffa ), 1, a( ioffa ), 1 )
  238                  IF( ajj.LE.zero ) THEN
  239                     a( idiag ) = ajj
  240                     info = j - ja + 1
  241                     GO TO 20
  242                  END IF
  243                  ajj = sqrt( ajj )
  244                  a( idiag ) = ajj
  245
  246
  247
  248                  IF( j.LT.ja+n-1 ) THEN
  249                     icurr = idiag + lda
  250                     CALL clacgv( j-ja, a( ioffa ), 1 )
  251                     CALL cgemv( 'Transpose', j-ja, ja+n-j-1, -cone,
  252     $                           a( ioffa+lda ), lda, a( ioffa ), 1,
  253     $                           cone, a( icurr ), lda )
  254                     CALL clacgv( j-ja, a( ioffa ), 1 )
  255                     CALL csscal( ja+n-j-1, one / ajj, a( icurr ),
  256     $                            lda )
  257                  END IF
  258                  idiag = idiag + lda + 1
  259                  ioffa = ioffa + lda
  260   10          CONTINUE
  261
  262   20          CONTINUE
  263
  264
  265
  266               CALL igebs2d( ictxt, 'Rowwise', rowbtop, 1, 1, info, 1 )
  267
  268            ELSE
  269
  270               CALL igebr2d( ictxt, 'Rowwise', rowbtop, 1, 1, info, 1,
  271     $                       myrow, iacol )
  272            END IF
  273
  274
  275
  276            CALL igebs2d( ictxt, 'Columnwise', colbtop, 1, 1, info, 1 )
  277
  278         ELSE
  279
  280            CALL igebr2d( ictxt, 'Columnwise', colbtop, 1, 1, info, 1,
  281     $                    iarow, mycol )
  282
  283         END IF
  284
  285      ELSE
  286
  287
  288
  289         IF( mycol.EQ.iacol ) THEN
  290            IF( myrow.EQ.iarow ) THEN
  291
  292
  293
  294               lda = desca( lld_ )
  295               idiag = iia + ( jja - 1 ) * lda
  296               ioffa = idiag
  297
  298               DO 30 j = ja, ja+n-1
  299
  300
  301
  302                  ajj = real( a( idiag ) ) -
  303     $                  cdotc( j-ja, a( ioffa ), lda, a( ioffa ), lda )
  304                  IF ( ajj.LE.zero ) THEN
  305                     a( idiag ) = ajj
  306                     info = j - ja + 1
  307                     GO TO 40
  308                  END IF
  309                  ajj = sqrt( ajj )
  310                  a( idiag ) = ajj
  311
  312
  313
  314                  IF( j.LT.ja+n-1 ) THEN
  315                     icurr = idiag + 1
  316                     CALL clacgv( j-ja, a( ioffa ), lda )
  317                     CALL cgemv( 'No transpose', ja+n-j-1, j-ja, -cone,
  318     $                           a( ioffa+1 ), lda, a( ioffa ), lda,
  319     $                           cone, a( icurr ), 1 )
  320                     CALL clacgv( j-ja, a( ioffa ), lda )
  321                     CALL csscal( ja+n-j-1, one / ajj, a( icurr ), 1 )
  322                  END IF
  323                  idiag = idiag + lda + 1
  324                  ioffa = ioffa + 1
  325   30          CONTINUE
  326
  327   40          CONTINUE
  328
  329
  330
  331               CALL igebs2d( ictxt, 'Columnwise', colbtop, 1, 1, info,
  332     $                       1 )
  333
  334            ELSE
  335
  336               CALL igebr2d( ictxt, 'Columnwise', colbtop, 1, 1, info,
  337     $                       1, iarow, mycol )
  338
  339            END IF
  340
  341
  342
  343            CALL igebs2d( ictxt, 'Rowwise', rowbtop, 1, 1, info, 1 )
  344
  345         ELSE
  346
  347            CALL igebr2d( ictxt, 'Rowwise', rowbtop, 1, 1, info, 1,
  348     $                    myrow, iacol )
  349
  350         END IF
  351
  352      END IF
  353
  354      RETURN
  355
  356
  357
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)