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