3
    4
    5
    6
    7
    8
    9
   10      CHARACTER          DIAG, NORMIN, TRANS, UPLO
   11      INTEGER            IA, INFO, IX, JA, JX, N
   12      DOUBLE PRECISION   SCALE
   13
   14
   15      INTEGER            DESCA( * ), DESCX( * )
   16      DOUBLE PRECISION   CNORM( * )
   17      COMPLEX*16         A( * ), X( * )
   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
  223
  224
  225
  226
  227
  228
  229
  230
  231
  232
  233
  234
  235
  236
  237
  238
  239
  240
  241
  242
  243
  244
  245
  246
  247
  248
  249
  250
  251
  252
  253
  254
  255      DOUBLE PRECISION   ZERO, HALF, ONE, TWO
  256      parameter( zero = 0.0d+0, half = 0.5d+0, one = 1.0d+0,
  257     $                   two = 2.0d+0 )
  258      COMPLEX*16         CZERO, CONE
  259      parameter( czero = ( 0.0d+0, 0.0d+0 ),
  260     $                   cone = ( 1.0d+0, 0.0d+0 ) )
  261      INTEGER            BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
  262     $                   MB_, NB_, RSRC_, CSRC_, LLD_
  263      parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
  264     $                   ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
  265     $                   rsrc_ = 7, csrc_ = 8, lld_ = 9 )
  266
  267
  268      LOGICAL            NOTRAN, NOUNIT, UPPER
  269      INTEGER            CONTXT, CSRC, I, ICOL, ICOLX, IMAX, IROW,
  270     $                   IROWX, ITMP1, ITMP1X, ITMP2, ITMP2X, J, JFIRST,
  271     $                   JINC, JLAST, LDA, LDX, MB, MYCOL, MYROW, NB,
  272     $                   NPCOL, NPROW, RSRC
  273      DOUBLE PRECISION   BIGNUM, GROW, REC, SMLNUM, TJJ, TMAX, TSCAL,
  274     $                   XBND, XJ, ZR, ZI
  275      COMPLEX*16         CSUMJ, TJJS, USCAL, XJTMP, ZDUM
  276      DOUBLE PRECISION   XMAX( 1 )
  277
  278
  279      LOGICAL            LSAME
  280      INTEGER            IDAMAX
  281      DOUBLE PRECISION   PDLAMCH
  283
  284
  285      EXTERNAL           blacs_gridinfo, dgsum2d, dscal, 
infog2l,
 
  287     $                   pzdotc, pzdotu, pzdscal, 
pzlaset, pzscal,
 
  288     $                   pztrsv, zgebr2d, zgebs2d, dladiv
  289
  290
  291      INTRINSIC          abs, dble, dcmplx, dconjg, dimag, 
max, 
min 
  292
  293
  294      DOUBLE PRECISION   CABS1, CABS2
  295
  296
  297      cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( zdum ) )
  298      cabs2( zdum ) = abs( dble( zdum ) / 2.d0 ) +
  299     $                abs( dimag( zdum ) / 2.d0 )
  300
  301
  302
  303      info = 0
  304      upper = 
lsame( uplo, 
'U' )
 
  305      notran = 
lsame( trans, 
'N' )
 
  306      nounit = 
lsame( diag, 
'N' )
 
  307
  308      contxt = desca( ctxt_ )
  309      rsrc = desca( rsrc_ )
  310      csrc = desca( csrc_ )
  311      mb = desca( mb_ )
  312      nb = desca( nb_ )
  313      lda = desca( lld_ )
  314      ldx = descx( lld_ )
  315
  316
  317
  318      IF( .NOT.upper .AND. .NOT.
lsame( uplo, 
'L' ) ) 
THEN 
  319         info = -1
  320      ELSE IF( .NOT.notran .AND. .NOT.
lsame( trans, 
'T' ) .AND. .NOT.
 
  321     $         
lsame( trans, 
'C' ) ) 
THEN 
  322         info = -2
  323      ELSE IF( .NOT.nounit .AND. .NOT.
lsame( diag, 
'U' ) ) 
THEN 
  324         info = -3
  325      ELSE IF( .NOT.
lsame( normin, 
'Y' ) .AND. .NOT.
 
  326     $         
lsame( normin, 
'N' ) ) 
THEN 
  327         info = -4
  328      ELSE IF( n.LT.0 ) THEN
  329         info = -5
  330      END IF
  331
  332      CALL blacs_gridinfo( contxt, nprow, npcol, myrow, mycol )
  333
  334      IF( info.NE.0 ) THEN
  335         CALL pxerbla( contxt, 
'PZLATTRS', -info )
 
  336         RETURN
  337      END IF
  338
  339
  340
  341      IF( n.EQ.0 )
  342     $   RETURN
  343
  344
  345
  346      smlnum = 
