4
5
6
7
8
9
10
11
12 IMPLICIT NONE
13
14
15 CHARACTER COMPQ
16 INTEGER INFO, LIWORK, LWORK, M, N,
17 $ IT, JT, IQ, JQ
18
19
20 INTEGER SELECT( * )
21 INTEGER PARA( 6 ), DESCT( * ), DESCQ( * ), IWORK( * )
22 REAL Q( * ), T( * ), WI( * ), WORK( * ), WR( * )
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 CHARACTER TOP
299 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
300 $ LLD_, MB_, M_, NB_, N_, RSRC_
301 REAL ZERO, ONE
302 parameter( top = '1-Tree',
303 $ block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
304 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
305 $ rsrc_ = 7, csrc_ = 8, lld_ = 9,
306 $ zero = 0.0, one = 1.0 )
307
308
309 LOGICAL LQUERY, PAIR, SWAP, WANTQ,
310 $ ISHH, FIRST, SKIP1CR, BORDER, LASTWAIT
311 INTEGER NPROW, NPCOL, MYROW, MYCOL, NB, NPROCS,
312 $ IERR, DIM1, INDX, LLDT, TRSRC, TCSRC, ILOC1,
313 $ JLOC1, MYIERR, ICTXT,
314 $ RSRC1, CSRC1, ILOC3, JLOC3, TRSRC3,
315 $ TCSRC3, ILOC, JLOC, TRSRC4, TCSRC4,
316 $ FLOPS, I, ILO, IHI, J, K, KK, KKS,
317 $ KS, LIWMIN, LWMIN, MMULT, N1, N2,
318 $ NCB, NDTRAF, NITRAF, NWIN, NUMWIN, PDTRAF,
319 $ PITRAF, PDW, WINEIG, WINSIZ, LLDQ,
320 $ RSRC, CSRC, ILILO, ILIHI, ILSEL, IRSRC,
321 $ ICSRC, IPIW, IPW1, IPW2, IPW3, TIHI, TILO,
322 $ LIHI, WINDOW, LILO, LSEL, BUFFER,
323 $ NMWIN2, BUFFLEN, LROWS, LCOLS, ILOC2, JLOC2,
324 $ WNEICR, WINDOW0, RSRC4, CSRC4, LIHI4, RSRC3,
325 $ CSRC3, RSRC2, CSRC2, LIHIC, LIHI1, ILEN4,
326 $ SELI4, ILEN1, DIM4, IPW4, QROWS, TROWS,
327 $ TCOLS, IPW5, IPW6, IPW7, IPW8, JLOC4,
328 $ EAST, WEST, ILOC4, SOUTH, NORTH, INDXS,
329 $ ITT, JTT, ILEN, DLEN, INDXE, TRSRC1, TCSRC1,
330 $ TRSRC2, TCSRC2, ILOS, DIR, TLIHI, TLILO, TLSEL,
331 $ ROUND, LAST, WIN0S, WIN0E, WINE
332 REAL ELEM, ELEM1, ELEM2, ELEM3, ELEM4, SN, CS, TMP,
333 $ ELEM5
334
335
336 INTEGER IBUFF( 8 ), IDUM1( 1 ), IDUM2( 1 ), MMAX( 1 ),
337 $ MMIN( 1 )
338
339
340 LOGICAL LSAME
341 INTEGER NUMROC, INDXG2P, INDXG2L
343
344
347 $
infog2l, dgsum2d, sgesd2d, sgerv2d, sgebs2d,
348 $ sgebr2d, igsum2d, blacs_gridinfo, igebs2d,
350
351
352 INTRINSIC abs,
max, sqrt,
min
353
354
355 INTEGER ICEIL
356
357
358
359
360
361 ictxt = desct( ctxt_ )
362 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
363 nprocs = nprow*npcol
364
365
366
367 info = 0
368 IF( nprow.EQ.-1 ) THEN
369 info = n+1
370 END IF
371
372
373
374 lquery = lwork.EQ.-1 .OR. liwork.EQ.-1
375
376
377
378 IF( info.EQ.0 ) THEN
379 CALL chk1mat( n, 5, n, 5, it, jt, desct, 9, info )
380 END IF
381 IF( info.EQ.0 ) THEN
382 CALL chk1mat( n, 5, n, 5, iq, jq, descq, 13, info )
383 END IF
384
385
386
387 IF( info.EQ.0 ) THEN
388 IF( desct( mb_ ).NE.desct( nb_ ) ) info = -(1000*9 + mb_)
389 END IF
390 IF( info.EQ.0 ) THEN
391 IF( descq( mb_ ).NE.descq( nb_ ) ) info = -(1000*13 + mb_)
392 END IF
393 IF( info.EQ.0 ) THEN
394 IF( desct( mb_ ).NE.descq( mb_ ) ) info = -(1000*9 + mb_)
395 END IF
396
397
398
399 IF( info.EQ.0 ) THEN
400 IF( n.NE.desct( mb_ ) .AND. desct( mb_ ).LT.3 )
401 $ info = -(1000*9 + mb_)
402 IF( n.NE.descq( mb_ ) .AND. descq( mb_ ).LT.3 )
403 $ info = -(1000*13 + mb_)
404 END IF
405
406
407
408 nb = desct( mb_ )
409 IF( info.EQ.0 ) THEN
410 IF( para(1).LT.1 .OR. para(1).GT.
min(nprow,npcol) )
411 $ info = -(1000 * 4 + 1)
412 IF( para(2).LT.1 .OR. para(2).GE.para(3) )
413 $ info = -(1000 * 4 + 2)
414 IF( para(3).LT.1 .OR. para(3).GT.nb )
415 $ info = -(1000 * 4 + 3)
416 IF( para(4).LT.0 .OR. para(4).GT.100 )
417 $ info = -(1000 * 4 + 4)
418 IF( para(5).LT.1 .OR. para(5).GT.nb )
419 $ info = -(1000 * 4 + 5)
420 IF( para(6).LT.1 .OR. para(6).GT.para(2) )
421 $ info = -(1000 * 4 + 6)
422 END IF
423
424
425
426 IF( info.EQ.0 ) THEN
427 IF( it.NE.1 ) info = -6
428 IF( jt.NE.it ) info = -7
429 IF( iq.NE.1 ) info = -10
430 IF( jq.NE.iq ) info = -11
431 END IF
432
433
434
435 IF( info.EQ.0 ) THEN
436 CALL pchk1mat( n, 5, n, 5, it, jt, desct, 9, 0, idum1,
437 $ idum2, info )
438 END IF
439 IF( info.EQ.0 ) THEN
440 CALL pchk1mat( n, 5, n, 5, iq, jq, descq, 13, 0, idum1,
441 $ idum2, info )
442 END IF
443 IF( info.EQ.0 ) THEN
444 CALL pchk2mat( n, 5, n, 5, it, jt, desct, 9, n, 5, n, 5,
445 $ iq, jq, descq, 13, 0, idum1, idum2, info )
446 END IF
447
448
449
450 IF( info.EQ.0 .OR. lquery ) THEN
451
452 wantq =
lsame( compq,
'V' )
453 IF( n.LT.0 ) THEN
454 info = -4
455 ELSE
456
457
458
459 lldt = desct( lld_ )
460 lldq = descq( lld_ )
461
462
463
464
465 m = 0
466 DO 10 k = 1, n
467 IF( k.LT.n ) THEN
468 CALL infog2l( k+1, k, desct, nprow, npcol,
469 $ myrow, mycol, itt, jtt, trsrc, tcsrc )
470 IF( myrow.EQ.trsrc .AND. mycol.EQ.tcsrc ) THEN
471 elem = t( (jtt-1)*lldt + itt )
472 IF( elem.NE.zero ) THEN
473 IF( SELECT(k).NE.0 .AND.
474 $ SELECT(k+1).EQ.0 ) THEN
475
476 SELECT(k+1) = 1
477 ELSEIF( SELECT(k).EQ.0 .AND.
478 $ SELECT(k+1).NE.0 ) THEN
479
480 SELECT(k) = 1
481 END IF
482 END IF
483 END IF
484 END IF
485 IF( SELECT(k).NE.0 ) m = m + 1
486 10 CONTINUE
487 mmax( 1 ) = m
488 mmin( 1 ) = m
489 IF( nprocs.GT.1 )
490 $ CALL igamx2d( ictxt, 'All', top, 1, 1, mmax( 1 ), 1, -1,
491 $ -1, -1, -1, -1 )
492 IF( nprocs.GT.1 )
493 $ CALL igamn2d( ictxt, 'All', top, 1, 1, mmin( 1 ), 1, -1,
494 $ -1, -1, -1, -1 )
495 IF( mmax( 1 ).GT.mmin( 1 ) ) THEN
496 m = mmax( 1 )
497 IF( nprocs.GT.1 )
498 $ CALL igamx2d( ictxt, 'All', top, n, 1, SELECT, n,
499 $ -1, -1, -1, -1, -1 )
500 END IF
501
502
503
504 n1 = m
505 n2 = n - m
506
507 trows =
numroc( n, nb, myrow, desct(rsrc_), nprow )
508 tcols =
numroc( n, nb, mycol, desct(csrc_), npcol )
509 lwmin = n + 7*nb**2 + 2*trows*para( 3 ) + tcols*para( 3 ) +
510 $
max( trows*para( 3 ), tcols*para( 3 ) )
511 liwmin = 5*para( 1 ) + para( 2 )*para( 3 ) -
512 $ para( 2 ) * ( para( 2 ) + 1 ) / 2
513
514 IF( lwork.LT.lwmin .AND. .NOT.lquery ) THEN
515 info = -17
516 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery ) THEN
517 info = -19
518 END IF
519 END IF
520 END IF
521
522
523
524 IF( nprocs.GT.1 ) THEN
525 CALL igamx2d( ictxt, 'All', top, 1, 1, info, 1, -1, -1,
526 $ -1, -1, -1 )
527 END IF
528
529
530
531 IF( info.NE.0 .AND. .NOT.lquery ) THEN
532 m = 0
533 CALL pxerbla( ictxt,
'PSTRORD', -info )
534 RETURN
535 ELSEIF( lquery ) THEN
536 work( 1 ) = float(lwmin)
537 iwork( 1 ) = liwmin
538 RETURN
539 END IF
540
541
542
543 IF( m.EQ.n .OR. m.EQ.0 ) GO TO 545
544
545
546
547 numwin = para( 1 )
548 wineig =
max( para( 2 ), 2 )
549 winsiz =
min(
max( para( 3 ), para( 2 )*2 ), nb )
550 mmult = para( 4 )
551 ncb = para( 5 )
552 wneicr = para( 6 )
553
554
555
556
557
558
559
560
561
562
563
564
565 ililo = 1
566 ilihi = ililo + numwin
567 ilsel = ilihi + numwin
568 irsrc = ilsel + numwin
569 icsrc = irsrc + numwin
570 ipiw = icsrc + numwin
571
572
573
574
575 ipw1 = 1
576 ipw2 = ipw1 + nb
577
578
579
580
581
582
583
584 ilo = 0
585 40 CONTINUE
586 ilo = ilo + 1
587 IF( ilo.LE.n ) THEN
588 IF( SELECT(ilo).NE.0 ) GO TO 40
589 END IF
590
591
592
593
594
595 ihi = n
596
597
598 50 CONTINUE
599
600 IF( ilo.LE.m ) THEN
601
602
603
604
605
606
607
608 ilos = ilo - 1
609 52 CONTINUE
610 ilos = ilos + 1
611 IF( SELECT(ilos).EQ.0 ) GO TO 52
612 IF( ilos.LT.n ) THEN
613 IF( SELECT(ilos+1).NE.0 .AND. mod(ilos,nb).EQ.0 ) THEN
614 CALL pselget(
'All', top, elem, t, ilos+1, ilos, desct )
615 IF( elem.NE.zero ) GO TO 52
616 END IF
617 END IF
619
620
621
622
623
624
625
626
627
628
629
630 nmwin2 = (
iceil(ihi,nb)*nb - (ilo-mod(ilo,nb)+1)+1) / nb
631 nmwin2 =
min(
min( numwin, nmwin2 ),
iceil(n,nb) - j + 1 )
632
633
634
635
636
637 DO 80 k = 1, nmwin2
638 iwork( ilsel+k-1) = 0
639 iwork( ililo+k-1) =
max( ilo, (j-1)*nb+(k-1)*nb+1 )
640 lilo = iwork( ililo+k-1 )
641 82 CONTINUE
642 IF( SELECT(lilo).NE.0 .AND. lilo.LT.(j+k-1)*nb ) THEN
643 lilo = lilo + 1
644 IF( lilo.LE.n ) GO TO 82
645 END IF
646 iwork( ililo+k-1 ) = lilo
647
648
649
650
651 lilo = iwork(ililo+k-1)
652 IF( lilo.GT.nb ) THEN
653 CALL pselget(
'All', top, elem, t, lilo, lilo-1, desct )
654 IF( elem.NE.zero ) THEN
655 IF( lilo.LT.(j+k-1)*nb ) THEN
656 iwork(ililo+k-1) = iwork(ililo+k-1) + 1
657 ELSE
658 iwork(ililo+k-1) = iwork(ililo+k-1) - 1
659 END IF
660 END IF
661 END IF
662
663
664
665
666 iwork( ilihi+k-1 ) = iwork( ililo+k-1 )
667 iwork( irsrc+k-1 ) =
indxg2p( iwork(ililo+k-1), nb, myrow,
668 $ desct( rsrc_ ), nprow )
669 iwork( icsrc+k-1 ) =
indxg2p( iwork(ililo+k-1), nb, mycol,
670 $ desct( csrc_ ), npcol )
671 tilo = iwork(ililo+k-1)
672 tihi =
min( n,
iceil( tilo, nb ) * nb )
673 DO 90 kk = tihi, tilo, -1
674 IF( SELECT(kk).NE.0 ) THEN
675 iwork(ilihi+k-1) =
max(iwork(ilihi+k-1) , kk )
676 iwork(ilsel+k-1) = iwork(ilsel+k-1) + 1
677 IF( iwork(ilsel+k-1).GT.wineig ) THEN
678 iwork(ilihi+k-1) = kk
679 iwork(ilsel+k-1) = 1
680 END IF
681 END IF
682 90 CONTINUE
683
684
685
686
687
688
689
690
691
692 lihi = iwork(ilihi+k-1)
693 IF( lihi.LT.n ) THEN
694 CALL pselget(
'All', top, elem, t, lihi+1, lihi, desct )
695 IF( elem.NE.zero ) THEN
696 IF(
iceil( lihi, nb ) .NE.
iceil( lihi+1, nb ) .OR.
697 $ iwork( ilsel+k-1 ).EQ.wineig ) THEN
698 iwork( ilihi+k-1 ) = iwork( ilihi+k-1 ) - 1
699 IF( iwork( ilsel+k-1 ).GT.2 )
700 $ iwork( ilsel+k-1 ) = iwork( ilsel+k-1 ) - 1
701 ELSE
702 iwork( ilihi+k-1 ) = iwork( ilihi+k-1 ) + 1
703 IF( SELECT(lihi+1).NE.0 )
704 $ iwork( ilsel+k-1 ) = iwork( ilsel+k-1 ) + 1
705 END IF
706 END IF
707 END IF
708 80 CONTINUE
709
710
711
712
713
714
715 DO 85 k = 1, nmwin2
716 lilo = iwork( ililo + k - 1 )
717 lihi = iwork( ilihi + k - 1 )
718 lsel = iwork( ilsel + k - 1 )
719 IF( lsel.EQ.0 .OR. lilo.EQ.lihi ) THEN
720 lihi = iwork( ilihi + k - 1 )
721 iwork( ilihi + k - 1 ) = (
iceil(lihi,nb)-1)*nb + 1
722 iwork( ililo + k - 1 ) = iwork( ilihi + k - 1 ) + 1
723 END IF
724 85 CONTINUE
725
726
727
728
729 lilo = ihi
730 lihi = ilo
731 lsel = m
732 first = .true.
733 DO 95 window = 1, nmwin2
734 rsrc = iwork(irsrc+window-1)
735 csrc = iwork(icsrc+window-1)
736 IF( myrow.EQ.rsrc .OR. mycol.EQ.csrc ) THEN
737 tlilo = iwork( ililo + window - 1 )
738 tlihi = iwork( ilihi + window - 1 )
739 tlsel = iwork( ilsel + window - 1 )
740 IF( (.NOT. ( lihi .GE. lilo + lsel ) ) .AND.
741 $ ( (tlihi .GE. tlilo + tlsel) .OR. first ) ) THEN
742 IF( first ) first = .false.
743 lilo = tlilo
744 lihi = tlihi
745 lsel = tlsel
746 GO TO 97
747 END IF
748 END IF
749 95 CONTINUE
750 97 CONTINUE
751
752
753
754
755 ierr = 0
756 IF( lilo.EQ.ihi .AND. lihi.EQ.ilo .AND. lsel.EQ.m )
757 $ GO TO 114
758
759
760
761
762 first = .true.
763
764
765
766 round = 1
767 130 CONTINUE
768 IF( first .OR. ( lihi .GE. lilo + lsel ) ) THEN
769
770
771
772
773
774
775 DO 110 window = 1, nmwin2
776 rsrc = iwork(irsrc+window-1)
777 csrc = iwork(icsrc+window-1)
778
779
780
781
782 IF( myrow.EQ.rsrc .AND. mycol.EQ.csrc ) THEN
783 lilo = iwork(ililo+window-1)
784 lihi = iwork(ilihi+window-1)
785 lsel = iwork(ilsel+window-1)
786
787
788
789 i =
max( lilo, lihi - winsiz + 1 )
790
791
792
793
794 IF( i.GT.lilo ) THEN
795 CALL infog2l( i, i-1, desct, nprow, npcol, myrow,
796 $ mycol, iloc, jloc, rsrc, csrc )
797 IF( t( lldt*(jloc-1) + iloc ).NE.zero )
798 $ i = i + 1
799 END IF
800
801
802
803 CALL infog2l( i, i, desct, nprow, npcol,
804 $ myrow, mycol, iloc1, jloc1, rsrc, csrc )
805
806
807
808
809
810 nwin = lihi - i + 1
811 ks = 0
812 pitraf = ipiw
813 pdtraf = ipw2
814
815 pair = .false.
816 DO 140 k = i, lihi
817 IF( pair ) THEN
818 pair = .false.
819 ELSE
820 swap = SELECT( k ).NE.0
821 IF( k.LT.lihi ) THEN
822 CALL infog2l( k+1, k, desct, nprow, npcol,
823 $ myrow, mycol, iloc, jloc, rsrc, csrc )
824 IF( t( lldt*(jloc-1) + iloc ).NE.zero )
825 $ pair = .true.
826 END IF
827 IF( swap ) THEN
828 ks = ks + 1
829
830
831
832 ierr = 0
833 kk = k - i + 1
834 kks = ks
835 IF( kk.NE.ks ) THEN
836 nitraf = liwork - pitraf + 1
837 ndtraf = lwork - pdtraf + 1
839 $ t(lldt*(jloc1-1) + iloc1), lldt, kk,
840 $ kks, nitraf, iwork( pitraf ), ndtraf,
841 $ work( pdtraf ), work(ipw1), ierr )
842 pitraf = pitraf + nitraf
843 pdtraf = pdtraf + ndtraf
844
845
846
847 IF ( pair ) THEN
848 DO 150 j = i+kk-1, i+kks, -1
849 SELECT(j+1) = SELECT(j-1)
850 150 CONTINUE
851 SELECT(i+kks-1) = 1
852 SELECT(i+kks) = 1
853 ELSE
854 DO 160 j = i+kk-1, i+kks, -1
855 SELECT(j) = SELECT(j-1)
856 160 CONTINUE
857 SELECT(i+kks-1) = 1
858 END IF
859
860 IF ( ierr.EQ.1 .OR. ierr.EQ.2 ) THEN
861
862
863
864
865
866
867
868
869
870 IF ( ierr.EQ.2 ) THEN
871 SELECT( i+kks-3 ) = 1
872 SELECT( i+kks-1 ) = 0
873 kks = kks + 1
874 END IF
875
876
877
878 GO TO 170
879 END IF
880 ks = kks
881 END IF
882 IF( pair )
883 $ ks = ks + 1
884 END IF
885 END IF
886 140 CONTINUE
887 END IF
888 110 CONTINUE
889 170 CONTINUE
890
891
892
893
894
895 DO 175 window = 1, nmwin2
896 rsrc = iwork(irsrc+window-1)
897 csrc = iwork(icsrc+window-1)
898 IF( myrow.EQ.rsrc .AND. mycol.EQ.csrc ) THEN
899 ibuff( 1 ) = i
900 ibuff( 2 ) = nwin
901 ibuff( 3 ) = pitraf
902 ibuff( 4 ) = ks
903 ibuff( 5 ) = pdtraf
904 ibuff( 6 ) = ndtraf
905 ilen = pitraf - ipiw
906 dlen = pdtraf - ipw2
907 ibuff( 7 ) = ilen
908 ibuff( 8 ) = dlen
909 END IF
910 175 CONTINUE
911
912
913
914
915
916
917
918 DO 1111 dir = 1, 2
919
920
921
922
923
924
925
926 DO 111 window = 1, nmwin2
927 rsrc = iwork(irsrc+window-1)
928 csrc = iwork(icsrc+window-1)
929 IF( myrow.EQ.rsrc .OR. mycol.EQ.csrc ) THEN
930 lilo = iwork(ililo+window-1)
931 lihi = iwork(ilihi+window-1)
932 lsel = iwork(ilsel+window-1)
933 END IF
934 IF( myrow.EQ.rsrc .AND. mycol.EQ.csrc ) THEN
935 IF( npcol.GT.1 .AND. dir.EQ.1 )
936 $ CALL igebs2d( ictxt, 'Row', top, 8, 1, ibuff, 8 )
937 IF( nprow.GT.1 .AND. dir.EQ.2 )
938 $ CALL igebs2d( ictxt, 'Col', top, 8, 1, ibuff, 8 )
939 ELSEIF( myrow.EQ.rsrc .OR. mycol.EQ.csrc ) THEN
940 IF( npcol.GT.1 .AND. dir.EQ.1 .AND. myrow.EQ.rsrc )
941 $ THEN
942 IF( first .OR. (lihi .GE. lilo + lsel) ) THEN
943 CALL igebr2d( ictxt, 'Row', top, 8, 1, ibuff, 8,
944 $ rsrc, csrc )
945 i = ibuff( 1 )
946 nwin = ibuff( 2 )
947 pitraf = ibuff( 3 )
948 ks = ibuff( 4 )
949 pdtraf = ibuff( 5 )
950 ndtraf = ibuff( 6 )
951 ilen = ibuff( 7 )
952 dlen = ibuff( 8 )
953 ELSE
954 ilen = 0
955 dlen = 0
956 ks = -1
957 END IF
958 END IF
959 IF( nprow.GT.1 .AND. dir.EQ.2 .AND. mycol.EQ.csrc )
960 $ THEN
961 IF( first .OR. (lihi .GE. lilo + lsel) ) THEN
962 CALL igebr2d( ictxt, 'Col', top, 8, 1, ibuff, 8,
963 $ rsrc, csrc )
964 i = ibuff( 1 )
965 nwin = ibuff( 2 )
966 pitraf = ibuff( 3 )
967 ks = ibuff( 4 )
968 pdtraf = ibuff( 5 )
969 ndtraf = ibuff( 6 )
970 ilen = ibuff( 7 )
971 dlen = ibuff( 8 )
972 ELSE
973 ilen = 0
974 dlen = 0
975 ks = -1
976 END IF
977 END IF
978 END IF
979
980
981
982
983
984
985
986
987
988
989 IF( myrow.EQ.rsrc .AND. mycol.EQ.csrc ) THEN
990 buffer = pdtraf
991 bufflen = dlen + ilen
992 IF( bufflen.NE.0 ) THEN
993 DO 180 indx = 1, ilen
994 work( buffer+indx-1 ) =
995 $ float( iwork(ipiw+indx-1) )
996 180 CONTINUE
997 CALL slamov( 'All', dlen, 1, work( ipw2 ),
998 $ dlen, work(buffer+ilen), dlen )
999 IF( npcol.GT.1 .AND. dir.EQ.1 ) THEN
1000 CALL sgebs2d( ictxt, 'Row', top, bufflen, 1,
1001 $ work(buffer), bufflen )
1002 END IF
1003 IF( nprow.GT.1 .AND. dir.EQ.2 ) THEN
1004 CALL sgebs2d( ictxt, 'Col', top, bufflen, 1,
1005 $ work(buffer), bufflen )
1006 END IF
1007 END IF
1008 ELSEIF( myrow.EQ.rsrc .OR. mycol.EQ.csrc ) THEN
1009 IF( npcol.GT.1 .AND. dir.EQ.1 .AND. myrow.EQ.rsrc )
1010 $ THEN
1011 buffer = pdtraf
1012 bufflen = dlen + ilen
1013 IF( bufflen.NE.0 ) THEN
1014 CALL sgebr2d( ictxt, 'Row', top, bufflen, 1,
1015 $ work(buffer), bufflen, rsrc, csrc )
1016 END IF
1017 END IF
1018 IF( nprow.GT.1 .AND. dir.EQ.2 .AND. mycol.EQ.csrc )
1019 $ THEN
1020 buffer = pdtraf
1021 bufflen = dlen + ilen
1022 IF( bufflen.NE.0 ) THEN
1023 CALL sgebr2d( ictxt, 'Col', top, bufflen, 1,
1024 $ work(buffer), bufflen, rsrc, csrc )
1025 END IF
1026 END IF
1027 IF((npcol.GT.1.AND.dir.EQ.1.AND.myrow.EQ.rsrc).OR.
1028 $ (nprow.GT.1.AND.dir.EQ.2.AND.mycol.EQ.csrc ) )
1029 $ THEN
1030 IF( bufflen.NE.0 ) THEN
1031 DO 190 indx = 1, ilen
1032 iwork(ipiw+indx-1) =
1033 $ int(work( buffer+indx-1 ))
1034 190 CONTINUE
1035 CALL slamov( 'All', dlen, 1,
1036 $ work( buffer+ilen ), dlen,
1037 $ work( ipw2 ), dlen )
1038 END IF
1039 END IF
1040 END IF
1041 111 CONTINUE
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052 DO 112 window = 1, nmwin2
1053 rsrc = iwork(irsrc+window-1)
1054 csrc = iwork(icsrc+window-1)
1055
1056 IF( (myrow.EQ.rsrc .AND. dir.EQ.1 ).OR.
1057 $ (mycol.EQ.csrc .AND. dir.EQ.2 ) ) THEN
1058 lilo = iwork(ililo+window-1)
1059 lihi = iwork(ilihi+window-1)
1060 lsel = iwork(ilsel+window-1)
1061
1062
1063
1064 IF( bufflen.EQ.0 ) GO TO 295
1065
1066 nitraf = pitraf - ipiw
1067 ishh = .false.
1068 flops = 0
1069 DO 200 k = 1, nitraf
1070 IF( iwork( ipiw + k - 1 ).LE.nwin ) THEN
1071 flops = flops + 6
1072 ELSE
1073 flops = flops + 11
1074 ishh = .true.
1075 END IF
1076 200 CONTINUE
1077
1078
1079
1080
1081 pdw = buffer
1082 ipw3 = pdw + nwin*nwin
1083 ELSE
1084 flops = 0
1085 END IF
1086
1087 IF( flops.NE.0 .AND.
1088 $ ( flops*100 ) / ( 2*nwin*nwin ) .GE. mmult ) THEN
1089
1090
1091
1092
1093
1094
1095
1096 CALL slaset( 'All', nwin, nwin, zero, one,
1097 $ work( pdw ), nwin )
1098 CALL bslaapp( 1, nwin, nwin, ncb, work( pdw ), nwin,
1099 $ nitraf, iwork(ipiw), work( ipw2 ), work(ipw3) )
1100
1101 IF( ishh ) THEN
1102
1103
1104
1105
1106
1107
1108
1109
1110 IF( dir.EQ.2 ) THEN
1111 DO 210 indx = 1, i-1, nb
1112 CALL infog2l( indx, i, desct, nprow, npcol,
1113 $ myrow, mycol, iloc, jloc, rsrc1, csrc1 )
1114 IF( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 )
1115 $ THEN
1116 lrows =
min(nb,i-indx)
1117 CALL sgemm( 'No transpose',
1118 $ 'No transpose', lrows, nwin, nwin,
1119 $ one, t((jloc-1)*lldt+iloc), lldt,
1120 $ work( pdw ), nwin, zero,
1121 $ work(ipw3), lrows )
1122 CALL slamov( 'All', lrows, nwin,
1123 $ work(ipw3), lrows,
1124 $ t((jloc-1)*lldt+iloc), lldt )
1125 END IF
1126 210 CONTINUE
1127 IF( wantq ) THEN
1128 DO 220 indx = 1, n, nb
1129 CALL infog2l( indx, i, descq, nprow,
1130 $ npcol, myrow, mycol, iloc, jloc,
1131 $ rsrc1, csrc1 )
1132 IF( myrow.EQ.rsrc1.AND.mycol.EQ.csrc1 )
1133 $ THEN
1134 lrows =
min(nb,n-indx+1)
1135 CALL sgemm( 'No transpose',
1136 $ 'No transpose', lrows, nwin, nwin,
1137 $ one, q((jloc-1)*lldq+iloc), lldq,
1138 $ work( pdw ), nwin, zero,
1139 $ work(ipw3), lrows )
1140 CALL slamov( 'All', lrows, nwin,
1141 $ work(ipw3), lrows,
1142 $ q((jloc-1)*lldq+iloc), lldq )
1143 END IF
1144 220 CONTINUE
1145 END IF
1146 END IF
1147
1148
1149
1150 IF( dir.EQ.1 ) THEN
1151 IF( lihi.LT.n ) THEN
1152 IF( mod(lihi,nb).GT.0 ) THEN
1153 indx = lihi + 1
1154 CALL infog2l( i, indx, desct, nprow,
1155 $ npcol, myrow, mycol, iloc, jloc,
1156 $ rsrc1, csrc1 )
1157 IF( myrow.EQ.rsrc1.AND.mycol.EQ.csrc1 )
1158 $ THEN
1159 lcols = mod(
min( nb-mod(lihi,nb),
1160 $ n-lihi ), nb )
1161 CALL sgemm( 'Transpose',
1162 $ 'No Transpose', nwin, lcols, nwin,
1163 $ one, work( pdw ), nwin,
1164 $ t((jloc-1)*lldt+iloc), lldt, zero,
1165 $ work(ipw3), nwin )
1166 CALL slamov( 'All', nwin, lcols,
1167 $ work(ipw3), nwin,
1168 $ t((jloc-1)*lldt+iloc), lldt )
1169 END IF
1170 END IF
1171 indxs =
iceil(lihi,nb)*nb + 1
1172 DO 230 indx = indxs, n, nb
1173 CALL infog2l( i, indx, desct, nprow,
1174 $ npcol, myrow, mycol, iloc, jloc,
1175 $ rsrc1, csrc1 )
1176 IF( myrow.EQ.rsrc1.AND.mycol.EQ.csrc1 )
1177 $ THEN
1178 lcols =
min( nb, n-indx+1 )
1179 CALL sgemm( 'Transpose',
1180 $ 'No Transpose', nwin, lcols, nwin,
1181 $ one, work( pdw ), nwin,
1182 $ t((jloc-1)*lldt+iloc), lldt, zero,
1183 $ work(ipw3), nwin )
1184 CALL slamov( 'All', nwin, lcols,
1185 $ work(ipw3), nwin,
1186 $ t((jloc-1)*lldt+iloc), lldt )
1187 END IF
1188 230 CONTINUE
1189 END IF
1190 END IF
1191 ELSE
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209 IF( dir.EQ.2 ) THEN
1210 DO 240 indx = 1, i-1, nb
1211 CALL infog2l( indx, i, desct, nprow, npcol,
1212 $ myrow, mycol, iloc, jloc, rsrc1, csrc1 )
1213 IF( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 )
1214 $ THEN
1215 jloc1 =
indxg2l( i+nwin-ks, nb, mycol,
1216 $ desct( csrc_ ), npcol )
1217 lrows =
min(nb,i-indx)
1218 CALL slamov( 'All', lrows, ks,
1219 $ t((jloc1-1)*lldt+iloc ), lldt,
1220 $ work(ipw3), lrows )
1221 CALL strmm( 'Right', 'Upper',
1222 $ 'No transpose',
1223 $ 'Non-unit', lrows, ks, one,
1224 $ work( pdw+nwin-ks ), nwin,
1225 $ work(ipw3), lrows )
1226 CALL sgemm( 'No transpose',
1227 $ 'No transpose', lrows, ks, nwin-ks,
1228 $ one, t((jloc-1)*lldt+iloc), lldt,
1229 $ work( pdw ), nwin, one, work(ipw3),
1230 $ lrows )
1231
1232
1233
1234 CALL slamov( 'All', lrows, nwin-ks,
1235 $ t((jloc-1)*lldt+iloc), lldt,
1236 $ work( ipw3+ks*lrows ), lrows )
1237 CALL strmm( 'Right', 'Lower',
1238 $ 'No transpose', 'Non-unit',
1239 $ lrows, nwin-ks, one,
1240 $ work( pdw+nwin*ks ), nwin,
1241 $ work( ipw3+ks*lrows ), lrows )
1242 CALL sgemm( 'No transpose',
1243 $ 'No transpose', lrows, nwin-ks, ks,
1244 $ one, t((jloc1-1)*lldt+iloc), lldt,
1245 $ work( pdw+nwin*ks+nwin-ks ), nwin,
1246 $ one, work( ipw3+ks*lrows ), lrows )
1247
1248
1249
1250 CALL slamov( 'All', lrows, nwin,
1251 $ work(ipw3), lrows,
1252 $ t((jloc-1)*lldt+iloc), lldt )
1253 END IF
1254 240 CONTINUE
1255 IF( wantq ) THEN
1256
1257
1258
1259 DO 250 indx = 1, n, nb
1260 CALL infog2l( indx, i, descq, nprow,
1261 $ npcol, myrow, mycol, iloc, jloc,
1262 $ rsrc1, csrc1 )
1263 IF( myrow.EQ.rsrc1.AND.mycol.EQ.csrc1 )
1264 $ THEN
1265 jloc1 =
indxg2l( i+nwin-ks, nb,
1266 $ mycol, descq( csrc_ ), npcol )
1267 lrows =
min(nb,n-indx+1)
1268 CALL slamov( 'All', lrows, ks,
1269 $ q((jloc1-1)*lldq+iloc ), lldq,
1270 $ work(ipw3), lrows )
1271 CALL strmm( 'Right', 'Upper',
1272 $ 'No transpose', 'Non-unit',
1273 $ lrows, ks, one,
1274 $ work( pdw+nwin-ks ), nwin,
1275 $ work(ipw3), lrows )
1276 CALL sgemm( 'No transpose',
1277 $ 'No transpose', lrows, ks,
1278 $ nwin-ks, one,
1279 $ q((jloc-1)*lldq+iloc), lldq,
1280 $ work( pdw ), nwin, one,
1281 $ work(ipw3), lrows )
1282
1283
1284
1285 CALL slamov( 'All', lrows, nwin-ks,
1286 $ q((jloc-1)*lldq+iloc), lldq,
1287 $ work( ipw3+ks*lrows ), lrows)
1288 CALL strmm( 'Right', 'Lower',
1289 $ 'No transpose', 'Non-unit',
1290 $ lrows, nwin-ks, one,
1291 $ work( pdw+nwin*ks ), nwin,
1292 $ work( ipw3+ks*lrows ), lrows)
1293 CALL sgemm( 'No transpose',
1294 $ 'No transpose', lrows, nwin-ks,
1295 $ ks, one, q((jloc1-1)*lldq+iloc),
1296 $ lldq, work(pdw+nwin*ks+nwin-ks),
1297 $ nwin, one, work( ipw3+ks*lrows ),
1298 $ lrows )
1299
1300
1301
1302 CALL slamov( 'All', lrows, nwin,
1303 $ work(ipw3), lrows,
1304 $ q((jloc-1)*lldq+iloc), lldq )
1305 END IF
1306 250 CONTINUE
1307 END IF
1308 END IF
1309
1310 IF( dir.EQ.1 ) THEN
1311 IF ( lihi.LT.n ) THEN
1312
1313
1314
1315 IF( mod(lihi,nb).GT.0 ) THEN
1316 indx = lihi + 1
1317 CALL infog2l( i, indx, desct, nprow,
1318 $ npcol, myrow, mycol, iloc, jloc,
1319 $ rsrc1, csrc1 )
1320 IF( myrow.EQ.rsrc1.AND.mycol.EQ.csrc1 )
1321 $ THEN
1322 iloc1 =
indxg2l( i+nwin-ks, nb, myrow,
1323 $ desct( rsrc_ ), nprow )
1324 lcols = mod(
min( nb-mod(lihi,nb),
1325 $ n-lihi ), nb )
1326 CALL slamov( 'All', ks, lcols,
1327 $ t((jloc-1)*lldt+iloc1), lldt,
1328 $ work(ipw3), nwin )
1329 CALL strmm( 'Left', 'Upper',
1330 $ 'Transpose', 'Non-unit', ks,
1331 $ lcols, one, work( pdw+nwin-ks ),
1332 $ nwin, work(ipw3), nwin )
1333 CALL sgemm( 'Transpose',
1334 $ 'No transpose', ks, lcols,
1335 $ nwin-ks, one, work(pdw), nwin,
1336 $ t((jloc-1)*lldt+iloc), lldt, one,
1337 $ work(ipw3), nwin )
1338
1339
1340
1341
1342 CALL slamov( 'All', nwin-ks, lcols,
1343 $ t((jloc-1)*lldt+iloc), lldt,
1344 $ work( ipw3+ks ), nwin )
1345 CALL strmm( 'Left', 'Lower',
1346 $ 'Transpose', 'Non-unit',
1347 $ nwin-ks, lcols, one,
1348 $ work( pdw+nwin*ks ), nwin,
1349 $ work( ipw3+ks ), nwin )
1350 CALL sgemm( 'Transpose',
1351 $ 'No Transpose', nwin-ks, lcols,
1352 $ ks, one,
1353 $ work( pdw+nwin*ks+nwin-ks ),
1354 $ nwin, t((jloc-1)*lldt+iloc1),
1355 $ lldt, one, work( ipw3+ks ),
1356 $ nwin )
1357
1358
1359
1360 CALL slamov( 'All', nwin, lcols,
1361 $ work(ipw3), nwin,
1362 $ t((jloc-1)*lldt+iloc), lldt )
1363 END IF
1364 END IF
1365 indxs =
iceil(lihi,nb)*nb + 1
1366 DO 260 indx = indxs, n, nb
1367 CALL infog2l( i, indx, desct, nprow,
1368 $ npcol, myrow, mycol, iloc, jloc,
1369 $ rsrc1, csrc1 )
1370 IF( myrow.EQ.rsrc1.AND.mycol.EQ.csrc1 )
1371 $ THEN
1372
1373
1374
1375
1376 iloc1 =
indxg2l( i+nwin-ks, nb,
1377 $ myrow, desct( rsrc_ ), nprow )
1378 lcols =
min( nb, n-indx+1 )
1379 CALL slamov( 'All', ks, lcols,
1380 $ t((jloc-1)*lldt+iloc1), lldt,
1381 $ work(ipw3), nwin )
1382 CALL strmm( 'Left', 'Upper',
1383 $ 'Transpose', 'Non-unit', ks,
1384 $ lcols, one,
1385 $ work( pdw+nwin-ks ), nwin,
1386 $ work(ipw3), nwin )
1387 CALL sgemm( 'Transpose',
1388 $ 'No transpose', ks, lcols,
1389 $ nwin-ks, one, work(pdw), nwin,
1390 $ t((jloc-1)*lldt+iloc), lldt, one,
1391 $ work(ipw3), nwin )
1392
1393
1394
1395
1396 CALL slamov( 'All', nwin-ks, lcols,
1397 $ t((jloc-1)*lldt+iloc), lldt,
1398 $ work( ipw3+ks ), nwin )
1399 CALL strmm( 'Left', 'Lower',
1400 $ 'Transpose', 'Non-unit',
1401 $ nwin-ks, lcols, one,
1402 $ work( pdw+nwin*ks ), nwin,
1403 $ work( ipw3+ks ), nwin )
1404 CALL sgemm( 'Transpose',
1405 $ 'No Transpose', nwin-ks, lcols,
1406 $ ks, one,
1407 $ work( pdw+nwin*ks+nwin-ks ),
1408 $ nwin, t((jloc-1)*lldt+iloc1),
1409 $ lldt, one, work(ipw3+ks), nwin )
1410
1411
1412
1413 CALL slamov( 'All', nwin, lcols,
1414 $ work(ipw3), nwin,
1415 $ t((jloc-1)*lldt+iloc), lldt )
1416 END IF
1417 260 CONTINUE
1418 END IF
1419 END IF
1420 END IF
1421 ELSEIF( flops.NE.0 ) THEN
1422
1423
1424
1425
1426 IF( dir.EQ.2 ) THEN
1427 DO 270 indx = 1, i-1, nb
1428 CALL infog2l( indx, i, desct, nprow, npcol,
1429 $ myrow, mycol, iloc, jloc, rsrc1, csrc1 )
1430 IF( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 ) THEN
1431 lrows =
min(nb,i-indx)
1432 CALL bslaapp( 1, lrows, nwin, ncb,
1433 $ t((jloc-1)*lldt+iloc ), lldt, nitraf,
1434 $ iwork(ipiw), work( ipw2 ),
1435 $ work(ipw3) )
1436 END IF
1437 270 CONTINUE
1438 IF( wantq ) THEN
1439 DO 280 indx = 1, n, nb
1440 CALL infog2l( indx, i, descq, nprow, npcol,
1441 $ myrow, mycol, iloc, jloc, rsrc1, csrc1 )
1442 IF( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 )
1443 $ THEN
1444 lrows =
min(nb,n-indx+1)
1445 CALL bslaapp( 1, lrows, nwin, ncb,
1446 $ q((jloc-1)*lldq+iloc), lldq, nitraf,
1447 $ iwork(ipiw), work( ipw2 ),
1448 $ work(ipw3) )
1449 END IF
1450 280 CONTINUE
1451 END IF
1452 END IF
1453 IF( dir.EQ.1 ) THEN
1454 IF( lihi.LT.n ) THEN
1455 IF( mod(lihi,nb).GT.0 ) THEN
1456 indx = lihi + 1
1457 CALL infog2l( i, indx, desct, nprow, npcol,
1458 $ myrow, mycol, iloc, jloc, rsrc1, csrc1 )
1459 IF( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 )
1460 $ THEN
1461 lcols = mod(
min( nb-mod(lihi,nb),
1462 $ n-lihi ), nb )
1463 CALL bslaapp( 0, nwin, lcols, ncb,
1464 $ t((jloc-1)*lldt+iloc), lldt, nitraf,
1465 $ iwork(ipiw), work( ipw2 ),
1466 $ work(ipw3) )
1467 END IF
1468 END IF
1469 indxs =
iceil(lihi,nb)*nb + 1
1470 DO 290 indx = indxs, n, nb
1471 CALL infog2l( i, indx, desct, nprow, npcol,
1472 $ myrow, mycol, iloc, jloc, rsrc1, csrc1 )
1473 IF( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 )
1474 $ THEN
1475 lcols =
min( nb, n-indx+1 )
1476 CALL bslaapp( 0, nwin, lcols, ncb,
1477 $ t((jloc-1)*lldt+iloc), lldt, nitraf,
1478 $ iwork(ipiw), work( ipw2 ),
1479 $ work(ipw3) )
1480 END IF
1481 290 CONTINUE
1482 END IF
1483 END IF
1484 END IF
1485
1486
1487
1488
1489
1490 295 CONTINUE
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509 IF( myrow.EQ.rsrc.AND.mycol.EQ.csrc ) THEN
1510 IF( dir.EQ.2 ) THEN
1511 IF( bufflen.NE.0 .OR. ks.EQ.0 .OR.
1512 $ ( bufflen.EQ.0 .AND. ks.GT.0 ) )
1513 $ lihi = i + ks - 1
1514 iwork( ilihi+window-1 ) = lihi
1515 IF( .NOT. lihi.GE.lilo+lsel ) THEN
1516 lilo = lilo + lsel
1517 iwork( ililo+window-1 ) = lilo
1518 END IF
1519 END IF
1520 ELSEIF( myrow.EQ.rsrc .AND. dir.EQ.1 ) THEN
1521 IF( bufflen.NE.0 .OR. ks.EQ.0 .OR.
1522 $ ( bufflen.EQ.0 .AND. ks.GT.0 ) )
1523 $ lihi = i + ks - 1
1524 iwork( ilihi+window-1 ) = lihi
1525 IF( .NOT. lihi.GE.lilo+lsel ) THEN
1526 lilo = lilo + lsel
1527 iwork( ililo+window-1 ) = lilo
1528 END IF
1529 ELSEIF( mycol.EQ.csrc .AND. dir.EQ.2 ) THEN
1530 IF( bufflen.NE.0 .OR. ks.EQ.0 .OR.
1531 $ ( bufflen.EQ.0 .AND. ks.GT.0 ) )
1532 $ lihi = i + ks - 1
1533 iwork( ilihi+window-1 ) = lihi
1534 IF( .NOT. lihi.GE.lilo+lsel ) THEN
1535 lilo = lilo + lsel
1536 iwork( ililo+window-1 ) = lilo
1537 END IF
1538 END IF
1539
1540 112 CONTINUE
1541
1542
1543
1544
1545 1111 CONTINUE
1546
1547
1548
1549
1550
1551
1552
1553
1554 DO 113 window = 1, nmwin2
1555 rsrc = iwork( irsrc + window - 1 )
1556 IF( myrow.EQ.rsrc .AND. (.NOT. lihi.GE.lilo+lsel ) ) THEN
1557 lilo = iwork( ililo + window - 1 )
1558 lihi = iwork( ilihi + window - 1 )
1559 lsel = iwork( ilsel + window - 1 )
1560 END IF
1561 113 CONTINUE
1562
1563
1564 round = round + 1
1565 IF( first ) first = .false.
1566 GO TO 130
1567 END IF
1568
1569
1570
1571 114 CONTINUE
1572
1573
1574
1575 CALL blacs_barrier( ictxt, 'All' )
1576
1577
1578
1579
1580 myierr = ierr
1581 IF( nprocs.GT.1 ) THEN
1582 CALL igamx2d( ictxt, 'All', top, 1, 1, ierr, 1, -1,
1583 $ -1, -1, -1, -1 )
1584 END IF
1585
1586 IF( ierr.NE.0 ) THEN
1587
1588
1589
1590
1591 IF( myierr.NE.0 ) info =
max(1,i+kks-1)
1592 IF( nprocs.GT.1 ) THEN
1593 CALL igamx2d( ictxt, 'All', top, 1, 1, info, 1, -1,
1594 $ -1, -1, -1, -1 )
1595 END IF
1596 GO TO 300
1597 END IF
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650 lastwait = nmwin2.GT.1 .AND. mod(nmwin2,2).EQ.1 .AND.
1651 $ nmwin2.EQ.
min(nprow,npcol)
1652
1653 last = 0
1654 308 CONTINUE
1655 IF( lastwait ) THEN
1656 IF( last.EQ.0 ) THEN
1657 win0s = 1
1658 win0e = 2
1659 wine = nmwin2 - 1
1660 ELSE
1661 win0s = nmwin2
1662 win0e = nmwin2
1663 wine = nmwin2
1664 END IF
1665 ELSE
1666 win0s = 1
1667 win0e = 2
1668 wine = nmwin2
1669 END IF
1670 DO 310 window0 = win0s, win0e
1671 DO 320 window = window0, wine, 2
1672
1673
1674
1675
1676 rsrc4 = iwork(irsrc+window-1)
1677 csrc4 = iwork(icsrc+window-1)
1678
1679
1680
1681 rsrc3 = rsrc4
1682 csrc3 = mod( csrc4 - 1 + npcol, npcol )
1683 rsrc2 = mod( rsrc4 - 1 + nprow, nprow )
1684 csrc2 = csrc4
1685 rsrc1 = rsrc2
1686 csrc1 = csrc3
1687 IF( ( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 ) .OR.
1688 $ ( myrow.EQ.rsrc2 .AND. mycol.EQ.csrc2 ) .OR.
1689 $ ( myrow.EQ.rsrc3 .AND. mycol.EQ.csrc3 ) .OR.
1690 $ ( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) ) THEN
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702 IF( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) THEN
1703 lihi4 = ( iwork( ililo + window - 1 ) +
1704 $ iwork( ilihi + window - 1 ) ) / 2
1705 lihic =
min(lihi4,(
iceil(lihi4,nb)-1)*nb+wneicr)
1706
1707
1708
1709
1710
1711 IF( (.NOT. lihic.LE.nb) .AND. lihic.LT.n ) THEN
1712 iloc =
indxg2l( lihic+1, nb, myrow,
1713 $ desct( rsrc_ ), nprow )
1714 jloc =
indxg2l( lihic, nb, mycol,
1715 $ desct( csrc_ ), npcol )
1716 IF( t( (jloc-1)*lldt+iloc ).NE.zero ) THEN
1717 IF( mod( lihic, nb ).EQ.1 .OR.
1718 $ ( mod( lihic, nb ).EQ.2 .AND.
1719 $ SELECT(lihic-2).EQ.0 ) )
1720 $ THEN
1721 lihic = lihic + 1
1722 ELSE
1723 lihic = lihic - 1
1724 END IF
1725 END IF
1726 END IF
1727 IF( rsrc4.NE.rsrc1 .OR. csrc4.NE.csrc1 )
1728 $ CALL igesd2d( ictxt, 1, 1, lihic, 1, rsrc1,
1729 $ csrc1 )
1730 IF( rsrc4.NE.rsrc2 .OR. csrc4.NE.csrc2 )
1731 $ CALL igesd2d( ictxt, 1, 1, lihic, 1, rsrc2,
1732 $ csrc2 )
1733 IF( rsrc4.NE.rsrc3 .OR. csrc4.NE.csrc3 )
1734 $ CALL igesd2d( ictxt, 1, 1, lihic, 1, rsrc3,
1735 $ csrc3 )
1736 END IF
1737 IF( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 ) THEN
1738 IF( rsrc4.NE.rsrc1 .OR. csrc4.NE.csrc1 )
1739 $ CALL igerv2d( ictxt, 1, 1, lihic, 1, rsrc4,
1740 $ csrc4 )
1741 END IF
1742 IF( myrow.EQ.rsrc2 .AND. mycol.EQ.csrc2 ) THEN
1743 IF( rsrc4.NE.rsrc2 .OR. csrc4.NE.csrc2 )
1744 $ CALL igerv2d( ictxt, 1, 1, lihic, 1, rsrc4,
1745 $ csrc4 )
1746 END IF
1747 IF( myrow.EQ.rsrc3 .AND. mycol.EQ.csrc3 ) THEN
1748 IF( rsrc4.NE.rsrc3 .OR. csrc4.NE.csrc3 )
1749 $ CALL igerv2d( ictxt, 1, 1, lihic, 1, rsrc4,
1750 $ csrc4 )
1751 END IF
1752
1753
1754
1755
1756
1757
1758 skip1cr = window.EQ.1 .AND.
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775 IF( .NOT. skip1cr ) THEN
1776 IF( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 ) THEN
1777 IF( window.EQ.1 ) THEN
1778 lihi1 = ilo
1779 ELSE
1780 lihi1 = iwork( ilihi + window - 2 )
1781 END IF
1783 $
min( lihic-2*mod(lihic,nb) + 1,
1784 $ (
iceil(lihic,nb)-1)*nb - 1 ) )
1785 iloc =
indxg2l( i, nb, myrow, desct( rsrc_ ),
1786 $ nprow )
1787 jloc =
indxg2l( i-1, nb, mycol, desct( csrc_ ),
1788 $ npcol )
1789 IF( t( (jloc-1)*lldt+iloc ).NE.zero )
1790 $ i = i - 1
1791 IF( rsrc1.NE.rsrc4 .OR. csrc1.NE.csrc4 )
1792 $ CALL igesd2d( ictxt, 1, 1, i, 1, rsrc4,
1793 $ csrc4 )
1794 IF( rsrc1.NE.rsrc2 .OR. csrc1.NE.csrc2 )
1795 $ CALL igesd2d( ictxt, 1, 1, i, 1, rsrc2,
1796 $ csrc2 )
1797 IF( rsrc1.NE.rsrc3 .OR. csrc1.NE.csrc3 )
1798 $ CALL igesd2d( ictxt, 1, 1, i, 1, rsrc3,
1799 $ csrc3 )
1800 END IF
1801 IF( myrow.EQ.rsrc2 .AND. mycol.EQ.csrc2 ) THEN
1802 IF( rsrc1.NE.rsrc2 .OR. csrc1.NE.csrc2 )
1803 $ CALL igerv2d( ictxt, 1, 1, i, 1, rsrc1,
1804 $ csrc1 )
1805 END IF
1806 IF( myrow.EQ.rsrc3 .AND. mycol.EQ.csrc3 ) THEN
1807 IF( rsrc1.NE.rsrc3 .OR. csrc1.NE.csrc3 )
1808 $ CALL igerv2d( ictxt, 1, 1, i, 1, rsrc1,
1809 $ csrc1 )
1810 END IF
1811 IF( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) THEN
1812 IF( rsrc1.NE.rsrc4 .OR. csrc1.NE.csrc4 )
1813 $ CALL igerv2d( ictxt, 1, 1, i, 1, rsrc1,
1814 $ csrc1 )
1815 END IF
1816 ELSE
1817 i = lihic
1818 END IF
1819
1820
1821
1822
1823 nwin = lihic - i + 1
1824 ks = 0
1825
1826
1827
1828 IF( skip1cr ) GO TO 360
1829
1830
1831
1832
1833
1834 CALL slaset( 'All', nwin, nwin, zero, zero,
1835 $ work( ipw2 ), nwin )
1836
1837 pitraf = ipiw
1838 ipw3 = ipw2 + nwin*nwin
1839 pdtraf = ipw3
1840
1841
1842
1843
1844
1845 IF( rsrc1.NE.rsrc4 .OR. csrc1.NE.csrc4 ) THEN
1846 ilen4 = mod(lihic,nb)
1847 seli4 =
iceil(i,nb)*nb+1
1848 ilen1 = nwin - ilen4
1849 IF( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 ) THEN
1850 CALL igesd2d( ictxt, ilen1, 1, SELECT(i),
1851 $ ilen1, rsrc4, csrc4 )
1852 CALL igerv2d( ictxt, ilen4, 1, SELECT(seli4),
1853 $ ilen4, rsrc4, csrc4 )
1854 END IF
1855 IF( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) THEN
1856 CALL igesd2d( ictxt, ilen4, 1, SELECT(seli4),
1857 $ ilen4, rsrc1, csrc1 )
1858 CALL igerv2d( ictxt, ilen1, 1, SELECT(i),
1859 $ ilen1, rsrc1, csrc1 )
1860 END IF
1861 END IF
1862
1863
1864
1865
1866 dim1 = nb - mod(i-1,nb)
1867 dim4 = nwin - dim1
1868 IF( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 ) THEN
1869 iloc =
indxg2l( i, nb, myrow, desct( rsrc_ ),
1870 $ nprow )
1871 jloc =
indxg2l( i, nb, mycol, desct( csrc_ ),
1872 $ npcol )
1873 CALL slamov( 'All', dim1, dim1,
1874 $ t((jloc-1)*lldt+iloc), lldt, work(ipw2),
1875 $ nwin )
1876 IF( rsrc1.NE.rsrc4 .OR. csrc1.NE.csrc4 ) THEN
1877 CALL sgesd2d( ictxt, dim1, dim1,
1878 $ work(ipw2), nwin, rsrc4, csrc4 )
1879 CALL sgerv2d( ictxt, dim4, dim4,
1880 $ work(ipw2+dim1*nwin+dim1), nwin, rsrc4,
1881 $ csrc4 )
1882 END IF
1883 END IF
1884 IF( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) THEN
1885 iloc =
indxg2l( i+dim1, nb, myrow, desct( rsrc_ ),
1886 $ nprow )
1887 jloc =
indxg2l( i+dim1, nb, mycol, desct( csrc_ ),
1888 $ npcol )
1889 CALL slamov( 'All', dim4, dim4,
1890 $ t((jloc-1)*lldt+iloc), lldt,
1891 $ work(ipw2+dim1*nwin+dim1), nwin )
1892 IF( rsrc4.NE.rsrc1 .OR. csrc4.NE.csrc1 ) THEN
1893 CALL sgesd2d( ictxt, dim4, dim4,
1894 $ work(ipw2+dim1*nwin+dim1), nwin, rsrc1,
1895 $ csrc1 )
1896 CALL sgerv2d( ictxt, dim1, dim1,
1897 $ work(ipw2), nwin, rsrc1, csrc1 )
1898 END IF
1899 END IF
1900 IF( myrow.EQ.rsrc2 .AND. mycol.EQ.csrc2 ) THEN
1901 iloc =
indxg2l( i, nb, myrow, desct( rsrc_ ),
1902 $ nprow )
1903 jloc =
indxg2l( i+dim1, nb, mycol, desct( csrc_ ),
1904 $ npcol )
1905 CALL slamov( 'All', dim1, dim4,
1906 $ t((jloc-1)*lldt+iloc), lldt,
1907 $ work(ipw2+dim1*nwin), nwin )
1908 IF( rsrc2.NE.rsrc1 .OR. csrc2.NE.csrc1 ) THEN
1909 CALL sgesd2d( ictxt, dim1, dim4,
1910 $ work(ipw2+dim1*nwin), nwin, rsrc1, csrc1 )
1911 END IF
1912 END IF
1913 IF( myrow.EQ.rsrc2 .AND. mycol.EQ.csrc2 ) THEN
1914 IF( rsrc2.NE.rsrc4 .OR. csrc2.NE.csrc4 ) THEN
1915 CALL sgesd2d( ictxt, dim1, dim4,
1916 $ work(ipw2+dim1*nwin), nwin, rsrc4, csrc4 )
1917 END IF
1918 END IF
1919 IF( myrow.EQ.rsrc3 .AND. mycol.EQ.csrc3 ) THEN
1920 iloc =
indxg2l( i+dim1, nb, myrow, desct( rsrc_ ),
1921 $ nprow )
1922 jloc =
indxg2l( i+dim1-1, nb, mycol,
1923 $ desct( csrc_ ), npcol )
1924 CALL slamov( 'All', 1, 1,
1925 $ t((jloc-1)*lldt+iloc), lldt,
1926 $ work(ipw2+(dim1-1)*nwin+dim1), nwin )
1927 IF( rsrc3.NE.rsrc1 .OR. csrc3.NE.csrc1 ) THEN
1928 CALL sgesd2d( ictxt, 1, 1,
1929 $ work(ipw2+(dim1-1)*nwin+dim1), nwin,
1930 $ rsrc1, csrc1 )
1931 END IF
1932 END IF
1933 IF( myrow.EQ.rsrc3 .AND. mycol.EQ.csrc3 ) THEN
1934 IF( rsrc3.NE.rsrc4 .OR. csrc3.NE.csrc4 ) THEN
1935 CALL sgesd2d( ictxt, 1, 1,
1936 $ work(ipw2+(dim1-1)*nwin+dim1), nwin,
1937 $ rsrc4, csrc4 )
1938 END IF
1939 END IF
1940 IF( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 ) THEN
1941 IF( rsrc1.NE.rsrc2 .OR. csrc1.NE.csrc2 ) THEN
1942 CALL sgerv2d( ictxt, dim1, dim4,
1943 $ work(ipw2+dim1*nwin), nwin, rsrc2,
1944 $ csrc2 )
1945 END IF
1946 IF( rsrc1.NE.rsrc3 .OR. csrc1.NE.csrc3 ) THEN
1947 CALL sgerv2d( ictxt, 1, 1,
1948 $ work(ipw2+(dim1-1)*nwin+dim1), nwin,
1949 $ rsrc3, csrc3 )
1950 END IF
1951 END IF
1952 IF( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) THEN
1953 IF( rsrc4.NE.rsrc2 .OR. csrc4.NE.csrc2 ) THEN
1954 CALL sgerv2d( ictxt, dim1, dim4,
1955 $ work(ipw2+dim1*nwin), nwin, rsrc2,
1956 $ csrc2 )
1957 END IF
1958 IF( rsrc4.NE.rsrc3 .OR. csrc4.NE.csrc3 ) THEN
1959 CALL sgerv2d( ictxt, 1, 1,
1960 $ work(ipw2+(dim1-1)*nwin+dim1), nwin,
1961 $ rsrc3, csrc3 )
1962 END IF
1963 END IF
1964
1965
1966
1967
1968
1969 IF( ( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 ) .OR.
1970 $ ( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) ) THEN
1971 pair = .false.
1972 DO 330 k = i, lihic
1973 IF( pair ) THEN
1974 pair = .false.
1975 ELSE
1976 swap = SELECT( k ).NE.0
1977 IF( k.LT.lihic ) THEN
1978 elem = work(ipw2+(k-i)*nwin+k-i+1)
1979 IF( elem.NE.zero )
1980 $ pair = .true.
1981 END IF
1982 IF( swap ) THEN
1983 ks = ks + 1
1984
1985
1986
1987 ierr = 0
1988 kk = k - i + 1
1989 kks = ks
1990 IF( kk.NE.ks ) THEN
1991 nitraf = liwork - pitraf + 1
1992 ndtraf = lwork - pdtraf + 1
1993 CALL bstrexc( nwin, work(ipw2), nwin,
1994 $ kk, kks, nitraf, iwork( pitraf ),
1995 $ ndtraf, work( pdtraf ),
1996 $ work(ipw1), ierr )
1997 pitraf = pitraf + nitraf
1998 pdtraf = pdtraf + ndtraf
1999
2000
2001
2002 IF ( pair ) THEN
2003 DO 340 j = i+kk-1, i+kks, -1
2004 SELECT(j+1) = SELECT(j-1)
2005 340 CONTINUE
2006 SELECT(i+kks-1) = 1
2007 SELECT(i+kks) = 1
2008 ELSE
2009 DO 350 j = i+kk-1, i+kks, -1
2010 SELECT(j) = SELECT(j-1)
2011 350 CONTINUE
2012 SELECT(i+kks-1) = 1
2013 END IF
2014
2015 IF ( ierr.EQ.1 .OR. ierr.EQ.2 ) THEN
2016
2017 IF ( ierr.EQ.2 ) THEN
2018 SELECT( i+kks-3 ) = 1
2019 SELECT( i+kks-1 ) = 0
2020 kks = kks + 1
2021 END IF
2022
2023 GO TO 360
2024 END IF
2025 ks = kks
2026 END IF
2027 IF( pair )
2028 $ ks = ks + 1
2029 END IF
2030 END IF
2031 330 CONTINUE
2032 END IF
2033 360 CONTINUE
2034
2035
2036
2037 IF( ( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 ) .OR.
2038 $ ( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) ) THEN
2039 ibuff( 1 ) = i
2040 ibuff( 2 ) = nwin
2041 ibuff( 3 ) = pitraf
2042 ibuff( 4 ) = ks
2043 ibuff( 5 ) = pdtraf
2044 ibuff( 6 ) = ndtraf
2045 ilen = pitraf - ipiw + 1
2046 dlen = pdtraf - ipw3 + 1
2047 ibuff( 7 ) = ilen
2048 ibuff( 8 ) = dlen
2049
2050
2051
2052
2053 IF( .NOT. skip1cr ) THEN
2054 IF( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 ) THEN
2055 iloc =
indxg2l( i, nb, myrow, desct( rsrc_ ),
2056 $ nprow )
2057 jloc =
indxg2l( i, nb, mycol, desct( csrc_ ),
2058 $ npcol )
2059 CALL slamov( 'All', dim1, dim1, work(ipw2),
2060 $ nwin, t((jloc-1)*lldt+iloc), lldt )
2061 END IF
2062 IF( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) THEN
2063 iloc =
indxg2l( i+dim1, nb, myrow,
2064 $ desct( rsrc_ ), nprow )
2065 jloc =
indxg2l( i+dim1, nb, mycol,
2066 $ desct( csrc_ ), npcol )
2067 CALL slamov( 'All', dim4, dim4,
2068 $ work(ipw2+dim1*nwin+dim1), nwin,
2069 $ t((jloc-1)*lldt+iloc), lldt )
2070 END IF
2071 END IF
2072 END IF
2073
2074
2075
2076
2077
2078
2079
2080 IF( window.EQ.1 .AND. skip1cr ) GO TO 325
2081
2082
2083
2084 IF( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 ) THEN
2085 IF( rsrc1.NE.rsrc3 .OR. csrc1.NE.csrc3 ) THEN
2086 CALL sgesd2d( ictxt, 1, 1,
2087 $ work( ipw2+(dim1-1)*nwin+dim1 ), nwin,
2088 $ rsrc3, csrc3 )
2089 END IF
2090 END IF
2091 IF( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) THEN
2092 IF( rsrc4.NE.rsrc2 .OR. csrc4.NE.csrc2 ) THEN
2093 CALL sgesd2d( ictxt, dim1, dim4,
2094 $ work( ipw2+dim1*nwin), nwin, rsrc2,
2095 $ csrc2 )
2096 END IF
2097 END IF
2098 IF( myrow.EQ.rsrc2 .AND. mycol.EQ.csrc2 ) THEN
2099 iloc =
indxg2l( i, nb, myrow, desct( rsrc_ ),
2100 $ nprow )
2101 jloc =
indxg2l( i+dim1, nb, mycol,
2102 $ desct( csrc_ ), npcol )
2103 IF( rsrc2.NE.rsrc4 .OR. csrc2.NE.csrc4 ) THEN
2104 CALL sgerv2d( ictxt, dim1, dim4,
2105 $ work(ipw2+dim1*nwin), nwin, rsrc4, csrc4 )
2106 END IF
2107 CALL slamov( 'All', dim1, dim4,
2108 $ work( ipw2+dim1*nwin ), nwin,
2109 $ t((jloc-1)*lldt+iloc), lldt )
2110 END IF
2111 IF( myrow.EQ.rsrc3 .AND. mycol.EQ.csrc3 ) THEN
2112 iloc =
indxg2l( i+dim1, nb, myrow,
2113 $ desct( rsrc_ ), nprow )
2114 jloc =
indxg2l( i+dim1-1, nb, mycol,
2115 $ desct( csrc_ ), npcol )
2116 IF( rsrc3.NE.rsrc1 .OR. csrc3.NE.csrc1 ) THEN
2117 CALL sgerv2d( ictxt, 1, 1,
2118 $ work( ipw2+(dim1-1)*nwin+dim1 ), nwin,
2119 $ rsrc1, csrc1 )
2120 END IF
2121 t((jloc-1)*lldt+iloc) =
2122 $ work( ipw2+(dim1-1)*nwin+dim1 )
2123 END IF
2124 END IF
2125
2126 325 CONTINUE
2127
2128 320 CONTINUE
2129
2130
2131
2132
2133 DO 2222 dir = 1, 2
2134
2135
2136
2137 DO 321 window = window0, wine, 2
2138 rsrc4 = iwork(irsrc+window-1)
2139 csrc4 = iwork(icsrc+window-1)
2140 rsrc1 = mod( rsrc4 - 1 + nprow, nprow )
2141 csrc1 = mod( csrc4 - 1 + npcol, npcol )
2142 IF( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 ) THEN
2143 IF( npcol.GT.1 .AND. dir.EQ.1 )
2144 $ CALL igebs2d( ictxt, 'Row', top, 8, 1,
2145 $ ibuff, 8 )
2146 IF( nprow.GT.1 .AND. dir.EQ.2 )
2147 $ CALL igebs2d( ictxt, 'Col', top, 8, 1,
2148 $ ibuff, 8 )
2149 skip1cr = window.EQ.1 .AND.
2151 ELSEIF( myrow.EQ.rsrc1 .OR. mycol.EQ.csrc1 ) THEN
2152 IF( npcol.GT.1 .AND. dir.EQ.1 .AND.
2153 $ myrow.EQ.rsrc1 ) THEN
2154 CALL igebr2d( ictxt, 'Row', top, 8, 1,
2155 $ ibuff, 8, rsrc1, csrc1 )
2156 i = ibuff( 1 )
2157 nwin = ibuff( 2 )
2158 pitraf = ibuff( 3 )
2159 ks = ibuff( 4 )
2160 pdtraf = ibuff( 5 )
2161 ndtraf = ibuff( 6 )
2162 ilen = ibuff( 7 )
2163 dlen = ibuff( 8 )
2164 bufflen = ilen + dlen
2165 ipw3 = ipw2 + nwin*nwin
2166 dim1 = nb - mod(i-1,nb)
2167 dim4 = nwin - dim1
2168 lihic = nwin + i - 1
2169 skip1cr = window.EQ.1 .AND.
2171 END IF
2172 IF( nprow.GT.1 .AND. dir.EQ.2 .AND.
2173 $ mycol.EQ.csrc1 ) THEN
2174 CALL igebr2d( ictxt, 'Col', top, 8, 1,
2175 $ ibuff, 8, rsrc1, csrc1 )
2176 i = ibuff( 1 )
2177 nwin = ibuff( 2 )
2178 pitraf = ibuff( 3 )
2179 ks = ibuff( 4 )
2180 pdtraf = ibuff( 5 )
2181 ndtraf = ibuff( 6 )
2182 ilen = ibuff( 7 )
2183 dlen = ibuff( 8 )
2184 bufflen = ilen + dlen
2185 ipw3 = ipw2 + nwin*nwin
2186 dim1 = nb - mod(i-1,nb)
2187 dim4 = nwin - dim1
2188 lihic = nwin + i - 1
2189 skip1cr = window.EQ.1 .AND.
2191 END IF
2192 END IF
2193 IF( rsrc1.NE.rsrc4 ) THEN
2194 IF( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) THEN
2195 IF( npcol.GT.1 .AND. dir.EQ.1 )
2196 $ CALL igebs2d( ictxt, 'Row', top, 8, 1,
2197 $ ibuff, 8 )
2198 skip1cr = window.EQ.1 .AND.
2200 ELSEIF( myrow.EQ.rsrc4 ) THEN
2201 IF( npcol.GT.1 .AND. dir.EQ.1 ) THEN
2202 CALL igebr2d( ictxt, 'Row', top, 8, 1,
2203 $ ibuff, 8, rsrc4, csrc4 )
2204 i = ibuff( 1 )
2205 nwin = ibuff( 2 )
2206 pitraf = ibuff( 3 )
2207 ks = ibuff( 4 )
2208 pdtraf = ibuff( 5 )
2209 ndtraf = ibuff( 6 )
2210 ilen = ibuff( 7 )
2211 dlen = ibuff( 8 )
2212 bufflen = ilen + dlen
2213 ipw3 = ipw2 + nwin*nwin
2214 dim1 = nb - mod(i-1,nb)
2215 dim4 = nwin - dim1
2216 lihic = nwin + i - 1
2217 skip1cr = window.EQ.1 .AND.
2219 END IF
2220 END IF
2221 END IF
2222 IF( csrc1.NE.csrc4 ) THEN
2223 IF( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) THEN
2224 IF( nprow.GT.1 .AND. dir.EQ.2 )
2225 $ CALL igebs2d( ictxt, 'Col', top, 8, 1,
2226 $ ibuff, 8 )
2227 skip1cr = window.EQ.1 .AND.
2229 ELSEIF( mycol.EQ.csrc4 ) THEN
2230 IF( nprow.GT.1 .AND. dir.EQ.2 ) THEN
2231 CALL igebr2d( ictxt, 'Col', top, 8, 1,
2232 $ ibuff, 8, rsrc4, csrc4 )
2233 i = ibuff( 1 )
2234 nwin = ibuff( 2 )
2235 pitraf = ibuff( 3 )
2236 ks = ibuff( 4 )
2237 pdtraf = ibuff( 5 )
2238 ndtraf = ibuff( 6 )
2239 ilen = ibuff( 7 )
2240 dlen = ibuff( 8 )
2241 bufflen = ilen + dlen
2242 ipw3 = ipw2 + nwin*nwin
2243 dim1 = nb - mod(i-1,nb)
2244 dim4 = nwin - dim1
2245 lihic = nwin + i - 1
2246 skip1cr = window.EQ.1 .AND.
2248 END IF
2249 END IF
2250 END IF
2251
2252
2253
2254 IF( skip1cr ) GO TO 326
2255
2256
2257
2258 IF( myrow.EQ.rsrc1 .AND. mycol.EQ.csrc1 ) THEN
2259 buffer = pdtraf
2260 bufflen = dlen + ilen
2261 IF( (nprow.GT.1 .AND. dir.EQ.2) .OR.
2262 $ (npcol.GT.1 .AND. dir.EQ.1) ) THEN
2263 DO 370 indx = 1, ilen
2264 work( buffer+indx-1 ) =
2265 $ float( iwork(ipiw+indx-1) )
2266 370 CONTINUE
2267 CALL slamov( 'All', dlen, 1, work( ipw3 ),
2268 $ dlen, work(buffer+ilen), dlen )
2269 END IF
2270 IF( npcol.GT.1 .AND. dir.EQ.1 ) THEN
2271 CALL sgebs2d( ictxt, 'Row', top, bufflen, 1,
2272 $ work(buffer), bufflen )
2273 END IF
2274 IF( nprow.GT.1 .AND. dir.EQ.2 ) THEN
2275 CALL sgebs2d( ictxt, 'Col', top, bufflen, 1,
2276 $ work(buffer), bufflen )
2277 END IF
2278 ELSEIF( myrow.EQ.rsrc1 .OR. mycol.EQ.csrc1 ) THEN
2279 IF( npcol.GT.1 .AND. dir.EQ.1 .AND.
2280 $ myrow.EQ.rsrc1 ) THEN
2281 buffer = pdtraf
2282 bufflen = dlen + ilen
2283 CALL sgebr2d( ictxt, 'Row', top, bufflen, 1,
2284 $ work(buffer), bufflen, rsrc1, csrc1 )
2285 END IF
2286 IF( nprow.GT.1 .AND. dir.EQ.2 .AND.
2287 $ mycol.EQ.csrc1 ) THEN
2288 buffer = pdtraf
2289 bufflen = dlen + ilen
2290 CALL sgebr2d( ictxt, 'Col', top, bufflen, 1,
2291 $ work(buffer), bufflen, rsrc1, csrc1 )
2292 END IF
2293 IF( (npcol.GT.1.AND.dir.EQ.1.AND.myrow.EQ.rsrc1)
2294 $ .OR. (nprow.GT.1.AND.dir.EQ.2.AND.
2295 $ mycol.EQ.csrc1) ) THEN
2296 DO 380 indx = 1, ilen
2297 iwork(ipiw+indx-1) =
2298 $ int( work( buffer+indx-1 ) )
2299 380 CONTINUE
2300 CALL slamov( 'All', dlen, 1,
2301 $ work( buffer+ilen ), dlen,
2302 $ work( ipw3 ), dlen )
2303 END IF
2304 END IF
2305 IF( rsrc1.NE.rsrc4 ) THEN
2306 IF( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) THEN
2307 buffer = pdtraf
2308 bufflen = dlen + ilen
2309 IF( npcol.GT.1 .AND. dir.EQ.1 ) THEN
2310 DO 390 indx = 1, ilen
2311 work( buffer+indx-1 ) =
2312 $ float( iwork(ipiw+indx-1) )
2313 390 CONTINUE
2314 CALL slamov( 'All', dlen, 1, work( ipw3 ),
2315 $ dlen, work(buffer+ilen), dlen )
2316 CALL sgebs2d( ictxt, 'Row', top, bufflen,
2317 $ 1, work(buffer), bufflen )
2318 END IF
2319 ELSEIF( myrow.EQ.rsrc4 .AND. dir.EQ.1 .AND.
2320 $ npcol.GT.1 ) THEN
2321 buffer = pdtraf
2322 bufflen = dlen + ilen
2323 CALL sgebr2d( ictxt, 'Row', top, bufflen,
2324 $ 1, work(buffer), bufflen, rsrc4, csrc4 )
2325 DO 400 indx = 1, ilen
2326 iwork(ipiw+indx-1) =
2327 $ int( work( buffer+indx-1 ) )
2328 400 CONTINUE
2329 CALL slamov( 'All', dlen, 1,
2330 $ work( buffer+ilen ), dlen,
2331 $ work( ipw3 ), dlen )
2332 END IF
2333 END IF
2334 IF( csrc1.NE.csrc4 ) THEN
2335 IF( myrow.EQ.rsrc4 .AND. mycol.EQ.csrc4 ) THEN
2336 buffer = pdtraf
2337 bufflen = dlen + ilen
2338 IF( nprow.GT.1 .AND. dir.EQ.2 ) THEN
2339 DO 395 indx = 1, ilen
2340 work( buffer+indx-1 ) =
2341 $ float( iwork(ipiw+indx-1) )
2342 395 CONTINUE
2343 CALL slamov( 'All', dlen, 1, work( ipw3 ),
2344 $ dlen, work(buffer+ilen), dlen )
2345 CALL sgebs2d( ictxt, 'Col', top, bufflen,
2346 $ 1, work(buffer), bufflen )
2347 END IF
2348 ELSEIF( mycol.EQ.csrc4 .AND. dir.EQ.2 .AND.
2349 $ nprow.GT.1 ) THEN
2350 buffer = pdtraf
2351 bufflen = dlen + ilen
2352 CALL sgebr2d( ictxt, 'Col', top, bufflen, 1,
2353 $ work(buffer), bufflen, rsrc4, csrc4 )
2354 DO 402 indx = 1, ilen
2355 iwork(ipiw+indx-1) =
2356 $ int( work( buffer+indx-1 ) )
2357 402 CONTINUE
2358 CALL slamov( 'All', dlen, 1,
2359 $ work( buffer+ilen ), dlen,
2360 $ work( ipw3 ), dlen )
2361 END IF
2362 END IF
2363
2364 326 CONTINUE
2365
2366 321 CONTINUE
2367
2368
2369
2370 DO 322 window = window0, wine, 2
2371 IF( window.EQ.1 .AND. skip1cr ) GO TO 327
2372 rsrc4 = iwork(irsrc+window-1)
2373 csrc4 = iwork(icsrc+window-1)
2374 rsrc1 = mod( rsrc4 - 1 + nprow, nprow )
2375 csrc1 = mod( csrc4 - 1 + npcol, npcol )
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387 IF( ((mycol.EQ.csrc1.OR.mycol.EQ.csrc4).AND.dir.EQ.2)
2388 $ .OR. ((myrow.EQ.rsrc1.OR.myrow.EQ.rsrc4).AND.
2389 $ dir.EQ.1)) THEN
2390 ipw4 = buffer
2391 IF( dir.EQ.2 ) THEN
2392 IF( wantq ) THEN
2393 qrows =
numroc( n, nb, myrow, descq( rsrc_ ),
2394 $ nprow )
2395 ELSE
2396 qrows = 0
2397 END IF
2398 trows =
numroc( i-1, nb, myrow, desct( rsrc_ ),
2399 $ nprow )
2400 ELSE
2401 qrows = 0
2402 trows = 0
2403 END IF
2404 IF( dir.EQ.1 ) THEN
2405 tcols =
numroc( n - (i+dim1-1), nb, mycol,
2406 $ csrc4, npcol )
2407 IF( mycol.EQ.csrc4 ) tcols = tcols - dim4
2408 ELSE
2409 tcols = 0
2410 END IF
2411 ipw5 = ipw4 + nwin*nwin
2412 ipw6 = ipw5 + trows * nwin
2413 IF( wantq ) THEN
2414 ipw7 = ipw6 + nwin * tcols
2415 ipw8 = ipw7 + qrows * nwin
2416 ELSE
2417 ipw8 = ipw6 + nwin * tcols
2418 END IF
2419 END IF
2420
2421
2422
2423
2424 IF( dir.EQ.2 ) THEN
2425 IF( mycol.EQ.csrc1 .OR. mycol.EQ.csrc4 ) THEN
2426 DO 410 indx = 1, nprow
2427 IF( mycol.EQ.csrc1 ) THEN
2428 CALL infog2l( 1+(indx-1)*nb, i, desct,
2429 $ nprow, npcol, myrow, mycol, iloc,
2430 $ jloc1, rsrc, csrc1 )
2431 IF( myrow.EQ.rsrc ) THEN
2432 CALL slamov( 'All', trows, dim1,
2433 $ t((jloc1-1)*lldt+iloc), lldt,
2434 $ work(ipw5), trows )
2435 IF( npcol.GT.1 ) THEN
2436 east = mod( mycol + 1, npcol )
2437 CALL sgesd2d( ictxt, trows, dim1,
2438 $ work(ipw5), trows, rsrc,
2439 $ east )
2440 CALL sgerv2d( ictxt, trows, dim4,
2441 $ work(ipw5+trows*dim1), trows,
2442 $ rsrc, east )
2443 END IF
2444 END IF
2445 END IF
2446 IF( mycol.EQ.csrc4 ) THEN
2447 CALL infog2l( 1+(indx-1)*nb, i+dim1,
2448 $ desct, nprow, npcol, myrow, mycol,
2449 $ iloc, jloc4, rsrc, csrc4 )
2450 IF( myrow.EQ.rsrc ) THEN
2451 CALL slamov( 'All', trows, dim4,
2452 $ t((jloc4-1)*lldt+iloc), lldt,
2453 $ work(ipw5+trows*dim1), trows )
2454 IF( npcol.GT.1 ) THEN
2455 west = mod( mycol-1+npcol, npcol )
2456 CALL sgesd2d( ictxt, trows, dim4,
2457 $ work(ipw5+trows*dim1), trows,
2458 $ rsrc, west )
2459 CALL sgerv2d( ictxt, trows, dim1,
2460 $ work(ipw5), trows, rsrc,
2461 $ west )
2462 END IF
2463 END IF
2464 END IF
2465 410 CONTINUE
2466 END IF
2467 END IF
2468
2469 IF( dir.EQ.1 ) THEN
2470 IF( myrow.EQ.rsrc1 .OR. myrow.EQ.rsrc4 ) THEN
2471 DO 420 indx = 1, npcol
2472 IF( myrow.EQ.rsrc1 ) THEN
2473 IF( indx.EQ.1 ) THEN
2474 CALL infog2l( i, lihic+1, desct, nprow,
2475 $ npcol, myrow, mycol, iloc1, jloc,
2476 $ rsrc1, csrc )
2477 ELSE
2479 $ (
iceil(lihic,nb)+(indx-2))*nb+1,
2480 $ desct, nprow, npcol, myrow, mycol,
2481 $ iloc1, jloc, rsrc1, csrc )
2482 END IF
2483 IF( mycol.EQ.csrc ) THEN
2484 CALL slamov( 'All', dim1, tcols,
2485 $ t((jloc-1)*lldt+iloc1), lldt,
2486 $ work(ipw6), nwin )
2487 IF( nprow.GT.1 ) THEN
2488 south = mod( myrow + 1, nprow )
2489 CALL sgesd2d( ictxt, dim1, tcols,
2490 $ work(ipw6), nwin, south,
2491 $ csrc )
2492 CALL sgerv2d( ictxt, dim4, tcols,
2493 $ work(ipw6+dim1), nwin, south,
2494 $ csrc )
2495 END IF
2496 END IF
2497 END IF
2498 IF( myrow.EQ.rsrc4 ) THEN
2499 IF( indx.EQ.1 ) THEN
2500 CALL infog2l( i+dim1, lihic+1, desct,
2501 $ nprow, npcol, myrow, mycol, iloc4,
2502 $ jloc, rsrc4, csrc )
2503 ELSE
2505 $ (
iceil(lihic,nb)+(indx-2))*nb+1,
2506 $ desct, nprow, npcol, myrow, mycol,
2507 $ iloc4, jloc, rsrc4, csrc )
2508 END IF
2509 IF( mycol.EQ.csrc ) THEN
2510 CALL slamov( 'All', dim4, tcols,
2511 $ t((jloc-1)*lldt+iloc4), lldt,
2512 $ work(ipw6+dim1), nwin )
2513 IF( nprow.GT.1 ) THEN
2514 north = mod( myrow-1+nprow, nprow )
2515 CALL sgesd2d( ictxt, dim4, tcols,
2516 $ work(ipw6+dim1), nwin, north,
2517 $ csrc )
2518 CALL sgerv2d( ictxt, dim1, tcols,
2519 $ work(ipw6), nwin, north,
2520 $ csrc )
2521 END IF
2522 END IF
2523 END IF
2524 420 CONTINUE
2525 END IF
2526 END IF
2527
2528 IF( dir.EQ.2 ) THEN
2529 IF( wantq ) THEN
2530 IF( mycol.EQ.csrc1 .OR. mycol.EQ.csrc4 ) THEN
2531 DO 430 indx = 1, nprow
2532 IF( mycol.EQ.csrc1 ) THEN
2533 CALL infog2l( 1+(indx-1)*nb, i, descq,
2534 $ nprow, npcol, myrow, mycol, iloc,
2535 $ jloc1, rsrc, csrc1 )
2536 IF( myrow.EQ.rsrc ) THEN
2537 CALL slamov( 'All', qrows, dim1,
2538 $ q((jloc1-1)*lldq+iloc), lldq,
2539 $ work(ipw7), qrows )
2540 IF( npcol.GT.1 ) THEN
2541 east = mod( mycol + 1, npcol )
2542 CALL sgesd2d( ictxt, qrows, dim1,
2543 $ work(ipw7), qrows, rsrc,
2544 $ east )
2545 CALL sgerv2d( ictxt, qrows, dim4,
2546 $ work(ipw7+qrows*dim1),
2547 $ qrows, rsrc, east )
2548 END IF
2549 END IF
2550 END IF
2551 IF( mycol.EQ.csrc4 ) THEN
2552 CALL infog2l( 1+(indx-1)*nb, i+dim1,
2553 $ descq, nprow, npcol, myrow, mycol,
2554 $ iloc, jloc4, rsrc, csrc4 )
2555 IF( myrow.EQ.rsrc ) THEN
2556 CALL slamov( 'All', qrows, dim4,
2557 $ q((jloc4-1)*lldq+iloc), lldq,
2558 $ work(ipw7+qrows*dim1), qrows )
2559 IF( npcol.GT.1 ) THEN
2560 west = mod( mycol-1+npcol,
2561 $ npcol )
2562 CALL sgesd2d( ictxt, qrows, dim4,
2563 $ work(ipw7+qrows*dim1),
2564 $ qrows, rsrc, west )
2565 CALL sgerv2d( ictxt, qrows, dim1,
2566 $ work(ipw7), qrows, rsrc,
2567 $ west )
2568 END IF
2569 END IF
2570 END IF
2571 430 CONTINUE
2572 END IF
2573 END IF
2574 END IF
2575
2576 327 CONTINUE
2577
2578 322 CONTINUE
2579
2580 DO 323 window = window0, wine, 2
2581 rsrc4 = iwork(irsrc+window-1)
2582 csrc4 = iwork(icsrc+window-1)
2583 rsrc1 = mod( rsrc4 - 1 + nprow, nprow )
2584 csrc1 = mod( csrc4 - 1 + npcol, npcol )
2585 flops = 0
2586 IF( ((mycol.EQ.csrc1.OR.mycol.EQ.csrc4).AND.dir.EQ.2)
2587 $ .OR. ((myrow.EQ.rsrc1.OR.myrow.EQ.rsrc4).AND.
2588 $ dir.EQ.1) ) THEN
2589
2590
2591
2592 IF( window.EQ.1 .AND. skip1cr ) GO TO 328
2593
2594
2595
2596
2597
2598 nitraf = pitraf - ipiw
2599 ishh = .false.
2600 DO 405 k = 1, nitraf
2601 IF( iwork( ipiw + k - 1 ).LE.nwin ) THEN
2602 flops = flops + 6
2603 ELSE
2604 flops = flops + 11
2605 ishh = .true.
2606 END IF
2607 405 CONTINUE
2608
2609
2610
2611 IF( flops.NE.0 .AND.
2612 $ ( 2*flops*100 )/( 2*nwin*nwin ) .GE. mmult )
2613 $ THEN
2614
2615 CALL slaset( 'All', nwin, nwin, zero, one,
2616 $ work( ipw4 ), nwin )
2617 work(ipw8) = float(myrow)
2618 work(ipw8+1) = float(mycol)
2619 CALL bslaapp( 1, nwin, nwin, ncb, work( ipw4 ),
2620 $ nwin, nitraf, iwork(ipiw), work( ipw3 ),
2621 $ work(ipw8) )
2622
2623
2624
2625
2626 IF( ishh .OR. dim1.NE.ks .OR. dim4.NE.ks ) THEN
2627
2628
2629
2630
2631 IF( dir.EQ.2 ) THEN
2632 DO 440 indx = 1,
min(i-1,1+(nprow-1)*nb),
2633 $ nb
2634 IF( mycol.EQ.csrc1 ) THEN
2635 CALL infog2l( indx, i, desct, nprow,
2636 $ npcol, myrow, mycol, iloc,
2637 $ jloc, rsrc, csrc1 )
2638 IF( myrow.EQ.rsrc ) THEN
2639 CALL sgemm( 'No transpose',
2640 $ 'No transpose', trows, dim1,
2641 $ nwin, one, work( ipw5 ),
2642 $ trows, work( ipw4 ), nwin,
2643 $ zero, work(ipw8), trows )
2644 CALL slamov( 'All', trows, dim1,
2645 $ work(ipw8), trows,
2646 $ t((jloc-1)*lldt+iloc),
2647 $ lldt )
2648 END IF
2649 END IF
2650 IF( mycol.EQ.csrc4 ) THEN
2651 CALL infog2l( indx, i+dim1, desct,
2652 $ nprow, npcol, myrow, mycol,
2653 $ iloc, jloc, rsrc, csrc4 )
2654 IF( myrow.EQ.rsrc ) THEN
2655 CALL sgemm( 'No transpose',
2656 $ 'No transpose', trows, dim4,
2657 $ nwin, one, work( ipw5 ),
2658 $ trows,
2659 $ work( ipw4+nwin*dim1 ),
2660 $ nwin, zero, work(ipw8),
2661 $ trows )
2662 CALL slamov( 'All', trows, dim4,
2663 $ work(ipw8), trows,
2664 $ t((jloc-1)*lldt+iloc),
2665 $ lldt )
2666 END IF
2667 END IF
2668 440 CONTINUE
2669
2670 IF( wantq ) THEN
2671 DO 450 indx = 1,
min(n,1+(nprow-1)*nb),
2672 $ nb
2673 IF( mycol.EQ.csrc1 ) THEN
2675 $ nprow, npcol, myrow, mycol,
2676 $ iloc, jloc, rsrc, csrc1 )
2677 IF( myrow.EQ.rsrc ) THEN
2678 CALL sgemm( 'No transpose',
2679 $ 'No transpose', qrows,
2680 $ dim1, nwin, one,
2681 $ work( ipw7 ), qrows,
2682 $ work( ipw4 ), nwin,
2683 $ zero, work(ipw8),
2684 $ qrows )
2685 CALL slamov( 'All', qrows,
2686 $ dim1, work(ipw8), qrows,
2687 $ q((jloc-1)*lldq+iloc),
2688 $ lldq )
2689 END IF
2690 END IF
2691 IF( mycol.EQ.csrc4 ) THEN
2693 $ descq, nprow, npcol, myrow,
2694 $ mycol, iloc, jloc, rsrc,
2695 $ csrc4 )
2696 IF( myrow.EQ.rsrc ) THEN
2697 CALL sgemm( 'No transpose',
2698 $ 'No transpose', qrows,
2699 $ dim4, nwin, one,
2700 $ work( ipw7 ), qrows,
2701 $ work( ipw4+nwin*dim1 ),
2702 $ nwin, zero, work(ipw8),
2703 $ qrows )
2704 CALL slamov( 'All', qrows,
2705 $ dim4, work(ipw8), qrows,
2706 $ q((jloc-1)*lldq+iloc),
2707 $ lldq )
2708 END IF
2709 END IF
2710 450 CONTINUE
2711 END IF
2712 END IF
2713
2714
2715
2716
2717 IF( dir.EQ.1 ) THEN
2718 IF ( lihic.LT.n ) THEN
2719 IF( myrow.EQ.rsrc1.AND.mycol.EQ.csrc4
2720 $ .AND.mod(lihic,nb).NE.0 ) THEN
2721 indx = lihic + 1
2722 CALL infog2l( i, indx, desct, nprow,
2723 $ npcol, myrow, mycol, iloc,
2724 $ jloc, rsrc1, csrc4 )
2725 CALL sgemm( 'Transpose',
2726 $ 'No Transpose', dim1, tcols,
2727 $ nwin, one, work(ipw4), nwin,
2728 $ work( ipw6 ), nwin, zero,
2729 $ work(ipw8), dim1 )
2730 CALL slamov( 'All', dim1, tcols,
2731 $ work(ipw8), dim1,
2732 $ t((jloc-1)*lldt+iloc), lldt )
2733 END IF
2734 IF( myrow.EQ.rsrc4.AND.mycol.EQ.csrc4
2735 $ .AND.mod(lihic,nb).NE.0 ) THEN
2736 indx = lihic + 1
2737 CALL infog2l( i+dim1, indx, desct,
2738 $ nprow, npcol, myrow, mycol,
2739 $ iloc, jloc, rsrc4, csrc4 )
2740 CALL sgemm( 'Transpose',
2741 $ 'No Transpose', dim4, tcols,
2742 $ nwin, one,
2743 $ work( ipw4+dim1*nwin ), nwin,
2744 $ work( ipw6), nwin, zero,
2745 $ work(ipw8), dim4 )
2746 CALL slamov( 'All', dim4, tcols,
2747 $ work(ipw8), dim4,
2748 $ t((jloc-1)*lldt+iloc), lldt )
2749 END IF
2750 indxs =
iceil(lihic,nb)*nb + 1
2751 indxe =
min(n,indxs+(npcol-2)*nb)
2752 DO 460 indx = indxs, indxe, nb
2753 IF( myrow.EQ.rsrc1 ) THEN
2755 $ nprow, npcol, myrow, mycol,
2756 $ iloc, jloc, rsrc1, csrc )
2757 IF( mycol.EQ.csrc ) THEN
2758 CALL sgemm( 'Transpose',
2759 $ 'No Transpose', dim1,
2760 $ tcols, nwin, one,
2761 $ work( ipw4 ), nwin,
2762 $ work( ipw6 ), nwin,
2763 $ zero, work(ipw8), dim1 )
2764 CALL slamov( 'All', dim1,
2765 $ tcols, work(ipw8), dim1,
2766 $ t((jloc-1)*lldt+iloc),
2767 $ lldt )
2768 END IF
2769 END IF
2770 IF( myrow.EQ.rsrc4 ) THEN
2772 $ desct, nprow, npcol, myrow,
2773 $ mycol, iloc, jloc, rsrc4,
2774 $ csrc )
2775 IF( mycol.EQ.csrc ) THEN
2776 CALL sgemm( 'Transpose',
2777 $ 'No Transpose', dim4,
2778 $ tcols, nwin, one,
2779 $ work( ipw4+nwin*dim1 ),
2780 $ nwin, work( ipw6 ),
2781 $ nwin, zero, work(ipw8),
2782 $ dim4 )
2783 CALL slamov( 'All', dim4,
2784 $ tcols, work(ipw8), dim4,
2785 $ t((jloc-1)*lldt+iloc),
2786 $ lldt )
2787 END IF
2788 END IF
2789 460 CONTINUE
2790 END IF
2791 END IF
2792 ELSE
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825 IF( dir.EQ.2 ) THEN
2826 indxe =
min(i-1,1+(nprow-1)*nb)
2827 DO 470 indx = 1, indxe, nb
2828 IF( mycol.EQ.csrc1 ) THEN
2829 CALL infog2l( indx, i, desct, nprow,
2830 $ npcol, myrow, mycol, iloc,
2831 $ jloc, rsrc, csrc1 )
2832 IF( myrow.EQ.rsrc ) THEN
2833 CALL slamov( 'All', trows, ks,
2834 $ work( ipw5+trows*dim4),
2835 $ trows, work(ipw8), trows )
2836 CALL strmm( 'Right', 'Upper',
2837 $ 'No transpose',
2838 $ 'Non-unit', trows, ks,
2839 $ one, work( ipw4+dim4 ),
2840 $ nwin, work(ipw8), trows )
2841 CALL sgemm( 'No transpose',
2842 $ 'No transpose', trows, ks,
2843 $ dim4, one, work( ipw5 ),
2844 $ trows, work( ipw4 ), nwin,
2845 $ one, work(ipw8), trows )
2846 CALL slamov( 'All', trows, ks,
2847 $ work(ipw8), trows,
2848 $ t((jloc-1)*lldt+iloc),
2849 $ lldt )
2850 END IF
2851 END IF
2852
2853
2854
2855
2856 IF( mycol.EQ.csrc4 ) THEN
2857 CALL infog2l( indx, i+dim1, desct,
2858 $ nprow, npcol, myrow, mycol,
2859 $ iloc, jloc, rsrc, csrc4 )
2860 IF( myrow.EQ.rsrc ) THEN
2861 CALL slamov( 'All', trows, dim4,
2862 $ work(ipw5), trows,
2863 $ work( ipw8 ), trows )
2864 CALL strmm( 'Right', 'Lower',
2865 $ 'No transpose',
2866 $ 'Non-unit', trows, dim4,
2867 $ one, work( ipw4+nwin*ks ),
2868 $ nwin, work( ipw8 ), trows )
2869 CALL sgemm( 'No transpose',
2870 $ 'No transpose', trows, dim4,
2871 $ ks, one,
2872 $ work( ipw5+trows*dim4),
2873 $ trows,
2874 $ work( ipw4+nwin*ks+dim4 ),
2875 $ nwin, one, work( ipw8 ),
2876 $ trows )
2877 CALL slamov( 'All', trows, dim4,
2878 $ work(ipw8), trows,
2879 $ t((jloc-1)*lldt+iloc),
2880 $ lldt )
2881 END IF
2882 END IF
2883 470 CONTINUE
2884 IF( wantq ) THEN
2885
2886
2887
2888
2889 indxe =
min(n,1+(nprow-1)*nb)
2890 DO 480 indx = 1, indxe, nb
2891 IF( mycol.EQ.csrc1 ) THEN
2893 $ nprow, npcol, myrow, mycol,
2894 $ iloc, jloc, rsrc, csrc1 )
2895 IF( myrow.EQ.rsrc ) THEN
2896 CALL slamov( 'All', qrows, ks,
2897 $ work( ipw7+qrows*dim4),
2898 $ qrows, work(ipw8),
2899 $ qrows )
2900 CALL strmm( 'Right', 'Upper',
2901 $ 'No transpose',
2902 $ 'Non-unit', qrows,
2903 $ ks, one,
2904 $ work( ipw4+dim4 ), nwin,
2905 $ work(ipw8), qrows )
2906 CALL sgemm( 'No transpose',
2907 $ 'No transpose', qrows,
2908 $ ks, dim4, one,
2909 $ work( ipw7 ), qrows,
2910 $ work( ipw4 ), nwin, one,
2911 $ work(ipw8), qrows )
2912 CALL slamov( 'All', qrows, ks,
2913 $ work(ipw8), qrows,
2914 $ q((jloc-1)*lldq+iloc),
2915 $ lldq )
2916 END IF
2917 END IF
2918
2919
2920
2921
2922 IF( mycol.EQ.csrc4 ) THEN
2924 $ descq, nprow, npcol, myrow,
2925 $ mycol, iloc, jloc, rsrc,
2926 $ csrc4 )
2927 IF( myrow.EQ.rsrc ) THEN
2928 CALL slamov( 'All', qrows,
2929 $ dim4, work(ipw7), qrows,
2930 $ work( ipw8 ), qrows )
2931 CALL strmm( 'Right', 'Lower',
2932 $ 'No transpose',
2933 $ 'Non-unit', qrows,
2934 $ dim4, one,
2935 $ work( ipw4+nwin*ks ),
2936 $ nwin, work( ipw8 ),
2937 $ qrows )
2938 CALL sgemm( 'No transpose',
2939 $ 'No transpose', qrows,
2940 $ dim4, ks, one,
2941 $ work(ipw7+qrows*(dim4)),
2942 $ qrows,
2943 $ work(ipw4+nwin*ks+dim4),
2944 $ nwin, one, work( ipw8 ),
2945 $ qrows )
2946 CALL slamov( 'All', qrows,
2947 $ dim4, work(ipw8), qrows,
2948 $ q((jloc-1)*lldq+iloc),
2949 $ lldq )
2950 END IF
2951 END IF
2952 480 CONTINUE
2953 END IF
2954 END IF
2955
2956 IF( dir.EQ.1 ) THEN
2957 IF ( lihic.LT.n ) THEN
2958
2959
2960
2961
2962 IF( myrow.EQ.rsrc1.AND.mycol.EQ.csrc4
2963 $ .AND.mod(lihic,nb).NE.0 ) THEN
2964 indx = lihic + 1
2965 CALL infog2l( i, indx, desct, nprow,
2966 $ npcol, myrow, mycol, iloc,
2967 $ jloc, rsrc1, csrc4 )
2968 CALL slamov( 'All', ks, tcols,
2969 $ work( ipw6+dim4 ), nwin,
2970 $ work(ipw8), ks )
2971 CALL strmm( 'Left', 'Upper',
2972 $ 'Transpose', 'Non-unit',
2973 $ ks, tcols, one,
2974 $ work( ipw4+dim4 ), nwin,
2975 $ work(ipw8), ks )
2976 CALL sgemm( 'Transpose',
2977 $ 'No transpose', ks, tcols,
2978 $ dim4, one, work(ipw4), nwin,
2979 $ work(ipw6), nwin, one,
2980 $ work(ipw8), ks )
2981 CALL slamov( 'All', ks, tcols,
2982 $ work(ipw8), ks,
2983 $ t((jloc-1)*lldt+iloc), lldt )
2984 END IF
2985
2986
2987
2988
2989 IF( myrow.EQ.rsrc4.AND.mycol.EQ.csrc4
2990 $ .AND.mod(lihic,nb).NE.0 ) THEN
2991 indx = lihic + 1
2992 CALL infog2l( i+dim1, indx, desct,
2993 $ nprow, npcol, myrow, mycol,
2994 $ iloc, jloc, rsrc4, csrc4 )
2995 CALL slamov( 'All', dim4, tcols,
2996 $ work( ipw6 ), nwin,
2997 $ work( ipw8 ), dim4 )
2998 CALL strmm( 'Left', 'Lower',
2999 $ 'Transpose', 'Non-unit',
3000 $ dim4, tcols, one,
3001 $ work( ipw4+nwin*ks ), nwin,
3002 $ work( ipw8 ), dim4 )
3003 CALL sgemm( 'Transpose',
3004 $ 'No Transpose', dim4, tcols,
3005 $ ks, one,
3006 $ work( ipw4+nwin*ks+dim4 ),
3007 $ nwin, work( ipw6+dim1 ), nwin,
3008 $ one, work( ipw8), dim4 )
3009 CALL slamov( 'All', dim4, tcols,
3010 $ work(ipw8), dim4,
3011 $ t((jloc-1)*lldt+iloc), lldt )
3012 END IF
3013
3014
3015
3016
3017 indxs =
iceil(lihic,nb)*nb+1
3018 indxe =
min(n,indxs+(npcol-2)*nb)
3019 DO 490 indx = indxs, indxe, nb
3020 IF( myrow.EQ.rsrc1 ) THEN
3022 $ nprow, npcol, myrow, mycol,
3023 $ iloc, jloc, rsrc1, csrc )
3024 IF( mycol.EQ.csrc ) THEN
3025 CALL slamov( 'All', ks, tcols,
3026 $ work( ipw6+dim4 ), nwin,
3027 $ work(ipw8), ks )
3028 CALL strmm( 'Left', 'Upper',
3029 $ 'Transpose',
3030 $ 'Non-unit', ks,
3031 $ tcols, one,
3032 $ work( ipw4+dim4 ), nwin,
3033 $ work(ipw8), ks )
3034 CALL sgemm( 'Transpose',
3035 $ 'No transpose', ks,
3036 $ tcols, dim4, one,
3037 $ work(ipw4), nwin,
3038 $ work(ipw6), nwin, one,
3039 $ work(ipw8), ks )
3040 CALL slamov( 'All', ks, tcols,
3041 $ work(ipw8), ks,
3042 $ t((jloc-1)*lldt+iloc),
3043 $ lldt )
3044 END IF
3045 END IF
3046
3047
3048
3049
3050 IF( myrow.EQ.rsrc4 ) THEN
3052 $ desct, nprow, npcol, myrow,
3053 $ mycol, iloc, jloc, rsrc4,
3054 $ csrc )
3055 IF( mycol.EQ.csrc ) THEN
3056 CALL slamov( 'All', dim4,
3057 $ tcols, work( ipw6 ),
3058 $ nwin, work( ipw8 ),
3059 $ dim4 )
3060 CALL strmm( 'Left', 'Lower',
3061 $ 'Transpose',
3062 $ 'Non-unit', dim4,
3063 $ tcols, one,
3064 $ work( ipw4+nwin*ks ),
3065 $ nwin, work( ipw8 ),
3066 $ dim4 )
3067 CALL sgemm( 'Transpose',
3068 $ 'No Transpose', dim4,
3069 $ tcols, ks, one,
3070 $ work(ipw4+nwin*ks+dim4),
3071 $ nwin, work( ipw6+dim1 ),
3072 $ nwin, one, work( ipw8),
3073 $ dim4 )
3074 CALL slamov( 'All', dim4,
3075 $ tcols, work(ipw8), dim4,
3076 $ t((jloc-1)*lldt+iloc),
3077 $ lldt )
3078 END IF
3079 END IF
3080 490 CONTINUE
3081 END IF
3082 END IF
3083 END IF
3084 ELSEIF( flops.NE.0 ) THEN
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098 IF( dir.EQ.2 ) THEN
3099 indxe =
min(i-1,1+(nprow-1)*nb)
3100 DO 500 indx = 1, indxe, nb
3101 CALL infog2l( indx, i, desct, nprow,
3102 $ npcol, myrow, mycol, iloc, jloc,
3103 $ rsrc, csrc )
3104 IF( myrow.EQ.rsrc .AND. mycol.EQ.csrc )
3105 $ THEN
3106 CALL bslaapp( 1, trows, nwin, ncb,
3107 $ work(ipw5), trows, nitraf,
3108 $ iwork(ipiw), work( ipw3 ),
3109 $ work(ipw8) )
3110 CALL slamov( 'All', trows, dim1,
3111 $ work(ipw5), trows,
3112 $ t((jloc-1)*lldt+iloc ), lldt )
3113 END IF
3114 CALL infog2l( indx, i+dim1, desct, nprow,
3115 $ npcol, myrow, mycol, iloc, jloc,
3116 $ rsrc, csrc )
3117 IF( myrow.EQ.rsrc .AND. mycol.EQ.csrc )
3118 $ THEN
3119 IF( npcol.GT.1 )
3120 $
CALL bslaapp( 1, trows, nwin, ncb,
3121 $ work(ipw5), trows, nitraf,
3122 $ iwork(ipiw), work( ipw3 ),
3123 $ work(ipw8) )
3124 CALL slamov( 'All', trows, dim4,
3125 $ work(ipw5+trows*dim1), trows,
3126 $ t((jloc-1)*lldt+iloc ), lldt )
3127 END IF
3128 500 CONTINUE
3129 IF( wantq ) THEN
3130 indxe =
min(n,1+(nprow-1)*nb)
3131 DO 510 indx = 1, indxe, nb
3132 CALL infog2l( indx, i, descq, nprow,
3133 $ npcol, myrow, mycol, iloc, jloc,
3134 $ rsrc, csrc )
3135 IF( myrow.EQ.rsrc .AND. mycol.EQ.csrc )
3136 $ THEN
3137 CALL bslaapp( 1, qrows, nwin, ncb,
3138 $ work(ipw7), qrows, nitraf,
3139 $ iwork(ipiw), work( ipw3 ),
3140 $ work(ipw8) )
3141 CALL slamov( 'All', qrows, dim1,
3142 $ work(ipw7), qrows,
3143 $ q((jloc-1)*lldq+iloc ), lldq )
3144 END IF
3145 CALL infog2l( indx, i+dim1, descq,
3146 $ nprow, npcol, myrow, mycol, iloc,
3147 $ jloc, rsrc, csrc )
3148 IF( myrow.EQ.rsrc .AND. mycol.EQ.csrc )
3149 $ THEN
3150 IF( npcol.GT.1 )
3151 $
CALL bslaapp( 1, qrows, nwin,
3152 $ ncb, work(ipw7), qrows,
3153 $ nitraf, iwork(ipiw),
3154 $ work( ipw3 ), work(ipw8) )
3155 CALL slamov( 'All', qrows, dim4,
3156 $ work(ipw7+qrows*dim1), qrows,
3157 $ q((jloc-1)*lldq+iloc ), lldq )
3158 END IF
3159 510 CONTINUE
3160 END IF
3161 END IF
3162
3163 IF( dir.EQ.1 ) THEN
3164 IF( lihic.LT.n ) THEN
3165 indx = lihic + 1
3166 CALL infog2l( i, indx, desct, nprow,
3167 $ npcol, myrow, mycol, iloc, jloc,
3168 $ rsrc, csrc )
3169 IF( myrow.EQ.rsrc .AND. mycol.EQ.csrc.AND.
3170 $ mod(lihic,nb).NE.0 ) THEN
3171 CALL bslaapp( 0, nwin, tcols, ncb,
3172 $ work( ipw6 ), nwin, nitraf,
3173 $ iwork(ipiw), work( ipw3 ),
3174 $ work(ipw8) )
3175 CALL slamov( 'All', dim1, tcols,
3176 $ work( ipw6 ), nwin,
3177 $ t((jloc-1)*lldt+iloc), lldt )
3178 END IF
3179 CALL infog2l( i+dim1, indx, desct, nprow,
3180 $ npcol, myrow, mycol, iloc, jloc,
3181 $ rsrc, csrc )
3182 IF( myrow.EQ.rsrc .AND. mycol.EQ.csrc.AND.
3183 $ mod(lihic,nb).NE.0 ) THEN
3184 IF( nprow.GT.1 )
3185 $
CALL bslaapp( 0, nwin, tcols, ncb,
3186 $ work( ipw6 ), nwin, nitraf,
3187 $ iwork(ipiw), work( ipw3 ),
3188 $ work(ipw8) )
3189 CALL slamov( 'All', dim4, tcols,
3190 $ work( ipw6+dim1 ), nwin,
3191 $ t((jloc-1)*lldt+iloc), lldt )
3192 END IF
3193 indxs =
iceil(lihic,nb)*nb + 1
3194 indxe =
min(n,indxs+(npcol-2)*nb)
3195 DO 520 indx = indxs, indxe, nb
3196 CALL infog2l( i, indx, desct, nprow,
3197 $ npcol, myrow, mycol, iloc, jloc,
3198 $ rsrc, csrc )
3199 IF( myrow.EQ.rsrc .AND. mycol.EQ.csrc )
3200 $ THEN
3201 CALL bslaapp( 0, nwin, tcols, ncb,
3202 $ work(ipw6), nwin, nitraf,
3203 $ iwork(ipiw), work( ipw3 ),
3204 $ work(ipw8) )
3205 CALL slamov( 'All', dim1, tcols,
3206 $ work( ipw6 ), nwin,
3207 $ t((jloc-1)*lldt+iloc), lldt )
3208 END IF
3209 CALL infog2l( i+dim1, indx, desct,
3210 $ nprow, npcol, myrow, mycol, iloc,
3211 $ jloc, rsrc, csrc )
3212 IF( myrow.EQ.rsrc .AND. mycol.EQ.csrc )
3213 $ THEN
3214 IF( nprow.GT.1 )
3215 $
CALL bslaapp( 0, nwin, tcols,
3216 $ ncb, work(ipw6), nwin, nitraf,
3217 $ iwork(ipiw), work( ipw3 ),
3218 $ work(ipw8) )
3219 CALL slamov( 'All', dim4, tcols,
3220 $ work( ipw6+dim1 ), nwin,
3221 $ t((jloc-1)*lldt+iloc), lldt )
3222 END IF
3223 520 CONTINUE
3224 END IF
3225 END IF
3226 END IF
3227 END IF
3228
3229 328 CONTINUE
3230
3231 323 CONTINUE
3232
3233
3234
3235 2222 CONTINUE
3236
3237
3238
3239
3240 310 CONTINUE
3241 last = last + 1
3242 IF( lastwait .AND. last.LT.2 ) GO TO 308
3243
3244
3245
3246 CALL blacs_barrier( ictxt, 'All' )
3247
3248
3249
3250
3251 myierr = ierr
3252 IF( nprocs.GT.1 ) THEN
3253 CALL igamx2d( ictxt, 'All', top, 1, 1, ierr, 1, -1,
3254 $ -1, -1, -1, -1 )
3255 END IF
3256
3257 IF( ierr.NE.0 ) THEN
3258
3259
3260
3261
3262 IF( myierr.NE.0 ) info =
max(1,i+kks-1)
3263 IF( nprocs.GT.1 ) THEN
3264 CALL igamx2d( ictxt, 'All', top, 1, 1, info, 1, -1,
3265 $ -1, -1, -1, -1 )
3266 END IF
3267 GO TO 300
3268 END IF
3269
3270
3271
3272 DO 530 k = 1, n
3273 rsrc =
indxg2p( k, nb, myrow, desct( rsrc_ ), nprow )
3274 csrc =
indxg2p( k, nb, mycol, desct( csrc_ ), npcol )
3275 IF( myrow.NE.rsrc .OR. mycol.NE.csrc )
3276 $ SELECT( k ) = 0
3277 530 CONTINUE
3278 IF( nprocs.GT.1 )
3279 $ CALL igsum2d( ictxt, 'All', top, n, 1, SELECT, n, -1, -1 )
3280
3281
3282
3283 ilo = ilo - 1
3284 523 CONTINUE
3285 ilo = ilo + 1
3286 IF( ilo.LE.n ) THEN
3287 IF( SELECT(ilo).NE.0 ) GO TO 523
3288 END IF
3289 ihi = ihi + 1
3290 527 CONTINUE
3291 ihi = ihi - 1
3292 IF( ihi.GE.1 ) THEN
3293 IF( SELECT(ihi).EQ.0 ) GO TO 527
3294 END IF
3295
3296
3297 GO TO 50
3298 END IF
3299
3300 300 CONTINUE
3301
3302
3303
3304
3305 IF( info.NE.0 ) THEN
3306 DO 540 k = 1, n
3307 rsrc =
indxg2p( k, nb, myrow, desct( rsrc_ ), nprow )
3308 csrc =
indxg2p( k, nb, mycol, desct( csrc_ ), npcol )
3309 IF( myrow.NE.rsrc .OR. mycol.NE.csrc )
3310 $ SELECT( k ) = 0
3311 540 CONTINUE
3312 IF( nprocs.GT.1 )
3313 $ CALL igsum2d( ictxt, 'All', top, n, 1, SELECT, n, -1, -1 )
3314 END IF
3315
3316 545 CONTINUE
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327 DO 550 k = 1, n
3328 wr( k ) = zero
3329 wi( k ) = zero
3330 550 CONTINUE
3331
3332
3333
3334
3335
3336 pair = .false.
3337 DO 560 k = 1, n
3338 IF( .NOT. pair ) THEN
3339 border = ( k.NE.n .AND. mod( k, nb ).EQ.0 ) .OR.
3340 % ( k.NE.1 .AND. mod( k, nb ).EQ.1 )
3341 IF( .NOT. border ) THEN
3342 CALL infog2l( k, k, desct, nprow, npcol, myrow, mycol,
3343 $ iloc1, jloc1, trsrc1, tcsrc1 )
3344 IF( myrow.EQ.trsrc1 .AND. mycol.EQ.tcsrc1 ) THEN
3345 elem1 = t((jloc1-1)*lldt+iloc1)
3346 IF( k.LT.n ) THEN
3347 elem3 = t((jloc1-1)*lldt+iloc1+1)
3348 ELSE
3349 elem3 = zero
3350 END IF
3351 IF( elem3.NE.zero ) THEN
3352 elem2 = t((jloc1)*lldt+iloc1)
3353 elem4 = t((jloc1)*lldt+iloc1+1)
3354 CALL slanv2( elem1, elem2, elem3, elem4,
3355 $ wr( k ), wi( k ), wr( k+1 ), wi( k+1 ), sn,
3356 $ cs )
3357 pair = .true.
3358 ELSE
3359 IF( k.GT.1 ) THEN
3360 tmp = t((jloc1-2)*lldt+iloc1)
3361 IF( tmp.NE.zero ) THEN
3362 elem1 = t((jloc1-2)*lldt+iloc1-1)
3363 elem2 = t((jloc1-1)*lldt+iloc1-1)
3364 elem3 = t((jloc1-2)*lldt+iloc1)
3365 elem4 = t((jloc1-1)*lldt+iloc1)
3366 CALL slanv2( elem1, elem2, elem3, elem4,
3367 $ wr( k-1 ), wi( k-1 ), wr( k ),
3368 $ wi( k ), sn, cs )
3369 ELSE
3370 wr( k ) = elem1
3371 END IF
3372 ELSE
3373 wr( k ) = elem1
3374 END IF
3375 END IF
3376 END IF
3377 END IF
3378 ELSE
3379 pair = .false.
3380 END IF
3381 560 CONTINUE
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391 DO 570 k = nb, n-1, nb
3392 CALL infog2l( k, k, desct, nprow, npcol, myrow, mycol,
3393 $ iloc1, jloc1, trsrc1, tcsrc1 )
3394 CALL infog2l( k, k+1, desct, nprow, npcol, myrow, mycol,
3395 $ iloc2, jloc2, trsrc2, tcsrc2 )
3396 CALL infog2l( k+1, k, desct, nprow, npcol, myrow, mycol,
3397 $ iloc3, jloc3, trsrc3, tcsrc3 )
3398 CALL infog2l( k+1, k+1, desct, nprow, npcol, myrow, mycol,
3399 $ iloc4, jloc4, trsrc4, tcsrc4 )
3400 IF( myrow.EQ.trsrc2 .AND. mycol.EQ.tcsrc2 ) THEN
3401 elem2 = t((jloc2-1)*lldt+iloc2)
3402 IF( trsrc1.NE.trsrc2 .OR. tcsrc1.NE.tcsrc2 )
3403 $ CALL sgesd2d( ictxt, 1, 1, elem2, 1, trsrc1, tcsrc1 )
3404 END IF
3405 IF( myrow.EQ.trsrc3 .AND. mycol.EQ.tcsrc3 ) THEN
3406 elem3 = t((jloc3-1)*lldt+iloc3)
3407 IF( trsrc1.NE.trsrc3 .OR. tcsrc1.NE.tcsrc3 )
3408 $ CALL sgesd2d( ictxt, 1, 1, elem3, 1, trsrc1, tcsrc1 )
3409 END IF
3410 IF( myrow.EQ.trsrc4 .AND. mycol.EQ.tcsrc4 ) THEN
3411 work(1) = t((jloc4-1)*lldt+iloc4)
3412 IF( k+1.LT.n ) THEN
3413 work(2) = t((jloc4-1)*lldt+iloc4+1)
3414 ELSE
3415 work(2) = zero
3416 END IF
3417 IF( trsrc1.NE.trsrc4 .OR. tcsrc1.NE.tcsrc4 )
3418 $ CALL sgesd2d( ictxt, 2, 1, work, 2, trsrc1, tcsrc1 )
3419 END IF
3420 IF( myrow.EQ.trsrc1 .AND. mycol.EQ.tcsrc1 ) THEN
3421 elem1 = t((jloc1-1)*lldt+iloc1)
3422 IF( trsrc1.NE.trsrc2 .OR. tcsrc1.NE.tcsrc2 )
3423 $ CALL sgerv2d( ictxt, 1, 1, elem2, 1, trsrc2, tcsrc2 )
3424 IF( trsrc1.NE.trsrc3 .OR. tcsrc1.NE.tcsrc3 )
3425 $ CALL sgerv2d( ictxt, 1, 1, elem3, 1, trsrc3, tcsrc3 )
3426 IF( trsrc1.NE.trsrc4 .OR. tcsrc1.NE.tcsrc4 )
3427 $ CALL sgerv2d( ictxt, 2, 1, work, 2, trsrc4, tcsrc4 )
3428 elem4 = work(1)
3429 elem5 = work(2)
3430 IF( elem5.EQ.zero ) THEN
3431 IF( wr( k ).EQ.zero .AND. wi( k ).EQ.zero ) THEN
3432 CALL slanv2( elem1, elem2, elem3, elem4, wr( k ),
3433 $ wi( k ), wr( k+1 ), wi( k+1 ), sn, cs )
3434 ELSEIF( wr( k+1 ).EQ.zero .AND. wi( k+1 ).EQ.zero ) THEN
3435 wr( k+1 ) = elem4
3436 END IF
3437 ELSEIF( wr( k ).EQ.zero .AND. wi( k ).EQ.zero ) THEN
3438 wr( k ) = elem1
3439 END IF
3440 END IF
3441 570 CONTINUE
3442
3443 IF( nprocs.GT.1 ) THEN
3444 CALL sgsum2d( ictxt, 'All', top, n, 1, wr, n, -1, -1 )
3445 CALL sgsum2d( ictxt, 'All', top, n, 1, wi, n, -1, -1 )
3446 END IF
3447
3448
3449
3450 work( 1 ) = float(lwmin)
3451 iwork( 1 ) = liwmin
3452
3453
3454
3455 RETURN
3456
3457
3458
subroutine bdtrexc(n, t, ldt, ifst, ilst, nitraf, itraf, ndtraf, dtraf, work, info)
subroutine bslaapp(iside, m, n, nb, a, lda, nitraf, itraf, dtraf, work)
subroutine bstrexc(n, t, ldt, ifst, ilst, nitraf, itraf, ndtraf, dtraf, work, info)
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
integer function iceil(inum, idenom)
subroutine ilacpy(uplo, m, n, a, lda, b, ldb)
integer function indxg2l(indxglob, nb, iproc, isrcproc, nprocs)
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
subroutine pchk2mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, mb, mbpos0, nb, nbpos0, ib, jb, descb, descbpos0, nextra, ex, expos, info)
subroutine pselget(scope, top, alpha, a, ia, ja, desca)
subroutine pslacpy(uplo, m, n, a, ia, ja, desca, b, ib, jb, descb)
subroutine pxerbla(ictxt, srname, info)