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