3
4
5
6
7
8
9
10 CHARACTER SIDE
11 INTEGER IC, INCV, IV, JC, JV, L, M, N
12
13
14 INTEGER DESCC( * ), DESCV( * )
15 COMPLEX*16 C( * ), TAU( * ), V( * ), 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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
237 $ LLD_, MB_, M_, NB_, N_, RSRC_
238 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
239 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
240 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
241 COMPLEX*16 ONE, ZERO
242 parameter( one = ( 1.0d+0, 0.0d+0 ),
243 $ zero = ( 0.0d+0, 0.0d+0 ) )
244
245
246 LOGICAL CCBLCK, CRBLCK, LEFT
247 CHARACTER COLBTOP, ROWBTOP
248 INTEGER ICCOL1, ICCOL2, ICOFFC1, ICOFFC2, ICOFFV,
249 $ ICROW1, ICROW2, ICTXT, IIC1, IIC2, IIV, IOFFC1,
250 $ IOFFC2, IOFFV, IPW, IROFFC1, IROFFC2, IROFFV,
251 $ IVCOL, IVROW, JJC1, JJC2, JJV, LDC, LDV, MPC2,
252 $ MPV, MYCOL, MYROW, NCC, NCV, NPCOL, NPROW,
253 $ NQC2, NQV, RDEST
254 COMPLEX*16 TAULOC( 1 )
255
256
258 $ zaxpy, zcopy, zgebr2d, zgebs2d,
259 $ zgemv, zgerc, zgerv2d, zgesd2d,
260 $ zgsum2d, zlaset
261
262
263 LOGICAL LSAME
264 INTEGER NUMROC
266
267
269
270
271
272
273
274 IF( m.LE.0 .OR. n.LE.0 )
275 $ RETURN
276
277
278
279 ictxt = descc( ctxt_ )
280 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
281
282
283
284 left =
lsame( side,
'L' )
285 CALL infog2l( iv, jv, descv, nprow, npcol, myrow, mycol, iiv, jjv,
286 $ ivrow, ivcol )
287 iroffv = mod( iv-1, descv( nb_ ) )
288 mpv =
numroc( l+iroffv, descv( mb_ ), myrow, ivrow, nprow )
289 IF( myrow.EQ.ivrow )
290 $ mpv = mpv - iroffv
291 icoffv = mod( jv-1, descv( nb_ ) )
292 nqv =
numroc( l+icoffv, descv( nb_ ), mycol, ivcol, npcol )
293 IF( mycol.EQ.ivcol )
294 $ nqv = nqv - icoffv
295 ldv = descv( lld_ )
296 ncv =
numroc( descv( n_ ), descv( nb_ ), mycol, descv( csrc_ ),
297 $ npcol )
298 ldv = descv( lld_ )
299 iiv =
min( iiv, ldv )
300 jjv =
min( jjv, ncv )
301 ioffv = iiv+(jjv-1)*ldv
302 ncc =
numroc( descc( n_ ), descc( nb_ ), mycol, descc( csrc_ ),
303 $ npcol )
304 CALL infog2l( ic, jc, descc, nprow, npcol, myrow, mycol,
305 $ iic1, jjc1, icrow1, iccol1 )
306 iroffc1 = mod( ic-1, descc( mb_ ) )
307 icoffc1 = mod( jc-1, descc( nb_ ) )
308 ldc = descc( lld_ )
309 iic1 =
min( iic1, ldc )
310 jjc1 =
min( jjc1,
max( 1, ncc ) )
311 ioffc1 = iic1 + ( jjc1-1 ) * ldc
312
313 IF( left ) THEN
314 CALL infog2l( ic+m-l, jc, descc, nprow, npcol, myrow, mycol,
315 $ iic2, jjc2, icrow2, iccol2 )
316 iroffc2 = mod( ic+m-l-1, descc( mb_ ) )
317 icoffc2 = mod( jc-1, descc( nb_ ) )
318 nqc2 =
numroc( n+icoffc2, descc( nb_ ), mycol, iccol2, npcol )
319 IF( mycol.EQ.iccol2 )
320 $ nqc2 = nqc2 - icoffc2
321 ELSE
322 CALL infog2l( ic, jc+n-l, descc, nprow, npcol, myrow, mycol,
323 $ iic2, jjc2, icrow2, iccol2 )
324 iroffc2 = mod( ic-1, descc( mb_ ) )
325 mpc2 =
numroc( m+iroffc2, descc( mb_ ), myrow, icrow2, nprow )
326 IF( myrow.EQ.icrow2 )
327 $ mpc2 = mpc2 - iroffc2
328 icoffc2 = mod( jc+n-l-1, descc( nb_ ) )
329 END IF
330 iic2 =
min( iic2, ldc )
331 jjc2 =
min( jjc2, ncc )
332 ioffc2 = iic2 + ( jjc2-1 ) * ldc
333
334
335
336 crblck = ( m.LE.(descc( mb_ )-iroffc1) )
337
338
339
340 ccblck = ( n.LE.(descc( nb_ )-icoffc1) )
341
342 IF( left ) THEN
343
344 IF( crblck ) THEN
345 rdest = icrow2
346 ELSE
347 rdest = -1
348 END IF
349
350 IF( ccblck ) THEN
351
352
353
354 IF( descv( m_ ).EQ.incv ) THEN
355
356
357
358 ipw = mpv+1
359 CALL pbztrnv( ictxt,
'Rowwise',
'Transpose', m,
360 $ descv( nb_ ), iroffc2, v( ioffv ), ldv,
361 $ zero,
362 $ work, 1, ivrow, ivcol, icrow2, iccol2,
363 $ work( ipw ) )
364
365
366
367 IF( mycol.EQ.iccol2 ) THEN
368
369 IF( myrow.EQ.ivrow ) THEN
370
371 CALL zgebs2d( ictxt, 'Columnwise', ' ', 1, 1,
372 $ tau( iiv ), 1 )
373 tauloc( 1 ) = dconjg( tau( iiv ) )
374
375 ELSE
376
377 CALL zgebr2d( ictxt, 'Columnwise', ' ', 1, 1,
378 $ tauloc, 1, ivrow, mycol )
379 tauloc( 1 ) = dconjg( tauloc( 1 ) )
380
381 END IF
382
383 IF( tauloc( 1 ).NE.zero ) THEN
384
385
386
387 IF( mpv.GT.0 ) THEN
388 CALL zgemv( 'Conjugate transpose', mpv, nqc2,
389 $ one, c( ioffc2 ), ldc, work, 1,
390 $ zero, work( ipw ), 1 )
391 ELSE
392 CALL zlaset( 'All', nqc2, 1, zero, zero,
393 $ work( ipw ),
max( 1, nqc2 ) )
394 END IF
395 IF( myrow.EQ.icrow1 )
396 $ CALL zaxpy( nqc2, one, c( ioffc1 ), ldc,
397 $ work( ipw ),
max( 1, nqc2 ) )
398
399 CALL zgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
400 $ work( ipw ),
max( 1, nqc2 ), rdest,
401 $ mycol )
402
403
404
405 IF( myrow.EQ.icrow1 )
406 $ CALL zaxpy( nqc2, -tauloc( 1 ), work( ipw ),
407 $
max( 1, nqc2 ), c( ioffc1 ), ldc )
408 CALL zgerc( mpv, nqc2, -tauloc( 1 ), work, 1,
409 $ work( ipw ), 1, c( ioffc2 ), ldc )
410 END IF
411
412 END IF
413
414 ELSE
415
416
417
418 IF( ivcol.EQ.iccol2 ) THEN
419
420
421
422 IF( mycol.EQ.iccol2 ) THEN
423
424 tauloc( 1 ) = dconjg( tau( jjv ) )
425
426 IF( tauloc( 1 ).NE.zero ) THEN
427
428
429
430 IF( mpv.GT.0 ) THEN
431 CALL zgemv( 'Conjugate transpose', mpv, nqc2,
432 $ one, c( ioffc2 ), ldc, v( ioffv ),
433 $ 1, zero, work, 1 )
434 ELSE
435 CALL zlaset( 'All', nqc2, 1, zero, zero,
436 $ work,
max( 1, nqc2 ) )
437 END IF
438 IF( myrow.EQ.icrow1 )
439 $ CALL zaxpy( nqc2, one, c( ioffc1 ), ldc,
440 $ work,
max( 1, nqc2 ) )
441
442 CALL zgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
443 $ work,
max( 1, nqc2 ), rdest,
444 $ mycol )
445
446
447
448 IF( myrow.EQ.icrow1 )
449 $ CALL zaxpy( nqc2, -tauloc( 1 ), work,
450 $
max( 1, nqc2 ), c( ioffc1 ),
451 $ ldc )
452 CALL zgerc( mpv, nqc2, -tauloc( 1 ), v( ioffv ),
453 $ 1, work, 1, c( ioffc2 ), ldc )
454 END IF
455
456 END IF
457
458 ELSE
459
460
461
462 IF( mycol.EQ.ivcol ) THEN
463
464 ipw = mpv+1
465 CALL zcopy( mpv, v( ioffv ), 1, work, 1 )
466 work( ipw ) = tau( jjv )
467 CALL zgesd2d( ictxt, ipw, 1, work, ipw, myrow,
468 $ iccol2 )
469
470 ELSE IF( mycol.EQ.iccol2 ) THEN
471
472 ipw = mpv+1
473 CALL zgerv2d( ictxt, ipw, 1, work, ipw, myrow,
474 $ ivcol )
475 tauloc( 1 ) = dconjg( work( ipw ) )
476
477 IF( tauloc( 1 ).NE.zero ) THEN
478
479
480
481 IF( mpv.GT.0 ) THEN
482 CALL zgemv( 'Conjugate transpose', mpv, nqc2,
483 $ one, c( ioffc2 ), ldc, work, 1,
484 $ zero, work( ipw ), 1 )
485 ELSE
486 CALL zlaset( 'All', nqc2, 1, zero, zero,
487 $ work( ipw ),
max( 1, nqc2 ) )
488 END IF
489 IF( myrow.EQ.icrow1 )
490 $ CALL zaxpy( nqc2, one, c( ioffc1 ), ldc,
491 $ work( ipw ),
max( 1, nqc2 ) )
492
493 CALL zgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
494 $ work( ipw ),
max( 1, nqc2 ),
495 $ rdest, mycol )
496
497
498
499 IF( myrow.EQ.icrow1 )
500 $ CALL zaxpy( nqc2, -tauloc( 1 ), work( ipw ),
501 $
max( 1, nqc2 ), c( ioffc1 ),
502 $ ldc )
503 CALL zgerc( mpv, nqc2, -tauloc( 1 ), work, 1,
504 $ work( ipw ), 1, c( ioffc2 ), ldc )
505 END IF
506
507 END IF
508
509 END IF
510
511 END IF
512
513 ELSE
514
515
516
517 IF( descv( m_ ).EQ.incv ) THEN
518
519
520
521 ipw = mpv+1
522 CALL pbztrnv( ictxt,
'Rowwise',
'Transpose', m,
523 $ descv( nb_ ), iroffc2, v( ioffv ), ldv,
524 $ zero,
525 $ work, 1, ivrow, ivcol, icrow2, -1,
526 $ work( ipw ) )
527
528
529
530 IF( myrow.EQ.ivrow ) THEN
531
532 CALL zgebs2d( ictxt, 'Columnwise', ' ', 1, 1,
533 $ tau( iiv ), 1 )
534 tauloc( 1 ) = dconjg( tau( iiv ) )
535
536 ELSE
537
538 CALL zgebr2d( ictxt, 'Columnwise', ' ', 1, 1, tauloc,
539 $ 1, ivrow, mycol )
540 tauloc( 1 ) = dconjg( tauloc( 1 ) )
541
542 END IF
543
544 IF( tauloc( 1 ).NE.zero ) THEN
545
546
547
548 IF( mpv.GT.0 ) THEN
549 CALL zgemv( 'Conjugate transpose', mpv, nqc2, one,
550 $ c( ioffc2 ), ldc, work, 1, zero,
551 $ work( ipw ), 1 )
552 ELSE
553 CALL zlaset( 'All', nqc2, 1, zero, zero,
554 $ work( ipw ),
max( 1, nqc2 ) )
555 END IF
556 IF( myrow.EQ.icrow1 )
557 $ CALL zaxpy( nqc2, one, c( ioffc1 ), ldc,
558 $ work( ipw ),
max( 1, nqc2 ) )
559
560 CALL zgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
561 $ work( ipw ),
max( 1, nqc2 ), rdest,
562 $ mycol )
563
564
565
566 IF( myrow.EQ.icrow1 )
567 $ CALL zaxpy( nqc2, -tauloc( 1 ), work( ipw ),
568 $
max( 1, nqc2 ), c( ioffc1 ), ldc )
569 CALL zgerc( mpv, nqc2, -tauloc( 1 ), work, 1,
570 $ work( ipw ), 1, c( ioffc2 ), ldc )
571 END IF
572
573 ELSE
574
575
576
577 CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rowbtop )
578 IF( mycol.EQ.ivcol ) THEN
579
580 ipw = mpv+1
581 CALL zcopy( mpv, v( ioffv ), 1, work, 1 )
582 work( ipw ) = tau( jjv )
583 CALL zgebs2d( ictxt, 'Rowwise', rowbtop, ipw, 1,
584 $ work, ipw )
585 tauloc( 1 ) = dconjg( tau( jjv ) )
586
587 ELSE
588
589 ipw = mpv+1
590 CALL zgebr2d( ictxt, 'Rowwise', rowbtop, ipw, 1, work,
591 $ ipw, myrow, ivcol )
592 tauloc( 1 ) = dconjg( work( ipw ) )
593
594 END IF
595
596 IF( tauloc( 1 ).NE.zero ) THEN
597
598
599
600 IF( mpv.GT.0 ) THEN
601 CALL zgemv( 'Conjugate transpose', mpv, nqc2, one,
602 $ c( ioffc2 ), ldc, work, 1, zero,
603 $ work( ipw ), 1 )
604 ELSE
605 CALL zlaset( 'All', nqc2, 1, zero, zero,
606 $ work( ipw ),
max( 1, nqc2 ) )
607 END IF
608 IF( myrow.EQ.icrow1 )
609 $ CALL zaxpy( nqc2, one, c( ioffc1 ), ldc,
610 $ work( ipw ),
max( 1, nqc2 ) )
611
612 CALL zgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
613 $ work( ipw ),
max( 1, nqc2 ), rdest,
614 $ mycol )
615
616
617
618 IF( myrow.EQ.icrow1 )
619 $ CALL zaxpy( nqc2, -tauloc( 1 ), work( ipw ),
620 $
max( 1, nqc2 ), c( ioffc1 ), ldc )
621 CALL zgerc( mpv, nqc2, -tauloc( 1 ), work, 1,
622 $ work( ipw ), 1, c( ioffc2 ), ldc )
623 END IF
624
625 END IF
626
627 END IF
628
629 ELSE
630
631 IF( ccblck ) THEN
632 rdest = myrow
633 ELSE
634 rdest = -1
635 END IF
636
637 IF( crblck ) THEN
638
639
640
641 IF( descv( m_ ).EQ.incv ) THEN
642
643
644
645 IF( ivrow.EQ.icrow2 ) THEN
646
647
648
649 IF( myrow.EQ.icrow2 ) THEN
650
651 tauloc( 1 ) = dconjg( tau( iiv ) )
652
653 IF( tauloc( 1 ).NE.zero ) THEN
654
655
656
657 IF( nqv.GT.0 ) THEN
658 CALL zgemv( 'No transpose', mpc2, nqv, one,
659 $ c( ioffc2 ), ldc, v( ioffv ),
660 $ ldv, zero, work, 1 )
661 ELSE
662 CALL zlaset( 'All', mpc2, 1, zero, zero,
663 $ work,
max( 1, mpc2 ) )
664 END IF
665 IF( mycol.EQ.iccol1 )
666 $ CALL zaxpy( mpc2, one, c( ioffc1 ), 1,
667 $ work, 1 )
668
669 CALL zgsum2d( ictxt, 'Rowwise', ' ', mpc2, 1,
670 $ work,
max( 1, mpc2 ), rdest,
671 $ iccol2 )
672
673 IF( mycol.EQ.iccol1 )
674 $ CALL zaxpy( mpc2, -tauloc( 1 ), work, 1,
675 $ c( ioffc1 ), 1 )
676
677
678
679 CALL zgerc( mpc2, nqv, -tauloc( 1 ), work, 1,
680 $ v( ioffv ), ldv, c( ioffc2 ), ldc )
681 END IF
682
683 END IF
684
685 ELSE
686
687
688
689 IF( myrow.EQ.ivrow ) THEN
690
691 ipw = nqv+1
692 CALL zcopy( nqv, v( ioffv ), ldv, work, 1 )
693 work( ipw ) = tau( iiv )
694 CALL zgesd2d( ictxt, ipw, 1, work, ipw, icrow2,
695 $ mycol )
696
697 ELSE IF( myrow.EQ.icrow2 ) THEN
698
699 ipw = nqv+1
700 CALL zgerv2d( ictxt, ipw, 1, work, ipw, ivrow,
701 $ mycol )
702 tauloc( 1 ) = dconjg( work( ipw ) )
703
704 IF( tauloc( 1 ).NE.zero ) THEN
705
706
707
708 IF( nqv.GT.0 ) THEN
709 CALL zgemv( 'No transpose', mpc2, nqv, one,
710 $ c( ioffc2 ), ldc, work, 1, zero,
711 $ work( ipw ), 1 )
712 ELSE
713 CALL zlaset( 'All', mpc2, 1, zero, zero,
714 $ work( ipw ),
max( 1, mpc2 ) )
715 END IF
716 IF( mycol.EQ.iccol1 )
717 $ CALL zaxpy( mpc2, one, c( ioffc1 ), 1,
718 $ work( ipw ), 1 )
719 CALL zgsum2d( ictxt, 'Rowwise', ' ', mpc2, 1,
720 $ work( ipw ),
max( 1, mpc2 ),
721 $ rdest, iccol2 )
722 IF( mycol.EQ.iccol1 )
723 $ CALL zaxpy( mpc2, -tauloc( 1 ), work( ipw ),
724 $ 1, c( ioffc1 ), 1 )
725
726
727
728 CALL zgerc( mpc2, nqv, -tauloc( 1 ),
729 $ work( ipw ), 1, work, 1,
730 $ c( ioffc2 ), ldc )
731 END IF
732
733 END IF
734
735 END IF
736
737 ELSE
738
739
740
741 ipw = nqv+1
742 CALL pbztrnv( ictxt,
'Columnwise',
'Transpose', n,
743 $ descv( mb_ ), icoffc2, v( ioffv ), 1, zero,
744 $ work, 1, ivrow, ivcol, icrow2, iccol2,
745 $ work( ipw ) )
746
747
748
749 IF( myrow.EQ.icrow2 ) THEN
750
751 IF( mycol.EQ.ivcol ) THEN
752
753 CALL zgebs2d( ictxt, 'Rowwise', ' ', 1, 1,
754 $ tau( jjv ), 1 )
755 tauloc( 1 ) = dconjg( tau( jjv ) )
756
757 ELSE
758
759 CALL zgebr2d( ictxt, 'Rowwise', ' ', 1, 1, tauloc,
760 $ 1, myrow, ivcol )
761 tauloc( 1 ) = dconjg( tauloc( 1 ) )
762
763 END IF
764
765 IF( tauloc( 1 ).NE.zero ) THEN
766
767
768
769 IF( nqv.GT.0 ) THEN
770 CALL zgemv( 'No transpose', mpc2, nqv, one,
771 $ c( ioffc2 ), ldc, work, 1, zero,
772 $ work( ipw ), 1 )
773 ELSE
774 CALL zlaset( 'All', mpc2, 1, zero, zero,
775 $ work( ipw ),
max( 1, mpc2 ) )
776 END IF
777 IF( mycol.EQ.iccol1 )
778 $ CALL zaxpy( mpc2, one, c( ioffc1 ), 1,
779 $ work( ipw ), 1 )
780 CALL zgsum2d( ictxt, 'Rowwise', ' ', mpc2, 1,
781 $ work( ipw ),
max( 1, mpc2 ), rdest,
782 $ iccol2 )
783 IF( mycol.EQ.iccol1 )
784 $ CALL zaxpy( mpc2, -tauloc( 1 ), work( ipw ), 1,
785 $ c( ioffc1 ), 1 )
786
787
788
789 CALL zgerc( mpc2, nqv, -tauloc( 1 ), work( ipw ),
790 $ 1, work, 1, c( ioffc2 ), ldc )
791 END IF
792
793 END IF
794
795 END IF
796
797 ELSE
798
799
800
801 IF( descv( m_ ).EQ.incv ) THEN
802
803
804
805 CALL pb_topget( ictxt, 'Broadcast', 'Columnwise',
806 $ colbtop )
807 IF( myrow.EQ.ivrow ) THEN
808
809 ipw = nqv+1
810 CALL zcopy( nqv, v( ioffv ), ldv, work, 1 )
811 work( ipw ) = tau( iiv )
812 CALL zgebs2d( ictxt, 'Columnwise', colbtop, ipw, 1,
813 $ work, ipw )
814 tauloc( 1 ) = dconjg( tau( iiv ) )
815
816 ELSE
817
818 ipw = nqv+1
819 CALL zgebr2d( ictxt, 'Columnwise', colbtop, ipw, 1,
820 $ work, ipw, ivrow, mycol )
821 tauloc( 1 ) = dconjg( work( ipw ) )
822
823 END IF
824
825 IF( tauloc( 1 ).NE.zero ) THEN
826
827
828
829 IF( nqv.GT.0 ) THEN
830 CALL zgemv( 'No Transpose', mpc2, nqv, one,
831 $ c( ioffc2 ), ldc, work, 1, zero,
832 $ work( ipw ), 1 )
833 ELSE
834 CALL zlaset( 'All', mpc2, 1, zero, zero,
835 $ work( ipw ),
max( 1, mpc2 ) )
836 END IF
837 IF( mycol.EQ.iccol1 )
838 $ CALL zaxpy( mpc2, one, c( ioffc1 ), 1,
839 $ work( ipw ), 1 )
840
841 CALL zgsum2d( ictxt, 'Rowwise', ' ', mpc2, 1,
842 $ work( ipw ),
max( 1, mpc2 ), rdest,
843 $ iccol2 )
844 IF( mycol.EQ.iccol1 )
845 $ CALL zaxpy( mpc2, -tauloc( 1 ), work( ipw ), 1,
846 $ c( ioffc1 ), 1 )
847
848
849
850 CALL zgerc( mpc2, nqv, -tauloc( 1 ), work( ipw ), 1,
851 $ work, 1, c( ioffc2 ), ldc )
852 END IF
853
854 ELSE
855
856
857
858 ipw = nqv+1
859 CALL pbztrnv( ictxt,
'Columnwise',
'Transpose', n,
860 $ descv( mb_ ), icoffc2, v( ioffv ), 1, zero,
861 $ work, 1, ivrow, ivcol, -1, iccol2,
862 $ work( ipw ) )
863
864
865
866 IF( mycol.EQ.ivcol ) THEN
867
868 CALL zgebs2d( ictxt, 'Rowwise', ' ', 1, 1, tau( jjv ),
869 $ 1 )
870 tauloc( 1 ) = dconjg( tau( jjv ) )
871
872 ELSE
873
874 CALL zgebr2d( ictxt, 'Rowwise', ' ', 1, 1, tauloc, 1,
875 $ myrow, ivcol )
876 tauloc( 1 ) = dconjg( tauloc( 1 ) )
877
878 END IF
879
880 IF( tauloc( 1 ).NE.zero ) THEN
881
882
883
884 IF( nqv.GT.0 ) THEN
885 CALL zgemv( 'No transpose', mpc2, nqv, one,
886 $ c( ioffc2 ), ldc, work, 1, zero,
887 $ work( ipw ), 1 )
888 ELSE
889 CALL zlaset( 'All', mpc2, 1, zero, zero,
890 $ work( ipw ),
max( 1, mpc2 ) )
891 END IF
892 IF( mycol.EQ.iccol1 )
893 $ CALL zaxpy( mpc2, one, c( ioffc1 ), 1,
894 $ work( ipw ), 1 )
895 CALL zgsum2d( ictxt, 'Rowwise', ' ', mpc2, 1,
896 $ work( ipw ),
max( 1, mpc2 ), rdest,
897 $ iccol2 )
898 IF( mycol.EQ.iccol1 )
899 $ CALL zaxpy( mpc2, -tauloc( 1 ), work( ipw ), 1,
900 $ c( ioffc1 ), 1 )
901
902
903
904 CALL zgerc( mpc2, nqv, -tauloc( 1 ), work( ipw ), 1,
905 $ work, 1, c( ioffc2 ), ldc )
906 END IF
907
908 END IF
909
910 END IF
911
912 END IF
913
914 RETURN
915
916
917
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pbztrnv(icontxt, xdist, trans, n, nb, nz, x, incx, beta, y, incy, ixrow, ixcol, iyrow, iycol, work)