pdlamch( contxt, 
'Safe minimum' )
 
  347      bignum = one / smlnum
  348      CALL pdlabad( contxt, smlnum, bignum )
 
  349      smlnum = smlnum / 
pdlamch( contxt, 
'Precision' )
 
  350      bignum = one / smlnum
  351      scale = one
  352
  353
  354      IF( 
lsame( normin, 
'N' ) ) 
THEN 
  355
  356
  357
  358         IF( upper ) THEN
  359
  360
  361
  362            cnorm( 1 ) = zero
  363            DO 10 j = 2, n
  364               CALL pdzasum( j-1, cnorm( j ), a, ia, ja+j-1, desca, 1 )
  365   10       CONTINUE
  366         ELSE
  367
  368
  369
  370            DO 20 j = 1, n - 1
  371               CALL pdzasum( n-j, cnorm( j ), a, ia+j, ja+j-1, desca,
  372     $                       1 )
  373   20       CONTINUE
  374            cnorm( n ) = zero
  375         END IF
  376         CALL dgsum2d( contxt, 'Row', ' ', n, 1, cnorm, 1, -1, -1 )
  377      END IF
  378
  379
  380
  381
  382      imax = idamax( n, cnorm, 1 )
  383      tmax = cnorm( imax )
  384      IF( tmax.LE.bignum*half ) THEN
  385         tscal = one
  386      ELSE
  387         tscal = half / ( smlnum*tmax )
  388         CALL dscal( n, tscal, cnorm, 1 )
  389      END IF
  390
  391
  392
  393
  394      xmax( 1 ) = zero
  395      CALL pzamax( n, zdum, imax, x, ix, jx, descx, 1 )
  396      xmax( 1 ) = cabs2( zdum )
  397      CALL dgsum2d( contxt, 'Row', ' ', 1, 1, xmax, 1, -1, -1 )
  398      xbnd = xmax( 1 )
  399
  400      IF( notran ) THEN
  401
  402
  403
  404         IF( upper ) THEN
  405            jfirst = n
  406            jlast = 1
  407            jinc = -1
  408         ELSE
  409            jfirst = 1
  410            jlast = n
  411            jinc = 1
  412         END IF
  413
  414         IF( tscal.NE.one ) THEN
  415            grow = zero
  416            GO TO 50
  417         END IF
  418
  419         IF( nounit ) THEN
  420
  421
  422
  423
  424
  425
  426            grow = half / 
max( xbnd, smlnum )
 
  427            xbnd = grow
  428            DO 30 j = jfirst, jlast, jinc
  429
  430
  431
  432               IF( grow.LE.smlnum )
  433     $            GO TO 50
  434
  435
  436               CALL infog2l( ia+j-1, ja+j-1, desca, nprow, npcol, myrow,
 
  437     $                       mycol, irow, icol, itmp1, itmp2 )
  438               IF( ( myrow.EQ.itmp1 ) .AND. ( mycol.EQ.itmp2 ) ) THEN
  439                  tjjs = a( ( icol-1 )*lda+irow )
  440                  CALL zgebs2d( contxt, 'All', ' ', 1, 1, tjjs, 1 )
  441               ELSE
  442                  CALL zgebr2d( contxt, 'All', ' ', 1, 1, tjjs, 1,
  443     $                          itmp1, itmp2 )
  444               END IF
  445               tjj = cabs1( tjjs )
  446
  447               IF( tjj.GE.smlnum ) THEN
  448
  449
  450
  451                  xbnd = 
min( xbnd, 
min( one, tjj )*grow )
 
  452               ELSE
  453
  454
  455
  456                  xbnd = zero
  457               END IF
  458
  459               IF( tjj+cnorm( j ).GE.smlnum ) THEN
  460
  461
  462
  463                  grow = grow*( tjj / ( tjj+cnorm( j ) ) )
  464               ELSE
  465
  466
  467
  468                  grow = zero
  469               END IF
  470   30       CONTINUE
  471            grow = xbnd
  472         ELSE
  473
  474
  475
  476
  477
  478            grow = 
min( one, half / 
max( xbnd, smlnum ) )
 
  479            DO 40 j = jfirst, jlast, jinc
  480
  481
  482
  483               IF( grow.LE.smlnum )
  484     $            GO TO 50
  485
  486
  487
  488               grow = grow*( one / ( one+cnorm( j ) ) )
  489   40       CONTINUE
  490         END IF
  491   50    CONTINUE
  492
  493      ELSE
  494
  495
  496
  497         IF( upper ) THEN
  498            jfirst = 1
  499            jlast = n
  500            jinc = 1
  501         ELSE
  502            jfirst = n
  503            jlast = 1
  504            jinc = -1
  505         END IF
  506
  507         IF( tscal.NE.one ) THEN
  508            grow = zero
  509            GO TO 80
  510         END IF
  511
  512         IF( nounit ) THEN
  513
  514
  515
  516
  517
  518
  519            grow = half / 
