1 DOUBLE PRECISION FUNCTION pzlantr( NORM, UPLO, DIAG, M, N, A,
2 $ IA, JA, DESCA, WORK )
11 CHARACTER diag,
norm, uplo
16 DOUBLE PRECISION work( * )
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 )
169 DOUBLE PRECISION one, zero
170 parameter( one = 1.0d+0, zero = 0.0d+0 )
174 INTEGER iacol, iarow, ictxt, ii, iia, icoff, ioffa,
175 $ iroff, j, jb, jj, jja, jn, kk, lda, ll, mp,
176 $ mycol, myrow, np, npcol, nprow, nq
177 DOUBLE PRECISION sum, value
180 DOUBLE PRECISION ( 2 ), colssq( 2 )
193 INTRINSIC abs, dble,
max,
min, mod, 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
292 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
299 DO 110 kk = iia,
min( ii-1, iia+mp-1 )
300 VALUEVALUE, 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
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_ ) )
362 IF( mycol.EQ.iacol )
THEN
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 dgamx2d( ictxt,
'All',
' ', 1, 1,
VALUE, 1, kk, ll, -1,
411 IF(
lsame( uplo,
'U' ) )
THEN
417 jn =
min(
iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
420 IF( mycol.EQ.iacol )
THEN
421 IF( myrow.EQ.iarow )
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 IF( mycol.EQ.iacol )
THEN
470 IF( myrow.EQ.iarow )
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 IF( mycol.EQ.iacol )
THEN
525 IF( myrow.EQ.iarow )
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 IF( mycol.EQ.iacol )
THEN
569 IF( myrow.EQ.iarow )
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 dgsum2d( ictxt,
'Columnwise',
' ', 1, nq, work, 1,
619 IF( myrow.EQ.0 )
THEN
621 VALUE = work(
idamax( nq, work, 1 ) )
625 CALL dgamx2d( 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 DGSUM2D( ICTXT, 'rowwise
', ' ', MP, 1, WORK, MAX( 1, MP ),
846.EQ.
IF( MYCOL0 ) THEN
848 VALUE = WORK( IDAMAX( MP, WORK, 1 ) )
852 CALL DGAMX2D( ICTXT, 'columnwise
', ' ', 1, 1, VALUE, 1, KK,
861 ELSE IF( LSAME( NORM, 'f.OR.
' ) LSAME( NORM, 'e
' ) ) THEN
865 SSQ(2) = DBLE( MIN( M, N ) ) / DBLE( 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 ZLASSQ( MIN( II+LL-JJ-1, IIA+MP-1 )-IIA+1,
893 $ COLSSQ(1), COLSSQ(2) )
894 CALL DCOMBSSQ( SSQ, COLSSQ )
898 DO 850 LL = JJ, JJ + JB -1
901 CALL ZLASSQ( MIN( II+LL-JJ, IIA+MP-1 )-IIA+1,
903 $ COLSSQ(1), COLSSQ(2) )
904 CALL DCOMBSSQ( SSQ, COLSSQ )
912 DO 860 LL = JJ, JJ + JB -1
915 CALL ZLASSQ( MIN( II-1, IIA+MP-1 )-IIA+1,
917 $ COLSSQ(1), COLSSQ(2) )
918 CALL DCOMBSSQ( 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 ZLASSQ( MIN(II+LL-JJ-1, IIA+MP-1)-IIA+1,
946 $ COLSSQ(1), COLSSQ(2) )
947 CALL DCOMBSSQ( SSQ, COLSSQ )
951 DO 880 LL = JJ, JJ + JB -1
954 CALL ZLASSQ( MIN( II+LL-JJ, IIA+MP-1 )-IIA+1,
956 $ COLSSQ(1), COLSSQ(2) )
957 CALL DCOMBSSQ( SSQ, COLSSQ )
962 DO 890 LL = JJ, JJ + JB -1
965 CALL ZLASSQ( MIN( II-1, IIA+MP-1 )-IIA+1,
967 $ COLSSQ(1), COLSSQ(2) )
968 CALL DCOMBSSQ( 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 ZLASSQ( IIA+MP-(II+LL-JJ+1),
999 $ A( II+LL-JJ+1+IOFFA ), 1,
1000 $ COLSSQ(1), COLSSQ(2) )
1001 CALL DCOMBSSQ( SSQ, COLSSQ )
1005 DO 920 LL = JJ, JJ + JB -1
1008 CALL ZLASSQ( IIA+MP-(II+LL-JJ),
1009 $ A( II+LL-JJ+IOFFA ), 1,
1010 $ COLSSQ(1), COLSSQ(2) )
1011 CALL DCOMBSSQ( SSQ, COLSSQ )
1016 DO 930 LL = JJ, JJ + JB -1
1019 CALL ZLASSQ( IIA+MP-II, A( II+IOFFA ), 1,
1020 $ COLSSQ(1), COLSSQ(2) )
1021 CALL DCOMBSSQ( 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 ZLASSQ( IIA+MP-(II+LL-JJ+1),
1045 $ A( II+LL-JJ+1+IOFFA ), 1,
1046 $ COLSSQ(1), COLSSQ(2) )
1047 CALL DCOMBSSQ( SSQ, COLSSQ )
1051 DO 950 LL = JJ, JJ + JB -1
1054 CALL ZLASSQ( IIA+MP-(II+LL-JJ),
1055 $ A( II+LL-JJ+IOFFA ), 1,
1056 $ COLSSQ(1), COLSSQ(2) )
1057 CALL DCOMBSSQ( SSQ, COLSSQ )
1062 DO 960 LL = JJ, JJ + JB -1
1065 CALL ZLASSQ( IIA+MP-II, A( II+IOFFA ), 1,
1066 $ COLSSQ(1), COLSSQ(2) )
1067 CALL DCOMBSSQ( SSQ, COLSSQ )
1074.EQ.
IF( MYROWIAROW )
1076 IAROW = MOD( IAROW+1, NPROW )
1077 IACOL = MOD( IACOL+1, NPCOL )
1086 CALL PDTREECOMB( ICTXT, 'all
', 2, SSQ, 0, 0, DCOMBSSQ )
1087 VALUE = SSQ( 1 ) * SQRT( SSQ( 2 ) )
1093.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
1094 CALL DGEBS2D( ICTXT, 'all
', ' ', 1, 1, VALUE, 1 )
1096 CALL DGEBR2D( ICTXT, 'all
', ' ', 1, 1, VALUE, 1, 0, 0 )