3
4
5
6
7
8
9 CHARACTER UPLO
10 INTEGER IA, INFO, JA, LWORK, N
11
12
13 INTEGER DESCA( * )
14 REAL A( * ), D( * ), E( * ), TAU( * ), WORK( * )
15
16
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
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
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
402 $ MB_, NB_, RSRC_, CSRC_, LLD_
403 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
404 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
405 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
406 REAL ONE
407 parameter( one = 1.0e0 )
408 REAL Z_ONE, Z_NEGONE, Z_ZERO
409 parameter( z_one = 1.0e0, z_negone = -1.0e0,
410 $ z_zero = 0.0e0 )
411 REAL ZERO
412 parameter( zero = 0.0e+0 )
413
414
415
416
417
418
419 LOGICAL BALANCED, INTERLEAVE, TWOGEMMS, UPPER
420 INTEGER ANB, BINDEX, CURCOL, CURROW, I, ICTXT, INDEX,
421 $ INDEXA, INDEXINH, INDEXINV, INH, INHB, INHT,
422 $ INHTB, INTMP, INV, INVB, INVT, INVTB, J, LDA,
423 $ LDV, LDZG, LII, LIIB, LIIP1, LIJ, LIJB, LIJP1,
424 $ LTLIP1, LTNM1, LWMIN, MAXINDEX, MININDEX,
425 $ MYCOL, MYFIRSTROW, MYROW, MYSETNUM, NBZG, NP,
426 $ NPB, NPCOL, NPM0, NPM1, NPROW, NPS, NPSET, NQ,
427 $ NQB, NQM1, NUMROWS, NXTCOL, NXTROW, PBMAX,
428 $ PBMIN, PBSIZE, PNB, ROWSPERPROC
429 REAL ALPHA, BETA, C, NORM, ONEOVERBETA, SAFMAX,
430 $ SAFMIN, TOPH, TOPNV, TOPTAU, TOPV, TTOPH, TTOPV
431
432
433
434
435
436
437 INTEGER IDUM1( 1 ), IDUM2( 1 )
438 REAL CC( 3 ), DTMP( 5 )
439
440
443 $ sgemv, sgerv2d, sgesd2d, sgsum2d, slamov,
445
446
447
448 LOGICAL LSAME
449 INTEGER ICEIL, NUMROC, PJLAENV
450 REAL PSLAMCH, SNRM2
452
453
454 INTRINSIC ichar,
max,
min, mod, real, sign, sqrt
455
456
457
458
459
460 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
461 $ rsrc_.LT.0 )RETURN
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483 ictxt = desca( ctxt_ )
484 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
485
486 safmax = sqrt(
pslamch( ictxt,
'O' ) ) / n
487 safmin = sqrt(
pslamch( ictxt,
'S' ) )
488
489
490
491 info = 0
492 IF( nprow.EQ.-1 ) THEN
493 info = -( 600+ctxt_ )
494 ELSE
495
496
497
498 pnb =
pjlaenv( ictxt, 2,
'PSSYTTRD',
'L', 0, 0, 0, 0 )
499 anb =
pjlaenv( ictxt, 3,
'PSSYTTRD',
'L', 0, 0, 0, 0 )
500
501 interleave = (
pjlaenv( ictxt, 4,
'PSSYTTRD',
'L', 1, 0, 0,
502 $ 0 ).EQ.1 )
503 twogemms = (
pjlaenv( ictxt, 4,
'PSSYTTRD',
'L', 2, 0, 0,
504 $ 0 ).EQ.1 )
505 balanced = (
pjlaenv( ictxt, 4,
'PSSYTTRD',
'L', 3, 0, 0,
506 $ 0 ).EQ.1 )
507
508 CALL chk1mat( n, 2, n, 2, ia, ja, desca, 6, info )
509
510
511 upper =
lsame( uplo,
'U' )
512 IF( info.EQ.0 .AND. desca( nb_ ).NE.1 )
513 $ info = 600 + nb_
514 IF( info.EQ.0 ) THEN
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529 nps =
max(
numroc( n, 1, 0, 0, nprow ), 2*anb )
530 lwmin = 2*( anb+1 )*( 4*nps+2 ) + nps
531
532 work( 1 ) = real( lwmin )
533 IF( .NOT.
lsame( uplo,
'L' ) )
THEN
534 info = -1
535 ELSE IF( ia.NE.1 ) THEN
536 info = -4
537 ELSE IF( ja.NE.1 ) THEN
538 info = -5
539 ELSE IF( nprow.NE.npcol ) THEN
540 info = -( 600+ctxt_ )
541 ELSE IF( desca( dtype_ ).NE.1 ) THEN
542 info = -( 600+dtype_ )
543 ELSE IF( desca( mb_ ).NE.1 ) THEN
544 info = -( 600+mb_ )
545 ELSE IF( desca( nb_ ).NE.1 ) THEN
546 info = -( 600+nb_ )
547 ELSE IF( desca( rsrc_ ).NE.0 ) THEN
548 info = -( 600+rsrc_ )
549 ELSE IF( desca( csrc_ ).NE.0 ) THEN
550 info = -( 600+csrc_ )
551 ELSE IF( lwork.LT.lwmin ) THEN
552 info = -11
553 END IF
554 END IF
555 IF( upper ) THEN
556 idum1( 1 ) = ichar( 'U' )
557 ELSE
558 idum1( 1 ) = ichar( 'L' )
559 END IF
560 idum2( 1 ) = 1
561
562 CALL pchk1mat( n, 2, n, 2, ia, ja, desca, 6, 1, idum1, idum2,
563 $ info )
564 END IF
565
566 IF( info.NE.0 ) THEN
567 CALL pxerbla( ictxt,
'PSSYTTRD', -info )
568 RETURN
569 END IF
570
571
572
573 IF( n.EQ.0 )
574 $ RETURN
575
576
577
578
579 np =
numroc( n, 1, myrow, 0, nprow )
580 nq =
numroc( n, 1, mycol, 0, npcol )
581
582 nxtrow = 0
583 nxtcol = 0
584
585 liip1 = 1
586 lijp1 = 1
587 npm1 = np
588 nqm1 = nq
589
590 lda = desca( lld_ )
591 ictxt = desca( ctxt_ )
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610 inh = 1
611
612 IF( interleave ) THEN
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628 ldv = 4*(
max( npm1, nqm1 ) ) + 2
629
630 inh = 1
631
632 inv = inh + ldv / 2
633 invt = inh + ( anb+1 )*ldv
634
635 inht = invt + ldv / 2
636 intmp = invt + ldv*( anb+1 )
637
638 ELSE
639 ldv =
max( npm1, nqm1 )
640
641 inht = inh + ldv*( anb+1 )
642 inv = inht + ldv*( anb+1 )
643
644
645
646
647
648
649
650 invt = inv + ldv*( anb+1 ) + 1
651 intmp = invt + ldv*( 2*anb )
652
653 END IF
654
655 IF( info.NE.0 ) THEN
656 CALL pxerbla( ictxt,
'PSSYTTRD', -info )
657 work( 1 ) = real( lwmin )
658 RETURN
659 END IF
660
661
662
663
664
665
666
667
668
669
670
671
672 DO 10 i = 1, np
673 work( inh+i-1 ) = z_zero
674 work( inv+i-1 ) = z_zero
675 10 CONTINUE
676 DO 20 i = 1, nq
677 work( inht+i-1 ) = z_zero
678 20 CONTINUE
679
680
681
682 topnv = z_zero
683
684 ltlip1 = lijp1
685 ltnm1 = npm1
686 IF( mycol.GT.myrow ) THEN
687 ltlip1 = ltlip1 + 1
688 ltnm1 = ltnm1 - 1
689 END IF
690
691
692 DO 210 minindex = 1, n - 1, anb
693
694
695 maxindex =
min( minindex+anb-1, n )
696 lijb =
numroc( maxindex, 1, mycol, 0, npcol ) + 1
697 liib =
numroc( maxindex, 1, myrow, 0, nprow ) + 1
698
699 nqb = nq - lijb + 1
700 npb = np - liib + 1
701 inhtb = inht + lijb - 1
702 invtb = invt + lijb - 1
703 inhb = inh + liib - 1
704 invb = inv + liib - 1
705
706
707
708
709 DO 160 index = minindex,
min( maxindex, n-1 )
710
711 bindex = index - minindex
712
713 currow = nxtrow
714 curcol = nxtcol
715
716 nxtrow = mod( currow+1, nprow )
717 nxtcol = mod( curcol+1, npcol )
718
719 lii = liip1
720 lij = lijp1
721 npm0 = npm1
722
723 IF( myrow.EQ.currow ) THEN
724 npm1 = npm1 - 1
725 liip1 = liip1 + 1
726 END IF
727 IF( mycol.EQ.curcol ) THEN
728 nqm1 = nqm1 - 1
729 lijp1 = lijp1 + 1
730 ltlip1 = ltlip1 + 1
731 ltnm1 = ltnm1 - 1
732 END IF
733
734
735
736
737
738
739
740
741
742
743 IF( mycol.EQ.curcol ) THEN
744
745 indexa = lii + ( lij-1 )*lda
746 indexinv = inv + lii - 1 + ( bindex-1 )*ldv
747 indexinh = inh + lii - 1 + ( bindex-1 )*ldv
748 ttoph = work( inht+lij-1+bindex*ldv )
749 ttopv = topnv
750
751 IF( index.GT.1 ) THEN
752 DO 30 i = 0, npm0 - 1
753
754 a( indexa+i ) = a( indexa+i ) -
755 $ work( indexinv+ldv+i )*ttoph -
756 $ work( indexinh+ldv+i )*ttopv
757 30 CONTINUE
758 END IF
759
760
761 END IF
762
763
764 IF( mycol.EQ.curcol ) THEN
765
766
767
768 IF( myrow.EQ.currow ) THEN
769 dtmp( 2 ) = a( lii+( lij-1 )*lda )
770 ELSE
771 dtmp( 2 ) = zero
772 END IF
773 IF( myrow.EQ.nxtrow ) THEN
774 dtmp( 3 ) = a( liip1+( lij-1 )*lda )
775 dtmp( 4 ) = zero
776 ELSE
777 dtmp( 3 ) = zero
778 dtmp( 4 ) = zero
779 END IF
780
781 norm = snrm2( npm1, a( liip1+( lij-1 )*lda ), 1 )
782 dtmp( 1 ) = norm
783
784
785
786
787
788 dtmp( 5 ) = zero
789 IF( dtmp( 1 ).GE.safmax .OR. dtmp( 1 ).LT.safmin ) THEN
790 dtmp( 5 ) = one
791 dtmp( 1 ) = zero
792 END IF
793
794 dtmp( 1 ) = dtmp( 1 )*dtmp( 1 )
795 CALL sgsum2d( ictxt, 'C', ' ', 5, 1, dtmp, 5, -1,
796 $ curcol )
797 IF( dtmp( 5 ).EQ.zero ) THEN
798 dtmp( 1 ) = sqrt( dtmp( 1 ) )
799 ELSE
800 dtmp( 1 ) = norm
801 CALL pstreecomb( ictxt,
'C', 1, dtmp, -1, mycol,
803 END IF
804
805 norm = dtmp( 1 )
806
807 d( lij ) = dtmp( 2 )
808 IF( myrow.EQ.currow .AND. mycol.EQ.curcol ) THEN
809 a( lii+( lij-1 )*lda ) = d( lij )
810 END IF
811
812
813 alpha = dtmp( 3 )
814
815 norm = sign( norm, alpha )
816
817 IF( norm.EQ.zero ) THEN
818 toptau = zero
819 ELSE
820 beta = norm + alpha
821 toptau = beta / norm
822 oneoverbeta = 1.0e0 / beta
823
824 CALL sscal( npm1, oneoverbeta,
825 $ a( liip1+( lij-1 )*lda ), 1 )
826 END IF
827
828 IF( myrow.EQ.nxtrow ) THEN
829 a( liip1+( lij-1 )*lda ) = z_one
830 END IF
831
832 tau( lij ) = toptau
833 e( lij ) = -norm
834
835 END IF
836
837
838
839
840 DO 40 i = 0, npm1 - 1
841 work( inv+liip1-1+bindex*ldv+npm1+i ) = a( liip1+i+
842 $ ( lij-1 )*lda )
843 40 CONTINUE
844
845 IF( mycol.EQ.curcol ) THEN
846 work( inv+liip1-1+bindex*ldv+npm1+npm1 ) = toptau
847 CALL sgebs2d( ictxt, 'R', ' ', npm1+npm1+1, 1,
848 $ work( inv+liip1-1+bindex*ldv ),
849 $ npm1+npm1+1 )
850 ELSE
851 CALL sgebr2d( ictxt, 'R', ' ', npm1+npm1+1, 1,
852 $ work( inv+liip1-1+bindex*ldv ),
853 $ npm1+npm1+1, myrow, curcol )
854 toptau = work( inv+liip1-1+bindex*ldv+npm1+npm1 )
855 END IF
856 DO 50 i = 0, npm1 - 1
857 work( inh+liip1-1+( bindex+1 )*ldv+i ) = work( inv+liip1-
858 $ 1+bindex*ldv+npm1+i )
859 50 CONTINUE
860
861 IF( index.LT.n ) THEN
862 IF( myrow.EQ.nxtrow .AND. mycol.EQ.curcol )
863 $ a( liip1+( lij-1 )*lda ) = e( lij )
864 END IF
865
866
867
868
869 IF( myrow.EQ.mycol ) THEN
870 DO 60 i = 0, npm1 + npm1
871 work( invt+lijp1-1+bindex*ldv+i ) = work( inv+liip1-1+
872 $ bindex*ldv+i )
873 60 CONTINUE
874 ELSE
875 CALL sgesd2d( ictxt, npm1+npm1, 1,
876 $ work( inv+liip1-1+bindex*ldv ), npm1+npm1,
877 $ mycol, myrow )
878 CALL sgerv2d( ictxt, nqm1+nqm1, 1,
879 $ work( invt+lijp1-1+bindex*ldv ), nqm1+nqm1,
880 $ mycol, myrow )
881 END IF
882
883 DO 70 i = 0, nqm1 - 1
884 work( inht+lijp1-1+( bindex+1 )*ldv+i ) = work( invt+
885 $ lijp1-1+bindex*ldv+nqm1+i )
886 70 CONTINUE
887
888
889
890
891 IF( index.GT.1 ) THEN
892 DO 90 j = lijp1, lijb - 1
893 DO 80 i = 0, npm1 - 1
894
895 a( liip1+i+( j-1 )*lda ) = a( liip1+i+( j-1 )*lda )
896 $ - work( inv+liip1-1+bindex*ldv+i )*
897 $ work( inht+j-1+bindex*ldv ) -
898 $ work( inh+liip1-1+bindex*ldv+i )*
899 $ work( invt+j-1+bindex*ldv )
900 80 CONTINUE
901 90 CONTINUE
902 END IF
903
904
905
906
907
908
909
910
911
912
913
914
915
916 work( inv+liip1-1+( bindex+1 )*ldv ) = z_zero
917 work( invt+lijp1-1+( bindex+1 )*ldv+nqm1-1 ) = z_zero
918
919
920 IF( myrow.EQ.mycol ) THEN
921 IF( ltnm1.GT.1 ) THEN
922 CALL strmvt(
'L', ltnm1-1,
923 $ a( ltlip1+1+( lijp1-1 )*lda ), lda,
924 $ work( invt+lijp1-1+( bindex+1 )*ldv ), 1,
925 $ work( inh+ltlip1+1-1+( bindex+1 )*ldv ),
926 $ 1, work( inv+ltlip1+1-1+( bindex+1 )*
927 $ ldv ), 1, work( inht+lijp1-1+( bindex+
928 $ 1 )*ldv ), 1 )
929 END IF
930 DO 100 i = 1, ltnm1
931 work( invt+lijp1+i-1-1+( bindex+1 )*ldv )
932 $ = work( invt+lijp1+i-1-1+( bindex+1 )*ldv ) +
933 $ a( ltlip1+i-1+( lijp1+i-1-1 )*lda )*
934 $ work( inh+ltlip1+i-1-1+( bindex+1 )*ldv )
935 100 CONTINUE
936 ELSE
937 IF( ltnm1.GT.0 )
938 $
CALL strmvt(
'L', ltnm1, a( ltlip1+( lijp1-1 )*lda ),
939 $ lda, work( invt+lijp1-1+( bindex+1 )*
940 $ ldv ), 1, work( inh+ltlip1-1+( bindex+
941 $ 1 )*ldv ), 1, work( inv+ltlip1-1+
942 $ ( bindex+1 )*ldv ), 1,
943 $ work( inht+lijp1-1+( bindex+1 )*ldv ),
944 $ 1 )
945
946 END IF
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962 DO 110 i = 1, 2*( bindex+1 )
963 work( intmp-1+i ) = 0
964 110 CONTINUE
965
966 IF( balanced ) THEN
967 npset = nprow
968 mysetnum = myrow
969 rowsperproc =
iceil( nqb, npset )
970 myfirstrow =
min( nqb+1, 1+rowsperproc*mysetnum )
971 numrows =
min( rowsperproc, nqb-myfirstrow+1 )
972
973
974
975
976 CALL sgemv( 'C', numrows, bindex+1, z_one,
977 $ work( inhtb+myfirstrow-1 ), ldv,
978 $ work( inhtb+myfirstrow-1+( bindex+1 )*ldv ),
979 $ 1, z_zero, work( intmp ), 1 )
980
981 CALL sgemv( 'C', numrows, bindex+1, z_one,
982 $ work( invtb+myfirstrow-1 ), ldv,
983 $ work( inhtb+myfirstrow-1+( bindex+1 )*ldv ),
984 $ 1, z_zero, work( intmp+bindex+1 ), 1 )
985
986
987 CALL sgsum2d( ictxt, 'C', ' ', 2*( bindex+1 ), 1,
988 $ work( intmp ), 2*( bindex+1 ), -1, -1 )
989 ELSE
990
991
992 CALL sgemv( 'C', nqb, bindex+1, z_one, work( inhtb ),
993 $ ldv, work( inhtb+( bindex+1 )*ldv ), 1,
994 $ z_zero, work( intmp ), 1 )
995
996 CALL sgemv( 'C', nqb, bindex+1, z_one, work( invtb ),
997 $ ldv, work( inhtb+( bindex+1 )*ldv ), 1,
998 $ z_zero, work( intmp+bindex+1 ), 1 )
999
1000 END IF
1001
1002
1003
1004 IF( balanced ) THEN
1005 mysetnum = mycol
1006
1007 rowsperproc =
iceil( npb, npset )
1008 myfirstrow =
min( npb+1, 1+rowsperproc*mysetnum )
1009 numrows =
min( rowsperproc, npb-myfirstrow+1 )
1010
1011 CALL sgsum2d( ictxt, 'R', ' ', 2*( bindex+1 ), 1,
1012 $ work( intmp ), 2*( bindex+1 ), -1, -1 )
1013
1014
1015
1016 IF( index.GT.1. ) THEN
1017 CALL sgemv( 'N', numrows, bindex+1, z_negone,
1018 $ work( invb+myfirstrow-1 ), ldv,
1019 $ work( intmp ), 1, z_one,
1020 $ work( invb+myfirstrow-1+( bindex+1 )*
1021 $ ldv ), 1 )
1022
1023
1024 CALL sgemv( 'N', numrows, bindex+1, z_negone,
1025 $ work( inhb+myfirstrow-1 ), ldv,
1026 $ work( intmp+bindex+1 ), 1, z_one,
1027 $ work( invb+myfirstrow-1+( bindex+1 )*
1028 $ ldv ), 1 )
1029 END IF
1030
1031 ELSE
1032
1033 CALL sgemv( 'N', npb, bindex+1, z_negone, work( invb ),
1034 $ ldv, work( intmp ), 1, z_one,
1035 $ work( invb+( bindex+1 )*ldv ), 1 )
1036
1037
1038
1039 CALL sgemv( 'N', npb, bindex+1, z_negone, work( inhb ),
1040 $ ldv, work( intmp+bindex+1 ), 1, z_one,
1041 $ work( invb+( bindex+1 )*ldv ), 1 )
1042
1043 END IF
1044
1045
1046
1047
1048 IF( myrow.EQ.mycol ) THEN
1049 DO 120 i = 0, nqm1 - 1
1050 work( intmp+i ) = work( invt+lijp1-1+( bindex+1 )*ldv+
1051 $ i )
1052 120 CONTINUE
1053 ELSE
1054 CALL sgesd2d( ictxt, nqm1, 1,
1055 $ work( invt+lijp1-1+( bindex+1 )*ldv ),
1056 $ nqm1, mycol, myrow )
1057 CALL sgerv2d( ictxt, npm1, 1, work( intmp ), npm1, mycol,
1058 $ myrow )
1059
1060 END IF
1061 DO 130 i = 0, npm1 - 1
1062 work( inv+liip1-1+( bindex+1 )*ldv+i ) = work( inv+liip1-
1063 $ 1+( bindex+1 )*ldv+i ) + work( intmp+i )
1064 130 CONTINUE
1065
1066
1067
1068 CALL sgsum2d( ictxt, 'R', ' ', npm1, 1,
1069 $ work( inv+liip1-1+( bindex+1 )*ldv ), npm1,
1070 $ myrow, nxtcol )
1071
1072
1073
1074
1075
1076
1077 IF( mycol.EQ.nxtcol ) THEN
1078 cc( 1 ) = z_zero
1079 DO 140 i = 0, npm1 - 1
1080 cc( 1 ) = cc( 1 ) + work( inv+liip1-1+( bindex+1 )*
1081 $ ldv+i )*work( inh+liip1-1+( bindex+1 )*ldv+
1082 $ i )
1083 140 CONTINUE
1084 IF( myrow.EQ.nxtrow ) THEN
1085 cc( 2 ) = work( inv+liip1-1+( bindex+1 )*ldv )
1086 cc( 3 ) = work( inh+liip1-1+( bindex+1 )*ldv )
1087 ELSE
1088 cc( 2 ) = z_zero
1089 cc( 3 ) = z_zero
1090 END IF
1091 CALL sgsum2d( ictxt, 'C', ' ', 3, 1, cc, 3, -1, nxtcol )
1092
1093 topv = cc( 2 )
1094 c = cc( 1 )
1095 toph = cc( 3 )
1096
1097 topnv = toptau*( topv-c*toptau / 2*toph )
1098
1099
1100
1101
1102
1103 DO 150 i = 0, npm1 - 1
1104 work( inv+liip1-1+( bindex+1 )*ldv+i ) = toptau*
1105 $ ( work( inv+liip1-1+( bindex+1 )*ldv+i )-c*toptau /
1106 $ 2*work( inh+liip1-1+( bindex+1 )*ldv+i ) )
1107 150 CONTINUE
1108
1109 END IF
1110
1111
1112 160 CONTINUE
1113
1114
1115
1116
1117 IF( maxindex.LT.n ) THEN
1118
1119 DO 170 i = 0, npm1 - 1
1120 work( intmp+i ) = work( inh+liip1-1+anb*ldv+i )
1121 170 CONTINUE
1122
1123
1124
1125 IF( .NOT.twogemms ) THEN
1126 IF( interleave ) THEN
1127 ldzg = ldv / 2
1128 ELSE
1129 CALL slamov( 'A', ltnm1, anb, work( inht+lijp1-1 ),
1130 $ ldv, work( invt+lijp1-1+anb*ldv ), ldv )
1131
1132 CALL slamov( 'A', ltnm1, anb, work( inv+ltlip1-1 ),
1133 $ ldv, work( inh+ltlip1-1+anb*ldv ), ldv )
1134 ldzg = ldv
1135 END IF
1136 nbzg = anb*2
1137 ELSE
1138 ldzg = ldv
1139 nbzg = anb
1140 END IF
1141
1142
1143 DO 180 pbmin = 1, ltnm1, pnb
1144
1145 pbsize =
min( pnb, ltnm1-pbmin+1 )
1146 pbmax =
min( ltnm1, pbmin+pnb-1 )
1147 CALL sgemm( 'N', 'C', pbsize, pbmax, nbzg, z_negone,
1148 $ work( inh+ltlip1-1+pbmin-1 ), ldzg,
1149 $ work( invt+lijp1-1 ), ldzg, z_one,
1150 $ a( ltlip1+pbmin-1+( lijp1-1 )*lda ), lda )
1151 IF( twogemms ) THEN
1152 CALL sgemm( 'N', 'C', pbsize, pbmax, anb, z_negone,
1153 $ work( inv+ltlip1-1+pbmin-1 ), ldzg,
1154 $ work( inht+lijp1-1 ), ldzg, z_one,
1155 $ a( ltlip1+pbmin-1+( lijp1-1 )*lda ), lda )
1156 END IF
1157 180 CONTINUE
1158
1159
1160
1161 DO 190 i = 0, npm1 - 1
1162 work( inv+liip1-1+i ) = work( inv+liip1-1+anb*ldv+i )
1163 work( inh+liip1-1+i ) = work( intmp+i )
1164 190 CONTINUE
1165 DO 200 i = 0, nqm1 - 1
1166 work( inht+lijp1-1+i ) = work( inht+lijp1-1+anb*ldv+i )
1167 200 CONTINUE
1168
1169
1170 END IF
1171
1172
1173
1174 210 CONTINUE
1175
1176 IF( mycol.EQ.nxtcol ) THEN
1177 IF( myrow.EQ.nxtrow ) THEN
1178
1179 d( nq ) = a( np+( nq-1 )*lda )
1180
1181 CALL sgebs2d( ictxt, 'C', ' ', 1, 1, d( nq ), 1 )
1182 ELSE
1183 CALL sgebr2d( ictxt, 'C', ' ', 1, 1, d( nq ), 1, nxtrow,
1184 $ nxtcol )
1185 END IF
1186 END IF
1187
1188
1189
1190
1191 work( 1 ) = real( lwmin )
1192 RETURN
1193
1194
1195
1196
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
integer function iceil(inum, idenom)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
real function pslamch(ictxt, cmach)
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
integer function pjlaenv(ictxt, ispec, name, opts, n1, n2, n3, n4)
subroutine scombnrm2(x, y)
subroutine pstreecomb(ictxt, scope, n, mine, rdest0, cdest0, subptr)
subroutine pxerbla(ictxt, srname, info)
subroutine strmvt(uplo, n, t, ldt, x, incx, y, incy, w, incw, z, incz)