max( xbnd, smlnum )
 
  520            xbnd = grow
  521            DO 60 j = jfirst, jlast, jinc
  522
  523
  524
  525               IF( grow.LE.smlnum )
  526     $            GO TO 80
  527
  528
  529
  530               xj = one + cnorm( j )
  531               grow = 
min( grow, xbnd / xj )
 
  532
  533
  534               CALL infog2l( ia+j-1, ja+j-1, desca, nprow, npcol, myrow,
 
  535     $                       mycol, irow, icol, itmp1, itmp2 )
  536               IF( ( myrow.EQ.itmp1 ) .AND. ( mycol.EQ.itmp2 ) ) THEN
  537                  tjjs = a( ( icol-1 )*lda+irow )
  538                  CALL zgebs2d( contxt, 'All', ' ', 1, 1, tjjs, 1 )
  539               ELSE
  540                  CALL zgebr2d( contxt, 'All', ' ', 1, 1, tjjs, 1,
  541     $                          itmp1, itmp2 )
  542               END IF
  543               tjj = cabs1( tjjs )
  544
  545               IF( tjj.GE.smlnum ) THEN
  546
  547
  548
  549                  IF( xj.GT.tjj )
  550     $               xbnd = xbnd*( tjj / xj )
  551               ELSE
  552
  553
  554
  555                  xbnd = zero
  556               END IF
  557   60       CONTINUE
  558            grow = 
min( grow, xbnd )
 
  559         ELSE
  560
  561
  562
  563
  564
  565            grow = 
