5996
 5997
 5998
 5999
 6000
 6001
 6002
 6003      CHARACTER*1        TRANS, UPLO
 6004      INTEGER            IA, IB, IC, ICTXT, INFO, JA, JB, JC, K, N
 6005      REAL               ALPHA, BETA, ERR
 6006
 6007
 6008      INTEGER            DESCA( * ), DESCB( * ), DESCC( * )
 6009      REAL               A( * ), B( * ), C( * ), CT( * ), G( * ),
 6010     $                   PC( * )
 6011
 6012
 6013
 6014
 6015
 6016
 6017
 6018
 6019
 6020
 6021
 6022
 6023
 6024
 6025
 6026
 6027
 6028
 6029
 6030
 6031
 6032
 6033
 6034
 6035
 6036
 6037
 6038
 6039
 6040
 6041
 6042
 6043
 6044
 6045
 6046
 6047
 6048
 6049
 6050
 6051
 6052
 6053
 6054
 6055
 6056
 6057
 6058
 6059
 6060
 6061
 6062
 6063
 6064
 6065
 6066
 6067
 6068
 6069
 6070
 6071
 6072
 6073
 6074
 6075
 6076
 6077
 6078
 6079
 6080
 6081
 6082
 6083
 6084
 6085
 6086
 6087
 6088
 6089
 6090
 6091
 6092
 6093
 6094
 6095
 6096
 6097
 6098
 6099
 6100
 6101
 6102
 6103
 6104
 6105
 6106
 6107
 6108
 6109
 6110
 6111
 6112
 6113
 6114
 6115
 6116
 6117
 6118
 6119
 6120
 6121
 6122
 6123
 6124
 6125
 6126
 6127
 6128
 6129
 6130
 6131
 6132
 6133
 6134
 6135
 6136
 6137
 6138
 6139
 6140
 6141
 6142
 6143
 6144
 6145
 6146
 6147
 6148
 6149
 6150
 6151
 6152
 6153
 6154
 6155
 6156
 6157
 6158
 6159
 6160
 6161
 6162
 6163
 6164
 6165
 6166
 6167
 6168
 6169
 6170
 6171
 6172
 6173
 6174
 6175
 6176
 6177
 6178
 6179
 6180
 6181
 6182
 6183
 6184
 6185      INTEGER            BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
 6186     $                   DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
 6187     $                   RSRC_
 6188      parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
 6189     $                   dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
 6190     $                   imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
 6191     $                   rsrc_ = 9, csrc_ = 10, lld_ = 11 )
 6192      REAL               ZERO, ONE
 6193      parameter( zero = 0.0e+0, one = 1.0e+0 )
 6194
 6195
 6196      LOGICAL            COLREP, NOTRAN, ROWREP, TRAN, UPPER
 6197      INTEGER            I, IBB, IBEG, ICCOL, ICROW, ICURROW, IEND, IIC,
 6198     $                   IN, IOFFAK, IOFFAN, IOFFBK, IOFFBN, IOFFC, J,
 6199     $                   JJC, KK, LDA, LDB, LDC, LDPC, MYCOL, MYROW,
 6200     $                   NPCOL, NPROW
 6201      REAL               EPS, ERRI
 6202
 6203
 6204      EXTERNAL           blacs_gridinfo, igsum2d, 
pb_infog2l, sgamx2d
 
 6205
 6206
 6207      LOGICAL            LSAME
 6208      REAL               PSLAMCH
 6210
 6211
 6212      INTRINSIC          abs, 
max, 
min, mod, sqrt
 
 6213
 6214
 6215
 6216      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
 6217
 6219
 6220      upper = 
lsame( uplo, 
'U' )
 
 6221      notran = 
lsame( trans, 
'N' )
 
 6222      tran = 
lsame( trans, 
'T' )
 
 6223
 6224      lda = 
max( 1, desca( m_ ) )
 
 6225      ldb = 
max( 1, descb( m_ ) )
 
 6226      ldc = 
