11 CHARACTER ,
norm, uplo
16 REAL a( * ), work( * )
163 INTEGER block_cyclic_2d, csrc_, ctxt_, dlen_, dtype_,
164 $ lld_, mb_, m_, nb_, n_, rsrc_
165 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
166 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
167 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
169 parameter( one = 1.0e+0, zero = 0.0e+0 )
173 INTEGER iacol, iarow, ictxt, ii, iia, icoff, ioffa,
174 $ iroff, j, jb, jj, jja, jn, kk, lda, ll, mp,
175 $ mycol, myrow, np, npcol, nprow, nq
179 REAL ssq( 2 ), colssq( 2 )
184 $ sgamx2d, sgsum2d,
slassq
192 INTRINSIC abs,
max,
min, mod, real, sqrt
198 ictxt = desca( ctxt_ )
201 udiag =
lsame( diag,
'U' )
202 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
204 iroff = mod( ia-1, desca( mb_ ) )
205 icoff = mod( ja-1, desca( nb_ ) )
206 mp =
numroc( m+iroff, desca( mb_ ), myrow, iarow, nprow )
207 nq =
numroc( n+icoff, desca( nb_ ), mycol, iacol, npcol )
213 ioffa = ( jja - 1 ) * lda
215 IF(
min( m, n ).EQ.0 )
THEN
232 IF(
lsame( uplo,
'U' ) )
THEN
238 jn =
min(
iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
241 IF( mycol.EQ.iacol )
THEN
242 IF( myrow.EQ.iarow )
THEN
244 DO 20 ll = jj, jj + jb -1
245 DO 10 kk = iia,
min(ii+ll-jj-1,iia+mp-1)
246 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
251 DO 40 ll = jj, jj + jb -1
252 DO 30 kk = iia,
min( ii+ll-jj, iia+mp-1 )
253 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
259 DO 60 ll = jj, jj + jb -1
260 DO 50 kk = iia,
min( ii-1, iia+mp-1 )
261 VALUE =
max(
VALUE, abs( a( ioffa+kk )
271 iarow = mod( iarow+1, nprow )
272 iacol = mod( iacol+1, npcol )
276 DO 130 j = jn+1, ja+n-1, desca( nb_ )
277 jb =
min( ja+n-j, desca( nb_ ) )
279 IF( mycol.EQ.iacol )
THEN
280 IF( myrow.EQ.iarow )
THEN
282 DO 80 ll = jj, jj + jb -1
283 DO 70 kk = iia,
min( ii+ll-jj-1, iia+mp-1 )
284 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
289 DO 100 ll = jj, jj + jb -1
290 DO 90 kk = iia,
min( ii+ll-jj, iia+mp-1 )
291 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
297 DO 120 ll = jj, jj + jb -1
298 DO 110 kk = iia,
min( ii-1, iia+mp-1 )
299 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
309 iarow = mod( iarow+1, nprow )
310 iacol = mod( iacol+1, npcol )
320 jn =
min(
iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
323 IF( mycol.EQ.iacol )
THEN
324 IF( myrow.EQ.iarow )
THEN
326 DO 150 ll = jj, jj + jb -1
327 DO 140 kk = ii+ll-jj+1, iia+mp-1
328 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
333 DO 170 ll = jj, jj + jb -1
334 DO 160 kk = ii+ll-jj, iia+mp-1
335 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
341 DO 190 ll = jj, jj + jb -1
342 DO 180 kk = ii, iia+mp-1
343 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
353 iarow = mod( iarow+1, nprow )
354 iacol = mod( iacol+1, npcol )
358 DO 260 j = jn+1, ja+n-1, desca( nb_ )
359 jb =
min( ja+n-j, desca( nb_ ) )
361 IF( mycol.EQ.iacol )
THEN
362 IF( myrow.EQ.iarow )
THEN
364 DO 210 ll = jj, jj + jb -1
365 DO 200 kk = ii+ll-jj+1, iia+mp-1
366 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
371 DO 230 ll = jj, jj + jb -1
372 DO 220 kk = ii+ll-jj, iia+mp-1
373 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
379 DO 250 ll = jj, jj + jb -1
380 DO 240 kk = ii, iia+mp-1
381 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
391 iarow = mod( iarow+1, nprow )
392 iacol = mod( iacol+1, npcol )
400 CALL sgamx2d( ictxt,
'All',
' ', 1, 1,
VALUE, 1, kk, ll, -1,
410 IF(
lsame( uplo,
'U' ) )
THEN
416 jn =
min(
iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
419 IF( mycol.EQ.iacol )
THEN
420 IF( myrow.EQ.iarow )
THEN
422 DO 280 ll = jj, jj + jb -1
424 DO 270 kk = iia,
min( ii+ll-jj-1, iia+mp-1 )
425 sum = sum + abs( a( ioffa+kk ) )
429 IF (kk <= iia+mp-1)
THEN
433 work( ll-jja+1 ) = sum
436 DO 300 ll = jj, jj + jb -1
438 DO 290 kk = iia,
min( ii+ll-jj, iia+mp-1 )
439 sum = sum + abs( a( ioffa+kk ) )
442 work( ll-jja+1 ) = sum
446 DO 320 ll = jj, jj + jb -1
452 work( ll-jja+1 ) = sum
460 iarow = mod( iarow+1, nprow )
461 iacol = mod( iacol+1, npcol )
465 DO 390 j = jn+1, ja+n-1, desca( nb_ )
466 jb =
min( ja+n-j, desca( nb_ ) )
468 IF( mycol.EQ.iacol )
THEN
469 IF( myrow.EQ.iarow )
THEN
471 DO 340 ll = jj, jj + jb -1
473 DO 330 kk = iia,
min( ii+ll-jj-1, iia+mp-1 )
474 sum = sum + abs( a( ioffa+kk ) )
478 IF (kk <= iia+mp-1)
THEN
482 work( ll-jja+1 ) = sum
485 DO 360 ll = jj, jj + jb -1
487 DO 350 kk = iia,
min( ii+ll-jj, iia+mp-1 )
488 sum = sum + abs( a( ioffa+kk ) )
491 work( ll-jja+1 ) = sum
495 DO 380 ll = jj, jj + jb -1
497 DO 370 kk = iia,
min( ii-1, iia+mp-1 )
498 sum = sum + abs( a( ioffa+kk ) )
501 work( ll-jja+1 ) = sum
509 iarow = mod( iarow+1, nprow )
520 jn =
min(
iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
523 IF( mycol.EQ.iacol )
THEN
524 IF( myrow.EQ.iarow )
THEN
526 DO 410 ll = jj, jj + jb -1
528 DO 400 kk = ii+ll-jj+1, iia+mp-1
529 sum = sum + abs( a( ioffa+kk ) )
532 work( ll-jja+1 ) = sum
535 DO 430 ll = jj, jj + jb -1
537 DO 420 kk = ii+ll-jj, iia+mp-1
538 sum = sum + abs( a( ioffa+kk ) )
541 work( ll-jja+1 ) = sum
545 DO 450 ll = jj, jj + jb -1
547 DO 440 kk = ii, iia+mp-1
548 sum = sum + abs( a( ioffa+kk ) )
551 work( ll-jja+1 ) = sum
559 iarow = mod( iarow+1, nprow )
560 iacol = mod( iacol+1, npcol )
564 DO 520 j = jn+1, ja+n-1, desca( nb_ )
565 jb =
min( ja+n-j, desca( nb_ ) )
567 IF( mycol.EQ.iacol )
THEN
568 IF( myrow.EQ.iarow )
THEN
570 DO 470 ll = jj, jj + jb -1
572 DO 460 kk = ii+ll-jj+1, iia+mp
573 sum = sum + abs( a( ioffa+kk ) )
576 work( ll-jja+1 ) = sum
579 DO 490 ll = jj, jj + jb -1
581 DO 480 kk = ii+ll-jj, iia+mp-1
582 sum = sum + abs( a( ioffa+kk ) )
585 work( ll-jja+1 ) = sum
589 DO 510 ll = jj, jj + jb -1
591 DO 500 kk = ii, iia+mp-1
592 sum = sum + abs( a( ioffa+kk ) )
595 work( ll-jja+1 ) = sum
603 iarow = mod( iarow+1, nprow )
604 iacol = mod( iacol+1, npcol )
613 CALL sgsum2d( ictxt,
'Columnwise',
' ', 1, nq, work, 1,
618 IF( myrow.EQ.0 )
THEN
620 VALUE = work(
isamax( nq, work, 1 ) )
624 CALL sgamx2d( ictxt,
'Rowwise',
' ', 1, 1,
VALUE, 1, kk
633 IF(
lsame( uplo,
'U' ) )
THEN
634 DO 540 kk = iia, iia+mp-1
638 DO 570 kk = iia, iia+mp-1
643 IF(
lsame( uplo,
'U' ) )
THEN
649 jn =
min(
iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
652 IF( mycol.EQ.iacol )
THEN
653 IF( myrow.EQ.iarow )
THEN
655 DO 590 ll = jj, jj + jb -1
656 DO 580 kk = iia,
min( ii+ll-jj-1, iia+mp-1 )
657 work( kk-iia+1 ) = work( kk-iia+1 ) +
658 $ abs( a( ioffa+kk ) )
662 IF (kk <= iia+mp-1)
THEN
663 work( kk-iia+1 ) = work( kk-iia+1 ) + one
668 DO 610 ll = jj, jj + jb -1
669 DO 600 kk = iia,
min( ii
670 work( kk-iia+1 ) = work( kk-iia+1 ) +
671 $ abs( a( ioffa+kk ) )
677 DO 630 ll = jj, jj + jb -1
678 DO 620 kk = iia,
min( ii-1, iia+mp-1 )
679 work( kk-iia+1 ) = work( kk-iia+1 ) +
680 $ abs( a( ioffa+kk ) )
690 iarow = mod( iarow+1, nprow )
691 iacol = mod( iacol+1, npcol )
696 jb =
min( ja+n-j, desca( nb_ ) )
698 IF( mycol.EQ.iacol )
THEN
699 IF( myrow.EQ.iarow )
THEN
701 DO 650 ll = jj, jj + jb -1
702 DO 640 kk = iia,
min( ii+ll-jj-1, iia+mp-1 )
703 work( kk-iia+1 ) = work( kk-iia+1 ) +
708 IF (kk <= iia+mp-1)
THEN
709 work( kk-iia+1 ) = work( kk-iia+1 ) + one
714 DO 670 ll = jj, jj + jb -1
715 DO 660 kk = iia,
min( ii+ll-jj, iia+mp-1 )
716 work( kk-iia+1 ) = work( kk-iia+1 ) +
717 $ abs( a( ioffa+kk ) )
723 DO 690 ll = jj, jj + jb -1
724 DO 680 kk = iia,
min( ii-1, iia+mp-1 )
725 work( kk-iia+1 ) = work( kk-iia+1 ) +
726 $ abs( a( ioffa+kk ) )
736 iarow = mod( iarow+1, nprow )
737 iacol = mod( iacol+1, npcol )
747 jn =
min(
iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
750 IF( mycol.EQ.iacol )
THEN
751 IF( myrow.EQ.iarow )
THEN
753 DO 720 ll = jj, jj + jb -1
756 work( kk-iia+1 ) = work( kk-iia+1 ) + one
757 DO 710 kk = ii+ll-jj+1, iia+mp-1
758 work( kk-iia+1 ) = work( kk-iia+1 ) +
759 $ abs( a( ioffa+kk ) )
764 DO 740 ll = jj, jj + jb -1
765 DO 730 kk = ii+ll-jj, iia+mp-1
766 work( kk-iia+1 ) = work( kk-iia+1 ) +
767 $ abs( a( ioffa+kk ) )
773 DO 760 ll = jj, jj + jb -1
774 DO 750 kk = ii, iia+mp-1
775 work( kk-iia+1 ) = work( kk-iia+1 ) +
776 $ abs( a( ioffa+kk ) )
786 iarow = mod( iarow+1, nprow )
787 iacol = mod( iacol+1, npcol )
791 DO 830 j = jn+1, ja+n-1, desca( nb_ )
792 jb =
min( ja+n-j, desca( nb_ ) )
794 IF( mycol.EQ.iacol )
THEN
795 IF( myrow.EQ.iarow )
THEN
797 DO 780 ll = jj, jj + jb -1
800 work( kk-iia+1 ) = work( kk-iia+1 ) + one
801 DO 770 kk = ii+ll-jj+1, iia+mp-1
803 $ abs( a( ioffa+kk ) )
808 DO 800 ll = jj, jj + jb -1
809 DO 790 kk = ii+ll-jj, iia+mp-1
810 work( kk-iia+1 ) = work( kk-iia+1 ) +
811 $ abs( a( ioffa+kk ) )
817 DO 820 ll = jj, jj + jb -1
818 DO 810 kk = ii, iia+mp-1
819 work( kk-iia+1 ) = work( kk-iia+1 ) +
820 $ abs( a( ioffa+kk ) )
830 iarow = mod( iarow+1, nprow )
831 iacol = mod( iacol+1, npcol )
840 CALL sgsum2d( ictxt,
'Rowwise',
' ', mp, 1, work,
max( 1, mp ),
845 IF( mycol.EQ.0 )
THEN
847 VALUE = work(
isamax( mp, work, 1 ) )
851 CALL sgamx2d( ictxt,
'Columnwise',
' ', 1, 1,
VALUE, 1, kk,
864 ssq(2) = real(
min( m, n ) ) / real( nprow*npcol )
870 IF(
lsame( uplo, 'u
' ) ) THEN
877 JN = MIN( ICEIL( JA, DESCA( NB_ ) ) * DESCA( NB_ ), JA+N-1 )
882.EQ.
IF( MYCOLIACOL ) THEN
883.EQ.
IF( MYROWIAROW ) THEN
887 DO 840 LL = JJ, JJ + JB -1
890 CALL SLASSQ( MIN( II+LL-JJ-1, IIA+MP-1 )-IIA+1,
892 $ COLSSQ(1), COLSSQ(2) )
893 CALL SCOMBSSQ( SSQ, COLSSQ )
897 DO 850 LL = JJ, JJ + JB -1
900 CALL SLASSQ( MIN( II+LL-JJ, IIA+MP-1 )-IIA+1,
902 $ COLSSQ(1), COLSSQ(2) )
903 CALL SCOMBSSQ( SSQ, COLSSQ )
911 DO 860 LL = JJ, JJ + JB -1
914 CALL SLASSQ( MIN( II-1, IIA+MP-1 )-IIA+1,
916 $ COLSSQ(1), COLSSQ(2) )
917 CALL SCOMBSSQ( SSQ, COLSSQ )
929 IAROW = MOD( IAROW+1, NPROW )
930 IACOL = MOD( IACOL+1, NPCOL )
934 DO 900 J = JN+1, JA+N-1, DESCA( NB_ )
935 JB = MIN( JA+N-J, DESCA( NB_ ) )
937.EQ.
IF( MYCOLIACOL ) THEN
938.EQ.
IF( MYROWIAROW ) THEN
940 DO 870 LL = JJ, JJ + JB -1
943 CALL SLASSQ( MIN(II+LL-JJ-1, IIA+MP-1)-IIA+1,
945 $ COLSSQ(1), COLSSQ(2) )
946 CALL SCOMBSSQ( SSQ, COLSSQ )
950 DO 880 LL = JJ, JJ + JB -1
953 CALL SLASSQ( MIN( II+LL-JJ, IIA+MP-1 )-IIA+1,
955 $ COLSSQ(1), COLSSQ(2) )
956 CALL SCOMBSSQ( SSQ, COLSSQ )
961 DO 890 LL = JJ, JJ + JB -1
964 CALL SLASSQ( MIN( II-1, IIA+MP-1 )-IIA+1,
966 $ COLSSQ(1), COLSSQ(2) )
967 CALL SCOMBSSQ( SSQ, COLSSQ )
976 IAROW = MOD( IAROW+1, NPROW )
977 IACOL = MOD( IACOL+1, NPCOL )
988 JN = MIN( ICEIL( JA, DESCA( NB_ ) ) * DESCA( NB_ ), JA+N-1 )
991.EQ.
IF( MYCOLIACOL ) THEN
992.EQ.
IF( MYROWIAROW ) THEN
994 DO 910 LL = JJ, JJ + JB -1
997 CALL SLASSQ( IIA+MP-(II+LL-JJ+1),
998 $ A( II+LL-JJ+1+IOFFA ), 1,
999 $ COLSSQ(1), COLSSQ(2) )
1000 CALL SCOMBSSQ( SSQ, COLSSQ )
1004 DO 920 LL = JJ, JJ + JB -1
1007 CALL SLASSQ( IIA+MP-(II+LL-JJ),
1008 $ A( II+LL-JJ+IOFFA ), 1,
1009 $ COLSSQ(1), COLSSQ(2) )
1010 CALL SCOMBSSQ( SSQ, COLSSQ )
1015 DO 930 LL = JJ, JJ + JB -1
1018 CALL SLASSQ( IIA+MP-II, A( II+IOFFA ), 1,
1019 $ COLSSQ(1), COLSSQ(2) )
1020 CALL SCOMBSSQ( SSQ, COLSSQ )
1027.EQ.
IF( MYROWIAROW )
1029 IAROW = MOD( IAROW+1, NPROW )
1030 IACOL = MOD( IACOL+1, NPCOL )
1034 DO 970 J = JN+1, JA+N-1, DESCA( NB_ )
1035 JB = MIN( JA+N-J, DESCA( NB_ ) )
1037.EQ.
IF( MYCOLIACOL ) THEN
1038.EQ.
IF( MYROWIAROW ) THEN
1040 DO 940 LL = JJ, JJ + JB -1
1043 CALL SLASSQ( IIA+MP-(II+LL-JJ+1),
1044 $ A( II+LL-JJ+1+IOFFA ), 1,
1045 $ COLSSQ(1), COLSSQ(2) )
1046 CALL SCOMBSSQ( SSQ, COLSSQ )
1050 DO 950 LL = JJ, JJ + JB -1
1053 CALL SLASSQ( IIA+MP-(II+LL-JJ),
1054 $ A( II+LL-JJ+IOFFA ), 1,
1055 $ COLSSQ(1), COLSSQ(2) )
1056 CALL SCOMBSSQ( SSQ, COLSSQ )
1061 DO 960 LL = JJ, JJ + JB -1
1064 CALL SLASSQ( IIA+MP-II, A( II+IOFFA ), 1,
1065 $ COLSSQ(1), COLSSQ(2) )
1066 CALL SCOMBSSQ( SSQ, COLSSQ )
1073.EQ.
IF( MYROWIAROW )
1075 IAROW = MOD( IAROW+1, NPROW )
1076 IACOL = MOD( IACOL+1, NPCOL )
1085 CALL PSTREECOMB( ICTXT, 'all
', 2, SSQ, 0, 0, SCOMBSSQ )
1086 VALUE = SSQ( 1 ) * SQRT( SSQ( 2 ) )
1092.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
1093 CALL SGEBS2D( ICTXT, 'all
', ' ', 1, 1, VALUE, 1 )
1095 CALL SGEBR2D( ICTXT, 'all
', ' ', 1, 1, VALUE, 1, 0, 0 )