28{
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 Int ilocblk, mydist, nblocks, proc;
77
78
79
80
81
82
83
84
85 if( ( SRCPROC == -1 ) || ( NPROCS == 1 ) ) return( IG );
86
87
88
89 if( IG < INB ) return( ( MYPROC == SRCPROC ? IG : 0 ) );
90
91
92
93
94
95
96
97
98
99
100
101
102
103 if( MYPROC == SRCPROC )
104 {
105
106
107
108
109 nblocks = ( IG - INB ) / NB + 1;
110 if( nblocks < NPROCS ) return( INB );
111
112
113
114
115 proc = SRCPROC + nblocks;
116 proc -= ( proc / NPROCS ) * NPROCS;
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 ilocblk = nblocks / NPROCS;
136 if( ilocblk * NPROCS >= nblocks )
137 return( ( ( MYPROC == proc ) ? IG + ( ilocblk - nblocks ) * NB :
138 INB + ( ilocblk - 1 ) * NB ) );
139 else
140 return( INB + ilocblk * NB );
141 }
142 else
143 {
144
145
146
147
148 nblocks = ( IG -= INB ) / NB + 1;
149 proc = SRCPROC + nblocks;
150 proc -= ( proc / NPROCS ) * NPROCS;
151
152
153
154
155 if( ( mydist = MYPROC - SRCPROC ) < 0 ) mydist += NPROCS;
156
157
158
159
160
161
162
163
164 if( nblocks < NPROCS )
165 {
166 mydist -= nblocks;
167 return( ( ( mydist < 0 ) ? NB :
168 ( ( MYPROC == proc ) ? IG + ( 1 - nblocks ) * NB : 0 ) ) );
169 }
170 else
171 {
172 ilocblk = nblocks / NPROCS;
173 mydist -= nblocks - ilocblk * NPROCS;
174 return( ( ( mydist < 0 ) ? ( ilocblk + 1 ) * NB :
175 ( ( MYPROC == proc ) ?
176 ( ilocblk - nblocks + 1 ) * NB + IG : ilocblk * NB ) ) );
177 }
178 }
179
180
181
182}