1 SUBROUTINE pdinvchk( 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 DOUBLE PRECISION A( * ), WORK( * )
136 INTEGER BLOCK_CYCLIC_2D, CSRC_, 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 )
141 DOUBLE PRECISION ZERO, ONE
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 , EPS, NRMINVAXA, TEMP
152 INTEGER DESCW( DLEN_ )
160 INTEGER ICEIL, NUMROC
161 DOUBLE PRECISION PDLAMCH, PDLANGE, PDLANSY, PDLANTR
162 EXTERNAL iceil, lsamen, numroc, pdlamch, pdlange,
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 = pdlange(
'1', n, n, a, ia, ja, desca, work )
191 ELSE IF( lsamen( 2, mattyp( 2:3 ),
'TR' ) )
THEN
195 auxnorm = pdlantr(
'1', uplo, 'non unit
', N, N, A, IA, JA,
197 ELSE IF( LSAMEN( 2, MATTYP( 2:3 ), 'pd
' ) ) THEN
201 AUXNORM = PDLANSY( '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 PDMATGEN( 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 PDLASET( 'lower
', N-1, JB, ZERO, ZERO, WORK, IW+1,
243 CALL PDLASET( 'upper
', JB-1, JB-1, ZERO, ZERO, WORK, IW,
247 CALL PDMATGEN( 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 PDGEMM( '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 PDTRMM( '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 PDSYMM( '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 = PDLANGE( '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 pdmatgen( ictxt, aform, diag, desca( m_ ),
305 $ desca( n_ ), descw( mb_ ), descw( nb_ ),
308 $ iaseed, iia-1, np, jja-1, jb, myrow,
309 $ mycol, nprow, npcol )
310 IF( lsamen( 3, mattyp,
'UTR' ) )
THEN
311 CALL pdlaset(
'Lower', ja+n-j-1, jb, zero, zero,
312 $ work, iw+j-ja+1, 1, descw )
314 CALL pdlaset(
'All', j-ja, jb, zero, zero, work, iw,
316 CALL pdlaset(
'Upper', jb-1, jb-1, zero, zero,
317 $ work, iw+j-ja, 2, descw )
320 CALL pdmatgen( 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 pdgemm(
'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 pdtrmm(
'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 pdsymm(
'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 = pdlange(
'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 )