3
4
5
6
7
8
9 CHARACTER SIDE, TRANS, DIRECT, STOREV
10 INTEGER IC, IV, JC, JV, K, M, N
11
12
13 INTEGER DESCC( * ), DESCV( * )
14 COMPLEX C( * ), T( * ), V( * ), WORK( * )
15
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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
217 $ LLD_, MB_, M_, NB_, N_, RSRC_
218 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
219 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
220 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
221 COMPLEX ONE, ZERO
222 parameter( one = ( 1.0e+0, 0.0e+0 ),
223 $ zero = ( 0.0e+0, 0.0e+0 ) )
224
225
226 LOGICAL FORWARD
227 CHARACTER COLBTOP, ROWBTOP, TRANST, UPLO
228 INTEGER HEIGHT, IBASE, ICCOL, ICOFFC, ICOFFV, ICROW,
229 $ ICTXT, II, IIBEG, IIC, IIEND, IINXT, IIV,
230 $ ILASTCOL, ILASTROW, ILEFT, IOFF, IOFFC, IOFFV,
231 $ IPT, IPV, IPW, IPW1, IRIGHT, IROFFC, IROFFV,
232 $ ITOP, IVCOL, IVROW, JJ, JJBEG, JJC, JJEND,
233 $ JJNXT, JJV, KP, KQ, LDC, LDV, LV, LW, MBV, MPC,
234 $ MPC0, MQV, MQV0, MYCOL, MYDIST, MYROW, NBV,
235 $ NPV, NPV0, NPCOL, NPROW, NQC, NQC0, WIDE
236
237
238 EXTERNAL blacs_gridinfo, cgebr2d, cgebs2d,cgemm,
239 $ cgsum2d, clamov, claset, ctrbr2d,
242
243
245
246
247 LOGICAL LSAME
248 INTEGER ICEIL, NUMROC
250
251
252
253
254
255 IF( m.LE.0 .OR. n.LE.0 .OR. k.LE.0 )
256 $ RETURN
257
258
259
260 ictxt = descc( ctxt_ )
261 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
262
263 IF(
lsame( trans,
'N' ) )
THEN
264 transt = 'C'
265 ELSE
266 transt = 'N'
267 END IF
268 forward =
lsame( direct,
'F' )
269 IF( forward ) THEN
270 uplo = 'U'
271 ELSE
272 uplo = 'L'
273 END IF
274
275 CALL infog2l( iv, jv, descv, nprow, npcol, myrow, mycol, iiv, jjv,
276 $ ivrow, ivcol )
277 CALL infog2l( ic, jc, descc, nprow, npcol, myrow, mycol, iic, jjc,
278 $ icrow, iccol )
279 ldc = descc( lld_ )
280 ldv = descv( lld_ )
281 iic =
min( iic, ldc )
282 iiv =
min( iiv, ldv )
283 iroffc = mod( ic-1, descc( mb_ ) )
284 icoffc = mod( jc-1, descc( nb_ ) )
285 mbv = descv( mb_ )
286 nbv = descv( nb_ )
287 iroffv = mod( iv-1, mbv )
288 icoffv = mod( jv-1, nbv )
289 mpc =
numroc( m+iroffc, descc( mb_ ), myrow, icrow, nprow )
290 nqc =
numroc( n+icoffc, descc( nb_ ), mycol, iccol, npcol )
291 IF( mycol.EQ.iccol )
292 $ nqc = nqc - icoffc
293 IF( myrow.EQ.icrow )
294 $ mpc = mpc - iroffc
295 jjc =
min( jjc,
max( 1, jjc+nqc-1 ) )
296 jjv =
min( jjv,
max( 1,
numroc( descv( n_ ), nbv, mycol,
297 $ descv( csrc_ ), npcol ) ) )
298 ioffc = iic + ( jjc-1 ) * ldc
299 ioffv = iiv + ( jjv-1 ) * ldv
300
301 IF(
lsame( storev,
'C' ) )
THEN
302
303
304
305 IF(
lsame( side,
'L' ) )
THEN
306
307
308
309
310
311
312
313 ipv = 1
314 ipw = ipv + mpc * k
317
318
319
320 CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rowbtop )
321 IF( mycol.EQ.ivcol ) THEN
322 CALL cgebs2d( ictxt, 'Rowwise', rowbtop, mpc, k,
323 $ v( ioffv ), ldv )
324 IF( myrow.EQ.ivrow )
325 $ CALL ctrbs2d( ictxt, 'Rowwise', rowbtop, uplo,
326 $ 'Non unit', k, k, t, nbv )
327 CALL clamov( 'All', mpc, k, v( ioffv ), ldv, work( ipv ),
328 $ lv )
329 ELSE
330 CALL cgebr2d( ictxt, 'Rowwise', rowbtop, mpc, k,
331 $ work( ipv ), lv, myrow, ivcol )
332 IF( myrow.EQ.ivrow )
333 $ CALL ctrbr2d( ictxt, 'Rowwise', rowbtop, uplo,
334 $ 'Non unit', k, k, t, nbv, myrow, ivcol )
335 END IF
336
337 IF( forward ) THEN
338
339
340
341
342 mydist = mod( myrow-ivrow+nprow, nprow )
343 itop =
max( 0, mydist*mbv - iroffv )
344 iibeg = iiv
345 iiend = iibeg + mpc - 1
346 iinxt =
min(
iceil( iibeg, mbv )*mbv, iiend )
347
348 10 CONTINUE
349 IF( k-itop .GT.0 ) THEN
350 CALL claset( 'Upper', iinxt-iibeg+1, k-itop, zero,
351 $ one, work( ipv+iibeg-iiv+itop*lv ), lv )
352 mydist = mydist + nprow
353 itop = mydist * mbv - iroffv
354 iibeg = iinxt + 1
355 iinxt =
min( iinxt+mbv, iiend )
356 GO TO 10
357 END IF
358
359 ELSE
360
361
362
363
364 jj = jjv
365 ioff = mod( iv+m-k-1, mbv )
366 CALL infog1l( iv+m-k, mbv, nprow, myrow, descv( rsrc_ ),
367 $ ii, ilastrow )
368 kp =
numroc( k+ioff, mbv, myrow, ilastrow, nprow )
369 IF( myrow.EQ.ilastrow )
370 $ kp = kp - ioff
371 mydist = mod( myrow-ilastrow+nprow, nprow )
372 itop = mydist * mbv - ioff
373 ibase =
min( itop+mbv, k )
374 itop =
min(
max( 0, itop ), k )
375
376 20 CONTINUE
377 IF( jj.LE.( jjv+k-1 ) ) THEN
378 height = ibase - itop
379 CALL claset( 'All', kp, itop-jj+jjv, zero, zero,
380 $ work( ipv+ii-iiv+(jj-jjv)*lv ), lv )
381 CALL claset( 'Lower', kp, height, zero, one,
382 $ work( ipv+ii-iiv+itop*lv ), lv )
383 kp =
max( 0, kp - height )
384 ii = ii + height
385 jj = jjv + ibase
386 mydist = mydist + nprow
387 itop = mydist * mbv - ioff
388 ibase =
min( itop + mbv, k )
389 itop =
min( itop, k )
390 GO TO 20
391 END IF
392
393 END IF
394
395
396
397 IF( mpc.GT.0 ) THEN
398 CALL cgemm( 'Conjugate transpose', 'No transpose', nqc,
399 $ k, mpc, one, c( ioffc ), ldc, work( ipv ), lv,
400 $ zero, work( ipw ), lw )
401 ELSE
402 CALL claset( 'All', nqc, k, zero, zero, work( ipw ), lw )
403 END IF
404
405 CALL cgsum2d( ictxt, 'Columnwise', ' ', nqc, k, work( ipw ),
406 $ lw, ivrow, mycol )
407
408 IF( myrow.EQ.ivrow ) THEN
409
410
411
412 CALL ctrmm( 'Right', uplo, transt, 'Non unit', nqc, k,
413 $ one, t, nbv, work( ipw ), lw )
414 CALL cgebs2d( ictxt, 'Columnwise', ' ', nqc, k,
415 $ work( ipw ), lw )
416 ELSE
417 CALL cgebr2d( ictxt, 'Columnwise', ' ', nqc, k,
418 $ work( ipw ), lw, ivrow, mycol )
419 END IF
420
421
422
423
424
425 CALL cgemm( 'No transpose', 'Conjugate transpose', mpc, nqc,
426 $ k, -one, work( ipv ), lv, work( ipw ), lw, one,
427 $ c( ioffc ), ldc )
428
429 ELSE
430
431
432
433
434
435
436 npv0 =
numroc( n+iroffv, mbv, myrow, ivrow, nprow )
437 IF( myrow.EQ.ivrow ) THEN
438 npv = npv0 - iroffv
439 ELSE
440 npv = npv0
441 END IF
442 IF( mycol.EQ.iccol ) THEN
443 nqc0 = nqc + icoffc
444 ELSE
445 nqc0 = nqc
446 END IF
447
448
449
450
451
452
453 ipv = 1
454 ipw = ipv + k * nqc0
455 ipt = ipw + npv0 * k
458
459 IF( mycol.EQ.ivcol ) THEN
460 IF( myrow.EQ.ivrow ) THEN
461 CALL claset( 'All', iroffv, k, zero, zero,
462 $ work( ipw ), lw )
463 ipw1 = ipw + iroffv
464 CALL clamov( 'All', npv, k, v( ioffv ), ldv,
465 $ work( ipw1 ), lw )
466 ELSE
467 ipw1 = ipw
468 CALL clamov( 'All', npv, k, v( ioffv ), ldv,
469 $ work( ipw1 ), lw )
470 END IF
471
472 IF( forward ) THEN
473
474
475
476
477 mydist = mod( myrow-ivrow+nprow, nprow )
478 itop =
max( 0, mydist*mbv - iroffv )
479 iibeg = iiv
480 iiend = iibeg + npv - 1
481 iinxt =
min(
iceil( iibeg, mbv )*mbv, iiend )
482
483 30 CONTINUE
484 IF( ( k-itop ).GT.0 ) THEN
485 CALL claset( 'Upper', iinxt-iibeg+1, k-itop, zero,
486 $ one, work( ipw1+iibeg-iiv+itop*lw ),
487 $ lw )
488 mydist = mydist + nprow
489 itop = mydist * mbv - iroffv
490 iibeg = iinxt + 1
491 iinxt =
min( iinxt+mbv, iiend )
492 GO TO 30
493 END IF
494
495 ELSE
496
497
498
499
500 jj = jjv
501 CALL infog1l( iv+n-k, mbv, nprow, myrow,
502 $ descv( rsrc_ ), ii, ilastrow )
503 ioff = mod( iv+n-k-1, mbv )
504 kp =
numroc( k+ioff, mbv, myrow, ilastrow, nprow )
505 IF( myrow.EQ.ilastrow )
506 $ kp = kp - ioff
507 mydist = mod( myrow-ilastrow+nprow, nprow )
508 itop = mydist * mbv - ioff
509 ibase =
min( itop+mbv, k )
510 itop =
min(
max( 0, itop ), k )
511
512 40 CONTINUE
513 IF( jj.LE.( jjv+k-1 ) ) THEN
514 height = ibase - itop
515 CALL claset( 'All', kp, itop-jj+jjv, zero, zero,
516 $ work( ipw1+ii-iiv+(jj-jjv)*lw ), lw )
517 CALL claset( 'Lower', kp, height, zero, one,
518 $ work( ipw1+ii-iiv+itop*lw ), lw )
519 kp =
max( 0, kp - height )
520 ii = ii + height
521 jj = jjv + ibase
522 mydist = mydist + nprow
523 itop = mydist * mbv - ioff
524 ibase =
min( itop + mbv, k )
525 itop =
min( itop, k )
526 GO TO 40
527 END IF
528 END IF
529 END IF
530
531 CALL pbctran( ictxt,
'Columnwise',
'Conjugate transpose',
532 $ n+iroffv, k, mbv, work( ipw ), lw, zero,
533 $ work( ipv ), lv, ivrow, ivcol, -1, iccol,
534 $ work( ipt ) )
535
536
537
538 IF( mycol.EQ.iccol )
539 $ ipv = ipv + icoffc * lv
540
541
542
543
545
546 IF( nqc.GT.0 ) THEN
547 CALL cgemm( 'No transpose', 'Conjugate transpose', mpc,
548 $ k, nqc, one, c( ioffc ), ldc, work( ipv ),
549 $ lv, zero, work( ipw ), lw )
550 ELSE
551 CALL claset( 'All', mpc, k, zero, zero, work( ipw ), lw )
552 END IF
553
554 CALL cgsum2d( ictxt, 'Rowwise', ' ', mpc, k, work( ipw ),
555 $ lw, myrow, ivcol )
556
557
558
559 IF( mycol.EQ.ivcol ) THEN
560 IF( myrow.EQ.ivrow ) THEN
561
562
563
564 CALL ctrbs2d( ictxt, 'Columnwise', ' ', uplo,
565 $ 'Non unit', k, k, t, nbv )
566 ELSE
567 CALL ctrbr2d( ictxt, 'Columnwise', ' ', uplo,
568 $ 'Non unit', k, k, t, nbv, ivrow, mycol )
569 END IF
570 CALL ctrmm( 'Right', uplo, trans, 'Non unit', mpc, k,
571 $ one, t, nbv, work( ipw ), lw )
572
573 CALL cgebs2d( ictxt, 'Rowwise', ' ', mpc, k, work( ipw ),
574 $ lw )
575 ELSE
576 CALL cgebr2d( ictxt, 'Rowwise', ' ', mpc, k, work( ipw ),
577 $ lw, myrow, ivcol )
578 END IF
579
580
581
582
583
584 CALL cgemm( 'No transpose', 'No transpose', mpc, nqc, k,
585 $ -one, work( ipw ), lw, work( ipv ), lv, one,
586 $ c( ioffc ), ldc )
587 END IF
588
589 ELSE
590
591
592
593 IF(
lsame( side,
'L' ) )
THEN
594
595
596
597
598
599
600 mqv0 =
numroc( m+icoffv, nbv, mycol, ivcol, npcol )
601 IF( mycol.EQ.ivcol ) THEN
602 mqv = mqv0 - icoffv
603 ELSE
604 mqv = mqv0
605 END IF
606 IF( myrow.EQ.icrow ) THEN
607 mpc0 = mpc + iroffc
608 ELSE
609 mpc0 = mpc
610 END IF
611
612
613
614
615
616
617 ipv = 1
618 ipw = ipv + mpc0 * k
619 ipt = ipw + k * mqv0
622
623 IF( myrow.EQ.ivrow ) THEN
624 IF( mycol.EQ.ivcol ) THEN
625 CALL claset( 'All', k, icoffv, zero, zero,
626 $ work( ipw ), lw )
627 ipw1 = ipw + icoffv * lw
628 CALL clamov( 'All', k, mqv, v( ioffv ), ldv,
629 $ work( ipw1 ), lw )
630 ELSE
631 ipw1 = ipw
632 CALL clamov( 'All', k, mqv, v( ioffv ), ldv,
633 $ work( ipw1 ), lw )
634 END IF
635
636 IF( forward ) THEN
637
638
639
640
641 mydist = mod( mycol-ivcol+npcol, npcol )
642 ileft =
max( 0, mydist * nbv - icoffv )
643 jjbeg = jjv
644 jjend = jjv + mqv - 1
645 jjnxt =
min(
iceil( jjbeg, nbv ) * nbv, jjend )
646
647 50 CONTINUE
648 IF( ( k-ileft ).GT.0 ) THEN
649 CALL claset( 'Lower', k-ileft, jjnxt-jjbeg+1, zero,
650 $ one,
651 $ work( ipw1+ileft+(jjbeg-jjv)*lw ),
652 $ lw )
653 mydist = mydist + npcol
654 ileft = mydist * nbv - icoffv
655 jjbeg = jjnxt + 1
656 jjnxt =
min( jjnxt+nbv, jjend )
657 GO TO 50
658 END IF
659
660 ELSE
661
662
663
664
665 ii = iiv
666 CALL infog1l( jv+m-k, nbv, npcol, mycol,
667 $ descv( csrc_ ), jj, ilastcol )
668 ioff = mod( jv+m-k-1, nbv )
669 kq =
numroc( k+ioff, nbv, mycol, ilastcol, npcol )
670 IF( mycol.EQ.ilastcol )
671 $ kq = kq - ioff
672 mydist = mod( mycol-ilastcol+npcol, npcol )
673 ileft = mydist * nbv - ioff
674 iright =
min( ileft+nbv, k )
675 ileft =
min(
max( 0, ileft ), k )
676
677 60 CONTINUE
678 IF( ii.LE.( iiv+k-1 ) ) THEN
679 wide = iright - ileft
680 CALL claset( 'All', ileft-ii+iiv, kq, zero, zero,
681 $ work( ipw1+ii-iiv+(jj-jjv)*lw ), lw )
682 CALL claset( 'Upper', wide, kq, zero, one,
683 $ work( ipw1+ileft+(jj-jjv)*lw ), lw )
684 kq =
max( 0, kq - wide )
685 ii = iiv + iright
686 jj = jj + wide
687 mydist = mydist + npcol
688 ileft = mydist * nbv - ioff
689 iright =
min( ileft + nbv, k )
690 ileft =
min( ileft, k )
691 GO TO 60
692 END IF
693 END IF
694 END IF
695
696
697
698 CALL pbctran( ictxt,
'Rowwise',
'Conjugate transpose', k,
699 $ m+icoffv, nbv, work( ipw ), lw, zero,
700 $ work( ipv ), lv, ivrow, ivcol, icrow, -1,
701 $ work( ipt ) )
702
703
704
705 IF( myrow.EQ.icrow )
706 $ ipv = ipv + iroffc
707
708
709
710
712
713 IF( mpc.GT.0 ) THEN
714 CALL cgemm( 'Conjugate transpose', 'No transpose', nqc,
715 $ k, mpc, one, c( ioffc ), ldc, work( ipv ),
716 $ lv, zero, work( ipw ), lw )
717 ELSE
718 CALL claset( 'All', nqc, k, zero, zero, work( ipw ), lw )
719 END IF
720
721 CALL cgsum2d( ictxt, 'Columnwise', ' ', nqc, k, work( ipw ),
722 $ lw, ivrow, mycol )
723
724
725
726 IF( myrow.EQ.ivrow ) THEN
727 IF( mycol.EQ.ivcol ) THEN
728
729
730
731 CALL ctrbs2d( ictxt, 'Rowwise', ' ', uplo, 'Non unit',
732 $ k, k, t, mbv )
733 ELSE
734 CALL ctrbr2d( ictxt, 'Rowwise', ' ', uplo, 'Non unit',
735 $ k, k, t, mbv, myrow, ivcol )
736 END IF
737 CALL ctrmm( 'Right', uplo, transt, 'Non unit', nqc, k,
738 $ one, t, mbv, work( ipw ), lw )
739
740 CALL cgebs2d( ictxt, 'Columnwise', ' ', nqc, k,
741 $ work( ipw ), lw )
742 ELSE
743 CALL cgebr2d( ictxt, 'Columnwise', ' ', nqc, k,
744 $ work( ipw ), lw, ivrow, mycol )
745 END IF
746
747
748
749
750
751 CALL cgemm( 'No transpose', 'Conjugate transpose', mpc, nqc,
752 $ k, -one, work( ipv ), lv, work( ipw ), lw, one,
753 $ c( ioffc ), ldc )
754
755 ELSE
756
757
758
759
760
761
762
763 ipv = 1
764 ipw = ipv + k * nqc
767
768
769
770 CALL pb_topget( ictxt, 'Broadcast', 'Columnwise', colbtop )
771 IF( myrow.EQ.ivrow ) THEN
772 CALL cgebs2d( ictxt, 'Columnwise', colbtop, k, nqc,
773 $ v( ioffv ), ldv )
774 IF( mycol.EQ.ivcol )
775 $ CALL ctrbs2d( ictxt, 'Columnwise', colbtop, uplo,
776 $ 'Non unit', k, k, t, mbv )
777 CALL clamov( 'All', k, nqc, v( ioffv ), ldv, work( ipv ),
778 $ lv )
779 ELSE
780 CALL cgebr2d( ictxt, 'Columnwise', colbtop, k, nqc,
781 $ work( ipv ), lv, ivrow, mycol )
782 IF( mycol.EQ.ivcol )
783 $ CALL ctrbr2d( ictxt, 'Columnwise', colbtop, uplo,
784 $ 'Non unit', k, k, t, mbv, ivrow, mycol )
785 END IF
786
787 IF( forward ) THEN
788
789
790
791
792 mydist = mod( mycol-ivcol+npcol, npcol )
793 ileft =
max( 0, mydist * nbv - icoffv )
794 jjbeg = jjv
795 jjend = jjv + nqc - 1
796 jjnxt =
min(
iceil( jjbeg, nbv ) * nbv, jjend )
797
798 70 CONTINUE
799 IF( ( k-ileft ).GT.0 ) THEN
800 CALL claset( 'Lower', k-ileft, jjnxt-jjbeg+1, zero,
801 $ one, work( ipv+ileft+(jjbeg-jjv)*lv ),
802 $ lv )
803 mydist = mydist + npcol
804 ileft = mydist * nbv - icoffv
805 jjbeg = jjnxt + 1
806 jjnxt =
min( jjnxt+nbv, jjend )
807 GO TO 70
808 END IF
809
810 ELSE
811
812
813
814
815 ii = iiv
816 CALL infog1l( jv+n-k, nbv, npcol, mycol, descv( csrc_ ),
817 $ jj, ilastcol )
818 ioff = mod( jv+n-k-1, nbv )
819 kq =
numroc( k+ioff, nbv, mycol, ilastcol, npcol )
820 IF( mycol.EQ.ilastcol )
821 $ kq = kq - ioff
822 mydist = mod( mycol-ilastcol+npcol, npcol )
823 ileft = mydist * nbv - ioff
824 iright =
min( ileft+nbv, k )
825 ileft =
min(
max( 0, ileft ), k )
826
827 80 CONTINUE
828 IF( ii.LE.( iiv+k-1 ) ) THEN
829 wide = iright - ileft
830 CALL claset( 'All', ileft-ii+iiv, kq, zero, zero,
831 $ work( ipv+ii-iiv+(jj-jjv)*lv ), lv )
832 CALL claset( 'Upper', wide, kq, zero, one,
833 $ work( ipv+ileft+(jj-jjv)*lv ), lv )
834 kq =
max( 0, kq - wide )
835 ii = iiv + iright
836 jj = jj + wide
837 mydist = mydist + npcol
838 ileft = mydist * nbv - ioff
839 iright =
min( ileft + nbv, k )
840 ileft =
min( ileft, k )
841 GO TO 80
842 END IF
843
844 END IF
845
846
847
848
849 IF( nqc.GT.0 ) THEN
850 CALL cgemm( 'No transpose', 'Conjugate transpose', mpc,
851 $ k, nqc, one, c( ioffc ), ldc, work( ipv ),
852 $ lv, zero, work( ipw ), lw )
853 ELSE
854 CALL claset( 'All', mpc, k, zero, zero, work( ipw ), lw )
855 END IF
856
857 CALL cgsum2d( ictxt, 'Rowwise', ' ', mpc, k, work( ipw ),
858 $ lw, myrow, ivcol )
859
860
861
862 IF( mycol.EQ.ivcol ) THEN
863 CALL ctrmm( 'Right', uplo, trans, 'Non unit', mpc, k,
864 $ one, t, mbv, work( ipw ), lw )
865 CALL cgebs2d( ictxt, 'Rowwise', ' ', mpc, k, work( ipw ),
866 $ lw )
867 ELSE
868 CALL cgebr2d( ictxt, 'Rowwise', ' ', mpc, k, work( ipw ),
869 $ lw, myrow, ivcol )
870 END IF
871
872
873
874
875
876 CALL cgemm( 'No transpose', 'No transpose', mpc, nqc, k,
877 $ -one, work( ipw ), lw, work( ipv ), lv, one,
878 $ c( ioffc ), ldc )
879
880 END IF
881
882 END IF
883
884 RETURN
885
886
887
integer function iceil(inum, idenom)
subroutine infog1l(gindx, nb, nprocs, myroc, isrcproc, lindx, rocsrc)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pbctran(icontxt, adist, trans, m, n, nb, a, lda, beta, c, ldc, iarow, iacol, icrow, iccol, work)