3
4
5
6
7
8
9
10 CHARACTER DIAG, NORMIN, TRANS, UPLO
11 INTEGER IA, INFO, IX, JA, JX, N
12 REAL SCALE
13
14
15 INTEGER DESCA( * ), DESCX( * )
16 REAL CNORM( * )
17 COMPLEX A( * ), X( * )
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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
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 REAL ZERO, HALF, ONE, TWO
256 parameter( zero = 0.0e+0, half = 0.5e+0, one = 1.0e+0,
257 $ two = 2.0e+0 )
258 COMPLEX CZERO, CONE
259 parameter( czero = ( 0.0e+0, 0.0e+0 ),
260 $ cone = ( 1.0e+0, 0.0e+0 ) )
261 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
262 $ MB_, NB_, RSRC_, CSRC_, LLD_
263 PARAMETER ( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
264 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
265 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
266
267
268 LOGICAL NOTRAN, NOUNIT, UPPER
269 INTEGER CONTXT, CSRC, I, ICOL, ICOLX, IMAX, IROW,
270 $ IROWX, ITMP1, ITMP1X, ITMP2, ITMP2X, J, JFIRST,
271 $ JINC, JLAST, LDA, LDX, MB, MYCOL, MYROW, NB,
272 $ NPCOL, NPROW, RSRC
273 REAL BIGNUM, GROW, REC, SMLNUM, TJJ, TMAX, TSCAL,
274 $ XBND, XJ
275 REAL XMAX( 1 )
276 COMPLEX CSUMJ, TJJS, USCAL, XJTMP, ZDUM
277
278
279 LOGICAL LSAME
280 INTEGER ISAMAX
281 REAL PSLAMCH
282 COMPLEX CLADIV
284
285
290
291
293
294
295 REAL CABS1, CABS2
296
297
298 cabs1( zdum ) = abs( real( zdum ) ) + abs( aimag( zdum ) )
299 cabs2( zdum ) = abs( real( zdum ) / 2.e0 ) +
300 $ abs( aimag( zdum ) / 2.e0 )
301
302
303
304 info = 0
305 upper =
lsame( uplo,
'U' )
306 notran =
lsame( trans,
'N' )
307 nounit =
lsame( diag,
'N' )
308
309 contxt = desca( ctxt_ )
310 rsrc = desca( rsrc_ )
311 csrc = desca( csrc_ )
312 mb = desca( mb_ )
313 nb = desca( nb_ )
314 lda = desca( lld_ )
315 ldx = descx( lld_ )
316
317
318
319 IF( .NOT.upper .AND. .NOT.
lsame( uplo,
'L' ) )
THEN
320 info = -1
321 ELSE IF( .NOT.notran .AND. .NOT.
lsame( trans,
'T' ) .AND. .NOT.
322 $
lsame( trans,
'C' ) )
THEN
323 info = -2
324 ELSE IF( .NOT.nounit .AND. .NOT.
lsame( diag,
'U' ) )
THEN
325 info = -3
326 ELSE IF( .NOT.
lsame( normin,
'Y' ) .AND. .NOT.
327 $
lsame( normin,
'N' ) )
THEN
328 info = -4
329 ELSE IF( n.LT.0 ) THEN
330 info = -5
331 END IF
332
334
335 IF( info.NE.0 ) THEN
336 CALL pxerbla( contxt,
'PCLATTRS', -info )
337 RETURN
338 END IF
339
340
341
342 IF( n.EQ.0 )
343 $ RETURN
344
345
346
347 smlnum =
pslamch( contxt,
'Safe minimum' )
348 bignum = one / smlnum
349 CALL pslabad( contxt, smlnum, bignum )
350 smlnum = smlnum /
pslamch( contxt,
'Precision' )
351 bignum = one / smlnum
352 scale = one
353
354
355 IF(
lsame( normin,
'N' ) )
THEN
356
357
358
359 IF( upper ) THEN
360
361
362
363 cnorm( 1 ) = zero
364 DO 10 j = 2, n
365 CALL pscasum( j-1, cnorm( j ), a, ia, ja+j-1, desca, 1 )
366 10 CONTINUE
367 ELSE
368
369
370
371 DO 20 j = 1, n - 1
372 CALL pscasum( n-j, cnorm( j ), a, ia+j, ja+j-1, desca,
373 $ 1 )
374 20 CONTINUE
375 cnorm( n ) = zero
376 END IF
377 CALL sgsum2d( contxt, 'Row', ' ', n, 1, cnorm, 1, -1, -1 )
378 END IF
379
380
381
382
383 imax =
isamax( n, cnorm, 1 )
384 tmax = cnorm( imax )
385 IF( tmax.LE.bignum*half ) THEN
386 tscal = one
387 ELSE
388 tscal = half / ( smlnum*tmax )
389 CALL sscal( n, tscal, cnorm, 1 )
390 END IF
391
392
393
394
395 xmax( 1 ) = zero
396 CALL pcamax( n, zdum, imax, x, ix, jx, descx, 1 )
397 xmax( 1 ) = cabs2( zdum )
398 CALL sgsum2d( contxt, 'Row', ' ', 1, 1, xmax, 1, -1, -1 )
399 xbnd = xmax( 1 )
400
401 IF( notran ) THEN
402
403
404
405 IF( upper ) THEN
406 jfirst = n
407 jlast = 1
408 jinc = -1
409 ELSE
410 jfirst = 1
411 jlast = n
412 jinc = 1
413 END IF
414
415 IF( tscal.NE.one ) THEN
416 grow = zero
417 GO TO 50
418 END IF
419
420 IF( nounit ) THEN
421
422
423
424
425
426
427 grow = half /
max( xbnd, smlnum )
428 xbnd = grow
429 DO 30 j = jfirst, jlast, jinc
430
431
432
433 IF( grow.LE.smlnum )
434 $ GO TO 50
435
436
437 CALL infog2l( ia+j-1, ja+j-1, desca, nprow, npcol, myrow,
438 $ mycol, irow, icol, itmp1, itmp2 )
439 IF( ( myrow.EQ.itmp1 ) .AND. ( mycol.EQ.itmp2 ) ) THEN
440 tjjs = a( ( icol-1 )*lda+irow )
441 CALL cgebs2d( contxt,
'All',
' ', 1, 1, tjjs, 1 )
442 ELSE
443 CALL cgebr2d( contxt,
'All',
' ', 1, 1, tjjs, 1,
444 $ itmp1, itmp2 )
445 END IF
446 tjj = cabs1( tjjs )
447
448 IF( tjj.GE.smlnum ) THEN
449
450
451
452 xbnd =
min( xbnd,
min( one, tjj )*grow )
453 ELSE
454
455
456
457 xbnd = zero
458 END IF
459
460 IF( tjj+cnorm( j ).GE.smlnum ) THEN
461
462
463
464 grow = grow*( tjj / ( tjj+cnorm( j ) ) )
465 ELSE
466
467
468
469 grow = zero
470 END IF
471 30 CONTINUE
472 grow = xbnd
473 ELSE
474
475
476
477
478
479 grow =
min( one, half /
max( xbnd, smlnum ) )
480 DO 40 j = jfirst, jlast, jinc
481
482
483
484 IF( grow.LE.smlnum )
485 $ GO TO 50
486
487
488
489 grow = grow*( one / ( one+cnorm( j ) ) )
490 40 CONTINUE
491 END IF
492 50 CONTINUE
493
494 ELSE
495
496
497
498 IF( upper ) THEN
499 jfirst = 1
500 jlast = n
501 jinc = 1
502 ELSE
503 jfirst = n
504 jlast = 1
505 jinc = -1
506 END IF
507
508 IF( tscal.NE.one ) THEN
509 grow = zero
510 GO TO 80
511 END IF
512
513 IF( nounit ) THEN
514
515
516
517
518
519
520 grow = half /
max( xbnd, smlnum )
521 xbnd = grow
522 DO 60 j = jfirst, jlast, jinc
523
524
525
526 IF( grow.LE.smlnum )
527 $ GO TO 80
528
529
530
531 xj = one + cnorm( j )
532 grow =
min( grow, xbnd / xj )
533
534
535 CALL infog2l( ia+j-1, ja+j-1, desca, nprow, npcol, myrow,
536 $ mycol, irow, icol, itmp1, itmp2 )
537 IF( ( myrow.EQ.itmp1 ) .AND. ( mycol.EQ.itmp2 ) ) THEN
538 tjjs = a( ( icol-1 )*lda+irow )
539 CALL cgebs2d( contxt,
'All',
' ', 1, 1, tjjs, 1 )
540 ELSE
541 CALL cgebr2d( contxt,
'All',
' ', 1, 1, tjjs, 1,
542 $ itmp1, itmp2 )
543 END IF
544 tjj = cabs1( tjjs )
545
546 IF( tjj.GE.smlnum ) THEN
547
548
549
550 IF( xj.GT.tjj )
551 $ xbnd = xbnd*( tjj / xj )
552 ELSE
553
554
555
556 xbnd = zero
557 END IF
558 60 CONTINUE
559 grow =
min( grow, xbnd )
560 ELSE
561
562
563
564
565
566 grow =
min( one, half /
max( xbnd, smlnum ) )
567 DO 70 j = jfirst, jlast, jinc
568
569
570
571 IF( grow.LE.smlnum )
572 $ GO TO 80
573
574
575
576 xj = one + cnorm( j )
577 grow = grow / xj
578 70 CONTINUE
579 END IF
580 80 CONTINUE
581 END IF
582
583 IF( ( grow*tscal ).GT.smlnum ) THEN
584
585
586
587
588 CALL pctrsv( uplo, trans, diag, n, a, ia, ja, desca, x, ix, jx,
589 $ descx, 1 )
590 ELSE
591
592
593
594 IF( xmax( 1 ).GT.bignum*half ) THEN
595
596
597
598
599 scale = ( bignum*half ) / xmax( 1 )
600 CALL pcsscal( n, scale, x, ix, jx, descx, 1 )
601 xmax( 1 ) = bignum
602 ELSE
603 xmax( 1 ) = xmax( 1 )*two
604 END IF
605
606 IF( notran ) THEN
607
608
609
610 DO 100 j = jfirst, jlast, jinc
611
612
613
614
615 CALL infog2l( ix+j-1, jx, descx, nprow, npcol, myrow,
616 $ mycol, irowx, icolx, itmp1x, itmp2x )
617 IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) ) THEN
618 xjtmp = x( irowx )
619 CALL cgebs2d( contxt,
'All',
' ', 1, 1, xjtmp, 1 )
620 ELSE
621 CALL cgebr2d( contxt,
'All',
' ', 1, 1, xjtmp, 1,
622 $ itmp1x, itmp2x )
623 END IF
624 xj = cabs1( xjtmp )
625 IF( nounit ) THEN
626
627 CALL infog2l( ia+j-1, ja+j-1, desca, nprow, npcol,
628 $ myrow, mycol, irow, icol, itmp1, itmp2 )
629 IF( ( myrow.EQ.itmp1 ) .AND. ( mycol.EQ.itmp2 ) ) THEN
630 tjjs = a( ( icol-1 )*lda+irow )*tscal
631 CALL cgebs2d( contxt,
'All',
' ', 1, 1, tjjs, 1 )
632 ELSE
633 CALL cgebr2d( contxt,
'All',
' ', 1, 1, tjjs, 1,
634 $ itmp1, itmp2 )
635 END IF
636 ELSE
637 tjjs = tscal
638 IF
639 $ GO TO 90
640 END IF
641 tjj = cabs1( tjjs )
642 IF( tjj.GT.smlnum ) THEN
643
644
645
646 IF( tjj.LT.one ) THEN
647 IF( xj.GT.tjj*bignum ) THEN
648
649
650
651 rec = one / xj
652 CALL pcsscal( n, rec, x, ix, jx, descx, 1 )
653 xjtmp = xjtmp*rec
654 scale = scale*rec
655 xmax( 1 ) = xmax( 1 )*rec
656 END IF
657 END IF
658
659
660 xjtmp =
cladiv( xjtmp, tjjs )
661 xj = cabs1( xjtmp )
662 IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
663 $ THEN
664 x( irowx ) = xjtmp
665 END IF
666 ELSE IF( tjj.GT.zero ) THEN
667
668
669
670 IF( xj.GT.tjj*bignum ) THEN
671
672
673
674
675 rec = ( tjj*bignum ) / xj
676 IF( cnorm( j ).GT.one ) THEN
677
678
679
680
681 rec = rec / cnorm( j )
682 END IF
683 CALL pcsscal( n, rec, x, ix, jx, descx, 1 )
684 xjtmp = xjtmp*rec
685 scale = scale*rec
686 xmax( 1 ) = xmax( 1 )*rec
687 END IF
688
689
690 xjtmp =
cladiv( xjtmp, tjjs )
691 xj = cabs1( xjtmp )
692 IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
693 $ THEN
694 x( irowx ) = xjtmp
695 END IF
696 ELSE
697
698
699
700
701 CALL pclaset(
' ', n, 1, czero, czero, x, ix, jx,
702 $ descx )
703 IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
704 $ THEN
705 x( irowx ) = cone
706 END IF
707 xjtmp = cone
708 xj = one
709 scale = zero
710 xmax( 1 ) = zero
711 END IF
712 90 CONTINUE
713
714
715
716
717 IF( xj.GT.one ) THEN
718 rec = one / xj
719 IF( cnorm( j ).GT.( bignum-xmax( 1 ) )*rec ) THEN
720
721
722
723 rec = rec*half
724 CALL pcsscal( n, rec, x, ix, jx, descx, 1 )
725 xjtmp = xjtmp*rec
726 scale = scale*rec
727 END IF
728 ELSE IF( xj*cnorm( j ).GT.( bignum-xmax( 1 ) ) ) THEN
729
730
731
732 CALL pcsscal( n, half, x, ix, jx, descx, 1 )
733 xjtmp = xjtmp*half
734 scale = scale*half
735 END IF
736
737 IF( upper ) THEN
738 IF( j.GT.1 ) THEN
739
740
741
742
743 zdum = -xjtmp*tscal
744 CALL pcaxpy( j-1, zdum, a, ia, ja+j-1, desca, 1, x,
745 $ ix, jx, descx, 1 )
746 CALL pcamax( j-1, zdum, imax, x, ix, jx, descx, 1 )
747 xmax( 1 ) = cabs1( zdum )
748 CALL sgsum2d( contxt, 'Row', ' ', 1, 1, xmax, 1,
749 $ -1, -1 )
750 END IF
751 ELSE
752 IF( j.LT.n ) THEN
753
754
755
756
757 zdum = -xjtmp*tscal
758 CALL pcaxpy( n-j, zdum, a, ia+j, ja+j-1, desca, 1,
759 $ x, ix+j, jx, descx, 1 )
760 CALL pcamax( n-j, zdum, i, x, ix+j, jx, descx, 1 )
761 xmax( 1 ) = cabs1( zdum )
762 CALL sgsum2d( contxt, 'Row', ' ', 1, 1, xmax, 1,
763 $ -1, -1 )
764 END IF
765 END IF
766 100 CONTINUE
767
768 ELSE IF(
lsame( trans,
'T' ) )
THEN
769
770
771
772 DO 120 j = jfirst, jlast, jinc
773
774
775
776
777
778 CALL infog2l( ix+j-1, jx, descx, nprow, npcol, myrow,
779 $ mycol, irowx, icolx, itmp1x, itmp2x )
780 IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) ) THEN
781 xjtmp = x( irowx )
782 CALL cgebs2d( contxt,
'All',
' ', 1, 1, xjtmp, 1 )
783 ELSE
784 CALL cgebr2d( contxt,
'All',
' ', 1, 1, xjtmp, 1,
785 $ itmp1x, itmp2x )
786 END IF
787 xj = cabs1( xjtmp )
788 uscal =
cmplx( tscal )
789 rec = one /
max( xmax( 1 ), one )
790 IF( cnorm( j ).GT.( bignum-xj )*rec ) THEN
791
792
793
794 rec = rec*half
795 IF( nounit ) THEN
796
797 CALL infog2l( ia+j-1, ja+j-1, desca, nprow, npcol,
798 $ myrow, mycol, irow, icol, itmp1,
799 $ itmp2 )
800 IF( ( myrow.EQ.itmp1 ) .AND. ( mycol.EQ.itmp2 ) )
801 $ THEN
802 tjjs = a( ( icol-1 )*lda+irow )*tscal
803 CALL cgebs2d( contxt,
'All',
' ', 1, 1, tjjs,
804 $ 1 )
805 ELSE
806 CALL cgebr2d( contxt,
'All',
' ', 1, 1, tjjs, 1,
807 $ itmp1, itmp2 )
808 END IF
809 ELSE
810 tjjs = tscal
811 END IF
812 tjj = cabs1( tjjs )
813 IF( tjj.GT.one ) THEN
814
815
816
817 rec =
min( one, rec*tjj )
818 uscal =
cladiv( uscal, tjjs )
819 END IF
820 IF( rec.LT.one ) THEN
821 CALL pcsscal( n, rec, x, ix, jx, descx, 1 )
822 xjtmp = xjtmp*rec
823 scale = scale*rec
824 xmax( 1 ) = xmax( 1 )*rec
825 END IF
826 END IF
827
828 csumj = czero
829 IF( uscal.EQ.cone ) THEN
830
831
832
833
834 IF( upper ) THEN
835 CALL pcdotu( j-1, csumj, a, ia, ja+j-1, desca, 1,
836 $ x, ix, jx, descx, 1 )
837 ELSE IF( j.LT.n ) THEN
838 CALL pcdotu( n-j, csumj, a, ia+j, ja+j-1, desca, 1,
839 $ x, ix+j, jx, descx, 1 )
840 END IF
841 IF( mycol.EQ.itmp2x ) THEN
842 CALL cgebs2d( contxt,
'Row',
' ', 1, 1, csumj, 1 )
843 ELSE
844 CALL cgebr2d( contxt,
'Row',
' ', 1, 1, csumj, 1,
845 $ myrow, itmp2x )
846 END IF
847 ELSE
848
849
850
851
852 IF( upper ) THEN
853
854
855
856 zdum = conjg( uscal )
857 CALL pcscal( j-1, zdum, a, ia, ja+j-1, desca, 1 )
858 CALL pcdotu( j-1, csumj, a, ia, ja+j-1, desca, 1,
859 $ x, ix, jx, descx, 1 )
860 zdum =
cladiv( zdum, uscal )
861 CALL pcscal( j-1, zdum, a, ia, ja+j-1, desca, 1 )
862 ELSE IF( j.LT.n ) THEN
863
864
865
866 zdum = conjg( uscal )
867 CALL pcscal( n-j, zdum, a, ia+j, ja+j-1, desca, 1 )
868 CALL pcdotu( n-j, csumj, a, ia+j, ja+j-1, desca, 1,
869 $ x, ix+j, jx, descx, 1 )
870 zdum =
cladiv( zdum, uscal )
871 CALL pcscal( n-j, zdum, a, ia+j, ja+j-1, desca, 1 )
872 END IF
873 IF( mycol.EQ.itmp2x ) THEN
874 CALL cgebs2d( contxt,
'Row',
' ', 1, 1, csumj, 1 )
875 ELSE
876 CALL cgebr2d( contxt,
'Row',
' ', 1, 1, csumj, 1,
877 $ myrow, itmp2x )
878 END IF
879 END IF
880
881 IF( uscal.EQ.
cmplx( tscal ) )
THEN
882
883
884
885
886
887
888 xjtmp = xjtmp - csumj
889 xj = cabs1( xjtmp )
890
891
892 IF( nounit ) THEN
893
894 CALL infog2l( ia+j-1, ja+j-1, desca, nprow, npcol,
895 $ myrow, mycol, irow, icol, itmp1,
896 $ itmp2 )
897 IF( ( myrow.EQ.itmp1 ) .AND. ( mycol.EQ.itmp2 ) )
898 $ THEN
899 tjjs = a( ( icol-1 )*lda+irow )*tscal
900 CALL cgebs2d( contxt,
'All',
' ', 1, 1, tjjs,
901 $ 1 )
902 ELSE
903 CALL cgebr2d( contxt,
'All',
' ', 1, 1, tjjs, 1,
904 $ itmp1, itmp2 )
905 END IF
906 ELSE
907 tjjs = tscal
908 IF( tscal.EQ.one )
909 $ GO TO 110
910 END IF
911
912
913
914 tjj = cabs1( tjjs )
915 IF( tjj.GT.smlnum ) THEN
916
917
918
919 IF( tjj.LT.one ) THEN
920 IF( xj.GT.tjj*bignum ) THEN
921
922
923
924 rec = one / xj
925 CALL pcsscal( n, rec, x, ix, jx, descx, 1 )
926 xjtmp = xjtmp*rec
927 scale = scale*rec
928 xmax( 1 ) = xmax( 1 )*rec
929 END IF
930 END IF
931
932 xjtmp =
cladiv( xjtmp, tjjs )
933 IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
934 $ THEN
935 x( irowx ) = xjtmp
936 END IF
937 ELSE IF( tjj.GT.zero ) THEN
938
939
940
941 IF( xj.GT.tjj*bignum ) THEN
942
943
944
945 rec = ( tjj*bignum ) / xj
946 CALL pcsscal( n, rec, x, ix, jx, descx, 1 )
947 xjtmp = xjtmp*rec
948 scale = scale*rec
949 xmax( 1 ) = xmax( 1 )*rec
950 END IF
951
952 xjtmp =
cladiv( xjtmp, tjjs )
953 IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
954 $ THEN
955 x( irowx
956 END IF
957 ELSE
958
959
960
961
962 CALL pclaset(
' ', n, 1, czero, czero, x, ix, jx,
963 $ descx )
964 IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
965 $ THEN
966 x( irowx ) = cone
967 END IF
968 xjtmp = cone
969 scale = zero
970 xmax( 1 ) = zero
971 END IF
972 110 CONTINUE
973 ELSE
974
975
976
977
978
979 xjtmp =
cladiv( xjtmp, tjjs ) - csumj
980 IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
981 $ THEN
982 x( irowx ) = xjtmp
983 END IF
984 END IF
985 xmax( 1 ) =
max( xmax( 1 ), cabs1( xjtmp ) )
986 120 CONTINUE
987
988 ELSE
989
990
991
992 DO 140 j = jfirst, jlast, jinc
993
994
995
996
997 CALL infog2l( ix+j-1, jx, descx, nprow, npcol, myrow,
998 $ mycol, irowx, icolx, itmp1x, itmp2x )
999 IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) ) THEN
1000 xjtmp = x( irowx )
1001 CALL cgebs2d( contxt,
'All',
' ', 1, 1, xjtmp, 1 )
1002 ELSE
1003 CALL cgebr2d( contxt,
'All',
' ', 1, 1, xjtmp, 1,
1004 $ itmp1x, itmp2x )
1005 END IF
1006 xj = cabs1( xjtmp )
1007 uscal = tscal
1008 rec = one /
max( xmax( 1 ), one )
1009 IF( cnorm( j ).GT.( bignum-xj )*rec ) THEN
1010
1011
1012
1013 rec = rec*half
1014 IF( nounit ) THEN
1015
1016 CALL infog2l( ia+j-1, ja+j-1, desca, nprow, npcol,
1017 $ myrow, mycol, irow, icol, itmp1,
1018 $ itmp2 )
1019 IF( ( myrow.EQ.itmp1 ) .AND. ( mycol.EQ.itmp2 ) )
1020 $ THEN
1021 tjjs = conjg( a( ( icol-1 )*lda+irow ) )*tscal
1022 CALL cgebs2d( contxt,
'All',
' ', 1, 1, tjjs,
1023 $ 1 )
1024 ELSE
1025 CALL cgebr2d( contxt,
'All',
' ', 1, 1, tjjs, 1,
1026 $ itmp1, itmp2 )
1027 END IF
1028 ELSE
1029 tjjs = tscal
1030 END IF
1031 tjj = cabs1( tjjs )
1032 IF( tjj.GT.one ) THEN
1033
1034
1035
1036 rec =
min( one, rec*tjj )
1037 uscal =
cladiv( uscal, tjjs )
1038 END IF
1039 IF( rec.LT.one ) THEN
1040 CALL pcsscal( n, rec, x, ix, jx, descx, 1 )
1041 xjtmp = xjtmp*rec
1042 scale = scale*rec
1043 xmax( 1 ) = xmax( 1 )*rec
1044 END IF
1045 END IF
1046
1047 csumj = czero
1048 IF( uscal.EQ.cone ) THEN
1049
1050
1051
1052
1053 IF( upper ) THEN
1054 CALL pcdotc( j-1, csumj, a, ia, ja+j-1, desca, 1,
1055 $ x, ix, jx, descx, 1 )
1056 ELSE IF( j.LT.n ) THEN
1057 CALL pcdotc( n-j, csumj, a, ia+j, ja+j-1, desca, 1,
1058 $ x, ix+j, jx, descx, 1 )
1059 END IF
1060 IF( mycol.EQ.itmp2x ) THEN
1061 CALL cgebs2d( contxt,
'Row',
' ', 1, 1, csumj, 1 )
1062 ELSE
1063 CALL cgebr2d( contxt,
'Row',
' ', 1, 1, csumj, 1,
1064 $ myrow, itmp2x )
1065 END IF
1066 ELSE
1067
1068
1069
1070
1071 IF( upper ) THEN
1072
1073
1074
1075
1076 zdum = conjg( uscal )
1077 CALL pcscal( j-1, zdum, a, ia, ja+j-1, desca, 1 )
1078 CALL pcdotc( j-1, csumj, a, ia, ja+j-1, desca, 1,
1079 $ x, ix, jx, descx, 1 )
1080 zdum =
cladiv( cone, zdum )
1081 CALL pcscal( j-1, zdum, a, ia, ja+j-1, desca, 1 )
1082 ELSE IF( j.LT.n ) THEN
1083
1084
1085
1086
1087 zdum = conjg( uscal )
1088 CALL pcscal( n-j, zdum, a, ia+j, ja+j-1, desca, 1 )
1089 CALL pcdotc( n-j, csumj, a, ia+j, ja+j-1, desca, 1,
1090 $ x, ix+j, jx, descx, 1 )
1091 zdum =
cladiv( cone, zdum )
1092 CALL pcscal( n-j, zdum, a, ia+j, ja+j-1, desca, 1 )
1093 END IF
1094 IF( mycol.EQ.itmp2x ) THEN
1095 CALL cgebs2d( contxt,
'Row',
' ', 1, 1, csumj, 1 )
1096 ELSE
1097 CALL cgebr2d( contxt,
'Row',
' ', 1, 1, csumj, 1,
1098 $ myrow, itmp2x )
1099 END IF
1100 END IF
1101
1102 IF( uscal.EQ.
cmplx( tscal ) )
THEN
1103
1104
1105
1106
1107
1108
1109 xjtmp = xjtmp - csumj
1110 xj = cabs1( xjtmp )
1111
1112
1113 IF( nounit ) THEN
1114
1115 CALL infog2l( ia+j-1, ja+j-1, desca, nprow, npcol,
1116 $ myrow, mycol, irow, icol, itmp1,
1117 $ itmp2 )
1118 IF( ( myrow.EQ.itmp1 ) .AND. ( mycol.EQ.itmp2 ) )
1119 $ THEN
1120 tjjs = conjg( a( ( icol-1 )*lda+irow ) )*tscal
1121 CALL cgebs2d( contxt,
'All',
' ', 1, 1, tjjs,
1122 $ 1 )
1123 ELSE
1124 CALL cgebr2d( contxt,
'All',
' ', 1, 1, tjjs, 1,
1125 $ itmp1, itmp2 )
1126 END IF
1127 ELSE
1128 tjjs = tscal
1129 IF( tscal.EQ.one )
1130 $ GO TO 130
1131 END IF
1132
1133
1134
1135 tjj = cabs1( tjjs )
1136 IF( tjj.GT.smlnum ) THEN
1137
1138
1139
1140 IF( tjj.LT.one ) THEN
1141 IF( xj.GT.tjj*bignum ) THEN
1142
1143
1144
1145 rec = one / xj
1146 CALL pcsscal( n, rec, x, ix, jx, descx, 1 )
1147 xjtmp = xjtmp*rec
1148 scale = scale*rec
1149 xmax( 1 ) = xmax( 1 )*rec
1150 END IF
1151 END IF
1152
1153 xjtmp =
cladiv( xjtmp, tjjs )
1154 IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
1155 $ x( irowx ) = xjtmp
1156 ELSE IF( tjj.GT.zero ) THEN
1157
1158
1159
1160 IF( xj.GT.tjj*bignum ) THEN
1161
1162
1163
1164 rec = ( tjj*bignum ) / xj
1165 CALL pcsscal( n, rec, x, ix, jx, descx, 1 )
1166 xjtmp = xjtmp*rec
1167 scale = scale*rec
1168 xmax( 1 ) = xmax( 1 )*rec
1169 END IF
1170
1171 xjtmp =
cladiv( xjtmp, tjjs )
1172 IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
1173 $ x( irowx ) = xjtmp
1174 ELSE
1175
1176
1177
1178
1179 CALL pclaset(
' ', n, 1, czero, czero, x, ix, jx,
1180 $ descx )
1181 IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
1182 $ x( irowx ) = cone
1183 xjtmp = cone
1184 scale = zero
1185 xmax( 1 ) = zero
1186 END IF
1187 130 CONTINUE
1188 ELSE
1189
1190
1191
1192
1193
1194 xjtmp =
cladiv( xjtmp, tjjs ) - csumj
1195 IF( ( myrow.EQ.itmp1x ) .AND. ( mycol.EQ.itmp2x ) )
1196 $ x( irowx ) = xjtmp
1197 END IF
1198 xmax( 1 ) =
max( xmax( 1 ), cabs1( xjtmp ) )
1199 140 CONTINUE
1200 END IF
1201 scale = scale / tscal
1202 END IF
1203
1204
1205
1206 IF( tscal.NE.one ) THEN
1207 CALL sscal( n, one / tscal, cnorm, 1 )
1208 END IF
1209
1210 RETURN
1211
1212
1213
logical function lsame(ca, cb)
LSAME
integer function isamax(n, sx, incx)
ISAMAX
complex function cladiv(x, y)
CLADIV performs complex division in real arithmetic, avoiding unnecessary overflow.
subroutine sscal(n, sa, sx, incx)
SSCAL
subroutine cgebs2d(contxt, scope, top, m, n, a, lda)
subroutine pcscal(n, alpha, x, ix, jx, descx, incx)
subroutine pxerbla(contxt, srname, info)
subroutine cgebr2d(contxt, scope, top, m, n, a, lda)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
subroutine pcaxpy(n, a, x, ix, jx, descx, incx, y, iy, jy, descy, incy)
subroutine blacs_gridinfo(cntxt, nprow, npcol, myrow, mycol)
subroutine pclaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
real function pslamch(ictxt, cmach)
subroutine pslabad(ictxt, small, large)