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