3 IMPLICIT NONE
4
5
6
7
8
9
10
11 CHARACTER NORM, UPLO
12 INTEGER IA, JA, N
13
14
15 INTEGER DESCA( * )
16 REAL A( * ), WORK( * )
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
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 REAL ONE, ZERO
170 parameter( one = 1.0e+0, zero = 0.0e+0 )
171
172
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 REAL SUM, VALUE
178
179
180 REAL SSQ( 2 ), COLSSQ( 2 )
181
182
184 $ saxpy,
scombssq, sgamx2d, sgsum2d,
185 $ sgebr2d, sgebs2d, slassq
186
187
188 LOGICAL LSAME
189 INTEGER ICEIL, ISAMAX, NUMROC
191
192
193 INTRINSIC abs,
max,
min, mod, sqrt
194
195
196
197
198
199 ictxt = desca( ctxt_ )
200 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
201 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol,
202 $ iia, jja, iarow, iacol )
203
204 iroff = mod( ia-1, desca( mb_ ) )
205 icoff = mod( ja-1, desca( nb_ ) )
206 np =
numroc( n+iroff, desca( mb_ ), myrow, iarow, nprow )
207 nq =
numroc( n+icoff, desca( nb_ ), mycol, iacol, npcol )
208 icsr = 1
209 irsr = icsr + nq
210 irsc = irsr + nq
211 IF( myrow.EQ.iarow ) THEN
212 irsc0 = irsc + iroff
213 np = np - iroff
214 ELSE
215 irsc0 = irsc
216 END IF
217 IF( mycol.EQ.iacol ) THEN
218 icsr0 = icsr + icoff
219 irsr0 = irsr + icoff
220 nq = nq - icoff
221 ELSE
222 icsr0 = icsr
223 irsr0 = irsr
224 END IF
225 in =
min(
iceil( ia, desca( mb_ ) ) * desca( mb_ ), ia+n-1 )
226 lda = desca( lld_ )
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260 ii = iia
261 jj = jja
262
263 IF( n.EQ.0 ) THEN
264
265 VALUE = zero
266
267
268
269
270 ELSE IF(
lsame( norm,
'M' ) )
THEN
271
272
273
274 VALUE = zero
275
276 IF(
lsame( uplo,
'U' ) )
THEN
277
278
279
280 ib = in-ia+1
281
282
283
284 IF( mycol.EQ.iacol ) THEN
285 DO 20 k = (jj-1)*lda, (jj+ib-2)*lda, lda
286 IF( ii.GT.iia ) THEN
287 DO 10 ll = iia, ii-1
288 VALUE =
max(
VALUE, abs( a( ll+k ) ) )
289 10 CONTINUE
290 END IF
291 IF( myrow.EQ.iarow )
292 $ ii = ii + 1
293 20 CONTINUE
294
295
296
297 IF( myrow.EQ.iarow )
298 $ ii = ii - ib
299
300 END IF
301
302
303
304 IF( myrow.EQ.iarow ) THEN
305 DO 40 k = ii, ii+ib-1
306 IF( jj.LE.jja+nq-1 ) THEN
307 DO 30 ll = (jj-1)*lda, (jja+nq-2)*lda, lda
308 VALUE =
max(
VALUE, abs( a( k+ll ) ) )
309 30 CONTINUE
310 END IF
311 IF( mycol.EQ.iacol )
312 $ jj = jj + 1
313 40 CONTINUE
314 ii = ii + ib
315 ELSE IF( mycol.EQ.iacol ) THEN
316 jj = jj + ib
317 END IF
318
319 icurrow = mod( iarow+1, nprow )
320 icurcol = mod( iacol+1, npcol )
321
322
323
324 DO 90 i = in+1, ia+n-1, desca( mb_ )
325 ib =
min( desca( mb_ ), ia+n-i )
326
327
328
329 IF( mycol.EQ.icurcol ) THEN
330 DO 60 k = (jj-1)*lda, (jj+ib-2)*lda, lda
331 IF( ii.GT.iia ) THEN
332 DO 50 ll = iia, ii-1
333 VALUE =
max(
VALUE, abs( a( ll+k ) ) )
334 50 CONTINUE
335 END IF
336 IF( myrow.EQ.icurrow )
337 $ ii = ii + 1
338 60 CONTINUE
339
340
341
342 IF( myrow.EQ.icurrow )
343 $ ii = ii - ib
344 END IF
345
346
347
348 IF( myrow.EQ.icurrow ) THEN
349 DO 80 k = ii, ii+ib-1
350 IF( jj.LE.jja+nq-1 ) THEN
351 DO 70 ll = (jj-1)*lda, (jja+nq-2)*lda, lda
352 VALUE =
max(
VALUE, abs( a( k+ll ) ) )
353 70 CONTINUE
354 END IF
355 IF( mycol.EQ.icurcol )
356 $ jj = jj + 1
357 80 CONTINUE
358 ii = ii + ib
359 ELSE IF( mycol.EQ.icurcol ) THEN
360 jj = jj + ib
361 END IF
362 icurrow = mod( icurrow+1, nprow )
363 icurcol = mod( icurcol+1, npcol )
364 90 CONTINUE
365
366 ELSE
367
368
369
370 ib = in-ia+1
371
372
373
374 IF( mycol.EQ.iacol ) THEN
375 DO 110 k = (jj-1)*lda, (jj+ib-2)*lda, lda
376 IF( ii.LE.iia+np-1 ) THEN
377 DO 100 ll = ii, iia+np-1
378 VALUE =
max(
VALUE, abs( a( ll+k ) ) )
379 100 CONTINUE
380 END IF
381 IF( myrow.EQ.iarow )
382 $ ii = ii + 1
383 110 CONTINUE
384
385
386
387 IF( myrow.EQ.iarow )
388 $ ii = ii - ib
389 END IF
390
391
392
393 IF( myrow.EQ.iarow ) THEN
394 DO 130 k = 0, ib-1
395 IF( jj.GT.jja ) THEN
396 DO 120 ll = (jja-1)*lda, (jj-2)*lda, lda
397 VALUE =
max(
VALUE, abs( a( ii+ll ) ) )
398 120 CONTINUE
399 END IF
400 ii = ii + 1
401 IF( mycol.EQ.iacol )
402 $ jj = jj + 1
403 130 CONTINUE
404 ELSE IF( mycol.EQ.iacol ) THEN
405 jj = jj + ib
406 END IF
407
408 icurrow = mod( iarow+1, nprow )
409 icurcol = mod( iacol+1, npcol )
410
411
412
413 DO 180 i = in+1, ia+n-1, desca( mb_ )
414 ib =
min( desca( mb_ ), ia+n-i )
415
416
417
418 IF( mycol.EQ.icurcol ) THEN
419 DO 150 k = (jj-1)*lda, (jj+ib-2)*lda, lda
420 IF( ii.LE.iia+np-1 ) THEN
421 DO 140 ll = ii, iia+np-1
422 VALUE =
max(
VALUE, abs( a( ll+k ) ) )
423 140 CONTINUE
424 END IF
425 IF( myrow.EQ.icurrow )
426 $ ii = ii + 1
427 150 CONTINUE
428
429
430
431 IF( myrow.EQ.icurrow )
432 $ ii = ii - ib
433 END IF
434
435
436
437 IF( myrow.EQ.icurrow ) THEN
438 DO 170 k = 0, ib-1
439 IF( jj.GT.jja ) THEN
440 DO 160 ll = (jja-1)*lda, (jj-2)*lda, lda
441 VALUE =
max(
VALUE, abs( a( ii+ll ) ) )
442 160 CONTINUE
443 END IF
444 ii = ii + 1
445 IF( mycol.EQ.icurcol )
446 $ jj = jj + 1
447 170 CONTINUE
448 ELSE IF( mycol.EQ.icurcol ) THEN
449 jj = jj + ib
450 END IF
451 icurrow = mod( icurrow+1, nprow )
452 icurcol = mod( icurcol+1, npcol )
453
454 180 CONTINUE
455
456 END IF
457
458
459
460 CALL sgamx2d( ictxt, 'All', ' ', 1, 1, VALUE, 1, i, k, -1,
461 $ iarow, iacol )
462
463
464
465
466 ELSE IF(
lsame( norm,
'I' ) .OR.
lsame( norm,
'O' ) .OR.
467 $ norm.EQ.'1' ) THEN
468
469
470
471
472 IF(
lsame( uplo,
'U' ) )
THEN
473
474
475
476 ib = in-ia+1
477
478
479
480 IF( mycol.EQ.iacol ) THEN
481 ioffa = ( jj - 1 ) * lda
482 DO 200 k = 0, ib-1
483 sum = zero
484 IF( ii.GT.iia ) THEN
485 DO 190 ll = iia, ii-1
486 sum = sum + abs( a( ll+ioffa ) )
487 190 CONTINUE
488 END IF
489 ioffa = ioffa + lda
490 work( jj+k-jja+icsr0 ) = sum
491 IF( myrow.EQ.iarow )
492 $ ii = ii + 1
493 200 CONTINUE
494
495
496
497 IF( myrow.EQ.iarow )
498 $ ii = ii - ib
499
500 END IF
501
502
503
504 IF( myrow.EQ.iarow ) THEN
505 DO 220 k = ii, ii+ib-1
506 sum = zero
507 IF( jja+nq.GT.jj ) THEN
508 DO 210 ll = (jj-1)*lda, (jja+nq-2)*lda, lda
509 sum = sum + abs( a( k+ll ) )
510 210 CONTINUE
511 END IF
512 work( k-iia+irsc0 ) = sum
513 IF( mycol.EQ.iacol )
514 $ jj = jj + 1
515 220 CONTINUE
516 ii = ii + ib
517 ELSE IF( mycol.EQ.iacol ) THEN
518 jj = jj + ib
519 END IF
520
521 icurrow = mod( iarow+1, nprow )
522 icurcol = mod( iacol+1, npcol )
523
524
525
526 DO 270 i = in+1, ia+n-1, desca( mb_ )
527 ib =
min( desca( mb_ ), ia+n-i )
528
529
530
531 IF( mycol.EQ.icurcol ) THEN
532 ioffa = ( jj - 1 ) * lda
533 DO 240 k = 0, ib-1
534 sum = zero
535 IF( ii.GT.iia ) THEN
536 DO 230 ll = iia, ii-1
537 sum = sum + abs( a( ioffa+ll ) )
538 230 CONTINUE
539 END IF
540 ioffa = ioffa + lda
541 work( jj+k-jja+icsr0 ) = sum
542 IF( myrow.EQ.icurrow )
543 $ ii = ii + 1
544 240 CONTINUE
545
546
547
548 IF( myrow.EQ.icurrow )
549 $ ii = ii - ib
550
551 END IF
552
553
554
555 IF( myrow.EQ.icurrow ) THEN
556 DO 260 k = ii, ii+ib-1
557 sum = zero
558 IF( jja+nq.GT.jj ) THEN
559 DO 250 ll = (jj-1)*lda, (jja+nq-2)*lda, lda
560 sum = sum + abs( a( k+ll ) )
561 250 CONTINUE
562 END IF
563 work( k-iia+irsc0 ) = sum
564 IF( mycol.EQ.icurcol )
565 $ jj = jj + 1
566 260 CONTINUE
567 ii = ii + ib
568 ELSE IF( mycol.EQ.icurcol ) THEN
569 jj = jj + ib
570 END IF
571
572 icurrow = mod( icurrow+1, nprow )
573 icurcol = mod( icurcol+1, npcol )
574
575 270 CONTINUE
576
577 ELSE
578
579
580
581 ib = in-ia+1
582
583
584
585 IF( mycol.EQ.iacol ) THEN
586 ioffa = (jj-1)*lda
587 DO 290 k = 0, ib-1
588 sum = zero
589 IF( iia+np.GT.ii ) THEN
590 DO 280 ll = ii, iia+np-1
591 sum = sum + abs( a( ioffa+ll ) )
592 280 CONTINUE
593 END IF
594 ioffa = ioffa + lda
595 work( jj+k-jja+icsr0 ) = sum
596 IF( myrow.EQ.iarow )
597 $ ii = ii + 1
598 290 CONTINUE
599
600
601
602 IF( myrow.EQ.iarow )
603 $ ii = ii - ib
604
605 END IF
606
607
608
609 IF( myrow.EQ.iarow ) THEN
610 DO 310 k = ii, ii+ib-1
611 sum = zero
612 IF( jj.GT.jja ) THEN
613 DO 300 ll = (jja-1)*lda, (jj-2)*lda, lda
614 sum = sum + abs( a( k+ll ) )
615 300 CONTINUE
616 END IF
617 work( k-iia+irsc0 ) = sum
618 IF( mycol.EQ.iacol )
619 $ jj = jj + 1
620 310 CONTINUE
621 ii = ii + ib
622 ELSE IF( mycol.EQ.iacol ) THEN
623 jj = jj + ib
624 END IF
625
626 icurrow = mod( iarow+1, nprow )
627 icurcol = mod( iacol+1, npcol )
628
629
630
631 DO 360 i = in+1, ia+n-1, desca( mb_ )
632 ib =
min( desca( mb_ ), ia+n-i )
633
634
635
636 IF( mycol.EQ.icurcol ) THEN
637 ioffa = ( jj - 1 ) * lda
638 DO 330 k = 0, ib-1
639 sum = zero
640 IF( iia+np.GT.ii ) THEN
641 DO 320 ll = ii, iia+np-1
642 sum = sum + abs( a( ll+ioffa ) )
643 320 CONTINUE
644 END IF
645 ioffa = ioffa + lda
646 work( jj+k-jja+icsr0 ) = sum
647 IF( myrow.EQ.icurrow )
648 $ ii = ii + 1
649 330 CONTINUE
650
651
652
653 IF( myrow.EQ.icurrow )
654 $ ii = ii - ib
655
656 END IF
657
658
659
660 IF( myrow.EQ.icurrow ) THEN
661 DO 350 k = ii, ii+ib-1
662 sum = zero
663 IF( jj.GT.jja ) THEN
664 DO 340 ll = (jja-1)*lda, (jj-2)*lda, lda
665 sum = sum + abs( a( k+ll ) )
666 340 CONTINUE
667 END IF
668 work(k-iia+irsc0) = sum
669 IF( mycol.EQ.icurcol )
670 $ jj = jj + 1
671 350 CONTINUE
672 ii = ii + ib
673 ELSE IF( mycol.EQ.icurcol ) THEN
674 jj = jj + ib
675 END IF
676
677 icurrow = mod( icurrow+1, nprow )
678 icurcol = mod( icurcol+1, npcol )
679
680 360 CONTINUE
681 END IF
682
683
684
685
686
687
688 IF( mycol.EQ.iacol )
689 $ nq = nq + icoff
690 CALL sgsum2d( ictxt, 'Columnwise', ' ', 1, nq, work( icsr ), 1,
691 $ iarow, mycol )
692 IF( myrow.EQ.iarow )
693 $ np = np + iroff
694 CALL sgsum2d( ictxt, 'Rowwise', ' ', np, 1, work( irsc ),
695 $
max( 1, np ), myrow, iacol )
696
697 CALL pscol2row( ictxt, n, 1, desca( mb_ ), work( irsc ),
698 $
max( 1, np ), work( irsr ),
max( 1, nq ),
699 $ iarow, iacol, iarow, iacol, work( irsc+np ) )
700
701 IF( myrow.EQ.iarow ) THEN
702 IF( mycol.EQ.iacol )
703 $ nq = nq - icoff
704 CALL saxpy( nq, one, work( irsr0 ), 1, work( icsr0 ), 1 )
705 IF( nq.LT.1 ) THEN
706 VALUE = zero
707 ELSE
708 VALUE = work( isamax( nq, work( icsr0 ), 1 ) )
709 END IF
710 CALL sgamx2d( ictxt, 'Rowwise', ' ', 1, 1, VALUE, 1, i, k,
711 $ -1, iarow, iacol )
712 END IF
713
714
715
716
717
718
719 ELSE IF(
lsame( norm,
'F' ) .OR.
lsame( norm,
'E' ) )
THEN
720
721
722
723 ssq(1) = zero
724 ssq(2) = one
725
726
727
728 IF(
lsame( uplo,
'U' ) )
THEN
729
730
731
732 ib = in-ia+1
733
734 IF( mycol.EQ.iacol ) THEN
735 DO 370 k = (jj-1)*lda, (jj+ib-2)*lda, lda
736 colssq(1) = zero
737 colssq(2) = one
738 CALL slassq( ii-iia, a( iia+k ), 1,
739 $ colssq(1), colssq(2) )
740 IF( myrow.EQ.iarow )
741 $ ii = ii + 1
742 CALL slassq( ii-iia, a( iia+k ), 1,
743 $ colssq(1), colssq(2) )
745 370 CONTINUE
746
747 jj = jj + ib
748 ELSE IF( myrow.EQ.iarow ) THEN
749 ii = ii + ib
750 END IF
751
752 icurrow = mod( iarow+1, nprow )
753 icurcol = mod( iacol+1, npcol )
754
755
756
757 DO 390 i = in+1, ia+n-1, desca( mb_ )
758 ib =
min( desca( mb_ ), ia+n-i )
759
760 IF( mycol.EQ.icurcol ) THEN
761 DO 380 k = (jj-1)*lda, (jj+ib-2)*lda, lda
762 colssq(1) = zero
763 colssq(2) = one
764 CALL slassq( ii-iia, a( iia+k ), 1,
765 $ colssq(1), colssq(2) )
766 IF( myrow.EQ.icurrow )
767 $ ii = ii + 1
768 CALL slassq( ii-iia, a(iia+k ), 1,
769 $ colssq(1), colssq(2) )
771 380 CONTINUE
772
773 jj = jj + ib
774 ELSE IF( myrow.EQ.icurrow ) THEN
775 ii = ii + ib
776 END IF
777
778 icurrow = mod( icurrow+1, nprow )
779 icurcol = mod( icurcol+1, npcol )
780
781 390 CONTINUE
782
783 ELSE
784
785
786
787 ib = in-ia+1
788
789 IF( mycol.EQ.iacol ) THEN
790 DO 400 k = (jj-1)*lda, (jj+ib-2)*lda, lda
791 colssq(1) = zero
792 colssq(2) = one
793 CALL slassq( iia+np-ii, a( ii+k ), 1,
794 $ colssq(1), colssq(2) )
795 IF( myrow.EQ.iarow )
796 $ ii = ii + 1
797 CALL slassq( iia+np-ii, a( ii+k ), 1,
798 $ colssq(1), colssq(2) )
800 400 CONTINUE
801
802 jj = jj + ib
803 ELSE IF( myrow.EQ.iarow ) THEN
804 ii = ii + ib
805 END IF
806
807 icurrow = mod( iarow+1, nprow )
808 icurcol = mod( iacol+1, npcol )
809
810
811
812 DO 420 i = in+1, ia+n-1, desca( mb_ )
813 ib =
min( desca( mb_ ), ia+n-i )
814
815 IF( mycol.EQ.icurcol ) THEN
816 DO 410 k = (jj-1)*lda, (jj+ib-2)*lda, lda
817 colssq(1) = zero
818 colssq(2) = one
819 CALL slassq( iia+np-ii, a( ii+k ), 1,
820 $ colssq(1), colssq(2) )
821 IF( myrow.EQ.icurrow )
822 $ ii = ii + 1
823 CALL slassq( iia+np-ii, a( ii+k ), 1,
824 $ colssq(1), colssq(2) )
826 410 CONTINUE
827
828 jj = jj + ib
829 ELSE IF( myrow.EQ.icurrow ) THEN
830 ii = ii + ib
831 END IF
832
833 icurrow = mod( icurrow+1, nprow )
834 icurcol = mod( icurcol+1, npcol )
835
836 420 CONTINUE
837
838 END IF
839
840
841
842 CALL pstreecomb( ictxt,
'All', 2, ssq, iarow, iacol,
844 VALUE = ssq( 1 ) * sqrt( ssq( 2 ) )
845
846 END IF
847
848
849
850 IF( myrow.EQ.iarow .AND. mycol.EQ.iacol ) THEN
851 CALL sgebs2d( ictxt, 'All', ' ', 1, 1, VALUE, 1 )
852 ELSE
853 CALL sgebr2d( ictxt, 'All', ' ', 1, 1, VALUE, 1, iarow,
854 $ iacol )
855 END IF
856
858
859 RETURN
860
861
862
integer function iceil(inum, idenom)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pscol2row(ictxt, m, n, nb, vs, ldvs, vd, ldvd, rsrc, csrc, rdest, cdest, work)
real function pslansy(norm, uplo, n, a, ia, ja, desca, work)
subroutine pstreecomb(ictxt, scope, n, mine, rdest0, cdest0, subptr)
subroutine scombssq(v1, v2)