39{
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 char type;
183 Int Acol, Aii, Aimb1, Ainb1, Ajj, Akp, Akq, Ald, Amb, Amp, Amp0,
184 Anb, Anq, Anq0, Arow, ctxt, izero=0, k, kb, ktmp, mn, mycol,
185 myrow, nb, npcol, nprow, size;
187
188
189
191 char * Aptr = NULL;
192
193
194
195
196
197
198
199 if( ( M <= 0 ) || ( N <= 0 ) ) return;
200
201
202
204
205
206
207 PB_Cdescribe( M, N, IA, JA, DESCA, nprow, npcol, myrow, mycol, &Aii, &Ajj,
208 &Ald, &Aimb1, &Ainb1, &Amb, &Anb, &Arow, &Acol, Ad0 );
209
210
211
212 Amp =
PB_Cnumroc( M, 0, Aimb1, Amb, myrow, Arow, nprow );
213 Anq =
PB_Cnumroc( N, 0, Ainb1, Anb, mycol, Acol, npcol );
214 if( ( Amp <= 0 ) || ( Anq <= 0 ) ) return;
215
216 size =
TYPE->size; type =
TYPE->type; pad =
TYPE->Ftzpad;
217 Aptr =
Mptr( A, Aii, Ajj, Ald, size );
218
219
220
221
223 {
227 ( ( ( Arow < 0 ) || ( nprow == 1 ) ) &&
228 ( ( Acol < 0 ) || ( npcol == 1 ) ) ) )
229 {
231 BETA, Aptr, &Ald );
232 return;
233 }
234 }
235 else if( type ==
DREAL )
236 {
240 ( ( ( Arow < 0 ) || ( nprow == 1 ) ) &&
241 ( ( Acol < 0 ) || ( npcol == 1 ) ) ) )
242 {
244 BETA, Aptr, &Ald );
245 return;
246 }
247 }
248 else if( type ==
SCPLX )
249 {
255 ( ( ( Arow < 0 ) || ( nprow == 1 ) ) &&
256 ( ( Acol < 0 ) || ( npcol == 1 ) ) ) )
257 {
259 BETA, Aptr, &Ald );
260 return;
261 }
262 }
263 else if( type ==
DCPLX )
264 {
270 ( ( ( Arow < 0 ) || ( nprow == 1 ) ) &&
271 ( ( Acol < 0 ) || ( npcol == 1 ) ) ) )
272 {
274 BETA, Aptr, &Ald );
275 return;
276 }
277 }
278
279
280
281
282
284 PB_Clcm( ( Arow >= 0 ? nprow : 1 ), ( Acol >= 0 ? npcol : 1 ) );
285
287
289 {
290
291
292
293
294
295 for( k = 0; k < mn; k += nb )
296 {
297 kb = mn - k; ktmp = k + ( kb =
MIN( kb, nb ) );
298 PB_Cplapd2(
TYPE, UPLO, CONJUG, kb, kb, ALPHA, BETA, Aptr, k, k, Ad0 );
299 Akp =
PB_Cnumroc( ktmp, 0, Aimb1, Amb, myrow, Arow, nprow );
300 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
301 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
302 if( ( Amp0 = Amp - Akp ) > 0 )
304 ALPHA, ALPHA,
Mptr( Aptr, Akp, Akq, Ald, size ), &Ald );
305 }
306 }
308 {
309
310
311
312
313
314
315 for( k = 0; k < mn; k += nb )
316 {
317 kb = mn - k; kb =
MIN( kb, nb );
318 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
319 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
320 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
321 if( Akp > 0 )
323 ALPHA, ALPHA,
Mptr( Aptr, 0, Akq, Ald, size ), &Ald );
324 PB_Cplapd2(
TYPE, UPLO, CONJUG, kb, kb, ALPHA, BETA, Aptr, k, k, Ad0 );
325 }
326 if( ( Anq -= ( Akq += Anq0 ) ) > 0 )
328 ALPHA,
Mptr( Aptr, 0, Akq, Ald, size ), &Ald );
329 }
330 else
331 {
332
333
334
335
336
337
338 for( k = 0; k < mn; k += nb )
339 {
340 kb = mn - k; kb =
MIN( kb, nb );
341 Akp =
PB_Cnumroc( k, 0, Aimb1, Amb, myrow, Arow, nprow );
342 Akq =
PB_Cnumroc( k, 0, Ainb1, Anb, mycol, Acol, npcol );
343 Anq0 =
PB_Cnumroc( kb, k, Ainb1, Anb, mycol, Acol, npcol );
344 if( Akp > 0 )
346 ALPHA, ALPHA,
Mptr( Aptr, 0, Akq, Ald, size ), &Ald );
347 PB_Cplapd2(
TYPE, UPLO,
NOCONJG, kb, kb, ALPHA, BETA, Aptr, k, k,
348 Ad0 );
349 Akp =
PB_Cnumroc( k+kb, 0, Aimb1, Amb, myrow, Arow, nprow );
350 if( ( Amp0 = Amp - Akp ) > 0 )
352 ALPHA, ALPHA,
Mptr( Aptr, Akp, Akq, Ald, size ), &Ald );
353 }
354 if( ( Anq -= ( Akq += Anq0 ) ) > 0 )
356 ALPHA,
Mptr( Aptr, 0, Akq, Ald, size ), &Ald );
357 }
358
359
360
361}