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