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
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257 char conjg, * negone, * one, * talph, top, * zero;
258 Int Afr, Bcol, Bcurcol, Bcurimb1, Bcurinb1, Bcurrow, Bfr, Bii,
259 Bimb, Bimb1, Binb, Binb1, Bjj, Bld, Bmb, Bmp, Bmp0, Bnb, Bnq,
260 Bnq0, Brow, WAfr, WAoff, WBfr, WBsum, ctxt, k, kb, kbb, kmax,
261 ktmp, lside, mn, mycol, myrow, notran, npcol, nprow, size,
262 upper;
265
266
267
270 char * Aptr = NULL, * Bptr = NULL, * Bptr0 = NULL, * WA = NULL,
271 * WB = NULL;
272
273
274
275
279 size =
TYPE->size; negone =
TYPE->negone; one =
TYPE->one;
280 zero =
TYPE->zero; gsum2d =
TYPE->Cgsum2d; gemm =
TYPE->Fgemm;
281 talph = ALPHA;
283
284
285
287
288
289
290 Bimb = DESCB[
IMB_]; Binb = DESCB[
INB_];
291 Bmb = DESCB[
MB_ ]; Bnb = DESCB[
NB_ ]; Bld = DESCB[
LLD_];
292 PB_Cinfog2l( IB, JB, DESCB, nprow, npcol, myrow, mycol, &Bii, &Bjj, &Brow,
293 &Bcol );
294
296 Bmp0 =
PB_Cnumroc( M, 0, Bimb1, Bmb, myrow, Brow, nprow );
298 Bnq0 =
PB_Cnumroc( N, 0, Binb1, Bnb, mycol, Bcol, npcol );
299 if( ( Bmp0 > 0 ) && ( Bnq0 > 0 ) ) Bptr0 =
Mptr( B, Bii, Bjj, Bld, size );
300
301 if( notran )
302 {
303 if( lside )
304 {
305 if( upper )
306 {
307 kmax = ( ( M - 1 ) / kb ) * kb;
308
309 for( k = kmax; k >= 0; k -= kb )
310 {
311 kbb = M - k; kbb =
MIN( kbb, kb ); ktmp = k + kbb;
312
313
314
316 DESCA,
COLUMN, &Aptr, DBUFA, &Afr );
317
318
319
320 PB_Cdescset( Bd0, ktmp, N, Bimb1, Binb1, Bmb, Bnb, Brow, Bcol,
321 ctxt, Bld );
322 PB_CInV(
TYPE,
NOCONJG,
COLUMN, ktmp, N, Bd0, kbb, Aptr, 0, 0,
323 DBUFA,
COLUMN, &WA, WAd, &WAfr );
324
325
326
327 PB_CptrsmAB0(
TYPE, SIDE, UPLO, DIAG, kbb, N, talph, WA, k, 0,
328 WAd, B, IB+k, JB, DESCB, &Bptr, DBUFB, &Bfr );
329
330
331
332 if( k > 0 )
333 {
334
335
336
337 PB_Cdescset( Bd0, k, N, Bimb1, Binb1, Bmb, Bnb, Brow, Bcol,
338 ctxt, Bld );
339 PB_CInV(
TYPE,
NOCONJG,
ROW, k, N, Bd0, kbb, Bptr, 0, 0,
340 DBUFB,
ROW, &WB, WBd, &WBfr );
341
342
343
344 Bmp =
PB_Cnumroc( k, 0, Bimb1, Bmb, myrow, Brow, nprow );
345 if( ( Bmp > 0 ) && ( Bnq0 > 0 ) )
347 &kbb, negone, WA, &WAd[
LLD_], WB, &WBd[
LLD_], talph,
348 Bptr0, &Bld );
349 if( WBfr ) free( WB );
350 talph = one;
351 }
352 if( WAfr ) free( WA );
353 if( Bfr ) free( Bptr );
354 if( Afr ) free( Aptr );
355 }
356 }
357 else
358 {
359 for( k = 0; k < M; k += kb )
360 {
361 ktmp = M - k; kbb =
MIN( ktmp, kb );
362
363
364
366 DESCA,
COLUMN, &Aptr, DBUFA, &Afr );
367
368
369
371 Bcurrow =
PB_Cindxg2p( k, Bimb1, Bmb, Brow, Brow, nprow );
372 PB_Cdescset( Bd0, ktmp, N, Bcurimb1, Binb1, Bmb, Bnb, Bcurrow,
373 Bcol, ctxt, Bld );
374 PB_CInV(
TYPE,
NOCONJG,
COLUMN, ktmp, N, Bd0, kbb, Aptr, 0, 0,
375 DBUFA,
COLUMN, &WA, WAd, &WAfr );
376
377
378
379 PB_CptrsmAB0(
TYPE, SIDE, UPLO, DIAG, kbb, N, talph, WA, 0, 0,
380 WAd, B, IB+k, JB, DESCB, &Bptr, DBUFB, &Bfr );
381
382
383
384 if( ( ktmp = ktmp - kbb ) > 0 )
385 {
386
387
388
389 Bcurimb1 =
PB_Cfirstnb( ktmp, IB+k+kbb, Bimb, Bmb );
390 Bcurrow =
PB_Cindxg2p( k+kbb, Bimb1, Bmb, Brow, Brow,
391 nprow );
392 PB_Cdescset( Bd0, ktmp, N, Bcurimb1, Binb1, Bmb, Bnb, Bcurrow,
393 Bcol, ctxt, Bld );
394 PB_CInV(
TYPE,
NOCONJG,
ROW, ktmp, N, Bd0, kbb, Bptr, 0, 0,
395 DBUFB,
ROW, &WB, WBd, &WBfr );
396
397
398
399 Bmp =
PB_Cnumroc( ktmp, k+kbb, Bimb1, Bmb, myrow, Brow,
400 nprow );
401 if( ( Bmp > 0 ) && ( Bnq0 > 0 ) )
402 {
406 &kbb, negone,
Mptr( WA, WAoff, 0, WAd[
LLD_], size ),
408 Bmp0-Bmp, 0, Bld, size ), &Bld );
409 }
410 if( WBfr ) free( WB );
411 talph = one;
412 }
413 if( WAfr ) free( WA );
414 if( Bfr ) free( Bptr );
415 if( Afr ) free( Aptr );
416 }
417 }
418 }
419 else
420 {
421 if( upper )
422 {
423 for( k = 0; k < N; k += kb )
424 {
425 ktmp = N - k; kbb =
MIN( ktmp, kb );
426
427
428
430 DESCA,
ROW, &Aptr, DBUFA, &Afr );
431
432
433
435 Bcurcol =
PB_Cindxg2p( k, Binb1, Bnb, Bcol, Bcol, npcol );
436 PB_Cdescset( Bd0, M, ktmp, Bimb1, Bcurinb1, Bmb, Bnb, Brow,
437 Bcurcol, ctxt, Bld );
438 PB_CInV(
TYPE,
NOCONJG,
ROW, M, ktmp, Bd0, kbb, Aptr, 0, 0,
439 DBUFA,
ROW, &WA, WAd, &WAfr );
440
441
442
443 PB_CptrsmAB0(
TYPE, SIDE, UPLO, DIAG, M, kbb, talph, WA, 0, 0,
444 WAd, B, IB, JB+k, DESCB, &Bptr, DBUFB, &Bfr );
445
446
447
448 if( ( ktmp = ktmp - kbb ) > 0 )
449 {
450
451
452
453 Bcurinb1 =
PB_Cfirstnb( ktmp, JB+k+kbb, Binb, Bnb );
454 Bcurcol =
PB_Cindxg2p( k+kbb, Binb1, Bnb, Bcol, Bcol,
455 npcol );
456 PB_Cdescset( Bd0, M, ktmp, Bimb1, Bcurinb1, Bmb, Bnb, Brow,
457 Bcurcol, ctxt, Bld );
458 PB_CInV(
TYPE,
NOCONJG,
COLUMN, M, ktmp, Bd0, kbb, Bptr, 0, 0,
459 DBUFB,
COLUMN, &WB, WBd, &WBfr );
460
461
462
463 Bnq =
PB_Cnumroc( ktmp, k+kbb, Binb1, Bnb, mycol, Bcol,
464 npcol );
465 if( ( Bmp0 > 0 ) && ( Bnq > 0 ) )
466 {
470 &kbb, negone, WB, &WBd[
LLD_],
Mptr( WA, 0, WAoff,
472 0, Bnq0-Bnq, Bld, size ), &Bld );
473 }
474 if( WBfr ) free( WB );
475 talph = one;
476 }
477 if( WAfr ) free( WA );
478 if( Bfr ) free( Bptr );
479 if( Afr ) free( Aptr );
480 }
481 }
482 else
483 {
484 kmax = ( ( N - 1 ) / kb ) * kb;
485
486 for( k = kmax; k >= 0; k -= kb )
487 {
488 kbb = N - k; kbb =
MIN( kbb, kb ); ktmp = k + kbb;
489
490
491
493 DESCA,
ROW, &Aptr, DBUFA, &Afr );
494
495
496
497 PB_Cdescset( Bd0, M, ktmp, Bimb1, Binb1, Bmb, Bnb, Brow, Bcol,
498 ctxt, Bld );
499 PB_CInV(
TYPE,
NOCONJG,
ROW, M, ktmp, Bd0, kbb, Aptr, 0, 0,
500 DBUFA,
ROW, &WA, WAd, &WAfr );
501
502
503
504 PB_CptrsmAB0(
TYPE, SIDE, UPLO, DIAG, M, kbb, talph, WA, 0, k,
505 WAd, B, IB, JB+k, DESCB, &Bptr, DBUFB, &Bfr );
506
507
508
509 if( k > 0 )
510 {
511
512
513
514 PB_Cdescset( Bd0, M, k, Bimb1, Binb1, Bmb, Bnb, Brow, Bcol,
515 ctxt, Bld );
516 PB_CInV(
TYPE,
NOCONJG,
COLUMN, M, k, Bd0, kbb, Bptr, 0, 0,
517 DBUFB,
COLUMN, &WB, WBd, &WBfr );
518
519
520
521 Bnq =
PB_Cnumroc( k, 0, Binb1, Bnb, mycol, Bcol, npcol );
522 if( ( Bmp0 > 0 ) && ( Bnq > 0 ) )
524 &kbb, negone, WB, &WBd[
LLD_], WA, &WAd[
LLD_], talph,
525 Bptr0, &Bld );
526 if( WBfr ) free( WB );
527 talph = one;
528 }
529 if( WAfr ) free( WA );
530 if( Bfr ) free( Bptr );
531 if( Afr ) free( Aptr );
532 }
533 }
534 }
535 }
536 else
537 {
539 {
540
541
542
544
545 if( lside )
546 {
547 if( !upper )
548 {
549
550
551
552 kmax = ( ( M - 1 ) / kb ) * kb;
553
554 for( k = kmax; k >= 0; k -= kb )
555 {
556 kbb = M - k; kbb =
MIN( kbb, kb ); ktmp = k + kbb;
557
558
559
561 DESCA,
ROW, &Aptr, DBUFA, &Afr );
562
563
564
565 PB_Cdescset( Bd0, ktmp, N, Bimb1, Binb1, Bmb, Bnb, Brow, Bcol,
566 ctxt, Bld );
567 PB_CInV(
TYPE, &conjg,
COLUMN, ktmp, N, Bd0, kbb, Aptr, 0, 0,
568 DBUFA,
ROW, &WA, WAd, &WAfr );
569
570
571
573 0, WAd, B, IB+k, JB, DESCB, &Bptr, DBUFB,
574 &Bfr );
575
576
577
578 if( k > 0 )
579 {
580
581
582
583 PB_Cdescset( Bd0, k, N, Bimb1, Binb1, Bmb, Bnb, Brow, Bcol,
584 ctxt, Bld );
585 PB_CInV(
TYPE,
NOCONJG,
ROW, k, N, Bd0, kbb, Bptr, 0, 0,
586 DBUFB,
ROW, &WB, WBd, &WBfr );
587
588
589
590 Bmp =
PB_Cnumroc( k, 0, Bimb1, Bmb, myrow, Brow, nprow );
591 if( ( Bmp > 0 ) && ( Bnq0 > 0 ) )
593 &Bnq0, &kbb, negone, WA, &WAd[
LLD_], WB,
594 &WBd[
LLD_], talph, Bptr0, &Bld );
595 if( WBfr ) free( WB );
596 talph = one;
597 }
598 if( WAfr ) free( WA );
599 if( Bfr ) free( Bptr );
600 if( Afr ) free( Aptr );
601 }
602 }
603 else
604 {
605
606
607
608 for( k = 0; k < M; k += kb )
609 {
610 ktmp = M - k; kbb =
MIN( ktmp, kb );
611
612
613
615 DESCA,
ROW, &Aptr, DBUFA, &Afr );
616
617
618
620 Bcurrow =
PB_Cindxg2p( k, Bimb1, Bmb, Brow, Brow, nprow );
621 PB_Cdescset( Bd0, ktmp, N, Bcurimb1, Binb1, Bmb, Bnb, Bcurrow,
622 Bcol, ctxt, Bld );
623 PB_CInV(
TYPE, &conjg,
COLUMN, ktmp, N, Bd0, kbb, Aptr, 0, 0,
624 DBUFA,
ROW, &WA, WAd, &WAfr );
625
626
627
629 0, WAd, B, IB+k, JB, DESCB, &Bptr, DBUFB,
630 &Bfr );
631
632
633
634 if( ( ktmp = ktmp - kbb ) > 0 )
635 {
636
637
638
639 Bcurimb1 =
PB_Cfirstnb( ktmp, IB+k+kbb, Bimb, Bmb );
640 Bcurrow =
PB_Cindxg2p( k+kbb, Bimb1, Bmb, Brow, Brow,
641 nprow );
642 PB_Cdescset( Bd0, ktmp, N, Bcurimb1, Binb1, Bmb, Bnb,
643 Bcurrow, Bcol, ctxt, Bld );
644 PB_CInV(
TYPE,
NOCONJG,
ROW, ktmp, N, Bd0, kbb, Bptr, 0, 0,
645 DBUFB,
ROW, &WB, WBd, &WBfr );
646
647
648
649 Bmp =
PB_Cnumroc( ktmp, k+kbb, Bimb1, Bmb, myrow, Brow,
650 nprow );
651 if( ( Bmp > 0 ) && ( Bnq0 > 0 ) )
652 {
656 &Bnq0, &kbb, negone,
Mptr( WA, WAoff, 0,
658 talph,
Mptr( Bptr0, Bmp0-Bmp, 0, Bld, size ),
659 &Bld );
660 }
661 if( WBfr ) free( WB );
662 talph = one;
663 }
664 if( WAfr ) free( WA );
665 if( Bfr ) free( Bptr );
666 if( Afr ) free( Aptr );
667 }
668 }
669 }
670 else
671 {
672 if( !upper )
673 {
674
675
676
677 for( k = 0; k < N; k += kb )
678 {
679 ktmp = N - k; kbb =
MIN( ktmp, kb );
680
681
682
684 DESCA,
COLUMN, &Aptr, DBUFA, &Afr );
685
686
687
689 Bcurcol =
PB_Cindxg2p( k, Binb1, Bnb, Bcol, Bcol, npcol );
690 PB_Cdescset( Bd0, M, ktmp, Bimb1, Bcurinb1, Bmb, Bnb, Brow,
691 Bcurcol, ctxt, Bld );
692 PB_CInV(
TYPE, &conjg,
ROW, M, ktmp, Bd0, kbb, Aptr, 0, 0,
693 DBUFA,
COLUMN, &WA, WAd, &WAfr );
694
695
696
698 0, WAd, B, IB, JB+k, DESCB, &Bptr, DBUFB,
699 &Bfr );
700
701
702
703 if( ( ktmp = ktmp - kbb ) > 0 )
704 {
705
706
707
708 Bcurinb1 =
PB_Cfirstnb( ktmp, JB+k+kbb, Binb, Bnb );
709 Bcurcol =
PB_Cindxg2p( k+kbb, Binb1, Bnb, Bcol, Bcol,
710 npcol );
711 PB_Cdescset( Bd0, M, ktmp, Bimb1, Bcurinb1, Bmb, Bnb, Brow,
712 Bcurcol, ctxt, Bld );
714 0, 0, DBUFB,
COLUMN, &WB, WBd, &WBfr );
715
716
717
718 Bnq =
PB_Cnumroc( ktmp, k+kbb, Binb1, Bnb, mycol, Bcol,
719 npcol );
720 if( ( Bmp0 > 0 ) && ( Bnq > 0 ) )
721 {
725 &Bnq, &kbb, negone, WB, &WBd[
LLD_],
Mptr( WA, 0,
726 WAoff, WAd[
LLD_], size ), &WAd[
LLD_], talph,
727 Mptr( Bptr0, 0, Bnq0-Bnq, Bld, size ), &Bld );
728 }
729 if( WBfr ) free( WB );
730 talph = one;
731 }
732 if( WAfr ) free( WA );
733 if( Bfr ) free( Bptr );
734 if( Afr ) free( Aptr );
735 }
736 }
737 else
738 {
739
740
741
742 kmax = ( ( N - 1 ) / kb ) * kb;
743
744 for( k = kmax; k >= 0; k -= kb )
745 {
746 kbb = N - k; kbb =
MIN( kbb, kb ); ktmp = k + kbb;
747
748
749
751 DESCA,
COLUMN, &Aptr, DBUFA, &Afr );
752
753
754
755 PB_Cdescset( Bd0, M, ktmp, Bimb1, Binb1, Bmb, Bnb, Brow, Bcol,
756 ctxt, Bld );
757 PB_CInV(
TYPE, &conjg,
ROW, M, ktmp, Bd0, kbb, Aptr, 0, 0,
758 DBUFA,
COLUMN, &WA, WAd, &WAfr );
759
760
761
763 k, WAd, B, IB, JB+k, DESCB, &Bptr, DBUFB,
764 &Bfr );
765
766
767
768 if( k > 0 )
769 {
770
771
772
773 PB_Cdescset( Bd0, M, k, Bimb1, Binb1, Bmb, Bnb, Brow, Bcol,
774 ctxt, Bld );
775 PB_CInV(
TYPE,
NOCONJG,
COLUMN, M, k, Bd0, kbb, Bptr, 0, 0,
776 DBUFB,
COLUMN, &WB, WBd, &WBfr );
777
778
779
780 Bnq =
PB_Cnumroc( k, 0, Binb1, Bnb, mycol, Bcol, npcol );
781 if( ( Bmp0 > 0 ) && ( Bnq > 0 ) )
783 &Bnq, &kbb, negone, WB, &WBd[
LLD_], WA,
784 &WAd[
LLD_], talph, Bptr0, &Bld );
785 if( WBfr ) free( WB );
786 talph = one;
787 }
788 if( WAfr ) free( WA );
789 if( Bfr ) free( Bptr );
790 if( Afr ) free( Aptr );
791 }
792 }
793 }
794 }
795 else
796 {
797
798
799
800 if( lside )
801 {
803
804 if( upper )
805 {
806
807
808
810 DESCA,
COLUMN, &Aptr, DBUFA, &Afr );
811
812
813
814 PB_Cdescset( Bd0, Bimb1, N, Bimb1, Binb1, Bmb, Bnb, Brow, Bcol,
815 ctxt, Bld );
816 PB_CInV(
TYPE,
NOCONJG,
COLUMN, Bimb1, N, Bd0, Bimb1, Aptr, 0, 0,
817 DBUFA,
COLUMN, &WA, WAd, &WAfr );
818
819
820
821 if( ( ( Brow < 0 ) || ( myrow == Brow ) ) && ( Bnq0 > 0 ) )
824 &Bimb1, &Bnq0, ALPHA, WA, &WAd[
LLD_],
825 Bptr0, &Bld );
826 if( WAfr ) free( WA );
827 if( Afr ) free( Aptr );
828
829
830
831 for( k = Bimb1; k < M; k += kb )
832 {
833 kbb = M - k; kbb =
MIN( kbb, kb ); ktmp = k + kbb;
834
835
836
838 DESCA,
COLUMN, &Aptr, DBUFA, &Afr );
839
840
841
842 PB_Cdescset( Bd0, ktmp, N, Bimb1, Binb1, Bmb, Bnb, Brow, Bcol,
843 ctxt, Bld );
844 PB_CInV(
TYPE,
NOCONJG,
COLUMN, ktmp, N, Bd0, kbb, Aptr, 0, 0,
845 DBUFA,
COLUMN, &WA, WAd, &WAfr );
846
847
848
849 PB_COutV(
TYPE,
ROW,
INIT, ktmp, N, Bd0, kbb, &WB, WBd, &WBfr,
850 &WBsum );
851 Bmp =
PB_Cnumroc( k, 0, Bimb1, Bmb, myrow, Brow, nprow );
852 if( ( Bnq0 > 0 ) && ( Bmp > 0 ) )
854 &Bmp, one, WA, &WAd[
LLD_], Bptr0, &Bld, zero, WB,
856 if( WBsum )
857 {
859 nprow );
860 if( Bnq0 > 0 )
861 gsum2d( ctxt,
COLUMN, &top, kbb, Bnq0, WB, WBd[
LLD_],
863 }
864
865
866
867
869 WA, k, 0, WAd, B, IB+k, JB, DESCB, WB, WBd );
870 if( WBfr ) free( WB );
871 if( WAfr ) free( WA );
872 if( Afr ) free( Aptr );
873 }
874 }
875 else
876 {
877
878
879
881 k = M - Bcurimb1;
882
883
884
886 JA+k, DESCA,
COLUMN, &Aptr, DBUFA, &Afr );
887
888
889
890 Bcurrow =
PB_Cindxg2p( k, Bimb1, Bmb, Brow, Brow, nprow );
891 PB_Cdescset( Bd0, Bcurimb1, N, Bcurimb1, Binb1, Bmb, Bnb,
892 Bcurrow, Bcol, ctxt, Bld );
894 0, 0, DBUFA,
COLUMN, &WA, WAd, &WAfr );
895
896
897
898 if( ( ( Brow < 0 ) || ( myrow == Bcurrow ) ) && ( Bnq0 > 0 ) )
901 &Bcurimb1, &Bnq0, ALPHA, WA, &WAd[
LLD_],
902 Mptr( Bptr0, Bmp0-Bcurimb1, 0, Bld, size ),
903 &Bld );
904 if( WAfr ) free( WA );
905 if( Afr ) free( Aptr );
906 if( ( mn = M - Bcurimb1 ) <= 0 ) return;
907
908
909
910 kmax = ( ( mn - 1 ) / kb ) * kb;
911
912 for( k = kmax; k >= 0; k -= kb )
913 {
914 ktmp = M - k; kbb = mn - k; kbb =
MIN( kbb, kb );
915
916
917
919 DESCA,
COLUMN, &Aptr, DBUFA, &Afr );
920
921
922
924 Bcurrow =
PB_Cindxg2p( k, Bimb1, Bmb, Brow, Brow, nprow );
925 PB_Cdescset( Bd0, ktmp, N, Bcurimb1, Binb1, Bmb, Bnb, Bcurrow,
926 Bcol, ctxt, Bld );
927 PB_CInV(
TYPE,
NOCONJG,
COLUMN, ktmp, N, Bd0, kbb, Aptr, 0, 0,
928 DBUFA,
COLUMN, &WA, WAd, &WAfr );
929
930
931
932 PB_COutV(
TYPE,
ROW,
INIT, ktmp, N, Bd0, kbb, &WB, WBd, &WBfr,
933 &WBsum );
934 Bmp =
PB_Cnumroc( ktmp-kbb, k+kbb, Bimb1, Bmb, myrow, Brow,
935 nprow );
936 if( ( Bnq0 > 0 ) && ( Bmp > 0 ) )
937 {
941 &Bmp, one,
Mptr( WA, WAoff, 0, WAd[
LLD_], size ),
942 &WAd[
LLD_],
Mptr( Bptr0, Bmp0-Bmp, 0, Bld, size ),
943 &Bld, zero, WB, &WBd[
LLD_] );
944 }
945 if( WBsum )
946 {
948 Brow, nprow );
949 if( Bnq0 > 0 )
950 gsum2d( ctxt,
COLUMN, &top, kbb, Bnq0, WB, WBd[
LLD_],
952 }
953
954
955
956
958 WA, 0, 0, WAd, B, IB+k, JB, DESCB, WB, WBd );
959 if( WBfr ) free( WB );
960 if( WAfr ) free( WA );
961 if( Afr ) free( Aptr );
962 }
963 }
964 }
965 else
966 {
968
969 if( upper )
970 {
971
972
973
975 k = N - Bcurinb1;
976
977
978
980 JA+k, DESCA,
ROW, &Aptr, DBUFA, &Afr );
981
982
983
984 Bcurcol =
PB_Cindxg2p( k, Binb1, Bnb, Bcol, Bcol, npcol );
985 PB_Cdescset( Bd0, M, Bcurinb1, Bimb1, Bcurinb1, Bmb, Bnb, Brow,
986 Bcurcol, ctxt, Bld );
988 0, 0, DBUFA,
ROW, &WA, WAd, &WAfr );
989
990
991
992 if( ( ( Bcol < 0 ) || ( mycol == Bcurcol ) ) && ( Bmp0 > 0 ) )
995 &Bmp0, &Bcurinb1, ALPHA, WA, &WAd[
LLD_],
996 Mptr( Bptr0, 0, Bnq0-Bcurinb1, Bld, size ),
997 &Bld );
998 if( WAfr ) free( WA );
999 if( Afr ) free( Aptr );
1000 if( ( mn = N - Bcurinb1 ) <= 0 ) return;
1001
1002
1003
1004 kmax = ( ( mn - 1 ) / kb ) * kb;
1005
1006 for( k = kmax; k >= 0; k -= kb )
1007 {
1008 ktmp = N - k; kbb = mn - k; kbb =
MIN( kbb, kb );
1009
1010
1011
1013 DESCA,
ROW, &Aptr, DBUFA, &Afr );
1014
1015
1016
1018 Bcurcol =
PB_Cindxg2p( k, Binb1, Bnb, Bcol, Bcol, npcol );
1019 PB_Cdescset( Bd0, M, ktmp, Bimb1, Bcurinb1, Bmb, Bnb, Brow,
1020 Bcurcol, ctxt, Bld );
1021 PB_CInV(
TYPE,
NOCONJG,
ROW, M, ktmp, Bd0, kbb, Aptr, 0, 0,
1022 DBUFA,
ROW, &WA, WAd, &WAfr );
1023
1024
1025
1027 &WBfr, &WBsum );
1028 Bnq =
PB_Cnumroc( ktmp-kbb, k+kbb, Binb1, Bnb, mycol, Bcol,
1029 npcol );
1030 if( ( Bmp0 > 0 ) && ( Bnq > 0 ) )
1031 {
1033 WAd[
CSRC_], npcol );
1035 &Bnq, one,
Mptr( Bptr0, 0, Bnq0-Bnq, Bld, size ),
1036 &Bld,
Mptr( WA, 0, WAoff, WAd[
LLD_], size ),
1037 &WAd[
LLD_], zero, WB, &WBd[
LLD_] );
1038 }
1039 if( WBsum )
1040 {
1042 Bcol, npcol );
1043 if( Bmp0 > 0 )
1044 gsum2d( ctxt,
ROW, &top, Bmp0, kbb, WB, WBd[
LLD_],
1045 myrow, WBd[
CSRC_] );
1046 }
1047
1048
1049
1050
1052 WA, 0, 0, WAd, B, IB, JB+k, DESCB, WB, WBd );
1053 if( WBfr ) free( WB );
1054 if( WAfr ) free( WA );
1055 if( Afr ) free( Aptr );
1056 }
1057 }
1058 else
1059 {
1060
1061
1062
1064 DESCA,
ROW, &Aptr, DBUFA, &Afr );
1065
1066
1067
1068 PB_Cdescset( Bd0, M, Binb1, Bimb1, Binb1, Bmb, Bnb, Brow, Bcol,
1069 ctxt, Bld );
1070 PB_CInV(
TYPE,
NOCONJG,
ROW, M, Binb1, Bd0, Binb1, Aptr, 0, 0,
1071 DBUFA,
ROW, &WA, WAd, &WAfr );
1072
1073
1074
1075 if( ( ( Bcol < 0 ) || ( mycol == Bcol ) ) && ( Bmp0 > 0 ) )
1078 &Bmp0, &Binb1, ALPHA, WA, &WAd[
LLD_],
1079 Bptr0, &Bld );
1080 if( WAfr ) free( WA );
1081 if( Afr ) free( Aptr );
1082
1083
1084
1085 for( k = Binb1; k < N; k += kb )
1086 {
1087 kbb = N - k; kbb =
MIN( kbb, kb ); ktmp = k + kbb;
1088
1089
1090
1092 DESCA,
ROW, &Aptr, DBUFA, &Afr );
1093
1094
1095
1096 PB_Cdescset( Bd0, M, ktmp, Bimb1, Binb1, Bmb, Bnb, Brow, Bcol,
1097 ctxt, Bld );
1098 PB_CInV(
TYPE,
NOCONJG,
ROW, M, ktmp, Bd0, kbb, Aptr, 0, 0,
1099 DBUFA,
ROW, &WA, WAd, &WAfr );
1100
1101
1102
1104 &WBfr, &WBsum );
1105 Bnq =
PB_Cnumroc( k, 0, Binb1, Bnb, mycol, Bcol, npcol );
1106 if( ( Bmp0 > 0 ) && ( Bnq > 0 ) )
1108 &Bnq, one, Bptr0, &Bld, WA, &WAd[
LLD_], zero, WB,
1110 if( WBsum )
1111 {
1113 npcol );
1114 if( Bmp0 > 0 )
1115 gsum2d( ctxt,
ROW, &top, Bmp0, kbb, WB, WBd[
LLD_],
1116 myrow, WBd[
CSRC_] );
1117 }
1118
1119
1120
1121
1123 WA, 0, k, WAd, B, IB, JB+k, DESCB, WB, WBd );
1124 if( WAfr ) free( WA );
1125 if( Afr ) free( Aptr );
1126 if( WBfr ) free( WB );
1127 }
1128 }
1129 }
1130 }
1131 }
1132
1133
1134
1135}