min( one, half / 
max( xbnd, smlnum ) )
 
  566            DO 70 j = jfirst, jlast, jinc
  567
  568
  569
  570               IF( grow.LE.smlnum )
  571     $            GO TO 80
  572
  573
  574
  575               xj = one + cnorm( j )
  576               grow = grow / xj
  577   70       CONTINUE
  578         END IF
  579   80    CONTINUE
  580      END IF
  581
  582      IF( ( grow*tscal ).GT.smlnum ) THEN
  583
  584
  585
  586
  587         CALL pztrsv( uplo, trans, diag, n, a, ia, ja, desca, x, ix, jx,
  588     $                descx, 1 )
  589      ELSE
  590
  591
  592
  593         IF( xmax( 1 ).GT.bignum*half ) THEN
  594
  595
  596
  597
  598            scale = ( bignum*half ) / xmax( 1 )
  599            CALL pzdscal( n, scale, x, ix, jx, descx, 1 )
  600            xmax( 1 ) = bignum
  601         ELSE
  602            xmax( 1 ) = xmax( 1 )*two
  603         END IF
  604
  605         IF( notran ) THEN
  606
  607
  608
  609            DO 100 j = jfirst, jlast, jinc
  610
  611
  612
  613
  614               CALL infog2l( ix+j-1, jx, descx, nprow, npcol, myrow,
 
  615     $                       mycol, irowx, icolx, itmp1x, itmp2x )
  616               IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) ) THEN
  617                  xjtmp = x( irowx )
  618                  CALL zgebs2d( contxt, 'All', ' ', 1, 1, xjtmp, 1 )
  619               ELSE
  620                  CALL zgebr2d( contxt, 'All', ' ', 1, 1, xjtmp, 1,
  621     $                          itmp1x, itmp2x )
  622               END IF
  623               xj = cabs1( xjtmp )
  624               IF( nounit ) THEN
  625
  626                  CALL infog2l( ia+j-1, ja+j-1, desca, nprow, npcol,
 
  627     $                          myrow, mycol, irow, icol, itmp1, itmp2 )
  628                  IF( ( myrow.EQ.itmp1 ) .AND. ( mycol.EQ.itmp2 ) ) THEN
  629                     tjjs = a( ( icol-1 )*lda+irow )*tscal
  630                     CALL zgebs2d( contxt, 'All', ' ', 1, 1, tjjs, 1 )
  631                  ELSE
  632                     CALL zgebr2d( contxt, 'All', ' ', 1, 1, tjjs, 1,
  633     $                             itmp1, itmp2 )
  634                  END IF
  635               ELSE
  636                  tjjs = tscal
  637                  IF( tscal.EQ.one )
  638     $               GO TO 90
  639               END IF
  640               tjj = cabs1( tjjs )
  641               IF( tjj.GT.smlnum ) THEN
  642
  643
  644
  645                  IF( tjj.LT.one ) THEN
  646                     IF( xj.GT.tjj*bignum ) THEN
  647
  648
  649
  650                        rec = one / xj
  651                        CALL pzdscal( n, rec, x, ix, jx, descx, 1 )
  652                        xjtmp = xjtmp*rec
  653                        scale = scale*rec
  654                        xmax( 1 ) = xmax( 1 )*rec
  655                     END IF
  656                  END IF
  657
  658
  659                  CALL dladiv( dble( xjtmp ), dimag( xjtmp ),
  660     $                         dble( tjjs ), dimag( tjjs ), zr, zi )
  661                  xjtmp = dcmplx( zr, zi )
  662                  xj = cabs1( xjtmp )
  663                  IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
  664     $                 THEN
  665                     x( irowx ) = xjtmp
  666                  END IF
  667               ELSE IF( tjj.GT.zero ) THEN
  668
  669
  670
  671                  IF( xj.GT.tjj*bignum ) THEN
  672
  673
  674
  675
  676                     rec = ( tjj*bignum ) / xj
  677                     IF( cnorm( j ).GT.one ) THEN
  678
  679
  680
  681
  682                        rec = rec / cnorm( j )
  683                     END IF
  684                     CALL pzdscal( n, rec, x, ix, jx, descx, 1 )
  685                     xjtmp = xjtmp*rec
  686                     scale = scale*rec
  687                     xmax( 1 ) = xmax( 1 )*rec
  688                  END IF
  689
  690
  691                  CALL dladiv( dble( xjtmp ), dimag( xjtmp ),
  692     $                         dble( tjjs ), dimag( tjjs ), zr, zi )
  693                  xjtmp = dcmplx( zr, zi )
  694                  xj = cabs1( xjtmp )
  695                  IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
  696     $                 THEN
  697                     x( irowx ) = xjtmp
  698                  END IF
  699               ELSE
  700
  701
  702
  703
  704                  CALL pzlaset( 
' ', n, 1, czero, czero, x, ix, jx,
 
  705     $                          descx )
  706                  IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
  707     $                 THEN
  708                     x( irowx ) = cone
  709                  END IF
  710                  xjtmp = cone
  711                  xj = one
  712                  scale = zero
  713                  xmax( 1 ) = zero
  714               END IF
  715   90          CONTINUE
  716
  717
  718
  719
  720               IF( xj.GT.one ) THEN
  721                  rec = one / xj
  722                  IF( cnorm( j ).GT.( bignum-xmax( 1 ) )*rec ) THEN
  723
  724
  725
  726                     rec = rec*half
  727                     CALL pzdscal( n, rec, x, ix, jx, descx, 1 )
  728                     xjtmp = xjtmp*rec
  729                     scale = scale*rec
  730                  END IF
  731               ELSE IF( xj*cnorm( j ).GT.( bignum-xmax( 1 ) ) ) THEN
  732
  733
  734
  735                  CALL pzdscal( n, half, x, ix, jx, descx, 1 )
  736                  xjtmp = xjtmp*half
  737                  scale = scale*half
  738               END IF
  739
  740               IF( upper ) THEN
  741                  IF( j.GT.1 ) THEN
  742
  743
  744
  745
  746                     zdum = -xjtmp*tscal
  747                     CALL pzaxpy( j-1, zdum, a, ia, ja+j-1, desca, 1, x,
  748     $                            ix, jx, descx, 1 )
  749                     CALL pzamax( j-1, zdum, imax, x, ix, jx, descx, 1 )
  750                     xmax( 1 ) = cabs1( zdum )
  751                     CALL dgsum2d( contxt, 'Row', ' ', 1, 1, xmax, 1,
  752     $                             -1, -1 )
  753                  END IF
  754               ELSE
  755                  IF( j.LT.n ) THEN
  756
  757
  758
  759
  760                     zdum = -xjtmp*tscal
  761                     CALL pzaxpy( n-j, zdum, a, ia+j, ja+j-1, desca, 1,
  762     $                            x, ix+j, jx, descx, 1 )
  763                     CALL pzamax( n-j, zdum, i, x, ix+j, jx, descx, 1 )
  764                     xmax( 1 ) = cabs1( zdum )
  765                     CALL dgsum2d( contxt, 'Row', ' ', 1, 1, xmax, 1,
  766     $                             -1, -1 )
  767                  END IF
  768               END IF
  769  100       CONTINUE
  770
  771         ELSE IF( 
lsame( trans, 
'T' ) ) 
THEN 
  772
  773
  774
  775            DO 120 j = jfirst, jlast, jinc
  776
  777
  778
  779
  780
  781               CALL infog2l( ix+j-1, jx, descx, nprow, npcol, myrow,
 
  782     $                       mycol, irowx, icolx, itmp1x, itmp2x )
  783               IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) ) THEN
  784                  xjtmp = x( irowx )
  785                  CALL zgebs2d( contxt, 'All', ' ', 1, 1, xjtmp, 1 )
  786               ELSE
  787                  CALL zgebr2d( contxt, 'All', ' ', 1, 1, xjtmp, 1,
  788     $                          itmp1x, itmp2x )
  789               END IF
  790               xj = cabs1( xjtmp )
  791               uscal = dcmplx( tscal )
  792               rec = one / 
