1 DOUBLE PRECISION FUNCTION pzlanhs( NORM, N, A, IA, JA, DESCA,
15DOUBLE PRECISION work( * )
143 INTEGER block_cyclic_2d, csrc_, ctxt_, dlen_, dtype_,
144 $ lld_, mb_, m_, nb_, n_, rsrc_
145 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
146 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
147 $ rsrc_ = 7, csrc_ = 8,
148 DOUBLE PRECISION one, zero
149 parameter( one = 1.0d+0, zero = 0.0d+0 )
152 INTEGER iacol, iarow, ictxt, ii, iia, icoff, inxtrow,
153 $ ioffa, iroff, j, jb, jj, jja, jn, kk, lda, ll,
154 $ mycol, myrow, np, npcol, nprow, nq
155 DOUBLE PRECISION scale, sum, value
158 DOUBLE PRECISION rwork( 2 )
171 INTRINSIC abs,
max,
min, mod, sqrt
177 ictxt = desca( ctxt_ )
180 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
182 iroff = mod( ia-1, desca( mb_ ) )
183 icoff = mod( ja-1, desca( nb_ ) )
184 np =
numroc( n+iroff, desca( mb_ ), myrow, iarow, nprow )
185 nq =
numroc( n+icoff, desca( nb_ ), mycol, iacol, npcol )
191 ioffa = ( jja - 1 ) * lda
205 jn =
min(
iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
210 IF( nprow.EQ.1 )
THEN
214 IF( mycol.EQ.iacol )
THEN
215 DO 20 ll = jj, jj+jb-1
216 DO 10 kk = iia,
min( ii+ll-jj+1, iia+np-1 )
217 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
224 iacol = mod( iacol+1, npcol )
228 DO 50 j = jn+1, ja+n-1, desca( nb_ )
229 jb =
min( ja+n-j, desca( nb_ ) )
231 IF( mycol.EQ.iacol )
THEN
232 DO 40 ll = jj, jj+jb-1
233 DO 30 kk = iia,
min( ii+ll-jj+1, iia+np-1 )
234 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
242 iacol = mod( iacol+1, npcol )
250 inxtrow = mod( iarow+1, nprow )
251 IF( mycol.EQ.iacol )
THEN
252 IF( myrow.EQ.iarow )
THEN
253 DO 70 ll = jj, jj + jb -1
254 DO 60 kk = iia,
min( ii+ll-jj+1, iia+np-1 )
255 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
260 DO 90 ll = jj, jj+jb-1
261 DO 80 kk = iia,
min( ii-1, iia+np-1 )
262 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
266 IF( myrow.EQ.inxtrow .AND. ii.LE.iia+np-1 )
267 $
VALUE =
max(
VALUE, abs( a( ii+(jj+jb-2)*lda ) ) )
275 iarow = mod( iarow+1, nprow )
276 iacol = mod( iacol+1, npcol )
280 DO 140 j = jn+1, ja+n-1, desca( nb_ )
281 jb =
min( ja+n-j, desca( nb_ ) )
283 IF( mycol.EQ.iacol )
THEN
284 IF( myrow.EQ.iarow )
THEN
285 DO 110 ll = jj, jj + jb -1
286 DO 100 kk = iia,
min( ii+ll-jj+1, iia+np-1 )
287 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
292 DO 130 ll = jj, jj + jb -1
293 DO 120 kk = iia,
min( ii-1, iia+np-1 )
294 VALUE =
max(
VALUE, abs( a( ioffa+kk ) ) )
298 IF( myrow.EQ.inxtrow .AND. ii.LE.iia+np-1 )
299 $
VALUE =
max(
VALUE,
300 $ abs( a( ii+(jj+jb-2)*lda ) ) )
308 iarow = mod( iarow+1, nprow )
309 iacol = mod( iacol+1, npcol )
317 CALL dgamx2d( ictxt,
'All',
' ', 1, 1,
VALUE, 1, kk, ll, -1,
325 jn =
min(
iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
330 IF( nprow.EQ.1 )
THEN
334 IF( mycol.EQ.iacol )
THEN
335 DO 160 ll = jj, jj+jb-1
337 DO 150 kk = iia,
min( ii+ll-jj+1, iia+np-1 )
338 sum = sum + abs( a( ioffa+kk ) )
341 work( ll-jja+1 ) = sum
346 iacol = mod( iacol+1, npcol )
350 DO 190 j = jn+1, ja+n-1, desca( nb_ )
351 jb =
min( ja+n-j, desca( nb_ ) )
353 IF( mycol.EQ.iacol )
THEN
354 DO 180 ll = jj, jj+jb-1
356 DO 170 kk = iia,
min( ii+ll-jj+1, iia+np-1 )
357 sum = sum + abs( a( ioffa+kk ) )
360 work( ll-jja+1 ) = sum
366 iacol = mod( iacol+1, npcol )
374 inxtrow = mod( iarow+1, nprow )
375 IF( mycol.EQ.iacol )
THEN
376 IF( myrow.EQ.iarow )
THEN
377 DO 210 ll = jj, jj + jb -1
379 DO 200 kk = iia,
min( ii+ll-jj+1, iia+np-1 )
380 sum = sum + abs( a( ioffa+kk ) )
383 work( ll-jja+1 ) = sum
386 DO 230 ll = jj, jj + jb -1
388 DO 220 kk = iia,
min( ii-1, iia+np-1 )
389 sum = sum + abs( a( ioffa+kk ) )
392 work( ll-jja+1 ) = sum
394 IF( myrow.EQ.inxtrow .AND. ii.LE.iia+np-1 )
395 $ work( jj+jb-jja ) = work( jj+jb-jja ) +
396 $ abs( a( ii+(jj+jb-2)*lda ) )
404 iarow = mod( iarow+1, nprow )
405 iacol = mod( iacol+1, npcol )
409 DO 280 j = jn+1, ja+n-1, desca( nb_ )
410 jb =
min( ja+n-j, desca( nb_ ) )
412 IF( mycol.EQ.iacol )
THEN
413 IF( myrow.EQ.iarow )
THEN
414 DO 250 ll = jj, jj + jb -1
416 DO 240 kk = iia,
min( ii+ll-jj+1, iia+np-1 )
417 sum = sum + abs( a( ioffa+kk ) )
420 work( ll-jja+1 ) = sum
423 DO 270 ll = jj, jj + jb -1
425 DO 260 kk = iia,
min( ii-1, iia+np-1 )
426 sum = sum + abs( a( ioffa+kk ) )
429 work( ll-jja+1 ) = sum
431 IF( myrow.EQ.inxtrow .AND. ii.LE.iia+np-1 )
432 $ work( jj+jb-jja ) = work( jj+jb-jja ) +
433 $ abs( a( ii+(jj+jb-2)*lda ) )
441 iarow = mod( iarow+1, nprow )
442 iacol = mod( iacol+1, npcol )
451 CALL dgsum2d( ictxt,
'Columnwise',
' ', 1, nq, work, 1,
456 IF( myrow.EQ.0 )
THEN
458 VALUE = work(
idamax( nq, work, 1 ) )
462 CALL dgamx2d( ictxt,
'Rowwise', '
', 1, 1, VALUE, 1, KK, LL,
466 ELSE IF( LSAME( NORM, 'i
' ) ) THEN
468 DO 290 KK = IIA, IIA+NP-1
474 JN = MIN( ICEIL( JA, DESCA( NB_ ) ) * DESCA( NB_ ), JA+N-1 )
479.EQ.
IF( NPROW1 ) THEN
483.EQ.
IF( MYCOLIACOL ) THEN
484 DO 310 LL = JJ, JJ+JB-1
485 DO 300 KK = IIA, MIN( II+LL-JJ+1, IIA+NP-1 )
486 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) +
487 $ ABS( A( IOFFA+KK ) )
494 IACOL = MOD( IACOL+1, NPCOL )
498 DO 340 J = JN+1, JA+N-1, DESCA( NB_ )
499 JB = MIN( JA+N-J, DESCA( NB_ ) )
501.EQ.
IF( MYCOLIACOL ) THEN
502 DO 330 LL = JJ, JJ+JB-1
503 DO 320 KK = IIA, MIN( II+LL-JJ+1, IIA+NP-1 )
504 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) +
505 $ ABS( A( IOFFA+KK ) )
513 IACOL = MOD( IACOL+1, NPCOL )
521 INXTROW = MOD( IAROW+1, NPROW )
522.EQ.
IF( MYCOLIACOL ) THEN
523.EQ.
IF( MYROWIAROW ) THEN
524 DO 360 LL = JJ, JJ + JB -1
525 DO 350 KK = IIA, MIN( II+LL-JJ+1, IIA+NP-1 )
526 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) +
527 $ ABS( A( IOFFA+KK ) )
532 DO 380 LL = JJ, JJ + JB -1
533 DO 370 KK = IIA, MIN( II-1, IIA+NP-1 )
534 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) +
535 $ ABS( A( IOFFA+KK ) )
539.EQ..AND..LE.
IF( MYROWINXTROW IIIIA+NP-1 )
540 $ WORK( II-IIA+1 ) = WORK( II-IIA+1 ) +
541 $ ABS( A( II+(JJ+JB-2)*LDA ) )
549 IAROW = MOD( IAROW+1, NPROW )
550 IACOL = MOD( IACOL+1, NPCOL )
554 DO 430 J = JN+1, JA+N-1, DESCA( NB_ )
555 JB = MIN( JA+N-J, DESCA( NB_ ) )
557.EQ.
IF( MYCOLIACOL ) THEN
558.EQ.
IF( MYROWIAROW ) THEN
559 DO 400 LL = JJ, JJ + JB -1
560 DO 390 KK = IIA, MIN( II+LL-JJ+1, IIA+NP-1 )
561 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) +
562 $ ABS( A( IOFFA+KK ) )
567 DO 420 LL = JJ, JJ + JB -1
568 DO 410 KK = IIA, MIN( II-1, IIA+NP-1 )
569 WORK( KK-IIA+1 ) = WORK( KK-IIA+1 ) +
574.EQ..AND..LE.
IF( MYROWINXTROW IIIIA+NP-1 )
575 $ WORK( II-IIA+1 ) = WORK( II-IIA+1 ) +
576 $ ABS( A( II+(JJ+JB-2)*LDA ) )
584 IAROW = MOD( IAROW+1, NPROW )
585 IACOL = MOD( IACOL+1, NPCOL )
594 CALL DGSUM2D( ICTXT, 'rowwise
', ' ', NP, 1, WORK, MAX( 1, NP ),
599.EQ.
IF( MYCOL0 ) THEN
601 VALUE = WORK( IDAMAX( NP, WORK, 1 ) )
605 CALL DGAMX2D( ICTXT, 'columnwise
', ' ', 1, 1, VALUE, 1, KK,
609 ELSE IF( LSAME( NORM, 'f.OR.
' ) LSAME( NORM, 'e
' ) ) THEN
615 JN = MIN( ICEIL( JA, DESCA( NB_ ) ) * DESCA( NB_ ), JA+N-1 )
620.EQ.
IF( NPROW1 ) THEN
624.EQ.
IF( MYCOLIACOL ) THEN
625 DO 440 LL = JJ, JJ+JB-1
626 CALL ZLASSQ( MIN( II+LL-JJ+1, IIA+NP-1 )-IIA+1,
627 $ A( IIA+IOFFA ), 1, SCALE, SUM )
633 IACOL = MOD( IACOL+1, NPCOL )
637 DO 460 J = JN+1, JA+N-1, DESCA( NB_ )
638 JB = MIN( JA+N-J, DESCA( NB_ ) )
640.EQ.
IF( MYCOLIACOL ) THEN
641 DO 450 LL = JJ, JJ+JB-1
642 CALL ZLASSQ( MIN( II+LL-JJ+1, IIA+NP-1 )-IIA+1,
643 $ A( IIA+IOFFA ), 1, SCALE, SUM )
650 IACOL = MOD( IACOL+1, NPCOL )
658 INXTROW = MOD( IAROW+1, NPROW )
659.EQ.
IF( MYCOLIACOL ) THEN
660.EQ.
IF( MYROWIAROW ) THEN
661 DO 470 LL = JJ, JJ + JB -1
662 CALL ZLASSQ( MIN( II+LL-JJ+1, IIA+NP-1 )-IIA+1,
663 $ A( IIA+IOFFA ), 1, SCALE, SUM )
667 DO 480 LL = JJ, JJ + JB -1
668 CALL ZLASSQ( MIN( II-1, IIA+NP-1 )-IIA+1,
669 $ A( IIA+IOFFA ), 1, SCALE, SUM )
672.EQ..AND..LE.
IF( MYROWINXTROW IIIIA+NP-1 )
673 $ CALL ZLASSQ( 1, A( II+(JJ+JB-2)*LDA ), 1,
682 IAROW = MOD( IAROW+1, NPROW )
683 IACOL = MOD( IACOL+1, NPCOL )
687 DO 510 J = JN+1, JA+N-1, DESCA( NB_ )
688 JB = MIN( JA+N-J, DESCA( NB_ ) )
690.EQ.
IF( MYCOLIACOL ) THEN
691.EQ.
IF( MYROWIAROW ) THEN
692 DO 490 LL = JJ, JJ + JB -1
693 CALL ZLASSQ( MIN( II+LL-JJ+1, IIA+NP-1 )-IIA+1,
694 $ A( IIA+IOFFA ), 1, SCALE, SUM )
698 DO 500 LL = JJ, JJ + JB -1
699 CALL ZLASSQ( MIN( II-1, IIA+NP-1 )-IIA+1,
700 $ A( IIA+IOFFA ), 1, SCALE, SUM )
703.EQ..AND..LE.
IF( MYROWINXTROW IIIIA+NP-1 )
704 $ CALL ZLASSQ( 1, A( II+(JJ+JB-2)*LDA ), 1,
713 IAROW = MOD( IAROW+1, NPROW )
714 IACOL = MOD( IACOL+1, NPCOL )
724 CALL PDTREECOMB( ICTXT, 'all
', 2, RWORK, 0, 0, DCOMBSSQ )
725 VALUE = RWORK( 1 ) * SQRT( RWORK( 2 ) )
729.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
730 CALL DGEBS2D( ICTXT, 'all
', ' ', 1, 1, VALUE, 1 )
732 CALL DGEBR2D( ICTXT, 'all
', ' ', 1, 1, VALUE, 1, 0, 0 )