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 char UploA, * one, top;
246 Int Acol, Ai, Aii, Aimb1, Ainb1, Aj, Ajj, Akp, Akq, Ald, Amb,
247 Amp, Amp0, Anb, Anq, Anq0, Arow, XCfr, XCld, XRfr, XRld,
248 Xi, Xj, YCfr, YCpbY, YCsum, YCld, YRfr, YRpbY, YRsum,
249 YRld, Ycol, Yi, Yii, YisRow, Yj, Yjj, Yld, Ynp, Ynq, Yrow,
250 ctxt, info, ione=1, k, kb, ktmp, mycol, myrow, nb, npcol,
251 nprow, size, upper;
252 double * tbeta;
254
255
256
259 char * Aptr = NULL, * XC = NULL, * XR = NULL, * YC = NULL,
260 * YR = NULL;
261
262
263
264
269#ifndef NO_ARGCHK
271
272
273
274 if( !( info = ( ( nprow == -1 ) ? -( 701 +
CTXT_ ) : 0 ) ) )
275 {
276 if( ( !upper ) && ( UploA !=
CLOWER ) )
277 {
278 PB_Cwarn( ctxt, __LINE__, __FILE__,
"Illegal UPLO = %c\n", UploA );
279 info = -1;
280 }
281 PB_Cchkmat( ctxt,
"PDSYMV",
"A", *N, 2, *N, 2, Ai, Aj, Ad, 7, &info );
282 PB_Cchkvec( ctxt,
"PDSYMV",
"X", *N, 2, Xi, Xj, Xd, *INCX, 11, &info );
283 PB_Cchkvec( ctxt,
"PDSYMV",
"Y", *N, 2, Yi, Yj, Yd, *INCY, 17, &info );
284 }
285 if( info ) {
PB_Cabort( ctxt,
"PDSYMV", info );
return; }
286#endif
287
288
289
290 if( ( *N == 0 ) ||
292 return;
293
294
295
296#ifdef NO_ARGCHK
298#endif
299
300
301
303
304
305
307 {
308
309
310
311 PB_Cinfog2l( Yi, Yj, Yd, nprow, npcol, myrow, mycol, &Yii, &Yjj,
312 &Yrow, &Ycol );
313
314 if( *INCY == Yd[
M_] )
315 {
316
317
318
319 if( ( myrow == Yrow ) || ( Yrow < 0 ) )
320 {
321
322
323
325 npcol );
326 if( Ynq > 0 )
327 {
330 {
331 dset_( &Ynq, ((
char *) BETA),
Mptr( ((
char *) Y), Yii,
332 Yjj, Yld, type->
size ), &Yld );
333 }
334 else
335 {
336 dscal_( &Ynq, ((
char *) BETA),
Mptr( ((
char *) Y), Yii,
337 Yjj, Yld, type->
size ), &Yld );
338 }
339 }
340 }
341 }
342 else
343 {
344
345
346
347 if( ( mycol == Ycol ) || ( Ycol < 0 ) )
348 {
349
350
351
353 nprow );
354 if( Ynp > 0 )
355 {
357 {
358 dset_( &Ynp, ((
char *) BETA),
Mptr( ((
char *) Y), Yii,
359 Yjj, Yd[
LLD_], type->
size ), INCY );
360 }
361 else
362 {
363 dscal_( &Ynp, ((
char *) BETA),
Mptr( ((
char *) Y), Yii,
364 Yjj, Yd[
LLD_], type->
size ), INCY );
365 }
366 }
367 }
368 }
369 return;
370 }
371
372
373
374 PB_Cdescribe( *N, *N, Ai, Aj, Ad, nprow, npcol, myrow, mycol, &Aii, &Ajj,
375 &Ald, &Aimb1, &Ainb1, &Amb, &Anb, &Arow, &Acol, Ad0 );
376
377
378
379
380 if( ( YisRow = ( *INCY == Yd[
M_] ) ) != 0 )
381 {
382 PB_CInOutV( type,
ROW, *N, *N, Ad0, 1, ((
char *)BETA), ((
char *) Y),
383 Yi, Yj, Yd,
ROW, ((
char**)(&tbeta)), &YR, YRd, &YRfr,
384 &YRsum, &YRpbY );
385 PB_COutV( type,
COLUMN,
INIT, *N, *N, Ad0, 1, &YC, YCd, &YCfr, &YCsum );
386 }
387 else
388 {
390 Yi, Yj, Yd,
COLUMN, ((
char**)(&tbeta)), &YC, YCd, &YCfr,
391 &YCsum, &YCpbY );
392 PB_COutV( type,
ROW,
INIT, *N, *N, Ad0, 1, &YR, YRd, &YRfr, &YRsum );
393 }
394
395
396
397
398 if( *INCX == Xd[
M_] )
399 {
400 PB_CInV( type,
NOCONJG,
ROW, *N, *N, Ad0, 1, ((
char *) X), Xi, Xj, Xd,
401 ROW, &XR, XRd, &XRfr );
402 PB_CInV( type,
NOCONJG,
COLUMN, *N, *N, Ad0, 1, XR, 0, 0, XRd,
403 ROW, &XC, XCd, &XCfr );
404 }
405 else
406 {
407 PB_CInV( type,
NOCONJG,
COLUMN, *N, *N, Ad0, 1, ((
char *) X), Xi, Xj, Xd,
408 COLUMN, &XC, XCd, &XCfr );
409 PB_CInV( type,
NOCONJG,
ROW, *N, *N, Ad0, 1, XC, 0, 0, XCd,
410 COLUMN, &XR, XRd, &XRfr );
411 }
412
414
415
416
417 Aimb1 = Ad0[
IMB_ ]; Ainb1 = Ad0[
INB_ ]; Amb = Ad0[
MB_]; Anb = Ad0[
NB_];
419 Amp =
PB_Cnumroc( *N, 0, Aimb1, Amb, myrow, Arow, nprow );
420 Anq =
PB_Cnumroc( *N, 0, Ainb1, Anb, mycol, Acol, npcol );
421
422 if( ( Amp > 0 ) && ( Anq > 0 ) )
423 {
425 Aptr =
Mptr( ((
char *) A), Aii, Ajj, Ald, size );
426
428
429
430
431 if( YisRow )
432 {
433
434
435
436 if( !YRpbY )
437 {
438 if( ( myrow == YRd[
RSRC_] ) || ( YRd[
RSRC_] < 0 ) )
439 {
440
441
442
443 if( Anq > 0 )
444 {
446 {
447 dset_( &Anq, ((
char *) tbeta), YR, &YRld );
448 }
449 else
450 {
451 dscal_( &Anq, ((
char *) tbeta), YR, &YRld );
452 }
453 }
454 }
455 }
456 }
457 else
458 {
459
460
461
462 if( !YCpbY )
463 {
464 if( ( mycol == YCd[
CSRC_] ) || ( YCd[
CSRC_] < 0 ) )
465 {
466
467
468
469 if( Amp > 0 )
470 {
472 {
473 dset_( &Amp, ((
char *) tbeta), YC, &ione );
474 }
475 else
476 {
477 dscal_( &Amp, ((
char *) tbeta), YC, &ione );
478 }
479 }
480 }
481 }
482 }
483
484
485
486
488 PB_Clcm( ( Arow >= 0 ? nprow : 1 ), ( Acol >= 0 ? npcol : 1 ) );
489
490 if( upper )
491 {
492 for( k = 0; k < *N; k += nb )
493 {
494 kb = *N - k; kb =
MIN( kb, nb );
495 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
496 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
497 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
498 if( Akp > 0 && Anq0 > 0 )
499 {
501 Mptr( Aptr, 0, Akq, Ald, size ), &Ald,
Mptr( XR, 0, Akq,
502 XRld, size ), &XRld, one, YC, &ione );
504 Mptr( Aptr, 0, Akq, Ald, size ), &Ald, XC, &ione, one,
505 Mptr( YR, 0, Akq, YRld, size ), &YRld );
506 }
508 Aptr, k, k, Ad0,
Mptr( XC, Akp, 0, XCld, size ), XCld,
509 Mptr( XR, 0, Akq, XRld, size ), XRld,
Mptr( YC, Akp, 0,
510 YCld, size ), YCld,
Mptr( YR, 0, Akq, YRld, size ), YRld,
512 }
513 }
514 else
515 {
516 for( k = 0; k < *N; k += nb )
517 {
518 kb = *N - k; ktmp = k + ( kb =
MIN( kb, nb ) );
519 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
520 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
522 Aptr, k, k, Ad0,
Mptr( XC, Akp, 0, XCld, size ), XCld,
523 Mptr( XR, 0, Akq, XRld, size ), XRld,
Mptr( YC, Akp, 0,
524 YCld, size ), YCld,
Mptr( YR, 0, Akq, YRld, size ), YRld,
526 Akp =
PB_Cnumroc( ktmp, 0, Aimb1, Amb, myrow, Arow, nprow );
527 Amp0 = Amp - Akp;
528 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
529 if( Amp0 > 0 && Anq0 > 0 )
530 {
532 Mptr( Aptr, Akp, Akq, Ald, size ), &Ald,
Mptr( XR, 0,
533 Akq, XRld, size ), &XRld, one,
Mptr( YC, Akp, 0, YCld,
534 size ), &ione );
536 Mptr( Aptr, Akp, Akq, Ald, size ), &Ald,
Mptr( XC, Akp,
537 0, XCld, size ), &ione, one,
Mptr( YR, 0, Akq, YRld,
538 size ), &YRld );
539 }
540 }
541 }
542 }
543 if( XCfr ) free( XC );
544 if( XRfr ) free( XR );
545
546 if( YisRow )
547 {
548
549
550
551 if( YCsum )
552 {
554 if( Amp > 0 )
555 {
558 }
559 }
560
561
562
563 if( YRsum && ( Anq > 0 ) )
564 {
567 mycol );
568 }
569
570
571
572
573 PB_Cpaxpby( type,
NOCONJG, *N, 1, one, YC, 0, 0, YCd,
COLUMN, one,
574 YR, 0, 0, YRd,
ROW );
575
576
577
578 if( YRpbY )
579 {
580 PB_Cpaxpby( type,
NOCONJG, 1, *N, one, YR, 0, 0, YRd,
ROW,
581 ((
char *)BETA), ((
char *) Y), Yi, Yj, Yd,
ROW );
582 }
583 }
584 else
585 {
586
587
588
589 if( YRsum )
590 {
592 if( Anq > 0 )
593 {
596 mycol );
597 }
598 }
599
600
601
602 if( YCsum && ( Amp > 0 ) )
603 {
607 }
608
609
610
611 PB_Cpaxpby( type,
NOCONJG, 1, *N, one, YR, 0, 0, YRd,
ROW, one,
613
614
615
616 if( YCpbY )
617 {
619 COLUMN, ((
char *)BETA), ((
char *) Y), Yi, Yj, Yd,
621 }
622 }
623 if( YCfr ) free( YC );
624 if( YRfr ) free( YR );
625
626
627
628}