2 $ ia, ja, desca, work )
11 CHARACTER diag,
norm, uplo
164 INTEGER block_cyclic_2d, csrc_, ctxt_, dlen_, dtype_,
165 $ lld_, mb_, m_, nb_, n_, rsrc_
166 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
167 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
168 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
170 parameter( one = 1.0e+0, zero = 0.0e+0 )
174 INTEGER iacol, iarow, ictxt, ii, iia, icoff, ioffa,
175 $ iroff, j, jb, jj, jja, jn, kk, lda, ll
180 REAL ssq( 2 ), colssq( 2 )
193 INTRINSIC abs,
max,
min, mod, real, sqrt
199 ictxt = desca( ctxt_ )
202 udiag =
lsame( diag,
'U' )
203 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
205 iroff = mod( ia-1, desca( mb_ ) )
206 icoff = mod( ja-1, desca( nb_ ) )
207 mp =
numroc( m+iroff, desca( mb_ ), myrow, iarow, nprow )
208 nq =
numroc( n+icoff, desca( nb_ ), mycol, iacol, npcol )
214 ioffa = ( jja - 1 ) * lda
216 IF(
min( m, n ).EQ.0 )
THEN
233 IF(
lsame( uplo,
'U' ) )
THEN
239 jn =
min(
iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
242 IF( mycol.EQ.iacol )
THEN
243 IF( myrow.EQ.iarow )
THEN
245 DO 20 ll = jj, jj + jb -1
246 DO 10 kk = iia,
min(ii+ll-jj-1,iia+mp-1)
247 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
252 DO 40 ll = jj, jj + jb -1
253 DO 30 kk = iia,
min( ii+ll-jj, iia+mp-1 )
254 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
260 DO 60 ll = jj, jj + jb -1
261 DO 50 kk = iia,
min( ii-1, iia+mp-1 )
262 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
272 iarow = mod( iarow+1, nprow )
273 iacol = mod( iacol+1, npcol )
277 DO 130 j = jn+1, ja+n-1, desca( nb_ )
278 jb =
min( ja+n-j, desca( nb_ ) )
280 IF( mycol.EQ.iacol )
THEN
281 IF( myrow.EQ.iarow )
THEN
283 DO 80 ll = jj, jj + jb -1
284 DO 70 kk = iia,
min( ii+ll-jj-1, iia+mp-1 )
285 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
290 DO 100 ll = jj, jj + jb -1
291 DO 90 kk = iia,
min( ii+ll-jj, iia+mp-1 )
292 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
298 DO 120 ll = jj, jj + jb -1
299 DO 110 kk = iia,
min( ii-1, iia+mp-1 )
300 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
310 iarow = mod( iarow+1, nprow )
311 iacol = mod( iacol+1, npcol )
321 jn =
min(
iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
324 IF( mycol.EQ.iacol )
THEN
325 IF( myrow.EQ.iarow )
THEN
327 DO 150 ll = jj, jj + jb -1
328 DO 140 kk = ii+ll-jj+1, iia+mp-1
329 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
334 DO 170 ll = jj, jj + jb -1
335 DO 160 kk = ii+ll-jj, iia+mp-1
336 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
342 DO 190 ll = jj, jj + jb -1
343 DO 180 kk = ii, iia+mp-1
344 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
354 iarow = mod( iarow+1, nprow )
355 iacol = mod( iacol+1, npcol )
359 DO 260 j = jn+1, ja+n-1, desca( nb_ )
360 jb =
min( ja+n-j, desca( nb_ ) )
363 IF( myrow.EQ.iarow )
THEN
365 DO 210 ll = jj, jj + jb -1
366 DO 200 kk = ii+ll-jj+1, iia+mp-1
367 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
372 DO 230 ll = jj, jj + jb -1
373 DO 220 kk = ii+ll-jj, iia+mp-1
374 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
380 DO 250 ll = jj, jj + jb -1
381 DO 240 kk = ii, iia+mp-1
382 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
392 iarow = mod( iarow+1, nprow )
393 iacol = mod( iacol+1, npcol )
401 CALL sgamx2d( ictxt,
'All', '
', 1, 1, VALUE, 1, KK, LL, -1,
407 ELSE IF( LSAME( NORM, 'o.OR..EQ.
' ) NORM'1
' ) THEN
411 IF( LSAME( UPLO, 'u
' ) ) THEN
417 JN = MIN( ICEIL( JA, DESCA( NB_ ) ) * DESCA( NB_ ), JA+N-1 )
420.EQ.
IF( MYCOLIACOL ) THEN
421.EQ.
IF( MYROWIAROW ) THEN
423 DO 280 LL = JJ, JJ + JB -1
425 DO 270 KK = IIA, MIN( II+LL-JJ-1, IIA+MP-1 )
426 SUM = SUM + ABS( A( IOFFA+KK ) )
430 IF (KK <= IIA+MP-1) THEN
434 WORK( LL-JJA+1 ) = SUM
437 DO 300 LL = JJ, JJ + JB -1
439 DO 290 KK = IIA, MIN( II+LL-JJ, IIA+MP-1 )
440 SUM = SUM + ABS( A( IOFFA+KK ) )
443 WORK( LL-JJA+1 ) = SUM
447 DO 320 LL = JJ, JJ + JB -1
449 DO 310 KK = IIA, MIN( II-1, IIA+MP-1 )
450 SUM = SUM + ABS( A( IOFFA+KK ) )
453 WORK( LL-JJA+1 ) = SUM
461 IAROW = MOD( IAROW+1, NPROW )
462 IACOL = MOD( IACOL+1, NPCOL )
466 DO 390 J = JN+1, JA+N-1, DESCA( NB_ )
467 JB = MIN( JA+N-J, DESCA( NB_ ) )
469.EQ.
IF( MYCOLIACOL ) THEN
470.EQ.
IF( MYROWIAROW ) THEN
472 DO 340 LL = JJ, JJ + JB -1
474 DO 330 KK = IIA, MIN( II+LL-JJ-1, IIA+MP-1 )
475 SUM = SUM + ABS( A( IOFFA+KK ) )
479 IF (KK <= IIA+MP-1) THEN
483 WORK( LL-JJA+1 ) = SUM
486 DO 360 LL = JJ, JJ + JB -1
488 DO 350 KK = IIA, MIN( II+LL-JJ, IIA+MP-1 )
489 SUM = SUM + ABS( A( IOFFA+KK ) )
492 WORK( LL-JJA+1 ) = SUM
496 DO 380 LL = JJ, JJ + JB -1
498 DO 370 KK = IIA, MIN( II-1, IIA+MP-1 )
499 SUM = SUM + ABS( A( IOFFA+KK ) )
502 WORK( LL-JJA+1 ) = SUM
510 IAROW = MOD( IAROW+1, NPROW )
511 IACOL = MOD( IACOL+1, NPCOL )
521 JN = MIN( ICEIL( JA, DESCA( NB_ ) ) * DESCA( NB_ ), JA+N-1 )
524.EQ.
IF( MYCOLIACOL ) THEN
525.EQ.
IF( MYROWIAROW ) THEN
527 DO 410 LL = JJ, JJ + JB -1
529 DO 400 KK = II+LL-JJ+1, IIA+MP-1
530 SUM = SUM + ABS( A( IOFFA+KK ) )
533 WORK( LL-JJA+1 ) = SUM
536 DO 430 LL = JJ, JJ + JB -1
538 DO 420 KK = II+LL-JJ, IIA+MP-1
539 SUM = SUM + ABS( A( IOFFA+KK ) )
542 WORK( LL-JJA+1 ) = SUM
546 DO 450 LL = JJ, JJ + JB -1
548 DO 440 KK = II, IIA+MP-1
549 SUM = SUM + ABS( A( IOFFA+KK ) )
552 WORK( LL-JJA+1 ) = SUM
560 IAROW = MOD( IAROW+1, NPROW )
561 IACOL = MOD( IACOL+1, NPCOL )
565 DO 520 J = JN+1, JA+N-1, DESCA( NB_ )
566 JB = MIN( JA+N-J, DESCA( NB_ ) )
568.EQ.
IF( MYCOLIACOL ) THEN
569.EQ.
IF( MYROWIAROW ) THEN
571 DO 470 LL = JJ, JJ + JB -1
573 DO 460 KK = II+LL-JJ+1, IIA+MP-1
574 SUM = SUM + ABS( A( IOFFA+KK ) )
577 WORK( LL-JJA+1 ) = SUM
580 DO 490 LL = JJ, JJ + JB -1
582 DO 480 KK = II+LL-JJ, IIA+MP-1
583 SUM = SUM + ABS( A( IOFFA+KK ) )
586 WORK( LL-JJA+1 ) = SUM
590 DO 510 LL = JJ, JJ + JB -1
592 DO 500 KK = II, IIA+MP-1
593 SUM = SUM + ABS( A( IOFFA+KK ) )
596 WORK( LL-JJA+1 ) = SUM
604 IAROW = MOD( IAROW+1, NPROW )
605 IACOL = MOD( IACOL+1, NPCOL )
614 CALL SGSUM2D( ICTXT, 'columnwise
', ' ', 1, NQ, WORK, 1,
619.EQ.
IF( MYROW0 ) THEN
621 VALUE = WORK( ISAMAX( NQ, WORK, 1 ) )
625 CALL SGAMX2D( ICTXT, 'rowwise
', ' ', 1, 1, VALUE, 1, KK, LL,
632 ELSE IF( LSAME( NORM, 'i
' ) ) THEN
634 IF( LSAME( UPLO, 'u
' ) ) THEN
635 DO 540 KK = IIA, IIA+MP-1
639 DO 570 KK = IIA, IIA+MP-1
644 IF( LSAME( UPLO, 'u
' ) ) THEN
650 JN = MIN( ICEIL( JA, DESCA( NB_ ) ) * DESCA( NB_ ), JA+N-1 )
653.EQ.
IF( MYCOLIACOL ) THEN
654.EQ.
IF( MYROWIAROW ) THEN
656 DO 590 LL = JJ, JJ + JB -1
657 DO 580 KK = IIA, MIN( II+LL-JJ-1, IIA+MP-1 )
658 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) +
659 $ ABS( A( IOFFA+KK ) )
663 IF (KK <= IIA+MP-1) THEN
664 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) + ONE
669 DO 610 LL = JJ, JJ + JB -1
670 DO 600 KK = IIA, MIN( II+LL-JJ, IIA+MP-1 )
671 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) +
672 $ ABS( A( IOFFA+KK ) )
678 DO 630 LL = JJ, JJ + JB -1
679 DO 620 KK = IIA, MIN( II-1, IIA+MP-1 )
680 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) +
681 $ ABS( A( IOFFA+KK ) )
691 IAROW = MOD( IAROW+1, NPROW )
692 IACOL = MOD( IACOL+1, NPCOL )
696 DO 700 J = JN+1, JA+N-1, DESCA( NB_ )
697 JB = MIN( JA+N-J, DESCA( NB_ ) )
699.EQ.
IF( MYCOLIACOL ) THEN
700.EQ.
IF( MYROWIAROW ) THEN
702 DO 650 LL = JJ, JJ + JB -1
703 DO 640 KK = IIA, MIN( II+LL-JJ-1, IIA+MP-1 )
704 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) +
705 $ ABS( A( IOFFA+KK ) )
709 IF (KK <= IIA+MP-1) THEN
710 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) + ONE
715 DO 670 LL = JJ, JJ + JB -1
716 DO 660 KK = IIA, MIN( II+LL-JJ, IIA+MP-1 )
717 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) +
718 $ ABS( A( IOFFA+KK ) )
724 DO 690 LL = JJ, JJ + JB -1
725 DO 680 KK = IIA, MIN( II-1, IIA+MP-1 )
726 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) +
727 $ ABS( A( IOFFA+KK ) )
737 IAROW = MOD( IAROW+1, NPROW )
738 IACOL = MOD( IACOL+1, NPCOL )
748 JN = MIN( ICEIL( JA, DESCA( NB_ ) ) * DESCA( NB_ ), JA+N-1 )
751.EQ.
IF( MYCOLIACOL ) THEN
752.EQ.
IF( MYROWIAROW ) THEN
754 DO 720 LL = JJ, JJ + JB -1
757 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) + ONE
758 DO 710 KK = II+LL-JJ+1, IIA+MP-1
759 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) +
760 $ ABS( A( IOFFA+KK ) )
765 DO 740 LL = JJ, JJ + JB -1
766 DO 730 KK = II+LL-JJ, IIA+MP-1
767 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) +
768 $ ABS( A( IOFFA+KK ) )
774 DO 760 LL = JJ, JJ + JB -1
775 DO 750 KK = II, IIA+MP-1
776 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) +
777 $ ABS( A( IOFFA+KK ) )
787 IAROW = MOD( IAROW+1, NPROW )
788 IACOL = MOD( IACOL+1, NPCOL )
792 DO 830 J = JN+1, JA+N-1, DESCA( NB_ )
793 JB = MIN( JA+N-J, DESCA( NB_ ) )
795.EQ.
IF( MYCOLIACOL ) THEN
796.EQ.
IF( MYROWIAROW ) THEN
798 DO 780 LL = JJ, JJ + JB -1
801 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) + ONE
802 DO 770 KK = II+LL-JJ+1, IIA+MP-1
803 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) +
804 $ ABS( A( IOFFA+KK ) )
809 DO 800 LL = JJ, JJ + JB -1
810 DO 790 KK = II+LL-JJ, IIA+MP-1
811 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) +
812 $ ABS( A( IOFFA+KK ) )
818 DO 820 LL = JJ, JJ + JB -1
819 DO 810 KK = II, IIA+MP-1
820 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) +
821 $ ABS( A( IOFFA+KK ) )
831 IAROW = MOD( IAROW+1, NPROW )
832 IACOL = MOD( IACOL+1, NPCOL )
841 CALL SGSUM2D( ICTXT, 'rowwise
', ' ', MP, 1, WORK, MAX( 1, MP ),
846.EQ.
IF( MYCOL0 ) THEN
848 VALUE = WORK( ISAMAX( MP, WORK, 1 ) )
852 CALL SGAMX2D( ICTXT, 'columnwise
', ' ', 1, 1, VALUE, 1, KK,
861 ELSE IF( LSAME( NORM, 'f.OR.
' ) LSAME( NORM, 'e
' ) ) THEN
865 SSQ(2) = REAL( MIN( M, N ) ) / REAL( NPROW*NPCOL )
871 IF( LSAME( UPLO, 'u
' ) ) THEN
878 JN = MIN( ICEIL( JA, DESCA( NB_ ) ) * DESCA( NB_ ), JA+N-1 )
883.EQ.
IF( MYCOLIACOL ) THEN
884.EQ.
IF( MYROWIAROW ) THEN
888 DO 840 LL = JJ, JJ + JB -1
891 CALL CLASSQ( MIN( II+LL-JJ-1, IIA+MP-1 )-IIA+1,
893 $ COLSSQ(1), COLSSQ(2) )
894 CALL SCOMBSSQ( SSQ, COLSSQ )
898 DO 850 LL = JJ, JJ + JB -1
901 CALL CLASSQ( MIN( II+LL-JJ, IIA+MP-1 )-IIA+1,
903 $ COLSSQ(1), COLSSQ(2) )
904 CALL SCOMBSSQ( SSQ, COLSSQ )
912 DO 860 LL = JJ, JJ + JB -1
915 CALL CLASSQ( MIN( II-1, IIA+MP-1 )-IIA+1,
917 $ COLSSQ(1), COLSSQ(2) )
918 CALL SCOMBSSQ( SSQ, COLSSQ )
930 IAROW = MOD( IAROW+1, NPROW )
931 IACOL = MOD( IACOL+1, NPCOL )
935 DO 900 J = JN+1, JA+N-1, DESCA( NB_ )
936 JB = MIN( JA+N-J, DESCA( NB_ ) )
938.EQ.
IF( MYCOLIACOL ) THEN
939.EQ.
IF( MYROWIAROW ) THEN
941 DO 870 LL = JJ, JJ + JB -1
944 CALL CLASSQ( MIN(II+LL-JJ-1, IIA+MP-1)-IIA+1,
946 $ COLSSQ(1), COLSSQ(2) )
947 CALL SCOMBSSQ( SSQ, COLSSQ )
951 DO 880 LL = JJ, JJ + JB -1
954 CALL CLASSQ( MIN( II+LL-JJ, IIA+MP-1 )-IIA+1,
956 $ COLSSQ(1), COLSSQ(2) )
957 CALL SCOMBSSQ( SSQ, COLSSQ )
962 DO 890 LL = JJ, JJ + JB -1
965 CALL CLASSQ( MIN( II-1, IIA+MP-1 )-IIA+1,
967 $ COLSSQ(1), COLSSQ(2) )
968 CALL SCOMBSSQ( SSQ, COLSSQ )
977 IAROW = MOD( IAROW+1, NPROW )
978 IACOL = MOD( IACOL+1, NPCOL )
989 JN = MIN( ICEIL( JA, DESCA( NB_ ) ) * DESCA( NB_ ), JA+N-1 )
992.EQ.
IF( MYCOLIACOL ) THEN
993.EQ.
IF( MYROWIAROW ) THEN
995 DO 910 LL = JJ, JJ + JB -1
998 CALL CLASSQ( IIA+MP-(II+LL-JJ+1),
999 $ A( II+LL-JJ+1+IOFFA ), 1,
1000 $ COLSSQ(1), COLSSQ(2) )
1001 CALL SCOMBSSQ( SSQ, COLSSQ )
1005 DO 920 LL = JJ, JJ + JB -1
1008 CALL CLASSQ( IIA+MP-(II+LL-JJ),
1009 $ A( II+LL-JJ+IOFFA ), 1,
1010 $ COLSSQ(1), COLSSQ(2) )
1011 CALL SCOMBSSQ( SSQ, COLSSQ )
1016 DO 930 LL = JJ, JJ + JB -1
1019 CALL CLASSQ( IIA+MP-II, A( II+IOFFA ), 1,
1020 $ COLSSQ(1), COLSSQ(2) )
1021 CALL SCOMBSSQ( SSQ, COLSSQ )
1028.EQ.
IF( MYROWIAROW )
1030 IAROW = MOD( IAROW+1, NPROW )
1031 IACOL = MOD( IACOL+1, NPCOL )
1035 DO 970 J = JN+1, JA+N-1, DESCA( NB_ )
1036 JB = MIN( JA+N-J, DESCA( NB_ ) )
1038.EQ.
IF( MYCOLIACOL ) THEN
1039.EQ.
IF( MYROWIAROW ) THEN
1041 DO 940 LL = JJ, JJ + JB -1
1044 CALL CLASSQ( IIA+MP-(II+LL-JJ+1),
1045 $ A( II+LL-JJ+1+IOFFA ), 1,
1046 $ COLSSQ(1), COLSSQ(2) )
1047 CALL SCOMBSSQ( SSQ, COLSSQ )
1051 DO 950 LL = JJ, JJ + JB -1
1054 CALL CLASSQ( IIA+MP-(II+LL-JJ),
1055 $ A( II+LL-JJ+IOFFA ), 1,
1056 $ COLSSQ(1), COLSSQ(2) )
1057 CALL SCOMBSSQ( SSQ, COLSSQ )
1062 DO 960 LL = JJ, JJ + JB -1
1065 CALL CLASSQ( IIA+MP-II, A( II+IOFFA ), 1,
1066 $ COLSSQ(1), COLSSQ(2) )
1067 CALL SCOMBSSQ( SSQ, COLSSQ )
1074.EQ.
IF( MYROWIAROW )
1076 IAROW = MOD( IAROW+1, NPROW )
1077 IACOL = MOD( IACOL+1, NPCOL )
1086 CALL PSTREECOMB( ICTXT, 'all
', 2, SSQ, 0, 0, SCOMBSSQ )
1087 VALUE = SSQ( 1 ) * SQRT( SSQ( 2 ) )
1093.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
1094 CALL SGEBS2D( ICTXT, 'all
', ' ', 1, 1, VALUE, 1 )
1096 CALL SGEBR2D( ICTXT, 'all
', ' ', 1, 1, VALUE, 1, 0, 0 )