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