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
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 char UploA;
245 Int Acol, Ai, Aii, Aimb1, Ainb1, Aj, Ajj, Akp, Akq, Ald, Amb,
246 Amp, Amp0, Anb, Anq, Anq0, Arow, XCfr, XCld, XRfr, XRld,
247 Xi, Xj, YCfr, YCld, YRfr, YRld, Yi, Yj, ctxt, info, ione=1,
248 k, kb, ktmp, mycol, myrow, nb, npcol, nprow, size, upper;
250
251
252
255 char * Aptr = NULL, * XC = NULL, * XR = NULL, * YC = NULL,
256 * YR = NULL;
257
258
259
260
265#ifndef NO_ARGCHK
266
267
268
270 if( !( info = ( ( nprow == -1 ) ? -( 701 +
CTXT_ ) : 0 ) ) )
271 {
272 if( ( !upper ) && ( UploA !=
CLOWER ) )
273 {
274 PB_Cwarn( ctxt, __LINE__,
"PSSYR2",
"Illegal UPLO = %c\n", UploA );
275 info = -1;
276 }
277 PB_Cchkvec( ctxt,
"PSSYR2",
"X", *N, 2, Xi, Xj, Xd, *INCX, 7, &info );
278 PB_Cchkvec( ctxt,
"PSSYR2",
"Y", *N, 2, Yi, Yj, Yd, *INCY, 12, &info );
279 PB_Cchkmat( ctxt,
"PSSYR2",
"A", *N, 2, *N, 2, Ai, Aj, Ad, 17, &info );
280 }
281 if( info ) {
PB_Cabort( ctxt,
"PSSYR2", info );
return; }
282#endif
283
284
285
287
288
289
290#ifdef NO_ARGCHK
292#endif
293
294
295
297
298
299
300 PB_Cdescribe( *N, *N, Ai, Aj, Ad, nprow, npcol, myrow, mycol, &Aii, &Ajj,
301 &Ald, &Aimb1, &Ainb1, &Amb, &Anb, &Arow, &Acol, Ad0 );
302
303
304
305
306 if( *INCX == Xd[
M_] )
307 {
308 PB_CInV( type,
NOCONJG,
ROW, *N, *N, Ad0, 1, ((
char *) X), Xi, Xj,
309 Xd,
ROW, &XR, XRd0, &XRfr );
310 PB_CInV( type,
NOCONJG,
COLUMN, *N, *N, Ad0, 1, XR, 0, 0,
311 XRd0,
ROW, &XC, XCd0, &XCfr );
312 }
313 else
314 {
315 PB_CInV( type,
NOCONJG,
COLUMN, *N, *N, Ad0, 1, ((
char *) X), Xi, Xj,
316 Xd,
COLUMN, &XC, XCd0, &XCfr );
317 PB_CInV( type,
NOCONJG,
ROW, *N, *N, Ad0, 1, XC, 0, 0,
318 XCd0,
COLUMN, &XR, XRd0, &XRfr );
319 }
320
321
322
323
324 if( *INCY == Yd[
M_] )
325 {
326 PB_CInV( type,
NOCONJG,
ROW, *N, *N, Ad0, 1, ((
char *) Y), Yi, Yj,
327 Yd,
ROW, &YR, YRd0, &YRfr );
328 PB_CInV( type,
NOCONJG,
COLUMN, *N, *N, Ad0, 1, YR, 0, 0,
329 YRd0,
ROW, &YC, YCd0, &YCfr );
330 }
331 else
332 {
333 PB_CInV( type,
NOCONJG,
COLUMN, *N, *N, Ad0, 1, ((
char *) Y), Yi, Yj,
334 Yd,
COLUMN, &YC, YCd0, &YCfr );
335 PB_CInV( type,
NOCONJG,
ROW, *N, *N, Ad0, 1, YC, 0, 0,
336 YCd0,
COLUMN, &YR, YRd0, &YRfr );
337 }
338
339
340
341 Amp =
PB_Cnumroc( *N, 0, Aimb1, Amb, myrow, Arow, nprow );
342 Anq =
PB_Cnumroc( *N, 0, Ainb1, Anb, mycol, Acol, npcol );
343
344 if( ( Amp > 0 ) && ( Anq > 0 ) )
345 {
347 Aptr =
Mptr( ((
char *) A), Aii, Ajj, Ald, size );
348
349 XCld = XCd0[
LLD_]; YCld = YCd0[
LLD_];
350 XRld = XRd0[
LLD_]; YRld = YRd0[
LLD_];
351
352
353
354
356 PB_Clcm( ( Arow >= 0 ? nprow : 1 ), ( Acol >= 0 ? npcol : 1 ) );
357 if( upper )
358 {
359 for( k = 0; k < *N; k += nb )
360 {
361 kb = *N - k; kb =
MIN( kb, nb );
362 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
363 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
364 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
365 if( Akp > 0 && Anq0 > 0 )
366 {
367 sger_( &Akp, &Anq0, ((
char *) ALPHA), XC, &ione,
368 Mptr( YR, 0, Akq, YRld, size ), &YRld,
369 Mptr( Aptr, 0, Akq, Ald, size ), &Ald );
370 sger_( &Akp, &Anq0, ((
char *) ALPHA), YC, &ione,
371 Mptr( XR, 0, Akq, XRld, size ), &XRld,
372 Mptr( Aptr, 0, Akq, Ald, size ), &Ald );
373 }
375 Mptr( XC, Akp, 0, XCld, size ), XCld,
376 Mptr( XR, 0, Akq, XRld, size ), XRld,
377 Mptr( YC, Akp, 0, YCld, size ), YCld,
378 Mptr( YR, 0, Akq, YRld, size ), YRld,
380 }
381 }
382 else
383 {
384 for( k = 0; k < *N; k += nb )
385 {
386 kb = *N - k; ktmp = k + ( kb =
MIN( kb, nb ) );
387 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
388 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
390 Mptr( XC, Akp, 0, XCld, size ), XCld,
391 Mptr( XR, 0, Akq, XRld, size ), XRld,
392 Mptr( YC, Akp, 0, YCld, size ), YCld,
393 Mptr( YR, 0, Akq, YRld, size ), YRld,
395 Akp =
PB_Cnumroc( ktmp, 0, Aimb1, Amb, myrow, Arow, nprow );
396 Amp0 = Amp - Akp;
397 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
398 if( Amp0 > 0 && Anq0 > 0 )
399 {
400 sger_( &Amp0, &Anq0, ((
char *) ALPHA),
401 Mptr( XC, Akp, 0, XCld, size ), &ione,
402 Mptr( YR, 0, Akq, YRld, size ), &YRld,
403 Mptr( Aptr, Akp, Akq, Ald, size ), &Ald );
404 sger_( &Amp0, &Anq0, ((
char *) ALPHA),
405 Mptr( YC, Akp, 0, YCld, size ), &ione,
406 Mptr( XR, 0, Akq, XRld, size ), &XRld,
407 Mptr( Aptr, Akp, Akq, Ald, size ), &Ald );
408 }
409 }
410 }
411 }
412 if( XRfr ) free( XR );
413 if( XCfr ) free( XC );
414 if( YRfr ) free( YR );
415 if( YCfr ) free( YC );
416
417
418
419}