1 SUBROUTINE pdgesvx( FACT, TRANS, N, NRHS, A, IA, JA, DESCA, AF,
2 $ IAF, JAF, DESCAF, IPIV, EQUED, R, C, B, IB,
3 $ JB, DESCB, X, IX, JX, DESCX, RCOND, FERR,
4 $ BERR, WORK, LWORK, IWORK, LIWORK, INFO )
12 CHARACTER EQUED, FACT, TRANS
13 INTEGER IA, IAF, IB, INFO, IX, JA, JAF, JB, JX, LIWORK,
15 DOUBLE PRECISION RCOND
18 INTEGER DESCA( * ), DESCAF( * ), DESCB( * ),
19 $ DESCX( * ), IPIV( * ), IWORK( * )
20 DOUBLE PRECISION A( * ), AF( * ), B( * ), BERR( * ), C( * ),
21 $ ferr( * ), r( * ), work( * ), x( * )
407 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
408 $ LLD_, MB_, M_, NB_, N_, RSRC_
409 PARAMETER ( BLOCK_CYCLIC_2D = 1, dlen_ = 9, dtype_ = 1,
410 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
411 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
412 DOUBLE PRECISION ONE, ZERO
413 PARAMETER ( ONE = 1.0d+0, zero = 0.0d+0 )
416 LOGICAL COLEQU, EQUIL, LQUERY, NOFACT, , ROWEQU
418 INTEGER CONWRK, I, IACOL, IAROW, IAFROW, IBROW, IBCOL,
419 $ icoffa, icoffb, icoffx, ictxt, idumm,
421 $ infequ, iroffa, iroffaf, iroffb,
422 $ iroffx, ixcol, ixrow, j, jja, jjb, jjx,
424 $ liwmin, lwmin, mycol, myrow, np, npcol, nprow,
425 $ nq, nqb, nrhsq, rfswrk
426 DOUBLE PRECISION AMAX, ANORM, BIGNUM, COLCND, RCMAX, RCMIN,
430 INTEGER CDESC( DLEN_ ), IDUM1( 5 ), IDUM2( 5 )
441 INTEGER ICEIL, ILCM, INDXG2P,
442 DOUBLE PRECISION PDLAMCH, PDLANGE
443 EXTERNAL iceil, ilcm, indxg2p,
lsame,
numroc, pdlange,
447 INTRINSIC dble, ichar,
max,
min, mod
453 ictxt = desca( ctxt_ )
459 IF( nprow.EQ.-1 )
THEN
462 CALL chk1mat( n, 3, n, 3, ia, ja, desca, 8, info )
463 IF(
lsame( fact,
'F' ) )
464 $
CALL chk1mat( n, 3, n, 3, iaf, jaf, descaf, 12, info )
465 CALL chk1mat( n, 3, nrhs, 4, ib, jb, descb, 20, info )
466 CALL chk1mat( n, 3, nrhs, 4, ix, jx, descx, 24, info )
468 equil =
lsame( fact,
'E' )
469 notran =
lsame( trans,
'N' )
470 IF( nofact .OR. equil )
THEN
475 ROWEQU = LSAME( EQUED, 'r.OR.
' ) LSAME( EQUED, 'b
' )
476 COLEQU = LSAME( EQUED, 'c.OR.
' ) LSAME( EQUED, 'b
' )
477 SMLNUM = PDLAMCH( ICTXT, 'safe minimum
' )
478 BIGNUM = ONE / SMLNUM
481 IAROW = INDXG2P( IA, DESCA( MB_ ), MYROW, DESCA( RSRC_ ),
483 IAFROW = INDXG2P( IAF, DESCAF( MB_ ), MYROW,
484 $ DESCAF( RSRC_ ), NPROW )
485 IBROW = INDXG2P( IB, DESCB( MB_ ), MYROW, DESCB( RSRC_ ),
487 IXROW = INDXG2P( IX, DESCX( MB_ ), MYROW, DESCX( RSRC_ ),
489 IROFFA = MOD( IA-1, DESCA( MB_ ) )
490 IROFFAF = MOD( IAF-1, DESCAF( MB_ ) )
491 ICOFFA = MOD( JA-1, DESCA( NB_ ) )
492 IROFFB = MOD( IB-1, DESCB( MB_ ) )
493 ICOFFB = MOD( JB-1, DESCB( NB_ ) )
494 IROFFX = MOD( IX-1, DESCX( MB_ ) )
495 ICOFFX = MOD( JX-1, DESCX( NB_ ) )
496 CALL INFOG2L( IA, JA, DESCA, NPROW, NPCOL, MYROW,
497 $ MYCOL, IIA, JJA, IAROW, IACOL )
498 NP = NUMROC( N+IROFFA, DESCA( MB_ ), MYROW, IAROW,
502 NQ = NUMROC( N+ICOFFA, DESCA( NB_ ), MYCOL, IACOL,
506 NQB = ICEIL( N+IROFFA, DESCA( NB_ )*NPCOL )
507 LCM = ILCM( NPROW, NPCOL )
509 CONWRK = 2*NP + 2*NQ + MAX( 2, MAX( DESCA( NB_ )*
510 $ MAX( 1, ICEIL( NPROW-1, NPCOL ) ), NQ +
512 $ MAX( 1, ICEIL( NPCOL-1, NPROW ) ) ) )
514 IF( LSAME( TRANS, 'n
' ) ) THEN
515 RFSWRK = RFSWRK + NP + NQ +
516 $ ICEIL( NQB, LCMQ )*DESCA( NB_ )
517 ELSE IF( LSAME( TRANS, 't.OR.
' )LSAME( TRANS, 'c
' ) ) THEN
518 RFSWRK = RFSWRK + NP + NQ
520 LWMIN = MAX( CONWRK, RFSWRK )
521 WORK( 1 ) = DBLE( LWMIN )
524.NOT..AND..NOT..AND.
IF( NOFACT EQUIL
525.NOT.
$ LSAME( FACT, 'f
' ) ) THEN
527.NOT..AND..NOT.
ELSE IF( NOTRAN LSAME( TRANS, 't' ) .AND.
528 $ .NOT.
lsame( trans,
'C' ) )
THEN
530 ELSE IF( iroffa.NE.0 )
THEN
532 ELSE IF( icoffa.NE.0 .OR. iroffa.NE.icoffa )
THEN
534 ELSE IF( desca( mb_ ).NE.desca( nb_
THEN
536 ELSE IF( iafrow.NE.iarow )
THEN
538 ELSE IF( iroffaf.NE.0 )
THEN
540 ELSE IF( ictxt.NE.descaf( ctxt_ ) )
THEN
542 ELSE IF(
lsame( fact,
'F' ) .AND. .NOT.
543 $ ( rowequ .OR. colequ .OR.
lsame( equed,
'N' ) ) )
THEN
549 DO 10 j = iia, iia + np - 1
550 rcmin =
min( rcmin, r( j ) )
551 rcmax =
max( rcmax, r( j ) )
553 CALL dgamn2d( ictxt,
'Columnwise',
' ', 1, 1, rcmin,
554 $ 1, idumm, idumm, -1, -1, mycol )
555 CALL dgamx2d( ictxt,
'Columnwise',
' ', 1, 1, rcmax,
556 $ 1, idumm, idumm, -1, -1, mycol )
557 IF( rcmin.LE.zero )
THEN
559 ELSE IF( n.GT.0 )
THEN
560 rowcnd =
max( rcmin, smlnum ) /
561 $
min( rcmax, bignum )
566 IF( colequ .AND. info.EQ.0 )
THEN
569 DO 20 j = jja, jja+nq-1
570 rcmin =
min( rcmin, c( j ) )
571 rcmax =
max( rcmax, c( j ) )
573 CALL dgamn2d( ictxt,
'Rowwise',
' ', 1, 1, rcmin,
574 $ 1, idumm, idumm, -1, -1, mycol )
575 CALL dgamx2d( ictxt,
'Rowwise',
' ', 1, 1, rcmax,
576 $ 1, idumm, idumm, -1, -1, mycol )
577 IF( rcmin.LE.zero )
THEN
579 ELSE IF( n.GT.0 )
THEN
581 $
min( rcmax, bignum )
589 work( 1 ) = dble( lwmin )
591 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
593 IF( ibrow.NE.iarow )
THEN
595 ELSE IF( ixrow.NE.ibrow )
THEN
597 ELSE IF( descb( mb_ ).NE.desca( nb_ ) )
THEN
599 ELSE IF( ictxt.NE.descb( ctxt_ ) )
THEN
601 ELSE IF( descx( mb_ ).NE.desca( nb_ ) )
THEN
603 ELSE IF( ictxt.NE.descx( ctxt_ ) )
THEN
605 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
607 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
610 idum1( 1 ) = ichar( fact )
612 idum1( 2 ) = ichar( trans )
614 IF(
lsame( fact, 'f
' ) ) THEN
615 IDUM1( 3 ) = ICHAR( EQUED )
617.EQ.
IF( LWORK-1 ) THEN
623.EQ.
IF( LIWORK-1 ) THEN
629 CALL PCHK2MAT( N, 3, N, 3, IA, JA, DESCA, 8, N, 3,
630 $ NRHS, 4, IB, JB, DESCB, 20, 5, IDUM1,
633.EQ.
IF( LWORK-1 ) THEN
639.EQ.
IF( LIWORK-1 ) THEN
645 CALL PCHK2MAT( N, 3, N, 3, IA, JA, DESCA, 8, N, 3,
646 $ NRHS, 4, IB, JB, DESCB, 20, 4, IDUM1,
653 CALL PXERBLA( ICTXT, 'pdgesvx', -INFO )
655 ELSE IF( LQUERY ) THEN
663 CALL PDGEEQU( N, N, A, IA, JA, DESCA, R, C, ROWCND, COLCND,
665.EQ.
IF( INFEQU0 ) THEN
669 CALL PDLAQGE( N, N, A, IA, JA, DESCA, R, C, ROWCND, COLCND,
671 ROWEQU = LSAME( EQUED, 'r.OR.
' ) LSAME( EQUED, 'b
' )
672 COLEQU = LSAME( EQUED, 'c.OR.
' ) LSAME( EQUED, 'b
' )
678 CALL INFOG2L( IB, JB, DESCB, NPROW, NPCOL, MYROW, MYCOL, IIB,
679 $ JJB, IBROW, IBCOL )
680 NP = NUMROC( N+IROFFB, DESCB( MB_ ), MYROW, IBROW, NPROW )
681 NRHSQ = NUMROC( NRHS+ICOFFB, DESCB( NB_ ), MYCOL, IBCOL, NPCOL )
685 $ NRHSQ = NRHSQ-ICOFFB
689 DO 40 J = JJB, JJB+NRHSQ-1
690 DO 30 I = IIB, IIB+NP-1
691 B( I+( J-1 )*DESCB( LLD_ ) ) = R( I )*
692 $ B( I+( J-1 )*DESCB( LLD_ ) )
696 ELSE IF( COLEQU ) THEN
700 CALL DESCSET( CDESC, 1, N+ICOFFA, 1, DESCA( NB_ ), MYROW,
702 CALL PDCOPY( N, C, 1, JA, CDESC, CDESC( LLD_ ), WORK, IB, JB,
704.EQ.
IF( MYCOLIBCOL ) THEN
705 CALL DGEBS2D( ICTXT, 'rowwise
', ' ', NP, 1, WORK( IIB ),
708 CALL DGEBR2D( ICTXT, 'rowwise
', ' ', np, 1, work( iib ),
709 $ descb( lld_ ), myrow, ibcol )
711 DO 60 j = jjb, jjb+nrhsq-1
712 DO 50 i = iib, iib+np-1
713 b( i+( j-1 )*descb( lld_ ) ) = work( i )*
714 $ b( i+( j-1 )*descb( lld_ ) )
719 IF( nofact.OR.equil )
THEN
723 CALL pdlacpy( 'full
', N, N, A, IA, JA, DESCA, AF, IAF, JAF,
725 CALL PDGETRF( N, N, AF, IAF, JAF, DESCAF, IPIV, INFO )
743 ANORM = PDLANGE( NORM, N, N, A, IA, JA, DESCA, WORK )
747 CALL PDGECON( NORM, N, AF, IAF, JAF, DESCAF, ANORM, RCOND, WORK,
748 $ LWORK, IWORK, LIWORK, INFO )
752.LT.
IF( RCONDPDLAMCH( ICTXT, 'epsilon
' ) ) THEN
759 CALL PDLACPY( 'full
', N, NRHS, B, IB, JB, DESCB, X, IX, JX,
761 CALL PDGETRS( TRANS, N, NRHS, AF, IAF, JAF, DESCAF, IPIV, X, IX,
767 CALL PDGERFS( TRANS, N, NRHS, A, IA, JA, DESCA, AF, IAF, JAF,
768 $ DESCAF, IPIV, B, IB, JB, DESCB, X, IX, JX, DESCX,
769 $ FERR, BERR, WORK, LWORK, IWORK, LIWORK, INFO )
774 CALL INFOG2L( IX, JX, DESCX, NPROW, NPCOL, MYROW, MYCOL, IIX,
775 $ JJX, IXROW, IXCOL )
776 NP = NUMROC( N+IROFFX, DESCX( MB_ ), MYROW, IXROW, NPROW )
777 NRHSQ = NUMROC( NRHS+ICOFFX, DESCX( NB_ ), MYCOL, IXCOL, NPCOL )
781 $ NRHSQ = NRHSQ-ICOFFX
788 CALL DESCSET( CDESC, 1, N+ICOFFA, 1, DESCA( NB_ ), MYROW,
790 CALL PDCOPY( N, C, 1, JA, CDESC, CDESC( LLD_ ), WORK, IX,
792.EQ.
IF( MYCOLIBCOL ) THEN
793 CALL DGEBS2D( ICTXT, 'rowwise
', ' ', NP, 1,
794 $ WORK( IIX ), DESCX( LLD_ ) )
796 CALL DGEBR2D( ICTXT, 'rowwise
', ' ', NP, 1,
797 $ WORK( IIX ), DESCX( LLD_ ), MYROW, IBCOL )
800 DO 80 J = JJX, JJX+NRHSQ-1
801 DO 70 I = IIX, IIX+NP-1
802 X( I+( J-1 )*DESCX( LLD_ ) ) = WORK( I )*
803 $ X( I+( J-1 )*DESCX( LLD_ ) )
806 DO 90 J = JJX, JJX+NRHSQ-1
807 FERR( J ) = FERR( J ) / COLCND
810 ELSE IF( ROWEQU ) THEN
811 DO 110 J = JJX, JJX+NRHSQ-1
812 DO 100 I = IIX, IIX+NP-1
813 X( I+( J-1 )*DESCX( LLD_ ) ) = R( I )*
814 $ X( I+( J-1 )*DESCX( LLD_ ) )
817 DO 120 J = JJX, JJX+NRHSQ-1
818 FERR( J ) = FERR( J ) / ROWCND
822 WORK( 1 ) = DBLE( LWMIN )
subroutine pdgerfs(trans, n, nrhs, a, ia, ja, desca, af, iaf, jaf, descaf, ipiv, b, ib, jb, descb, x, ix, jx, descx, ferr, berr, work, lwork, iwork, liwork, info)
subroutine pdgesvx(fact, trans, n, nrhs, a, ia, ja, desca, af, iaf, jaf, descaf, ipiv, equed, r, c, b, ib, jb, descb, x, ix, jx, descx, rcond, ferr, berr, work, lwork, iwork, liwork, info)