1 #ifndef WRAPPERS_CELLS_HXX
2 #define WRAPPERS_CELLS_HXX
24 #include "MEDMEM_define.hxx"
28 //////////////////////////////////////////////////////////////////
32 //////////////////////////////////////////////////////////////////
34 /*********************************************************/
36 /* Equivalence num modele local => MED */
38 /*********************************************************/
40 #define NBR_MODELES_MAILLES_DEFINIS 15
41 int Equivalence_Local_MED[NBR_MODELES_MAILLES_DEFINIS] = { MED_POINT1 ,
43 MED_TRIA3 , MED_TRIA6 , MED_QUAD4 , MED_QUAD8 ,
44 MED_TETRA4 , MED_TETRA10 , MED_HEXA8 , MED_HEXA20 , MED_PYRA5 , MED_PYRA13 , MED_PENTA6 , MED_PENTA15 };
46 /*********************************************************/
48 /* Classe Connectivite_Canonique_Base */
50 /*********************************************************/
52 // classe mere des connectivités cannoniques
53 // N'a aucune méthode virtuelle pour éviter les pertes de temps
54 // Ce sont les constructeurs des classes dérivées qui renseignent les attributs spécifiques
55 // 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
56 // Ce simplexe est utilisé dans le calcul des fonctions barycentriques
57 // LES MAILLES SONT DONC ET PAR CONSEQUENT DES MAILLES A FACES PLANES
58 // Une face est une face P1, c'est a dire contenant uniquement les sommets, par les noeuds milieux
59 // Ces faces sont utilisées pour le calcul de connexité
62 class Connectivite_Canonique_Base
68 vector<int> premier_noeud ;
69 vector< vector<int> > simplexe_base ;
70 vector< vector<int> > face ;
72 inline int DONNE_NBR_NOEUDS() const { return nbr_noeuds; }
73 inline int DONNE_NBR_FACES() const { return nbr_faces; }
74 inline const vector<int> & DONNE_SIMPLEXE_BASE(int num_face) const { return simplexe_base[num_face]; }
75 inline const vector<int> & DONNE_FACE(int num_face) const { return face[num_face]; }
76 inline int DONNE_PREMIER_NOEUD_DE_FACE(int num_face) const { return premier_noeud[num_face]; }
77 friend class Wrapper_Maille;
80 /*********************************************************/
82 /* Classe Connectivite_Canonique_* */
84 /*********************************************************/
86 // définies dans la partie CODE
87 // les constructeurs construisent tous les tableaux de connectivités nécessaires en fonction du MODELE MED
89 //class Connectivite_Canonique_Point1 : public Connectivite_Canonique_Base;
90 //class Connectivite_Canonique_Seg2 : public Connectivite_Canonique_Base;
91 //class Connectivite_Canonique_Seg3 : public Connectivite_Canonique_Base;
92 //class Connectivite_Canonique_Tria3 : public Connectivite_Canonique_Base;
93 //class Connectivite_Canonique_Tria6 : public Connectivite_Canonique_Base;
94 //class Connectivite_Canonique_Quad4 : public Connectivite_Canonique_Base;
95 //class Connectivite_Canonique_Quad8 : public Connectivite_Canonique_Base;
96 //class Connectivite_Canonique_Tetra4 : public Connectivite_Canonique_Base;
97 //class Connectivite_Canonique_Tetra10 : public Connectivite_Canonique_Base;
98 //class Connectivite_Canonique_Hexa8 : public Connectivite_Canonique_Base;
99 //class Connectivite_Canonique_Hexa20 : public Connectivite_Canonique_Base;
100 //class Connectivite_Canonique_Pyra5 : public Connectivite_Canonique_Base;
101 //class Connectivite_Canonique_Pyra13 : public Connectivite_Canonique_Base;
102 //class Connectivite_Canonique_Penta6 : public Connectivite_Canonique_Base;
103 //class Connectivite_Canonique_Penta15 : public Connectivite_Canonique_Base;
105 /*********************************************************/
107 /* Classe Connectivite_Generale */
109 /*********************************************************/
111 // Cette classe contient toutes les connectivités canoniques, elle est utilisée dans Wrapper_Nuage_Maille
113 class Connectivite_Generale
116 vector<Connectivite_Canonique_Base *> AllConn;
118 Connectivite_Generale();
119 ~Connectivite_Generale();
120 // Renvoie la connectivite locale de la maille de numero local de modele i, dont l'equivalent MED est Equivalence_Local_MED[i]
121 Connectivite_Canonique_Base * operator[](int i) const {return AllConn[i];}
124 /*********************************************************/
126 /* Structure type_retour */
128 /*********************************************************/
130 // c'est une structure de type petit tableau statique, pour accelerer les acces et eviter les allocations dynamiques
138 /*********************************************************/
140 /* Fonction Comparaison_Informe(...) */
142 /*********************************************************/
144 // renvoie vrai si v1 et v2 contiennent la meme chose et sont de meme tailles, faux sinon
146 int Comparaison_Informe(const type_retour &v1,const type_retour &v2);
148 /*********************************************************/
150 /* Classe Wrapper_Maille */
152 /*********************************************************/
154 // c'est le wrapper maille sur int[]
155 // cette classe n'est pas dérivée, tous les types de mailles sont stockées sous cette forme
156 // la variable qui définit les type est la Connectivité_Canonique_Base, qui est toujours polymorphée en un type spécifique
163 // la référence du premier sommet
165 // la connectivité canonique, toujours polymorphée
166 Connectivite_Canonique_Base * modele;
169 Wrapper_Maille():sommets(NULL) {}
172 // 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
173 inline const Wrapper_Maille & positionne(int * pos, Connectivite_Canonique_Base * mod){sommets=pos;modele=mod;return *this;}
174 // 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
175 // par contre les numéros de face fournis sont des numéros locaux
176 // renvoie le numéro global du sommet de numéro local i
177 inline int operator[](int i) const {return sommets[i];}
178 inline int DONNE_NBR_NOEUDS() const;
179 inline int DONNE_NBR_FACES() const;
180 inline void DONNE_SIMPLEXE_BASE(int num_face,type_retour & simplexe) const;
181 inline void DONNE_FACE(int num_face,type_retour & face) const;
182 inline int DONNE_PREMIER_NOEUD_DE_FACE(int num_face) const;
183 // pour une face, donne, s'il existe, le numéro local de face équivalente, -1 sinon
184 inline int DONNE_NUM_LOC_FACE_EGALE_A_FORMANT(const type_retour & sommets_face) const;
185 // donne le numéro local de modele
186 inline int DONNE_TYPE_MAILLE() const;
187 // donne le numéro MED de modele
188 inline int DONNE_TYPE_MED_MAILLE() const;
192 /*********************************************************/
194 /* Classe Wrapper_Nuage_Maille */
196 /*********************************************************/
198 // Classe de Wrapping sur un nuage de maille donné sous forme SKYLINE
199 // voir la classe Wrapper_Med_Connectivity dans MEDMEM_Wrapper_Connectivity.hxx pour la politique de classe
201 template <class FORME_SKYLINE> class Wrapper_Nuage_Maille
204 // pointeur sur une forme skyline
205 FORME_SKYLINE * mailles;
206 // toutes les connectivités canoniques
207 Connectivite_Generale ConnGen;
209 // 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
211 // pointeur dans mailles du premier sommet de chaque maille (évite les calculs du au nombres éventuellement différents de sommets par maille)
212 vector< int * > premier_pointeur;
213 // maille_courante, est un Wrapper_Maille déja instancié utilisé par l'opérateur [] pour accelerer les acces
214 Wrapper_Maille maille_courante;
216 Wrapper_Nuage_Maille():mailles(NULL) {}
217 // le constructeur renseigne types et premier_pointeur, instantie ConnGenn et positionne maille_courante sur la premiere maille
218 Wrapper_Nuage_Maille(FORME_SKYLINE * fs);
219 ~Wrapper_Nuage_Maille() {}
220 // Méthodes de la politique
221 // positionne maille_courante sur la maille de numéro global i et renvoie maille_courante
222 inline const Wrapper_Maille & operator[](int i);
223 inline int SIZE() {return nbr_mailles;}
227 //////////////////////////////////////////////////////////////////
231 //////////////////////////////////////////////////////////////////
233 /*********************************************************/
235 /* Fonction Comparaison_Informe(...) */
237 /*********************************************************/
239 // effectue le test (v1 et v2 ont meme taille)&&(chaque élément de v1 est dans v2)
240 // c'est une égalité forte si on est sur que v1 et v2 n'ont pas de doublets,
241 // ce qui est le cas pour les mailles et les simplexes
243 int Comparaison_Informe(const type_retour &v1,const type_retour &v2)
247 if (t1!=t2) return FAUX;
250 for (i1=0;i1<t1;i1++)
253 for (i2=0;(i2<t2)&&(test);i2++)
255 if (v1.quoi[i1]==v2.quoi[i2]) test=0;
257 if (test) return FAUX;
262 /*********************************************************/
264 /* Classe Wrapper_Maille */
266 /*********************************************************/
268 inline int Wrapper_Maille::DONNE_NBR_NOEUDS() const
270 return modele->DONNE_NBR_NOEUDS();
272 inline int Wrapper_Maille::DONNE_NBR_FACES() const
274 return modele->DONNE_NBR_FACES();
276 inline void Wrapper_Maille::DONNE_SIMPLEXE_BASE(int num_face,type_retour & simplexe) const
278 const vector<int> & simplexelocal=modele->DONNE_SIMPLEXE_BASE(num_face);
279 simplexe.combien=simplexelocal.size();
280 for (int i=0;i<simplexe.combien;i++) simplexe.quoi[i]=sommets[simplexelocal[i]];
282 inline void Wrapper_Maille::DONNE_FACE(int num_face,type_retour & face) const
284 const vector<int> & facelocal=modele->DONNE_FACE(num_face);
285 face.combien=facelocal.size();
286 for (int i=0;i<face.combien;i++) face.quoi[i]=sommets[facelocal[i]];
288 inline int Wrapper_Maille::DONNE_PREMIER_NOEUD_DE_FACE(int num_face) const
290 return sommets[modele->DONNE_PREMIER_NOEUD_DE_FACE(num_face)];
292 inline int Wrapper_Maille::DONNE_NUM_LOC_FACE_EGALE_A_FORMANT(const type_retour & sommets_face) const
294 type_retour face_loc;
296 int taille_face_exam;
298 for (num_face=0;num_face<DONNE_NBR_FACES();num_face++)
300 DONNE_FACE(num_face,face_loc);
301 if (Comparaison_Informe(face_loc,sommets_face)) return num_face;
305 inline int Wrapper_Maille::DONNE_TYPE_MAILLE() const
309 inline int Wrapper_Maille::DONNE_TYPE_MED_MAILLE() const
311 return Equivalence_Local_MED[modele->type];
315 /*********************************************************/
317 /* Classe Wrapper_Nuage_Maille */
319 /*********************************************************/
321 template <class FORME_SKYLINE> Wrapper_Nuage_Maille<FORME_SKYLINE>::Wrapper_Nuage_Maille(FORME_SKYLINE * fs):mailles(fs)
324 map<int,int> Equivalence_MED_Local;
325 // calcule la map de convertion des types med en numéro local, pour accelerer l'acces
326 for (i=0;i<NBR_MODELES_MAILLES_DEFINIS;i++) Equivalence_MED_Local[Equivalence_Local_MED[i]]=i;
327 nbr_mailles=mailles->SIZE();
328 types.resize(nbr_mailles);
329 premier_pointeur.resize(nbr_mailles);
330 for (i=0;i<nbr_mailles;i++)
332 types[i]=Equivalence_MED_Local[mailles->DONNE_TYPE_MAILLE(i)];
333 premier_pointeur[i]=mailles->DONNE_PREMIER_POINTEUR(i);
335 maille_courante.positionne(premier_pointeur[0],ConnGen[types[0]]);
337 template <class FORME_SKYLINE> const Wrapper_Maille & Wrapper_Nuage_Maille<FORME_SKYLINE>::operator[](int i)
339 return maille_courante.positionne(premier_pointeur[i],ConnGen[types[i]]);
341 template <class FORME_SKYLINE> void Wrapper_Nuage_Maille<FORME_SKYLINE>::affiche()
344 for (i=0;i<nbr_mailles;i++)
346 cout<<"Maille "<<i<<" MED "<<Equivalence_Local_MED[types[i]]<<" : "<<flush;
347 for (j=0;j<(*this)[i].DONNE_NBR_NOEUDS();j++) cout<<(*this)[i][j]<<" "<<flush;
352 /*********************************************************/
354 /* Classe Connectivite_Canonique_Point1 */
356 /*********************************************************/
358 class Connectivite_Canonique_Point1 : public Connectivite_Canonique_Base
361 Connectivite_Canonique_Point1()
369 premier_noeud = vector<int>(0);
371 simplexe_base = vector< vector<int> >(nbr_faces);
372 face = vector< vector<int> >(nbr_faces);
375 ~Connectivite_Canonique_Point1() {}
378 /*********************************************************/
380 /* Classe Connectivite_Canonique_Seg2 */
382 /*********************************************************/
384 class Connectivite_Canonique_Seg2 : public Connectivite_Canonique_Base
387 Connectivite_Canonique_Seg2()
393 int sb[4] = {1,0,0,1};
401 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
403 simplexe_base = vector< vector<int> >(nbr_faces);
404 face = vector< vector<int> >(nbr_faces);
408 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[2*i],&sb[2*(i+1)]);
409 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
412 ~Connectivite_Canonique_Seg2() {}
414 /*********************************************************/
416 /* Classe Connectivite_Canonique_Seg3 */
418 /*********************************************************/
420 class Connectivite_Canonique_Seg3 : public Connectivite_Canonique_Base
423 Connectivite_Canonique_Seg3()
429 int sb[4] = {1,0,0,1};
437 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
439 simplexe_base = vector< vector<int> >(nbr_faces);
440 face = vector< vector<int> >(nbr_faces);
444 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[2*i],&sb[2*(i+1)]);
445 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
448 ~Connectivite_Canonique_Seg3() {}
452 /*********************************************************/
454 /* Classe Connectivite_Canonique_Tria3 */
456 /*********************************************************/
458 class Connectivite_Canonique_Tria3 : public Connectivite_Canonique_Base
461 Connectivite_Canonique_Tria3()
467 int sb[9] = {2,0,1,0,1,2,1,2,0};
468 int fa[6] = {0,1,1,2,2,0};
469 int po[4] = {0,2,4,6};
474 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
476 simplexe_base = vector< vector<int> >(nbr_faces);
477 face = vector< vector<int> >(nbr_faces);
481 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[3*i],&sb[3*(i+1)]);
482 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
485 ~Connectivite_Canonique_Tria3() {}
488 /*********************************************************/
490 /* Classe Connectivite_Canonique_Tria6 */
492 /*********************************************************/
494 class Connectivite_Canonique_Tria6 : public Connectivite_Canonique_Base
497 Connectivite_Canonique_Tria6()
503 int sb[9] = {2,0,1,0,1,2,1,2,0};
504 int fa[6] = {0,1,1,2,2,0};
505 int po[4] = {0,2,4,6};
510 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
512 simplexe_base = vector< vector<int> >(nbr_faces);
513 face = vector< vector<int> >(nbr_faces);
517 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[3*i],&sb[3*(i+1)]);
518 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
521 ~Connectivite_Canonique_Tria6() {}
524 /*********************************************************/
526 /* Classe Connectivite_Canonique_Quad4 */
528 /*********************************************************/
530 class Connectivite_Canonique_Quad4 : public Connectivite_Canonique_Base
533 Connectivite_Canonique_Quad4()
538 int pn[4] = {0,1,2,3};
539 int sb[12] = {2,0,1,3,1,2,0,2,3,1,0,2};
540 int fa[8] = {0,1,1,2,2,3,3,0};
541 int po[5] = {0,2,4,6,8};
546 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
548 simplexe_base = vector< vector<int> >(nbr_faces);
549 face = vector< vector<int> >(nbr_faces);
553 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[3*i],&sb[3*(i+1)]);
554 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
557 ~Connectivite_Canonique_Quad4() {}
561 /*********************************************************/
563 /* Classe Connectivite_Canonique_Quad8 */
565 /*********************************************************/
567 class Connectivite_Canonique_Quad8 : public Connectivite_Canonique_Base
570 Connectivite_Canonique_Quad8()
575 int pn[4] = {0,1,2,3};
576 int sb[12] = {2,0,1,3,1,2,0,2,3,1,0,2};
577 int fa[8] = {0,1,1,2,2,3,3,0};
578 int po[5] = {0,2,4,6,8};
583 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
585 simplexe_base = vector< vector<int> >(nbr_faces);
586 face = vector< vector<int> >(nbr_faces);
590 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[3*i],&sb[3*(i+1)]);
591 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
594 ~Connectivite_Canonique_Quad8() {}
597 /*********************************************************/
599 /* Classe Connectivite_Canonique_Tetra4 */
601 /*********************************************************/
603 class Connectivite_Canonique_Tetra4 : public Connectivite_Canonique_Base
606 Connectivite_Canonique_Tetra4()
611 int pn[4] = {0,0,1,2};
612 int sb[16] = {3,0,1,2,2,0,3,1,0,1,3,2,1,2,3,0};
613 int fa[12] = {0,1,2,0,3,1,1,3,2,2,3,0};
614 int po[5] = {0,3,6,9,12};
619 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
621 simplexe_base = vector< vector<int> >(nbr_faces);
622 face = vector< vector<int> >(nbr_faces);
626 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
627 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
630 ~Connectivite_Canonique_Tetra4() {}
633 /*********************************************************/
635 /* Classe Connectivite_Canonique_Tetra10 */
637 /*********************************************************/
639 class Connectivite_Canonique_Tetra10 : public Connectivite_Canonique_Base
642 Connectivite_Canonique_Tetra10()
647 int pn[4] = {0,0,1,2};
648 int sb[16] = {3,0,1,2,2,0,3,1,0,1,3,2,1,2,3,0};
649 int fa[12] = { 0,1,2, 0,3,1, 1,3,2, 2,3,0};
650 int po[5] = {0,3,6,9,12};
656 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
658 simplexe_base = vector< vector<int> >(nbr_faces);
659 face = vector< vector<int> >(nbr_faces);
663 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
664 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
667 ~Connectivite_Canonique_Tetra10() {}
670 /*********************************************************/
672 /* Classe Connectivite_Canonique_Hexa8 */
674 /*********************************************************/
676 class Connectivite_Canonique_Hexa8 : public Connectivite_Canonique_Base
679 Connectivite_Canonique_Hexa8()
684 int pn[6] = {0,4,0,1,2,3};
685 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};
686 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};
687 int po[7] = {0,4,8,12,16,20,24};
692 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
694 simplexe_base = vector< vector<int> >(nbr_faces);
695 face = vector< vector<int> >(nbr_faces);
699 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
700 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
703 ~Connectivite_Canonique_Hexa8() {}
706 /*********************************************************/
708 /* Classe Connectivite_Canonique_Hexa20 */
710 /*********************************************************/
712 class Connectivite_Canonique_Hexa20 : public Connectivite_Canonique_Base
715 Connectivite_Canonique_Hexa20()
720 int pn[6] = {0,4,0,1,2,3};
721 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};
722 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};
723 int po[7] = {0,4,8,12,16,20,24};
728 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
730 simplexe_base = vector< vector<int> >(nbr_faces);
731 face = vector< vector<int> >(nbr_faces);
735 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
736 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
739 ~Connectivite_Canonique_Hexa20() {}
742 /*********************************************************/
744 /* Classe Connectivite_Canonique_Pyra5 */
746 /*********************************************************/
748 class Connectivite_Canonique_Pyra5 : public Connectivite_Canonique_Base
751 Connectivite_Canonique_Pyra5()
756 int pn[5] = {0,0,1,2,3};
757 int sb[20] = {4,0,1,2,3,0,4,1,0,1,4,2,1,2,4,3,2,0,3,4};
758 int fa[16] = {0,1,2,3,0,4,1,1,4,2,2,4,3,3,4,0};
759 int po[6] = {0,4,7,10,13,16};
764 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
766 simplexe_base = vector< vector<int> >(nbr_faces);
767 face = vector< vector<int> >(nbr_faces);
771 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
772 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
775 ~Connectivite_Canonique_Pyra5() {}
778 /*********************************************************/
780 /* Classe Connectivite_Canonique_Pyra13 */
782 /*********************************************************/
784 class Connectivite_Canonique_Pyra13 : public Connectivite_Canonique_Base
787 Connectivite_Canonique_Pyra13()
792 int pn[5] = {0,0,1,2,3};
793 int sb[20] = {4,0,1,2,3,0,4,1,0,1,4,2,1,2,4,3,2,0,3,4};
794 int fa[16] = {0,1,2,3,0,4,1,1,4,2,2,4,3,3,4,0};
795 int po[6] = {0,4,7,10,13,16};
800 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
802 simplexe_base = vector< vector<int> >(nbr_faces);
803 face = vector< vector<int> >(nbr_faces);
807 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
808 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
811 ~Connectivite_Canonique_Pyra13() {}
814 /*********************************************************/
816 /* Classe Connectivite_Canonique_Penta6 */
818 /*********************************************************/
820 class Connectivite_Canonique_Penta6 : public Connectivite_Canonique_Base
823 Connectivite_Canonique_Penta6()
828 int pn[5] = {0,3,0,1,2};
829 int sb[20] = {3,0,1,2,2,3,4,5,5,0,3,1,0,1,4,2,1,2,5,0};
830 int fa[18] = {0,1,2,3,4,5,0,3,4,1,1,4,5,2,2,5,3,1};
831 int po[6] = {0,3,6,10,14,18};
836 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
838 simplexe_base = vector< vector<int> >(nbr_faces);
839 face = vector< vector<int> >(nbr_faces);
843 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
844 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
847 ~Connectivite_Canonique_Penta6() {}
850 /*********************************************************/
852 /* Classe Connectivite_Canonique_Penta15 */
854 /*********************************************************/
856 class Connectivite_Canonique_Penta15 : public Connectivite_Canonique_Base
859 Connectivite_Canonique_Penta15()
864 int pn[5] = {0,3,0,1,2};
865 int sb[20] = {3,0,1,2,2,3,4,5,5,0,3,1,0,1,4,2,1,2,5,0};
866 int fa[18] = {0,1,2,3,4,5,0,3,4,1,1,4,5,2,2,5,3,1};
867 int po[6] = {0,3,6,10,14,18};
872 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
874 simplexe_base = vector< vector<int> >(nbr_faces);
875 face = vector< vector<int> >(nbr_faces);
879 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
880 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
883 ~Connectivite_Canonique_Penta15() {}
886 /*********************************************************/
888 /* Classe Connectivite_Generale */
890 /*********************************************************/
892 Connectivite_Generale::Connectivite_Generale():AllConn(NBR_MODELES_MAILLES_DEFINIS)
894 // l'ordre est important, il dépend de la relation entre numéro local et modele et numéro MED
895 AllConn[ 0]=new Connectivite_Canonique_Point1 ();
896 AllConn[ 1]=new Connectivite_Canonique_Seg2 ();
897 AllConn[ 2]=new Connectivite_Canonique_Seg3 ();
898 AllConn[ 3]=new Connectivite_Canonique_Tria3 ();
899 AllConn[ 4]=new Connectivite_Canonique_Tria6 ();
900 AllConn[ 5]=new Connectivite_Canonique_Quad4 ();
901 AllConn[ 6]=new Connectivite_Canonique_Quad8 ();
902 AllConn[ 7]=new Connectivite_Canonique_Tetra4 ();
903 AllConn[ 8]=new Connectivite_Canonique_Tetra10 ();
904 AllConn[ 9]=new Connectivite_Canonique_Hexa8 ();
905 AllConn[10]=new Connectivite_Canonique_Hexa20 ();
906 AllConn[11]=new Connectivite_Canonique_Pyra5 ();
907 AllConn[12]=new Connectivite_Canonique_Pyra13 ();
908 AllConn[13]=new Connectivite_Canonique_Penta6 ();
909 AllConn[14]=new Connectivite_Canonique_Penta15 ();
911 Connectivite_Generale::~Connectivite_Generale()
913 for (int i=0;i<AllConn.size();i++) delete AllConn[i];