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