2
    3
    4
    5
    6
    7
    8
    9      INTEGER            IX, INCX, JX, N
   10      DOUBLE PRECISION   SCALE, SUMSQ
   11
   12
   13      INTEGER            DESCX( * )
   14      COMPLEX*16         X( * )
   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
  139
  140
  141
  142      INTEGER            BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
  143     $                   LLD_, MB_, M_, NB_, N_, RSRC_
  144      parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
  145     $                     ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
  146     $                     rsrc_ = 7, csrc_ = 8, lld_ = 9 )
  147      DOUBLE PRECISION   ZERO
  148      parameter( zero = 0.0d+0 )
  149
  150
  151      INTEGER            I, ICOFF, ICTXT, IIX, IOFF, IROFF, IXCOL,
  152     $                   IXROW, JJX, LDX, MYCOL, MYROW, NP, NPCOL,
  153     $                   NPROW, NQ
  154      DOUBLE PRECISION   TEMP1
  155
  156
  157      DOUBLE PRECISION   WORK( 2 )
  158
  159
  161
  162
  163      INTEGER            NUMROC
  165
  166
  167      INTRINSIC          abs, dble, dimag, mod
  168
  169
  170
  171
  172
  173      ictxt = descx( ctxt_ )
  174      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
  175
  176
  177
  178      CALL infog2l( ix, jx, descx, nprow, npcol, myrow, mycol, iix, jjx,
 
  179     $              ixrow, ixcol )
  180
  181      ldx = descx( lld_ )
  182      IF( incx.EQ.descx( m_ ) ) THEN
  183
  184
  185
  186         IF( myrow.NE.ixrow )
  187     $      RETURN
  188         icoff = mod( jx, descx( nb_ ) )
  189         nq = 
numroc( n+icoff, descx( nb_ ), mycol, ixcol, npcol )
 
  190         IF( mycol.EQ.ixcol )
  191     $      nq = nq - icoff
  192
  193
  194
  195         IF( nq.GT.0 ) THEN
  196            ioff = iix + ( jjx - 1 ) * ldx
  197            DO 10 i = 1, nq
  198               IF( dble( x( ioff ) ).NE.zero ) THEN
  199                  temp1 = abs( dble( x( ioff ) ) )
  200                  IF( scale.LT.temp1 ) THEN
  201                     sumsq = 1 + sumsq * ( scale / temp1 )**2
  202                     scale = temp1
  203                  ELSE
  204                     sumsq = sumsq + ( temp1 / scale )**2
  205                  END IF
  206               END IF
  207               IF( dimag( x( ioff ) ).NE.zero ) THEN
  208                  temp1 = abs( dimag( x( ioff ) ) )
  209                  IF( scale.LT.temp1 ) THEN
  210                     sumsq = 1 + sumsq * ( scale / temp1 )**2
  211                     scale = temp1
  212                  ELSE
  213                     sumsq = sumsq + ( temp1 / scale )**2
  214                  END IF
  215               END IF
  216               ioff = ioff + ldx
  217   10       CONTINUE
  218         END IF
  219
  220
  221
  222         work( 1 ) = scale
  223         work( 2 ) = sumsq
  224
  225         CALL pdtreecomb( ictxt, 
'Rowwise', 2, work, -1, ixcol,
 
  227
  228         scale = work( 1 )
  229         sumsq = work( 2 )
  230
  231      ELSE IF( incx.EQ.1 ) THEN
  232
  233
  234
  235         IF( mycol.NE.ixcol )
  236     $      RETURN
  237         iroff = mod( ix, descx( mb_ ) )
  238         np = 
numroc( n+iroff, descx( mb_ ), myrow, ixrow, nprow )
 
  239         IF( myrow.EQ.ixrow )
  240     $      np = np - iroff
  241
  242
  243
  244         IF( np.GT.0 ) THEN
  245            ioff = iix + ( jjx - 1 ) * ldx
  246            DO 20 i = 1, np
  247               IF( dble( x( ioff ) ).NE.zero ) THEN
  248                  temp1 = abs( dble( x( ioff ) ) )
  249                  IF( scale.LT.temp1 ) THEN
  250                     sumsq = 1 + sumsq*( scale / temp1 )**2
  251                     scale = temp1
  252                  ELSE
  253                     sumsq = sumsq + ( temp1 / scale )**2
  254                  END IF
  255               END IF
  256               IF( dimag( x( ioff ) ).NE.zero ) THEN
  257                  temp1 = abs( dimag( x( ioff ) ) )
  258                  IF( scale.LT.temp1 ) THEN
  259                     sumsq = 1 + sumsq*( scale / temp1 )**2
  260                     scale = temp1
  261                  ELSE
  262                     sumsq = sumsq + ( temp1 / scale )**2
  263                  END IF
  264               END IF
  265               ioff = ioff + 1
  266   20       CONTINUE
  267         END IF
  268
  269
  270
  271         work( 1 ) = scale
  272         work( 2 ) = sumsq
  273
  274         CALL pdtreecomb( ictxt, 
'Columnwise', 2, work, -1, ixcol,
 
  276
  277         scale = work( 1 )
  278         sumsq = work( 2 )
  279
  280      END IF
  281
  282      RETURN
  283
  284
  285
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
 
integer function numroc(n, nb, iproc, isrcproc, nprocs)
 
subroutine dcombssq(v1, v2)
 
subroutine pdtreecomb(ictxt, scope, n, mine, rdest0, cdest0, subptr)