2
    3
    4
    5
    6
    7
    8
    9      CHARACTER          UPLO
   10      INTEGER            IA, INFO, JA, N
   11
   12
   13      INTEGER            DESCA( * )
   14      COMPLEX*16         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      DOUBLE PRECISION   ONE
  144      parameter( one = 1.0d+0 )
  145      COMPLEX*16         CONE
  146      parameter( cone = ( 1.0d+0, 0.0d+0 ) )
  147
  148
  149      LOGICAL            UPPER
  150      CHARACTER          COLBTOP, ROWBTOP
  151      INTEGER            I, ICOFF, ICTXT, IROFF, J, JB, JN, MYCOL,
  152     $                   MYROW, NPCOL, NPROW
  153
  154
  155      INTEGER            IDUM1( 1 ), IDUM2( 1 )
  156
  157
  160     $                   pztrsm
  161
  162
  163      LOGICAL            LSAME
  164      INTEGER            ICEIL
  166
  167
  168      INTRINSIC          ichar, 
min, mod
 
  169
  170
  171
  172
  173
  174      ictxt = desca( ctxt_ )
  175      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
  176
  177
  178
  179      info = 0
  180      IF( nprow.EQ.-1 ) THEN
  181         info = -(600+ctxt_)
  182      ELSE
  183         CALL chk1mat( n, 2, n, 2, ia, ja, desca, 6, info )
 
  184         upper = 
lsame( uplo, 
'U' )
 
  185         IF( info.EQ.0 ) THEN
  186            iroff = mod( ia-1, desca( mb_ ) )
  187            icoff = mod( ja-1, desca( nb_ ) )
  188            IF ( .NOT.upper .AND. .NOT.
lsame( uplo, 
'L' ) ) 
THEN 
  189               info = -1
  190            ELSE IF( iroff.NE.0 ) THEN
  191               info = -4
  192            ELSE IF( icoff.NE.0 ) THEN
  193               info = -5
  194            ELSE IF( desca( mb_ ).NE.desca( nb_ ) ) THEN
  195               info = -(600+nb_)
  196            END IF
  197         END IF
  198         IF( upper ) THEN
  199            idum1( 1 ) = ichar( 'U' )
  200         ELSE
  201            idum1( 1 ) = ichar( 'L' )
  202         END IF
  203         idum2( 1 ) = 1
  204         CALL pchk1mat( n, 2, n, 2, ia, ja, desca, 6, 1, idum1, idum2,
 
  205     $                  info )
  206      END IF
  207
  208      IF( info.NE.0 ) THEN
  209         CALL pxerbla( ictxt, 
'PZPOTRF', -info )
 
  210         RETURN
  211      END IF
  212
  213
  214
  215      IF( n.EQ.0 )
  216     $   RETURN
  217
  218      CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rowbtop )
  219      CALL pb_topget( ictxt, 'Broadcast', 'Columnwise', colbtop )
  220
  221      IF( upper ) THEN
  222
  223
  224
  225
  226         CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', ' ' )
  227         CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', 'S-ring' )
  228
  229
  230
  231
  232
  233         jn = 
min( 
iceil( ja, desca( nb_ ) )*desca(nb_), ja+n-1 )
 
  234         jb = jn - ja + 1
  235
  236
  237
  238         CALL pzpotf2( uplo, jb, a, ia, ja, desca, info )
 
  239         IF( info.NE.0 )
  240     $      GO TO 30
  241
  242         IF( jb+1.LE.n ) THEN
  243
  244
  245
  246            CALL pztrsm( 'Left', uplo, 'Conjugate transpose',
  247     $                   'Non-Unit', jb, n-jb, cone, a, ia, ja, desca,
  248     $                   a, ia, ja+jb, desca )
  249
  250
  251
  252            CALL pzherk( uplo, 'Conjugate transpose', n-jb, jb, -one, a,
  253     $                   ia, ja+jb, desca, one, a, ia+jb, ja+jb, desca )
  254         END IF
  255
  256
  257
  258         DO 10 j = jn+1, ja+n-1, desca( nb_ )
  259            jb = 
min( n-j+ja, desca( nb_ ) )
 
  260            i = ia + j - ja
  261
  262
  263
  264            CALL pzpotf2( uplo, jb, a, i, j, desca, info )
 
  265            IF( info.NE.0 ) THEN
  266               info = info + j - ja
  267               GO TO 30
  268            END IF
  269
  270            IF( j-ja+jb+1.LE.n ) THEN
  271
  272
  273
  274               CALL pztrsm( 'Left', uplo, 'Conjugate transpose',
  275     $                      'Non-Unit', jb, n-j-jb+ja, cone, a, i, j,
  276     $                      desca, a, i, j+jb, desca )
  277
  278
  279
  280               CALL pzherk( uplo, 'Conjugate transpose', n-j-jb+ja, jb,
  281     $                      -one, a, i, j+jb, desca, one, a, i+jb,
  282     $                      j+jb, desca )
  283            END IF
  284   10    CONTINUE
  285
  286      ELSE
  287
  288
  289
  290
  291         CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', 'S-ring' )
  292         CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', ' ' )
  293
  294
  295
  296
  297
  298
  299         jn = 
min( 
iceil( ja, desca( nb_ ) )*desca( nb_ ), ja+n-1 )
 
  300         jb = jn - ja + 1
  301
  302
  303
  304         CALL pzpotf2( uplo, jb, a, ia, ja, desca, info )
 
  305         IF( info.NE.0 )
  306     $      GO TO 30
  307
  308         IF( jb+1.LE.n ) THEN
  309
  310
  311
  312            CALL pztrsm( 'Right', uplo, 'Conjugate transpose',
  313     $                   'Non-Unit', n-jb, jb, cone, a, ia, ja, desca,
  314     $                   a, ia+jb, ja, desca )
  315
  316
  317
  318            CALL pzherk( uplo, 'No Transpose', n-jb, jb, -one, a, ia+jb,
  319     $                   ja, desca, one, a, ia+jb, ja+jb, desca )
  320
  321         END IF
  322
  323         DO 20 j = jn+1, ja+n-1, desca( nb_ )
  324            jb = 
min( n-j+ja, desca( nb_ ) )
 
  325            i = ia + j - ja
  326
  327
  328
  329            CALL pzpotf2( uplo, jb, a, i, j, desca, info )
 
  330            IF( info.NE.0 ) THEN
  331               info = info + j - ja
  332               GO TO 30
  333            END IF
  334
  335            IF( j-ja+jb+1.LE.n ) THEN
  336
  337
  338
  339               CALL pztrsm( 'Right', uplo, 'Conjugate transpose',
  340     $                      'Non-Unit', n-j-jb+ja, jb, cone, a, i, j,
  341     $                      desca, a, i+jb, j, desca )
  342
  343
  344
  345               CALL pzherk( uplo, 'No Transpose', n-j-jb+ja, jb, -one,
  346     $                      a, i+jb, j, desca, one, a, i+jb, j+jb,
  347     $                      desca )
  348
  349            END IF
  350   20    CONTINUE
  351
  352      END IF
  353
  354   30 CONTINUE
  355
  356      CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', rowbtop )
  357      CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', colbtop )
  358
  359      RETURN
  360
  361
  362
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
 
integer function iceil(inum, idenom)
 
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
 
subroutine pxerbla(ictxt, srname, info)
 
subroutine pzpotf2(uplo, n, a, ia, ja, desca, info)