28{
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 Int GoEast, GoSouth, Pmb, Qnb, gcdb, ilow, imbloc, inbloc, iupp,
52 kmax, kmin, k1, k2, k3, lcmb, lcmp, lcmq, lcmt, lcmt00,
53 lmbloc, lnbloc, low, l1, l2, l3, m, mb, mblkd, mblks, mbloc,
54 n, nb, nblkd, nblks, nbloc, nlcmblks, npcol, npq=0, nprow,
55 tmp1, tmp2, upp;
56
57
58
59
60 m = VM->
mp; n = VM->
nq;
61
62
63
64 if( ( m == 0 ) || ( n == 0 ) ) return( 0 );
65
66
67
68
71
72 if( ( ( VM->
offd == 0 ) && ( VM->
imb1 == VM->
inb1 ) && ( mb == nb ) &&
73 ( nprow == npcol ) ) || ( ( nprow == 1 ) && ( npcol == 1 ) ) )
74 {
76 else return( 0 );
77 }
78
79
80
87 Pmb = nprow * mb;
88 Qnb = npcol * nb;
89
90
91
92
93
94 GoSouth = ( lcmt00 > iupp );
95 GoEast = ( lcmt00 < ilow );
96
97
98
99 if( !( GoSouth ) && !( GoEast ) )
100 {
101
102
103
104 npq += ( lcmt00 >= 0 ?
105 ( ( tmp2 = ( tmp1 = imbloc - lcmt00 ) > 0 ? tmp1 : 0 ) < inbloc ?
106 tmp2 : inbloc ) :
107 ( ( tmp2 = ( tmp1 = inbloc + lcmt00 ) > 0 ? tmp1 : 0 ) > imbloc ?
108 imbloc : tmp2 ) );
109
110
111
112
113
114 GoSouth = !( GoEast = ( ( lcmt00 - ( iupp - upp + Pmb ) ) < ilow ) );
115 }
116
117 if( GoSouth )
118 {
119
120
121
122 lcmt00 -= iupp - upp + Pmb; mblks--;
123
124
125
126
127 while( mblks && ( lcmt00 > upp ) ) { lcmt00 -= Pmb; mblks--; }
128
129
130
131 if( mblks <= 0 ) return( npq );
132
133
134
135
136
137
138 lcmt = lcmt00; mblkd = mblks; mbloc = mb;
139
140 while( mblkd && ( lcmt >= ilow ) )
141 {
142
143
144
145 if( mblkd == 1 ) mbloc = lmbloc;
146 npq += ( lcmt >= 0 ?
147 ( ( tmp2 = ( tmp1 = mbloc - lcmt ) > 0 ? tmp1 : 0 ) < inbloc ?
148 tmp2 : inbloc ) :
149 ( ( tmp2 = ( tmp1 = inbloc + lcmt ) > 0 ? tmp1 : 0 ) > mbloc ?
150 mbloc : tmp2 ) );
151
152
153
154 lcmt00 = lcmt; lcmt -= Pmb; mblks = mblkd--;
155 }
156
157
158
159 lcmt00 += low - ilow + Qnb; nblks--;
160 }
161 else if( GoEast )
162 {
163
164
165
166 lcmt00 += low - ilow + Qnb; nblks--;
167
168
169
170
171 while( nblks && ( lcmt00 < low ) ) { lcmt00 += Qnb; nblks--; }
172
173
174
175 if( nblks <= 0 ) return( npq );
176
177
178
179
180
181 lcmt = lcmt00; nblkd = nblks; nbloc = nb;
182
183 while( nblkd && ( lcmt <= iupp ) )
184 {
185
186
187
188 if( nblkd == 1 ) nbloc = lnbloc;
189 npq += ( lcmt >= 0 ?
190 ( ( tmp2 = ( tmp1 = imbloc - lcmt ) > 0 ? tmp1 : 0 ) < nbloc ?
191 tmp2 : nbloc ) :
192 ( ( tmp2 = ( tmp1 = nbloc + lcmt ) > 0 ? tmp1 : 0 ) > imbloc ?
193 imbloc : tmp2 ) );
194
195
196
197 lcmt00 = lcmt; lcmt += Qnb; nblks = nblkd--;
198 }
199
200
201
202 lcmt00 -= iupp - upp + Pmb; mblks--;
203 }
204
205
206
207
208 if( lcmt00 < low || lcmt00 > upp )
209 {
210 while( mblks && nblks )
211 {
212 while( mblks && ( lcmt00 > upp ) ) { lcmt00 -= Pmb; mblks--; }
213 if( lcmt00 >= low ) break;
214 while( nblks && ( lcmt00 < low ) ) { lcmt00 += Qnb; nblks--; }
215 if( lcmt00 <= upp ) break;
216 }
217 }
218 if( !( mblks ) || !( nblks ) ) return( npq );
219
220
221
222 gcdb = ( Pmb * Qnb ) / lcmb;
223
224 if( lcmt00 > 0 )
225 {
226 kmin = - ( lcmb / gcdb );
227 kmax = ( lcmb - Qnb ) / gcdb;
228 tmp1 = ( mblks - 1 ) / ( lcmp = lcmb / Pmb );
229 tmp2 = nblks / ( lcmq = lcmb / Qnb );
230 }
231 else if( lcmt00 < 0 )
232 {
233 kmin = - ( ( lcmb - Pmb ) / gcdb );
234 kmax = lcmb / gcdb;
235 tmp1 = mblks / ( lcmp = lcmb / Pmb );
236 tmp2 = ( nblks - 1 ) / ( lcmq = lcmb / Qnb );
237 }
238 else
239 {
240 kmin = - ( ( lcmb - Pmb ) / gcdb );
241 kmax = ( lcmb - Qnb ) / gcdb;
242 tmp1 = mblks / ( lcmp = lcmb / Pmb );
243 tmp2 = nblks / ( lcmq = lcmb / Qnb );
244 }
245
246
247
248 nlcmblks =
MIN( tmp1, tmp2 );
249 if( nlcmblks ) nlcmblks--;
250
251
252
253 if( nlcmblks )
254 {
255 tmp2 = 0;
256
257 k1 = -lcmt00; k1 =
ICEIL( k1, gcdb ); l1 = k1 - 1;
258 l1 =
MIN( l1, kmax ); k1 =
MAX( k1, kmin );
259
260 k3 = upp - lcmt00; k3 =
FLOOR( k3, gcdb ); k3 =
MIN( k3, kmax );
261 l3 = low - lcmt00; l3 =
ICEIL( l3, gcdb ); l3 =
MAX( l3, kmin );
262
263 if( k1 <= k3 )
264 {
265 k2 = mb - nb - lcmt00;
266 k2 =
ICEIL( k2, gcdb );
267
268 if( k2 < k1 )
269 {
270
271
272
273 tmp1 = k3 - k1 + 1;
274 tmp2 = tmp1 * ( mb - lcmt00 );
275 tmp1 *= ( k3 + k1 )*gcdb;
276 tmp2 += ( tmp1 > 0 ? -( tmp1 / 2 ) : (-tmp1) / 2 );
277 }
278 else if( k2 > k3 )
279 {
280
281
282
283 tmp2 = ( k3 - k1 + 1 ) * nb;
284 }
285 else
286 {
287
288
289
290 tmp1 = k3 - k2 + 1;
291 tmp2 = ( k2 - k1 ) * nb + tmp1 * ( mb - lcmt00 );
292 tmp1 *= ( k3 + k2 ) * gcdb;
293 tmp2 += ( tmp1 > 0 ? -( tmp1 / 2 ) : (-tmp1) / 2 );
294 }
295 }
296
297 if( l3 <= l1 )
298 {
299 l2 = mb - nb - lcmt00;
300 l2 =
FLOOR( l2, gcdb );
301
302 if( l2 > l1 )
303 {
304
305
306
307 tmp1 = l1 - l3 + 1;
308 tmp2 += tmp1 * ( nb + lcmt00 );
309 tmp1 *= ( l3 + l1 ) * gcdb;
310 tmp2 += ( tmp1 > 0 ? ( tmp1 / 2 ) : -( (-tmp1) / 2 ) );
311 }
312 else if( l2 < l3 )
313 {
314
315
316
317 tmp2 += ( l1 - l3 + 1 ) * mb;
318 }
319 else
320 {
321
322
323
324 tmp1 = l2 - l3 + 1;
325 tmp2 += ( l1 - l2 ) * mb + tmp1 * ( nb + lcmt00 );
326 tmp1 *= ( l3 + l2 ) * gcdb;
327 tmp2 += ( tmp1 > 0 ? ( tmp1 / 2 ) : -( (-tmp1) / 2 ) );
328 }
329 }
330 npq += nlcmblks * tmp2;
331
332 mblks -= nlcmblks * lcmp;
333 nblks -= nlcmblks * lcmq;
334 }
335
336
337
338 nbloc = nb;
339 while( nblks )
340 {
341
342
343
344
345
346 if( nblks == 1 ) nbloc = lnbloc;
347 while( mblks && lcmt00 > upp ) { lcmt00 -= Pmb; mblks--; }
348
349 if( mblks <= 0 ) return( npq );
350
351 lcmt = lcmt00; mblkd = mblks; mbloc = mb;
352
353 while( mblkd && ( lcmt >= low ) )
354 {
355
356
357
358 if( mblkd == 1 ) mbloc = lmbloc;
359 npq += ( lcmt >= 0 ?
360 ( ( tmp2 = ( tmp1 = mbloc - lcmt ) > 0 ? tmp1 : 0 ) < nbloc ?
361 tmp2 : nbloc ) :
362 ( ( tmp2 = ( tmp1 = nbloc + lcmt ) > 0 ? tmp1 : 0 ) > mbloc ?
363 mbloc : tmp2 ) );
364
365
366
367 lcmt00 = lcmt; lcmt -= Pmb; mblks = mblkd--;
368 }
369
370
371
372 lcmt00 += Qnb; nblks--;
373
374
375
376 }
377
378
379
380 return( npq );
381
382
383
384}