max( 1, descc( m_ ) )
 
 6227
 6228
 6229
 6230
 6231
 6232      DO 140 j = 1, n
 6233
 6234         IF( upper ) THEN
 6235            ibeg = 1
 6236            iend = j
 6237         ELSE
 6238            ibeg = j
 6239            iend = n
 6240         END IF
 6241
 6242         DO 10 i = 1, n
 6243            ct( i ) = zero
 6244            g( i )  = zero
 6245   10    CONTINUE
 6246
 6247         IF( notran ) THEN
 6248            DO 30 kk = 1, k
 6249               ioffak = ia + j - 1 + ( ja + kk - 2 ) * lda
 6250               ioffbk = ib + j - 1 + ( jb + kk - 2 ) * ldb
 6251               DO 20 i = ibeg, iend
 6252                  ioffan = ia + i - 1 + ( ja + kk - 2 ) * lda
 6253                  ioffbn = ib + i - 1 + ( jb + kk - 2 ) * ldb
 6254                  ct( i ) = ct( i ) + alpha * (
 6255     $                      a( ioffan ) * b( ioffbk ) +
 6256     $                      b( ioffbn ) * a( ioffak ) )
 6257                  g( i ) = g( i ) + abs( alpha ) * (
 6258     $                     abs( a( ioffan ) ) * abs( b( ioffbk ) ) +
 6259     $                     abs( b( ioffbn ) ) * abs( a( ioffak ) ) )
 6260   20          CONTINUE
 6261   30       CONTINUE
 6262         ELSE IF( tran ) THEN
 6263            DO 50 kk = 1, k
 6264               ioffak = ia + kk - 1 + ( ja + j - 2 ) * lda
 6265               ioffbk = ib + kk - 1 + ( jb + j - 2 ) * ldb
 6266               DO 40 i = ibeg, iend
 6267                  ioffan = ia + kk - 1 + ( ja + i - 2 ) * lda
 6268                  ioffbn = ib + kk - 1 + ( jb + i - 2 ) * ldb
 6269                  ct( i ) = ct( i ) + alpha * (
 6270     $                      a( ioffan ) * b( ioffbk ) +
 6271     $                      b( ioffbn ) * a( ioffak ) )
 6272                  g( i ) = g( i ) + abs( alpha ) * (
 6273     $                     abs( a( ioffan ) ) * abs( b( ioffbk ) ) +
 6274     $                     abs( b( ioffbn ) ) * abs( a( ioffak ) ) )
 6275   40          CONTINUE
 6276   50       CONTINUE
 6277         END IF
 6278
 6279         ioffc = ic + ibeg - 1 + ( jc + j - 2 ) * ldc
 6280
 6281         DO 100 i = ibeg, iend
 6282            ct( i ) = ct( i ) + beta * c( ioffc )
 6283            g( i ) = g( i ) + abs( beta )*abs( c( ioffc ) )
 6284            c( ioffc ) = ct( i )
 6285            ioffc = ioffc + 1
 6286  100    CONTINUE
 6287
 6288
 6289
 6290         err  = zero
 6291         info = 0
 6292         ldpc = descc( lld_ )
 6293         ioffc = ic + ( jc + j - 2 ) * ldc
 6294         CALL pb_infog2l( ic, jc+j-1, descc, nprow, npcol, myrow, mycol,
 
 6295     $                    iic, jjc, icrow, iccol )
 6296         icurrow = icrow
 6297         rowrep  = ( icrow.EQ.-1 )
 6298         colrep  = ( iccol.EQ.-1 )
 6299
 6300         IF( mycol.EQ.iccol .OR. colrep ) THEN
 6301
 6302            ibb = descc( imb_ ) - ic + 1
 6303            IF( ibb.LE.0 )
 6304     $         ibb = ( ( -ibb ) / descc( mb_ ) + 1 )*descc( mb_ ) + ibb
 6306            in = ic + ibb - 1
 6307
 6308            DO 110 i = ic, in
 6309
 6310               IF( myrow.EQ.icurrow .OR. rowrep ) THEN
 6311                  erri = abs( pc( iic+(jjc-1)*ldpc ) -
 6312     $                        c( ioffc ) ) / eps
 6313                  IF( g( i-ic+1 ).NE.zero )
 6314     $               erri = erri / g( i-ic+1 )
 6315                  err = 
max( err, erri )
 
 6316                  IF( err*sqrt( eps ).GE.one )
 6317     $               info = 1
 6318                  iic = iic + 1
 6319               END IF
 6320
 6321               ioffc = ioffc + 1
 6322
 6323  110       CONTINUE
 6324
 6325            icurrow = mod( icurrow+1, nprow )
 6326
 6327            DO 130 i = in+1, ic+n-1, descc( mb_ )
 6328               ibb = 
min( ic+n-i, descc( mb_ ) )
 
 6329
 6330               DO 120 kk = 0, ibb-1
 6331
 6332                  IF( myrow.EQ.icurrow .OR. rowrep ) THEN
 6333                     erri = abs( pc( iic+(jjc-1)*ldpc ) -
 6334     $                           c( ioffc ) )/eps
 6335                     IF( g( i+kk-ic+1 ).NE.zero )
 6336     $                  erri = erri / g( i+kk-ic+1 )
 6337                     err = 
max( err, erri )
 
 6338                     IF( err*sqrt( eps ).GE.one )
 6339     $                  info = 1
 6340                     iic = iic + 1
 6341                  END IF
 6342
 6343                  ioffc = ioffc + 1
 6344
 6345  120          CONTINUE
 6346
 6347               icurrow = mod( icurrow+1, nprow )
 6348
 6349  130       CONTINUE
 6350
 6351         END IF
 6352
 6353
 6354
 6355         CALL igsum2d( ictxt, 'All', ' ', 1, 1, info, 1, -1, mycol )
 6356         CALL sgamx2d( ictxt, 'All', ' ', 1, 1, err, 1, i, j, -1, -1,
 6357     $                 mycol )
 6358         IF( info.NE.0 )
 6359     $      GO TO 150
 6360
 6361  140 CONTINUE
 6362
 6363  150 CONTINUE
 6364
 6365      RETURN
 6366
 6367
 6368
subroutine pb_infog2l(i, j, desc, nprow, npcol, myrow, mycol, ii, jj, prow, pcol)
 
real function pslamch(ictxt, cmach)