134{
135 SCOTCH_Num baseval;
136 const SCOTCH_Num *vwgt2;
137 const SCOTCH_Num *vsize2;
138 SCOTCH_Num vsizval;
139 SCOTCH_Num vertnbr;
140 SCOTCH_Num vertnum;
141 SCOTCH_Num edgenum;
142 const SCOTCH_Num *edgetax;
143 const SCOTCH_Num *parttax;
144 SCOTCH_Num *nghbtab;
145 SCOTCH_Num commvol;
146
147 vsize2 = ((*wgtflag & 1) != 0) ? vsize : nullptr;
148 vwgt2 = ((*wgtflag & 2) != 0) ? vwgt : nullptr;
149 baseval = *numflag;
150 vertnbr = *n;
151 edgetax = adjncy - baseval;
152
153
154 if (vsize2 == nullptr)
155 {
156 if (
PartGraph2(n, xadj, adjncy, vwgt2,
nullptr, numflag, nparts, part,
157 SCOTCH_STRATQUALITY, 0.01) != 0)
158 {
159 return;
160 }
161 }
162
163
164 else
165 {
166 const SCOTCH_Num *vsiztax;
167 SCOTCH_Num edgenbr;
168 SCOTCH_Num *edlotax;
169 int o;
170
171 edgenbr = xadj[vertnbr] - baseval;
172 if ((edlotax = (SCOTCH_Num *)malloc(edgenbr * sizeof(SCOTCH_Num))) ==
173 nullptr)
174 {
175 return;
176 }
177
178 edlotax -= baseval;
179 vsiztax = vsize2 - baseval;
180
181
182 for (vertnum = 0, edgenum = baseval; vertnum < vertnbr; vertnum++)
183 {
184 SCOTCH_Num vsizval;
185 SCOTCH_Num edgennd;
186
187 vsizval = vsize2[vertnum];
188
189 for (edgennd = xadj[vertnum + 1]; edgenum < edgennd; edgenum++)
190 {
191
192 SCOTCH_Num vertend;
193
194 vertend = edgetax[edgenum];
195 edlotax[edgenum] = vsizval + vsiztax[vertend];
196 }
197 }
198
199 o =
PartGraph2(n, xadj, adjncy, vwgt2, edlotax + baseval, numflag,
200 nparts, part, SCOTCH_STRATQUALITY, 0.01);
201
202 free(edlotax + baseval);
203
204 if (o != 0)
205 {
206 return;
207 }
208 }
209
210 if ((nghbtab = (SCOTCH_Num *)malloc(*nparts * sizeof(SCOTCH_Num))) ==
211 nullptr)
212 {
213 return;
214 }
215
216 memset(nghbtab, ~0, *nparts * sizeof(SCOTCH_Num));
217
218 parttax = part - baseval;
219 vsizval = 1;
220
221
222 for (vertnum = 0, edgenum = baseval, commvol = 0; vertnum < vertnbr;
223 vertnum++)
224 {
225 SCOTCH_Num partval;
226 SCOTCH_Num edgennd;
227
228 partval = part[vertnum];
229 nghbtab[partval] = vertnum;
230
231 if (vsize2 != nullptr)
232 {
233 vsizval = vsize2[vertnum];
234 }
235
236
237 for (edgennd = xadj[vertnum + 1]; edgenum < edgennd; edgenum++)
238 {
239 SCOTCH_Num vertend;
240 SCOTCH_Num partend;
241
242 vertend = edgetax[edgenum];
243 partend = parttax[vertend];
244
245
246 if (nghbtab[partend] != vertnum)
247 {
248 nghbtab[partend] = vertnum;
249 commvol += vsizval;
250 }
251 }
252 }
253 *volume = commvol;
254
255 free(nghbtab);
256}
int PartGraph2(const SCOTCH_Num *const n, const SCOTCH_Num *const xadj, const SCOTCH_Num *const adjncy, const SCOTCH_Num *const vwgt, const SCOTCH_Num *const adjwgt, const SCOTCH_Num *const numflag, const SCOTCH_Num *const nparts, SCOTCH_Num *const part, SCOTCH_Num flagval, double kbalval)