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