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
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 AFORM, DIAG, UPLO
146 INTEGER ICTXT, ICURCOL, ICURROW, II, IIA, IPW, IROFF,
147 $ iw, j, jb, jja, jn, kk, mycol, myrow, np,
149 DOUBLE PRECISION AUXNORM, EPS, NRMINVAXA,
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,
267 $ ONE, A, IA, JA, DESCA, WORK, IW, 1, DESCW )
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.EQ..AND..EQ.
IF( MYROWICURROW MYCOLICURCOL ) 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.EQ.
IF( MYROWICURROW )
290.EQ.
IF( MYCOLICURCOL )
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.EQ.
IF( MYCOLICURCOL ) 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,
316 CALL PZLASET( 'upper
', JB-1, JB-1, ZERO, ZERO,
317 $ WORK, IW+J-JA, 2, DESCW )
320 CALL PZMATGEN( ICTXT, AFORM, DIAG, DESCA( M_ ),
321 $ DESCA( N_ ), DESCW( MB_ ), DESCW( NB_ ),
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.EQ..AND..EQ.
IF( MYROWICURROW MYCOLICURCOL ) 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.EQ.
IF( MYROWICURROW )
367.EQ.
IF( MYCOLICURCOL )
369 ICURROW = MOD( ICURROW+1, NPROW )
370 ICURCOL = MOD( ICURCOL+1, NPCOL )
371 DESCW( CSRC_ ) = ICURCOL
377 FRESID = NRMINVAXA / ( N * EPS * ANORM )
subroutine pzmatgen(ictxt, aform, diag, m, n, mb, nb, a, lda, iarow, iacol, iseed, iroff, irnum, icoff, icnum, myrow, mycol, nprow, npcol)
subroutine descset(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
subroutine pzlaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
subroutine pzinvchk(mattyp, n, a, ia, ja, desca, iaseed, anorm, fresid, rcond, work)
double precision function pzlansy(norm, uplo, n, a, ia, ja, desca, work)