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