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 ) = tau( iiv )
374
375 ELSE
376
377 CALL zgebr2d( ictxt, 'Columnwise', ' ', 1, 1,
378 $ tauloc, 1, ivrow, mycol )
379
380 END IF
381
382 IF( tauloc( 1 ).NE.zero ) THEN
383
384
385
386 IF( mpv.GT.0 ) THEN
387 CALL zgemv( 'Conjugate transpose', mpv, nqc2,
388 $ one, c( ioffc2 ), ldc, work, 1,
389 $ zero, work( ipw ), 1 )
390 ELSE
391 CALL zlaset( 'All', nqc2, 1, zero, zero,
392 $ work( ipw ),
max( 1, nqc2 ) )
393 END IF
394 IF( myrow.EQ.icrow1 )
395 $ CALL zaxpy( nqc2, one, c( ioffc1 ), ldc,
396 $ work( ipw ),
max( 1, nqc2 ) )
397
398 CALL zgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
399 $ work( ipw ),
max( 1, nqc2 ), rdest,
400 $ mycol )
401
402
403
404 IF( myrow.EQ.icrow1 )
405 $ CALL zaxpy( nqc2, -tauloc( 1 ), work( ipw ),
406 $
max( 1, nqc2 ), c( ioffc1 ), ldc )
407 CALL zgerc( mpv, nqc2, -tauloc( 1 ), work, 1,
408 $ work( ipw ), 1, c( ioffc2 ), ldc )
409 END IF
410
411 END IF
412
413 ELSE
414
415
416
417 IF( ivcol.EQ.iccol2 ) THEN
418
419
420
421 IF( mycol.EQ.iccol2 ) THEN
422
423 tauloc( 1 ) = tau( jjv )
424
425 IF( tauloc( 1 ).NE.zero ) THEN
426
427
428
429 IF( mpv.GT.0 ) THEN
430 CALL zgemv( 'Conjugate transpose', mpv, nqc2,
431 $ one, c( ioffc2 ), ldc, v( ioffv ),
432 $ 1, zero, work, 1 )
433 ELSE
434 CALL zlaset( 'All', nqc2, 1, zero, zero,
435 $ work,
max( 1, nqc2 ) )
436 END IF
437 IF( myrow.EQ.icrow1 )
438 $ CALL zaxpy( nqc2, one, c( ioffc1 ), ldc,
439 $ work,
max( 1, nqc2 ) )
440
441 CALL zgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
442 $ work,
max( 1, nqc2 ), rdest,
443 $ mycol )
444
445
446
447 IF( myrow.EQ.icrow1 )
448 $ CALL zaxpy( nqc2, -tauloc( 1 ), work,
449 $
max( 1, nqc2 ), c( ioffc1 ),
450 $ ldc )
451 CALL zgerc( mpv, nqc2, -tauloc( 1 ), v( ioffv ),
452 $ 1, work, 1, c( ioffc2 ), ldc )
453 END IF
454
455 END IF
456
457 ELSE
458
459
460
461 IF( mycol.EQ.ivcol ) THEN
462
463 ipw = mpv+1
464 CALL zcopy( mpv, v( ioffv ), 1, work, 1 )
465 work( ipw ) = tau( jjv )
466 CALL zgesd2d( ictxt, ipw, 1, work, ipw, myrow,
467 $ iccol2 )
468
469 ELSE IF( mycol.EQ.iccol2 ) THEN
470
471 ipw = mpv+1
472 CALL zgerv2d( ictxt, ipw, 1, work, ipw, myrow,
473 $ ivcol )
474 tauloc( 1 ) = work( ipw )
475
476 IF( tauloc( 1 ).NE.zero ) THEN
477
478
479
480 IF( mpv.GT.0 ) THEN
481 CALL zgemv( 'Conjugate transpose', mpv, nqc2,
482 $ one, c( ioffc2 ), ldc, work, 1,
483 $ zero, work( ipw ), 1 )
484 ELSE
485 CALL zlaset( 'All', nqc2, 1, zero, zero,
486 $ work( ipw ),
max( 1, nqc2 ) )
487 END IF
488 IF( myrow.EQ.icrow1 )
489 $ CALL zaxpy( nqc2, one, c( ioffc1 ), ldc,
490 $ work( ipw ),
max( 1, nqc2 ) )
491
492 CALL zgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
493 $ work( ipw ),
max( 1, nqc2 ),
494 $ rdest, mycol )
495
496
497
498 IF( myrow.EQ.icrow1 )
499 $ CALL zaxpy( nqc2, -tauloc( 1 ), work( ipw ),
500 $
max( 1, nqc2 ), c( ioffc1 ),
501 $ ldc )
502 CALL zgerc( mpv, nqc2, -tauloc( 1 ), work, 1,
503 $ work( ipw ), 1, c( ioffc2 ), ldc )
504 END IF
505
506 END IF
507
508 END IF
509
510 END IF
511
512 ELSE
513
514
515
516 IF( descv( m_ ).EQ.incv ) THEN
517
518
519
520 ipw = mpv+1
521 CALL pbztrnv( ictxt,
'Rowwise',
'Transpose', m,
522 $ descv( nb_ ), iroffc2, v( ioffv ), ldv,
523 $ zero,
524 $ work, 1, ivrow, ivcol, icrow2, -1,
525 $ work( ipw ) )
526
527
528
529 IF( myrow.EQ.ivrow ) THEN
530
531 CALL zgebs2d( ictxt, 'Columnwise', ' ', 1, 1,
532 $ tau( iiv ), 1 )
533 tauloc( 1 ) = tau( iiv )
534
535 ELSE
536
537 CALL zgebr2d( ictxt, 'Columnwise', ' ', 1, 1, tauloc,
538 $ 1, ivrow, mycol )
539
540 END IF
541
542 IF( tauloc( 1 ).NE.zero ) THEN
543
544
545
546 IF( mpv.GT.0 ) THEN
547 CALL zgemv( 'Conjugate transpose', mpv, nqc2, one,
548 $ c( ioffc2 ), ldc, work, 1, zero,
549 $ work( ipw ), 1 )
550 ELSE
551 CALL zlaset( 'All', nqc2, 1, zero, zero,
552 $ work( ipw ),
max( 1, nqc2 ) )
553 END IF
554 IF( myrow.EQ.icrow1 )
555 $ CALL zaxpy( nqc2, one, c( ioffc1 ), ldc,
556 $ work( ipw ),
max( 1, nqc2 ) )
557
558 CALL zgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
559 $ work( ipw ),
max( 1, nqc2 ), rdest,
560 $ mycol )
561
562
563
564 IF( myrow.EQ.icrow1 )
565 $ CALL zaxpy( nqc2, -tauloc( 1 ), work( ipw ),
566 $
max( 1, nqc2 ), c( ioffc1 ), ldc )
567 CALL zgerc( mpv, nqc2, -tauloc( 1 ), work, 1,
568 $ work( ipw ), 1, c( ioffc2 ), ldc )
569 END IF
570
571 ELSE
572
573
574
575 CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rowbtop )
576 IF( mycol.EQ.ivcol ) THEN
577
578 ipw = mpv+1
579 CALL zcopy( mpv, v( ioffv ), 1, work, 1 )
580 work( ipw ) = tau( jjv )
581 CALL zgebs2d( ictxt, 'Rowwise', rowbtop, ipw, 1,
582 $ work, ipw )
583 tauloc( 1 ) = tau( jjv )
584
585 ELSE
586
587 ipw = mpv+1
588 CALL zgebr2d( ictxt, 'Rowwise', rowbtop, ipw, 1, work,
589 $ ipw, myrow, ivcol )
590 tauloc( 1 ) = work( ipw )
591
592 END IF
593
594 IF( tauloc( 1 ).NE.zero ) THEN
595
596
597
598 IF( mpv.GT.0 ) THEN
599 CALL zgemv( 'Conjugate transpose', mpv, nqc2, one,
600 $ c( ioffc2 ), ldc, work, 1, zero,
601 $ work( ipw ), 1 )
602 ELSE
603 CALL zlaset( 'All', nqc2, 1, zero, zero,
604 $ work( ipw ),
max( 1, nqc2 ) )
605 END IF
606 IF( myrow.EQ.icrow1 )
607 $ CALL zaxpy( nqc2, one, c( ioffc1 ), ldc,
608 $ work( ipw ),
max( 1, nqc2 ) )
609
610 CALL zgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
611 $ work( ipw ),
max( 1, nqc2 ), rdest,
612 $ mycol )
613
614
615
616 IF( myrow.EQ.icrow1 )
617 $ CALL zaxpy( nqc2, -tauloc( 1 ), work( ipw ),
618 $
max( 1, nqc2 ), c( ioffc1 ), ldc )
619 CALL zgerc( mpv, nqc2, -tauloc( 1 ), work, 1,
620 $ work( ipw ), 1, c( ioffc2 ), ldc )
621 END IF
622
623 END IF
624
625 END IF
626
627 ELSE
628
629 IF( ccblck ) THEN
630 rdest = myrow
631 ELSE
632 rdest = -1
633 END IF
634
635 IF( crblck ) THEN
636
637
638
639 IF( descv( m_ ).EQ.incv ) THEN
640
641
642
643 IF( ivrow.EQ.icrow2 ) THEN
644
645
646
647 IF( myrow.EQ.icrow2 ) THEN
648
649 tauloc( 1 ) = tau( iiv )
650
651 IF( tauloc( 1 ).NE.zero ) THEN
652
653
654
655 IF( nqv.GT.0 ) THEN
656 CALL zgemv( 'No transpose', mpc2, nqv, one,
657 $ c( ioffc2 ), ldc, v( ioffv ),
658 $ ldv, zero, work, 1 )
659 ELSE
660 CALL zlaset( 'All', mpc2, 1, zero, zero,
661 $ work,
max( 1, mpc2 ) )
662 END IF
663 IF( mycol.EQ.iccol1 )
664 $ CALL zaxpy( mpc2, one, c( ioffc1 ), 1,
665 $ work, 1 )
666
667 CALL zgsum2d( ictxt, 'Rowwise', ' ', mpc2, 1,
668 $ work,
max( 1, mpc2 ), rdest,
669 $ iccol2 )
670
671 IF( mycol.EQ.iccol1 )
672 $ CALL zaxpy( mpc2, -tauloc( 1 ), work, 1,
673 $ c( ioffc1 ), 1 )
674
675
676
677 IF( mpc2.GT.0 .AND. nqv.GT.0 )
678 $ CALL zgerc( mpc2, nqv, -tauloc( 1 ), work, 1,
679 $ v( ioffv ), ldv, c( ioffc2 ),
680 $ 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 ) = 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 ) = tau( jjv )
756
757 ELSE
758
759 CALL zgebr2d( ictxt, 'Rowwise', ' ', 1, 1, tauloc,
760 $ 1, myrow, ivcol )
761
762 END IF
763
764 IF( tauloc( 1 ).NE.zero ) THEN
765
766
767
768 IF( nqv.GT.0 ) THEN
769 CALL zgemv( 'No transpose', mpc2, nqv, one,
770 $ c( ioffc2 ), ldc, work, 1, zero,
771 $ work( ipw ), 1 )
772 ELSE
773 CALL zlaset( 'All', mpc2, 1, zero, zero,
774 $ work( ipw ),
max( 1, mpc2 ) )
775 END IF
776 IF( mycol.EQ.iccol1 )
777 $ CALL zaxpy( mpc2, one, c( ioffc1 ), 1,
778 $ work( ipw ), 1 )
779 CALL zgsum2d( ictxt, 'Rowwise', ' ', mpc2, 1,
780 $ work( ipw ),
max( 1, mpc2 ), rdest,
781 $ iccol2 )
782 IF( mycol.EQ.iccol1 )
783 $ CALL zaxpy( mpc2, -tauloc( 1 ), work( ipw ), 1,
784 $ c( ioffc1 ), 1 )
785
786
787
788 CALL zgerc( mpc2, nqv, -tauloc( 1 ), work( ipw ),
789 $ 1, work, 1, c( ioffc2 ), ldc )
790 END IF
791
792 END IF
793
794 END IF
795
796 ELSE
797
798
799
800 IF( descv( m_ ).EQ.incv ) THEN
801
802
803
804 CALL pb_topget( ictxt, 'Broadcast', 'Columnwise',
805 $ colbtop )
806 IF( myrow.EQ.ivrow ) THEN
807
808 ipw = nqv+1
809 CALL zcopy( nqv, v( ioffv ), ldv, work, 1 )
810 work( ipw ) = tau( iiv )
811 CALL zgebs2d( ictxt, 'Columnwise', colbtop, ipw, 1,
812 $ work, ipw )
813 tauloc( 1 ) = tau( iiv )
814
815 ELSE
816
817 ipw = nqv+1
818 CALL zgebr2d( ictxt, 'Columnwise', colbtop, ipw, 1,
819 $ work, ipw, ivrow, mycol )
820 tauloc( 1 ) = work( ipw )
821
822 END IF
823
824 IF( tauloc( 1 ).NE.zero ) THEN
825
826
827
828 IF( nqv.GT.0 ) THEN
829 CALL zgemv( 'No Transpose', mpc2, nqv, one,
830 $ c( ioffc2 ), ldc, work, 1, zero,
831 $ work( ipw ), 1 )
832 ELSE
833 CALL zlaset( 'All', mpc2, 1, zero, zero,
834 $ work( ipw ),
max( 1, mpc2 ) )
835 END IF
836 IF( mycol.EQ.iccol1 )
837 $ CALL zaxpy( mpc2, one, c( ioffc1 ), 1,
838 $ work( ipw ), 1 )
839
840 CALL zgsum2d( ictxt, 'Rowwise', ' ', mpc2, 1,
841 $ work( ipw ),
max( 1, mpc2 ), rdest,
842 $ iccol2 )
843 IF( mycol.EQ.iccol1 )
844 $ CALL zaxpy( mpc2, -tauloc( 1 ), work( ipw ), 1,
845 $ c( ioffc1 ), 1 )
846
847
848
849 CALL zgerc( mpc2, nqv, -tauloc( 1 ), work( ipw ), 1,
850 $ work, 1, c( ioffc2 ), ldc )
851 END IF
852
853 ELSE
854
855
856
857 ipw = nqv+1
858 CALL pbztrnv( ictxt,
'Columnwise',
'Transpose', n,
859 $ descv( mb_ ), icoffc2, v( ioffv ), 1, zero,
860 $ work, 1, ivrow, ivcol, -1, iccol2,
861 $ work( ipw ) )
862
863
864
865 IF( mycol.EQ.ivcol ) THEN
866
867 CALL zgebs2d( ictxt, 'Rowwise', ' ', 1, 1, tau( jjv ),
868 $ 1 )
869 tauloc( 1 ) = tau( jjv )
870
871 ELSE
872
873 CALL zgebr2d( ictxt, 'Rowwise', ' ', 1, 1, tauloc, 1,
874 $ myrow, ivcol )
875
876 END IF
877
878 IF( tauloc( 1 ).NE.zero ) THEN
879
880
881
882 IF( nqv.GT.0 ) THEN
883 CALL zgemv( 'No transpose', mpc2, nqv, one,
884 $ c( ioffc2 ), ldc, work, 1, zero,
885 $ work( ipw ), 1 )
886 ELSE
887 CALL zlaset( 'All', mpc2, 1, zero, zero,
888 $ work( ipw ),
max( 1, mpc2 ) )
889 END IF
890 IF( mycol.EQ.iccol1 )
891 $ CALL zaxpy( mpc2, one, c( ioffc1 ), 1,
892 $ work( ipw ), 1 )
893 CALL zgsum2d( ictxt, 'Rowwise', ' ', mpc2, 1,
894 $ work( ipw ),
max( 1, mpc2 ), rdest,
895 $ iccol2 )
896 IF( mycol.EQ.iccol1 )
897 $ CALL zaxpy( mpc2, -tauloc( 1 ), work( ipw ), 1,
898 $ c( ioffc1 ), 1 )
899
900
901
902 CALL zgerc( mpc2, nqv, -tauloc( 1 ), work( ipw ), 1,
903 $ work, 1, c( ioffc2 ), ldc )
904 END IF
905
906 END IF
907
908 END IF
909
910 END IF
911
912 RETURN
913
914
915
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)