29{
30
31
32
33
34
35
36
37
38
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 Int ilocblk, mydist, nblocks;
92
93
94
95
96 if( ( SRCPROC == -1 ) || ( NPROCS == 1 ) )
97
98
99
100
101 return( 0 );
102
103
104
105 if( ( INB -= I ) <= 0 )
106 {
107
108
109
110
111 nblocks = ( -INB ) / NB + 1;
112 SRCPROC += nblocks;
113 SRCPROC -= ( SRCPROC / NPROCS ) * NPROCS;
114 INB += nblocks * NB;
115 }
116
117
118
119
120 if( N <= INB ) return( 0 );
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 nblocks = ( N - INB ) / NB + 1;
136
137 if( PROC == SRCPROC )
138 {
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159 if( nblocks < NPROCS ) return( N - INB );
160
161 ilocblk = nblocks / NPROCS;
162 return( ( ( nblocks - ilocblk * NPROCS ) ? N - INB - ilocblk * NB :
163 ( nblocks - ilocblk ) * NB ) );
164 }
165 else
166 {
167
168
169
170 if( ( mydist = PROC - SRCPROC ) < 0 ) mydist += NPROCS;
171
172
173
174 if( mydist == NPROCS - 1 ) return( 0 );
175
176
177
178
179
180
181
182
183
184 if( nblocks < NPROCS )
185 return( ( ( mydist < nblocks ) ? N - mydist * NB - INB : 0 ) );
186
187 ilocblk = nblocks / NPROCS;
188 return( ( ( mydist >= ( nblocks - ilocblk * NPROCS ) ) ?
189 ( NPROCS - 1 - mydist ) * ilocblk * NB :
190 N - INB - ( ilocblk * mydist + ilocblk + mydist )*NB ) );
191 }
192
193
194
195}