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 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 ONE, ZERO
242 parameter( one = ( 1.0e+0, 0.0e+0 ),
243 $ zero = ( 0.0e+0, 0.0e+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 TAULOC( 1 )
255
256
257 EXTERNAL blacs_gridinfo, caxpy, ccopy, cgebr2d,
258 $ cgebs2d, cgemv, cgerc, cgerv2d,
259 $ cgesd2d, cgsum2d, claset,
infog2l,
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 pbctrnv( 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 cgebs2d( ictxt, 'Columnwise', ' ', 1, 1,
372 $ tau( iiv ), 1 )
373 tauloc( 1 ) = conjg( tau( iiv ) )
374
375 ELSE
376
377 CALL cgebr2d( ictxt, 'Columnwise', ' ', 1, 1,
378 $ tauloc, 1, ivrow, mycol )
379 tauloc( 1 ) = conjg( 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 cgemv( 'Conjugate transpose', mpv, nqc2,
389 $ one, c( ioffc2 ), ldc, work, 1,
390 $ zero, work( ipw ), 1 )
391 ELSE
392 CALL claset( 'All', nqc2, 1, zero, zero,
393 $ work( ipw ),
max( 1, nqc2 ) )
394 END IF
395 IF( myrow.EQ.icrow1 )
396 $ CALL caxpy( nqc2, one, c( ioffc1 ), ldc,
397 $ work( ipw ),
max( 1, nqc2 ) )
398
399 CALL cgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
400 $ work( ipw ),
max( 1, nqc2 ), rdest,
401 $ mycol )
402
403
404
405 IF( myrow.EQ.icrow1 )
406 $ CALL caxpy( nqc2, -tauloc( 1 ), work( ipw ),
407 $
max( 1, nqc2 ), c( ioffc1 ), ldc )
408 CALL cgerc( 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 ) = conjg( tau( jjv ) )
425
426 IF( tauloc( 1 ).NE.zero ) THEN
427
428
429
430 IF( mpv.GT.0 ) THEN
431 CALL cgemv( 'Conjugate transpose', mpv, nqc2,
432 $ one, c( ioffc2 ), ldc, v( ioffv ),
433 $ 1, zero, work, 1 )
434 ELSE
435 CALL claset( 'All', nqc2, 1, zero, zero,
436 $ work,
max( 1, nqc2 ) )
437 END IF
438 IF( myrow.EQ.icrow1 )
439 $ CALL caxpy( nqc2, one, c( ioffc1 ), ldc,
440 $ work,
max( 1, nqc2 ) )
441
442 CALL cgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
443 $ work,
max( 1, nqc2 ), rdest,
444 $ mycol )
445
446
447
448 IF( myrow.EQ.icrow1 )
449 $ CALL caxpy( nqc2, -tauloc( 1 ), work,
450 $
max( 1, nqc2 ), c( ioffc1 ),
451 $ ldc )
452 CALL cgerc( 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 ccopy( mpv, v( ioffv ), 1, work, 1 )
466 work( ipw ) = tau( jjv )
467 CALL cgesd2d( ictxt, ipw, 1, work, ipw, myrow,
468 $ iccol2 )
469
470 ELSE IF( mycol.EQ.iccol2 ) THEN
471
472 ipw = mpv+1
473 CALL cgerv2d( ictxt, ipw, 1, work, ipw, myrow,
474 $ ivcol )
475 tauloc( 1 ) = conjg( work( ipw ) )
476
477 IF( tauloc( 1 ).NE.zero ) THEN
478
479
480
481 IF( mpv.GT.0 ) THEN
482 CALL cgemv( 'Conjugate transpose', mpv, nqc2,
483 $ one, c( ioffc2 ), ldc, work, 1,
484 $ zero, work( ipw ), 1 )
485 ELSE
486 CALL claset( 'All', nqc2, 1, zero, zero,
487 $ work( ipw ),
max( 1, nqc2 ) )
488 END IF
489 IF( myrow.EQ.icrow1 )
490 $ CALL caxpy( nqc2, one, c( ioffc1 ), ldc,
491 $ work( ipw ),
max( 1, nqc2 ) )
492
493 CALL cgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
494 $ work( ipw ),
max( 1, nqc2 ),
495 $ rdest, mycol )
496
497
498
499 IF( myrow.EQ.icrow1 )
500 $ CALL caxpy( nqc2, -tauloc( 1 ), work( ipw ),
501 $
max( 1, nqc2 ), c( ioffc1 ),
502 $ ldc )
503 CALL cgerc( 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 pbctrnv( 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 cgebs2d( ictxt, 'Columnwise', ' ', 1, 1,
533 $ tau( iiv ), 1 )
534 tauloc( 1 ) = conjg( tau( iiv ) )
535
536 ELSE
537
538 CALL cgebr2d( ictxt, 'Columnwise', ' ', 1, 1, tauloc,
539 $ 1, ivrow, mycol )
540 tauloc( 1 ) = conjg( 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 cgemv( 'Conjugate transpose', mpv, nqc2, one,
550 $ c( ioffc2 ), ldc, work, 1, zero,
551 $ work( ipw ), 1 )
552 ELSE
553 CALL claset( 'All', nqc2, 1, zero, zero,
554 $ work( ipw ),
max( 1, nqc2 ) )
555 END IF
556 IF( myrow.EQ.icrow1 )
557 $ CALL caxpy( nqc2, one, c( ioffc1 ), ldc,
558 $ work( ipw ),
max( 1, nqc2 ) )
559
560 CALL cgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
561 $ work( ipw ),
max( 1, nqc2 ), rdest,
562 $ mycol )
563
564
565
566 IF( myrow.EQ.icrow1 )
567 $ CALL caxpy( nqc2, -tauloc( 1 ), work( ipw ),
568 $
max( 1, nqc2 ), c( ioffc1 ), ldc )
569 CALL cgerc( 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 ccopy( mpv, v( ioffv ), 1, work, 1 )
582 work( ipw ) = tau( jjv )
583 CALL cgebs2d( ictxt, 'Rowwise', rowbtop, ipw, 1,
584 $ work, ipw )
585 tauloc( 1 ) = conjg( tau( jjv ) )
586
587 ELSE
588
589 ipw = mpv+1
590 CALL cgebr2d( ictxt, 'Rowwise', rowbtop, ipw, 1, work,
591 $ ipw, myrow, ivcol )
592 tauloc( 1 ) = conjg( 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 cgemv( 'Conjugate transpose', mpv, nqc2, one,
602 $ c( ioffc2 ), ldc, work, 1, zero,
603 $ work( ipw ), 1 )
604 ELSE
605 CALL claset( 'All', nqc2, 1, zero, zero,
606 $ work( ipw ),
max( 1, nqc2 ) )
607 END IF
608 IF( myrow.EQ.icrow1 )
609 $ CALL caxpy( nqc2, one, c( ioffc1 ), ldc,
610 $ work( ipw ),
max( 1, nqc2 ) )
611
612 CALL cgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
613 $ work( ipw ),
max( 1, nqc2 ), rdest,
614 $ mycol )
615
616
617
618 IF( myrow.EQ.icrow1 )
619 $ CALL caxpy( nqc2, -tauloc( 1 ), work( ipw ),
620 $
max( 1, nqc2 ), c( ioffc1 ), ldc )
621 CALL cgerc( 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 ) = conjg( tau( iiv ) )
652
653 IF( tauloc( 1 ).NE.zero ) THEN
654
655
656
657 IF( nqv.GT.0 ) THEN
658 CALL cgemv( 'No transpose', mpc2, nqv, one,
659 $ c( ioffc2 ), ldc, v( ioffv ),
660 $ ldv, zero, work, 1 )
661 ELSE
662 CALL claset( 'All', mpc2, 1, zero, zero,
663 $ work,
max( 1, mpc2 ) )
664 END IF
665 IF( mycol.EQ.iccol1 )
666 $ CALL caxpy( mpc2, one, c( ioffc1 ), 1,
667 $ work, 1 )
668
669 CALL cgsum2d( ictxt, 'Rowwise', ' ', mpc2, 1,
670 $ work,
max( 1, mpc2 ), rdest,
671 $ iccol2 )
672
673 IF( mycol.EQ.iccol1 )
674 $ CALL caxpy( mpc2, -tauloc( 1 ), work, 1,
675 $ c( ioffc1 ), 1 )
676
677
678
679 CALL cgerc( 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 ccopy( nqv, v( ioffv ), ldv, work, 1 )
693 work( ipw ) = tau( iiv )
694 CALL cgesd2d( ictxt, ipw, 1, work, ipw, icrow2,
695 $ mycol )
696
697 ELSE IF( myrow.EQ.icrow2 ) THEN
698
699 ipw = nqv+1
700 CALL cgerv2d( ictxt, ipw, 1, work, ipw, ivrow,
701 $ mycol )
702 tauloc( 1 ) = conjg( work( ipw ) )
703
704 IF( tauloc( 1 ).NE.zero ) THEN
705
706
707
708 IF( nqv.GT.0 ) THEN
709 CALL cgemv( 'No transpose', mpc2, nqv, one,
710 $ c( ioffc2 ), ldc, work, 1, zero,
711 $ work( ipw ), 1 )
712 ELSE
713 CALL claset( 'All', mpc2, 1, zero, zero,
714 $ work( ipw ),
max( 1, mpc2 ) )
715 END IF
716 IF( mycol.EQ.iccol1 )
717 $ CALL caxpy( mpc2, one, c( ioffc1 ), 1,
718 $ work( ipw ), 1 )
719 CALL cgsum2d( ictxt, 'Rowwise', ' ', mpc2, 1,
720 $ work( ipw ),
max( 1, mpc2 ),
721 $ rdest, iccol2 )
722 IF( mycol.EQ.iccol1 )
723 $ CALL caxpy( mpc2, -tauloc( 1 ), work( ipw ),
724 $ 1, c( ioffc1 ), 1 )
725
726
727
728 CALL cgerc( 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 pbctrnv( 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 cgebs2d( ictxt, 'Rowwise', ' ', 1, 1,
754 $ tau( jjv ), 1 )
755 tauloc( 1 ) = conjg( tau( jjv ) )
756
757 ELSE
758
759 CALL cgebr2d( ictxt, 'Rowwise', ' ', 1, 1, tauloc,
760 $ 1, myrow, ivcol )
761 tauloc( 1 ) = conjg( 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 cgemv( 'No transpose', mpc2, nqv, one,
771 $ c( ioffc2 ), ldc, work, 1, zero,
772 $ work( ipw ), 1 )
773 ELSE
774 CALL claset( 'All', mpc2, 1, zero, zero,
775 $ work( ipw ),
max( 1, mpc2 ) )
776 END IF
777 IF( mycol.EQ.iccol1 )
778 $ CALL caxpy( mpc2, one, c( ioffc1 ), 1,
779 $ work( ipw ), 1 )
780 CALL cgsum2d( ictxt, 'Rowwise', ' ', mpc2, 1,
781 $ work( ipw ),
max( 1, mpc2 ), rdest,
782 $ iccol2 )
783 IF( mycol.EQ.iccol1 )
784 $ CALL caxpy( mpc2, -tauloc( 1 ), work( ipw ), 1,
785 $ c( ioffc1 ), 1 )
786
787
788
789 CALL cgerc( 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 ccopy( nqv, v( ioffv ), ldv, work, 1 )
811 work( ipw ) = tau( iiv )
812 CALL cgebs2d( ictxt, 'Columnwise', colbtop, ipw, 1,
813 $ work, ipw )
814 tauloc( 1 ) = conjg( tau( iiv ) )
815
816 ELSE
817
818 ipw = nqv+1
819 CALL cgebr2d( ictxt, 'Columnwise', colbtop, ipw, 1,
820 $ work, ipw, ivrow, mycol )
821 tauloc( 1 ) = conjg( 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 cgemv( 'No Transpose', mpc2, nqv, one,
831 $ c( ioffc2 ), ldc, work, 1, zero,
832 $ work( ipw ), 1 )
833 ELSE
834 CALL claset( 'All', mpc2, 1, zero, zero,
835 $ work( ipw ),
max( 1, mpc2 ) )
836 END IF
837 IF( mycol.EQ.iccol1 )
838 $ CALL caxpy( mpc2, one, c( ioffc1 ), 1,
839 $ work( ipw ), 1 )
840
841 CALL cgsum2d( ictxt, 'Rowwise', ' ', mpc2, 1,
842 $ work( ipw ),
max( 1, mpc2 ), rdest,
843 $ iccol2 )
844 IF( mycol.EQ.iccol1 )
845 $ CALL caxpy( mpc2, -tauloc( 1 ), work( ipw ), 1,
846 $ c( ioffc1 ), 1 )
847
848
849
850 CALL cgerc( 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 pbctrnv( 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 cgebs2d( ictxt, 'Rowwise', ' ', 1, 1, tau( jjv ),
869 $ 1 )
870 tauloc( 1 ) = conjg( tau( jjv ) )
871
872 ELSE
873
874 CALL cgebr2d( ictxt, 'Rowwise', ' ', 1, 1,
875 $ tauloc( 1 ), 1, myrow, ivcol )
876 tauloc( 1 ) = conjg( 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 cgemv( 'No transpose', mpc2, nqv, one,
886 $ c( ioffc2 ), ldc, work, 1, zero,
887 $ work( ipw ), 1 )
888 ELSE
889 CALL claset( 'All', mpc2, 1, zero, zero,
890 $ work( ipw ),
max( 1, mpc2 ) )
891 END IF
892 IF( mycol.EQ.iccol1 )
893 $ CALL caxpy( mpc2, one, c( ioffc1 ), 1,
894 $ work( ipw ), 1 )
895 CALL cgsum2d( ictxt, 'Rowwise', ' ', mpc2, 1,
896 $ work( ipw ),
max( 1, mpc2 ), rdest,
897 $ iccol2 )
898 IF( mycol.EQ.iccol1 )
899 $ CALL caxpy( mpc2, -tauloc( 1 ), work( ipw ), 1,
900 $ c( ioffc1 ), 1 )
901
902
903
904 CALL cgerc( 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 pbctrnv(icontxt, xdist, trans, n, nb, nz, x, incx, beta, y, incy, ixrow, ixcol, iyrow, iycol, work)