3
    4
    5
    6
    7
    8
    9
   10      CHARACTER          UPLO
   11      INTEGER            IA, IW, JA, JW, N, NB
   12
   13
   14      INTEGER            DESCA( * ), DESCW( * )
   15      DOUBLE PRECISION   D( * ), E( * )
   16      COMPLEX*16         A( * ), TAU( * ), W( * ), WORK( * )
   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
  153
  154
  155
  156
  157
  158
  159
  160
  161
  162
  163
  164
  165
  166
  167
  168
  169
  170
  171
  172
  173
  174
  175
  176
  177
  178
  179
  180
  181
  182
  183
  184
  185
  186
  187
  188
  189
  190
  191
  192
  193
  194
  195
  196
  197
  198
  199
  200
  201
  202
  203
  204
  205
  206
  207
  208
  209
  210
  211
  212
  213
  214
  215
  216
  217
  218
  219
  220
  221
  222      INTEGER            BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
  223     $                   LLD_, MB_, M_, NB_, N_, RSRC_
  224      parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
  225     $                     ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
  226     $                     rsrc_ = 7, csrc_ = 8, lld_ = 9 )
  227      COMPLEX*16         HALF, ONE, ZERO
  228      parameter( half = ( 0.5d+0, 0.0d+0 ),
  229     $                   one = ( 1.0d+0, 0.0d+0 ),
  230     $                   zero = ( 0.0d+0, 0.0d+0 ) )
  231
  232
  233      INTEGER            I, IACOL, IAROW, ICTXT, II, J, JJ, JP, JWK, K,
  234     $                   KW, MYCOL, MYROW, NPCOL, NPROW, NQ
  235      COMPLEX*16         AII, ALPHA, BETA
  236
  237
  238      INTEGER            DESCD( DLEN_ ), DESCE( DLEN_ ), DESCWK( DLEN_ )
  239
  240
  241      EXTERNAL           blacs_gridinfo, 
descset, dgebr2d, dgebs2d,
 
  245
  246
  247      LOGICAL            LSAME
  248      INTEGER            NUMROC
  250
  251
  252      INTRINSIC          dble, dcmplx, 
min 
  253
  254
  255
  256
  257
  258      IF( n.LE.0 )
  259     $   RETURN
  260
  261      ictxt = desca( ctxt_ )
  262      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
  263      nq = 
max( 1, 
numroc( ja+n-1, desca( nb_ ), mycol, desca( csrc_ ),
 
  264     $          npcol ) )
  265      CALL descset( descd, 1, ja+n-1, 1, desca( nb_ ), myrow,
 
  266     $              desca( csrc_ ), desca( ctxt_ ), 1 )
  267      aii = zero
  268      beta = zero
  269
  270      IF( 
lsame( uplo, 
'U' ) ) 
THEN 
  271
  272         CALL infog2l( n+ia-nb, n+ja-nb, desca, nprow, npcol, myrow,
 
  273     $                 mycol, ii, jj, iarow, iacol )
  274         CALL descset( descwk, 1, descw( nb_ ), 1, descw( nb_ ), iarow,
 
  275     $                 iacol, ictxt, 1 )
  276         CALL descset( desce, 1, ja+n-1, 1, desca( nb_ ), myrow,
 
  277     $                 desca( csrc_ ), desca( ctxt_ ), 1 )
  278
  279
  280
  281         DO 10 j = ja+n-1, ja+n-nb, -1
  282            i = ia + j - ja
  283            k = j - ja + 1
  284            kw = mod( k-1, desca( mb_ ) ) + 1
  285
  286
  287
  288            CALL pzelget( 
'E', 
' ', aii, a, i, j, desca )
 
  289            CALL pzelset( a, i, j, desca, dcmplx( dble( aii ) ) )
 
  290            CALL pzlacgv( n-k, w, iw+k-1, jw+kw, descw, descw( m_ ) )
 
  291            CALL pzgemv( 'No transpose', k, n-k, -one, a, ia, j+1,
  292     $                   desca, w, iw+k-1, jw+kw, descw, descw( m_ ),
  293     $                   one, a, ia, j, desca, 1 )
  294            CALL pzlacgv( n-k, w, iw+k-1, jw+kw, descw, descw( m_ ) )
 
  295            CALL pzlacgv( n-k, a, i, j+1, desca, desca( m_ ) )
 
  296            CALL pzgemv( 'No transpose', k, n-k, -one, w, iw, jw+kw,
  297     $                   descw, a, i, j+1, desca, desca( m_ ), one, a,
  298     $                   ia, j, desca, 1 )
  299            CALL pzlacgv( n-k, a, i, j+1, desca, desca( m_ ) )
 
  300            CALL pzelget( 
'E', 
' ', aii, a, i, j, desca )
 
  301            CALL pzelset( a, i, j, desca, dcmplx( dble( aii ) ) )
 
  302            IF( n-k.GT.0 )
  303     $         
