ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur_analyse.cpp
Revision: 805
Committed: Mon Jun 20 16:37:35 2016 UTC (8 years, 10 months ago) by francois
Original Path: magic/lib/mailleur_auto/src/mailleur_analyse.cpp
File size: 18638 byte(s)
Log Message:
Optimisation de la méthode de lissage McKenzie2016 suppression de la méthode inconnue nan2015 dans le posttraitement des optimisation topologique

File Contents

# User Rev Content
1 francois 425 #include "gestionversion.h"
2     #include "mailleur_analyse.h"
3     #include "mg_gestionnaire.h"
4     #include "m3d_triangle.h"
5     #include "tpl_fonctions_generiques.h"
6 francois 514 #include "fct_taille.h"
7 francois 425
8    
9    
10    
11    
12    
13 francois 426 MAILLEUR_ANALYSE::MAILLEUR_ANALYSE(MG_MAILLAGE* m,OT_CPU* comp):MAILLEUR(comp),mai(m),borne1(0.1),borne2(0.2),borne3(0.5),eps_angle_retourne(0.03)
14 francois 425 {
15    
16     }
17    
18    
19    
20    
21    
22     MAILLEUR_ANALYSE::MAILLEUR_ANALYSE(MAILLEUR_ANALYSE &mdd):MAILLEUR(mdd),mai(mdd.mai),borne1(mdd.borne1),borne2(mdd.borne2),borne3(mdd.borne3)
23     {
24    
25     }
26    
27    
28    
29     MAILLEUR_ANALYSE::~MAILLEUR_ANALYSE()
30     {
31    
32     }
33    
34 francois 426 void MAILLEUR_ANALYSE::change_borne(double val1,double val2,double val3)
35     {
36     borne1=val1;
37     borne2=val2;
38     borne3=val3;
39     }
40 francois 425
41 francois 426 void MAILLEUR_ANALYSE::get_borne(double &val1,double &val2,double &val3)
42     {
43     val1=borne1;
44     val2=borne2;
45     val3=borne3;
46     }
47 francois 425
48 francois 426 void MAILLEUR_ANALYSE::change_eps_angle_retourne(double val)
49     {
50     eps_angle_retourne=val;
51     }
52 francois 425
53 francois 426 double MAILLEUR_ANALYSE::get_eps_angle_retourne(void)
54     {
55     return eps_angle_retourne;
56     }
57 francois 425
58 francois 426
59 francois 425 void MAILLEUR_ANALYSE::analyse(char *nom)
60     {
61     char mess[500];
62     sprintf(mess,"ANALYSEUR DE MG MAILLAGE 3D");
63     affiche(mess);
64     sprintf(mess,"---------------------------");
65     affiche(mess);
66 francois 660 affiche((char*)"");
67 francois 805 sprintf(mess,"Consitution du maillage");
68     affiche(mess);
69     affiche((char*)"");
70     int nbnofront,nbsegfront,nbtrifront,nbquadfront;
71     denombre_maillage(nbnofront,nbsegfront,nbtrifront,nbquadfront);
72     sprintf(mess," Maillage numero : %lu",mai->get_id());affiche(mess);
73     sprintf(mess," %d noeuds",mai->get_nb_mg_noeud()); affiche(mess);
74     sprintf(mess," %d segments",mai->get_nb_mg_segment()); affiche(mess);
75     sprintf(mess," %d triangles",mai->get_nb_mg_triangle()); affiche(mess);
76     sprintf(mess," %d quadrangles",mai->get_nb_mg_quadrangle()); affiche(mess);
77     sprintf(mess," %d tetras",mai->get_nb_mg_tetra()); affiche(mess);
78     sprintf(mess," %d hexas",mai->get_nb_mg_hexa()); affiche(mess); affiche((char*)"");
79     sprintf(mess," %d noeuds frontiere",nbnofront); affiche(mess);
80     sprintf(mess," %d segments frontiere",nbsegfront); affiche(mess);
81     sprintf(mess," %d triangles frontiere",nbtrifront); affiche(mess);
82     sprintf(mess," %d quadrangles frontiere",nbquadfront); affiche(mess);affiche((char*)"");
83 francois 425
84 francois 805
85     MG_SOLUTION *sol=NULL;
86     if (nom!=NULL)
87     {
88     std::string nomsol=nom;nomsol=nomsol+".sol";
89     if (mai->get_nb_mg_tetra()==0) sol=new MG_SOLUTION(mai,1,(char*)nomsol.c_str(),mai->get_nb_mg_triangle(),"Qualité",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT2,MAGIC::TYPE_SOLUTION::SCALAIRE);
90     if (mai->get_nb_mg_tetra()!=0) sol=new MG_SOLUTION(mai,1,(char*)nomsol.c_str(),mai->get_nb_mg_tetra(),"Qualité",MAGIC::ENTITE_SOLUTION::ENTITE_ELEMENT3,MAGIC::TYPE_SOLUTION::SCALAIRE);
91     mai->get_gestionnaire()->ajouter_mg_solution(sol);
92     }
93    
94    
95     if (nbtrifront!=0)
96     {
97     affiche((char*)"");
98     sprintf(mess,"Analyse maillage triangulaire 2D");
99     affiche(mess);
100     affiche((char*)"");
101     double qualmin,qualmax,qualmoy;
102     int tab[7];
103     analyse_qualite_maillage_2D(sol,qualmin,qualmax,qualmoy,tab);
104     sprintf(mess," Nombre de triangles avec des noeuds fusionnés : %d",tab[6]); affiche(mess);
105     sprintf(mess," Nombre de triangles avec 1 voisin manquant : %d",tab[5]); affiche(mess);
106     sprintf(mess," critere d'angle limite pour l'inversion : %lf",eps_angle_retourne); affiche(mess);
107     sprintf(mess," qualite moyenne des triangles de frontiere : %lf",qualmoy); affiche(mess);
108     sprintf(mess," qualite min des triangles de frontiere : %lf",qualmin); affiche(mess);
109     sprintf(mess," qualite max des triangles de frontiere : %lf",qualmax); affiche(mess);
110     sprintf(mess," nombre de triangles de frontiere >%lf : %d (%.2lf%%)",borne3,tab[4],tab[4]*100./nbtrifront); affiche(mess);
111     sprintf(mess," nombre de triangles de frontiere >%lf : %d (%.2lf%%)",borne2,tab[3],tab[3]*100./nbtrifront); affiche(mess);
112     sprintf(mess," nombre de triangles de frontiere >%lf : %d (%.2lf%%)",borne1,tab[2],tab[2]*100./nbtrifront); affiche(mess);
113     sprintf(mess," nombre de triangles de frontiere >%lf : %d (%.2lf%%)",0.,tab[1],tab[1]*100./nbtrifront); affiche(mess);
114     sprintf(mess," nombre de triangles de frontiere retournes : %d (%.2lf%%)",tab[0],tab[0]*100./nbtrifront); affiche(mess); affiche((char*)"");
115     }
116     if (mai->get_nb_mg_tetra()!=0)
117     {
118     affiche((char*)"");
119     sprintf(mess,"Analyse maillage triangulaire 3D");
120     affiche(mess);
121     affiche((char*)"");
122     double qualmin,qualmax,qualmoy;
123     int tab[5];
124     analyse_qualite_maillage_3D(sol,qualmin,qualmax,qualmoy,tab);
125     sprintf(mess," qualite moyenne des tetra : %lf",qualmoy); affiche(mess);
126     sprintf(mess," qualite min des tetra : %lf",qualmin); affiche(mess);
127     sprintf(mess," qualite max des tetra : %lf",qualmax); affiche(mess);
128     sprintf(mess," nombre de tetra >%lf : %d (%.2lf%%)",borne3,tab[4],tab[4]*100./mai->get_nb_mg_tetra()); affiche(mess);
129     sprintf(mess," nombre de tetra >%lf : %d (%.2lf%%)",borne2,tab[3],tab[3]*100./mai->get_nb_mg_tetra()); affiche(mess);
130     sprintf(mess," nombre de tetra >%lf : %d (%.2lf%%)",borne1,tab[2],tab[2]*100./mai->get_nb_mg_tetra()); affiche(mess);
131     sprintf(mess," nombre de tetra >%lf : %d (%.2lf%%)",0.,tab[1],tab[1]*100./mai->get_nb_mg_tetra()); affiche(mess);
132     sprintf(mess," nombre de tetra retournes : %d (%.2lf%%)",tab[0],tab[0]*100./mai->get_nb_mg_tetra()); affiche(mess);
133     affiche((char*)"");
134     sprintf(mess,"Validite maillage triangulaire 3D");
135     affiche(mess);
136     affiche((char*)"");
137     int nbsegcorrect,nbsegincorrect;
138     analyse_validite_maillage_3D(nbsegcorrect,nbsegincorrect);
139    
140     sprintf(mess," segment correct %d(%.2lf%%) segment incorrect %d(%.2lf%%) ",nbsegcorrect,nbsegcorrect*100./(nbsegcorrect+nbsegincorrect),nbsegincorrect,nbsegincorrect*100./(nbsegcorrect+nbsegincorrect)); affiche(mess);
141    
142     }
143    
144     if (nom!=NULL)
145     {
146     std::string nomf=nom;
147     nomf=nomf+".magic";
148     mai->get_gestionnaire()->enregistrer((char*)nomf.c_str());
149     }
150    
151     }
152    
153     void MAILLEUR_ANALYSE::denombre_maillage(int &nbnofront,int &nbsegfront,int &nbtrifront,int &nbquadfront)
154     {
155 francois 425 LISTE_MG_NOEUD::iterator itn;
156     for (MG_NOEUD* no=mai->get_premier_noeud(itn);no!=NULL;no=mai->get_suivant_noeud(itn))
157     no->change_nouveau_numero(0);
158    
159     LISTE_MG_SEGMENT::iterator its;
160     for (MG_SEGMENT* seg=mai->get_premier_segment(its);seg!=NULL;seg=mai->get_suivant_segment(its))
161     seg->change_nouveau_numero(0);
162    
163    
164     LISTE_MG_TRIANGLE::iterator ittr;
165     for (MG_TRIANGLE* tri=mai->get_premier_triangle(ittr);tri!=NULL;tri=mai->get_suivant_triangle(ittr))
166     tri->change_nouveau_numero(0);
167    
168     LISTE_MG_QUADRANGLE::iterator itq;
169     for (MG_QUADRANGLE* quad=mai->get_premier_quadrangle(itq);quad!=NULL;quad=mai->get_suivant_quadrangle(itq))
170     quad->change_nouveau_numero(0);
171    
172     LISTE_MG_TETRA::iterator itt;
173     for (MG_TETRA* tet=mai->get_premier_tetra(itt);tet!=NULL;tet=mai->get_suivant_tetra(itt))
174     {
175     tet->get_triangle1()->change_nouveau_numero(tet->get_triangle1()->get_nouveau_numero()+1);
176     tet->get_triangle2()->change_nouveau_numero(tet->get_triangle2()->get_nouveau_numero()+1);
177     tet->get_triangle3()->change_nouveau_numero(tet->get_triangle3()->get_nouveau_numero()+1);
178     tet->get_triangle4()->change_nouveau_numero(tet->get_triangle4()->get_nouveau_numero()+1);
179     }
180    
181     LISTE_MG_HEXA::iterator ith;
182     for (MG_HEXA* hex=mai->get_premier_hexa(ith);hex!=NULL;hex=mai->get_suivant_hexa(ith))
183     {
184     hex->get_quadrangle1()->change_nouveau_numero(hex->get_quadrangle1()->get_nouveau_numero()+1);
185     hex->get_quadrangle2()->change_nouveau_numero(hex->get_quadrangle2()->get_nouveau_numero()+1);
186     hex->get_quadrangle3()->change_nouveau_numero(hex->get_quadrangle3()->get_nouveau_numero()+1);
187     hex->get_quadrangle4()->change_nouveau_numero(hex->get_quadrangle4()->get_nouveau_numero()+1);
188     hex->get_quadrangle5()->change_nouveau_numero(hex->get_quadrangle5()->get_nouveau_numero()+1);
189     hex->get_quadrangle6()->change_nouveau_numero(hex->get_quadrangle6()->get_nouveau_numero()+1);
190     }
191 francois 805 nbtrifront=0;
192 francois 425 for (MG_TRIANGLE* tri=mai->get_premier_triangle(ittr);tri!=NULL;tri=mai->get_suivant_triangle(ittr))
193     {
194     if (mai->get_nb_mg_tetra()==0)
195     tri->change_nouveau_numero(1);
196     if (tri->get_nouveau_numero()==1)
197     {
198     nbtrifront++;
199     tri->get_segment1()->change_nouveau_numero(tri->get_segment1()->get_nouveau_numero()+1);
200     tri->get_segment2()->change_nouveau_numero(tri->get_segment2()->get_nouveau_numero()+1);
201     tri->get_segment3()->change_nouveau_numero(tri->get_segment3()->get_nouveau_numero()+1);
202     tri->get_noeud1()->change_nouveau_numero(1);
203     tri->get_noeud2()->change_nouveau_numero(1);
204     tri->get_noeud3()->change_nouveau_numero(1);
205    
206     }
207     }
208 francois 805 nbquadfront=0;
209 francois 425 for (MG_QUADRANGLE* quad=mai->get_premier_quadrangle(itq);quad!=NULL;quad=mai->get_suivant_quadrangle(itq))
210     {
211     if (mai->get_nb_mg_hexa()==0)
212     quad->change_nouveau_numero(1);
213     if (quad->get_nouveau_numero()==1)
214     {
215     nbquadfront++;
216     quad->get_segment1()->change_nouveau_numero(quad->get_segment1()->get_nouveau_numero()+1);
217     quad->get_segment2()->change_nouveau_numero(quad->get_segment2()->get_nouveau_numero()+1);
218     quad->get_segment3()->change_nouveau_numero(quad->get_segment3()->get_nouveau_numero()+1);
219     quad->get_segment4()->change_nouveau_numero(quad->get_segment4()->get_nouveau_numero()+1);
220     quad->get_noeud1()->change_nouveau_numero(1);
221     quad->get_noeud2()->change_nouveau_numero(1);
222     quad->get_noeud3()->change_nouveau_numero(1);
223     quad->get_noeud4()->change_nouveau_numero(1);
224     }
225     }
226 francois 805 nbsegfront=0;
227 francois 425 for (MG_SEGMENT* seg=mai->get_premier_segment(its);seg!=NULL;seg=mai->get_suivant_segment(its))
228     if (seg->get_nouveau_numero()==2) nbsegfront++;
229 francois 805 nbnofront=0;
230 francois 425 for (MG_NOEUD* no=mai->get_premier_noeud(itn);no!=NULL;no=mai->get_suivant_noeud(itn))
231     if (no->get_nouveau_numero()==1) nbnofront++;
232 francois 805 }
233 francois 425
234 francois 805 void MAILLEUR_ANALYSE::analyse_qualite_maillage_2D(MG_SOLUTION *sol,double &qualmin,double &qualmax,double &qualmoy,int *tab)
235     {
236     int nbnofront,nbsegfront,nbtrifront,nbquadfront;
237     denombre_maillage(nbnofront,nbsegfront,nbtrifront,nbquadfront);
238     qualmin=1e300,qualmax=-1e300,qualmoy=0.;
239     tab[0]=0;tab[1]=0;tab[2]=0;tab[3]=0;tab[4]=0;tab[5]=0;tab[6]=0;
240 francois 425 int itri=0;
241 francois 805 LISTE_MG_TRIANGLE::iterator ittr;
242 francois 425 for (MG_TRIANGLE* tri=mai->get_premier_triangle(ittr);tri!=NULL;tri=mai->get_suivant_triangle(ittr))
243     if (tri->get_nouveau_numero()==1)
244     {
245     double qual=OPERATEUR::qualite_triangle(tri->get_noeud1()->get_coord(),tri->get_noeud2()->get_coord(),tri->get_noeud3()->get_coord());
246     MG_NOEUD * no1=tri->get_noeud1();
247 francois 429 MG_NOEUD * no2=tri->get_noeud2();
248     MG_NOEUD * no3=tri->get_noeud3();
249     if (no1==no2)
250     if (no1==no3)
251 francois 805 tab[6]++;
252 francois 425 int nb1=no1->get_lien_triangle()->get_nb();
253     int nb2=no2->get_lien_triangle()->get_nb();
254     int nb3=no3->get_lien_triangle()->get_nb();
255     OT_VECTEUR_3D vec1(tri->get_noeud1()->get_coord(),tri->get_noeud2()->get_coord());
256     OT_VECTEUR_3D vec2(tri->get_noeud1()->get_coord(),tri->get_noeud3()->get_coord());
257     OT_VECTEUR_3D normal=vec1&vec2;
258     normal.norme();
259     int nbretourne=0;
260 francois 429 int nbvoisin=0;
261 francois 425 for (int i=0;i<nb1;i++)
262     for (int j=0;j<nb2;j++)
263     {
264     MG_TRIANGLE* tri1=no1->get_lien_triangle()->get(i);
265     MG_TRIANGLE* tri2=no2->get_lien_triangle()->get(j);
266 francois 429 if ( (tri1==tri2) && (tri1!=tri) && (tri1->get_nouveau_numero()==1))
267 francois 425 {
268     OT_VECTEUR_3D vec1tmp(tri1->get_noeud1()->get_coord(),tri1->get_noeud2()->get_coord());
269     OT_VECTEUR_3D vec2tmp(tri1->get_noeud1()->get_coord(),tri1->get_noeud3()->get_coord());
270     OT_VECTEUR_3D normaltmp=vec1tmp&vec2tmp;
271     normaltmp.norme();
272     double psca=normal*normaltmp;
273 francois 426 if (psca<-cos(eps_angle_retourne)) nbretourne++;
274 francois 429 nbvoisin++;
275 francois 425 }
276     }
277 francois 429 for (int i=0;i<nb1;i++)
278     for (int j=0;j<nb3;j++)
279     {
280     MG_TRIANGLE* tri1=no1->get_lien_triangle()->get(i);
281     MG_TRIANGLE* tri2=no3->get_lien_triangle()->get(j);
282     if ( (tri1==tri2) && (tri1!=tri) && (tri1->get_nouveau_numero()==1))
283     {
284     OT_VECTEUR_3D vec1tmp(tri1->get_noeud1()->get_coord(),tri1->get_noeud2()->get_coord());
285     OT_VECTEUR_3D vec2tmp(tri1->get_noeud1()->get_coord(),tri1->get_noeud3()->get_coord());
286     OT_VECTEUR_3D normaltmp=vec1tmp&vec2tmp;
287     normaltmp.norme();
288     double psca=normal*normaltmp;
289     if (psca<-cos(eps_angle_retourne)) nbretourne++;
290     nbvoisin++;
291     }
292     }
293     for (int i=0;i<nb2;i++)
294     for (int j=0;j<nb3;j++)
295     {
296     MG_TRIANGLE* tri1=no2->get_lien_triangle()->get(i);
297     MG_TRIANGLE* tri2=no3->get_lien_triangle()->get(j);
298     if ( (tri1==tri2) && (tri1!=tri) && (tri1->get_nouveau_numero()==1))
299     {
300     OT_VECTEUR_3D vec1tmp(tri1->get_noeud1()->get_coord(),tri1->get_noeud2()->get_coord());
301     OT_VECTEUR_3D vec2tmp(tri1->get_noeud1()->get_coord(),tri1->get_noeud3()->get_coord());
302     OT_VECTEUR_3D normaltmp=vec1tmp&vec2tmp;
303     normaltmp.norme();
304     double psca=normal*normaltmp;
305     if (psca<-cos(eps_angle_retourne)) nbretourne++;
306     nbvoisin++;
307     }
308     }
309     if (nbvoisin!=3)
310 francois 805 tab[5]++;
311 francois 425 if (nbretourne>1) qual=-qual;
312     qualmoy=qualmoy+qual;
313     if (qual<qualmin) qualmin=qual;
314     if (qual>qualmax) qualmax=qual;
315 francois 805 if (qual<0.) tab[0]++;
316     else if (qual<borne1) tab[1]++;
317     else if (qual<borne2) tab[2]++;
318     else if (qual<borne3) tab[3]++;
319     else tab[4]++;
320 francois 425 if (sol!=NULL)
321     if (mai->get_nb_mg_tetra()==0) sol->ecrire(qual,itri,0);
322     itri++;
323     }
324 francois 805 qualmoy=qualmoy/nbtrifront;
325     }
326    
327     void MAILLEUR_ANALYSE::analyse_qualite_maillage_3D(MG_SOLUTION *sol,double &qualmin,double &qualmax,double &qualmoy,int *tab)
328 francois 425 {
329     qualmin=1e300,qualmax=-1e300,qualmoy=0.;
330 francois 805 tab[0]=0;tab[1]=0;tab[2]=0;tab[3]=0;tab[4]=0;
331     qualmin=1e300,qualmax=-1e300,qualmoy=0.;
332 francois 425 int itet=0;
333 francois 805 LISTE_MG_TETRA::iterator itt;
334 francois 425 for (MG_TETRA* tet=mai->get_premier_tetra(itt);tet!=NULL;tet=mai->get_suivant_tetra(itt))
335     {
336     double qual=OPERATEUR::qualite_tetra(tet->get_noeud1()->get_coord(),tet->get_noeud2()->get_coord(),tet->get_noeud3()->get_coord(),tet->get_noeud4()->get_coord());
337     OT_VECTEUR_3D vec1(tet->get_noeud1()->get_coord(),tet->get_noeud2()->get_coord());
338     OT_VECTEUR_3D vec2(tet->get_noeud1()->get_coord(),tet->get_noeud3()->get_coord());
339     OT_VECTEUR_3D vec3(tet->get_noeud1()->get_coord(),tet->get_noeud4()->get_coord());
340     OT_VECTEUR_3D pvec=vec1&vec2;
341     double psca=pvec*vec3;
342     if (psca<0.) qual=-qual;
343     qualmoy=qualmoy+qual;
344     if (qual<qualmin) qualmin=qual;
345     if (qual>qualmax) qualmax=qual;
346 francois 805 if (qual<0.) tab[0]++;
347     else if (qual<borne1) tab[1]++;
348     else if (qual<borne2) tab[2]++;
349     else if (qual<borne3) tab[3]++;
350     else tab[4]++;
351 francois 425 if (sol!=NULL)
352     sol->ecrire(qual,itet,0);
353     itet++;
354     }
355 francois 805 qualmoy=qualmoy/mai->get_nb_mg_tetra();
356     }
357    
358     void MAILLEUR_ANALYSE::analyse_validite_maillage_3D(int &nbsegcorrect,int &nbsegincorrect)
359     {
360    
361     nbsegcorrect=0;
362     nbsegincorrect=0;
363     LISTE_MG_SEGMENT::iterator its;
364 francois 425 for (MG_SEGMENT* seg=mai->get_premier_segment(its);seg!=NULL;seg=mai->get_suivant_segment(its))
365     if (seg->get_nouveau_numero()!=2)
366     {
367     MG_NOEUD* no1=seg->get_noeud1();
368     MG_NOEUD* no2=seg->get_noeud2();
369     int nb1=no1->get_lien_tetra()->get_nb();
370     int nb2=no2->get_lien_tetra()->get_nb();
371     double angletot=0;
372     for (int i=0;i<nb1;i++)
373     for (int j=0;j<nb2;j++)
374     {
375     MG_TETRA* tet1=no1->get_lien_tetra()->get(i);
376     MG_TETRA* tet2=no2->get_lien_tetra()->get(j);
377     if (tet1==tet2)
378     {
379     MG_NOEUD *nn1,*nn2,*nn3,*nn4;
380     if (tet1->get_noeud1()==no1) nn1=tet1->get_noeud1();
381     if (tet1->get_noeud2()==no1) nn1=tet1->get_noeud2();
382     if (tet1->get_noeud3()==no1) nn1=tet1->get_noeud3();
383     if (tet1->get_noeud4()==no1) nn1=tet1->get_noeud4();
384     if (tet1->get_noeud1()==no2) nn2=tet1->get_noeud1();
385     if (tet1->get_noeud2()==no2) nn2=tet1->get_noeud2();
386     if (tet1->get_noeud3()==no2) nn2=tet1->get_noeud3();
387     if (tet1->get_noeud4()==no2) nn2=tet1->get_noeud4();
388     if (tet1->get_noeud1()!=nn1)
389     if (tet1->get_noeud1()!=nn2) nn3=tet1->get_noeud1();
390     if (tet1->get_noeud2()!=nn1)
391     if (tet1->get_noeud2()!=nn2) nn3=tet1->get_noeud2();
392     if (tet1->get_noeud3()!=nn1)
393     if (tet1->get_noeud3()!=nn2) nn3=tet1->get_noeud3();
394     if (tet1->get_noeud4()!=nn1)
395     if (tet1->get_noeud4()!=nn2) nn3=tet1->get_noeud4();
396     if (tet1->get_noeud1()!=nn1)
397     if (tet1->get_noeud1()!=nn2)
398     if (tet1->get_noeud1()!=nn3) nn4=tet1->get_noeud1();
399     if (tet1->get_noeud2()!=nn1)
400     if (tet1->get_noeud2()!=nn2)
401     if (tet1->get_noeud2()!=nn3) nn4=tet1->get_noeud2();
402     if (tet1->get_noeud3()!=nn1)
403     if (tet1->get_noeud3()!=nn2)
404     if (tet1->get_noeud3()!=nn3) nn4=tet1->get_noeud3();
405     if (tet1->get_noeud4()!=nn1)
406     if (tet1->get_noeud4()!=nn2)
407     if (tet1->get_noeud4()!=nn3) nn4=tet1->get_noeud4();
408     double angle=get_angle_par_noeud<MG_NOEUD*>(nn1,nn2,nn3,nn1,nn2,nn4);
409     if (angle>M_PI) angle=2.*M_PI-angle;
410     angletot=angletot+angle;
411    
412     }
413     }
414     if ((angletot<2*M_PI-0.001) || (angletot>2*M_PI+0.001))
415     {
416 francois 805 char mess[255];
417 francois 425 sprintf(mess," segment %lu angle matiere autour de %.2lf",seg->get_id(),angletot); affiche(mess);
418     nbsegincorrect++;
419     }
420     else nbsegcorrect++;
421     }
422 francois 805 }
423 francois 514
424    
425 francois 577 void MAILLEUR_ANALYSE::compare_maillage_carte_isotrope(FCT_TAILLE* carte,char *nom,double *tab)
426 francois 514 {
427     MG_GESTIONNAIRE *gest=mai->get_gestionnaire();
428 francois 577 LISTE_MG_TETRA::iterator ittet;
429     double vol=0;
430     for (MG_TETRA* tet=mai->get_premier_tetra(ittet);tet!=NULL;tet=mai->get_suivant_tetra(ittet))
431     vol=vol+carte->calcul_volume_tetra_metrique(tet);
432     tab[0]=vol;
433     tab[1]=mai->get_nb_mg_tetra();
434     tab[2]=(tab[1]-tab[0])/tab[0]*100;
435 francois 514 MG_SOLUTION *sol=new MG_SOLUTION(mai,4,nom,1,"Comparaison_taille",MAGIC::ENTITE_SOLUTION::ENTITE_NOEUD,MAGIC::TYPE_SOLUTION::SCALAIRE);
436     gest->ajouter_mg_solution(sol);
437     sol->change_legende(0,(char*)"taille_reelle");
438     sol->change_legende(1,(char*)"taille_carte");
439     sol->change_legende(2,(char*)"erreur");
440     sol->change_legende(3,(char*)"erreur absolue");
441     LISTE_MG_NOEUD::iterator it;
442     int i=0;
443     for (MG_NOEUD* no=mai->get_premier_noeud(it);no!=NULL;no=mai->get_suivant_noeud(it))
444     {
445     double *xyz=no->get_coord();
446     double tenseur[9];
447 francois 532 carte->evaluer(xyz,tenseur);
448 francois 514 double cartetaille=1./sqrt(tenseur[0]);
449     int nbseg=no->get_lien_segment()->get_nb();
450     double taille=0.;
451 francois 532 int nbreelseg=0;
452 francois 514 for (int j=0;j<nbseg;j++)
453 francois 532 if (mai->get_mg_segmentid(no->get_lien_segment()->get(j)->get_id())!=NULL) {taille=taille+no->get_lien_segment()->get(j)->get_longueur();nbreelseg++;}
454     taille=taille/nbreelseg;
455 francois 514 double erreur=(taille-cartetaille)*100./cartetaille;
456     sol->ecrire(taille,i,0);
457     sol->ecrire(cartetaille,i,1);
458     sol->ecrire(erreur,i,2);
459     sol->ecrire(fabs(erreur),i,3);
460     i++;
461     }
462     }