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 Int Acol, Arow, Aii, Aimb1, Ainb1, Ajj, Ald, Amp, Amb, Anb, Anq,
238 Aoffi, Aoffj, Arcol, Arrow, GoEast, GoSouth, IsColRepl,
239 IsRowRepl, XCinc, XRinc, Xii=0, Xjj=0, Xoffi=-1, Xoffj=-1,
240 YCinc, YRinc, iimax, ilow, imbloc, inbloc, ioffd, ioffx, iupp,
241 jjmax, joffd, joffx, lcmt, lcmt00, lmbloc, lnbloc, low, lower,
242 m1, mbloc, mblkd, mblks, mycol, myrow, n1, nbloc, nblkd,
243 nblks, npcol, nprow, pmb, qnb, size, tmp1, upp, upper;
244
245
246
247
248
249
250
251 if( N <= 0 ) return;
252
253
254
256
257
258
259 PB_Cainfog2l( N, N, IA, JA, DESCA, nprow, npcol, myrow, mycol, &Aimb1,
260 &Ainb1, &Amp, &Anq, &Aii, &Ajj, &Arow, &Acol, &Arrow, &Arcol );
261
262
263
264
265 if( ( Amp <= 0 ) || ( Anq <= 0 ) ) return;
266
267 IsRowRepl = ( ( Arow < 0 ) || ( nprow == 1 ) );
268 IsColRepl = ( ( Acol < 0 ) || ( npcol == 1 ) );
269 Amb = DESCA[
MB_ ]; Anb = DESCA[
NB_ ]; Ald = DESCA[
LLD_ ];
271
272 if( IsRowRepl && IsColRepl )
273 {
274 SYM(
TYPE, SIDE, UPLO, Amp, Anq, K, 0, ALPHA,
Mptr( A, Aii, Ajj, Ald,
275 size ), Ald, XC, LDXC, XR, LDXR, YC, LDYC, YR, LDYR );
276 return;
277 }
278
279 XCinc = size; XRinc = LDXR * size;
280 YCinc = UTYP->
size; YRinc = LDYR * UTYP->
size;
283
284
285
286
287 PB_Cbinfo( 0, Amp, Anq, Aimb1, Ainb1, Amb, Anb, Arrow, Arcol, &lcmt00,
288 &mblks, &nblks, &imbloc, &inbloc, &lmbloc, &lnbloc, &ilow, &low,
289 &iupp, &upp );
290
291 iimax = ( Aoffi = Aii - 1 ) + ( m1 = Amp );
292 jjmax = ( Aoffj = Ajj - 1 ) + ( n1 = Anq );
293 pmb = ( IsRowRepl ? Amb : nprow * Amb );
294 qnb = ( IsColRepl ? Anb : npcol * Anb );
295
296
297
298
299
300 GoSouth = ( lcmt00 > iupp );
301 GoEast = ( lcmt00 < ilow );
302
303
304
305 if( ( !( GoSouth ) ) && ( !( GoEast ) ) )
306 {
307
308
309
310 SYM(
TYPE, SIDE, UPLO, imbloc, inbloc, K, lcmt00, ALPHA,
Mptr( A, Aii,
311 Ajj, Ald, size ), Ald, XC+Xii*XCinc, LDXC, XR+Xjj*XRinc, LDXR,
312 YC+Xii*YCinc, LDYC, YR+Xjj*YRinc, LDYR );
313
314
315
316
317
318 GoSouth = !( GoEast = ( ( lcmt00 - ( iupp - upp + pmb ) ) < ilow ) );
319
320 if( GoSouth )
321 {
322
323
324
325
326
327 if( upper && ( Anq > inbloc ) )
328 {
329 tmp1 = Anq - inbloc;
330 SYM(
TYPE, SIDE,
ALL, imbloc, tmp1, K, 0,
331 ALPHA,
Mptr( A, Aii, Ajj+inbloc, Ald, size ), Ald,
332 XC+Xii*XCinc, LDXC, XR+(Xjj+inbloc)*XRinc, LDXR,
333 YC+Xii*YCinc, LDYC, YR+(Xjj+inbloc)*YRinc, LDYR );
334 }
335 Aii += imbloc; Xii += imbloc; m1 -= imbloc;
336 }
337 else
338 {
339
340
341
342
343
344 if( lower && ( Amp > imbloc ) )
345 {
346 tmp1 = Amp - imbloc;
347 SYM(
TYPE, SIDE,
ALL, tmp1, inbloc, K, 0,
348 ALPHA,
Mptr( A, Aii+imbloc, Ajj, Ald, size ), Ald,
349 XC+(Xii+imbloc)*XCinc, LDXC, XR+Xjj*XRinc, LDXR,
350 YC+(Xii+imbloc)*YCinc, LDYC, YR+Xjj*YRinc, LDYR );
351 }
352 Ajj += inbloc; Xjj += inbloc; n1 -= inbloc;
353 }
354 }
355
356 if( GoSouth )
357 {
358
359
360
361
362 lcmt00 -= ( iupp - upp + pmb ); mblks--;
363 Aoffi += imbloc; Xoffi += imbloc;
364
365
366
367
368 while( ( mblks > 0 ) && ( lcmt00 > upp ) )
369 { lcmt00 -= pmb; mblks--; Aoffi += Amb; Xoffi += Amb; }
370
371
372
373
374 tmp1 =
MIN( Aoffi, iimax ) - Aii + 1;
375 if( upper && ( tmp1 > 0 ) )
376 {
377 SYM(
TYPE, SIDE,
ALL, tmp1, n1, K, 0,
378 ALPHA,
Mptr( A, Aii, Aoffj+1, Ald, size ), Ald,
379 XC+Xii*XCinc, LDXC, XR+(Xoffj+1)*XRinc, LDXR,
380 YC+Xii*YCinc, LDYC, YR+(Xoffj+1)*YRinc, LDYR );
381 Aii += tmp1; Xii += tmp1; m1 -= tmp1;
382 }
383
384
385
386 if( mblks <= 0 ) return;
387
388
389
390
391
392
393 lcmt = lcmt00; mblkd = mblks; ioffd = Aoffi; ioffx = Xoffi;
394
395 mbloc = Amb;
396 while( ( mblkd > 0 ) && ( lcmt >= ilow ) )
397 {
398
399
400
401 if( mblkd == 1 ) mbloc = lmbloc;
402 SYM(
TYPE, SIDE, UPLO, mbloc, inbloc, K, lcmt,
403 ALPHA,
Mptr( A, ioffd+1, Aoffj+1, Ald, size ), Ald,
404 XC+(ioffx+1)*XCinc, LDXC, XR+(Xoffj+1)*XRinc, LDXR,
405 YC+(ioffx+1)*YCinc, LDYC, YR+(Xoffj+1)*YRinc, LDYR );
406 lcmt00 = lcmt; lcmt -= pmb;
407 mblks = mblkd; mblkd--;
408 Aoffi = ioffd; ioffd += mbloc;
409 Xoffi = ioffx; ioffx += mbloc;
410 }
411
412
413
414 tmp1 = m1 - ioffd + Aii - 1;
415 if( lower && ( tmp1 > 0 ) )
416 SYM(
TYPE, SIDE,
ALL, tmp1, inbloc, K, 0,
417 ALPHA,
Mptr( A, ioffd+1, Aoffj+1, Ald, size ), Ald,
418 XC+(ioffx+1)*XCinc, LDXC, XR+(Xoffj+1)*XRinc, LDXR,
419 YC+(ioffx+1)*YCinc, LDYC, YR+(Xoffj+1)*YRinc, LDYR );
420
421 tmp1 = Aoffi - Aii + 1;
422 m1 -= tmp1;
423 n1 -= inbloc;
424 lcmt00 += low - ilow + qnb;
425 nblks--;
426 Aoffj += inbloc;
427 Xoffj += inbloc;
428
429
430
431 if( upper && ( tmp1 > 0 ) && ( n1 > 0 ) )
432 SYM(
TYPE, SIDE,
ALL, tmp1, n1, K, 0,
433 ALPHA,
Mptr( A, Aii, Aoffj+1, Ald, size ), Ald,
434 XC+Xii*XCinc, LDXC, XR+(Xoffj+1)*XRinc, LDXR,
435 YC+Xii*YCinc, LDYC, YR+(Xoffj+1)*YRinc, LDYR );
436 Aii = Aoffi + 1; Ajj = Aoffj + 1;
437 Xii = Xoffi + 1; Xjj = Xoffj + 1;
438 }
439 else if( GoEast )
440 {
441
442
443
444
445 lcmt00 += low - ilow + qnb; nblks--;
446 Aoffj += inbloc; Xoffj += inbloc;
447
448
449
450
451 while( ( nblks > 0 ) && ( lcmt00 < low ) )
452 { lcmt00 += qnb; nblks--; Aoffj += Anb; Xoffj += Anb; }
453
454
455
456 tmp1 =
MIN( Aoffj, jjmax ) - Ajj + 1;
457 if( lower && ( tmp1 > 0 ) )
458 {
459 SYM(
TYPE, SIDE,
ALL, m1, tmp1, K, 0,
460 ALPHA,
Mptr( A, Aii, Ajj, Ald, size ), Ald,
461 XC+Xii*XCinc, LDXC, XR+Xjj*XRinc, LDXR,
462 YC+Xii*YCinc, LDYC, YR+Xjj*YRinc, LDYR );
463 Ajj += tmp1; Xjj += tmp1; n1 -= tmp1;
464 }
465
466
467
468 if( nblks <= 0 ) return;
469
470
471
472
473
474
475 lcmt = lcmt00; nblkd = nblks; joffd = Aoffj; joffx = Xoffj;
476
477 nbloc = Anb;
478 while( ( nblkd > 0 ) && ( lcmt <= iupp ) )
479 {
480
481
482
483 if( nblkd == 1 ) nbloc = lnbloc;
484 SYM(
TYPE, SIDE, UPLO, imbloc, nbloc, K, lcmt,
485 ALPHA,
Mptr( A, Aii, joffd+1, Ald, size ), Ald,
486 XC+Xii*XCinc, LDXC, XR+(joffx+1)*XRinc, LDXR,
487 YC+Xii*YCinc, LDYC, YR+(joffx+1)*YRinc, LDYR );
488 lcmt00 = lcmt; lcmt += qnb;
489 nblks = nblkd; nblkd--;
490 Aoffj = joffd; joffd += nbloc;
491 Xoffj = joffx; joffx += nbloc;
492 }
493
494
495
496 tmp1 = n1 - joffd + Ajj - 1;
497 if( upper && ( tmp1 > 0 ) )
498 SYM(
TYPE, SIDE,
ALL, imbloc, tmp1, K, 0,
499 ALPHA,
Mptr( A, Aii, joffd+1, Ald, size ), Ald,
500 XC+Xii*XCinc, LDXC, XR+(joffx+1)*XRinc, LDXR,
501 YC+Xii*YCinc, LDYC, YR+(joffx+1)*YRinc, LDYR );
502
503 tmp1 = Aoffj - Ajj + 1;
504 m1 -= imbloc;
505 n1 -= tmp1;
506 lcmt00 -= ( iupp - upp + pmb );
507 mblks--;
508 Aoffi += imbloc;
509 Xoffi += imbloc;
510
511
512
513 if( lower && ( m1 > 0 ) && ( tmp1 > 0 ) )
514 SYM(
TYPE, SIDE,
ALL, m1, tmp1, K, 0,
515 ALPHA,
Mptr( A, Aoffi+1, Ajj, Ald, size ), Ald,
516 XC+(Xoffi+1)*XCinc, LDXC, XR+Xjj*XRinc, LDXR,
517 YC+(Xoffi+1)*YCinc, LDYC, YR+Xjj*YRinc, LDYR );
518 Aii = Aoffi + 1; Ajj = Aoffj + 1;
519 Xii = Xoffi + 1; Xjj = Xoffj + 1;
520 }
521
522
523
524 nbloc = Anb;
525 while( nblks > 0 )
526 {
527 if( nblks == 1 ) nbloc = lnbloc;
528
529
530
531
532 while( ( mblks > 0 ) && ( lcmt00 > upp ) )
533 { lcmt00 -= pmb; mblks--; Aoffi += Amb; Xoffi += Amb; }
534
535
536
537 tmp1 =
MIN( Aoffi, iimax ) - Aii + 1;
538 if( upper && ( tmp1 > 0 ) )
539 {
540 SYM(
TYPE, SIDE,
ALL, tmp1, n1, K, 0,
541 ALPHA,
Mptr( A, Aii, Aoffj+1, Ald, size ), Ald,
542 XC+Xii*XCinc, LDXC, XR+(Xoffj+1)*XRinc, LDXR,
543 YC+Xii*YCinc, LDYC, YR+(Xoffj+1)*YRinc, LDYR );
544 Aii += tmp1;
545 Xii += tmp1;
546 m1 -= tmp1;
547 }
548
549
550
551 if( mblks <= 0 ) return;
552
553
554
555
556
557
558 lcmt = lcmt00; mblkd = mblks; ioffd = Aoffi; ioffx = Xoffi;
559
560 mbloc = Amb;
561 while( ( mblkd > 0 ) && ( lcmt >= low ) )
562 {
563
564
565
566 if( mblkd == 1 ) mbloc = lmbloc;
567 SYM(
TYPE, SIDE, UPLO, mbloc, nbloc, K, lcmt,
568 ALPHA,
Mptr( A, ioffd+1, Aoffj+1, Ald, size ), Ald,
569 XC+(ioffx+1)*XCinc, LDXC, XR+(Xoffj+1)*XRinc, LDXR,
570 YC+(ioffx+1)*YCinc, LDYC, YR+(Xoffj+1)*YRinc, LDYR );
571 lcmt00 = lcmt; lcmt -= pmb;
572 mblks = mblkd; mblkd--;
573 Aoffi = ioffd; Xoffi = ioffx;
574 ioffd += mbloc; ioffx += mbloc;
575 }
576
577
578
579 tmp1 = m1 - ioffd + Aii - 1;
580 if( lower && ( tmp1 > 0 ) )
581 SYM(
TYPE, SIDE,
ALL, tmp1, nbloc, K, 0,
582 ALPHA,
Mptr( A, ioffd+1, Aoffj+1, Ald, size ), Ald,
583 XC+(ioffx+1)*XCinc, LDXC, XR+(Xoffj+1)*XRinc, LDXR,
584 YC+(ioffx+1)*YCinc, LDYC, YR+(Xoffj+1)*YRinc, LDYR );
585
586 tmp1 =
MIN( Aoffi, iimax ) - Aii + 1;
587 m1 -= tmp1;
588 n1 -= nbloc;
589 lcmt00 += qnb;
590 nblks--;
591 Aoffj += nbloc;
592 Xoffj += nbloc;
593
594
595
596 if( upper && ( tmp1 > 0 ) && ( n1 > 0 ) )
597 SYM(
TYPE, SIDE,
ALL, tmp1, n1, K, 0,
598 ALPHA,
Mptr( A, Aii, Aoffj+1, Ald, size ), Ald,
599 XC+Xii*XCinc, LDXC, XR+(Xoffj+1)*XRinc, LDXR,
600 YC+Xii*YCinc, LDYC, YR+(Xoffj+1)*YRinc, LDYR );
601 Aii = Aoffi + 1; Ajj = Aoffj + 1;
602 Xii = Xoffi + 1; Xjj = Xoffj + 1;
603 }
604
605
606
607}