CALL pzelset( a, i, j+1, desca, dcmplx( e( jp ) ) )
 
  304
  305
  306
  307
  308            jp = 
min( jj+kw-1, nq )
 
  309            CALL pzlarfg( k-1, beta, i-1, j, a, ia, j, desca, 1,
 
  310     $                    tau )
  311            CALL pdelset( e, 1, j, desce, dble( beta ) )
 
  312            CALL pzelset( a, i-1, j, desca, one )
 
  313
  314
  315
  316            CALL pzhemv( 'Upper', k-1, one, a, ia, ja, desca, a, ia, j,
  317     $                   desca, 1, zero, w, iw, jw+kw-1, descw, 1 )
  318
  319            jwk = mod( k-1, descwk( nb_ ) ) + 2
  320            CALL pzgemv( 'Conjugate transpose', k-1, n-k, one, w, iw,
  321     $                   jw+kw, descw, a, ia, j, desca, 1, zero, work,
  322     $                   1, jwk, descwk, descwk( m_ ) )
  323            CALL pzgemv( 'No transpose', k-1, n-k, -one, a, ia, j+1,
  324     $                   desca, work, 1, jwk, descwk, descwk( m_ ), one,
  325     $                   w, iw, jw+kw-1, descw, 1 )
  326            CALL pzgemv( 'Conjugate transpose', k-1, n-k, one, a, ia,
  327     $                   j+1, desca, a, ia, j, desca, 1, zero, work, 1,
  328     $                   jwk, descwk, descwk( m_ ) )
  329            CALL pzgemv( 'No transpose', k-1, n-k, -one, w, iw, jw+kw,
  330     $                   descw, work, 1, jwk, descwk, descwk( m_ ), one,
  331     $                   w, iw, jw+kw-1, descw, 1 )
  332            CALL pzscal( k-1, tau( jp ), w, iw, jw+kw-1, descw, 1 )
  333
  334            CALL pzdotc( k-1, alpha, w, iw, jw+kw-1, descw, 1, a, ia, j,
  335     $                   desca, 1 )
  336            IF( mycol.EQ.iacol )
  337     $         alpha = -half*tau( jp )*alpha
  338            CALL pzaxpy( k-1, alpha, a, ia, j, desca, 1, w, iw, jw+kw-1,
  339     $                   descw, 1 )
  340            CALL pzelget( 
'E', 
' ', beta, a, i, j, desca )
 
  341            CALL pdelset( d, 1, j, descd, dble( beta ) )
 
  342
  343   10    CONTINUE
  344
  345      ELSE
  346
  347         CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, ii,
 
  348     $                 jj, iarow, iacol )
  349         CALL descset( descwk, 1, descw( nb_ ), 1, descw( nb_ ), iarow,
 
  350     $                 iacol, ictxt, 1 )
  351         CALL descset( desce, 1, ja+n-2, 1, desca( nb_ ), myrow,
 
  352     $                 desca( csrc_ ), desca( ctxt_ ), 1 )
  353
  354
  355
  356         DO 20 j = ja, ja+nb-1
  357            i = ia + j - ja
  358            k = j - ja + 1
  359
  360
  361
  362            CALL pzelget( 
'E', 
' ', aii, a, i, j, desca )
 
  363            CALL pzelset( a, i, j, desca, dcmplx( dble( aii ) ) )
 
  364            CALL pzlacgv( k-1, w, iw+k-1, jw, descw, descw( m_ ) )
 
  365            CALL pzgemv( 'No transpose', n-k+1, k-1, -one, a, i, ja,
  366     $                   desca, w, iw+k-1, jw, descw, descw( m_ ), one,
  367     $                   a, i, j, desca, 1 )
  368            CALL pzlacgv( k-1, w, iw+k-1, jw, descw, descw( m_ ) )
 
  369            CALL pzlacgv( k-1, a, i, ja, desca, desca( m_ ) )
 
  370            CALL pzgemv( 'No transpose', n-k+1, k-1, -one, w, iw+k-1,
  371     $                   jw, descw, a, i, ja, desca, desca( m_ ), one,
  372     $                   a, i, j, desca, 1 )
  373            CALL pzlacgv( k-1, a, i, ja, desca, desca( m_ ) )
 
  374            CALL pzelget( 
'E', 
' ', aii, a, i, j, desca )
 
  375            CALL pzelset( a, i, j, desca, dcmplx( dble( aii ) ) )
 
  376            IF( k.GT.1 )
  377     $         
