115 MMG5_pSol fields,MMG5_int* permNodGlob) {
120 SCOTCH_Num *vertTab, *edgeTab, *permVrtTab;
122 MMG5_int vertNbr, nodeGlbIdx, tetraIdx, ballTetIdx;
126 MMG5_int *vertOldTab, *permNodTab, nereal, npreal;
136 for(tetraIdx = 1 ; tetraIdx <
mesh->ne + 1 ; tetraIdx++) {
139 if (!
mesh->tetra[tetraIdx].v[0])
continue;
140 vertOldTab[tetraIdx] = ++vertNbr;
143 if ( vertNbr/2 < 0 ) {
154 if (!memset(vertTab, ~0,
sizeof(SCOTCH_Num)*(vertNbr + 2))) {
155 perror(
" ## Memory problem: memset");
174 for(tetraIdx = 1 ; tetraIdx <
mesh->ne + 1 ; tetraIdx++) {
177 if (!
mesh->tetra[tetraIdx].v[0])
continue;
179 iadr = 4*(tetraIdx-1) + 1;
180 adja = &
mesh->adja[iadr];
181 for (i=0; i<4; i++) {
182 ballTetIdx = adja[i];
184 if (!ballTetIdx)
continue;
189 if (vertTab[vertOldTab[tetraIdx]] < 0)
190 vertTab[vertOldTab[tetraIdx]] = edgeNbr;
193 if (edgeNbr >= edgeSiz) {
194 MMG5_int oldsize = edgeSiz;
203 edgeTab[edgeNbr++] = vertOldTab[ballTetIdx];
206 vertTab[vertNbr+1] = edgeNbr;
209 for(tetraIdx = 1 ; tetraIdx <
mesh->ne + 1 ; tetraIdx++) {
212 if (!
mesh->tetra[tetraIdx].v[0])
continue;
213 if (vertTab[vertOldTab[tetraIdx]] < 0) {
214 if(vertOldTab[tetraIdx] == vertNbr) {
215 fprintf(stderr,
" ## Warning: %s: graph error, no renumbering.\n",
221 if(vertTab[vertOldTab[tetraIdx] + 1] > 0)
222 vertTab[vertOldTab[tetraIdx]] = vertTab[vertOldTab[tetraIdx] + 1];
224 if(vertOldTab[tetraIdx]+1 == vertNbr) {
225 fprintf(stderr,
" ## Warning: %s: graph error, no renumbering.\n",
234 }
while((vertTab[vertOldTab[tetraIdx] + i] < 0) && ((vertOldTab[tetraIdx] + i) < vertNbr));
235 if(vertOldTab[tetraIdx] + i == vertNbr) {
236 fprintf(stderr,
" ## Warning: %s: graph error, no renumbering.\n",
242 vertTab[vertOldTab[tetraIdx]] = vertTab[vertOldTab[tetraIdx] + i];
251 SCOTCH_graphInit(&graf) ;
252 CHECK_SCOTCH(SCOTCH_graphBuild(&graf, (SCOTCH_Num) 1, vertNbr, vertTab+1,
253 NULL, NULL, NULL, edgeNbr, edgeTab+1, NULL),
254 "scotch_graphbuild", 0) ;
257 if (
mesh->info.imprim > 6 ||
mesh->info.ddebug )
258 fprintf(stdout,
"** Checking scotch graph.\n");
259 CHECK_SCOTCH(SCOTCH_graphCheck(&graf),
"scotch_graphcheck", 0);
273 SCOTCH_graphExit(&graf) ;
282 for(tetraIdx = 1 ; tetraIdx <
mesh->ne + 1 ; tetraIdx++) {
283 if ( !
mesh->tetra[tetraIdx].v[0] )
continue;
284 vertOldTab[tetraIdx] = permVrtTab[vertOldTab[tetraIdx]];
288 for(tetraIdx = 1 ; tetraIdx <
mesh->ne + 1 ; tetraIdx++) {
289 while ( vertOldTab[tetraIdx] != tetraIdx && vertOldTab[tetraIdx] )
299 for(tetraIdx = 1 ; tetraIdx <
mesh->ne + 1 ; tetraIdx++) {
300 ptet = &
mesh->tetra[tetraIdx];
303 if (!ptet->
v[0])
continue;
307 for(j = 0 ; j <= 3 ; j++) {
309 nodeGlbIdx = ptet->
v[j];
311 if ( permNodTab[nodeGlbIdx] )
continue;
313 ppt = &
mesh->point[nodeGlbIdx];
317 permNodTab[nodeGlbIdx] = ++npreal;
320 for( k = 1; k <=
mesh->nprism; ++k) {
321 pp = &
mesh->prism[k];
323 if ( !
MG_EOK(pp) )
continue;
325 for(j = 0; j<6 ; j++) {
326 nodeGlbIdx = pp->
v[j];
328 if ( permNodTab[nodeGlbIdx] )
continue;
330 ppt = &
mesh->point[nodeGlbIdx];
334 permNodTab[nodeGlbIdx] = ++npreal;
339 for ( k=1; k<=
mesh->np; ++k) {
340 ppt = &
mesh->point[k];
344 if ( permNodTab[k] )
continue;
349 permNodTab[k] = ++npreal;
354 for( tetraIdx = 1; tetraIdx < nereal + 1; tetraIdx++) {
355 for(j = 0 ; j <= 3 ; j++) {
356 mesh->tetra[tetraIdx].v[j] = permNodTab[
mesh->tetra[tetraIdx].v[j]];
361 for( k = 1; k <=
mesh->nprism; ++k) {
362 for(j = 0; j<6 ; j++) {
363 mesh->prism[k].v[j] = permNodTab[
mesh->prism[k].v[j]];
368 for( k = 1; k <=
mesh->nquad; ++k) {
369 for(j = 0; j<4 ; j++) {
370 mesh->quadra[k].v[j] = permNodTab[
mesh->quadra[k].v[j]];
376 for ( k=1; k<=
mesh->npi; ++k ) {
377 if (
MG_VOK( &
mesh->point[permNodGlob[k]] ) ) {
378 permNodGlob[k] = permNodTab[permNodGlob[k]];
379 assert ( permNodGlob[k] > 0 );
385 for (j=1; j<=
mesh->np; j++) {
386 while ( permNodTab[j] != j && permNodTab[j] )
405 for (k=
mesh->npnil; k<mesh->npmax-1; k++) {
406 mesh->point[k].tmp = k+1;
413 for (k=
mesh->nenil; k<mesh->nemax-1; k++) {
414 mesh->tetra[k].v[3] = k+1;
416 mesh->tetra[
mesh->nemax-1].v[3] = 0;