91{
92 SCOTCH_Num baseval;
93 const SCOTCH_Num *vwgt2;
94 const SCOTCH_Num *vsize2;
95 SCOTCH_Num vsizval;
96 SCOTCH_Num vertnbr;
97 SCOTCH_Num vertnum;
98 SCOTCH_Num edgenum;
99 const SCOTCH_Num *edgetax;
100 const SCOTCH_Num *parttax;
101 SCOTCH_Num *nghbtab;
102 SCOTCH_Num commvol;
103
104 vsize2 = ((*wgtflag & 1) != 0) ? vsize : nullptr;
105 vwgt2 = ((*wgtflag & 2) != 0) ? vwgt : nullptr;
106 baseval = *numflag;
107 vertnbr = *n;
108 edgetax = adjncy - baseval;
109
110
111 if (vsize2 == nullptr)
112 {
113 if (
PartGraph2(n, xadj, adjncy, vwgt2,
nullptr, numflag, nparts, part,
114 SCOTCH_STRATQUALITY, 0.01) != 0)
115 {
116 return;
117 }
118 }
119
120
121 else
122 {
123 const SCOTCH_Num *vsiztax;
124 SCOTCH_Num edgenbr;
125 SCOTCH_Num *edlotax;
126 int o;
127
128 edgenbr = xadj[vertnbr] - baseval;
129 if ((edlotax = (SCOTCH_Num *)malloc(edgenbr * sizeof(SCOTCH_Num))) ==
130 nullptr)
131 {
132 return;
133 }
134
135 edlotax -= baseval;
136 vsiztax = vsize2 - baseval;
137
138
139 for (vertnum = 0, edgenum = baseval; vertnum < vertnbr; vertnum++)
140 {
141 SCOTCH_Num vsizval;
142 SCOTCH_Num edgennd;
143
144 vsizval = vsize2[vertnum];
145
146 for (edgennd = xadj[vertnum + 1]; edgenum < edgennd; edgenum++)
147 {
148
149 SCOTCH_Num vertend;
150
151 vertend = edgetax[edgenum];
152 edlotax[edgenum] = vsizval + vsiztax[vertend];
153 }
154 }
155
156 o =
PartGraph2(n, xadj, adjncy, vwgt2, edlotax + baseval, numflag,
157 nparts, part, SCOTCH_STRATQUALITY, 0.01);
158
159 free(edlotax + baseval);
160
161 if (o != 0)
162 {
163 return;
164 }
165 }
166
167 if ((nghbtab = (SCOTCH_Num *)malloc(*nparts * sizeof(SCOTCH_Num))) ==
168 nullptr)
169 {
170 return;
171 }
172
173 memset(nghbtab, ~0, *nparts * sizeof(SCOTCH_Num));
174
175 parttax = part - baseval;
176 vsizval = 1;
177
178
179 for (vertnum = 0, edgenum = baseval, commvol = 0; vertnum < vertnbr;
180 vertnum++)
181 {
182 SCOTCH_Num partval;
183 SCOTCH_Num edgennd;
184
185 partval = part[vertnum];
186 nghbtab[partval] = vertnum;
187
188 if (vsize2 != nullptr)
189 {
190 vsizval = vsize2[vertnum];
191 }
192
193
194 for (edgennd = xadj[vertnum + 1]; edgenum < edgennd; edgenum++)
195 {
196 SCOTCH_Num vertend;
197 SCOTCH_Num partend;
198
199 vertend = edgetax[edgenum];
200 partend = parttax[vertend];
201
202
203 if (nghbtab[partend] != vertnum)
204 {
205 nghbtab[partend] = vertnum;
206 commvol += vsizval;
207 }
208 }
209 }
210 *volume = commvol;
211
212 free(nghbtab);
213}
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)