1 DOUBLE PRECISION FUNCTION pzlanhe( NORM, UPLO, N, A, IA, JA,
15 DOUBLE PRECISION ( * )
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 )
173 INTEGER i, iarow, iacol, ib, icoff, ictxt, icurcol,
174 $ icurrow, ii, iia, in, iroff, icsr, icsr0,
175 $ ioffa, irsc, irsc0, irsr, irsr0, jj, jja, k,
176 $ lda, ll, mycol, myrow, np, npcol, nprow, nq
177 DOUBLE PRECISION absa, scale, sum, value
180 DOUBLE PRECISION rwork( 2 )
194 INTRINSIC abs, dble,
max,
min, mod, sqrt
200 ictxt = desca( ctxt_ )
202 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol,
203 $ iia, jja, iarow, iacol )
205 iroff = mod( ia-1, desca( mb_ ) )
206 icoff = mod( ja-1, desca( nb_ ) )
207 np =
numroc( n+iroff, desca( mb_ ), myrow, iarow, nprow )
208 nq =
numroc( n+icoff, desca( nb_ ), mycol, iacol, npcol )
212 IF( myrow.EQ.iarow )
THEN
218 IF( mycol.EQ.iacol )
THEN
226 in =
min(
iceil( ia, desca( mb_ ) ) * desca( mb_ ), ia+n-1 )
274 IF(
lsame( uplo, 'u
' ) ) THEN
282.EQ.
IF( MYCOLIACOL ) THEN
283 DO 20 K = (JJ-1)*LDA, (JJ+IB-2)*LDA, LDA
286 VALUE = MAX( VALUE, ABS( A( LL+K ) ) )
302.EQ.
IF( MYROWIAROW ) THEN
303 DO 40 K = II, II+IB-1
304.EQ.
IF( MYCOLIACOL ) THEN
305.LE.
IF( JJJJA+NQ-1 ) THEN
307 $ ABS( DBLE( A( K+(JJ-1)*LDA ) ) ) )
308 DO 30 LL = JJ*LDA, (JJA+NQ-2)*LDA, LDA
309 VALUE = MAX( VALUE, ABS( A( K+LL ) ) )
313.LE.
IF( JJJJA+NQ-1 ) THEN
314 DO 35 LL = (JJ-1)*LDA, (JJA+NQ-2)*LDA, LDA
315 VALUE = MAX( VALUE, ABS( A( K+LL ) ) )
323.EQ.
ELSE IF( MYCOLIACOL ) THEN
327 ICURROW = MOD( IAROW+1, NPROW )
328 ICURCOL = MOD( IACOL+1, NPCOL )
332 DO 90 I = IN+1, IA+N-1, DESCA( MB_ )
333 IB = MIN( DESCA( MB_ ), IA+N-I )
337.EQ.
IF( MYCOLICURCOL ) THEN
338 DO 60 K = (JJ-1)*LDA, (JJ+IB-2)*LDA, LDA
341 VALUE = MAX( VALUE, ABS( A( LL+K ) ) )
344.EQ.
IF( MYROWICURROW )
350.EQ.
IF( MYROWICURROW )
356.EQ.
IF( MYROWICURROW ) THEN
357 DO 80 K = II, II+IB-1
358.EQ.
IF( MYCOLICURCOL ) THEN
359.LE.
IF( JJJJA+NQ-1 ) THEN
361 $ ABS( DBLE( A( K+(JJ-1)*LDA ) ) ) )
362 DO 70 LL = JJ*LDA, (JJA+NQ-2)*LDA, LDA
363 VALUE = MAX( VALUE, ABS( A( K+LL ) ) )
367.LE.
IF( JJJJA+NQ-1 ) THEN
368 DO 75 LL = (JJ-1)*LDA, (JJA+NQ-2)*LDA, LDA
369 VALUE = MAX( VALUE, ABS( A( K+LL ) ) )
373.EQ.
IF( MYCOLICURCOL )
377.EQ.
ELSE IF( MYCOLICURCOL ) THEN
380 ICURROW = MOD( ICURROW+1, NPROW )
381 ICURCOL = MOD( ICURCOL+1, NPCOL )
392.EQ.
IF( MYCOLIACOL ) THEN
393 DO 110 K = (JJ-1)*LDA, (JJ+IB-2)*LDA, LDA
394.EQ.
IF( MYROWIAROW ) THEN
395.LE.
IF( IIIIA+NP-1 ) THEN
396 VALUE = MAX( VALUE, ABS( DBLE( A( II+K ) ) ) )
397 DO 100 LL = II+1, IIA+NP-1
398 VALUE = MAX( VALUE, ABS( A( LL+K ) ) )
402.LE.
IF( IIIIA+NP-1 ) THEN
403 DO 105 LL = II, IIA+NP-1
404 VALUE = MAX( VALUE, ABS( A( LL+K ) ) )
420.EQ.
IF( MYROWIAROW ) THEN
423 DO 120 LL = (JJA-1)*LDA, (JJ-2)*LDA, LDA
424 VALUE = MAX( VALUE, ABS( A( II+LL ) ) )
431.EQ.
ELSE IF( MYCOLIACOL ) THEN
435 ICURROW = MOD( IAROW+1, NPROW )
436 ICURCOL = MOD( IACOL+1, NPCOL )
440 DO 180 I = IN+1, IA+N-1, DESCA( MB_ )
441 IB = MIN( DESCA( MB_ ), IA+N-I )
445.EQ.
IF( MYCOLICURCOL ) THEN
446 DO 150 K = (JJ-1)*LDA, (JJ+IB-2)*LDA, LDA
447.EQ.
IF( MYROWICURROW ) THEN
448.LE.
IF( IIIIA+NP-1 ) THEN
450 $ ABS( DBLE( A( II+K ) ) ) )
451 DO 140 LL = II+1, IIA+NP-1
452 VALUE = MAX( VALUE, ABS( A( LL+K ) ) )
456.LE.
IF( IIIIA+NP-1 ) THEN
457 DO 145 LL = II, IIA+NP-1
458 VALUE = MAX( VALUE, ABS( A( LL+K ) ) )
462.EQ.
IF( MYROWICURROW )
468.EQ.
IF( MYROWICURROW )
474.EQ.
IF( MYROWICURROW ) THEN
477 DO 160 LL = (JJA-1)*LDA, (JJ-2)*LDA, LDA
478 VALUE = MAX( VALUE, ABS( A( II+LL ) ) )
482.EQ.
IF( MYCOLICURCOL )
485.EQ.
ELSE IF( MYCOLICURCOL ) THEN
488 ICURROW = MOD( ICURROW+1, NPROW )
489 ICURCOL = MOD( ICURCOL+1, NPCOL )
497 CALL DGAMX2D( ICTXT, 'all
', ' ', 1, 1, VALUE, 1, I, K, -1,
500 ELSE IF( LSAME( NORM, 'i.OR.
' ) LSAME( NORM, 'o.OR.
' )
506 IF( LSAME( UPLO, 'u
' ) ) THEN
514.EQ.
IF( MYCOLIACOL ) THEN
515 IOFFA = ( JJ - 1 ) * LDA
519 DO 190 LL = IIA, II-1
520 SUM = SUM + ABS( A( LL+IOFFA ) )
524 WORK( JJ+K-JJA+ICSR0 ) = SUM
538.EQ.
IF( MYROWIAROW ) THEN
539 DO 220 K = II, II+IB-1
541.EQ.
IF( MYCOLIACOL ) THEN
542.GT.
IF( JJA+NQJJ ) THEN
543 SUM = ABS( DBLE( A( K+(JJ-1)*LDA ) ) )
544 DO 210 LL = JJ*LDA, (JJA+NQ-2)*LDA, LDA
545 SUM = SUM + ABS( A( K+LL ) )
549.GT.
IF( JJA+NQJJ ) THEN
550 DO 215 LL = (JJ-1)*LDA, (JJA+NQ-2)*LDA, LDA
551 SUM = SUM + ABS( A( K+LL ) )
555 WORK( K-IIA+IRSC0 ) = SUM
560.EQ.
ELSE IF( MYCOLIACOL ) THEN
564 ICURROW = MOD( IAROW+1, NPROW )
565 ICURCOL = MOD( IACOL+1, NPCOL )
569 DO 270 I = IN+1, IA+N-1, DESCA( MB_ )
570 IB = MIN( DESCA( MB_ ), IA+N-I )
574.EQ.
IF( MYCOLICURCOL ) THEN
575 IOFFA = ( JJ - 1 ) * LDA
579 DO 230 LL = IIA, II-1
580 SUM = SUM + ABS( A( IOFFA+LL ) )
584 WORK( JJ+K-JJA+ICSR0 ) = SUM
585.EQ.
IF( MYROWICURROW )
591.EQ.
IF( MYROWICURROW )
598.EQ.
IF( MYROWICURROW ) THEN
599 DO 260 K = II, II+IB-1
601.EQ.
IF( MYCOLICURCOL ) THEN
602.GT.
IF( JJA+NQJJ ) THEN
603 SUM = ABS( DBLE( A( K+(JJ-1)*LDA ) ) )
604 DO 250 LL = JJ*LDA, (JJA+NQ-2)*LDA, LDA
605 SUM = SUM + ABS( A( K+LL ) )
609.GT.
IF( JJA+NQJJ ) THEN
610 DO 255 LL = (JJ-1)*LDA, (JJA+NQ-2)*LDA, LDA
611 SUM = SUM + ABS( A( K+LL ) )
615 WORK( K-IIA+IRSC0 ) = SUM
616.EQ.
IF( MYCOLICURCOL )
620.EQ.
ELSE IF( MYCOLICURCOL ) THEN
624 ICURROW = MOD( ICURROW+1, NPROW )
625 ICURCOL = MOD( ICURCOL+1, NPCOL )
637.EQ.
IF( MYCOLIACOL ) THEN
641.EQ.
IF( MYROWIAROW ) THEN
642.GT.
IF( IIA+NPII ) THEN
643 SUM = ABS( DBLE( A( IOFFA+II ) ) )
644 DO 280 LL = II+1, IIA+NP-1
645 SUM = SUM + ABS( A( IOFFA+LL ) )
649 DO 285 LL = II, IIA+NP-1
650 SUM = SUM + ABS( A( IOFFA+LL ) )
654 WORK( JJ+K-JJA+ICSR0 ) = SUM
668.EQ.
IF( MYROWIAROW ) THEN
669 DO 310 K = II, II+IB-1
672 DO 300 LL = (JJA-1)*LDA, (JJ-2)*LDA, LDA
673 SUM = SUM + ABS( A( K+LL ) )
676 WORK( K-IIA+IRSC0 ) = SUM
681.EQ.
ELSE IF( MYCOLIACOL ) THEN
685 ICURROW = MOD( IAROW+1, NPROW )
686 ICURCOL = MOD( IACOL+1, NPCOL )
690 DO 360 I = IN+1, IA+N-1, DESCA( MB_ )
691 IB = MIN( DESCA( MB_ ), IA+N-I )
695.EQ.
IF( MYCOLICURCOL ) THEN
696 IOFFA = ( JJ - 1 ) * LDA
699.EQ.
IF( MYROWICURROW ) THEN
700.GT.
IF( IIA+NPII ) THEN
701 SUM = ABS( DBLE( A( II+IOFFA ) ) )
702 DO 320 LL = II+1, IIA+NP-1
703 SUM = SUM + ABS( A( LL+IOFFA ) )
705.EQ.
ELSE IF( IIIIA+NP-1 ) THEN
706 SUM = ABS( DBLE( A( II+IOFFA ) ) )
709 DO 325 LL = II, IIA+NP-1
710 SUM = SUM + ABS( A( LL+IOFFA ) )
714 WORK( JJ+K-JJA+ICSR0 ) = SUM
715.EQ.
IF( MYROWICURROW )
721.EQ.
IF( MYROWICURROW )
728.EQ.
IF( MYROWICURROW ) THEN
729 DO 350 K = II, II+IB-1
732 DO 340 LL = (JJA-1)*LDA, (JJ-2)*LDA, LDA
733 SUM = SUM + ABS( A( K+LL ) )
736 WORK(K-IIA+IRSC0) = SUM
737.EQ.
IF( MYCOLICURCOL )
741.EQ.
ELSE IF( MYCOLICURCOL ) THEN
745 ICURROW = MOD( ICURROW+1, NPROW )
746 ICURCOL = MOD( ICURCOL+1, NPCOL )
758 CALL DGSUM2D( ICTXT, 'columnwise
', ' ', 1, NQ, WORK( ICSR ), 1,
762 CALL DGSUM2D( ICTXT, 'rowwise
', ' ', NP, 1, WORK( IRSC ),
763 $ MAX( 1, NP ), MYROW, IACOL )
765 CALL PDCOL2ROW( ICTXT, N, 1, DESCA( MB_ ), WORK( IRSC ),
766 $ MAX( 1, NP ), WORK( IRSR ), MAX( 1, NQ ),
767 $ IAROW, IACOL, IAROW, IACOL, WORK( IRSC+NP ) )
769.EQ.
IF( MYROWIAROW ) THEN
772 CALL DAXPY( NQ, ONE, WORK( IRSR0 ), 1, WORK( ICSR0 ), 1 )
776 VALUE = WORK( IDAMAX( NQ, WORK( ICSR0 ), 1 ) )
778 CALL DGAMX2D( ICTXT, 'rowwise
', ' ', 1, 1, VALUE, 1, I, K,
782 ELSE IF( LSAME( NORM, 'f.OR.
' ) LSAME( NORM, 'e
' ) ) THEN
791 IF( LSAME( UPLO, 'u
' ) ) THEN
797.EQ.
IF( MYCOLIACOL ) THEN
798 DO 370 K = (JJ-1)*LDA, (JJ+IB-2)*LDA, LDA
799 CALL ZLASSQ( II-IIA, A( IIA+K ), 1, SCALE, SUM )
800 CALL ZLASSQ( II-IIA, A( IIA+K ), 1, SCALE, SUM )
801.EQ.
IF( MYROWIAROW ) THEN
802.NE.
IF( DBLE( A( II+K ) )ZERO ) THEN
803 ABSA = ABS( DBLE( A( II+K ) ) )
804.LT.
IF( SCALEABSA ) THEN
805 SUM = ONE + SUM * ( SCALE / ABSA )**2
808 SUM = SUM + ( ABSA / SCALE )**2
816.EQ.
ELSE IF( MYROWIAROW ) THEN
820 ICURROW = MOD( IAROW+1, NPROW )
821 ICURCOL = MOD( IACOL+1, NPCOL )
825 DO 390 I = IN+1, IA+N-1, DESCA( MB_ )
826 IB = MIN( DESCA( MB_ ), IA+N-I )
828.EQ.
IF( MYCOLICURCOL ) THEN
829 DO 380 K = (JJ-1)*LDA, (JJ+IB-2)*LDA, LDA
830 CALL ZLASSQ( II-IIA, A( IIA+K ), 1, SCALE, SUM )
831 CALL ZLASSQ( II-IIA, A( IIA+K ), 1, SCALE, SUM )
832.EQ.
IF( MYROWICURROW ) THEN
833.NE.
IF( DBLE( A( II+K ) )ZERO ) THEN
834 ABSA = ABS( DBLE( A( II+K ) ) )
835.LT.
IF( SCALEABSA ) THEN
836 SUM = ONE + SUM * ( SCALE / ABSA )**2
839 SUM = SUM + ( ABSA / SCALE )**2
847.EQ.
ELSE IF( MYROWICURROW ) THEN
851 ICURROW = MOD( ICURROW+1, NPROW )
852 ICURCOL = MOD( ICURCOL+1, NPCOL )
862.EQ.
IF( MYCOLIACOL ) THEN
863 DO 400 K = (JJ-1)*LDA, (JJ+IB-2)*LDA, LDA
864.EQ.
IF( MYROWIAROW ) THEN
865.NE.
IF( DBLE( A( II+K ) )ZERO ) THEN
866 ABSA = ABS( DBLE( A( II+K ) ) )
867.LT.
IF( SCALEABSA ) THEN
868 SUM = ONE + SUM * ( SCALE / ABSA )**2
871 SUM = SUM + ( ABSA / SCALE )**2
876 CALL ZLASSQ( IIA+NP-II, A( II+K ), 1, SCALE, SUM )
877 CALL ZLASSQ( IIA+NP-II, A( II+K ), 1, SCALE, SUM )
881.EQ.
ELSE IF( MYROWIAROW ) THEN
885 ICURROW = MOD( IAROW+1, NPROW )
886 ICURCOL = MOD( IACOL+1, NPCOL )
890 DO 420 I = IN+1, IA+N-1, DESCA( MB_ )
891 IB = MIN( DESCA( MB_ ), IA+N-I )
893.EQ.
IF( MYCOLICURCOL ) THEN
894 DO 410 K = (JJ-1)*LDA, (JJ+IB-2)*LDA, LDA
895.EQ.
IF( MYROWICURROW ) THEN
896.NE.
IF( DBLE( A( II+K ) )ZERO ) THEN
897 ABSA = ABS( DBLE( A( II+K ) ) )
898.LT.
IF( SCALEABSA ) THEN
899 SUM = ONE + SUM * ( SCALE / ABSA )**2
902 SUM = SUM + ( ABSA / SCALE )**2
907 CALL ZLASSQ( IIA+NP-II, A( II+K ), 1, SCALE, SUM )
908 CALL ZLASSQ( IIA+NP-II, A( II+K ), 1, SCALE, SUM )
912.EQ.
ELSE IF( MYROWICURROW ) THEN
916 ICURROW = MOD( ICURROW+1, NPROW )
917 ICURCOL = MOD( ICURCOL+1, NPCOL )
928 CALL PDTREECOMB( ICTXT, 'all
', 2, RWORK, IAROW, IACOL,
930 VALUE = RWORK( 1 ) * SQRT( RWORK( 2 ) )
936.EQ..AND..EQ.
IF( MYROWIAROW MYCOLIACOL ) THEN
937 CALL DGEBS2D( ICTXT, 'all
', ' ', 1, 1, VALUE, 1 )
939 CALL DGEBR2D( ICTXT, 'all
', ' ', 1, 1, VALUE, 1, IAROW,
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
subroutine pdcol2row(ictxt, m, n, nb, vs, ldvs, vd, ldvd, rsrc, csrc, rdest, cdest, work)