1 #ifndef MEDMEM_WRAPPER_MESH_HXX
2 #define MEDMEM_WRAPPER_MESH_HXX
21 //////////////////////////////////////////////////////////////////
25 //////////////////////////////////////////////////////////////////
27 /*********************************************************/
29 /* Wrapper_Maillage */
31 /*********************************************************/
33 template <class NUAGEMAILLE> class Wrapper_Maillage
36 NUAGEMAILLE * mailles;
40 vector< vector<int> > faces_contenues;
41 vector< vector<int> > mailles_contenant_noeud;
42 vector< vector<int> > voisins_de_maille;
44 vector<int> face_au_bord;
45 vector<int> maille_au_bord;
48 void Construit_Contenant_Noeud();
52 Wrapper_Maillage():mailles(NULL) {}
53 // Construit les Connectivités du maillage à la construction
54 Wrapper_Maillage(NUAGEMAILLE * fs, int nn);
55 ~Wrapper_Maillage() {}
57 // Méthodes de la politique
58 inline int DONNE_NBR_FACES_MAILLE(int num_maille);
59 inline int DONNE_VOISIN_DE_MAILLE(int num_maille,int num_face) const;
60 inline int EST_AU_BORD_FACE_DE_MAILLE(int num_maille,int num_face) const;
61 inline int DONNE_NBR_FACES(int num_maille) const;
62 inline vector<int> DONNE_SIMPLEXE_BASE(int num_maille,int num_face) const;
63 inline int DONNE_PREMIERE_MAILLE_CONTENANT(int num_noeud) const;
64 inline NUAGEMAILLE * DONNE_POINTEUR_NUAGEMAILLE();
68 //////////////////////////////////////////////////////////////////
72 //////////////////////////////////////////////////////////////////
74 template <class NUAGEMAILLE> int Wrapper_Maillage<NUAGEMAILLE>::DONNE_PREMIERE_MAILLE_CONTENANT(int num_noeud) const
76 return mailles_contenant_noeud[num_noeud][0];
78 template <class NUAGEMAILLE> int Wrapper_Maillage<NUAGEMAILLE>::DONNE_VOISIN_DE_MAILLE(int num_maille,int num_face) const
80 return voisins_de_maille[num_maille][num_face];
82 template <class NUAGEMAILLE> int Wrapper_Maillage<NUAGEMAILLE>::EST_AU_BORD_FACE_DE_MAILLE(int num_maille,int num_face) const
84 return face_au_bord[faces_contenues[num_maille][num_face]];
86 template <class NUAGEMAILLE> int Wrapper_Maillage<NUAGEMAILLE>::DONNE_NBR_FACES_MAILLE(int num_maille)
88 return mailles->DONNE_NBR_FACES(num_maille);
90 template <class NUAGEMAILLE> vector<int> Wrapper_Maillage<NUAGEMAILLE>::DONNE_SIMPLEXE_BASE(int num_maille,int num_face) const
92 return mailles->DONNE_SIMPLEXE_BASE(num_maille,num_face);
94 template <class NUAGEMAILLE> NUAGEMAILLE * Wrapper_Maillage<NUAGEMAILLE>::DONNE_POINTEUR_NUAGEMAILLE()
98 template <class NUAGEMAILLE> void Wrapper_Maillage<NUAGEMAILLE>::Construit_Contenant_Noeud()
100 int nbr_noeuds_maille;
101 int num,num_noeud,num_maille;
103 mailles_contenant_noeud.resize(nbr_noeuds);
105 for (num_maille=0;num_maille<mailles->SIZE();num_maille++)
107 nbr_noeuds_maille=mailles->DONNE_NBR_NOEUDS(num_maille);
108 for (num_noeud=0;num_noeud<nbr_noeuds_maille;num_noeud++)
110 num=mailles->DONNE_SOMMET_MAILLE(num_maille,num_noeud);
111 // if ((num<0)||(num>=mailles_contenant_noeud.size()))
114 // cerr<<"Outbound call dans Construit Contenant Noeud"<<endl;
115 // cerr<<"Inférior bound = 0"<<endl;
116 // cerr<<"Supérior bound = "<<mailles_contenant_noeud.size()-1<<endl;
117 // cerr<<"Call = "<<num<<endl;
120 mailles_contenant_noeud[num].push_back(num_maille);
125 template <class NUAGEMAILLE> Wrapper_Maillage<NUAGEMAILLE>::Wrapper_Maillage(NUAGEMAILLE * fs,int nn)
128 cout<<"Calcul de la Connectivité du Maillage"<<endl;
133 cerr<<"Wrapper_Maillage : Nuage mailles vide passé en argument"<<endl;
139 int ind_num_noeud,num_noeud;
141 int ind_num_maille_sec,num_maille_sec;
144 int nbr_mailles=mailles->SIZE();
146 int approx_nbr_formants=0;
152 voisins_de_maille.resize(nbr_mailles);
153 faces_contenues.resize(nbr_mailles);
154 maille_au_bord.resize(nbr_mailles,UNDEFINED);
156 vector<int> sommets_face;
158 cout<<"Calcul du lien Sommet->Maille"<<endl;
160 Construit_Contenant_Noeud();
162 for (num_maille=0;num_maille<nbr_mailles;num_maille++)
164 tmp=mailles->DONNE_NBR_FACES(num_maille);
165 voisins_de_maille[num_maille]=vector<int>(tmp,UNDEFINED);
166 faces_contenues[num_maille]=vector<int>(tmp,UNDEFINED);
167 approx_nbr_formants+=tmp;
170 face_au_bord.reserve(approx_nbr_formants/10);
172 cout<<"Calcul des voisins"<<endl;
175 for (num_maille=0;num_maille<nbr_mailles;num_maille++)
177 for (num_local_face=0;num_local_face<mailles->DONNE_NBR_FACES(num_maille);num_local_face++)
179 num_noeud=mailles->DONNE_PREMIER_NOEUD_DE_FACE(num_maille,num_local_face);
181 sommets_face=mailles->DONNE_FACE(num_maille,num_local_face);
183 for (ind_num_maille_sec=0;(flag_existence==0)&&(ind_num_maille_sec<mailles_contenant_noeud[num_noeud].size());ind_num_maille_sec++)
185 num_maille_sec=mailles_contenant_noeud[num_noeud][ind_num_maille_sec];
186 if (num_maille_sec>num_maille)
189 num_loc=mailles->DONNE_NUM_LOC_FACE_EGALE_A_FORMANT(num_maille_sec,sommets_face);
190 if (num_loc>UNDEFINED)
192 cout<<"La maille "<<num_maille<<" a pour voisin la maille "<<num_maille_sec<<" via la face "<<nbr_formants<<endl;
193 face_au_bord.push_back(FAUX);
194 faces_contenues[num_maille][num_local_face]=nbr_formants;
195 voisins_de_maille[num_maille][num_local_face]=num_maille_sec;
196 faces_contenues[num_maille_sec][num_loc]=nbr_formants;
197 voisins_de_maille[num_maille_sec][num_loc]=num_maille;
206 // Construction de la connexité des mailles de bord
208 cout<<"Calcul des bords"<<endl;
210 int ind_num_cont,test_bord,nbr_faces_bord=0;
211 for (num_maille=0;num_maille<nbr_mailles;num_maille++)
214 for (ind_num_cont=0;ind_num_cont<faces_contenues[num_maille].size();ind_num_cont++)
216 if (faces_contenues[num_maille][ind_num_cont]==UNDEFINED)
218 cout<<"La maille "<<num_maille<<" est au bord via sa face "<<ind_num_cont<<endl;
220 faces_contenues[num_maille][ind_num_cont]=nbr_formants;
221 maille_au_bord[num_maille]=VRAI;
222 face_au_bord.push_back(VRAI);
229 maille_au_bord[num_maille]=FAUX;
235 cout<<"Vérification de la connectivité"<<endl;
239 for (i=0;i<nbr_mailles;i++)
242 for (j=0;j<faces_contenues[i].size();j++)
244 if (faces_contenues[i][j]==UNDEFINED) verif++;
245 if (voisins_de_maille[i][j]==UNDEFINED) nf++;
247 if (maille_au_bord[i]==UNDEFINED) cout<<"Maille "<<i<<" non completement construite"<<endl;
248 if (nf==faces_contenues[i].size()) nbf++;
252 cout<<" IL Y A "<<verif<<" PROBLEMES A LA SUITE DE LA CONSTRUCTION DE CONNEXITE"<<endl;
253 cout<<"Nombre de mailles : "<<nbr_mailles<<endl;
254 cout<<"Approximation du nombre de faces : "<<approx_nbr_formants<<endl;
255 cout<<"Nombre réel de faces de bord : "<<nbr_faces_bord<<endl;
256 cout<<"Nombre réel total de faces : "<<nbr_formants<<endl;
257 cout<<"Nombre de Mailles Isolées : "<<nbf<<endl;