39{
40
41
42
43 char UploA, herm;
44 Int Acol, Aii, Aimb1, Ainb1, Aoffi, Ajj, Ald, Amb, Amp, Anb, Anq,
45 Aoffj, Arcol, Arow, Arrow, GoEast, GoSouth, iimax, ilow,
46 imbloc, inbloc, ioffd, iupp, izero=0, jjmax, joffd, lcmt,
47 lcmt00, lmbloc, lnbloc, low, lower, m1, mbloc, mblkd, mblks,
48 mycol, myrow, n1, nbloc, nblkd, nblks, npcol, nprow, pmb, qnb,
49 size, tmp1, upp, upper;
51
52
53
54
55
56
57
58 if( ( M <= 0 ) || ( N <= 0 ) ) return;
59
60
61
63
64
65
66 PB_Cainfog2l( M, N, IA, JA, DESCA, nprow, npcol, myrow, mycol, &Aimb1,
67 &Ainb1, &Amp, &Anq, &Aii, &Ajj, &Arow, &Acol, &Arrow, &Arcol );
68
69
70
71 if( ( Amp <= 0 ) || ( Anq <= 0 ) ) return;
72
73
74
75
76 Amb = DESCA[
MB_ ]; Anb = DESCA[
NB_ ]; Ald = DESCA[
LLD_];
77 PB_Cbinfo( 0, Amp, Anq, Aimb1, Ainb1, Amb, Anb, Arrow, Arcol, &lcmt00,
78 &mblks, &nblks, &imbloc, &inbloc, &lmbloc, &lnbloc, &ilow, &low,
79 &iupp, &upp );
80
81 iimax = ( Aoffi = Aii - 1 ) + ( m1 = Amp );
82 jjmax = ( Aoffj = Ajj - 1 ) + ( n1 = Anq );
83 pmb = ( ( ( Arow < 0 ) || ( nprow == 1 ) ) ? Amb : nprow * Amb );
84 qnb = ( ( ( Acol < 0 ) || ( npcol == 1 ) ) ? Anb : npcol * Anb );
85
86 size =
TYPE->size; pad =
TYPE->Ftzpad;
89 upper = ( UploA !=
CLOWER );
90 lower = ( UploA !=
CUPPER );
91
92
93
94
95
96 GoSouth = ( lcmt00 > iupp );
97 GoEast = ( lcmt00 < ilow );
98
99
100
101 if( ( !( GoSouth ) ) && ( !( GoEast ) ) )
102 {
103
104
105
107 ALPHA, BETA,
Mptr( A, Aii, Ajj, Ald, size ), &Ald );
108
109
110
111
112
113 GoSouth = !( GoEast = ( ( lcmt00 - ( iupp - upp + pmb ) ) < ilow ) );
114
115 if( GoSouth )
116 {
117
118
119
120
121
122 if( upper && ( Anq > inbloc ) )
123 {
124 tmp1 = Anq - inbloc;
126 ALPHA, ALPHA,
Mptr( A, Aii, Ajj+inbloc, Ald, size ), &Ald );
127 }
128 Aii += imbloc;
129 m1 -= imbloc;
130 }
131 else
132 {
133
134
135
136
137
138 if( lower && ( Amp > imbloc ) )
139 {
140 tmp1 = Amp - imbloc;
142 ALPHA, ALPHA,
Mptr( A, Aii+imbloc, Ajj, Ald, size ), &Ald );
143 }
144 Ajj += inbloc;
145 n1 -= inbloc;
146 }
147 }
148
149 if( GoSouth )
150 {
151
152
153
154
155 lcmt00 -= ( iupp - upp + pmb ); mblks--; Aoffi += imbloc;
156
157
158
159
160 while( ( mblks > 0 ) && ( lcmt00 > upp ) )
161 { lcmt00 -= pmb; mblks--; Aoffi += Amb; }
162
163
164
165 tmp1 =
MIN( Aoffi, iimax ) - Aii + 1;
166 if( upper && ( tmp1 > 0 ) )
167 {
169 ALPHA,
Mptr( A, Aii, Aoffj+1, Ald, size ), &Ald );
170 Aii += tmp1;
171 m1 -= tmp1;
172 }
173
174
175
176 if( mblks <= 0 ) return;
177
178
179
180
181
182
183 lcmt = lcmt00; mblkd = mblks; ioffd = Aoffi;
184
185 mbloc = Amb;
186 while( ( mblkd > 0 ) && ( lcmt >= ilow ) )
187 {
188
189
190
191 if( mblkd == 1 ) mbloc = lmbloc;
193 ALPHA, BETA,
Mptr( A, ioffd+1, Aoffj+1, Ald, size ), &Ald );
194 lcmt00 = lcmt;
195 lcmt -= pmb;
196 mblks = mblkd;
197 mblkd--;
198 Aoffi = ioffd;
199 ioffd += mbloc;
200 }
201
202
203
204 tmp1 = m1 - ioffd + Aii - 1;
205 if( lower && ( tmp1 > 0 ) )
207 ALPHA,
Mptr( A, ioffd+1, Aoffj+1, Ald, size ), &Ald );
208
209 tmp1 = Aoffi - Aii + 1;
210 m1 -= tmp1;
211 n1 -= inbloc;
212 lcmt00 += low - ilow + qnb;
213 nblks--;
214 Aoffj += inbloc;
215
216
217
218
219 if( upper && ( tmp1 > 0 ) && ( n1 > 0 ) )
221 ALPHA,
Mptr( A, Aii, Aoffj+1, Ald, size ), &Ald );
222 Aii = Aoffi + 1;
223 Ajj = Aoffj + 1;
224 }
225 else if( GoEast )
226 {
227
228
229
230
231 lcmt00 += low - ilow + qnb; nblks--; Aoffj += inbloc;
232
233
234
235
236 while( ( nblks > 0 ) && ( lcmt00 < low ) )
237 { lcmt00 += qnb; nblks--; Aoffj += Anb; }
238
239
240
241 tmp1 =
MIN( Aoffj, jjmax ) - Ajj + 1;
242 if( lower && ( tmp1 > 0 ) )
243 {
245 ALPHA,
Mptr( A, Aii, Ajj, Ald, size ), &Ald );
246 Ajj += tmp1;
247 n1 -= tmp1;
248 }
249
250
251
252 if( nblks <= 0 ) return;
253
254
255
256
257
258
259 lcmt = lcmt00; nblkd = nblks; joffd = Aoffj;
260
261 nbloc = Anb;
262 while( ( nblkd > 0 ) && ( lcmt <= iupp ) )
263 {
264
265
266
267 if( nblkd == 1 ) nbloc = lnbloc;
269 ALPHA, BETA,
Mptr( A, Aii, joffd+1, Ald, size ), &Ald );
270 lcmt00 = lcmt;
271 lcmt += qnb;
272 nblks = nblkd;
273 nblkd--;
274 Aoffj = joffd;
275 joffd += nbloc;
276 }
277
278
279
280 tmp1 = n1 - joffd + Ajj - 1;
281 if( upper && ( tmp1 > 0 ) )
283 ALPHA,
Mptr( A, Aii, joffd+1, Ald, size ), &Ald );
284
285 tmp1 = Aoffj - Ajj + 1;
286 m1 -= imbloc;
287 n1 -= tmp1;
288 lcmt00 -= ( iupp - upp + pmb );
289 mblks--;
290 Aoffi += imbloc;
291
292
293
294
295 if( lower && ( m1 > 0 ) && ( tmp1 > 0 ) )
297 ALPHA,
Mptr( A, Aoffi+1, Ajj, Ald, size ), &Ald );
298 Aii = Aoffi + 1;
299 Ajj = Aoffj + 1;
300 }
301
302
303
304 nbloc = Anb;
305 while( nblks > 0 )
306 {
307 if( nblks == 1 ) nbloc = lnbloc;
308
309
310
311
312 while( ( mblks > 0 ) && ( lcmt00 > upp ) )
313 { lcmt00 -= pmb; mblks--; Aoffi += Amb; }
314
315
316
317 tmp1 =
MIN( Aoffi, iimax ) - Aii + 1;
318 if( upper && ( tmp1 > 0 ) )
319 {
321 ALPHA,
Mptr( A, Aii, Aoffj+1, Ald, size ), &Ald );
322 Aii += tmp1;
323 m1 -= tmp1;
324 }
325
326
327
328 if( mblks <= 0 ) return;
329
330
331
332
333
334
335 lcmt = lcmt00; mblkd = mblks; ioffd = Aoffi;
336
337 mbloc = Amb;
338 while( ( mblkd > 0 ) && ( lcmt >= low ) )
339 {
340
341
342
343 if( mblkd == 1 ) mbloc = lmbloc;
345 BETA,
Mptr( A, ioffd+1, Aoffj+1, Ald, size ), &Ald );
346 lcmt00 = lcmt;
347 lcmt -= pmb;
348 mblks = mblkd;
349 mblkd--;
350 Aoffi = ioffd;
351 ioffd += mbloc;
352 }
353
354
355
356 tmp1 = m1 - ioffd + Aii - 1;
357 if( lower && ( tmp1 > 0 ) )
359 ALPHA,
Mptr( A, ioffd+1, Aoffj+1, Ald, size ), &Ald );
360
361 tmp1 =
MIN( Aoffi, iimax ) - Aii + 1;
362 m1 -= tmp1;
363 n1 -= nbloc;
364 lcmt00 += qnb;
365 nblks--;
366 Aoffj += nbloc;
367
368
369
370
371 if( upper && ( tmp1 > 0 ) && ( n1 > 0 ) )
373 ALPHA,
Mptr( A, Aii, Aoffj+1, Ald, size ), &Ald );
374 Aii = Aoffi + 1;
375 Ajj = Aoffj + 1;
376 }
377
378
379
380}