src/INTERPOLATION/MEDMEM_WrapperCells.hxx

Go to the documentation of this file.
00001 // Copyright (C) 2005  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
00002 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
00003 // 
00004 // This library is free software; you can redistribute it and/or
00005 // modify it under the terms of the GNU Lesser General Public
00006 // License as published by the Free Software Foundation; either 
00007 // version 2.1 of the License.
00008 // 
00009 // This library is distributed in the hope that it will be useful 
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of 
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
00012 // Lesser General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU Lesser General Public  
00015 // License along with this library; if not, write to the Free Software 
00016 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00017 //
00018 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00019 //
00020 #ifndef WRAPPERS_CELLS_HXX
00021 #define WRAPPERS_CELLS_HXX
00022 
00023 #include "stdio.h"
00024 #include "stdlib.h"
00025 
00026 #include <typeinfo>
00027 
00028 #include <vector>
00029 #include <map>
00030 
00031 #ifndef FAUX
00032 #define FAUX 0
00033 #endif
00034 
00035 #ifndef VRAI
00036 #define VRAI 1
00037 #endif
00038 
00039 #ifndef UNDEFINED
00040 #define UNDEFINED -1
00041 #endif
00042 
00043 #include "MEDMEM_define.hxx"
00044 
00045 #define MAXNBR 10
00046 
00052 
00053 /*********************************************************/
00054 /*                                                       */
00055 /*      Equivalence num modele local => MED              */
00056 /*                                                       */
00057 /*********************************************************/
00058 
00059 #define NBR_MODELES_MAILLES_DEFINIS 15
00060 static int Equivalence_Local_MED[NBR_MODELES_MAILLES_DEFINIS] = { MED_EN::MED_POINT1 ,
00061                                                            MED_EN::MED_SEG2   , MED_EN::MED_SEG3,
00062                                       MED_EN::MED_TRIA3  , MED_EN::MED_TRIA6   , MED_EN::MED_QUAD4 , MED_EN::MED_QUAD8  ,
00063                                       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 };
00064 
00065 /*********************************************************/
00066 /*                                                       */
00067 /*           Classe Connectivite_Canonique_Base          */
00068 /*                                                       */
00069 /*********************************************************/
00070 
00071 // classe mere des connectivités cannoniques
00072 // N'a aucune méthode virtuelle pour éviter les pertes de temps
00073 // Ce sont les constructeurs des classes dérivées qui renseignent les attributs spécifiques
00074 // 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
00075 // Ce simplexe est utilisé dans le calcul des fonctions barycentriques
00076 // LES MAILLES SONT DONC ET PAR CONSEQUENT DES MAILLES A FACES PLANES
00077 // Une face est une face P1, c'est a dire contenant uniquement les sommets, par les noeuds milieux
00078 // Ces faces sont utilisées pour le calcul de connexité
00079 
00080 
00081 class Connectivite_Canonique_Base
00082 {
00083 protected :
00084      int                   type          ;
00085      int                   nbr_noeuds    ;
00086      int                   nbr_faces     ;
00087      vector<int>           premier_noeud ;
00088      vector< vector<int> > simplexe_base ;
00089      vector< vector<int> > face          ;
00090 public :
00091      inline int                 DONNE_NBR_NOEUDS()                        const { return nbr_noeuds;              }
00092      inline int                 DONNE_NBR_FACES()                         const { return nbr_faces;               }
00093      inline const vector<int> & DONNE_SIMPLEXE_BASE(int num_face)         const { return simplexe_base[num_face]; }
00094      inline const vector<int> & DONNE_FACE(int num_face)                  const { return face[num_face];          }
00095      inline int                 DONNE_PREMIER_NOEUD_DE_FACE(int num_face) const { return premier_noeud[num_face]; }
00096      friend class Wrapper_Maille;
00097 };
00098 
00099 /*********************************************************/
00100 /*                                                       */
00101 /*           Classe Connectivite_Canonique_*             */
00102 /*                                                       */
00103 /*********************************************************/
00104 
00105 // définies dans la partie CODE
00106 // les constructeurs construisent tous les tableaux de connectivités nécessaires en fonction du MODELE MED
00107 
00108 //class Connectivite_Canonique_Point1  : public Connectivite_Canonique_Base; 
00109 //class Connectivite_Canonique_Seg2    : public Connectivite_Canonique_Base; 
00110 //class Connectivite_Canonique_Seg3    : public Connectivite_Canonique_Base; 
00111 //class Connectivite_Canonique_Tria3   : public Connectivite_Canonique_Base; 
00112 //class Connectivite_Canonique_Tria6   : public Connectivite_Canonique_Base; 
00113 //class Connectivite_Canonique_Quad4   : public Connectivite_Canonique_Base; 
00114 //class Connectivite_Canonique_Quad8   : public Connectivite_Canonique_Base; 
00115 //class Connectivite_Canonique_Tetra4  : public Connectivite_Canonique_Base; 
00116 //class Connectivite_Canonique_Tetra10 : public Connectivite_Canonique_Base; 
00117 //class Connectivite_Canonique_Hexa8   : public Connectivite_Canonique_Base; 
00118 //class Connectivite_Canonique_Hexa20  : public Connectivite_Canonique_Base; 
00119 //class Connectivite_Canonique_Pyra5   : public Connectivite_Canonique_Base; 
00120 //class Connectivite_Canonique_Pyra13  : public Connectivite_Canonique_Base; 
00121 //class Connectivite_Canonique_Penta6  : public Connectivite_Canonique_Base; 
00122 //class Connectivite_Canonique_Penta15 : public Connectivite_Canonique_Base; 
00123 
00124 /*********************************************************/
00125 /*                                                       */
00126 /*               Classe Connectivite_Generale            */
00127 /*                                                       */
00128 /*********************************************************/
00129 
00130 // Cette classe contient toutes les connectivités canoniques, elle est utilisée dans Wrapper_Nuage_Maille
00131 
00132 class Connectivite_Generale
00133 {
00134 protected :
00135      vector<Connectivite_Canonique_Base *> AllConn;
00136 public :
00137      Connectivite_Generale();
00138      ~Connectivite_Generale();
00139      // Renvoie la connectivite locale de la maille de numero local de modele i, dont l'equivalent MED est Equivalence_Local_MED[i]
00140      Connectivite_Canonique_Base * operator[](int i) const {return AllConn[i];}
00141 };
00142 
00143 /*********************************************************/
00144 /*                                                       */
00145 /*                  Structure type_retour                */
00146 /*                                                       */
00147 /*********************************************************/
00148 
00149 // c'est une structure de type petit tableau statique, pour accelerer les acces et eviter les allocations dynamiques
00150 
00151 struct type_retour
00152      {
00153      int quoi[MAXNBR];
00154      int combien;
00155      };
00156      
00157 /*********************************************************/
00158 /*                                                       */
00159 /*           Fonction Comparaison_Informe(...)           */
00160 /*                                                       */
00161 /*********************************************************/
00162 
00163 // renvoie vrai si v1 et v2 contiennent la meme chose et sont de meme tailles, faux sinon
00164 
00165 inline int Comparaison_Informe(const type_retour &v1,const type_retour &v2);
00166 
00167 /*********************************************************/
00168 /*                                                       */
00169 /*               Classe Wrapper_Maille                   */
00170 /*                                                       */
00171 /*********************************************************/
00172 
00173 // c'est le wrapper maille sur int[]
00174 // cette classe n'est pas dérivée, tous les types de mailles sont stockées sous cette forme
00175 // la variable qui définit les type est la Connectivité_Canonique_Base, qui est toujours polymorphée en un type spécifique
00176 
00177 
00178 class Wrapper_Maille
00179 {
00180 protected :
00181 
00182      // la référence du premier sommet
00183      int * sommets; 
00184      // la connectivité canonique, toujours polymorphée
00185      Connectivite_Canonique_Base * modele;
00186      
00187 public :
00188      Wrapper_Maille():sommets(NULL) {}
00189      ~Wrapper_Maille() {}
00190      
00191      // 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   
00192      inline const Wrapper_Maille & positionne(int * pos, Connectivite_Canonique_Base * mod){sommets=pos;modele=mod;return *this;}
00193      // 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
00194      // par contre les numéros de face fournis sont des numéros locaux
00195      // renvoie le numéro global du sommet de numéro local i
00196      inline int operator[](int i) const {return sommets[i];} 
00197      inline int  DONNE_NBR_NOEUDS()                               const;
00198      inline int  DONNE_NBR_FACES()                                const;
00199      inline void DONNE_SIMPLEXE_BASE(int num_face,type_retour & simplexe) const;
00200      inline void DONNE_FACE(int num_face,type_retour & face)              const;
00201      inline int  DONNE_PREMIER_NOEUD_DE_FACE(int num_face)        const;
00202      // pour une face, donne, s'il existe, le numéro local de face équivalente, -1 sinon
00203      inline int  DONNE_NUM_LOC_FACE_EGALE_A_FORMANT(const type_retour & sommets_face) const;
00204      // donne le numéro local de modele
00205      inline int  DONNE_TYPE_MAILLE()     const; 
00206      // donne le numéro MED de modele
00207      inline int  DONNE_TYPE_MED_MAILLE() const; 
00208 };
00209 
00210 
00211 /*********************************************************/
00212 /*                                                       */
00213 /*            Classe Wrapper_Nuage_Maille                */
00214 /*                                                       */
00215 /*********************************************************/
00216 
00217 // Classe de Wrapping sur un nuage de maille donné sous forme SKYLINE 
00218 // voir la classe Wrapper_Med_Connectivity dans MEDMEM_Wrapper_Connectivity.hxx pour la politique de classe
00219 
00220 template <class FORME_SKYLINE> class Wrapper_Nuage_Maille
00221 {
00222 protected :
00223      // pointeur sur une forme skyline
00224      FORME_SKYLINE * mailles;
00225      // toutes les connectivités canoniques
00226      Connectivite_Generale ConnGen;
00227      int nbr_mailles;
00228      // 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
00229      vector<int> types;
00230      // pointeur dans mailles du premier sommet de chaque maille (évite les calculs du au nombres éventuellement différents de sommets par maille)
00231      vector< int * > premier_pointeur;
00232      // maille_courante, est un Wrapper_Maille déja instancié utilisé par l'opérateur [] pour accelerer les acces
00233      Wrapper_Maille maille_courante;
00234 public :
00235      Wrapper_Nuage_Maille():mailles(NULL) {}
00236      // le constructeur renseigne types et premier_pointeur, instantie ConnGenn et positionne maille_courante sur la premiere maille
00237      Wrapper_Nuage_Maille(FORME_SKYLINE * fs);
00238      ~Wrapper_Nuage_Maille() {}
00239      // Méthodes de la politique
00240      // positionne maille_courante sur la maille de numéro global i et renvoie maille_courante
00241      inline const Wrapper_Maille & operator[](int i);
00242      inline int         SIZE() {return nbr_mailles;}
00243      void affiche();
00244 };
00245 
00251 
00252 /*********************************************************/
00253 /*                                                       */
00254 /*           Fonction Comparaison_Informe(...)           */
00255 /*                                                       */
00256 /*********************************************************/
00257 
00258 // effectue le test (v1 et v2 ont meme taille)&&(chaque élément de v1 est dans v2)
00259 // c'est une égalité forte si on est sur que v1 et v2 n'ont pas de doublets, 
00260 // ce qui est le cas pour les mailles et les simplexes
00261 
00262 int Comparaison_Informe(const type_retour &v1,const type_retour &v2)
00263      {
00264      int t1=v1.combien;
00265      int t2=v2.combien;
00266      if (t1!=t2) return FAUX;
00267      int i1,i2;
00268      int test;
00269      for (i1=0;i1<t1;i1++)
00270           {
00271           test=1;
00272           for (i2=0;(i2<t2)&&(test);i2++)
00273                {
00274                if (v1.quoi[i1]==v2.quoi[i2]) test=0;
00275                }
00276           if (test) return FAUX;
00277           }
00278      return VRAI;
00279      }
00280 
00281 /*********************************************************/
00282 /*                                                       */
00283 /*               Classe Wrapper_Maille                   */
00284 /*                                                       */
00285 /*********************************************************/
00286 
00287 inline int  Wrapper_Maille::DONNE_NBR_NOEUDS()                                       const
00288      {
00289      return modele->DONNE_NBR_NOEUDS();
00290      }
00291 inline int  Wrapper_Maille::DONNE_NBR_FACES()                                        const
00292      {
00293      return modele->DONNE_NBR_FACES();
00294      }
00295 inline void Wrapper_Maille::DONNE_SIMPLEXE_BASE(int num_face,type_retour & simplexe) const
00296      {
00297      const vector<int> & simplexelocal=modele->DONNE_SIMPLEXE_BASE(num_face);
00298      simplexe.combien=simplexelocal.size();
00299      for (int i=0;i<simplexe.combien;i++) simplexe.quoi[i]=sommets[simplexelocal[i]];
00300      }
00301 inline void Wrapper_Maille::DONNE_FACE(int num_face,type_retour & face)               const
00302      {
00303      const vector<int> & facelocal=modele->DONNE_FACE(num_face);
00304      face.combien=facelocal.size();
00305      for (int i=0;i<face.combien;i++) face.quoi[i]=sommets[facelocal[i]];
00306      }
00307 inline int  Wrapper_Maille::DONNE_PREMIER_NOEUD_DE_FACE(int num_face)                const
00308      {
00309      return sommets[modele->DONNE_PREMIER_NOEUD_DE_FACE(num_face)];
00310      }
00311 inline int  Wrapper_Maille::DONNE_NUM_LOC_FACE_EGALE_A_FORMANT(const type_retour & sommets_face) const
00312      {
00313      type_retour face_loc;
00314      int num_face;
00315      for (num_face=0;num_face<DONNE_NBR_FACES();num_face++)
00316           {
00317           DONNE_FACE(num_face,face_loc);
00318           if (Comparaison_Informe(face_loc,sommets_face)) return num_face;
00319           }
00320      return UNDEFINED;
00321      }
00322 inline int  Wrapper_Maille::DONNE_TYPE_MAILLE()     const
00323      {
00324      return modele->type;
00325      }
00326 inline int  Wrapper_Maille::DONNE_TYPE_MED_MAILLE() const 
00327      {
00328      return Equivalence_Local_MED[modele->type];
00329      }
00330 
00331      
00332 /*********************************************************/
00333 /*                                                       */
00334 /*            Classe Wrapper_Nuage_Maille                */
00335 /*                                                       */
00336 /*********************************************************/ 
00337      
00338 template <class FORME_SKYLINE>     Wrapper_Nuage_Maille<FORME_SKYLINE>::Wrapper_Nuage_Maille(FORME_SKYLINE * fs):mailles(fs)
00339           {
00340           int i;
00341           map<int,int> Equivalence_MED_Local;
00342           // calcule la map de convertion des types med en numéro local, pour accelerer l'acces
00343           for (i=0;i<NBR_MODELES_MAILLES_DEFINIS;i++) Equivalence_MED_Local[Equivalence_Local_MED[i]]=i;
00344           nbr_mailles=mailles->SIZE();
00345           types.resize(nbr_mailles);
00346           premier_pointeur.resize(nbr_mailles);
00347           for (i=0;i<nbr_mailles;i++) 
00348                {
00349                types[i]=Equivalence_MED_Local[mailles->DONNE_TYPE_MAILLE(i)];
00350                premier_pointeur[i]=mailles->DONNE_PREMIER_POINTEUR(i);
00351                }
00352           maille_courante.positionne(premier_pointeur[0],ConnGen[types[0]]);
00353           }
00354 template <class FORME_SKYLINE> const Wrapper_Maille & Wrapper_Nuage_Maille<FORME_SKYLINE>::operator[](int i)
00355           {
00356           return maille_courante.positionne(premier_pointeur[i],ConnGen[types[i]]);
00357           }
00358 template <class FORME_SKYLINE> void Wrapper_Nuage_Maille<FORME_SKYLINE>::affiche()
00359           {
00360           int i,j;
00361           for (i=0;i<nbr_mailles;i++)
00362                {
00363                cout<<"Maille "<<i<<" MED "<<Equivalence_Local_MED[types[i]]<<" : "<<flush;
00364                for (j=0;j<(*this)[i].DONNE_NBR_NOEUDS();j++) cout<<(*this)[i][j]<<" "<<flush;
00365                cout<<endl;
00366                }         
00367           }
00368 
00369 /*********************************************************/
00370 /*                                                       */
00371 /*           Classe Connectivite_Canonique_Point1        */
00372 /*                                                       */
00373 /*********************************************************/
00374 
00375 class Connectivite_Canonique_Point1  : public Connectivite_Canonique_Base
00376 {
00377 public :
00378      Connectivite_Canonique_Point1()
00379           {
00380           
00381           type=0;
00382           
00383           nbr_noeuds = 1;
00384           nbr_faces = 0;      
00385           
00386           premier_noeud = vector<int>(0);
00387           
00388           simplexe_base = vector< vector<int> >(nbr_faces);
00389           face       = vector< vector<int> >(nbr_faces);
00390           
00391           }
00392      ~Connectivite_Canonique_Point1() {}
00393 };
00394 
00395 /*********************************************************/
00396 /*                                                       */
00397 /*           Classe Connectivite_Canonique_Seg2          */
00398 /*                                                       */
00399 /*********************************************************/
00400 
00401 class Connectivite_Canonique_Seg2    : public Connectivite_Canonique_Base
00402 {
00403 public :
00404      Connectivite_Canonique_Seg2()
00405           {
00406           
00407           type=1;
00408           
00409           int pn[2] = {0,1};
00410           int sb[4] = {1,0,0,1};
00411           int fa[2] = {0,1};
00412           int po[3] = {0,1,2};
00413           
00414           nbr_noeuds = 2;
00415           nbr_faces = 2;
00416           
00417           
00418           premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
00419           
00420           simplexe_base = vector< vector<int> >(nbr_faces);
00421           face       = vector< vector<int> >(nbr_faces);
00422           
00423           int i;
00424           
00425           for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[2*i],&sb[2*(i+1)]);
00426           for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
00427           
00428           }
00429      ~Connectivite_Canonique_Seg2() {}
00430 };
00431 /*********************************************************/
00432 /*                                                       */
00433 /*           Classe Connectivite_Canonique_Seg3          */
00434 /*                                                       */
00435 /*********************************************************/
00436 
00437 class Connectivite_Canonique_Seg3    : public Connectivite_Canonique_Base
00438 {
00439 public :
00440      Connectivite_Canonique_Seg3()
00441           {
00442           
00443           type=2;
00444           
00445           int pn[2] = {0,1};
00446           int sb[4] = {1,0,0,1};
00447           int fa[2] = {0,1};
00448           int po[3] = {0,1,2};
00449           
00450           nbr_noeuds = 3;
00451           nbr_faces = 2;
00452           
00453           
00454           premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
00455           
00456           simplexe_base = vector< vector<int> >(nbr_faces);
00457           face       = vector< vector<int> >(nbr_faces);
00458           
00459           int i;
00460           
00461           for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[2*i],&sb[2*(i+1)]);
00462           for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
00463           
00464           }
00465      ~Connectivite_Canonique_Seg3() {}
00466 };
00467 
00468 
00469 /*********************************************************/
00470 /*                                                       */
00471 /*           Classe Connectivite_Canonique_Tria3         */
00472 /*                                                       */
00473 /*********************************************************/
00474 
00475 class Connectivite_Canonique_Tria3 : public Connectivite_Canonique_Base
00476 {
00477 public :
00478      Connectivite_Canonique_Tria3()
00479           {
00480           
00481           type=3;
00482           
00483           int pn[3] = {0,1,2};
00484           int sb[9] = {2,0,1,0,1,2,1,2,0};
00485           int fa[6] = {0,1,1,2,2,0};
00486           int po[4] = {0,2,4,6};
00487           nbr_noeuds = 3;
00488           nbr_faces = 3;
00489           
00490           
00491           premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
00492           
00493           simplexe_base = vector< vector<int> >(nbr_faces);
00494           face       = vector< vector<int> >(nbr_faces);
00495           
00496           int i;
00497           
00498           for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[3*i],&sb[3*(i+1)]);
00499           for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
00500           
00501           }
00502      ~Connectivite_Canonique_Tria3() {}
00503 };
00504 
00505 /*********************************************************/
00506 /*                                                       */
00507 /*           Classe Connectivite_Canonique_Tria6         */
00508 /*                                                       */
00509 /*********************************************************/
00510 
00511 class Connectivite_Canonique_Tria6 : public Connectivite_Canonique_Base
00512 {
00513 public :
00514      Connectivite_Canonique_Tria6()
00515           {
00516           
00517           type=4;
00518           
00519           int pn[3] = {0,1,2};
00520           int sb[9] = {2,0,1,0,1,2,1,2,0};
00521           int fa[6] = {0,1,1,2,2,0};
00522           int po[4] = {0,2,4,6};
00523           nbr_noeuds = 6;
00524           nbr_faces = 3;
00525           
00526           
00527           premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
00528           
00529           simplexe_base = vector< vector<int> >(nbr_faces);
00530           face       = vector< vector<int> >(nbr_faces);
00531           
00532           int i;
00533           
00534           for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[3*i],&sb[3*(i+1)]);
00535           for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
00536           
00537           }
00538      ~Connectivite_Canonique_Tria6() {}
00539 };
00540 
00541 /*********************************************************/
00542 /*                                                       */
00543 /*           Classe Connectivite_Canonique_Quad4         */
00544 /*                                                       */
00545 /*********************************************************/
00546 
00547 class Connectivite_Canonique_Quad4 : public Connectivite_Canonique_Base
00548 {
00549 public :
00550      Connectivite_Canonique_Quad4()
00551           {
00552           
00553           type=5;
00554           
00555           int pn[4] = {0,1,2,3};
00556           int sb[12] = {2,0,1,3,1,2,0,2,3,1,3,0};
00557           int fa[8] = {0,1,1,2,2,3,3,0};
00558           int po[5] = {0,2,4,6,8};
00559           nbr_noeuds = 4;
00560           nbr_faces = 4;
00561           
00562           
00563           premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
00564           
00565           simplexe_base = vector< vector<int> >(nbr_faces);
00566           face       = vector< vector<int> >(nbr_faces);
00567           
00568           int i;
00569           
00570           for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[3*i],&sb[3*(i+1)]);
00571           for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
00572           
00573           }
00574      ~Connectivite_Canonique_Quad4() {}
00575 };
00576 
00577 
00578 /*********************************************************/
00579 /*                                                       */
00580 /*           Classe Connectivite_Canonique_Quad8         */
00581 /*                                                       */
00582 /*********************************************************/
00583 
00584 class Connectivite_Canonique_Quad8 : public Connectivite_Canonique_Base
00585 {
00586 public :
00587      Connectivite_Canonique_Quad8()
00588           {
00589           
00590           type=6;
00591           
00592           int pn[4] = {0,1,2,3};
00593           int sb[12] = {2,0,1,3,1,2,0,2,3,1,3,0};
00594           int fa[8] = {0,1,1,2,2,3,3,0};
00595           int po[5] = {0,2,4,6,8};
00596           nbr_noeuds = 8;
00597           nbr_faces = 4;
00598           
00599           
00600           premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
00601           
00602           simplexe_base = vector< vector<int> >(nbr_faces);
00603           face       = vector< vector<int> >(nbr_faces);
00604           
00605           int i;
00606           
00607           for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[3*i],&sb[3*(i+1)]);
00608           for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
00609           
00610           }
00611      ~Connectivite_Canonique_Quad8() {}
00612 };
00613 
00614 /*********************************************************/
00615 /*                                                       */
00616 /*           Classe Connectivite_Canonique_Tetra4        */
00617 /*                                                       */
00618 /*********************************************************/
00619 
00620 class Connectivite_Canonique_Tetra4 : public Connectivite_Canonique_Base
00621 {
00622 public :
00623      Connectivite_Canonique_Tetra4()
00624           {
00625           
00626           type=7;
00627           
00628           int pn[4] = {0,0,1,2};
00629           int sb[16] = {3,0,1,2,2,0,3,1,0,1,3,2,1,2,3,0};
00630           int fa[12] = {0,1,2,0,3,1,1,3,2,2,3,0};
00631           int po[5] = {0,3,6,9,12};
00632           nbr_noeuds = 4;
00633           nbr_faces = 4;
00634           
00635           
00636           premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
00637           
00638           simplexe_base = vector< vector<int> >(nbr_faces);
00639           face       = vector< vector<int> >(nbr_faces);
00640           
00641           int i;
00642           
00643           for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
00644           for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
00645           
00646           }
00647      ~Connectivite_Canonique_Tetra4() {}
00648 };
00649 
00650 /*********************************************************/
00651 /*                                                       */
00652 /*          Classe Connectivite_Canonique_Tetra10        */
00653 /*                                                       */
00654 /*********************************************************/
00655 
00656 class Connectivite_Canonique_Tetra10 : public Connectivite_Canonique_Base
00657 {
00658 public :
00659      Connectivite_Canonique_Tetra10()
00660           {
00661           
00662           type=8;
00663           
00664           int pn[4] = {0,0,1,2};
00665           int sb[16] = {3,0,1,2,2,0,3,1,0,1,3,2,1,2,3,0};
00666           int fa[12] = {  0,1,2,  0,3,1,  1,3,2,  2,3,0};
00667           int po[5] = {0,3,6,9,12};
00668           
00669           nbr_noeuds = 10;
00670           nbr_faces = 4;
00671           
00672           
00673           premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
00674           
00675           simplexe_base = vector< vector<int> >(nbr_faces);
00676           face       = vector< vector<int> >(nbr_faces);
00677           
00678           int i;
00679           
00680           for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
00681           for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
00682           
00683           }
00684      ~Connectivite_Canonique_Tetra10() {}
00685 };
00686 
00687 /*********************************************************/
00688 /*                                                       */
00689 /*           Classe Connectivite_Canonique_Hexa8         */
00690 /*                                                       */
00691 /*********************************************************/
00692 
00693 class Connectivite_Canonique_Hexa8 : public Connectivite_Canonique_Base
00694 {
00695 public :
00696      Connectivite_Canonique_Hexa8()
00697           {
00698           
00699           type=9;
00700           
00701           int pn[6] = {0,4,0,1,2,3};
00702           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};
00703           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};
00704           int po[7] = {0,4,8,12,16,20,24};
00705           nbr_noeuds = 8;
00706           nbr_faces = 6;
00707           
00708           
00709           premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
00710           
00711           simplexe_base = vector< vector<int> >(nbr_faces);
00712           face       = vector< vector<int> >(nbr_faces);
00713           
00714           int i;
00715           
00716           for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
00717           for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
00718           
00719           }
00720      ~Connectivite_Canonique_Hexa8() {}
00721 };
00722 
00723 /*********************************************************/
00724 /*                                                       */
00725 /*           Classe Connectivite_Canonique_Hexa20        */
00726 /*                                                       */
00727 /*********************************************************/
00728 
00729 class Connectivite_Canonique_Hexa20 : public Connectivite_Canonique_Base
00730 {
00731 public :
00732      Connectivite_Canonique_Hexa20()
00733           {
00734           
00735           type=10;
00736           
00737           int pn[6] = {0,4,0,1,2,3};
00738           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};
00739           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};
00740           int po[7] = {0,4,8,12,16,20,24};
00741           nbr_noeuds = 20;
00742           nbr_faces = 6;
00743           
00744           
00745           premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
00746           
00747           simplexe_base = vector< vector<int> >(nbr_faces);
00748           face       = vector< vector<int> >(nbr_faces);
00749           
00750           int i;
00751           
00752           for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
00753           for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
00754           
00755           }
00756      ~Connectivite_Canonique_Hexa20() {}
00757 };
00758 
00759 /*********************************************************/
00760 /*                                                       */
00761 /*           Classe Connectivite_Canonique_Pyra5         */
00762 /*                                                       */
00763 /*********************************************************/
00764 
00765 class Connectivite_Canonique_Pyra5 : public Connectivite_Canonique_Base
00766 {
00767 public :
00768      Connectivite_Canonique_Pyra5()
00769           {
00770           
00771           type=11;
00772           
00773           int pn[5] = {0,0,1,2,3};
00774           int sb[20] = {4,0,1,2,3,0,4,1,0,1,4,2,1,2,4,3,2,0,3,4};
00775           int fa[16] = {0,1,2,3,0,4,1,1,4,2,2,4,3,3,4,0};
00776           int po[6] = {0,4,7,10,13,16};
00777           nbr_noeuds = 5;
00778           nbr_faces = 5;
00779           
00780           
00781           premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
00782           
00783           simplexe_base = vector< vector<int> >(nbr_faces);
00784           face       = vector< vector<int> >(nbr_faces);
00785           
00786           int i;
00787           
00788           for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
00789           for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
00790           
00791           }
00792      ~Connectivite_Canonique_Pyra5() {}
00793 };
00794 
00795 /*********************************************************/
00796 /*                                                       */
00797 /*           Classe Connectivite_Canonique_Pyra13        */
00798 /*                                                       */
00799 /*********************************************************/
00800 
00801 class Connectivite_Canonique_Pyra13 : public Connectivite_Canonique_Base
00802 {
00803 public :
00804      Connectivite_Canonique_Pyra13()
00805           {
00806           
00807           type=12;
00808           
00809           int pn[5] = {0,0,1,2,3};
00810           int sb[20] = {4,0,1,2,3,0,4,1,0,1,4,2,1,2,4,3,2,0,3,4};
00811           int fa[16] = {0,1,2,3,0,4,1,1,4,2,2,4,3,3,4,0};
00812           int po[6] = {0,4,7,10,13,16};
00813           nbr_noeuds = 13;
00814           nbr_faces = 5;
00815           
00816           
00817           premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
00818           
00819           simplexe_base = vector< vector<int> >(nbr_faces);
00820           face       = vector< vector<int> >(nbr_faces);
00821           
00822           int i;
00823           
00824           for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
00825           for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
00826           
00827           }
00828      ~Connectivite_Canonique_Pyra13() {}
00829 };
00830 
00831 /*********************************************************/
00832 /*                                                       */
00833 /*           Classe Connectivite_Canonique_Penta6        */
00834 /*                                                       */
00835 /*********************************************************/
00836 
00837 class Connectivite_Canonique_Penta6 : public Connectivite_Canonique_Base
00838 {
00839 public :
00840      Connectivite_Canonique_Penta6()
00841           {
00842           
00843           type=13;
00844           
00845           int pn[5] = {0,3,0,1,2};
00846           int sb[20] = {3,0,1,2,2,3,4,5,5,0,3,1,0,1,4,2,1,2,5,0};
00847           int fa[18] = {0,1,2,3,4,5,0,3,4,1,1,4,5,2,2,5,3,1};
00848           int po[6] = {0,3,6,10,14,18};
00849           nbr_noeuds = 6;
00850           nbr_faces = 5;
00851           
00852           
00853           premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
00854           
00855           simplexe_base = vector< vector<int> >(nbr_faces);
00856           face       = vector< vector<int> >(nbr_faces);
00857           
00858           int i;
00859           
00860           for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
00861           for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
00862           
00863           }
00864      ~Connectivite_Canonique_Penta6() {}
00865 };
00866 
00867 /*********************************************************/
00868 /*                                                       */
00869 /*           Classe Connectivite_Canonique_Penta15       */
00870 /*                                                       */
00871 /*********************************************************/
00872 
00873 class Connectivite_Canonique_Penta15 : public Connectivite_Canonique_Base
00874 {
00875 public :
00876      Connectivite_Canonique_Penta15()
00877           {
00878           
00879           type=14;
00880           
00881           int pn[5] = {0,3,0,1,2};
00882           int sb[20] = {3,0,1,2,2,3,4,5,5,0,3,1,0,1,4,2,1,2,5,0};
00883           int fa[18] = {0,1,2,3,4,5,0,3,4,1,1,4,5,2,2,5,3,1};
00884           int po[6] = {0,3,6,10,14,18};
00885           nbr_noeuds = 15;
00886           nbr_faces = 5;
00887           
00888           
00889           premier_noeud = vector<int>(&pn[0],&pn[nbr_faces]);
00890           
00891           simplexe_base = vector< vector<int> >(nbr_faces);
00892           face       = vector< vector<int> >(nbr_faces);
00893           
00894           int i;
00895           
00896           for (i=0;i<nbr_faces;i++) simplexe_base[i]=vector<int>(&sb[4*i],&sb[4*(i+1)]);
00897           for (i=0;i<nbr_faces;i++) face[i]=vector<int>(&fa[po[i]],&fa[po[i+1]]);
00898           
00899           }
00900      ~Connectivite_Canonique_Penta15() {}
00901 };
00902 
00903 /*********************************************************/
00904 /*                                                       */
00905 /*               Classe Connectivite_Generale            */
00906 /*                                                       */
00907 /*********************************************************/
00908 
00909 inline Connectivite_Generale::Connectivite_Generale():AllConn(NBR_MODELES_MAILLES_DEFINIS)
00910      {
00911      // l'ordre est important, il dépend de la relation entre numéro local et modele et numéro MED
00912      AllConn[ 0]=new Connectivite_Canonique_Point1  ();
00913      AllConn[ 1]=new Connectivite_Canonique_Seg2    ();
00914      AllConn[ 2]=new Connectivite_Canonique_Seg3    ();
00915      AllConn[ 3]=new Connectivite_Canonique_Tria3   ();
00916      AllConn[ 4]=new Connectivite_Canonique_Tria6   ();
00917      AllConn[ 5]=new Connectivite_Canonique_Quad4   ();         
00918      AllConn[ 6]=new Connectivite_Canonique_Quad8   ();         
00919      AllConn[ 7]=new Connectivite_Canonique_Tetra4  ();         
00920      AllConn[ 8]=new Connectivite_Canonique_Tetra10 ();         
00921      AllConn[ 9]=new Connectivite_Canonique_Hexa8   ();
00922      AllConn[10]=new Connectivite_Canonique_Hexa20  ();
00923      AllConn[11]=new Connectivite_Canonique_Pyra5   ();         
00924      AllConn[12]=new Connectivite_Canonique_Pyra13  ();         
00925      AllConn[13]=new Connectivite_Canonique_Penta6  ();         
00926      AllConn[14]=new Connectivite_Canonique_Penta15 ();         
00927      }
00928 inline Connectivite_Generale::~Connectivite_Generale() 
00929      {
00930      for (int i=0;i<AllConn.size();i++) delete AllConn[i];
00931      }
00932 
00933 
00934 #endif