]> SALOME platform Git repositories - modules/med.git/blob - src/MEDMEM/INTERPOLATION/MEDMEM_WrapperMesh.hxx
Salome HOME
update from the MedMemory V1.0.1
[modules/med.git] / src / MEDMEM / INTERPOLATION / MEDMEM_WrapperMesh.hxx
1 #ifndef MEDMEM_WRAPPER_MESH_HXX
2 #define MEDMEM_WRAPPER_MESH_HXX
3
4 #include "stdio.h"
5 #include "stdlib.h"
6
7 #include <vector>
8
9 #ifndef UNDEFINED
10 #define UNDEFINED -1
11 #endif
12
13 #ifndef FAUX
14 #define FAUX 0
15 #endif
16
17 #ifndef VRAI
18 #define VRAI 1
19 #endif
20
21 //////////////////////////////////////////////////////////////////
22 ///                                                            ///
23 ///                        DECLARATIONS                        ///
24 ///                                                            ///
25 //////////////////////////////////////////////////////////////////
26
27 /*********************************************************/
28 /*                                                       */
29 /*                   Wrapper_Maillage                    */
30 /*                                                       */
31 /*********************************************************/
32
33 template <class NUAGEMAILLE> class Wrapper_Maillage
34 {
35 protected : 
36         NUAGEMAILLE * mailles;
37         
38         int nbr_noeuds;
39         
40         vector< vector<int> > faces_contenues;
41         vector< vector<int> > mailles_contenant_noeud;
42         vector< vector<int> > voisins_de_maille;
43         
44         vector<int> face_au_bord;
45         vector<int> maille_au_bord;
46
47         // Méthode privée
48         void Construit_Contenant_Noeud();
49         
50 public :
51
52         Wrapper_Maillage():mailles(NULL) {}
53         // Construit les Connectivités du maillage à la construction
54         Wrapper_Maillage(NUAGEMAILLE * fs, int nn);
55         ~Wrapper_Maillage() {}
56         
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();
65
66 };
67
68 //////////////////////////////////////////////////////////////////
69 ///                                                            ///
70 ///                            CODE                            ///
71 ///                                                            ///
72 //////////////////////////////////////////////////////////////////
73
74 template <class NUAGEMAILLE> int Wrapper_Maillage<NUAGEMAILLE>::DONNE_PREMIERE_MAILLE_CONTENANT(int num_noeud) const
75         {
76         return mailles_contenant_noeud[num_noeud][0];
77         }
78 template <class NUAGEMAILLE> int Wrapper_Maillage<NUAGEMAILLE>::DONNE_VOISIN_DE_MAILLE(int num_maille,int num_face) const
79         {
80         return voisins_de_maille[num_maille][num_face];
81         }
82 template <class NUAGEMAILLE> int Wrapper_Maillage<NUAGEMAILLE>::EST_AU_BORD_FACE_DE_MAILLE(int num_maille,int num_face) const
83         {
84         return face_au_bord[faces_contenues[num_maille][num_face]];
85         }
86 template <class NUAGEMAILLE> int Wrapper_Maillage<NUAGEMAILLE>::DONNE_NBR_FACES_MAILLE(int num_maille)
87         {
88         return mailles->DONNE_NBR_FACES(num_maille);
89         }
90 template <class NUAGEMAILLE> vector<int> Wrapper_Maillage<NUAGEMAILLE>::DONNE_SIMPLEXE_BASE(int num_maille,int num_face) const
91         {
92         return mailles->DONNE_SIMPLEXE_BASE(num_maille,num_face);
93         }
94 template <class NUAGEMAILLE> NUAGEMAILLE * Wrapper_Maillage<NUAGEMAILLE>::DONNE_POINTEUR_NUAGEMAILLE()
95         {
96         return mailles;
97         }
98 template <class NUAGEMAILLE> void Wrapper_Maillage<NUAGEMAILLE>::Construit_Contenant_Noeud()
99         {
100         int nbr_noeuds_maille;
101         int num,num_noeud,num_maille;
102         
103         mailles_contenant_noeud.resize(nbr_noeuds);
104                 
105         for (num_maille=0;num_maille<mailles->SIZE();num_maille++)
106                 {
107                 nbr_noeuds_maille=mailles->DONNE_NBR_NOEUDS(num_maille);
108                 for (num_noeud=0;num_noeud<nbr_noeuds_maille;num_noeud++) 
109                         {
110                         num=mailles->DONNE_SOMMET_MAILLE(num_maille,num_noeud);
111 //                      if ((num<0)||(num>=mailles_contenant_noeud.size()))
112 //                              {
113 //                              cerr<<endl;
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;
118 //                              exit(-1);
119 //                              }
120                         mailles_contenant_noeud[num].push_back(num_maille);
121                         }
122                 }       
123
124         }
125 template <class NUAGEMAILLE> Wrapper_Maillage<NUAGEMAILLE>::Wrapper_Maillage(NUAGEMAILLE * fs,int nn)
126         {
127         
128         cout<<"Calcul de la Connectivité du Maillage"<<endl;
129         
130         if (fs) mailles=fs;
131         else
132                 {
133                 cerr<<"Wrapper_Maillage : Nuage mailles vide passé en argument"<<endl;
134                 exit(-1);
135                 }
136                 
137         int i,j,k;
138         int num_local_face;
139         int ind_num_noeud,num_noeud;
140         int num_maille;
141         int ind_num_maille_sec,num_maille_sec;
142         int num_local_sec;
143         int flag_existence;
144         int nbr_mailles=mailles->SIZE();
145         int nbr_formants=0;
146         int approx_nbr_formants=0;
147         int tmp;
148         int num_loc;
149         
150         nbr_noeuds=nn;
151         
152         voisins_de_maille.resize(nbr_mailles);
153         faces_contenues.resize(nbr_mailles);
154         maille_au_bord.resize(nbr_mailles,UNDEFINED);
155         
156         vector<int> sommets_face;
157         
158         cout<<"Calcul du lien Sommet->Maille"<<endl;
159         
160         Construit_Contenant_Noeud();
161         
162         for (num_maille=0;num_maille<nbr_mailles;num_maille++)
163                 {
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;
168                 }
169                 
170         face_au_bord.reserve(approx_nbr_formants/10);
171         
172         cout<<"Calcul des voisins"<<endl;
173         
174         int flag_interm;
175         for (num_maille=0;num_maille<nbr_mailles;num_maille++)
176                 {
177                 for (num_local_face=0;num_local_face<mailles->DONNE_NBR_FACES(num_maille);num_local_face++)
178                         {
179                         num_noeud=mailles->DONNE_PREMIER_NOEUD_DE_FACE(num_maille,num_local_face);
180                         flag_existence=0;
181                         sommets_face=mailles->DONNE_FACE(num_maille,num_local_face);
182                         flag_interm=0;
183                         for (ind_num_maille_sec=0;(flag_existence==0)&&(ind_num_maille_sec<mailles_contenant_noeud[num_noeud].size());ind_num_maille_sec++)
184                                 {
185                                 num_maille_sec=mailles_contenant_noeud[num_noeud][ind_num_maille_sec];
186                                 if (num_maille_sec>num_maille)
187                                         {
188                                         flag_interm=1;
189                                         num_loc=mailles->DONNE_NUM_LOC_FACE_EGALE_A_FORMANT(num_maille_sec,sommets_face);
190                                         if (num_loc>UNDEFINED)
191                                                 {
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;
198                                                 flag_existence=1;
199                                                 nbr_formants++;
200                                                 }
201                                         }
202                                 }
203                         }
204                 }
205                 
206         // Construction de la connexité des mailles de bord
207         
208         cout<<"Calcul des bords"<<endl;
209
210         int ind_num_cont,test_bord,nbr_faces_bord=0;
211         for (num_maille=0;num_maille<nbr_mailles;num_maille++) 
212                 {
213                 test_bord=0;
214                 for (ind_num_cont=0;ind_num_cont<faces_contenues[num_maille].size();ind_num_cont++)
215                         {
216                         if (faces_contenues[num_maille][ind_num_cont]==UNDEFINED)
217                                 {
218                                 cout<<"La maille "<<num_maille<<" est au bord via sa face "<<ind_num_cont<<endl;
219                                 test_bord=1;
220                                 faces_contenues[num_maille][ind_num_cont]=nbr_formants;
221                                 maille_au_bord[num_maille]=VRAI;
222                                 face_au_bord.push_back(VRAI);
223                                 nbr_faces_bord++;
224                                 nbr_formants++;
225                                 }
226                         }
227                 if (test_bord==0)
228                         {
229                         maille_au_bord[num_maille]=FAUX;
230                         }
231                 }
232         
233         // Vérification
234         
235         cout<<"Vérification de la connectivité"<<endl;
236         
237         int verif=0;
238         int nf,nbf=0;
239         for (i=0;i<nbr_mailles;i++) 
240                 {
241                 nf=0;
242                 for (j=0;j<faces_contenues[i].size();j++) 
243                         {
244                         if (faces_contenues[i][j]==UNDEFINED) verif++;
245                         if (voisins_de_maille[i][j]==UNDEFINED) nf++;
246                         }
247                 if (maille_au_bord[i]==UNDEFINED) cout<<"Maille "<<i<<" non completement construite"<<endl;
248                 if (nf==faces_contenues[i].size()) nbf++;
249                 }
250                 
251         
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;        
258         }
259
260 #endif