1 SUBROUTINE pzlattrs( UPLO, TRANS, DIAG, NORMIN, N, A, IA, JA,
2 $ DESCA, X, IX, JX, DESCX, SCALE, CNORM, INFO )
10 CHARACTER DIAG, NORMIN, TRANS, UPLO
11 INTEGER IA, INFO, IX, JA, JX, N
12 DOUBLE PRECISION SCALE
15 INTEGER ( * ), DESCX( * )
16 DOUBLE PRECISION CNORM( * )
17 COMPLEX*16 A( * ), X( * )
255 DOUBLE PRECISION ZERO, HALF, ONE, TWO
256 parameter( zero = 0.0d+0, half = 0.5d+0, one = 1.0d+0,
258 COMPLEX*16 CZERO, CONE
259 parameter( czero = ( 0.0d+0, 0.0d+0 ),
260 $ cone = ( 1.0d+0, 0.0d+0 ) )
261 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
262 $ mb_, nb_, rsrc_, csrc_, lld_
263 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
264 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
265 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
268 LOGICAL NOTRAN, NOUNIT, UPPER
269 INTEGER CONTXT, CSRC, I, ICOL, ICOLX, IMAX, IROW,
270 $ irowx, itmp1, itmp1x, itmp2, itmp2x, j, jfirst,
271 $ jinc, jlast, lda, ldx, mb, mycol, myrow, nb,
273 DOUBLE PRECISION BIGNUM, GROW, REC, SMLNUM, TJJ, TMAX, TSCAL,
275 COMPLEX*16 CSUMJ, TJJS, USCAL, XJTMP, ZDUM
276 DOUBLE PRECISION XMAX( 1 )
281 DOUBLE PRECISION PDLAMCH
283 EXTERNAL lsame, idamax, pdlamch, zladiv
292 INTRINSIC abs, dble, dcmplx, dconjg, dimag,
max,
min
295 DOUBLE PRECISION CABS1, CABS2
298 cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( zdum ) )
299 cabs2( zdum ) = abs( dble( zdum ) / 2.d0 ) +
300 $ abs( dimag( zdum ) / 2.d0 )
305 upper = lsame( uplo,
'U' )
306 notran = lsame( trans,
'N' )
307 nounit = lsame( diag,
'N' )
309 contxt = desca( ctxt_ )
310 rsrc = desca( rsrc_ )
311 csrc = desca( csrc_ )
319 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
321 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) .AND. .NOT.
322 $ lsame( trans,
'C' ) )
THEN
324 ELSE IF( .NOT.nounit .AND. .NOT.lsame( diag,
'U' ) )
THEN
326 ELSE IF( .NOT.lsame( normin,
'Y' ) .AND. .NOT.
327 $ lsame( normin,
'N' ) )
THEN
329 ELSE IF( n.LT.0 )
THEN
336 CALL pxerbla( contxt,
'PZLATTRS', -info )
347 smlnum = pdlamch( contxt,
'Safe minimum' )
348 bignum = one / smlnum
349 CALL pdlabad( contxt, smlnum, bignum )
350 smlnum = smlnum / pdlamch( contxt,
'Precision' )
351 bignum = one / smlnum
355 IF( lsame( normin,
'N' ) )
THEN
365 CALL pdzasum( j-1, cnorm( j ), a, ia, ja+j-1, desca, 1 )
372 CALL pdzasum( n-j, cnorm( j ), a, ia+j, ja+j-1, desca,
377 CALL dgsum2d( contxt,
'Row',
' ', n, 1, cnorm, 1, -1, -1 )
383 imax = idamax( n, cnorm, 1 )
385 IF( tmax.LE.bignum*half )
THEN
388 tscal = half / ( smlnum*tmax )
389 CALL dscal( n, tscal, cnorm, 1 )
396 CALL pzamax( n, zdum, imax, x, ix, jx, descx, 1 )
397 xmax( 1 ) = cabs2( zdum )
398 CALL dgsum2d( contxt, 'row
', ' ', 1, 1, XMAX, 1, -1, -1 )
415.NE.
IF( TSCALONE ) THEN
427 GROW = HALF / MAX( XBND, SMLNUM )
429 DO 30 J = JFIRST, JLAST, JINC
437 CALL INFOG2L( IA+J-1, JA+J-1, DESCA, NPROW, NPCOL, MYROW,
438 $ MYCOL, IROW, ICOL, ITMP1, ITMP2 )
439.EQ..AND..EQ.
IF( ( MYROWITMP1 ) ( MYCOLITMP2 ) ) THEN
440 TJJS = A( ( ICOL-1 )*LDA+IROW )
441 CALL ZGEBS2D( CONTXT, 'all
', ' ', 1, 1, TJJS, 1 )
443 CALL ZGEBR2D( CONTXT, 'all
', ' ', 1, 1, TJJS, 1,
448.GE.
IF( TJJSMLNUM ) THEN
452 XBND = MIN( XBND, MIN( ONE, TJJ )*GROW )
460.GE.
IF( TJJ+CNORM( J )SMLNUM ) THEN
464 GROW = GROW*( TJJ / ( TJJ+CNORM( J ) ) )
479 GROW = MIN( ONE, HALF / MAX( XBND, SMLNUM ) )
480 DO 40 J = JFIRST, JLAST, JINC
489 GROW = GROW*( ONE / ( ONE+CNORM( J ) ) )
508.NE.
IF( TSCALONE ) THEN
520 GROW = HALF / MAX( XBND, SMLNUM )
522 DO 60 J = JFIRST, JLAST, JINC
531 XJ = ONE + CNORM( J )
532 GROW = MIN( GROW, XBND / XJ )
535 CALL INFOG2L( IA+J-1, JA+J-1, DESCA, NPROW, NPCOL, MYROW,
536 $ MYCOL, IROW, ICOL, ITMP1, ITMP2 )
537.EQ..AND..EQ.
IF( ( MYROWITMP1 ) ( MYCOLITMP2 ) ) THEN
538 TJJS = A( ( ICOL-1 )*LDA+IROW )
539 CALL ZGEBS2D( CONTXT, 'all
', ' ', 1, 1, TJJS, 1 )
541 CALL ZGEBR2D( CONTXT, 'all
', ' ', 1, 1, TJJS, 1,
546.GE.
IF( TJJSMLNUM ) THEN
551 $ XBND = XBND*( TJJ / XJ )
559 GROW = MIN( GROW, XBND )
566 GROW = MIN( ONE, HALF / MAX( XBND, SMLNUM ) )
567 DO 70 J = JFIRST, JLAST, JINC
576 XJ = ONE + CNORM( J )
583.GT.
IF( ( GROW*TSCAL )SMLNUM ) THEN
588 CALL PZTRSV( UPLO, TRANS, DIAG, N, A, IA, JA, DESCA, X, IX, JX,
594.GT.
IF( XMAX( 1 )BIGNUM*HALF ) THEN
599 SCALE = ( BIGNUM*HALF ) / XMAX( 1 )
600 CALL PZDSCAL( N, SCALE, X, IX, JX, DESCX, 1 )
603 XMAX( 1 ) = XMAX( 1 )*TWO
610 DO 100 J = JFIRST, JLAST, JINC
615 CALL INFOG2L( IX+J-1, JX, DESCX, NPROW, NPCOL, MYROW,
616 $ MYCOL, IROWX, ICOLX, ITMP1X, ITMP2X )
617.EQ..AND..EQ.
IF( ( MYROWITMP1X ) ( MYCOLITMP2X ) ) THEN
619 CALL ZGEBS2D( CONTXT, 'all
', ' ', 1, 1, XJTMP, 1 )
621 CALL ZGEBR2D( CONTXT, 'all
', ' ', 1, 1, XJTMP, 1,
627 CALL INFOG2L( IA+J-1, JA+J-1, DESCA, NPROW, NPCOL,
628 $ MYROW, MYCOL, IROW, ICOL, ITMP1, ITMP2 )
629.EQ..AND..EQ.
IF( ( MYROWITMP1 ) ( MYCOLITMP2 ) ) THEN
630 TJJS = A( ( ICOL-1 )*LDA+IROW )*TSCAL
631 CALL ZGEBS2D( CONTXT, 'all
', ' ', 1, 1, TJJS, 1 )
633 CALL ZGEBR2D( CONTXT, 'all
', ' ', 1, 1, TJJS, 1,
642.GT.
IF( TJJSMLNUM ) THEN
646.LT.
IF( TJJONE ) THEN
647.GT.
IF( XJTJJ*BIGNUM ) THEN
652 CALL PZDSCAL( N, REC, X, IX, JX, DESCX, 1 )
655 XMAX( 1 ) = XMAX( 1 )*REC
660 XJTMP = ZLADIV( XJTMP, TJJS )
662.EQ..AND..EQ.
IF( ( MYROWITMP1X ) ( MYCOLITMP2X ) )
666.GT.
ELSE IF( TJJZERO ) THEN
670.GT.
IF( XJTJJ*BIGNUM ) THEN
675 REC = ( TJJ*BIGNUM ) / XJ
676.GT.
IF( CNORM( J )ONE ) THEN
681 REC = REC / CNORM( J )
683 CALL PZDSCAL( N, REC, X, IX, JX, DESCX, 1 )
686 XMAX( 1 ) = XMAX( 1 )*REC
690 XJTMP = ZLADIV( XJTMP, TJJS )
692.EQ..AND..EQ.
IF( ( MYROWITMP1X ) ( MYCOLITMP2X ) )
701 CALL PZLASET( ' ', N, 1, CZERO, CZERO, X, IX, JX,
703.EQ..AND..EQ.
IF( ( MYROWITMP1X ) ( MYCOLITMP2X ) )
719.GT.
IF( CNORM( J )( BIGNUM-XMAX( 1 ) )*REC ) THEN
724 CALL PZDSCAL( N, REC, X, IX, JX, DESCX, 1 )
728.GT.
ELSE IF( XJ*CNORM( J )( BIGNUM-XMAX( 1 ) ) ) THEN
732 CALL PZDSCAL( N, HALF, X, IX, JX, DESCX, 1 )
744 CALL PZAXPY( J-1, ZDUM, A, IA, JA+J-1, DESCA, 1, X,
746 CALL PZAMAX( J-1, ZDUM, IMAX, X, IX, JX, DESCX, 1 )
747 XMAX( 1 ) = CABS1( ZDUM )
748 CALL DGSUM2D( CONTXT, 'row
', ' ', 1, 1, XMAX, 1,
758 CALL PZAXPY( N-J, ZDUM, A, IA+J, JA+J-1, DESCA, 1,
759 $ X, IX+J, JX, DESCX, 1 )
760 CALL PZAMAX( N-J, ZDUM, I, X, IX+J, JX, DESCX, 1 )
761 XMAX( 1 ) = CABS1( ZDUM )
762 CALL DGSUM2D( CONTXT, 'row
', ' ', 1, 1, XMAX, 1,
768 ELSE IF( LSAME( TRANS, 't
' ) ) THEN
772 DO 120 J = JFIRST, JLAST, JINC
778 CALL INFOG2L( IX+J-1, JX, DESCX, NPROW, NPCOL, MYROW,
779 $ MYCOL, IROWX, ICOLX, ITMP1X, ITMP2X )
780.EQ..AND..EQ.
IF( ( MYROWITMP1X ) ( MYCOLITMP2X ) ) THEN
782 CALL ZGEBS2D( CONTXT, 'all
', ' ', 1, 1, XJTMP, 1 )
784 CALL ZGEBR2D( CONTXT, 'all
', ' ', 1, 1, XJTMP, 1,
788 USCAL = DCMPLX( TSCAL )
789 REC = ONE / MAX( XMAX( 1 ), ONE )
790.GT.
IF( CNORM( J )( BIGNUM-XJ )*REC ) THEN
797 CALL INFOG2L( IA+J-1, JA+J-1, DESCA, NPROW, NPCOL,
798 $ MYROW, MYCOL, IROW, ICOL, ITMP1,
800.EQ..AND..EQ.
IF( ( MYROWITMP1 ) ( MYCOLITMP2 ) )
802 TJJS = A( ( ICOL-1 )*LDA+IROW )*TSCAL
803 CALL ZGEBS2D( CONTXT, 'all
', ' ', 1, 1, TJJS,
806 CALL ZGEBR2D( CONTXT, 'all
', ' ', 1, 1, TJJS, 1,
813.GT.
IF( TJJONE ) THEN
817 REC = MIN( ONE, REC*TJJ )
818 USCAL = ZLADIV( USCAL, TJJS )
820.LT.
IF( RECONE ) THEN
821 CALL PZDSCAL( N, REC, X, IX, JX, DESCX, 1 )
824 XMAX( 1 ) = XMAX( 1 )*REC
829.EQ.
IF( USCALCONE ) THEN
835 CALL PZDOTU( J-1, CSUMJ, A, IA, JA+J-1, DESCA, 1,
836 $ X, IX, JX, DESCX, 1 )
837.LT.
ELSE IF( JN ) THEN
838 CALL PZDOTU( N-J, CSUMJ, A, IA+J, JA+J-1, DESCA, 1,
839 $ X, IX+J, JX, DESCX, 1 )
841.EQ.
IF( MYCOLITMP2X ) THEN
842 CALL ZGEBS2D( CONTXT, 'row
', ' ', 1, 1, CSUMJ, 1 )
844 CALL ZGEBR2D( CONTXT, 'row
', ' ', 1, 1, CSUMJ, 1,
856 ZDUM = DCONJG( USCAL )
857 CALL PZSCAL( J-1, ZDUM, A, IA, JA+J-1, DESCA, 1 )
858 CALL PZDOTU( J-1, CSUMJ, A, IA, JA+J-1, DESCA, 1,
859 $ X, IX, JX, DESCX, 1 )
860 ZDUM = ZLADIV( ZDUM, USCAL )
861 CALL PZSCAL( J-1, ZDUM, A, IA, JA+J-1, DESCA, 1 )
862.LT.
ELSE IF( JN ) THEN
866 ZDUM = DCONJG( USCAL )
867 CALL PZSCAL( N-J, ZDUM, A, IA+J, JA+J-1, DESCA, 1 )
868 CALL PZDOTU( N-J, CSUMJ, A, IA+J, JA+J-1, DESCA, 1,
869 $ X, IX+J, JX, DESCX, 1 )
870 ZDUM = ZLADIV( ZDUM, USCAL )
871 CALL PZSCAL( N-J, ZDUM, A, IA+J, JA+J-1, DESCA, 1 )
873.EQ.
IF( MYCOLITMP2X ) THEN
874 CALL ZGEBS2D( CONTXT, 'row
', ' ', 1, 1, CSUMJ, 1 )
876 CALL ZGEBR2D( CONTXT, 'row
', ' ', 1, 1, CSUMJ, 1,
881.EQ.
IF( USCALDCMPLX( TSCAL ) ) THEN
888 XJTMP = XJTMP - CSUMJ
894 CALL INFOG2L( IA+J-1, JA+J-1, DESCA, NPROW, NPCOL,
895 $ MYROW, MYCOL, IROW, ICOL, ITMP1,
897.EQ..AND..EQ.
IF( ( MYROWITMP1 ) ( MYCOLITMP2 ) )
899 TJJS = A( ( ICOL-1 )*LDA+IROW )*TSCAL
900 CALL ZGEBS2D( CONTXT, 'all
', ' ', 1, 1, TJJS,
903 CALL ZGEBR2D( CONTXT, 'all
', ' ', 1, 1, TJJS, 1,
915.GT.
IF( TJJSMLNUM ) THEN
919.LT.
IF( TJJONE ) THEN
920.GT.
IF( XJTJJ*BIGNUM ) THEN
925 CALL PZDSCAL( N, REC, X, IX, JX, DESCX, 1 )
928 XMAX( 1 ) = XMAX( 1 )*REC
932 XJTMP = ZLADIV( XJTMP, TJJS )
933.EQ..AND..EQ.
IF( ( MYROWITMP1X ) ( MYCOLITMP2X ) )
937.GT.
ELSE IF( TJJZERO ) THEN
941.GT.
IF( XJTJJ*BIGNUM ) THEN
945 REC = ( TJJ*BIGNUM ) / XJ
946 CALL PZDSCAL( N, REC, X, IX, JX, DESCX, 1 )
949 XMAX( 1 ) = XMAX( 1 )*REC
952 XJTMP = ZLADIV( XJTMP, TJJS )
953.EQ..AND..EQ.
IF( ( MYROWITMP1X ) ( MYCOLITMP2X ) )
962 CALL PZLASET( ' ', N, 1, CZERO, CZERO, X, IX, JX,
964.EQ..AND..EQ.
IF( ( MYROWITMP1X ) ( MYCOLITMP2X ) )
979 XJTMP = ZLADIV( XJTMP, TJJS ) - CSUMJ
980.EQ..AND..EQ.
IF( ( MYROWITMP1X ) ( MYCOLITMP2X ) )
985 XMAX( 1 ) = MAX( XMAX( 1 ), CABS1( XJTMP ) )
992 DO 140 J = JFIRST, JLAST, JINC
997 CALL INFOG2L( IX+J-1, JX, DESCX, NPROW, NPCOL, MYROW,
998 $ MYCOL, IROWX, ICOLX, ITMP1X, ITMP2X )
999.EQ..AND..EQ.
IF( ( MYROWITMP1X ) ( MYCOLITMP2X ) ) THEN
1001 CALL ZGEBS2D( CONTXT, 'all
', ' ', 1, 1, XJTMP, 1 )
1003 CALL ZGEBR2D( CONTXT, 'all
', ' ', 1, 1, XJTMP, 1,
1008 REC = ONE / MAX( XMAX( 1 ), ONE )
1009.GT.
IF( CNORM( J )( BIGNUM-XJ )*REC ) THEN
1016 CALL INFOG2L( IA+J-1, JA+J-1, DESCA, NPROW, NPCOL,
1017 $ MYROW, MYCOL, IROW, ICOL, ITMP1,
1019.EQ..AND..EQ.
IF( ( MYROWITMP1 ) ( MYCOLITMP2 ) )
1021 TJJS = DCONJG( A( ( ICOL-1 )*LDA+IROW ) )*TSCAL
1022 CALL ZGEBS2D( CONTXT, 'all
', ' ', 1, 1, TJJS,
1025 CALL ZGEBR2D( CONTXT, 'all
', ' ', 1, 1, TJJS, 1,
1032.GT.
IF( TJJONE ) THEN
1036 REC = MIN( ONE, REC*TJJ )
1037 USCAL = ZLADIV( USCAL, TJJS )
1039.LT.
IF( RECONE ) THEN
1040 CALL PZDSCAL( N, REC, X, IX, JX, DESCX, 1 )
1043 XMAX( 1 ) = XMAX( 1 )*REC
1048.EQ.
IF( USCALCONE ) THEN
1054 CALL PZDOTC( J-1, CSUMJ, A, IA, JA+J-1, DESCA, 1,
1055 $ X, IX, JX, DESCX, 1 )
1056.LT.
ELSE IF( JN ) THEN
1057 CALL PZDOTC( N-J, CSUMJ, A, IA+J, JA+J-1, DESCA, 1,
1058 $ X, IX+J, JX, DESCX, 1 )
1060.EQ.
IF( MYCOLITMP2X ) THEN
1061 CALL ZGEBS2D( CONTXT, 'row
', ' ', 1, 1, CSUMJ, 1 )
1063 CALL ZGEBR2D( CONTXT, 'row
', ' ', 1, 1, CSUMJ, 1,
1076 ZDUM = DCONJG( USCAL )
1077 CALL PZSCAL( J-1, ZDUM, A, IA, JA+J-1, DESCA, 1 )
1078 CALL PZDOTC( J-1, CSUMJ, A, IA, JA+J-1, DESCA, 1,
1079 $ X, IX, JX, DESCX, 1 )
1080 ZDUM = ZLADIV( CONE, ZDUM )
1081 CALL PZSCAL( J-1, ZDUM, A, IA, JA+J-1, DESCA, 1 )
1082.LT.
ELSE IF( JN ) THEN
1087 ZDUM = DCONJG( USCAL )
1088 CALL PZSCAL( N-J, ZDUM, A, IA+J, JA+J-1, DESCA, 1 )
1089 CALL PZDOTC( N-J, CSUMJ, A, IA+J, JA+J-1, DESCA, 1,
1090 $ X, IX+J, JX, DESCX, 1 )
1091 ZDUM = ZLADIV( CONE, ZDUM )
1092 CALL PZSCAL( N-J, ZDUM, A, IA+J, JA+J-1, DESCA, 1 )
1094.EQ.
IF( MYCOLITMP2X ) THEN
1095 CALL ZGEBS2D( CONTXT, 'row
', ' ', 1, 1, CSUMJ, 1 )
1097 CALL ZGEBR2D( CONTXT, 'row
', ' ', 1, 1, CSUMJ, 1,
1102.EQ.
IF( USCALDCMPLX( TSCAL ) ) THEN
1109 XJTMP = XJTMP - CSUMJ
1115 CALL INFOG2L( IA+J-1, JA+J-1, DESCA, NPROW, NPCOL,
1116 $ MYROW, MYCOL, IROW, ICOL, ITMP1,
1118.EQ..AND..EQ.
IF( ( MYROWITMP1 ) ( MYCOLITMP2 ) )
1120 TJJS = DCONJG( A( ( ICOL-1 )*LDA+IROW ) )*TSCAL
1121 CALL ZGEBS2D( CONTXT, 'all
', ' ', 1, 1, TJJS,
1124 CALL ZGEBR2D( CONTXT, 'all
', ' ', 1, 1, TJJS, 1,
1136.GT.
IF( TJJSMLNUM ) THEN
1140.LT.
IF( TJJONE ) THEN
1141.GT.
IF( XJTJJ*BIGNUM ) THEN
1146 CALL PZDSCAL( N, REC, X, IX, JX, DESCX, 1 )
1149 XMAX( 1 ) = XMAX( 1 )*REC
1153 XJTMP = ZLADIV( XJTMP, TJJS )
1154.EQ..AND..EQ.
IF( ( MYROWITMP1X ) ( MYCOLITMP2X ) )
1155 $ X( IROWX ) = XJTMP
1156.GT.
ELSE IF( TJJZERO ) THEN
1160.GT.
IF( XJTJJ*BIGNUM ) THEN
1164 REC = ( TJJ*BIGNUM ) / XJ
1165 CALL PZDSCAL( N, REC, X, IX, JX, DESCX, 1 )
1168 XMAX( 1 ) = XMAX( 1 )*REC
1171 XJTMP = ZLADIV( XJTMP, TJJS )
1172.EQ..AND..EQ.
IF( ( MYROWITMP1X ) ( MYCOLITMP2X ) )
1173 $ X( IROWX ) = XJTMP
1179 CALL PZLASET( ' ', N, 1, CZERO, CZERO, X, IX, JX,
1181.EQ..AND..EQ.
IF( ( MYROWITMP1X ) ( MYCOLITMP2X ) )
1194 XJTMP = ZLADIV( XJTMP, TJJS ) - CSUMJ
1195.EQ..AND..EQ.
IF( ( MYROWITMP1X ) ( MYCOLITMP2X ) )
1196 $ X( IROWX ) = XJTMP
1198 XMAX( 1 ) = MAX( XMAX( 1 ), CABS1( XJTMP ) )
1201 SCALE = SCALE / TSCAL
1206.NE.
IF( TSCALONE ) THEN
1207 CALL DSCAL( N, ONE / TSCAL, CNORM, 1 )