Salome HOME
Replace oe by ?
[modules/smesh.git] / src / Tools / MeshCut / MeshCut_Cas.cxx
1 #include "MeshCut_Cas.hxx"
2
3 #include "MeshCut_Globals.hxx"
4
5 using namespace MESHCUT;
6 using namespace std;
7
8 /*!
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.
11
12  * Le T4 initial produit deux nouveaux T4.
13  */
14 void MESHCUT::cas1(int VN[6], int it4)
15 {
16
17   //  cout << "Cas 1 - it4=" << it4 << ", VN = " << VN[0] << " " << VN[1] << " " << VN[2] << " " << VN[3] << " " << VN[4]
18   //      << " " << VN[5] << " " << endl;
19
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];
25
26   int i1, i2;
27
28   if (VN[0] != -1)
29     {
30       // Le sommet de T4new1 servant à la détermination du groupe est le noeud 1 du T4 d'origine
31
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;
39
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;
46
47       if (POSN[ng1 - 1] == 1)
48         {
49           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
50           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
51         }
52       else
53         {
54           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
55           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
56         }
57     }
58
59   else if (VN[1] != -1)
60     {
61       // Le sommet de T4new1 servant à la détermination du groupe est le noeud 0 du T4 d'origine
62
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;
70
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;
77
78       if (POSN[ng0 - 1] == 1)
79         {
80           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
81           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
82         }
83       else
84         {
85           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
86           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
87         }
88     }
89
90   else if (VN[2] != -1)
91     {
92       // Le sommet de T4new1 servant à la détermination du groupe est le noeud 0 du T4 d'origine
93
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;
101
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;
108
109       if (POSN[ng0 - 1] == 1)
110         {
111           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
112           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
113         }
114       else
115         {
116           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
117           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
118         }
119     }
120
121   else if (VN[3] != -1)
122     {
123       // Le sommet de T4new1 servant à la détermination du groupe est le noeud 1 du T4 d'origine
124
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;
132
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;
139
140       if (POSN[ng1 - 1] == 1)
141         {
142           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
143           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
144         }
145       else
146         {
147           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
148           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
149         }
150     }
151
152   else if (VN[4] != -1)
153     {
154       // Le sommet de T4new1 servant à la détermination du groupe est le noeud 1 du T4 d'origine
155
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;
163
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;
170
171       if (POSN[ng1 - 1] == 1)
172         {
173           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
174           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
175         }
176       else
177         {
178           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
179           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
180         }
181     }
182
183   else if (VN[5] != -1)
184     {
185       // Le sommet de T4new1 servant à la détermination du groupe est le noeud 3 du T4 d'origine
186
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;
194
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;
201
202       if (POSN[ng3 - 1] == 1)
203         {
204           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
205           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
206         }
207       else
208         {
209           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i2);
210           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + i1);
211         }
212     }
213
214   else
215     ERREUR(" Configuration intersections non reconnue (cas cptPI=1) ");
216
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;
220
221 }
222
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é.
227  *
228  *  Le T4 initial produit un nouveau T4 et un élément PYRAM5.
229  *
230  */
231 void MESHCUT::cas2(int VN[6], int it4)
232 {
233
234   //  cout << "Cas 2 - it4=" << it4 << ", VN = " << VN[0] << " " << VN[1] << " " << VN[2] << " " << VN[3] << " " << VN[4]
235   //      << " " << VN[5] << " " << endl;
236
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];
242
243   if (VN[0] != -1 && VN[1] != -1)
244     {
245       // Le sommet du nouveau T4 est le noeud 0 du T4 d'origine
246
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]++;
253
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]++;
260
261       if (POSN[ng0 - 1] == 1)
262         {
263           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
264           GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
265         }
266       else
267         {
268           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
269           GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
270         }
271     }
272   else if (VN[0] != -1 && VN[2] != -1)
273     {
274       // Le sommet du nouveau T4 est le noeud 0 du T4 d'origine
275
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]++;
282
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]++;
289
290       if (POSN[ng0 - 1] == 1)
291         {
292           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
293           GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
294         }
295       else
296         {
297           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
298           GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
299         }
300     }
301   else if (VN[0] != -1 && VN[3] != -1)
302     {
303       // Le sommet du nouveau T4 est le noeud 1 du T4 d'origine
304
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]++;
311
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]++;
318
319       if (POSN[ng1 - 1] == 1)
320         {
321           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
322           GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
323         }
324       else
325         {
326           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
327           GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
328         }
329     }
330   else if (VN[0] != -1 && VN[4] != -1)
331     {
332       // Le sommet du nouveau T4 est le noeud 1 du T4 d'origine
333
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]++;
340
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]++;
347
348       if (POSN[ng1 - 1] == 1)
349         {
350           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
351           GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
352         }
353       else
354         {
355           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
356           GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
357         }
358     }
359
360   else if (VN[0] != -1 && VN[5] != -1)
361     ERREUR("Cas 2/05 interdit");
362
363   else if (VN[1] != -1 && VN[2] != -1)
364     {
365       // Le sommet du nouveau T4 est le noeud 0 du T4 d'origine
366
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]++;
373
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]++;
380
381       if (POSN[ng0 - 1] == 1)
382         {
383           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
384           GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
385         }
386       else
387         {
388           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
389           GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
390         }
391     }
392   else if (VN[1] != -1 && VN[3] != -1)
393     {
394       // Le sommet du nouveau T4 est le noeud 2 du T4 d'origine
395
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]++;
402
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]++;
409
410       if (POSN[ng2 - 1] == 1)
411         {
412           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
413           GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
414         }
415       else
416         {
417           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
418           GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
419         }
420     }
421
422   else if (VN[1] != -1 && VN[4] != -1)
423     ERREUR("Cas 2/14 exclu");
424
425   else if (VN[1] != -1 && VN[5] != -1)
426     {
427       // Le sommet du nouveau T4 est le noeud 2 du T4 d'origine
428
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]++;
435
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]++;
442
443       if (POSN[ng2 - 1] == 1)
444         {
445           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
446           GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
447         }
448       else
449         {
450           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
451           GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
452         }
453     }
454
455   else if (VN[2] != -1 && VN[3] != -1)
456     ERREUR("Cas 2/23 exclu");
457
458   else if (VN[2] != -1 && VN[4] != -1)
459     {
460       // Le sommet du nouveau T4 est le noeud 3 du T4 d'origine
461
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]++;
468
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]++;
475
476       if (POSN[ng3 - 1] == 1)
477         {
478           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
479           GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
480         }
481       else
482         {
483           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
484           GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
485         }
486     }
487
488   else if (VN[2] != -1 && VN[5] != -1)
489     {
490       // Le sommet du nouveau T4 est le noeud 3 du T4 d'origine
491
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]++;
498
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]++;
505
506       if (POSN[ng3 - 1] == 1)
507         {
508           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
509           GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
510         }
511       else
512         {
513           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
514           GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
515         }
516     }
517
518   else if (VN[3] != -1 && VN[4] != -1)
519     {
520       // Le sommet du nouveau T4 est le noeud 1 du T4 d'origine
521
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]++;
528
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]++;
535
536       if (POSN[ng1 - 1] == 1)
537         {
538           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
539           GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
540         }
541       else
542         {
543           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
544           GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
545         }
546     }
547
548   else if (VN[3] != -1 && VN[5] != -1)
549     {
550       // Le sommet du nouveau T4 est le noeud 2 du T4 d'origine
551
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]++;
558
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]++;
565
566       if (POSN[ng2 - 1] == 1)
567         {
568           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
569           GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
570         }
571       else
572         {
573           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
574           GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
575         }
576     }
577
578   else if (VN[4] != -1 && VN[5] != -1)
579     {
580       // Le sommet du nouveau T4 est le noeud 3 du T4 d'origine
581
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]++;
588
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]++;
595
596       if (POSN[ng3 - 1] == 1)
597         {
598           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
599           GMmoins[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
600         }
601       else
602         {
603           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
604           GMplus[PYRAM5].push_back(MAILLAGE1->EFFECTIFS_TYPES[PYRAM5] + cptNouvellesMailles[PYRAM5] - 1);
605         }
606     }
607
608   else
609     ERREUR(" Configuration intersections non reconnue (cas cptPI=2) ");
610
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;
614
615 }
616
617 /*! Trois points d'intersection
618  *  ATTENTION: pour les PENTA6 on adopte la convention d'orientation SALOME :
619  *
620  *  N1 N2 N3 N4 N5 N6
621  *
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)
624  */
625 void MESHCUT::cas3(int VN[6], int it4)
626 {
627
628   // cout << "Cas 3 - it4="<<it4<<", VN = " << VN[0] << " " << VN[1] << " " << VN[2] << " " << VN[3] << " " << VN[4] << " " << VN[5] << " " << endl;
629
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];
635
636   if (VN[0] != -1 && VN[1] != -1 && VN[2] != -1)
637     {
638
639       // Le sommet du nouveau T4 est le noeud 0 du T4 d'origine
640
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]++;
646
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]++;
654
655       if (POSN[ng0 - 1] == 1)
656         {
657           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
658           GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
659         }
660       else
661         {
662           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
663           GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
664         }
665     }
666
667   else if (VN[0] != -1 && VN[3] != -1 && VN[4] != -1)
668     {
669       // Le sommet du nouveau T4 est le noeud 1 du T4 d'origine
670
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]++;
677
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]++;
685
686       if (POSN[ng1 - 1] == 1)
687         {
688           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
689           GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
690         }
691       else
692         {
693           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
694           GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
695         }
696     }
697   else if (VN[1] != -1 && VN[3] != -1 && VN[5] != -1)
698     {
699       // Le sommet du nouveau T4 est le noeud 2 du T4 d'origine
700
701       //cout << "cas 3.3 (noeud sommet 2)" << endl;
702
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]++;
708
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]++;
716
717       if (POSN[ng2 - 1] == 1)
718         {
719           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
720           GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
721         }
722       else
723         {
724           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
725           GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
726         }
727     }
728   else if (VN[2] != -1 && VN[4] != -1 && VN[5] != -1)
729     {
730       // Le sommet du nouveau T4 est le noeud 3 du T4 d'origine
731
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]++;
737
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]++;
745
746       if (POSN[ng3 - 1] == 1)
747         {
748           GMplus[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
749           GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
750         }
751       else
752         {
753           GMmoins[TETRA4].push_back(MAILLAGE1->EFFECTIFS_TYPES[TETRA4] + cptNouvellesMailles[TETRA4] - 1);
754           GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + cptNouvellesMailles[PENTA6] - 1);
755         }
756     }
757   else
758     {
759       //      cout << "Cas 3 - it4=" << it4 << ", VN = " << VN[0] << " " << VN[1] << " " << VN[2] << " " << VN[3] << " "
760       //          << VN[4] << " " << VN[5] << " " << endl;
761       //
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];
766       //
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];
771       //
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];
776       //
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];
781       //
782       //      cout << x0 << " " << y0 << " " << z0 << " " << endl;
783       //      cout << x1 << " " << y1 << " " << z1 << " " << endl;
784       //      cout << x2 << " " << y2 << " " << z2 << " " << endl;
785       //      cout << x3 << " " << y3 << " " << z3 << " " << endl;
786
787       ERREUR(" Configuration intersections non reconnue (cas cptPI=3) ");
788     }
789
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;
793 }
794
795 /*! Quatre points d'intersection
796  *
797  *  ATTENTION: pour les PENTA6 on adopte la convention d'orientation SALOME
798  *
799  *  N1 N2 N3 N4 N5 N6
800  *
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)
803  */
804 void MESHCUT::cas4(int VN[6], int it4)
805 {
806
807   //  cout << "Cas 4 - it4=" << it4 << ", VN = " << VN[0] << " " << VN[1] << " " << VN[2] << " " << VN[3] << " " << VN[4]
808   //      << " " << VN[5] << " " << endl;
809
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];
815
816   int i1, i2; // Numéros locaux dans le type des mailles créées
817
818   if (VN[0] == -1 && VN[5] == -1)
819     {
820       // Les deux arêtes opposées sont [0,1] et [2,3]
821
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;
830
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;
839
840       if (POSN[ng0 - 1] == 1)
841         {
842           GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1);
843           GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2);
844         }
845       else
846         {
847           GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2);
848           GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1);
849         }
850
851     } // if ( VN[0]==-1 && VN[5]==-1 )
852
853   else if (VN[1] == -1 && VN[4] == -1)
854     {
855       // Les deux arêtes opposées sont [0,2] et [1,3]
856
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;
865
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;
874
875       if (POSN[ng0 - 1] == 1)
876         {
877           GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1);
878           GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2);
879         }
880       else
881         {
882           GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2);
883           GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1);
884         }
885     }
886
887   else if (VN[2] == -1 && VN[3] == -1)
888     {
889       // Les deux arêtes opposées sont [0,3] et [1,2]
890
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;
899
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;
908
909       if (POSN[ng0 - 1] == 1)
910         {
911           GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1);
912           GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2);
913         }
914       else
915         {
916           GMplus[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i2);
917           GMmoins[PENTA6].push_back(MAILLAGE1->EFFECTIFS_TYPES[PENTA6] + i1);
918         }
919     }
920   else
921     ERREUR(" Configuration intersections non reconnue (cas cptPI=4) ");
922
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;
926 }