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 static int Equivalence_Local_MED[NBR_MODELES_MAILLES_DEFINIS] = { MED_EN::MED_POINT1 ,
42 MED_EN::MED_SEG2 , MED_EN::MED_SEG3,
43 MED_EN::MED_TRIA3 , MED_EN::MED_TRIA6 , MED_EN::MED_QUAD4 , MED_EN::MED_QUAD8 ,
44 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 };
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 inline 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 for (num_face=0;num_face<DONNE_NBR_FACES();num_face++)
298 DONNE_FACE(num_face,face_loc);
299 if (Comparaison_Informe(face_loc,sommets_face)) return num_face;
303 inline int Wrapper_Maille::DONNE_TYPE_MAILLE() const
307 inline int Wrapper_Maille::DONNE_TYPE_MED_MAILLE() const
309 return Equivalence_Local_MED[modele->type];
313 /*********************************************************/
315 /* Classe Wrapper_Nuage_Maille */
317 /*********************************************************/
319 template <class FORME_SKYLINE> Wrapper_Nuage_Maille<FORME_SKYLINE>::Wrapper_Nuage_Maille(FORME_SKYLINE * fs):mailles(fs)
322 map<int,int> Equivalence_MED_Local;
323 // calcule la map de convertion des types med en numéro local, pour accelerer l'acces
324 for (i=0;i<NBR_MODELES_MAILLES_DEFINIS;i++) Equivalence_MED_Local[Equivalence_Local_MED[i]]=i;
325 nbr_mailles=mailles->SIZE();
326 types.resize(nbr_mailles);
327 premier_pointeur.resize(nbr_mailles);
328 for (i=0;i<nbr_mailles;i++)
330 types[i]=Equivalence_MED_Local[mailles->DONNE_TYPE_MAILLE(i)];
331 premier_pointeur[i]=mailles->DONNE_PREMIER_POINTEUR(i);
333 maille_courante.positionne(premier_pointeur[0],ConnGen[types[0]]);
335 template <class FORME_SKYLINE> const Wrapper_Maille & Wrapper_Nuage_Maille<FORME_SKYLINE>::operator[](int i)
337 return maille_courante.positionne(premier_pointeur[i],ConnGen[types[i]]);
339 template <class FORME_SKYLINE> void Wrapper_Nuage_Maille<FORME_SKYLINE>::affiche()
342 for (i=0;i<nbr_mailles;i++)
344 cout<<"Maille "<<i<<" MED "<<Equivalence_Local_MED[types[i]]<<" : "<<flush;
345 for (j=0;j<(*this)[i].DONNE_NBR_NOEUDS();j++) cout<<(*this)[i][j]<<" "<<flush;
350 /*********************************************************/
352 /* Classe Connectivite_Canonique_Point1 */
354 /*********************************************************/
356 class Connectivite_Canonique_Point1 : public Connectivite_Canonique_Base
359 Connectivite_Canonique_Point1()
367 premier_noeud = vector<int>(0);
369 simplexe_base = vector< vector<int> >(nbr_faces);
370 face = vector< vector<int> >(nbr_faces);
373 ~Connectivite_Canonique_Point1() {}
376 /*********************************************************/
378 /* Classe Connectivite_Canonique_Seg2 */
380 /*********************************************************/
382 class Connectivite_Canonique_Seg2 : public Connectivite_Canonique_Base
385 Connectivite_Canonique_Seg2()
391 int sb[4] = {1,0,0,1};
399 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
401 simplexe_base = vector< vector<int> >(nbr_faces);
402 face = vector< vector<int> >(nbr_faces);
406 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[2*i],&sb[2*(i+1)]);
407 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
410 ~Connectivite_Canonique_Seg2() {}
412 /*********************************************************/
414 /* Classe Connectivite_Canonique_Seg3 */
416 /*********************************************************/
418 class Connectivite_Canonique_Seg3 : public Connectivite_Canonique_Base
421 Connectivite_Canonique_Seg3()
427 int sb[4] = {1,0,0,1};
435 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
437 simplexe_base = vector< vector<int> >(nbr_faces);
438 face = vector< vector<int> >(nbr_faces);
442 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[2*i],&sb[2*(i+1)]);
443 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
446 ~Connectivite_Canonique_Seg3() {}
450 /*********************************************************/
452 /* Classe Connectivite_Canonique_Tria3 */
454 /*********************************************************/
456 class Connectivite_Canonique_Tria3 : public Connectivite_Canonique_Base
459 Connectivite_Canonique_Tria3()
465 int sb[9] = {2,0,1,0,1,2,1,2,0};
466 int fa[6] = {0,1,1,2,2,0};
467 int po[4] = {0,2,4,6};
472 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
474 simplexe_base = vector< vector<int> >(nbr_faces);
475 face = vector< vector<int> >(nbr_faces);
479 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[3*i],&sb[3*(i+1)]);
480 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
483 ~Connectivite_Canonique_Tria3() {}
486 /*********************************************************/
488 /* Classe Connectivite_Canonique_Tria6 */
490 /*********************************************************/
492 class Connectivite_Canonique_Tria6 : public Connectivite_Canonique_Base
495 Connectivite_Canonique_Tria6()
501 int sb[9] = {2,0,1,0,1,2,1,2,0};
502 int fa[6] = {0,1,1,2,2,0};
503 int po[4] = {0,2,4,6};
508 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
510 simplexe_base = vector< vector<int> >(nbr_faces);
511 face = vector< vector<int> >(nbr_faces);
515 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[3*i],&sb[3*(i+1)]);
516 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
519 ~Connectivite_Canonique_Tria6() {}
522 /*********************************************************/
524 /* Classe Connectivite_Canonique_Quad4 */
526 /*********************************************************/
528 class Connectivite_Canonique_Quad4 : public Connectivite_Canonique_Base
531 Connectivite_Canonique_Quad4()
536 int pn[4] = {0,1,2,3};
537 int sb[12] = {2,0,1,3,1,2,0,2,3,1,0,2};
538 int fa[8] = {0,1,1,2,2,3,3,0};
539 int po[5] = {0,2,4,6,8};
544 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
546 simplexe_base = vector< vector<int> >(nbr_faces);
547 face = vector< vector<int> >(nbr_faces);
551 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[3*i],&sb[3*(i+1)]);
552 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
555 ~Connectivite_Canonique_Quad4() {}
559 /*********************************************************/
561 /* Classe Connectivite_Canonique_Quad8 */
563 /*********************************************************/
565 class Connectivite_Canonique_Quad8 : public Connectivite_Canonique_Base
568 Connectivite_Canonique_Quad8()
573 int pn[4] = {0,1,2,3};
574 int sb[12] = {2,0,1,3,1,2,0,2,3,1,0,2};
575 int fa[8] = {0,1,1,2,2,3,3,0};
576 int po[5] = {0,2,4,6,8};
581 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
583 simplexe_base = vector< vector<int> >(nbr_faces);
584 face = vector< vector<int> >(nbr_faces);
588 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[3*i],&sb[3*(i+1)]);
589 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
592 ~Connectivite_Canonique_Quad8() {}
595 /*********************************************************/
597 /* Classe Connectivite_Canonique_Tetra4 */
599 /*********************************************************/
601 class Connectivite_Canonique_Tetra4 : public Connectivite_Canonique_Base
604 Connectivite_Canonique_Tetra4()
609 int pn[4] = {0,0,1,2};
610 int sb[16] = {3,0,1,2,2,0,3,1,0,1,3,2,1,2,3,0};
611 int fa[12] = {0,1,2,0,3,1,1,3,2,2,3,0};
612 int po[5] = {0,3,6,9,12};
617 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
619 simplexe_base = vector< vector<int> >(nbr_faces);
620 face = vector< vector<int> >(nbr_faces);
624 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
625 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
628 ~Connectivite_Canonique_Tetra4() {}
631 /*********************************************************/
633 /* Classe Connectivite_Canonique_Tetra10 */
635 /*********************************************************/
637 class Connectivite_Canonique_Tetra10 : public Connectivite_Canonique_Base
640 Connectivite_Canonique_Tetra10()
645 int pn[4] = {0,0,1,2};
646 int sb[16] = {3,0,1,2,2,0,3,1,0,1,3,2,1,2,3,0};
647 int fa[12] = { 0,1,2, 0,3,1, 1,3,2, 2,3,0};
648 int po[5] = {0,3,6,9,12};
654 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
656 simplexe_base = vector< vector<int> >(nbr_faces);
657 face = vector< vector<int> >(nbr_faces);
661 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
662 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
665 ~Connectivite_Canonique_Tetra10() {}
668 /*********************************************************/
670 /* Classe Connectivite_Canonique_Hexa8 */
672 /*********************************************************/
674 class Connectivite_Canonique_Hexa8 : public Connectivite_Canonique_Base
677 Connectivite_Canonique_Hexa8()
682 int pn[6] = {0,4,0,1,2,3};
683 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};
684 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};
685 int po[7] = {0,4,8,12,16,20,24};
690 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
692 simplexe_base = vector< vector<int> >(nbr_faces);
693 face = vector< vector<int> >(nbr_faces);
697 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
698 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
701 ~Connectivite_Canonique_Hexa8() {}
704 /*********************************************************/
706 /* Classe Connectivite_Canonique_Hexa20 */
708 /*********************************************************/
710 class Connectivite_Canonique_Hexa20 : public Connectivite_Canonique_Base
713 Connectivite_Canonique_Hexa20()
718 int pn[6] = {0,4,0,1,2,3};
719 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};
720 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};
721 int po[7] = {0,4,8,12,16,20,24};
726 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
728 simplexe_base = vector< vector<int> >(nbr_faces);
729 face = vector< vector<int> >(nbr_faces);
733 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
734 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
737 ~Connectivite_Canonique_Hexa20() {}
740 /*********************************************************/
742 /* Classe Connectivite_Canonique_Pyra5 */
744 /*********************************************************/
746 class Connectivite_Canonique_Pyra5 : public Connectivite_Canonique_Base
749 Connectivite_Canonique_Pyra5()
754 int pn[5] = {0,0,1,2,3};
755 int sb[20] = {4,0,1,2,3,0,4,1,0,1,4,2,1,2,4,3,2,0,3,4};
756 int fa[16] = {0,1,2,3,0,4,1,1,4,2,2,4,3,3,4,0};
757 int po[6] = {0,4,7,10,13,16};
762 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
764 simplexe_base = vector< vector<int> >(nbr_faces);
765 face = vector< vector<int> >(nbr_faces);
769 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
770 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
773 ~Connectivite_Canonique_Pyra5() {}
776 /*********************************************************/
778 /* Classe Connectivite_Canonique_Pyra13 */
780 /*********************************************************/
782 class Connectivite_Canonique_Pyra13 : public Connectivite_Canonique_Base
785 Connectivite_Canonique_Pyra13()
790 int pn[5] = {0,0,1,2,3};
791 int sb[20] = {4,0,1,2,3,0,4,1,0,1,4,2,1,2,4,3,2,0,3,4};
792 int fa[16] = {0,1,2,3,0,4,1,1,4,2,2,4,3,3,4,0};
793 int po[6] = {0,4,7,10,13,16};
798 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
800 simplexe_base = vector< vector<int> >(nbr_faces);
801 face = vector< vector<int> >(nbr_faces);
805 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
806 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
809 ~Connectivite_Canonique_Pyra13() {}
812 /*********************************************************/
814 /* Classe Connectivite_Canonique_Penta6 */
816 /*********************************************************/
818 class Connectivite_Canonique_Penta6 : public Connectivite_Canonique_Base
821 Connectivite_Canonique_Penta6()
826 int pn[5] = {0,3,0,1,2};
827 int sb[20] = {3,0,1,2,2,3,4,5,5,0,3,1,0,1,4,2,1,2,5,0};
828 int fa[18] = {0,1,2,3,4,5,0,3,4,1,1,4,5,2,2,5,3,1};
829 int po[6] = {0,3,6,10,14,18};
834 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
836 simplexe_base = vector< vector<int> >(nbr_faces);
837 face = vector< vector<int> >(nbr_faces);
841 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
842 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
845 ~Connectivite_Canonique_Penta6() {}
848 /*********************************************************/
850 /* Classe Connectivite_Canonique_Penta15 */
852 /*********************************************************/
854 class Connectivite_Canonique_Penta15 : public Connectivite_Canonique_Base
857 Connectivite_Canonique_Penta15()
862 int pn[5] = {0,3,0,1,2};
863 int sb[20] = {3,0,1,2,2,3,4,5,5,0,3,1,0,1,4,2,1,2,5,0};
864 int fa[18] = {0,1,2,3,4,5,0,3,4,1,1,4,5,2,2,5,3,1};
865 int po[6] = {0,3,6,10,14,18};
870 premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
872 simplexe_base = vector< vector<int> >(nbr_faces);
873 face = vector< vector<int> >(nbr_faces);
877 for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
878 for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
881 ~Connectivite_Canonique_Penta15() {}
884 /*********************************************************/
886 /* Classe Connectivite_Generale */
888 /*********************************************************/
890 inline Connectivite_Generale::Connectivite_Generale():AllConn(NBR_MODELES_MAILLES_DEFINIS)
892 // l'ordre est important, il dépend de la relation entre numéro local et modele et numéro MED
893 AllConn[ 0]=new Connectivite_Canonique_Point1 ();
894 AllConn[ 1]=new Connectivite_Canonique_Seg2 ();
895 AllConn[ 2]=new Connectivite_Canonique_Seg3 ();
896 AllConn[ 3]=new Connectivite_Canonique_Tria3 ();
897 AllConn[ 4]=new Connectivite_Canonique_Tria6 ();
898 AllConn[ 5]=new Connectivite_Canonique_Quad4 ();
899 AllConn[ 6]=new Connectivite_Canonique_Quad8 ();
900 AllConn[ 7]=new Connectivite_Canonique_Tetra4 ();
901 AllConn[ 8]=new Connectivite_Canonique_Tetra10 ();
902 AllConn[ 9]=new Connectivite_Canonique_Hexa8 ();
903 AllConn[10]=new Connectivite_Canonique_Hexa20 ();
904 AllConn[11]=new Connectivite_Canonique_Pyra5 ();
905 AllConn[12]=new Connectivite_Canonique_Pyra13 ();
906 AllConn[13]=new Connectivite_Canonique_Penta6 ();
907 AllConn[14]=new Connectivite_Canonique_Penta15 ();
909 inline Connectivite_Generale::~Connectivite_Generale()
911 for (int i=0;i<AllConn.size();i++) delete AllConn[i];