95 sprintf(mess,
"ANALYSEUR DE FEM MAILLAGE 3D");
97 sprintf(mess,
"---------------------------");
100 sprintf(mess,
"Constitution du maillage");
108 sprintf(mess,
" Maillage numero : %lu degre : %d",
fem->
get_id(),degre);
affiche(mess);
109 sprintf(mess,
" %d noeuds",nbnoeud);
affiche(mess);
110 sprintf(mess,
" %d elements 1D",nbele1);
affiche(mess);
112 LISTE_FEM_ELEMENT1::iterator it1;
113 int nbseg2=0,nbseg3=0;
116 if (ele->get_nb_fem_noeud()==2) nbseg2++;
117 if (ele->get_nb_fem_noeud()==3) nbseg3++;
119 if (degre==1) {sprintf(mess,
" %d segment2",nbseg2);
affiche(mess); }
120 if (degre==2) {sprintf(mess,
" %d segment3",nbseg3);
affiche(mess); }
121 sprintf(mess,
" %d elements 2D",nbele2);
affiche(mess);
122 LISTE_FEM_ELEMENT2::iterator it2;
123 int nbtri3=0,nbtri6=0,nbquad4=0,nbquad8=0;
126 if (ele->get_nb_fem_noeud()==3) nbtri3++;
127 if (ele->get_nb_fem_noeud()==6) nbtri6++;
128 if (ele->get_nb_fem_noeud()==4) nbquad4++;
129 if (ele->get_nb_fem_noeud()==8) nbquad8++;
131 if (degre==1) {sprintf(mess,
" %d triangle3",nbtri3);
affiche(mess); }
132 if (degre==2) {sprintf(mess,
" %d triangle6",nbtri6);
affiche(mess); }
133 if (degre==1) {sprintf(mess,
" %d quadrangle4",nbquad4);
affiche(mess); }
134 if (degre==2) {sprintf(mess,
" %d quadrangle8",nbquad8);
affiche(mess); }
135 sprintf(mess,
" %d elements 3D",nbele3);
affiche(mess);
136 LISTE_FEM_ELEMENT3::iterator it3;
137 int nbtet4=0,nbtet10=0,nbhex8=0,nbhex20=0,nbpenta5=0,nbpenta15=0;
140 if (ele->get_nb_fem_noeud()==4) nbtet4++;
141 if (ele->get_nb_fem_noeud()==10) nbtet10++;
142 if (ele->get_nb_fem_noeud()==8) nbhex8++;
143 if (ele->get_nb_fem_noeud()==20) nbhex20++;
144 if (ele->get_nb_fem_noeud()==5) nbpenta5++;
145 if (ele->get_nb_fem_noeud()==15) nbpenta15++;
147 if (degre==1) {sprintf(mess,
" %d tetra4",nbtet4);
affiche(mess); }
148 if (degre==2) {sprintf(mess,
" %d tetra10",nbtet10);
affiche(mess); }
149 if (degre==1) {sprintf(mess,
" %d hex8",nbhex8);
affiche(mess); }
150 if (degre==2) {sprintf(mess,
" %d hex20",nbhex20);
affiche(mess); }
151 if (degre==1) {sprintf(mess,
" %d penta5",nbpenta5);
affiche(mess); }
152 if (degre==2) {sprintf(mess,
" %d penta15",nbpenta15);
affiche(mess); }
154 sprintf(mess,
"Qualité du maillage");
166 std::string nomsol=nom;nomsol=nomsol+
".sol";
177 sprintf(mess,
" Qualité des triangle6");
180 double jminmin=1e300,jmaxmax=1e-300,dismoy=0,dismin=1e300,dismax=-1e300;
185 if (ele->get_nb_fem_noeud()==6)
192 if (jmin<jminmin) jminmin=jmin;
193 if (jmax>jmaxmax) jmaxmax=jmax;
194 if (dis<dismin) dismin=dis;
195 if (dis>dismax) dismax=dis;
206 sprintf(mess,
" Jacobien min %le",jminmin);
208 sprintf(mess,
" Jacobien max %le",jmaxmax);
210 sprintf(mess,
" Distortion min %lf",dismin);
212 sprintf(mess,
" Distortion moy %lf",dismoy/nb);
214 sprintf(mess,
" Distortion max %lf",dismax);
220 sprintf(mess,
" Qualité des tetra10");
223 double jminmin=1e300,jmaxmax=1e-300,dismoy=0,dismin=1e300,dismax=-1e300;
228 if (ele->get_nb_fem_noeud()==10)
235 if (jmin<jminmin) jminmin=jmin;
236 if (jmax>jmaxmax) jmaxmax=jmax;
237 if (dis<dismin) dismin=dis;
238 if (dis>dismax) dismax=dis;
250 sprintf(mess,
" Erreur maille numero %d identificateur %lu\n Jmin=%lf Jmax=%lf Distorsion=%lf Qualite lineaire=%lf\n",i,ele->get_id(),jmin,jmax,dis,qual);
257 sprintf(mess,
" Jacobien min %le",jminmin);
259 sprintf(mess,
" Jacobien max %le",jmaxmax);
261 sprintf(mess,
" Distortion min %lf",dismin);
263 sprintf(mess,
" Distortion moy %lf",dismoy/nb);
265 sprintf(mess,
" Distortion max %lf",dismax);
271 std::string nomf=nom;
283 sprintf(mess,
"ANALYSEUR DE MG MAILLAGE 3D");
285 sprintf(mess,
"---------------------------");
288 sprintf(mess,
"Constitution du maillage");
291 int nbnofront,nbsegfront,nbtrifront,nbquadfront;
300 sprintf(mess,
" %d noeuds frontiere",nbnofront);
affiche(mess);
301 sprintf(mess,
" %d segments frontiere",nbsegfront);
affiche(mess);
302 sprintf(mess,
" %d triangles frontiere",nbtrifront);
affiche(mess);
303 sprintf(mess,
" %d quadrangles frontiere",nbquadfront);
affiche(mess);
affiche((
char*)
"");
309 std::string nomsol=nom;nomsol=nomsol+
".sol";
319 sprintf(mess,
"Analyse maillage triangulaire 2D");
322 double qualmin,qualmax,qualmoy;
325 sprintf(mess,
" Nombre de triangles avec des noeuds fusionnés : %d",tab[6]);
affiche(mess);
326 sprintf(mess,
" Nombre de triangles avec 1 voisin manquant : %d",tab[5]);
affiche(mess);
328 sprintf(mess,
" qualite moyenne des triangles de frontiere : %lf",qualmoy);
affiche(mess);
329 sprintf(mess,
" qualite min des triangles de frontiere : %lf",qualmin);
affiche(mess);
330 sprintf(mess,
" qualite max des triangles de frontiere : %lf",qualmax);
affiche(mess);
331 sprintf(mess,
" nombre de triangles de frontiere >%lf : %d (%.2lf%%)",
borne3,tab[4],tab[4]*100./nbtrifront);
affiche(mess);
332 sprintf(mess,
" nombre de triangles de frontiere >%lf : %d (%.2lf%%)",
borne2,tab[3],tab[3]*100./nbtrifront);
affiche(mess);
333 sprintf(mess,
" nombre de triangles de frontiere >%lf : %d (%.2lf%%)",
borne1,tab[2],tab[2]*100./nbtrifront);
affiche(mess);
334 sprintf(mess,
" nombre de triangles de frontiere >%lf : %d (%.2lf%%)",0.,tab[1],tab[1]*100./nbtrifront);
affiche(mess);
335 sprintf(mess,
" nombre de triangles de frontiere retournes : %d (%.2lf%%)",tab[0],tab[0]*100./nbtrifront);
affiche(mess);
affiche((
char*)
"");
340 sprintf(mess,
"Analyse maillage tetraedrique 3D");
343 double qualmin,qualmax,qualmoy;
346 sprintf(mess,
" qualite moyenne des tetra : %lf",qualmoy);
affiche(mess);
348 {sprintf(mess,
" qualite min des tetra : %lf",qualmin);
affiche(mess); }
350 {sprintf(mess,
" qualite min des tetra : %le",qualmin);
affiche(mess); }
351 sprintf(mess,
" qualite max des tetra : %lf",qualmax);
affiche(mess);
358 sprintf(mess,
"Validite maillage tétraedrique 3D");
361 int nbsegcorrect,nbsegincorrect;
364 sprintf(mess,
" segment correct %d(%.2lf%%) segment incorrect %d(%.2lf%%) ",nbsegcorrect,nbsegcorrect*100./(nbsegcorrect+nbsegincorrect),nbsegincorrect,nbsegincorrect*100./(nbsegcorrect+nbsegincorrect));
affiche(mess);
370 std::string nomf=nom;
379 LISTE_MG_NOEUD::iterator itn;
381 no->change_nouveau_numero(0);
383 LISTE_MG_SEGMENT::iterator its;
385 seg->change_nouveau_numero(0);
388 LISTE_MG_TRIANGLE::iterator ittr;
390 tri->change_nouveau_numero(0);
392 LISTE_MG_QUADRANGLE::iterator itq;
394 quad->change_nouveau_numero(0);
396 LISTE_MG_TETRA::iterator itt;
399 tet->get_triangle1()->change_nouveau_numero(tet->get_triangle1()->get_nouveau_numero()+1);
400 tet->get_triangle2()->change_nouveau_numero(tet->get_triangle2()->get_nouveau_numero()+1);
401 tet->get_triangle3()->change_nouveau_numero(tet->get_triangle3()->get_nouveau_numero()+1);
402 tet->get_triangle4()->change_nouveau_numero(tet->get_triangle4()->get_nouveau_numero()+1);
405 LISTE_MG_HEXA::iterator ith;
408 hex->get_quadrangle1()->change_nouveau_numero(hex->get_quadrangle1()->get_nouveau_numero()+1);
409 hex->get_quadrangle2()->change_nouveau_numero(hex->get_quadrangle2()->get_nouveau_numero()+1);
410 hex->get_quadrangle3()->change_nouveau_numero(hex->get_quadrangle3()->get_nouveau_numero()+1);
411 hex->get_quadrangle4()->change_nouveau_numero(hex->get_quadrangle4()->get_nouveau_numero()+1);
412 hex->get_quadrangle5()->change_nouveau_numero(hex->get_quadrangle5()->get_nouveau_numero()+1);
413 hex->get_quadrangle6()->change_nouveau_numero(hex->get_quadrangle6()->get_nouveau_numero()+1);
419 tri->change_nouveau_numero(1);
420 if (tri->get_nouveau_numero()==1)
423 tri->get_segment1()->change_nouveau_numero(tri->get_segment1()->get_nouveau_numero()+1);
424 tri->get_segment2()->change_nouveau_numero(tri->get_segment2()->get_nouveau_numero()+1);
425 tri->get_segment3()->change_nouveau_numero(tri->get_segment3()->get_nouveau_numero()+1);
426 tri->get_noeud1()->change_nouveau_numero(1);
427 tri->get_noeud2()->change_nouveau_numero(1);
428 tri->get_noeud3()->change_nouveau_numero(1);
436 quad->change_nouveau_numero(1);
437 if (quad->get_nouveau_numero()==1)
440 quad->get_segment1()->change_nouveau_numero(quad->get_segment1()->get_nouveau_numero()+1);
441 quad->get_segment2()->change_nouveau_numero(quad->get_segment2()->get_nouveau_numero()+1);
442 quad->get_segment3()->change_nouveau_numero(quad->get_segment3()->get_nouveau_numero()+1);
443 quad->get_segment4()->change_nouveau_numero(quad->get_segment4()->get_nouveau_numero()+1);
444 quad->get_noeud1()->change_nouveau_numero(1);
445 quad->get_noeud2()->change_nouveau_numero(1);
446 quad->get_noeud3()->change_nouveau_numero(1);
447 quad->get_noeud4()->change_nouveau_numero(1);
452 if (seg->get_nouveau_numero()==2) nbsegfront++;
455 if (no->get_nouveau_numero()==1) nbnofront++;
460 int nbnofront,nbsegfront,nbtrifront,nbquadfront;
462 qualmin=1e300,qualmax=-1e300,qualmoy=0.;
463 tab[0]=0;tab[1]=0;tab[2]=0;tab[3]=0;tab[4]=0;tab[5]=0;tab[6]=0;
465 LISTE_MG_TRIANGLE::iterator ittr;
467 if (tri->get_nouveau_numero()==1)
469 double qual=
OPERATEUR::qualite_triangle(tri->get_noeud1()->get_coord(),tri->get_noeud2()->get_coord(),tri->get_noeud3()->get_coord());
479 OT_VECTEUR_3D vec1(tri->get_noeud1()->get_coord(),tri->get_noeud2()->get_coord());
480 OT_VECTEUR_3D vec2(tri->get_noeud1()->get_coord(),tri->get_noeud3()->get_coord());
485 for (
int i=0;i<nb1;i++)
486 for (
int j=0;j<nb2;j++)
496 double psca=normal*normaltmp;
501 for (
int i=0;i<nb1;i++)
502 for (
int j=0;j<nb3;j++)
512 double psca=normal*normaltmp;
517 for (
int i=0;i<nb2;i++)
518 for (
int j=0;j<nb3;j++)
528 double psca=normal*normaltmp;
535 if (nbretourne>1) qual=-qual;
536 qualmoy=qualmoy+qual;
537 if (qual<qualmin) qualmin=qual;
538 if (qual>qualmax) qualmax=qual;
539 if (qual<0.) tab[0]++;
540 else if (qual<
borne1) tab[1]++;
541 else if (qual<
borne2) tab[2]++;
542 else if (qual<
borne3) tab[3]++;
548 qualmoy=qualmoy/nbtrifront;
553 qualmin=1e300,qualmax=-1e300,qualmoy=0.;
554 tab[0]=0;tab[1]=0;tab[2]=0;tab[3]=0;tab[4]=0;
555 qualmin=1e300,qualmax=-1e300,qualmoy=0.;
557 LISTE_MG_TETRA::iterator itt;
560 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());
561 OT_VECTEUR_3D vec1(tet->get_noeud1()->get_coord(),tet->get_noeud2()->get_coord());
562 OT_VECTEUR_3D vec2(tet->get_noeud1()->get_coord(),tet->get_noeud3()->get_coord());
563 OT_VECTEUR_3D vec3(tet->get_noeud1()->get_coord(),tet->get_noeud4()->get_coord());
565 double psca=pvec*vec3;
566 if (psca<0.) qual=-qual;
567 qualmoy=qualmoy+qual;
568 if (qual<qualmin) qualmin=qual;
569 if (qual>qualmax) qualmax=qual;
570 if (qual<0.) tab[0]++;
571 else if (qual<
borne1) tab[1]++;
572 else if (qual<
borne2) tab[2]++;
573 else if (qual<
borne3) tab[3]++;
587 LISTE_MG_SEGMENT::iterator its;
589 if (seg->get_nouveau_numero()!=2)
596 for (
int i=0;i<nb1;i++)
597 for (
int j=0;j<nb2;j++)
632 double angle=get_angle_par_noeud<MG_NOEUD*>(nn1,nn2,nn3,nn1,nn2,nn4);
633 if (angle>M_PI) angle=2.*M_PI-angle;
634 angletot=angletot+angle;
638 if ((angletot<2*M_PI-0.001) || (angletot>2*M_PI+0.001))
641 sprintf(mess,
" segment %lu angle matiere autour de %.2lf",seg->get_id(),angletot);
affiche(mess);
652 LISTE_MG_TETRA::iterator ittet;
658 tab[2]=(tab[1]-tab[0])/tab[0]*100;
665 LISTE_MG_NOEUD::iterator it;
669 double *xyz=no->get_coord();
672 double cartetaille=1./
sqrt(tenseur[0]);
673 int nbseg=no->get_lien_segment()->get_nb();
676 for (
int j=0;j<nbseg;j++)
677 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++;}
678 taille=taille/nbreelseg;
679 double erreur=(taille-cartetaille)*100./cartetaille;
681 sol->
ecrire(cartetaille,i,1);
683 sol->
ecrire(fabs(erreur),i,3);
virtual double calcul_volume_tetra_metrique(class MG_TETRA *tet)
virtual void evaluer(double *param, double *resultat)=0
double get_distorsion2(class FEM_ELEMENT2 *tri)
double get_jmin(class FEM_ELEMENT2 *tri)
double get_jmax(class FEM_ELEMENT2 *tri)
unsigned int get_nb_fem_element2(void)
FEM_ELEMENT2 * get_premier_element2(LISTE_FEM_ELEMENT2::iterator &it)
unsigned int get_nb_fem_element1(void)
MG_MAILLAGE * get_mg_maillage(void)
unsigned int get_nb_fem_element3(void)
FEM_ELEMENT3 * get_suivant_element3(LISTE_FEM_ELEMENT3::iterator &it)
FEM_ELEMENT3 * get_premier_element3(LISTE_FEM_ELEMENT3::iterator &it)
unsigned int get_nb_fem_noeud(void)
FEM_ELEMENT2 * get_suivant_element2(LISTE_FEM_ELEMENT2::iterator &it)
FEM_ELEMENT1 * get_premier_element1(LISTE_FEM_ELEMENT1::iterator &it)
FEM_ELEMENT1 * get_suivant_element1(LISTE_FEM_ELEMENT1::iterator &it)
void change_legende(int num, std::string val)
void ecrire(double val, int i, int j, int coord=0, int num_no=0)
int get_entite_solution(void)
virtual void affiche(char *mess)
virtual void change_borne(double val1, double val2, double val3)
double eps_angle_retourne
virtual void analyse_qualite_maillage_3D(class MG_SOLUTION *sol, double &qualmin, double &qualmax, double &qualmoy, int *tab)
MAILLEUR_ANALYSE(MG_MAILLAGE *m, OT_CPU *comp=NULL)
virtual void get_borne(double &val1, double &val2, double &val3)
virtual void analyse_mg(char *nom=NULL)
virtual void analyse_qualite_maillage_2D(class MG_SOLUTION *sol, double &qualmin, double &qualmax, double &qualmoy, int *tab)
virtual ~MAILLEUR_ANALYSE()
virtual void denombre_maillage(int &nbnofront, int &nbsegfront, int &nbtrifront, int &nbquadfront)
virtual void change_eps_angle_retourne(double val)
virtual void analyse_validite_maillage_3D(int &nbsegcorrect, int &nbsegincorrect)
virtual void analyse_fem(char *nom=NULL)
virtual void compare_maillage_carte_isotrope(FCT_TAILLE *carte, char *nom, double *tab)
virtual void analyse(char *nom=NULL)
virtual double get_eps_angle_retourne(void)
virtual int get_nouveau_numero(void)
int ajouter_fem_solution(FEM_SOLUTION *mgsol)
int ajouter_mg_solution(MG_SOLUTION *mgsol)
virtual void enregistrer(std::ostream &o, double version=MAGIC_VERSION_FICHIER_DOUBLE)
MG_TETRA * get_premier_tetra(LISTE_MG_TETRA::iterator &it)
MG_TETRA * get_suivant_tetra(LISTE_MG_TETRA::iterator &it)
unsigned int get_nb_mg_segment(void)
unsigned int get_nb_mg_triangle(void)
MG_SEGMENT * get_premier_segment(LISTE_MG_SEGMENT::iterator &)
MG_TRIANGLE * get_premier_triangle(LISTE_MG_TRIANGLE::iterator &it)
MG_TRIANGLE * get_suivant_triangle(LISTE_MG_TRIANGLE::iterator &it)
MG_HEXA * get_suivant_hexa(LISTE_MG_HEXA::iterator &it)
MG_HEXA * get_premier_hexa(LISTE_MG_HEXA::iterator &it)
MG_NOEUD * get_premier_noeud(LISTE_MG_NOEUD::iterator &it)
MG_SEGMENT * get_suivant_segment(LISTE_MG_SEGMENT::iterator &)
MG_NOEUD * get_suivant_noeud(LISTE_MG_NOEUD::iterator &it)
MG_QUADRANGLE * get_premier_quadrangle(LISTE_MG_QUADRANGLE::iterator &it)
unsigned int get_nb_mg_noeud(void)
MG_SEGMENT * get_mg_segmentid(unsigned long num)
unsigned int get_nb_mg_hexa(void)
MG_GESTIONNAIRE * get_gestionnaire(void)
unsigned int get_nb_mg_quadrangle(void)
unsigned int get_nb_mg_tetra(void)
MG_QUADRANGLE * get_suivant_quadrangle(LISTE_MG_QUADRANGLE::iterator &it)
TPL_LISTE_ENTITE< class MG_TETRA * > * get_lien_tetra(void)
virtual double * get_coord(void)
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_triangle(void)
void change_legende(int num, std::string val)
void ecrire(double val, int i, int j, int coord=0, int num_no=0)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud2(void)
virtual MG_NOEUD * get_noeud4(void)
virtual MG_NOEUD * get_noeud3(void)
virtual MG_NOEUD * get_noeud3(void)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud2(void)
static double qualite_triangle(double *noeud1, double *noeud2, double *noeud3)
static double qualite_tetra(double *noeud1, double *noeud2, double *noeud3, double *noeud4)
double2 sqrt(double2 &val)
double2 cos(double2 &val)