max( xmax( 1 ), one )
 
  793               IF( cnorm( j ).GT.( bignum-xj )*rec ) THEN
  794
  795
  796
  797                  rec = rec*half
  798                  IF( nounit ) THEN
  799
  800                     CALL infog2l( ia+j-1, ja+j-1, desca, nprow, npcol,
 
  801     $                             myrow, mycol, irow, icol, itmp1,
  802     $                             itmp2 )
  803                     IF( ( myrow.EQ.itmp1 ) .AND. ( mycol.EQ.itmp2 ) )
  804     $                    THEN
  805                        tjjs = a( ( icol-1 )*lda+irow )*tscal
  806                        CALL zgebs2d( contxt, 'All', ' ', 1, 1, tjjs,
  807     $                                1 )
  808                     ELSE
  809                        CALL zgebr2d( contxt, 'All', ' ', 1, 1, tjjs, 1,
  810     $                                itmp1, itmp2 )
  811                     END IF
  812                  ELSE
  813                     tjjs = tscal
  814                  END IF
  815                  tjj = cabs1( tjjs )
  816                  IF( tjj.GT.one ) THEN
  817
  818
  819
  820                     rec = 
min( one, rec*tjj )
 
  821                     CALL dladiv( dble( uscal ), dimag( uscal ),
  822     $                            dble( tjjs ), dimag( tjjs ), zr, zi )
  823                     uscal = dcmplx( zr, zi )
  824                  END IF
  825                  IF( rec.LT.one ) THEN
  826                     CALL pzdscal( n, rec, x, ix, jx, descx, 1 )
  827                     xjtmp = xjtmp*rec
  828                     scale = scale*rec
  829                     xmax( 1 ) = xmax( 1 )*rec
  830                  END IF
  831               END IF
  832
  833               csumj = czero
  834               IF( uscal.EQ.cone ) THEN
  835
  836
  837
  838
  839                  IF( upper ) THEN
  840                     CALL pzdotu( j-1, csumj, a, ia, ja+j-1, desca, 1,
  841     $                            x, ix, jx, descx, 1 )
  842                  ELSE IF( j.LT.n ) THEN
  843                     CALL pzdotu( n-j, csumj, a, ia+j, ja+j-1, desca, 1,
  844     $                            x, ix+j, jx, descx, 1 )
  845                  END IF
  846                  IF( mycol.EQ.itmp2x ) THEN
  847                     CALL zgebs2d( contxt, 'Row', ' ', 1, 1, csumj, 1 )
  848                  ELSE
  849                     CALL zgebr2d( contxt, 'Row', ' ', 1, 1, csumj, 1,
  850     $                             myrow, itmp2x )
  851                  END IF
  852               ELSE
  853
  854
  855
  856
  857                  IF( upper ) THEN
  858
  859
  860
  861                     zdum = dconjg( uscal )
  862                     CALL pzscal( j-1, zdum, a, ia, ja+j-1, desca, 1 )
  863                     CALL pzdotu( j-1, csumj, a, ia, ja+j-1, desca, 1,
  864     $                            x, ix, jx, descx, 1 )
  865                     CALL dladiv( dble( zdum ), dimag( zdum ),
  866     $                            dble( uscal ), dimag( uscal ), zr, zi)
  867                     zdum = dcmplx( zr, zi )
  868                     CALL pzscal( j-1, zdum, a, ia, ja+j-1, desca, 1 )
  869                  ELSE IF( j.LT.n ) THEN
  870
  871
  872
  873                     zdum = dconjg( uscal )
  874                     CALL pzscal( n-j, zdum, a, ia+j, ja+j-1, desca, 1 )
  875                     CALL pzdotu( n-j, csumj, a, ia+j, ja+j-1, desca, 1,
  876     $                            x, ix+j, jx, descx, 1 )
  877                     CALL dladiv( dble( zdum ), dimag( zdum ),
  878     $                            dble( uscal ), dimag( uscal ), zr, zi)
  879                     zdum = dcmplx( zr, zi )
  880                     CALL pzscal( n-j, zdum, a, ia+j, ja+j-1, desca, 1 )
  881                  END IF
  882                  IF( mycol.EQ.itmp2x ) THEN
  883                     CALL zgebs2d( contxt, 'Row', ' ', 1, 1, csumj, 1 )
  884                  ELSE
  885                     CALL zgebr2d( contxt, 'Row', ' ', 1, 1, csumj, 1,
  886     $                             myrow, itmp2x )
  887                  END IF
  888               END IF
  889
  890               IF( uscal.EQ.dcmplx( tscal ) ) THEN
  891
  892
  893
  894
  895
  896
  897                  xjtmp = xjtmp - csumj
  898                  xj = cabs1( xjtmp )
  899
  900
  901                  IF( nounit ) THEN
  902
  903                     CALL infog2l( ia+j-1, ja+j-1, desca, nprow, npcol,
 
  904     $                             myrow, mycol, irow, icol, itmp1,
  905     $                             itmp2 )
  906                     IF( ( myrow.EQ.itmp1 ) .AND. ( mycol.EQ.itmp2 ) )
  907     $                    THEN
  908                        tjjs = a( ( icol-1 )*lda+irow )*tscal
  909                        CALL zgebs2d( contxt, 'All', ' ', 1, 1, tjjs,
  910     $                                1 )
  911                     ELSE
  912                        CALL zgebr2d( contxt, 'All', ' ', 1, 1, tjjs, 1,
  913     $                                itmp1, itmp2 )
  914                     END IF
  915                  ELSE
  916                     tjjs = tscal
  917                     IF( tscal.EQ.one )
  918     $                  GO TO 110
  919                  END IF
  920
  921
  922
  923                  tjj = cabs1( tjjs )
  924                  IF( tjj.GT.smlnum ) THEN
  925
  926
  927
  928                     IF( tjj.LT.one ) THEN
  929                        IF( xj.GT.tjj*bignum ) THEN
  930
  931
  932
  933                           rec = one / xj
  934                           CALL pzdscal( n, rec, x, ix, jx, descx, 1 )
  935                           xjtmp = xjtmp*rec
  936                           scale = scale*rec
  937                           xmax( 1 ) = xmax( 1 )*rec
  938                        END IF
  939                     END IF
  940
  941                     CALL dladiv( dble( xjtmp ), dimag( xjtmp ),
  942     $                            dble( tjjs ), dimag( tjjs ), zr, zi )
  943                     xjtmp = dcmplx( zr, zi )
  944                     IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
  945     $                    THEN
  946                        x( irowx ) = xjtmp
  947                     END IF
  948                  ELSE IF( tjj.GT.zero ) THEN
  949
  950
  951
  952                     IF( xj.GT.tjj*bignum ) THEN
  953
  954
  955
  956                        rec = ( tjj*bignum ) / xj
  957                        CALL pzdscal( n, rec, x, ix, jx, descx, 1 )
  958                        xjtmp = xjtmp*rec
  959                        scale = scale*rec
  960                        xmax( 1 ) = xmax( 1 )*rec
  961                     END IF
  962
  963                     CALL dladiv( dble( xjtmp ), dimag( xjtmp ),
  964     $                            dble( tjjs ), dimag( tjjs ), zr, zi )
  965                     xjtmp = dcmplx( zr, zi )
  966                     IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
  967     $                    THEN
  968                        x( irowx ) = xjtmp
  969                     END IF
  970                  ELSE
  971
  972
  973
  974
  975                     CALL pzlaset( 
' ', n, 1, czero, czero, x, ix, jx,
 
  976     $                             descx )
  977                     IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
  978     $                    THEN
  979                        x( irowx ) = cone
  980                     END IF
  981                     xjtmp = cone
  982                     scale = zero
  983                     xmax( 1 ) = zero
  984                  END IF
  985  110             CONTINUE
  986               ELSE
  987
  988
  989
  990
  991
  992                  CALL dladiv( dble( xjtmp ), dimag( xjtmp ),
  993     $                         dble( tjjs ), dimag( tjjs ), zr, zi )
  994                  xjtmp = dcmplx( zr, zi )
  995                  IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
  996     $                 THEN
  997                     x( irowx ) = xjtmp
  998                  END IF
  999               END IF
 1000               xmax( 1 ) = 
