1 // Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License.
9 // This library is distributed in the hope that it will be useful
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 // See http://www.salome-platform.org/
20 #ifndef WRAPPERS_CELLS_HXX
21 #define WRAPPERS_CELLS_HXX
43 #include "MEDMEM_define.hxx"
47 //////////////////////////////////////////////////////////////////
51 //////////////////////////////////////////////////////////////////
53 /*********************************************************/
55 /* Equivalence num modele local => MED */
57 /*********************************************************/
59 #define NBR_MODELES_MAILLES_DEFINIS 15
60 static int Equivalence_Local_MED[NBR_MODELES_MAILLES_DEFINIS] = { MED_EN::MED_POINT1 ,
61 MED_EN::MED_SEG2 , MED_EN::MED_SEG3,
62 MED_EN::MED_TRIA3 , MED_EN::MED_TRIA6 , MED_EN::MED_QUAD4 , MED_EN::MED_QUAD8 ,
63 MED_EN::MED_TETRA4 , MED_EN::MED_TETRA10 , MED_EN::MED_HEXA8 , MED_EN::MED_HEXA20 , MED_EN::MED_PYRA5 , MED_EN::MED_PYRA13 , MED_EN::MED_PENTA6 , MED_EN::MED_PENTA15 };
65 /*********************************************************/
67 /* Classe Connectivite_Canonique_Base */
69 /*********************************************************/
71 // classe mere des connectivités cannoniques
72 // N'a aucune méthode virtuelle pour éviter les pertes de temps
73 // Ce sont les constructeurs des classes dérivées qui renseignent les attributs spécifiques
74 // un simplexe de base est constitué par un sommet de la maille qui n'est pas contenu dans la face démandée et par trois points de cette face
75 // Ce simplexe est utilisé dans le calcul des fonctions barycentriques
76 // LES MAILLES SONT DONC ET PAR CONSEQUENT DES MAILLES A FACES PLANES
77 // Une face est une face P1, c'est a dire contenant uniquement les sommets, par les noeuds milieux
78 // Ces faces sont utilisées pour le calcul de connexité
81 class Connectivite_Canonique_Base
87 vector<int> premier_noeud ;
88 vector< vector<int> > simplexe_base ;
89 vector< vector<int> > face ;
91 inline int DONNE_NBR_NOEUDS() const { return nbr_noeuds; }
92 inline int DONNE_NBR_FACES() const { return nbr_faces; }
93 inline const vector<int> & DONNE_SIMPLEXE_BASE(int num_face) const { return simplexe_base[num_face]; }
94 inline const vector<int> & DONNE_FACE(int num_face) const { return face[num_face]; }
95 inline int DONNE_PREMIER_NOEUD_DE_FACE(int num_face) const { return premier_noeud[num_face]; }
96 friend class Wrapper_Maille;
99 /*********************************************************/
101 /* Classe Connectivite_Canonique_* */
103 /*********************************************************/
105 // définies dans la partie CODE
106 // les constructeurs construisent tous les tableaux de connectivités nécessaires en fonction du MODELE MED
108 //class Connectivite_Canonique_Point1 : public Connectivite_Canonique_Base;
109 //class Connectivite_Canonique_Seg2 : public Connectivite_Canonique_Base;
110 //class Connectivite_Canonique_Seg3 : public Connectivite_Canonique_Base;
111 //class Connectivite_Canonique_Tria3 : public Connectivite_Canonique_Base;
112 //class Connectivite_Canonique_Tria6 : public Connectivite_Canonique_Base;
113 //class Connectivite_Canonique_Quad4 : public Connectivite_Canonique_Base;
114 //class Connectivite_Canonique_Quad8 : public Connectivite_Canonique_Base;
115 //class Connectivite_Canonique_Tetra4 : public Connectivite_Canonique_Base;
116 //class Connectivite_Canonique_Tetra10 : public Connectivite_Canonique_Base;
117 //class Connectivite_Canonique_Hexa8 : public Connectivite_Canonique_Base;
118 //class Connectivite_Canonique_Hexa20 : public Connectivite_Canonique_Base;
119 //class Connectivite_Canonique_Pyra5 : public Connectivite_Canonique_Base;
120 //class Connectivite_Canonique_Pyra13 : public Connectivite_Canonique_Base;
121 //class Connectivite_Canonique_Penta6 : public Connectivite_Canonique_Base;
122 //class Connectivite_Canonique_Penta15 : public Connectivite_Canonique_Base;
124 /*********************************************************/
126 /* Classe Connectivite_Generale */
128 /*********************************************************/
130 // Cette classe contient toutes les connectivités canoniques, elle est utilisée dans Wrapper_Nuage_Maille
132 class Connectivite_Generale
135 vector<Connectivite_Canonique_Base *> AllConn;
137 Connectivite_Generale();
138 ~Connectivite_Generale();
139 // Renvoie la connectivite locale de la maille de numero local de modele i, dont l'equivalent MED est Equivalence_Local_MED[i]
140 Connectivite_Canonique_Base * operator[](int i) const {return AllConn[i];}
143 /*********************************************************/
145 /* Structure type_retour */
147 /*********************************************************/
149 // c'est une structure de type petit tableau statique, pour accelerer les acces et eviter les allocations dynamiques
157 /*********************************************************/
159 /* Fonction Comparaison_Informe(...) */
161 /*********************************************************/
163 // renvoie vrai si v1 et v2 contiennent la meme chose et sont de meme tailles, faux sinon
165 inline int Comparaison_Informe(const type_retour &v1,const type_retour &v2);
167 /*********************************************************/
169 /* Classe Wrapper_Maille */
171 /*********************************************************/
173 // c'est le wrapper maille sur int[]
174 // cette classe n'est pas dérivée, tous les types de mailles sont stockées sous cette forme
175 // la variable qui définit les type est la Connectivité_Canonique_Base, qui est toujours polymorphée en un type spécifique
182 // la référence du premier sommet
184 // la connectivité canonique, toujours polymorphée
185 Connectivite_Canonique_Base * modele;
188 Wrapper_Maille():sommets(NULL) {}
191 // sorte de transtypeur, cette méthode prend une référence vers un premier sommet et un modele canonique et renvoie *this en tant que wrapper sur ces données
192 inline const Wrapper_Maille & positionne(int * pos, Connectivite_Canonique_Base * mod){sommets=pos;modele=mod;return *this;}
193 // méthodes de la politique (les numéros renvoyés sont des numéros GLOBAUX, calculés à partir de l'indirection fournie par la connectivité canonique
194 // par contre les numéros de face fournis sont des numéros locaux
195 // renvoie le numéro global du sommet de numéro local i
196 inline int operator[](int i) const {return sommets[i];}
197 inline int DONNE_NBR_NOEUDS() const;
198 inline int DONNE_NBR_FACES() const;
199 inline void DONNE_SIMPLEXE_BASE(int num_face,type_retour & simplexe) const;
200 inline void DONNE_FACE(int num_face,type_retour & face) const;
201 inline int DONNE_PREMIER_NOEUD_DE_FACE(int num_face) const;
202 // pour une face, donne, s'il existe, le numéro local de face équivalente, -1 sinon
203 inline int DONNE_NUM_LOC_FACE_EGALE_A_FORMANT(const type_retour & sommets_face) const;
204 // donne le numéro local de modele
205 inline int DONNE_TYPE_MAILLE() const;
206 // donne le numéro MED de modele
207 inline int DONNE_TYPE_MED_MAILLE() const;
211 /*********************************************************/
213 /* Classe Wrapper_Nuage_Maille */
215 /*********************************************************/
217 // Classe de Wrapping sur un nuage de maille donné sous forme SKYLINE
218 // voir la classe Wrapper_Med_Connectivity dans MEDMEM_Wrapper_Connectivity.hxx pour la politique de classe
220 template <class FORME_SKYLINE> class Wrapper_Nuage_Maille
223 // pointeur sur une forme skyline
224 FORME_SKYLINE * mailles;
225 // toutes les connectivités canoniques
226 Connectivite_Generale ConnGen;
228 // ATTENTION, c'est le type en numero local de modele, pour éviter une map, le numéro de modele MED correponsdant est donné par Equivalence_Local_MED
230 // pointeur dans mailles du premier sommet de chaque maille (évite les calculs du au nombres éventuellement différents de sommets par maille)
231 vector< int * > premier_pointeur;
232 // maille_courante, est un Wrapper_Maille déja instancié utilisé par l'opérateur [] pour accelerer les acces
233 Wrapper_Maille maille_courante;
235 Wrapper_Nuage_Maille():mailles(NULL) {}
236 // le constructeur renseigne types et premier_pointeur, instantie ConnGenn et positionne maille_courante sur la premiere maille
237 Wrapper_Nuage_Maille(FORME_SKYLINE * fs);
238 ~Wrapper_Nuage_Maille() {}
239 // Méthodes de la politique
240 // positionne maille_courante sur la maille de numéro global i et renvoie maille_courante
241 inline const Wrapper_Maille & operator[](int i);
242 inline int SIZE() {return nbr_mailles;}
246 //////////////////////////////////////////////////////////////////
250 //////////////////////////////////////////////////////////////////
252 /*********************************************************/
254 /* Fonction Comparaison_Informe(...) */
256 /*********************************************************/
258 // effectue le test (v1 et v2 ont meme taille)&&(chaque élément de v1 est dans v2)
259 // c'est une égalité forte si on est sur que v1 et v2 n'ont pas de doublets,
260 // ce qui est le cas pour les mailles et les simplexes
262 int Comparaison_Informe(const type_retour &v1,const type_retour &v2)
266 if (t1!=t2) return FAUX;
269 for (i1=0;i1<t1;i1++)
272 for (i2=0;(i2<t2)&&(test);i2++)
274 if (v1.quoi[i1]==v2.quoi[i2]) test=0;
276 if (test) return FAUX;
281 /*********************************************************/
283 /* Classe Wrapper_Maille */
285 /*********************************************************/
287 inline int Wrapper_Maille::DONNE_NBR_NOEUDS() const
289 return modele->DONNE_NBR_NOEUDS();
291 inline int Wrapper_Maille::DONNE_NBR_FACES() const
293 return modele->DONNE_NBR_FACES();
295 inline void Wrapper_Maille::DONNE_SIMPLEXE_BASE(int num_face,type_retour & simplexe) const
297 const vector<int> & simplexelocal=modele->DONNE_SIMPLEXE_BASE(num_face);
298 simplexe.combien=simplexelocal.size();
299 for (int i=0;i<simplexe.combien;i++) simplexe.quoi[i]=sommets[simplexelocal[i]];
301 inline void Wrapper_Maille::DONNE_FACE(int num_face,type_retour & face) const
303 const vector<int> & facelocal=modele->DONNE_FACE(num_face);
304 face.combien=facelocal.size();
305 for (int i=0;i<face.combien;i++) face.quoi[i]=sommets[facelocal[i]];
307 inline int Wrapper_Maille::DONNE_PREMIER_NOEUD_DE_FACE(int num_face) const
309 return sommets[modele->DONNE_PREMIER_NOEUD_DE_FACE(num_face)];
311 inline int Wrapper_Maille::DONNE_NUM_LOC_FACE_EGALE_A_FORMANT(const type_retour & sommets_face) const
313 type_retour face_loc;
315 for (num_face=0;num_face<DONNE_NBR_FACES();num_face++)
317 DONNE_FACE(num_face,face_loc);
318 if (Comparaison_Informe(face_loc,sommets_face)) return num_face;
322 inline int Wrapper_Maille::DONNE_TYPE_MAILLE() const
326 inline int Wrapper_Maille::DONNE_TYPE_MED_MAILLE() const
328 return Equivalence_Local_MED[modele->type];
332 /*********************************************************/
334 /* Classe Wrapper_Nuage_Maille */
336 /*********************************************************/
338 template <class FORME_SKYLINE> Wrapper_Nuage_Maille<FORME_SKYLINE>::Wrapper_Nuage_Maille(FORME_SKYLINE * fs):mailles(fs)
341 map<int,int> Equivalence_MED_Local;
342 // calcule la map de convertion des types med en numéro local, pour accelerer l'acces
343 for (i=0;i<NBR_MODELES_MAILLES_DEFINIS;i++) Equivalence_MED_Local[Equivalence_Local_MED[i]]=i;
344 nbr_mailles=mailles->SIZE();
345 types.resize(nbr_mailles);
346 premier_pointeur.resize(nbr_mailles);
347 for (i=0;i<nbr_mailles;i++)
349 types[i]=Equivalence_MED_Local[mailles->DONNE_TYPE_MAILLE(i)];
350 premier_pointeur[i]=mailles->DONNE_PREMIER_POINTEUR(i);
352 maille_courante.positionne(premier_pointeur[0],ConnGen[types[0]]);
354 template <class FORME_SKYLINE> const Wrapper_Maille & Wrapper_Nuage_Maille<FORME_SKYLINE>::operator[](int i)
356 return maille_courante.positionne(premier_pointeur[i],ConnGen[types[i]]);
358 template <class FORME_SKYLINE> void Wrapper_Nuage_Maille<FORME_SKYLINE>::affiche()
361 for (i=0;i<nbr_mailles;i++)
363 cout<<"Maille "<<i<<" MED "<<Equivalence_Local_MED[types[i]]<<" : "<<flush;
364 for (j=0;j<(*this)[i].DONNE_NBR_NOEUDS();j++) cout<<(*this)[i][j]<<" "<<flush;
369 /*********************************************************/
371 /* Classe Connectivite_Canonique_Point1 */
373 /*********************************************************/
375 class Connectivite_Canonique_Point1 : public Connectivite_Canonique_Base
378 Connectivite_Canonique_Point1()
386 premier_noeud = vector<int>(0);
388 simplexe_base = vector< vector<int> >(nbr_faces);
389 face = vector< vector<int> >(nbr_faces);
392 ~Connectivite_Canonique_Point1() {}
395 /*********************************************************/
397 /* Classe Connectivite_Canonique_Seg2 */
399 /*********************************************************/
401 class Connectivite_Canonique_Seg2 : public Connectivite_Canonique_Base
404 Connectivite_Canonique_Seg2()
410 int sb[4] = {1,0,0,1};
418 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
420 simplexe_base = vector< vector<int> >(nbr_faces);
421 face = vector< vector<int> >(nbr_faces);
425 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[2*i],&sb[2*(i+1)]);
426 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
429 ~Connectivite_Canonique_Seg2() {}
431 /*********************************************************/
433 /* Classe Connectivite_Canonique_Seg3 */
435 /*********************************************************/
437 class Connectivite_Canonique_Seg3 : public Connectivite_Canonique_Base
440 Connectivite_Canonique_Seg3()
446 int sb[4] = {1,0,0,1};
454 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
456 simplexe_base = vector< vector<int> >(nbr_faces);
457 face = vector< vector<int> >(nbr_faces);
461 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[2*i],&sb[2*(i+1)]);
462 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
465 ~Connectivite_Canonique_Seg3() {}
469 /*********************************************************/
471 /* Classe Connectivite_Canonique_Tria3 */
473 /*********************************************************/
475 class Connectivite_Canonique_Tria3 : public Connectivite_Canonique_Base
478 Connectivite_Canonique_Tria3()
484 int sb[9] = {2,0,1,0,1,2,1,2,0};
485 int fa[6] = {0,1,1,2,2,0};
486 int po[4] = {0,2,4,6};
491 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
493 simplexe_base = vector< vector<int> >(nbr_faces);
494 face = vector< vector<int> >(nbr_faces);
498 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[3*i],&sb[3*(i+1)]);
499 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
502 ~Connectivite_Canonique_Tria3() {}
505 /*********************************************************/
507 /* Classe Connectivite_Canonique_Tria6 */
509 /*********************************************************/
511 class Connectivite_Canonique_Tria6 : public Connectivite_Canonique_Base
514 Connectivite_Canonique_Tria6()
520 int sb[9] = {2,0,1,0,1,2,1,2,0};
521 int fa[6] = {0,1,1,2,2,0};
522 int po[4] = {0,2,4,6};
527 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
529 simplexe_base = vector< vector<int> >(nbr_faces);
530 face = vector< vector<int> >(nbr_faces);
534 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[3*i],&sb[3*(i+1)]);
535 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
538 ~Connectivite_Canonique_Tria6() {}
541 /*********************************************************/
543 /* Classe Connectivite_Canonique_Quad4 */
545 /*********************************************************/
547 class Connectivite_Canonique_Quad4 : public Connectivite_Canonique_Base
550 Connectivite_Canonique_Quad4()
555 int pn[4] = {0,1,2,3};
556 int sb[12] = {2,0,1,3,1,2,0,2,3,1,3,0};
557 int fa[8] = {0,1,1,2,2,3,3,0};
558 int po[5] = {0,2,4,6,8};
563 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
565 simplexe_base = vector< vector<int> >(nbr_faces);
566 face = vector< vector<int> >(nbr_faces);
570 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[3*i],&sb[3*(i+1)]);
571 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
574 ~Connectivite_Canonique_Quad4() {}
578 /*********************************************************/
580 /* Classe Connectivite_Canonique_Quad8 */
582 /*********************************************************/
584 class Connectivite_Canonique_Quad8 : public Connectivite_Canonique_Base
587 Connectivite_Canonique_Quad8()
592 int pn[4] = {0,1,2,3};
593 int sb[12] = {2,0,1,3,1,2,0,2,3,1,3,0};
594 int fa[8] = {0,1,1,2,2,3,3,0};
595 int po[5] = {0,2,4,6,8};
600 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
602 simplexe_base = vector< vector<int> >(nbr_faces);
603 face = vector< vector<int> >(nbr_faces);
607 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[3*i],&sb[3*(i+1)]);
608 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
611 ~Connectivite_Canonique_Quad8() {}
614 /*********************************************************/
616 /* Classe Connectivite_Canonique_Tetra4 */
618 /*********************************************************/
620 class Connectivite_Canonique_Tetra4 : public Connectivite_Canonique_Base
623 Connectivite_Canonique_Tetra4()
628 int pn[4] = {0,0,1,2};
629 int sb[16] = {3,0,1,2,2,0,3,1,0,1,3,2,1,2,3,0};
630 int fa[12] = {0,1,2,0,3,1,1,3,2,2,3,0};
631 int po[5] = {0,3,6,9,12};
636 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
638 simplexe_base = vector< vector<int> >(nbr_faces);
639 face = vector< vector<int> >(nbr_faces);
643 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
644 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
647 ~Connectivite_Canonique_Tetra4() {}
650 /*********************************************************/
652 /* Classe Connectivite_Canonique_Tetra10 */
654 /*********************************************************/
656 class Connectivite_Canonique_Tetra10 : public Connectivite_Canonique_Base
659 Connectivite_Canonique_Tetra10()
664 int pn[4] = {0,0,1,2};
665 int sb[16] = {3,0,1,2,2,0,3,1,0,1,3,2,1,2,3,0};
666 int fa[12] = { 0,1,2, 0,3,1, 1,3,2, 2,3,0};
667 int po[5] = {0,3,6,9,12};
673 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
675 simplexe_base = vector< vector<int> >(nbr_faces);
676 face = vector< vector<int> >(nbr_faces);
680 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
681 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
684 ~Connectivite_Canonique_Tetra10() {}
687 /*********************************************************/
689 /* Classe Connectivite_Canonique_Hexa8 */
691 /*********************************************************/
693 class Connectivite_Canonique_Hexa8 : public Connectivite_Canonique_Base
696 Connectivite_Canonique_Hexa8()
701 int pn[6] = {0,4,0,1,2,3};
702 int sb[24] = {5,0,1,2,0,7,6,5,3,0,4,5,4,1,5,6,1,2,6,3,2,3,7,0};
703 int fa[24] = {0,1,2,3,4,5,6,7,0,4,5,1,1,5,6,2,2,6,7,3,3,7,4,0};
704 int po[7] = {0,4,8,12,16,20,24};
709 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
711 simplexe_base = vector< vector<int> >(nbr_faces);
712 face = vector< vector<int> >(nbr_faces);
716 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
717 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
720 ~Connectivite_Canonique_Hexa8() {}
723 /*********************************************************/
725 /* Classe Connectivite_Canonique_Hexa20 */
727 /*********************************************************/
729 class Connectivite_Canonique_Hexa20 : public Connectivite_Canonique_Base
732 Connectivite_Canonique_Hexa20()
737 int pn[6] = {0,4,0,1,2,3};
738 int sb[24] = {5,0,1,2,0,7,6,5,3,0,4,5,4,1,5,6,1,2,6,3,2,3,7,0};
739 int fa[24] = {0,1,2,3,4,5,6,7,0,4,5,1,1,5,6,2,2,6,7,3,3,7,4,0};
740 int po[7] = {0,4,8,12,16,20,24};
745 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
747 simplexe_base = vector< vector<int> >(nbr_faces);
748 face = vector< vector<int> >(nbr_faces);
752 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
753 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
756 ~Connectivite_Canonique_Hexa20() {}
759 /*********************************************************/
761 /* Classe Connectivite_Canonique_Pyra5 */
763 /*********************************************************/
765 class Connectivite_Canonique_Pyra5 : public Connectivite_Canonique_Base
768 Connectivite_Canonique_Pyra5()
773 int pn[5] = {0,0,1,2,3};
774 int sb[20] = {4,0,1,2,3,0,4,1,0,1,4,2,1,2,4,3,2,0,3,4};
775 int fa[16] = {0,1,2,3,0,4,1,1,4,2,2,4,3,3,4,0};
776 int po[6] = {0,4,7,10,13,16};
781 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
783 simplexe_base = vector< vector<int> >(nbr_faces);
784 face = vector< vector<int> >(nbr_faces);
788 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
789 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
792 ~Connectivite_Canonique_Pyra5() {}
795 /*********************************************************/
797 /* Classe Connectivite_Canonique_Pyra13 */
799 /*********************************************************/
801 class Connectivite_Canonique_Pyra13 : public Connectivite_Canonique_Base
804 Connectivite_Canonique_Pyra13()
809 int pn[5] = {0,0,1,2,3};
810 int sb[20] = {4,0,1,2,3,0,4,1,0,1,4,2,1,2,4,3,2,0,3,4};
811 int fa[16] = {0,1,2,3,0,4,1,1,4,2,2,4,3,3,4,0};
812 int po[6] = {0,4,7,10,13,16};
817 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
819 simplexe_base = vector< vector<int> >(nbr_faces);
820 face = vector< vector<int> >(nbr_faces);
824 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
825 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
828 ~Connectivite_Canonique_Pyra13() {}
831 /*********************************************************/
833 /* Classe Connectivite_Canonique_Penta6 */
835 /*********************************************************/
837 class Connectivite_Canonique_Penta6 : public Connectivite_Canonique_Base
840 Connectivite_Canonique_Penta6()
845 int pn[5] = {0,3,0,1,2};
846 int sb[20] = {3,0,1,2,2,3,4,5,5,0,3,1,0,1,4,2,1,2,5,0};
847 int fa[18] = {0,1,2,3,4,5,0,3,4,1,1,4,5,2,2,5,3,1};
848 int po[6] = {0,3,6,10,14,18};
853 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
855 simplexe_base = vector< vector<int> >(nbr_faces);
856 face = vector< vector<int> >(nbr_faces);
860 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
861 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
864 ~Connectivite_Canonique_Penta6() {}
867 /*********************************************************/
869 /* Classe Connectivite_Canonique_Penta15 */
871 /*********************************************************/
873 class Connectivite_Canonique_Penta15 : public Connectivite_Canonique_Base
876 Connectivite_Canonique_Penta15()
881 int pn[5] = {0,3,0,1,2};
882 int sb[20] = {3,0,1,2,2,3,4,5,5,0,3,1,0,1,4,2,1,2,5,0};
883 int fa[18] = {0,1,2,3,4,5,0,3,4,1,1,4,5,2,2,5,3,1};
884 int po[6] = {0,3,6,10,14,18};
889 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
891 simplexe_base = vector< vector<int> >(nbr_faces);
892 face = vector< vector<int> >(nbr_faces);
896 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
897 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
900 ~Connectivite_Canonique_Penta15() {}
903 /*********************************************************/
905 /* Classe Connectivite_Generale */
907 /*********************************************************/
909 inline Connectivite_Generale::Connectivite_Generale():AllConn(NBR_MODELES_MAILLES_DEFINIS)
911 // l'ordre est important, il dépend de la relation entre numéro local et modele et numéro MED
912 AllConn[ 0]=new Connectivite_Canonique_Point1 ();
913 AllConn[ 1]=new Connectivite_Canonique_Seg2 ();
914 AllConn[ 2]=new Connectivite_Canonique_Seg3 ();
915 AllConn[ 3]=new Connectivite_Canonique_Tria3 ();
916 AllConn[ 4]=new Connectivite_Canonique_Tria6 ();
917 AllConn[ 5]=new Connectivite_Canonique_Quad4 ();
918 AllConn[ 6]=new Connectivite_Canonique_Quad8 ();
919 AllConn[ 7]=new Connectivite_Canonique_Tetra4 ();
920 AllConn[ 8]=new Connectivite_Canonique_Tetra10 ();
921 AllConn[ 9]=new Connectivite_Canonique_Hexa8 ();
922 AllConn[10]=new Connectivite_Canonique_Hexa20 ();
923 AllConn[11]=new Connectivite_Canonique_Pyra5 ();
924 AllConn[12]=new Connectivite_Canonique_Pyra13 ();
925 AllConn[13]=new Connectivite_Canonique_Penta6 ();
926 AllConn[14]=new Connectivite_Canonique_Penta15 ();
928 inline Connectivite_Generale::~Connectivite_Generale()
930 for (int i=0;i<AllConn.size();i++) delete AllConn[i];