1 // Copyright (C) 2006-2014 EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include "MeshCut_Cas.hxx"
22 #include "MeshCut_Globals.hxx"
24 using namespace MESHCUT;
28 * Le cas 1 traduit le fait que deux des sommets du T4 initial sont dans le plan de coupe.
29 * Le point d'intersection franc trouvé est sur l'arête opposée à ces deux points du T4.
31 * Le T4 initial produit deux nouveaux T4.
33 void MESHCUT::cas1(int VN[6], int it4)
35 cutTetras.push_back(it4);
36 // cout << "Cas 1 - it4=" << it4 << ", VN = " << VN[0] << " " << VN[1] << " " << VN[2] << " " << VN[3] << " " << VN[4]
37 // << " " << VN[5] << " " << endl;
39 // Numéros des noeuds du TETRA4
40 int ng0 = MAILLAGE1->CNX[TETRA4][4 * it4 + 0];
41 int ng1 = MAILLAGE1->CNX[TETRA4][4 * it4 + 1];
42 int ng2 = MAILLAGE1->CNX[TETRA4][4 * it4 + 2];
43 int ng3 = MAILLAGE1->CNX[TETRA4][4 * it4 + 3];
49 // Le sommet de T4new1 servant à la détermination du groupe est le noeud 1 du T4 d'origine
51 // cout << "cas 1/0" << endl;
52 newCNX[TETRA4].push_back(VN[0]);
53 newCNX[TETRA4].push_back(ng1);
54 newCNX[TETRA4].push_back(ng2);
55 newCNX[TETRA4].push_back(ng3);
56 cptNouvellesMailles[TETRA4]++;
57 i1 = cptNouvellesMailles[TETRA4] - 1;
59 newCNX[TETRA4].push_back(ng0);
60 newCNX[TETRA4].push_back(VN[0]);
61 newCNX[TETRA4].push_back(ng2);
62 newCNX[TETRA4].push_back(ng3);
63 cptNouvellesMailles[TETRA4]++;
64 i2 = cptNouvellesMailles[TETRA4] - 1;
66 if (POSN[ng1 - 1] == 1)
68 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
69 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
73 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
74 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
80 // Le sommet de T4new1 servant à la détermination du groupe est le noeud 0 du T4 d'origine
82 // cout << "cas 1/1" << endl;
83 newCNX[TETRA4].push_back(ng0);
84 newCNX[TETRA4].push_back(ng1);
85 newCNX[TETRA4].push_back(VN[1]);
86 newCNX[TETRA4].push_back(ng3);
87 cptNouvellesMailles[TETRA4]++;
88 i1 = cptNouvellesMailles[TETRA4] - 1;
90 newCNX[TETRA4].push_back(ng1);
91 newCNX[TETRA4].push_back(ng2);
92 newCNX[TETRA4].push_back(VN[1]);
93 newCNX[TETRA4].push_back(ng3);
94 cptNouvellesMailles[TETRA4]++;
95 i2 = cptNouvellesMailles[TETRA4] - 1;
97 if (POSN[ng0 - 1] == 1)
99 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
100 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
104 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
105 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
109 else if (VN[2] != -1)
111 // Le sommet de T4new1 servant à la détermination du groupe est le noeud 0 du T4 d'origine
113 // cout << "cas 1/2" << endl;
114 newCNX[TETRA4].push_back(ng0);
115 newCNX[TETRA4].push_back(ng1);
116 newCNX[TETRA4].push_back(ng2);
117 newCNX[TETRA4].push_back(VN[2]);
118 cptNouvellesMailles[TETRA4]++;
119 i1 = cptNouvellesMailles[TETRA4] - 1;
121 newCNX[TETRA4].push_back(ng1);
122 newCNX[TETRA4].push_back(ng2);
123 newCNX[TETRA4].push_back(VN[2]);
124 newCNX[TETRA4].push_back(ng3);
125 cptNouvellesMailles[TETRA4]++;
126 i2 = cptNouvellesMailles[TETRA4] - 1;
128 if (POSN[ng0 - 1] == 1)
130 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
131 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
135 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
136 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
140 else if (VN[3] != -1)
142 // Le sommet de T4new1 servant à la détermination du groupe est le noeud 1 du T4 d'origine
144 // cout << "cas 1/3" << endl;
145 newCNX[TETRA4].push_back(ng0);
146 newCNX[TETRA4].push_back(ng1);
147 newCNX[TETRA4].push_back(VN[3]);
148 newCNX[TETRA4].push_back(ng3);
149 cptNouvellesMailles[TETRA4]++;
150 i1 = cptNouvellesMailles[TETRA4] - 1;
152 newCNX[TETRA4].push_back(ng0);
153 newCNX[TETRA4].push_back(VN[3]);
154 newCNX[TETRA4].push_back(ng2);
155 newCNX[TETRA4].push_back(ng3);
156 cptNouvellesMailles[TETRA4]++;
157 i2 = cptNouvellesMailles[TETRA4] - 1;
159 if (POSN[ng1 - 1] == 1)
161 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
162 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
166 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
167 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
171 else if (VN[4] != -1)
173 // Le sommet de T4new1 servant à la détermination du groupe est le noeud 1 du T4 d'origine
175 // cout << "cas 1/4" << endl;
176 newCNX[TETRA4].push_back(ng0);
177 newCNX[TETRA4].push_back(ng1);
178 newCNX[TETRA4].push_back(ng2);
179 newCNX[TETRA4].push_back(VN[4]);
180 cptNouvellesMailles[TETRA4]++;
181 i1 = cptNouvellesMailles[TETRA4] - 1;
183 newCNX[TETRA4].push_back(ng0);
184 newCNX[TETRA4].push_back(VN[4]);
185 newCNX[TETRA4].push_back(ng2);
186 newCNX[TETRA4].push_back(ng3);
187 cptNouvellesMailles[TETRA4]++;
188 i2 = cptNouvellesMailles[TETRA4] - 1;
190 if (POSN[ng1 - 1] == 1)
192 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
193 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
197 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
198 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
202 else if (VN[5] != -1)
204 // Le sommet de T4new1 servant à la détermination du groupe est le noeud 3 du T4 d'origine
206 // cout << "cas 1/5" << endl;
207 newCNX[TETRA4].push_back(ng0);
208 newCNX[TETRA4].push_back(ng1);
209 newCNX[TETRA4].push_back(VN[5]);
210 newCNX[TETRA4].push_back(ng3);
211 cptNouvellesMailles[TETRA4]++;
212 i1 = cptNouvellesMailles[TETRA4] - 1;
214 newCNX[TETRA4].push_back(ng0);
215 newCNX[TETRA4].push_back(ng1);
216 newCNX[TETRA4].push_back(ng2);
217 newCNX[TETRA4].push_back(VN[5]);
218 cptNouvellesMailles[TETRA4]++;
219 i2 = cptNouvellesMailles[TETRA4] - 1;
221 if (POSN[ng3 - 1] == 1)
223 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
224 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
228 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
229 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
234 ERREUR(" Intersections configuration not taken into account (case cptPI=1) ");
236 //int nl1 = MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1;
237 //int nl2 = MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2;
238 // cout << "La maille TETRA4 " << it4 << " produit les mailles TETRA4-" << nl1 << " et TETRA4-" << nl2 << endl;
242 /*! Deux points d'intersection
243 * Le cas 2 traduit le fait qu'un des sommets du T4 est dans le plan de coupe.
244 * Ce sommet est celui des quatre qui n'appartient à aucune des deux arêtes sur lesquelles
245 * un point d'intersection non -1 a été calculé.
247 * Le T4 initial produit un nouveau T4 et un élément PYRAM5.
250 void MESHCUT::cas2(int VN[6], int it4)
252 cutTetras.push_back(it4);
253 // cout << "Cas 2 - it4=" << it4 << ", VN = " << VN[0] << " " << VN[1] << " " << VN[2] << " " << VN[3] << " " << VN[4]
254 // << " " << VN[5] << " " << endl;
256 // Numéros des noeuds du TETRA4
257 int ng0 = MAILLAGE1->CNX[TETRA4][4 * it4 + 0];
258 int ng1 = MAILLAGE1->CNX[TETRA4][4 * it4 + 1];
259 int ng2 = MAILLAGE1->CNX[TETRA4][4 * it4 + 2];
260 int ng3 = MAILLAGE1->CNX[TETRA4][4 * it4 + 3];
262 if (VN[0] != -1 && VN[1] != -1)
264 // Le sommet du nouveau T4 est le noeud 0 du T4 d'origine
266 // cout << "cas 2.01" << endl;
267 newCNX[TETRA4].push_back(VN[0]);
268 newCNX[TETRA4].push_back(ng3);
269 newCNX[TETRA4].push_back(VN[1]);
270 newCNX[TETRA4].push_back(ng0);
271 cptNouvellesMailles[TETRA4]++;
273 newCNX[PYRAM5].push_back(VN[0]);
274 newCNX[PYRAM5].push_back(ng1);
275 newCNX[PYRAM5].push_back(ng2);
276 newCNX[PYRAM5].push_back(VN[1]);
277 newCNX[PYRAM5].push_back(ng3);
278 cptNouvellesMailles[PYRAM5]++;
280 if (POSN[ng0 - 1] == 1)
282 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
283 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
287 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
288 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
291 else if (VN[0] != -1 && VN[2] != -1)
293 // Le sommet du nouveau T4 est le noeud 0 du T4 d'origine
295 // cout << "cas 2.02" << endl;
296 newCNX[TETRA4].push_back(VN[0]);
297 newCNX[TETRA4].push_back(VN[2]);
298 newCNX[TETRA4].push_back(ng2);
299 newCNX[TETRA4].push_back(ng0);
300 cptNouvellesMailles[TETRA4]++;
302 newCNX[PYRAM5].push_back(VN[0]);
303 newCNX[PYRAM5].push_back(VN[2]);
304 newCNX[PYRAM5].push_back(ng3);
305 newCNX[PYRAM5].push_back(ng1);
306 newCNX[PYRAM5].push_back(ng2);
307 cptNouvellesMailles[PYRAM5]++;
309 if (POSN[ng0 - 1] == 1)
311 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
312 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
316 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
317 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
320 else if (VN[0] != -1 && VN[3] != -1)
322 // Le sommet du nouveau T4 est le noeud 1 du T4 d'origine
324 // cout << "cas 2.03" << endl;
325 newCNX[TETRA4].push_back(VN[0]);
326 newCNX[TETRA4].push_back(VN[3]);
327 newCNX[TETRA4].push_back(ng3);
328 newCNX[TETRA4].push_back(ng1);
329 cptNouvellesMailles[TETRA4]++;
331 newCNX[PYRAM5].push_back(VN[0]);
332 newCNX[PYRAM5].push_back(VN[3]);
333 newCNX[PYRAM5].push_back(ng2);
334 newCNX[PYRAM5].push_back(ng0);
335 newCNX[PYRAM5].push_back(ng3);
336 cptNouvellesMailles[PYRAM5]++;
338 if (POSN[ng1 - 1] == 1)
340 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
341 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
345 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
346 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
349 else if (VN[0] != -1 && VN[4] != -1)
351 // Le sommet du nouveau T4 est le noeud 1 du T4 d'origine
353 // cout << "cas 2.04" << endl;
354 newCNX[TETRA4].push_back(VN[0]);
355 newCNX[TETRA4].push_back(ng2);
356 newCNX[TETRA4].push_back(VN[4]);
357 newCNX[TETRA4].push_back(ng1);
358 cptNouvellesMailles[TETRA4]++;
360 newCNX[PYRAM5].push_back(ng0);
361 newCNX[PYRAM5].push_back(ng3);
362 newCNX[PYRAM5].push_back(VN[4]);
363 newCNX[PYRAM5].push_back(VN[0]);
364 newCNX[PYRAM5].push_back(ng2);
365 cptNouvellesMailles[PYRAM5]++;
367 if (POSN[ng1 - 1] == 1)
369 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
370 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
374 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
375 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
379 else if (VN[0] != -1 && VN[5] != -1)
380 ERREUR("Case 2/05 forbidden");
382 else if (VN[1] != -1 && VN[2] != -1)
384 // Le sommet du nouveau T4 est le noeud 0 du T4 d'origine
386 // cout << "cas 2.12" << endl;
387 newCNX[TETRA4].push_back(ng1);
388 newCNX[TETRA4].push_back(VN[2]);
389 newCNX[TETRA4].push_back(VN[1]);
390 newCNX[TETRA4].push_back(ng0);
391 cptNouvellesMailles[TETRA4]++;
393 newCNX[PYRAM5].push_back(ng2);
394 newCNX[PYRAM5].push_back(ng3);
395 newCNX[PYRAM5].push_back(VN[2]);
396 newCNX[PYRAM5].push_back(VN[1]);
397 newCNX[PYRAM5].push_back(ng1);
398 cptNouvellesMailles[PYRAM5]++;
400 if (POSN[ng0 - 1] == 1)
402 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
403 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
407 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
408 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
411 else if (VN[1] != -1 && VN[3] != -1)
413 // Le sommet du nouveau T4 est le noeud 2 du T4 d'origine
415 // cout << "cas 2.13" << endl;
416 newCNX[TETRA4].push_back(VN[1]);
417 newCNX[TETRA4].push_back(ng3);
418 newCNX[TETRA4].push_back(VN[3]);
419 newCNX[TETRA4].push_back(ng2);
420 cptNouvellesMailles[TETRA4]++;
422 newCNX[PYRAM5].push_back(ng0);
423 newCNX[PYRAM5].push_back(ng1);
424 newCNX[PYRAM5].push_back(VN[3]);
425 newCNX[PYRAM5].push_back(VN[1]);
426 newCNX[PYRAM5].push_back(ng3);
427 cptNouvellesMailles[PYRAM5]++;
429 if (POSN[ng2 - 1] == 1)
431 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
432 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
436 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
437 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
441 else if (VN[1] != -1 && VN[4] != -1)
442 ERREUR("Case 2/14 excluded");
444 else if (VN[1] != -1 && VN[5] != -1)
446 // Le sommet du nouveau T4 est le noeud 2 du T4 d'origine
448 // cout << "cas 2.15" << endl;
449 newCNX[TETRA4].push_back(ng1);
450 newCNX[TETRA4].push_back(ng2);
451 newCNX[TETRA4].push_back(VN[1]);
452 newCNX[TETRA4].push_back(VN[5]);
453 cptNouvellesMailles[TETRA4]++;
455 newCNX[PYRAM5].push_back(VN[1]);
456 newCNX[PYRAM5].push_back(VN[5]);
457 newCNX[PYRAM5].push_back(ng3);
458 newCNX[PYRAM5].push_back(ng0);
459 newCNX[PYRAM5].push_back(ng1);
460 cptNouvellesMailles[PYRAM5]++;
462 if (POSN[ng2 - 1] == 1)
464 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
465 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
469 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
470 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
474 else if (VN[2] != -1 && VN[3] != -1)
475 ERREUR("Case 2/23 excluded");
477 else if (VN[2] != -1 && VN[4] != -1)
479 // Le sommet du nouveau T4 est le noeud 3 du T4 d'origine
481 // cout << "cas 2.24" << endl;
482 newCNX[TETRA4].push_back(VN[2]);
483 newCNX[TETRA4].push_back(VN[4]);
484 newCNX[TETRA4].push_back(ng2);
485 newCNX[TETRA4].push_back(ng3);
486 cptNouvellesMailles[TETRA4]++;
488 newCNX[PYRAM5].push_back(ng0);
489 newCNX[PYRAM5].push_back(VN[2]);
490 newCNX[PYRAM5].push_back(VN[4]);
491 newCNX[PYRAM5].push_back(ng1);
492 newCNX[PYRAM5].push_back(ng2);
493 cptNouvellesMailles[PYRAM5]++;
495 if (POSN[ng3 - 1] == 1)
497 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
498 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
502 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
503 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
507 else if (VN[2] != -1 && VN[5] != -1)
509 // Le sommet du nouveau T4 est le noeud 3 du T4 d'origine
511 // cout << "cas 2.25" << endl;
512 newCNX[TETRA4].push_back(ng1);
513 newCNX[TETRA4].push_back(VN[5]);
514 newCNX[TETRA4].push_back(VN[2]);
515 newCNX[TETRA4].push_back(ng3);
516 cptNouvellesMailles[TETRA4]++;
518 newCNX[PYRAM5].push_back(ng0);
519 newCNX[PYRAM5].push_back(ng2);
520 newCNX[PYRAM5].push_back(VN[5]);
521 newCNX[PYRAM5].push_back(VN[2]);
522 newCNX[PYRAM5].push_back(ng1);
523 cptNouvellesMailles[PYRAM5]++;
525 if (POSN[ng3 - 1] == 1)
527 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
528 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
532 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
533 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
537 else if (VN[3] != -1 && VN[4] != -1)
539 // Le sommet du nouveau T4 est le noeud 1 du T4 d'origine
541 // cout << "cas 2.34" << endl;
542 newCNX[TETRA4].push_back(ng0);
543 newCNX[TETRA4].push_back(VN[3]);
544 newCNX[TETRA4].push_back(VN[4]);
545 newCNX[TETRA4].push_back(ng1);
546 cptNouvellesMailles[TETRA4]++;
548 newCNX[PYRAM5].push_back(VN[3]);
549 newCNX[PYRAM5].push_back(VN[4]);
550 newCNX[PYRAM5].push_back(ng3);
551 newCNX[PYRAM5].push_back(ng2);
552 newCNX[PYRAM5].push_back(ng0);
553 cptNouvellesMailles[PYRAM5]++;
555 if (POSN[ng1 - 1] == 1)
557 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
558 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
562 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
563 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
567 else if (VN[3] != -1 && VN[5] != -1)
569 // Le sommet du nouveau T4 est le noeud 2 du T4 d'origine
571 // cout << "cas 2.35" << endl;
572 newCNX[TETRA4].push_back(VN[3]);
573 newCNX[TETRA4].push_back(VN[5]);
574 newCNX[TETRA4].push_back(ng2);
575 newCNX[TETRA4].push_back(ng0);
576 cptNouvellesMailles[TETRA4]++;
578 newCNX[PYRAM5].push_back(VN[3]);
579 newCNX[PYRAM5].push_back(ng1);
580 newCNX[PYRAM5].push_back(ng3);
581 newCNX[PYRAM5].push_back(VN[5]);
582 newCNX[PYRAM5].push_back(ng0);
583 cptNouvellesMailles[PYRAM5]++;
585 if (POSN[ng2 - 1] == 1)
587 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
588 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
592 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
593 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
597 else if (VN[4] != -1 && VN[5] != -1)
599 // Le sommet du nouveau T4 est le noeud 3 du T4 d'origine
601 // cout << "cas 2.35" << endl;
602 newCNX[TETRA4].push_back(ng0);
603 newCNX[TETRA4].push_back(VN[4]);
604 newCNX[TETRA4].push_back(VN[5]);
605 newCNX[TETRA4].push_back(ng3);
606 cptNouvellesMailles[TETRA4]++;
608 newCNX[PYRAM5].push_back(ng1);
609 newCNX[PYRAM5].push_back(VN[4]);
610 newCNX[PYRAM5].push_back(VN[5]);
611 newCNX[PYRAM5].push_back(ng2);
612 newCNX[PYRAM5].push_back(ng0);
613 cptNouvellesMailles[PYRAM5]++;
615 if (POSN[ng3 - 1] == 1)
617 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
618 GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
622 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
623 GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
628 ERREUR(" Intersections configuration not taken into account (case cptPI=2) ");
630 // int ngT4 = MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1;
631 // int ngP5 = MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1;
632 // cout << "La maille TETRA4 " << it4 << " produit les mailles TETRA4-" << ngT4 << " et PYRAM5-" << ngP5 << endl;
636 /*! Trois points d'intersection
637 * ATTENTION: pour les PENTA6 on adopte la convention d'orientation SALOME :
641 * où N1 N2 N3 sont les sommets du haut et N4 N5 N6 les sommets du bas
642 * (selon l'orientation donnée par le sens des triangles)
644 void MESHCUT::cas3(int VN[6], int it4)
646 cutTetras.push_back(it4);
647 // cout << "Cas 3 - it4="<<it4<<", VN = " << VN[0] << " " << VN[1] << " " << VN[2] << " " << VN[3] << " " << VN[4] << " " << VN[5] << " " << endl;
649 // Numéros des noeuds du TETRA4
650 int ng0 = MAILLAGE1->CNX[TETRA4][4 * it4 + 0];
651 int ng1 = MAILLAGE1->CNX[TETRA4][4 * it4 + 1];
652 int ng2 = MAILLAGE1->CNX[TETRA4][4 * it4 + 2];
653 int ng3 = MAILLAGE1->CNX[TETRA4][4 * it4 + 3];
655 if (VN[0] != -1 && VN[1] != -1 && VN[2] != -1)
658 // Le sommet du nouveau T4 est le noeud 0 du T4 d'origine
660 newCNX[TETRA4].push_back(ng0);
661 newCNX[TETRA4].push_back(VN[0]);
662 newCNX[TETRA4].push_back(VN[1]);
663 newCNX[TETRA4].push_back(VN[2]);
664 cptNouvellesMailles[TETRA4]++;
666 newCNX[PENTA6].push_back(ng1);
667 newCNX[PENTA6].push_back(ng3);
668 newCNX[PENTA6].push_back(ng2);
669 newCNX[PENTA6].push_back(VN[0]);
670 newCNX[PENTA6].push_back(VN[2]);
671 newCNX[PENTA6].push_back(VN[1]);
672 cptNouvellesMailles[PENTA6]++;
674 if (POSN[ng0 - 1] == 1)
676 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
677 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
681 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
682 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
686 else if (VN[0] != -1 && VN[3] != -1 && VN[4] != -1)
688 // Le sommet du nouveau T4 est le noeud 1 du T4 d'origine
690 //cout << "cas 3.2 (noeud sommet 1)" << endl;
691 newCNX[TETRA4].push_back(VN[0]);
692 newCNX[TETRA4].push_back(ng1);
693 newCNX[TETRA4].push_back(VN[3]);
694 newCNX[TETRA4].push_back(VN[4]);
695 cptNouvellesMailles[TETRA4]++;
697 newCNX[PENTA6].push_back(ng0);
698 newCNX[PENTA6].push_back(ng2);
699 newCNX[PENTA6].push_back(ng3);
700 newCNX[PENTA6].push_back(VN[0]);
701 newCNX[PENTA6].push_back(VN[3]);
702 newCNX[PENTA6].push_back(VN[4]);
703 cptNouvellesMailles[PENTA6]++;
705 if (POSN[ng1 - 1] == 1)
707 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
708 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
712 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
713 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
716 else if (VN[1] != -1 && VN[3] != -1 && VN[5] != -1)
718 // Le sommet du nouveau T4 est le noeud 2 du T4 d'origine
720 //cout << "cas 3.3 (noeud sommet 2)" << endl;
722 newCNX[TETRA4].push_back(VN[1]);
723 newCNX[TETRA4].push_back(VN[3]);
724 newCNX[TETRA4].push_back(ng2);
725 newCNX[TETRA4].push_back(VN[5]);
726 cptNouvellesMailles[TETRA4]++;
728 newCNX[PENTA6].push_back(ng0);
729 newCNX[PENTA6].push_back(ng3);
730 newCNX[PENTA6].push_back(ng1);
731 newCNX[PENTA6].push_back(VN[1]);
732 newCNX[PENTA6].push_back(VN[5]);
733 newCNX[PENTA6].push_back(VN[3]);
734 cptNouvellesMailles[PENTA6]++;
736 if (POSN[ng2 - 1] == 1)
738 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
739 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
743 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
744 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
747 else if (VN[2] != -1 && VN[4] != -1 && VN[5] != -1)
749 // Le sommet du nouveau T4 est le noeud 3 du T4 d'origine
751 newCNX[TETRA4].push_back(VN[2]);
752 newCNX[TETRA4].push_back(VN[4]);
753 newCNX[TETRA4].push_back(VN[5]);
754 newCNX[TETRA4].push_back(ng3);
755 cptNouvellesMailles[TETRA4]++;
757 newCNX[PENTA6].push_back(ng0);
758 newCNX[PENTA6].push_back(ng1);
759 newCNX[PENTA6].push_back(ng2);
760 newCNX[PENTA6].push_back(VN[2]);
761 newCNX[PENTA6].push_back(VN[4]);
762 newCNX[PENTA6].push_back(VN[5]);
763 cptNouvellesMailles[PENTA6]++;
765 if (POSN[ng3 - 1] == 1)
767 GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
768 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
772 GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
773 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
778 // cout << "Cas 3 - it4=" << it4 << ", VN = " << VN[0] << " " << VN[1] << " " << VN[2] << " " << VN[3] << " "
779 // << VN[4] << " " << VN[5] << " " << endl;
781 // int n0 = *(MAILLAGE1->CNX[TETRA4] + it4 * 4 + 0);
782 // float x0 = MAILLAGE1->XX[n0 - 1];
783 // float y0 = MAILLAGE1->YY[n0 - 1];
784 // float z0 = MAILLAGE1->ZZ[n0 - 1];
786 // int n1 = *(MAILLAGE1->CNX[TETRA4] + it4 * 4 + 1);
787 // float x1 = MAILLAGE1->XX[n1 - 1];
788 // float y1 = MAILLAGE1->YY[n1 - 1];
789 // float z1 = MAILLAGE1->ZZ[n1 - 1];
791 // int n2 = *(MAILLAGE1->CNX[TETRA4] + it4 * 4 + 2);
792 // float x2 = MAILLAGE1->XX[n2 - 1];
793 // float y2 = MAILLAGE1->YY[n2 - 1];
794 // float z2 = MAILLAGE1->ZZ[n2 - 1];
796 // int n3 = *(MAILLAGE1->CNX[TETRA4] + it4 * 4 + 3);
797 // float x3 = MAILLAGE1->XX[n3 - 1];
798 // float y3 = MAILLAGE1->YY[n3 - 1];
799 // float z3 = MAILLAGE1->ZZ[n3 - 1];
801 // cout << x0 << " " << y0 << " " << z0 << " " << endl;
802 // cout << x1 << " " << y1 << " " << z1 << " " << endl;
803 // cout << x2 << " " << y2 << " " << z2 << " " << endl;
804 // cout << x3 << " " << y3 << " " << z3 << " " << endl;
806 ERREUR(" Intersections configuration not taken into account (case cptPI=3) ");
809 // int ngT4 = MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1;
810 // int ngP6 = MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1;
811 // cout << "La maille TETRA4 " << it4 << " produit les mailles TETRA4-" << ngT4 << " et PENTA6-" << ngP6 << endl;
814 /*! Quatre points d'intersection
816 * ATTENTION: pour les PENTA6 on adopte la convention d'orientation SALOME
820 * où N1 N2 N3 sont les sommets du haut et N4 N5 N6 les sommets du bas
821 * (selon l'orientation donnée par le sens des triangles)
823 void MESHCUT::cas4(int VN[6], int it4)
825 cutTetras.push_back(it4);
826 // cout << "Cas 4 - it4=" << it4 << ", VN = " << VN[0] << " " << VN[1] << " " << VN[2] << " " << VN[3] << " " << VN[4]
827 // << " " << VN[5] << " " << endl;
829 // Numéros des noeuds du TETRA4
830 int ng0 = MAILLAGE1->CNX[TETRA4][4 * it4 + 0];
831 int ng1 = MAILLAGE1->CNX[TETRA4][4 * it4 + 1];
832 int ng2 = MAILLAGE1->CNX[TETRA4][4 * it4 + 2];
833 int ng3 = MAILLAGE1->CNX[TETRA4][4 * it4 + 3];
835 int i1, i2; // Numéros locaux dans le type des mailles créées
837 if (VN[0] == -1 && VN[5] == -1)
839 // Les deux arêtes opposées sont [0,1] et [2,3]
841 newCNX[PENTA6].push_back(ng0);
842 newCNX[PENTA6].push_back(VN[1]);
843 newCNX[PENTA6].push_back(VN[2]);
844 newCNX[PENTA6].push_back(ng1);
845 newCNX[PENTA6].push_back(VN[3]);
846 newCNX[PENTA6].push_back(VN[4]);
847 cptNouvellesMailles[PENTA6]++;
848 i1 = cptNouvellesMailles[PENTA6] - 1;
850 newCNX[PENTA6].push_back(ng3);
851 newCNX[PENTA6].push_back(VN[4]);
852 newCNX[PENTA6].push_back(VN[2]);
853 newCNX[PENTA6].push_back(ng2);
854 newCNX[PENTA6].push_back(VN[3]);
855 newCNX[PENTA6].push_back(VN[1]);
856 cptNouvellesMailles[PENTA6]++;
857 i2 = cptNouvellesMailles[PENTA6] - 1;
859 if (POSN[ng0 - 1] == 1)
861 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1);
862 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2);
866 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2);
867 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1);
870 } // if ( VN[0]==-1 && VN[5]==-1 )
872 else if (VN[1] == -1 && VN[4] == -1)
874 // Les deux arêtes opposées sont [0,2] et [1,3]
876 newCNX[PENTA6].push_back(ng2);
877 newCNX[PENTA6].push_back(VN[3]);
878 newCNX[PENTA6].push_back(VN[5]);
879 newCNX[PENTA6].push_back(ng0);
880 newCNX[PENTA6].push_back(VN[0]);
881 newCNX[PENTA6].push_back(VN[2]);
882 cptNouvellesMailles[PENTA6]++;
883 i1 = cptNouvellesMailles[PENTA6] - 1;
885 newCNX[PENTA6].push_back(ng1);
886 newCNX[PENTA6].push_back(VN[3]);
887 newCNX[PENTA6].push_back(VN[0]);
888 newCNX[PENTA6].push_back(ng3);
889 newCNX[PENTA6].push_back(VN[5]);
890 newCNX[PENTA6].push_back(VN[2]);
891 cptNouvellesMailles[PENTA6]++;
892 i2 = cptNouvellesMailles[PENTA6] - 1;
894 if (POSN[ng0 - 1] == 1)
896 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1);
897 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2);
901 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2);
902 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1);
906 else if (VN[2] == -1 && VN[3] == -1)
908 // Les deux arêtes opposées sont [0,3] et [1,2]
910 newCNX[PENTA6].push_back(ng0);
911 newCNX[PENTA6].push_back(VN[0]);
912 newCNX[PENTA6].push_back(VN[1]);
913 newCNX[PENTA6].push_back(ng3);
914 newCNX[PENTA6].push_back(VN[4]);
915 newCNX[PENTA6].push_back(VN[5]);
916 cptNouvellesMailles[PENTA6]++;
917 i1 = cptNouvellesMailles[PENTA6] - 1;
919 newCNX[PENTA6].push_back(ng2);
920 newCNX[PENTA6].push_back(VN[5]);
921 newCNX[PENTA6].push_back(VN[1]);
922 newCNX[PENTA6].push_back(ng1);
923 newCNX[PENTA6].push_back(VN[4]);
924 newCNX[PENTA6].push_back(VN[0]);
925 cptNouvellesMailles[PENTA6]++;
926 i2 = cptNouvellesMailles[PENTA6] - 1;
928 if (POSN[ng0 - 1] == 1)
930 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1);
931 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2);
935 GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2);
936 GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1);
940 ERREUR(" Intersection configuration not taken into account (case cptPI=4) ");
942 // int nl1 = MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1;
943 // int nl2 = MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2;
944 // cout << "La maille TETRA4 " << it4 << " produit les mailles PENTA6-" << nl1 << " et PENTA6-" << nl2 << endl;