CALL pzelset( a, i, j-1, desca, dcmplx( e( jp ) ) )
 
  378
  379
  380
  381
  382
  383            jp = 
min( jj+k-1, nq )
 
  384            CALL pzlarfg( n-k, beta, i+1, j, a, i+2, j, desca, 1,
 
  385     $                    tau )
  386            CALL pdelset( e, 1, j, desce, dble( beta ) )
 
  387            CALL pzelset( a, i+1, j, desca, one )
 
  388
  389
  390
  391            CALL pzhemv( 'Lower', n-k, one, a, i+1, j+1, desca, a, i+1,
  392     $                   j, desca, 1, zero, w, iw+k, jw+k-1, descw, 1 )
  393
  394            CALL pzgemv( 'Conjugate Transpose', n-k, k-1, one, w, iw+k,
  395     $                   jw, descw, a, i+1, j, desca, 1, zero, work, 1,
  396     $                   1, descwk, descwk( m_ ) )
  397            CALL pzgemv( 'No transpose', n-k, k-1, -one, a, i+1, ja,
  398     $                  desca, work, 1, 1, descwk, descwk( m_ ), one, w,
  399     $                  iw+k, jw+k-1, descw, 1 )
  400            CALL pzgemv( 'Conjugate transpose', n-k, k-1, one, a, i+1,
  401     $                  ja, desca, a, i+1, j, desca, 1, zero, work, 1,
  402     $                  1, descwk, descwk( m_ ) )
  403            CALL pzgemv( 'No transpose', n-k, k-1, -one, w, iw+k, jw,
  404     $                  descw, work, 1, 1, descwk, descwk( m_ ), one, w,
  405     $                  iw+k, jw+k-1, descw, 1 )
  406            CALL pzscal( n-k, tau( jp ), w, iw+k, jw+k-1, descw, 1 )
  407            CALL pzdotc( n-k, alpha, w, iw+k, jw+k-1, descw, 1, a, i+1,
  408     $                   j, desca, 1 )
  409            IF( mycol.EQ.iacol )
  410     $         alpha = -half*tau( jp )*alpha
  411            CALL pzaxpy( n-k, alpha, a, i+1, j, desca, 1, w, iw+k,
  412     $                   jw+k-1, descw, 1 )
  413            CALL pzelget( 
'E', 
' ', beta, a, i, j, desca )
 
  414            CALL pdelset( d, 1, j, descd, dble( beta ) )
 
  415
  416   20    CONTINUE
  417
  418      END IF
  419
  420
  421
  422      IF( mycol.EQ.iacol ) THEN
  423         IF( myrow.EQ.iarow ) THEN
  424            CALL dgebs2d( ictxt, 'Columnwise', ' ', 1, nb, d( jj ), 1 )
  425         ELSE
  426            CALL dgebr2d( ictxt, 'Columnwise', ' ', 1, nb, d( jj ), 1,
  427     $                    iarow, mycol )
  428         END IF
  429      END IF
  430
  431      RETURN
  432
  433
  434
subroutine descset(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld)
 
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
 
integer function numroc(n, nb, iproc, isrcproc, nprocs)
 
subroutine pdelset(a, ia, ja, desca, alpha)
 
subroutine pzelget(scope, top, alpha, a, ia, ja, desca)
 
subroutine pzelset(a, ia, ja, desca, alpha)
 
subroutine pzlacgv(n, x, ix, jx, descx, incx)
 
subroutine pzlarfg(n, alpha, iax, jax, x, ix, jx, descx, incx, tau)