max( xmax( 1 ), cabs1( xjtmp ) )
 
 1001  120       CONTINUE
 1002
 1003         ELSE
 1004
 1005
 1006
 1007            DO 140 j = jfirst, jlast, jinc
 1008
 1009
 1010
 1011
 1012               CALL infog2l( ix+j-1, jx, descx, nprow, npcol, myrow,
 
 1013     $                       mycol, irowx, icolx, itmp1x, itmp2x )
 1014               IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) ) THEN
 1015                  xjtmp = x( irowx )
 1016                  CALL zgebs2d( contxt, 'All', ' ', 1, 1, xjtmp, 1 )
 1017               ELSE
 1018                  CALL zgebr2d( contxt, 'All', ' ', 1, 1, xjtmp, 1,
 1019     $                          itmp1x, itmp2x )
 1020               END IF
 1021               xj = cabs1( xjtmp )
 1022               uscal = tscal
 1023               rec = one / 
max( xmax( 1 ), one )
 
 1024               IF( cnorm( j ).GT.( bignum-xj )*rec ) THEN
 1025
 1026
 1027
 1028                  rec = rec*half
 1029                  IF( nounit ) THEN
 1030
 1031                     CALL infog2l( ia+j-1, ja+j-1, desca, nprow, npcol,
 
 1032     $                             myrow, mycol, irow, icol, itmp1,
 1033     $                             itmp2 )
 1034                     IF( ( myrow.EQ.itmp1 ) .AND. ( mycol.EQ.itmp2 ) )
 1035     $                    THEN
 1036                        tjjs = dconjg( a( ( icol-1 )*lda+irow ) )*tscal
 1037                        CALL zgebs2d( contxt, 'All', ' ', 1, 1, tjjs,
 1038     $                                1 )
 1039                     ELSE
 1040                        CALL zgebr2d( contxt, 'All', ' ', 1, 1, tjjs, 1,
 1041     $                                itmp1, itmp2 )
 1042                     END IF
 1043                  ELSE
 1044                     tjjs = tscal
 1045                  END IF
 1046                  tjj = cabs1( tjjs )
 1047                  IF( tjj.GT.one ) THEN
 1048
 1049
 1050
 1051                     rec = 
