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