1 #include "MeshCut_Cas.hxx"
3 #include "MeshCut_Globals.hxx"
5 using namespace MESHCUT;
9 * Le cas 1 traduit le fait que deux des sommets du T4 initial sont dans le plan de coupe.
10 * Le point d'intersection franc trouvé est sur l'arête opposée à ces deux points du T4.
12 * Le T4 initial produit deux nouveaux T4.
14 void MESHCUT::cas1(int VN[6], int it4)
17 // cout << "Cas 1 - it4=" << it4 << ", VN = " << VN[0] << " " << VN[1] << " " << VN[2] << " " << VN[3] << " " << VN[4]
18 // << " " << VN[5] << " " << endl;
20 // Numéros des noeuds du TETRA4
21 int ng0 = MAILLAGE1->CNX[TETRA4][4 * it4 + 0];
22 int ng1 = MAILLAGE1->CNX[TETRA4][4 * it4 + 1];
23 int ng2 = MAILLAGE1->CNX[TETRA4][4 * it4 + 2];
24 int ng3 = MAILLAGE1->CNX[TETRA4][4 * it4 + 3];
30 // Le sommet de T4new1 servant à la détermination du groupe est le noeud 1 du T4 d'origine
32 // cout << "cas 1/0" << endl;
33 newCNX[TETRA4].push_back(VN[0]);
34 newCNX[TETRA4].push_back(ng1);
35 newCNX[TETRA4].push_back(ng2);
36 newCNX[TETRA4].push_back(ng3);
37 cptNouvellesMailles[TETRA4]++;
38 i1 = cptNouvellesMailles[TETRA4] - 1;
40 newCNX[TETRA4].push_back(ng0);
41 newCNX[TETRA4].push_back(VN[0]);
42 newCNX[TETRA4].push_back(ng2);
43 newCNX[TETRA4].push_back(ng3);
44 cptNouvellesMailles[TETRA4]++;
45 i2 = cptNouvellesMailles[TETRA4] - 1;
47 if (POSN[ng1 - 1] == 1)
49 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
50 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
54 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
55 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
61 // Le sommet de T4new1 servant à la détermination du groupe est le noeud 0 du T4 d'origine
63 // cout << "cas 1/1" << endl;
64 newCNX[TETRA4].push_back(ng0);
65 newCNX[TETRA4].push_back(ng1);
66 newCNX[TETRA4].push_back(VN[1]);
67 newCNX[TETRA4].push_back(ng3);
68 cptNouvellesMailles[TETRA4]++;
69 i1 = cptNouvellesMailles[TETRA4] - 1;
71 newCNX[TETRA4].push_back(ng1);
72 newCNX[TETRA4].push_back(ng2);
73 newCNX[TETRA4].push_back(VN[1]);
74 newCNX[TETRA4].push_back(ng3);
75 cptNouvellesMailles[TETRA4]++;
76 i2 = cptNouvellesMailles[TETRA4] - 1;
78 if (POSN[ng0 - 1] == 1)
80 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
81 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
85 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
86 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
92 // Le sommet de T4new1 servant à la détermination du groupe est le noeud 0 du T4 d'origine
94 // cout << "cas 1/2" << endl;
95 newCNX[TETRA4].push_back(ng0);
96 newCNX[TETRA4].push_back(ng1);
97 newCNX[TETRA4].push_back(ng2);
98 newCNX[TETRA4].push_back(VN[2]);
99 cptNouvellesMailles[TETRA4]++;
100 i1 = cptNouvellesMailles[TETRA4] - 1;
102 newCNX[TETRA4].push_back(ng1);
103 newCNX[TETRA4].push_back(ng2);
104 newCNX[TETRA4].push_back(VN[2]);
105 newCNX[TETRA4].push_back(ng3);
106 cptNouvellesMailles[TETRA4]++;
107 i2 = cptNouvellesMailles[TETRA4] - 1;
109 if (POSN[ng0 - 1] == 1)
111 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
112 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
116 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
117 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
121 else if (VN[3] != -1)
123 // Le sommet de T4new1 servant à la détermination du groupe est le noeud 1 du T4 d'origine
125 // cout << "cas 1/3" << endl;
126 newCNX[TETRA4].push_back(ng0);
127 newCNX[TETRA4].push_back(ng1);
128 newCNX[TETRA4].push_back(VN[3]);
129 newCNX[TETRA4].push_back(ng3);
130 cptNouvellesMailles[TETRA4]++;
131 i1 = cptNouvellesMailles[TETRA4] - 1;
133 newCNX[TETRA4].push_back(ng0);
134 newCNX[TETRA4].push_back(VN[3]);
135 newCNX[TETRA4].push_back(ng2);
136 newCNX[TETRA4].push_back(ng3);
137 cptNouvellesMailles[TETRA4]++;
138 i2 = cptNouvellesMailles[TETRA4] - 1;
140 if (POSN[ng1 - 1] == 1)
142 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
143 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
147 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
148 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
152 else if (VN[4] != -1)
154 // Le sommet de T4new1 servant à la détermination du groupe est le noeud 1 du T4 d'origine
156 // cout << "cas 1/4" << endl;
157 newCNX[TETRA4].push_back(ng0);
158 newCNX[TETRA4].push_back(ng1);
159 newCNX[TETRA4].push_back(ng2);
160 newCNX[TETRA4].push_back(VN[4]);
161 cptNouvellesMailles[TETRA4]++;
162 i1 = cptNouvellesMailles[TETRA4] - 1;
164 newCNX[TETRA4].push_back(ng0);
165 newCNX[TETRA4].push_back(VN[4]);
166 newCNX[TETRA4].push_back(ng2);
167 newCNX[TETRA4].push_back(ng3);
168 cptNouvellesMailles[TETRA4]++;
169 i2 = cptNouvellesMailles[TETRA4] - 1;
171 if (POSN[ng1 - 1] == 1)
173 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
174 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
178 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
179 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
183 else if (VN[5] != -1)
185 // Le sommet de T4new1 servant à la détermination du groupe est le noeud 3 du T4 d'origine
187 // cout << "cas 1/5" << endl;
188 newCNX[TETRA4].push_back(ng0);
189 newCNX[TETRA4].push_back(ng1);
190 newCNX[TETRA4].push_back(VN[5]);
191 newCNX[TETRA4].push_back(ng3);
192 cptNouvellesMailles[TETRA4]++;
193 i1 = cptNouvellesMailles[TETRA4] - 1;
195 newCNX[TETRA4].push_back(ng0);
196 newCNX[TETRA4].push_back(ng1);
197 newCNX[TETRA4].push_back(ng2);
198 newCNX[TETRA4].push_back(VN[5]);
199 cptNouvellesMailles[TETRA4]++;
200 i2 = cptNouvellesMailles[TETRA4] - 1;
202 if (POSN[ng3 - 1] == 1)
204 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
205 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
209 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
210 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
215 ERREUR(" Configuration intersections non reconnue (cas cptPI=1) ");
217 //int nl1 = MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1;
218 //int nl2 = MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2;
219 // cout << "La maille TETRA4 " << it4 << " produit les mailles TETRA4-" << nl1 << " et TETRA4-" << nl2 << endl;
223 /*! Deux points d'intersection
224 * Le cas 2 traduit le fait qu'un des sommets du T4 est dans le plan de coupe.
225 * Ce sommet est celui des quatre qui n'appartient à aucune des deux arêtes sur lesquelles
226 * un point d'intersection non -1 a été calculé.
228 * Le T4 initial produit un nouveau T4 et un élément PYRAM5.
231 void MESHCUT::cas2(int VN[6], int it4)
234 // cout << "Cas 2 - it4=" << it4 << ", VN = " << VN[0] << " " << VN[1] << " " << VN[2] << " " << VN[3] << " " << VN[4]
235 // << " " << VN[5] << " " << endl;
237 // Numéros des noeuds du TETRA4
238 int ng0 = MAILLAGE1->CNX[TETRA4][4 * it4 + 0];
239 int ng1 = MAILLAGE1->CNX[TETRA4][4 * it4 + 1];
240 int ng2 = MAILLAGE1->CNX[TETRA4][4 * it4 + 2];
241 int ng3 = MAILLAGE1->CNX[TETRA4][4 * it4 + 3];
243 if (VN[0] != -1 && VN[1] != -1)
245 // Le sommet du nouveau T4 est le noeud 0 du T4 d'origine
247 // cout << "cas 2.01" << endl;
248 newCNX[TETRA4].push_back(VN[0]);
249 newCNX[TETRA4].push_back(ng3);
250 newCNX[TETRA4].push_back(VN[1]);
251 newCNX[TETRA4].push_back(ng0);
252 cptNouvellesMailles[TETRA4]++;
254 newCNX[PYRAM5].push_back(VN[0]);
255 newCNX[PYRAM5].push_back(ng1);
256 newCNX[PYRAM5].push_back(ng2);
257 newCNX[PYRAM5].push_back(VN[1]);
258 newCNX[PYRAM5].push_back(ng3);
259 cptNouvellesMailles[PYRAM5]++;
261 if (POSN[ng0 - 1] == 1)
263 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
264 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
268 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
269 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
272 else if (VN[0] != -1 && VN[2] != -1)
274 // Le sommet du nouveau T4 est le noeud 0 du T4 d'origine
276 // cout << "cas 2.02" << endl;
277 newCNX[TETRA4].push_back(VN[0]);
278 newCNX[TETRA4].push_back(VN[2]);
279 newCNX[TETRA4].push_back(ng2);
280 newCNX[TETRA4].push_back(ng0);
281 cptNouvellesMailles[TETRA4]++;
283 newCNX[PYRAM5].push_back(VN[0]);
284 newCNX[PYRAM5].push_back(VN[2]);
285 newCNX[PYRAM5].push_back(ng3);
286 newCNX[PYRAM5].push_back(ng1);
287 newCNX[PYRAM5].push_back(ng2);
288 cptNouvellesMailles[PYRAM5]++;
290 if (POSN[ng0 - 1] == 1)
292 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
293 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
297 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
298 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
301 else if (VN[0] != -1 && VN[3] != -1)
303 // Le sommet du nouveau T4 est le noeud 1 du T4 d'origine
305 // cout << "cas 2.03" << endl;
306 newCNX[TETRA4].push_back(VN[0]);
307 newCNX[TETRA4].push_back(VN[3]);
308 newCNX[TETRA4].push_back(ng3);
309 newCNX[TETRA4].push_back(ng1);
310 cptNouvellesMailles[TETRA4]++;
312 newCNX[PYRAM5].push_back(VN[0]);
313 newCNX[PYRAM5].push_back(VN[3]);
314 newCNX[PYRAM5].push_back(ng2);
315 newCNX[PYRAM5].push_back(ng0);
316 newCNX[PYRAM5].push_back(ng3);
317 cptNouvellesMailles[PYRAM5]++;
319 if (POSN[ng1 - 1] == 1)
321 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
322 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
326 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
327 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
330 else if (VN[0] != -1 && VN[4] != -1)
332 // Le sommet du nouveau T4 est le noeud 1 du T4 d'origine
334 // cout << "cas 2.04" << endl;
335 newCNX[TETRA4].push_back(VN[0]);
336 newCNX[TETRA4].push_back(ng2);
337 newCNX[TETRA4].push_back(VN[4]);
338 newCNX[TETRA4].push_back(ng1);
339 cptNouvellesMailles[TETRA4]++;
341 newCNX[PYRAM5].push_back(ng0);
342 newCNX[PYRAM5].push_back(ng3);
343 newCNX[PYRAM5].push_back(VN[4]);
344 newCNX[PYRAM5].push_back(VN[0]);
345 newCNX[PYRAM5].push_back(ng2);
346 cptNouvellesMailles[PYRAM5]++;
348 if (POSN[ng1 - 1] == 1)
350 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
351 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
355 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
356 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
360 else if (VN[0] != -1 && VN[5] != -1)
361 ERREUR("Cas 2/05 interdit");
363 else if (VN[1] != -1 && VN[2] != -1)
365 // Le sommet du nouveau T4 est le noeud 0 du T4 d'origine
367 // cout << "cas 2.12" << endl;
368 newCNX[TETRA4].push_back(ng1);
369 newCNX[TETRA4].push_back(VN[2]);
370 newCNX[TETRA4].push_back(VN[1]);
371 newCNX[TETRA4].push_back(ng0);
372 cptNouvellesMailles[TETRA4]++;
374 newCNX[PYRAM5].push_back(ng2);
375 newCNX[PYRAM5].push_back(ng3);
376 newCNX[PYRAM5].push_back(VN[2]);
377 newCNX[PYRAM5].push_back(VN[1]);
378 newCNX[PYRAM5].push_back(ng1);
379 cptNouvellesMailles[PYRAM5]++;
381 if (POSN[ng0 - 1] == 1)
383 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
384 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
388 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
389 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
392 else if (VN[1] != -1 && VN[3] != -1)
394 // Le sommet du nouveau T4 est le noeud 2 du T4 d'origine
396 // cout << "cas 2.13" << endl;
397 newCNX[TETRA4].push_back(VN[1]);
398 newCNX[TETRA4].push_back(ng3);
399 newCNX[TETRA4].push_back(VN[3]);
400 newCNX[TETRA4].push_back(ng2);
401 cptNouvellesMailles[TETRA4]++;
403 newCNX[PYRAM5].push_back(ng0);
404 newCNX[PYRAM5].push_back(ng1);
405 newCNX[PYRAM5].push_back(VN[3]);
406 newCNX[PYRAM5].push_back(VN[1]);
407 newCNX[PYRAM5].push_back(ng3);
408 cptNouvellesMailles[PYRAM5]++;
410 if (POSN[ng2 - 1] == 1)
412 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
413 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
417 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
418 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
422 else if (VN[1] != -1 && VN[4] != -1)
423 ERREUR("Cas 2/14 exclu");
425 else if (VN[1] != -1 && VN[5] != -1)
427 // Le sommet du nouveau T4 est le noeud 2 du T4 d'origine
429 // cout << "cas 2.15" << endl;
430 newCNX[TETRA4].push_back(ng1);
431 newCNX[TETRA4].push_back(ng2);
432 newCNX[TETRA4].push_back(VN[1]);
433 newCNX[TETRA4].push_back(VN[5]);
434 cptNouvellesMailles[TETRA4]++;
436 newCNX[PYRAM5].push_back(VN[1]);
437 newCNX[PYRAM5].push_back(VN[5]);
438 newCNX[PYRAM5].push_back(ng3);
439 newCNX[PYRAM5].push_back(ng0);
440 newCNX[PYRAM5].push_back(ng1);
441 cptNouvellesMailles[PYRAM5]++;
443 if (POSN[ng2 - 1] == 1)
445 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
446 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
450 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
451 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
455 else if (VN[2] != -1 && VN[3] != -1)
456 ERREUR("Cas 2/23 exclu");
458 else if (VN[2] != -1 && VN[4] != -1)
460 // Le sommet du nouveau T4 est le noeud 3 du T4 d'origine
462 // cout << "cas 2.24" << endl;
463 newCNX[TETRA4].push_back(VN[2]);
464 newCNX[TETRA4].push_back(VN[4]);
465 newCNX[TETRA4].push_back(ng2);
466 newCNX[TETRA4].push_back(ng3);
467 cptNouvellesMailles[TETRA4]++;
469 newCNX[PYRAM5].push_back(ng0);
470 newCNX[PYRAM5].push_back(VN[2]);
471 newCNX[PYRAM5].push_back(VN[4]);
472 newCNX[PYRAM5].push_back(ng1);
473 newCNX[PYRAM5].push_back(ng2);
474 cptNouvellesMailles[PYRAM5]++;
476 if (POSN[ng3 - 1] == 1)
478 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
479 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
483 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
484 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
488 else if (VN[2] != -1 && VN[5] != -1)
490 // Le sommet du nouveau T4 est le noeud 3 du T4 d'origine
492 // cout << "cas 2.25" << endl;
493 newCNX[TETRA4].push_back(ng1);
494 newCNX[TETRA4].push_back(VN[5]);
495 newCNX[TETRA4].push_back(VN[2]);
496 newCNX[TETRA4].push_back(ng3);
497 cptNouvellesMailles[TETRA4]++;
499 newCNX[PYRAM5].push_back(ng0);
500 newCNX[PYRAM5].push_back(ng2);
501 newCNX[PYRAM5].push_back(VN[5]);
502 newCNX[PYRAM5].push_back(VN[2]);
503 newCNX[PYRAM5].push_back(ng1);
504 cptNouvellesMailles[PYRAM5]++;
506 if (POSN[ng3 - 1] == 1)
508 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
509 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
513 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
514 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
518 else if (VN[3] != -1 && VN[4] != -1)
520 // Le sommet du nouveau T4 est le noeud 1 du T4 d'origine
522 // cout << "cas 2.34" << endl;
523 newCNX[TETRA4].push_back(ng0);
524 newCNX[TETRA4].push_back(VN[3]);
525 newCNX[TETRA4].push_back(VN[4]);
526 newCNX[TETRA4].push_back(ng1);
527 cptNouvellesMailles[TETRA4]++;
529 newCNX[PYRAM5].push_back(VN[3]);
530 newCNX[PYRAM5].push_back(VN[4]);
531 newCNX[PYRAM5].push_back(ng3);
532 newCNX[PYRAM5].push_back(ng2);
533 newCNX[PYRAM5].push_back(ng0);
534 cptNouvellesMailles[PYRAM5]++;
536 if (POSN[ng1 - 1] == 1)
538 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
539 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
543 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
544 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
548 else if (VN[3] != -1 && VN[5] != -1)
550 // Le sommet du nouveau T4 est le noeud 2 du T4 d'origine
552 // cout << "cas 2.35" << endl;
553 newCNX[TETRA4].push_back(VN[3]);
554 newCNX[TETRA4].push_back(VN[5]);
555 newCNX[TETRA4].push_back(ng2);
556 newCNX[TETRA4].push_back(ng0);
557 cptNouvellesMailles[TETRA4]++;
559 newCNX[PYRAM5].push_back(VN[3]);
560 newCNX[PYRAM5].push_back(ng1);
561 newCNX[PYRAM5].push_back(ng3);
562 newCNX[PYRAM5].push_back(VN[5]);
563 newCNX[PYRAM5].push_back(ng0);
564 cptNouvellesMailles[PYRAM5]++;
566 if (POSN[ng2 - 1] == 1)
568 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
569 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
573 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
574 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
578 else if (VN[4] != -1 && VN[5] != -1)
580 // Le sommet du nouveau T4 est le noeud 3 du T4 d'origine
582 // cout << "cas 2.35" << endl;
583 newCNX[TETRA4].push_back(ng0);
584 newCNX[TETRA4].push_back(VN[4]);
585 newCNX[TETRA4].push_back(VN[5]);
586 newCNX[TETRA4].push_back(ng3);
587 cptNouvellesMailles[TETRA4]++;
589 newCNX[PYRAM5].push_back(ng1);
590 newCNX[PYRAM5].push_back(VN[4]);
591 newCNX[PYRAM5].push_back(VN[5]);
592 newCNX[PYRAM5].push_back(ng2);
593 newCNX[PYRAM5].push_back(ng0);
594 cptNouvellesMailles[PYRAM5]++;
596 if (POSN[ng3 - 1] == 1)
598 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
599 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
603 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
604 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
609 ERREUR(" Configuration intersections non reconnue (cas cptPI=2) ");
611 // int ngT4 = MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1;
612 // int ngP5 = MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1;
613 // cout << "La maille TETRA4 " << it4 << " produit les mailles TETRA4-" << ngT4 << " et PYRAM5-" << ngP5 << endl;
617 /*! Trois points d'intersection
618 * ATTENTION: pour les PENTA6 on adopte la convention d'orientation SALOME :
622 * où N1 N2 N3 sont les sommets du haut et N4 N5 N6 les sommets du bas
623 * (selon l'orientation donnée par le sens des triangles)
625 void MESHCUT::cas3(int VN[6], int it4)
628 // cout << "Cas 3 - it4="<<it4<<", VN = " << VN[0] << " " << VN[1] << " " << VN[2] << " " << VN[3] << " " << VN[4] << " " << VN[5] << " " << endl;
630 // Numéros des noeuds du TETRA4
631 int ng0 = MAILLAGE1->CNX[TETRA4][4 * it4 + 0];
632 int ng1 = MAILLAGE1->CNX[TETRA4][4 * it4 + 1];
633 int ng2 = MAILLAGE1->CNX[TETRA4][4 * it4 + 2];
634 int ng3 = MAILLAGE1->CNX[TETRA4][4 * it4 + 3];
636 if (VN[0] != -1 && VN[1] != -1 && VN[2] != -1)
639 // Le sommet du nouveau T4 est le noeud 0 du T4 d'origine
641 newCNX[TETRA4].push_back(ng0);
642 newCNX[TETRA4].push_back(VN[0]);
643 newCNX[TETRA4].push_back(VN[1]);
644 newCNX[TETRA4].push_back(VN[2]);
645 cptNouvellesMailles[TETRA4]++;
647 newCNX[PENTA6].push_back(ng1);
648 newCNX[PENTA6].push_back(ng3);
649 newCNX[PENTA6].push_back(ng2);
650 newCNX[PENTA6].push_back(VN[0]);
651 newCNX[PENTA6].push_back(VN[2]);
652 newCNX[PENTA6].push_back(VN[1]);
653 cptNouvellesMailles[PENTA6]++;
655 if (POSN[ng0 - 1] == 1)
657 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
658 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
662 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
663 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
667 else if (VN[0] != -1 && VN[3] != -1 && VN[4] != -1)
669 // Le sommet du nouveau T4 est le noeud 1 du T4 d'origine
671 //cout << "cas 3.2 (noeud sommet 1)" << endl;
672 newCNX[TETRA4].push_back(VN[0]);
673 newCNX[TETRA4].push_back(ng1);
674 newCNX[TETRA4].push_back(VN[3]);
675 newCNX[TETRA4].push_back(VN[4]);
676 cptNouvellesMailles[TETRA4]++;
678 newCNX[PENTA6].push_back(ng0);
679 newCNX[PENTA6].push_back(ng2);
680 newCNX[PENTA6].push_back(ng3);
681 newCNX[PENTA6].push_back(VN[0]);
682 newCNX[PENTA6].push_back(VN[3]);
683 newCNX[PENTA6].push_back(VN[4]);
684 cptNouvellesMailles[PENTA6]++;
686 if (POSN[ng1 - 1] == 1)
688 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
689 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
693 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
694 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
697 else if (VN[1] != -1 && VN[3] != -1 && VN[5] != -1)
699 // Le sommet du nouveau T4 est le noeud 2 du T4 d'origine
701 //cout << "cas 3.3 (noeud sommet 2)" << endl;
703 newCNX[TETRA4].push_back(VN[1]);
704 newCNX[TETRA4].push_back(VN[3]);
705 newCNX[TETRA4].push_back(ng2);
706 newCNX[TETRA4].push_back(VN[5]);
707 cptNouvellesMailles[TETRA4]++;
709 newCNX[PENTA6].push_back(ng0);
710 newCNX[PENTA6].push_back(ng3);
711 newCNX[PENTA6].push_back(ng1);
712 newCNX[PENTA6].push_back(VN[1]);
713 newCNX[PENTA6].push_back(VN[5]);
714 newCNX[PENTA6].push_back(VN[3]);
715 cptNouvellesMailles[PENTA6]++;
717 if (POSN[ng2 - 1] == 1)
719 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
720 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
724 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
725 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
728 else if (VN[2] != -1 && VN[4] != -1 && VN[5] != -1)
730 // Le sommet du nouveau T4 est le noeud 3 du T4 d'origine
732 newCNX[TETRA4].push_back(VN[2]);
733 newCNX[TETRA4].push_back(VN[4]);
734 newCNX[TETRA4].push_back(VN[5]);
735 newCNX[TETRA4].push_back(ng3);
736 cptNouvellesMailles[TETRA4]++;
738 newCNX[PENTA6].push_back(ng0);
739 newCNX[PENTA6].push_back(ng1);
740 newCNX[PENTA6].push_back(ng2);
741 newCNX[PENTA6].push_back(VN[2]);
742 newCNX[PENTA6].push_back(VN[4]);
743 newCNX[PENTA6].push_back(VN[5]);
744 cptNouvellesMailles[PENTA6]++;
746 if (POSN[ng3 - 1] == 1)
748 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
749 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
753 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
754 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
759 // cout << "Cas 3 - it4=" << it4 << ", VN = " << VN[0] << " " << VN[1] << " " << VN[2] << " " << VN[3] << " "
760 // << VN[4] << " " << VN[5] << " " << endl;
762 // int n0 = *(MAILLAGE1->CNX[TETRA4] + it4 * 4 + 0);
763 // float x0 = MAILLAGE1->XX[n0 - 1];
764 // float y0 = MAILLAGE1->YY[n0 - 1];
765 // float z0 = MAILLAGE1->ZZ[n0 - 1];
767 // int n1 = *(MAILLAGE1->CNX[TETRA4] + it4 * 4 + 1);
768 // float x1 = MAILLAGE1->XX[n1 - 1];
769 // float y1 = MAILLAGE1->YY[n1 - 1];
770 // float z1 = MAILLAGE1->ZZ[n1 - 1];
772 // int n2 = *(MAILLAGE1->CNX[TETRA4] + it4 * 4 + 2);
773 // float x2 = MAILLAGE1->XX[n2 - 1];
774 // float y2 = MAILLAGE1->YY[n2 - 1];
775 // float z2 = MAILLAGE1->ZZ[n2 - 1];
777 // int n3 = *(MAILLAGE1->CNX[TETRA4] + it4 * 4 + 3);
778 // float x3 = MAILLAGE1->XX[n3 - 1];
779 // float y3 = MAILLAGE1->YY[n3 - 1];
780 // float z3 = MAILLAGE1->ZZ[n3 - 1];
782 // cout << x0 << " " << y0 << " " << z0 << " " << endl;
783 // cout << x1 << " " << y1 << " " << z1 << " " << endl;
784 // cout << x2 << " " << y2 << " " << z2 << " " << endl;
785 // cout << x3 << " " << y3 << " " << z3 << " " << endl;
787 ERREUR(" Configuration intersections non reconnue (cas cptPI=3) ");
790 // int ngT4 = MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1;
791 // int ngP6 = MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1;
792 // cout << "La maille TETRA4 " << it4 << " produit les mailles TETRA4-" << ngT4 << " et PENTA6-" << ngP6 << endl;
795 /*! Quatre points d'intersection
797 * ATTENTION: pour les PENTA6 on adopte la convention d'orientation SALOME
801 * où N1 N2 N3 sont les sommets du haut et N4 N5 N6 les sommets du bas
802 * (selon l'orientation donnée par le sens des triangles)
804 void MESHCUT::cas4(int VN[6], int it4)
807 // cout << "Cas 4 - it4=" << it4 << ", VN = " << VN[0] << " " << VN[1] << " " << VN[2] << " " << VN[3] << " " << VN[4]
808 // << " " << VN[5] << " " << endl;
810 // Numéros des noeuds du TETRA4
811 int ng0 = MAILLAGE1->CNX[TETRA4][4 * it4 + 0];
812 int ng1 = MAILLAGE1->CNX[TETRA4][4 * it4 + 1];
813 int ng2 = MAILLAGE1->CNX[TETRA4][4 * it4 + 2];
814 int ng3 = MAILLAGE1->CNX[TETRA4][4 * it4 + 3];
816 int i1, i2; // Numéros locaux dans le type des mailles créées
818 if (VN[0] == -1 && VN[5] == -1)
820 // Les deux arêtes opposées sont [0,1] et [2,3]
822 newCNX[PENTA6].push_back(ng0);
823 newCNX[PENTA6].push_back(VN[1]);
824 newCNX[PENTA6].push_back(VN[2]);
825 newCNX[PENTA6].push_back(ng1);
826 newCNX[PENTA6].push_back(VN[3]);
827 newCNX[PENTA6].push_back(VN[4]);
828 cptNouvellesMailles[PENTA6]++;
829 i1 = cptNouvellesMailles[PENTA6] - 1;
831 newCNX[PENTA6].push_back(ng3);
832 newCNX[PENTA6].push_back(VN[4]);
833 newCNX[PENTA6].push_back(VN[2]);
834 newCNX[PENTA6].push_back(ng2);
835 newCNX[PENTA6].push_back(VN[3]);
836 newCNX[PENTA6].push_back(VN[1]);
837 cptNouvellesMailles[PENTA6]++;
838 i2 = cptNouvellesMailles[PENTA6] - 1;
840 if (POSN[ng0 - 1] == 1)
842 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1);
843 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2);
847 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2);
848 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1);
851 } // if ( VN[0]==-1 && VN[5]==-1 )
853 else if (VN[1] == -1 && VN[4] == -1)
855 // Les deux arêtes opposées sont [0,2] et [1,3]
857 newCNX[PENTA6].push_back(ng2);
858 newCNX[PENTA6].push_back(VN[3]);
859 newCNX[PENTA6].push_back(VN[5]);
860 newCNX[PENTA6].push_back(ng0);
861 newCNX[PENTA6].push_back(VN[0]);
862 newCNX[PENTA6].push_back(VN[2]);
863 cptNouvellesMailles[PENTA6]++;
864 i1 = cptNouvellesMailles[PENTA6] - 1;
866 newCNX[PENTA6].push_back(ng1);
867 newCNX[PENTA6].push_back(VN[3]);
868 newCNX[PENTA6].push_back(VN[0]);
869 newCNX[PENTA6].push_back(ng3);
870 newCNX[PENTA6].push_back(VN[5]);
871 newCNX[PENTA6].push_back(VN[2]);
872 cptNouvellesMailles[PENTA6]++;
873 i2 = cptNouvellesMailles[PENTA6] - 1;
875 if (POSN[ng0 - 1] == 1)
877 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1);
878 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2);
882 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2);
883 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1);
887 else if (VN[2] == -1 && VN[3] == -1)
889 // Les deux arêtes opposées sont [0,3] et [1,2]
891 newCNX[PENTA6].push_back(ng0);
892 newCNX[PENTA6].push_back(VN[0]);
893 newCNX[PENTA6].push_back(VN[1]);
894 newCNX[PENTA6].push_back(ng3);
895 newCNX[PENTA6].push_back(VN[4]);
896 newCNX[PENTA6].push_back(VN[5]);
897 cptNouvellesMailles[PENTA6]++;
898 i1 = cptNouvellesMailles[PENTA6] - 1;
900 newCNX[PENTA6].push_back(ng2);
901 newCNX[PENTA6].push_back(VN[5]);
902 newCNX[PENTA6].push_back(VN[1]);
903 newCNX[PENTA6].push_back(ng1);
904 newCNX[PENTA6].push_back(VN[4]);
905 newCNX[PENTA6].push_back(VN[0]);
906 cptNouvellesMailles[PENTA6]++;
907 i2 = cptNouvellesMailles[PENTA6] - 1;
909 if (POSN[ng0 - 1] == 1)
911 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1);
912 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2);
916 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2);
917 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1);
921 ERREUR(" Configuration intersections non reconnue (cas cptPI=4) ");
923 // int nl1 = MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1;
924 // int nl2 = MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2;
925 // cout << "La maille TETRA4 " << it4 << " produit les mailles PENTA6-" << nl1 << " et PENTA6-" << nl2 << endl;