1 SUBROUTINE pzinvchk( MATTYP, N, A, IA, JA, DESCA, IASEED, ANORM,
2 $ FRESID, RCOND, WORK )
10 INTEGER IA, IASEED, JA, N
11 DOUBLE PRECISION ANORM, FRESID, RCOND
16 COMPLEX*16 A( * ), WORK( * )
136 INTEGER BLOCK_CYCLIC_2D, , CTXT_, DLEN_, DTYPE_,
137 $ lld_, mb_, m_, nb_, n_, rsrc_
138 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
139 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
140 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
142 parameter( zero = 0.0d+0, one = 1.0d+0 )
145 CHARACTER , DIAG, UPLO
146 INTEGER ICTXT, ICURCOL, ICURROW, II, IIA
149 DOUBLE PRECISION AUXNORM, EPS, NRMINVAXA, TEMP
152 INTEGER DESCW( DLEN_ )
160 INTEGER ICEIL, NUMROC
161 DOUBLE PRECISION PDLAMCH, PZLANGE, PZLANHE, PZLANTR
162 EXTERNAL iceil, lsamen, numroc, pdlamch, pzlange,
170 eps = pdlamch( desca( ctxt_ ),
'eps' )
174 ictxt = desca( ctxt_ )
179 IF( lsamen( 1, mattyp( 1:1 ),
'U' ) )
THEN
185 IF( lsamen( 3, mattyp,
'GEN' ) )
THEN
189 auxnorm = pzlange(
'1', n, n, a, ia, ja, desca, work )
191 ELSE IF( lsamen( 2, mattyp( 2:3 ), 'tr
' ) ) THEN
195 AUXNORM = PZLANTR( '1
', UPLO, 'non unit
', N, N, A, IA, JA,
197 ELSE IF( LSAMEN( 2, MATTYP( 2:3 ), 'pd
' ) ) THEN
201 AUXNORM = PZLANHE( '1
', UPLO, N, A, IA, JA, DESCA, WORK )
204 RCOND = ANORM*AUXNORM
208 CALL INFOG2L( IA, JA, DESCA, NPROW, NPCOL, MYROW, MYCOL, IIA, JJA,
213 IROFF = MOD( IA-1, DESCA( MB_ ) )
214 NP = NUMROC( N+IROFF, DESCA( MB_ ), MYROW, ICURROW, NPROW )
215 CALL DESCSET( DESCW, N+IROFF, DESCA( NB_ ), DESCA( MB_ ),
216 $ DESCA( NB_ ), ICURROW, ICURCOL, DESCA( CTXT_ ),
218 IPW = DESCW( LLD_ ) * DESCW( NB_ ) + 1
220.EQ.
IF( MYROWICURROW ) THEN
226 JN = MIN( ICEIL( JA, DESCA( NB_ ) ) * DESCA( NB_ ), JA+N-1 )
232.EQ.
IF( MYCOLICURCOL ) THEN
233 IF( LSAMEN( 2, MATTYP( 2:3 ), 'tr
' ) ) THEN
234 CALL PZMATGEN( ICTXT, AFORM, DIAG, DESCA( M_ ), DESCA( N_ ),
235 $ DESCW( MB_ ), DESCW( NB_ ), WORK,
236 $ DESCW( LLD_ ), DESCA( RSRC_ ),
237 $ DESCA( CSRC_ ), IASEED, IIA-1, NP,
238 $ JJA-1, JB, MYROW, MYCOL, NPROW, NPCOL )
239 IF( LSAMEN( 3, MATTYP, 'utr
' ) ) THEN
240 CALL PZLASET( 'lower
', N-1, JB, ZERO, ZERO, WORK, IW+1,
243 CALL PZLASET( 'upper', jb-1, jb-1, zero, zero, work, iw,
247 CALL pzmatgen( ictxt, aform, diag, desca( m_ ), desca( n_ ),
248 $ descw( mb_ ), descw( nb_ ), work( ipw ),
249 $ descw( lld_ ), desca( rsrc_ ),
250 $ desca( csrc_ ), iaseed,
251 $ iia-1, np, jja-1, jb, myrow, mycol, nprow,
258 IF( lsamen( 3, mattyp,
'GEN' ) )
THEN
260 CALL pzgemm(
'No tranpose',
'No transpose', n, jb, n, one, a,
261 $ ia, ja, desca, work( ipw ), iw, 1, descw, zero,
262 $ work, iw, 1, descw )
264 ELSE IF( lsamen( 2, mattyp( 2:3 ),
'TR' ) )
THEN
266 CALL pztrmm(
'Left', uplo,
'No tranpose',
'Non unit', n, jb,
269 ELSE IF( lsamen( 2, mattyp( 2:3 ),
'PD' ) )
THEN
271 CALL pzhemm(
'Left', uplo, n, jb, one, a, ia, ja, desca,
272 $ work(ipw), iw, 1, descw, zero, work, iw, 1,
279 IF( myrow.EQ.icurrow .AND. mycol.EQ.icurcol )
THEN
281 work( ii+kk*(descw(lld_)+1) ) =
282 $ work( ii+kk*(descw( lld_ )+1) )-one
286 nrminvaxa = pzlange(
'1', n, jb, work, iw, 1, descw, work( ipw ) )
288 IF( myrow.EQ.icurrow )
290 IF( mycol.EQ.icurcol )
292 icurrow = mod( icurrow+1, nprow )
293 icurcol = mod( icurcol+1, npcol )
294 descw( csrc_ ) = icurcol
296 DO 30 j = jn+1, ja+n-1, desca( nb_ )
298 jb =
min( n-j+ja, desca( nb_ ) )
302 IF( mycol.EQ.icurcol )
THEN
303 IF( lsamen( 2, mattyp( 2:3 ),
'TR' ) )
THEN
304 CALL pzmatgen( ictxt, aform, diag, desca( m_ ),
305 $ desca( n_ ), descw( mb_ ), descw( nb_ ),
306 $ work, descw( lld_ ), desca( rsrc_ ),
308 $ iaseed, iia-1, np, jja-1, jb, myrow,
309 $ mycol, nprow, npcol )
310 IF( lsamen( 3, mattyp,
'UTR' ) )
THEN
311 CALL pzlaset(
'Lower', ja+n-j-1, jb, zero, zero,
312 $ work, iw+j-ja+1, 1, descw )
314 CALL pzlaset(
'All', j-ja, jb, zero, zero, work, iw,
317 $ work, iw+j-ja, 2, descw )
320 CALL pzmatgen( ictxt, aform, diag, desca( m_ ),
322 $ work( ipw ), descw( lld_ ),
323 $ desca( rsrc_ ), desca( csrc_ ), iaseed,
325 $ jja-1, jb, myrow, mycol, nprow, npcol )
331 IF( lsamen( 3, mattyp,
'GEN' ) )
THEN
333 CALL pzgemm(
'No tranpose',
'No transpose', n, jb, n, one,
334 $ a, ia, ja, desca, work( ipw ), iw, 1, descw,
335 $ zero, work, iw, 1, descw )
337 ELSE IF( lsamen( 2, mattyp(2:3),
'TR' ) )
THEN
339 CALL pztrmm(
'Left', uplo,
'No tranpose',
'Non unit', n, jb,
340 $ one, a, ia, ja, desca, work, iw, 1, descw )
342 ELSE IF( lsamen( 2, mattyp( 2:3 ),
'PD' ) )
THEN
344 CALL pzhemm(
'Left', uplo, n, jb, one, a, ia, ja, desca,
345 $ work(ipw), iw, 1, descw, zero, work, iw, 1,
353 IF( myrow.EQ.icurrow .AND. mycol.EQ.icurcol )
THEN
355 work( ii+kk*(descw( lld_ )+1) ) =
356 $ work( ii+kk*(descw( lld_ )+1) ) - one
362 temp = pzlange(
'1', n, jb, work, iw, 1, descw, work( ipw ) )
363 nrminvaxa =
max( temp, nrminvaxa )
365 IF( myrow.EQ.icurrow )
367 IF( mycol.EQ.icurcol )
369 icurrow = mod( icurrow+1, nprow )
370 icurcol = mod( icurcol+1, npcol )
371 descw( csrc_ ) = icurcol
377 fresid = nrminvaxa / ( n * eps * anorm )