min( one, rec*tjj )
 
 1052                     CALL dladiv( dble( uscal ), dimag( uscal ),
 1053     $                            dble( tjjs ), dimag( tjjs ), zr, zi )
 1054                     uscal = dcmplx( zr, zi )
 1055                  END IF
 1056                  IF( rec.LT.one ) THEN
 1057                     CALL pzdscal( n, rec, x, ix, jx, descx, 1 )
 1058                     xjtmp = xjtmp*rec
 1059                     scale = scale*rec
 1060                     xmax( 1 ) = xmax( 1 )*rec
 1061                  END IF
 1062               END IF
 1063
 1064               csumj = czero
 1065               IF( uscal.EQ.cone ) THEN
 1066
 1067
 1068
 1069
 1070                  IF( upper ) THEN
 1071                     CALL pzdotc( j-1, csumj, a, ia, ja+j-1, desca, 1,
 1072     $                            x, ix, jx, descx, 1 )
 1073                  ELSE IF( j.LT.n ) THEN
 1074                     CALL pzdotc( n-j, csumj, a, ia+j, ja+j-1, desca, 1,
 1075     $                            x, ix+j, jx, descx, 1 )
 1076                  END IF
 1077                  IF( mycol.EQ.itmp2x ) THEN
 1078                     CALL zgebs2d( contxt, 'Row', ' ', 1, 1, csumj, 1 )
 1079                  ELSE
 1080                     CALL zgebr2d( contxt, 'Row', ' ', 1, 1, csumj, 1,
 1081     $                             myrow, itmp2x )
 1082                  END IF
 1083               ELSE
 1084
 1085
 1086
 1087
 1088                  IF( upper ) THEN
 1089
 1090
 1091
 1092
 1093                     zdum = dconjg( uscal )
 1094                     CALL pzscal( j-1, zdum, a, ia, ja+j-1, desca, 1 )
 1095                     CALL pzdotc( j-1, csumj, a, ia, ja+j-1, desca, 1,
 1096     $                            x, ix, jx, descx, 1 )
 1097                     CALL dladiv( one, zero,
 1098     $                            dble( zdum ), dimag( zdum ), zr, zi )
 1099                     zdum = dcmplx( zr, zi )
 1100                     CALL pzscal( j-1, zdum, a, ia, ja+j-1, desca, 1 )
 1101                  ELSE IF( j.LT.n ) THEN
 1102
 1103
 1104
 1105
 1106                     zdum = dconjg( uscal )
 1107                     CALL pzscal( n-j, zdum, a, ia+j, ja+j-1, desca, 1 )
 1108                     CALL pzdotc( n-j, csumj, a, ia+j, ja+j-1, desca, 1,
 1109     $                            x, ix+j, jx, descx, 1 )
 1110                     CALL dladiv( one, zero,
 1111     $                            dble( zdum ), dimag( zdum ), zr, zi )
 1112                     zdum = dcmplx( zr, zi )
 1113                     CALL pzscal( n-j, zdum, a, ia+j, ja+j-1, desca, 1 )
 1114                  END IF
 1115                  IF( mycol.EQ.itmp2x ) THEN
 1116                     CALL zgebs2d( contxt, 'Row', ' ', 1, 1, csumj, 1 )
 1117                  ELSE
 1118                     CALL zgebr2d( contxt, 'Row', ' ', 1, 1, csumj, 1,
 1119     $                             myrow, itmp2x )
 1120                  END IF
 1121               END IF
 1122
 1123               IF( uscal.EQ.dcmplx( tscal ) ) THEN
 1124
 1125
 1126
 1127
 1128
 1129
 1130                  xjtmp = xjtmp - csumj
 1131                  xj = cabs1( xjtmp )
 1132
 1133
 1134                  IF( nounit ) THEN
 1135
 1136                     CALL infog2l( ia+j-1, ja+j-1, desca, nprow, npcol,
 
 1137     $                             myrow, mycol, irow, icol, itmp1,
 1138     $                             itmp2 )
 1139                     IF( ( myrow.EQ.itmp1 ) .AND. ( mycol.EQ.itmp2 ) )
 1140     $                    THEN
 1141                        tjjs = dconjg( a( ( icol-1 )*lda+irow ) )*tscal
 1142                        CALL zgebs2d( contxt, 'All', ' ', 1, 1, tjjs,
 1143     $                                1 )
 1144                     ELSE
 1145                        CALL zgebr2d( contxt, 'All', ' ', 1, 1, tjjs, 1,
 1146     $                                itmp1, itmp2 )
 1147                     END IF
 1148                  ELSE
 1149                     tjjs = tscal
 1150                     IF( tscal.EQ.one )
 1151     $                  GO TO 130
 1152                  END IF
 1153
 1154
 1155
 1156                  tjj = cabs1( tjjs )
 1157                  IF( tjj.GT.smlnum ) THEN
 1158
 1159
 1160
 1161                     IF( tjj.LT.one ) THEN
 1162                        IF( xj.GT.tjj*bignum ) THEN
 1163
 1164
 1165
 1166                           rec = one / xj
 1167                           CALL pzdscal( n, rec, x, ix, jx, descx, 1 )
 1168                           xjtmp = xjtmp*rec
 1169                           scale = scale*rec
 1170                           xmax( 1 ) = xmax( 1 )*rec
 1171                        END IF
 1172                     END IF
 1173
 1174                     CALL dladiv( dble( xjtmp ), dimag( xjtmp ),
 1175     $                            dble( tjjs ), dimag( tjjs ), zr, zi )
 1176                     xjtmp = dcmplx( zr, zi )
 1177                     IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
 1178     $                  x( irowx ) = xjtmp
 1179                  ELSE IF( tjj.GT.zero ) THEN
 1180
 1181
 1182
 1183                     IF( xj.GT.tjj*bignum ) THEN
 1184
 1185
 1186
 1187                        rec = ( tjj*bignum ) / xj
 1188                        CALL pzdscal( n, rec, x, ix, jx, descx, 1 )
 1189                        xjtmp = xjtmp*rec
 1190                        scale = scale*rec
 1191                        xmax( 1 ) = xmax( 1 )*rec
 1192                     END IF
 1193
 1194                     CALL dladiv( dble( xjtmp ), dimag( xjtmp ),
 1195     $                            dble( tjjs ), dimag( tjjs ), zr, zi )
 1196                     xjtmp = dcmplx( zr, zi )
 1197                     IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
 1198     $                  x( irowx ) = xjtmp
 1199                  ELSE
 1200
 1201
 1202
 1203
 1204                     CALL pzlaset( 
' ', n, 1, czero, czero, x, ix, jx,
 
 1205     $                             descx )
 1206                     IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
 1207     $                  x( irowx ) = cone
 1208                     xjtmp = cone
 1209                     scale = zero
 1210                     xmax( 1 ) = zero
 1211                  END IF
 1212  130             CONTINUE
 1213               ELSE
 1214
 1215
 1216
 1217
 1218
 1219                  CALL dladiv( dble( xjtmp ), dimag( xjtmp ),
 1220     $                         dble( tjjs ), dimag( tjjs ), zr, zi )
 1221                  xjtmp = dcmplx( zr, zi )
 1222                  IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
 1223     $               x( irowx ) = xjtmp
 1224               END IF
 1225               xmax( 1 ) = 
max( xmax( 1 ), cabs1( xjtmp ) )
 
 1226  140       CONTINUE
 1227         END IF
 1228         scale = scale / tscal
 1229      END IF
 1230
 1231
 1232
 1233      IF( tscal.NE.one ) THEN
 1234         CALL dscal( n, one / tscal, cnorm, 1 )
 1235      END IF
 1236
 1237      RETURN
 1238
 1239
 1240
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
 
double precision function pdlamch(ictxt, cmach)
 
subroutine pdlabad(ictxt, small, large)
 
subroutine pxerbla(ictxt, srname, info)
 
subroutine pzlaset(uplo, m, n, alpha, beta, a, ia, ja, desca)