1 SUBROUTINE pcget22( TRANSA, TRANSE, TRANSW, N, A, DESCA, E, DESCE,
2 $ W, WORK, DESCW, RWORK, RESULT )
10 CHARACTER TRANSA, TRANSE, TRANSW
14 INTEGER DESCA( * ), DESCE( * ), DESCW( * )
15 REAL RESULT( 2 ), RWORK( * )
16 COMPLEX A( * ), E( * ), W( * ), WORK( * )
93 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
94 $ mb_, nb_, rsrc_, csrc_, lld_
95 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
96 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
97 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
99 parameter( zero = 0.0e+0, one = 1.0e+0 )
102 $ cone = ( 1.0e+0, 0.0e+0 ) )
105 CHARACTER NORMA, NORME
106 INTEGER ICOL, II, IROW, , ITRNSW, J, JCOL, JJ,
107 $ jrow, jvec, lda,
lde, ldw, mb, mycol, myrow,
108 $ nb, npcol, nprow, contxt, ra, ca, rsrc, csrc
109 REAL ANORM, ENORM, , ENRMIN, ERRNRM, TEMP1,
115 REAL PSLAMCH, PCLANGE
116 EXTERNAL lsame, pslamch, pclange
123 INTRINSIC abs, real, conjg, aimag,
max,
min
129 cabs1( cdum ) = abs( real( cdum ) ) + abs( aimag( cdum ) )
140 contxt = desca( ctxt_ )
141 rsrc = desca( rsrc_ )
142 csrc = desca( csrc_ )
150 unfl = pslamch( contxt,
'Safe minimum' )
151 ulp = pslamch( contxt,
'Precision' )
158 IF( lsame( transa,
'T' ) .OR. lsame( transa,
'C' ) )
THEN
162 IF( lsame( transe,
'T' ) )
THEN
165 ELSE IF( lsame( transe,
'C' ) )
THEN
170 IF( lsame( transw,
'C' ) )
THEN
178 IF( itrnse.EQ.0 )
THEN
182 CALL infog2l( j, jvec, desce, nprow, npcol, myrow, mycol,
183 $ irow, icol, ii, jj )
184 IF( ( myrow.EQ.ii ) .AND. ( mycol.EQ.jj ) )
THEN
189 IF( mycol.EQ.jj )
THEN
190 CALL sgamx2d( contxt,
'Col',
' ', 1, 1, temp1, 1, ra, ca,
192 enrmin =
min( enrmin, temp1 )
193 enrmax =
max( enrmax, temp1 )
196 CALL sgamx2d( contxt, 'row
', ' ', 1, 1, ENRMAX, 1, RA, CA, -1,
198 CALL SGAMN2D( CONTXT, 'row
', ' ', 1, 1, ENRMIN, 1, RA, CA, -1,
204 CALL INFOG2L( J, JVEC, DESCE, NPROW, NPCOL, MYROW, MYCOL,
205 $ IROW, ICOL, II, JJ )
206.EQ..AND..EQ.
IF( ( MYROWII ) ( MYCOLJJ ) ) THEN
207 TEMP1 = MAX( TEMP1, CABS1( E( ( ICOL-1 )*LDE+
211.EQ.
IF( MYROWII ) THEN
212 CALL SGAMX2D( CONTXT, 'row
', ' ', 1, 1, TEMP1, 1, RA, CA,
214 ENRMIN = MIN( ENRMIN, TEMP1 )
215 ENRMAX = MAX( ENRMAX, TEMP1 )
218 CALL SGAMX2D( CONTXT, 'row
', ' ', 1, 1, ENRMAX, 1, RA, CA, -1,
220 CALL SGAMN2D( CONTXT, 'row
', ' ', 1, 1, ENRMIN, 1, RA, CA, -1,
226 ANORM = MAX( PCLANGE( NORMA, N, N, A, 1, 1, DESCA, RWORK ), UNFL )
230 ENORM = MAX( PCLANGE( NORME, N, N, E, 1, 1, DESCE, RWORK ), ULP )
236 CALL PCLASET( 'full
', N, N, CZERO, CZERO, WORK, 1, 1, DESCW )
239.EQ.
IF( ITRNSW0 ) THEN
242 WTEMP = CONJG( W( JCOL ) )
245.EQ.
IF( ITRNSE0 ) THEN
246 CALL PCAXPY( N, WTEMP, E, 1, JCOL, DESCE, 1, WORK, 1, JCOL,
248.EQ.
ELSE IF( ITRNSE1 ) THEN
249 CALL PCAXPY( N, WTEMP, E, JCOL, 1, DESCE, N, WORK, 1, JCOL,
252 CALL PCAXPY( N, CONJG( WTEMP ), E, JCOL, 1, DESCE, N, WORK,
253 $ 1, JCOL, DESCW, 1 )
255 CALL INFOG2L( JROW, JCOL, DESCW, NPROW, NPCOL, MYROW,
256 $ MYCOL, IROW, ICOL, II, JJ )
257.EQ..AND..EQ.
IF( ( MYROWII ) ( MYCOLJJ ) ) THEN
258 WORK( ( JCOL-1 )*LDW+JROW )
259 $ = CONJG( WORK( ( JCOL-1 )*LDW+JROW ) )
265 CALL PCGEMM( TRANSA, TRANSE, N, N, N, CONE, A, 1, 1, DESCA, E, 1,
266 $ 1, DESCE, -CONE, WORK, 1, 1, DESCW )
268 ERRNRM = PCLANGE( 'one
', N, N, WORK, 1, 1, DESCW, RWORK ) / ENORM
272.GT.
IF( ANORMERRNRM ) THEN
273 RESULT( 1 ) = ( ERRNRM / ANORM ) / ULP
275.LT.
IF( ANORMONE ) THEN
276 RESULT( 1 ) = ( MIN( ERRNRM, ANORM ) / ANORM ) / ULP
278 RESULT( 1 ) = MIN( ERRNRM / ANORM, ONE ) / ULP
284 RESULT( 2 ) = MAX( ABS( ENRMAX-ONE ), ABS( ENRMIN-ONE ) ) /
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
subroutine pcaxpy(n, a, x, ix, jx, descx, incx, y, iy, jy, descy, incy)
subroutine pcget22(transa, transe, transw, n, a, desca, e, desce, w, work, descw, rwork, result)