72 if (mg_geometrie!=NULL)
93 LISTE_MG_NOEUD::iterator it;
96 if ((no->get_lien_hexa()->get_nb()>0) || (no->get_lien_tetra()->get_nb()))
97 if (no->get_lien_segment()->get_nb()>0)
100 for (
int i=0;i<no->get_lien_segment()->get_nb();i++)
102 LISTE_MG_POUTRE::iterator itp;
104 if (pou->contient_element(no->get_lien_segment()->get(i))) {estjoint=
true;}
108 for (
int i=0;i<no->get_lien_segment()->get_nb();i++)
111 LISTE_MG_POUTRE::iterator itp;
112 int nbele2=no->get_lien_segment()->get(i)->get_lien_triangle()->get_nb();
113 for (
int j=0;j<nbele2;j++)
114 if (no->get_lien_segment()->get(i)->get_lien_triangle()->get(j)->get_lien_tetra()->get_nb()>0)
115 if (no->get_lien_segment()->get(i)->get_lien_triangle()->get(j)->get_lien_tetra()->get_nb()<2) bord=
true;
116 nbele2=no->get_lien_segment()->get(i)->get_lien_quadrangle()->get_nb();
117 for (
int j=0;j<nbele2;j++)
118 if (no->get_lien_segment()->get(i)->get_lien_quadrangle()->get(j)->get_lien_hexa()->get_nb()>0)
119 if (no->get_lien_segment()->get(i)->get_lien_quadrangle()->get(j)->get_lien_hexa()->get_nb()<2) bord=
true;
120 if (bord==
true) mini.
ajouter(no->get_lien_segment()->get(i));
128 LISTE_MG_TRIANGLE::iterator itt;
132 mini.
ajouter(tri->get_segment1());
133 mini.
ajouter(tri->get_segment2());
134 mini.
ajouter(tri->get_segment3());
137 LISTE_MG_QUADRANGLE::iterator itq;
141 mini.
ajouter(qua->get_segment1());
142 mini.
ajouter(qua->get_segment2());
143 mini.
ajouter(qua->get_segment3());
144 mini.
ajouter(qua->get_segment4());
155 LISTE_MG_NOEUD::iterator it_noeud;
157 std::vector<FEM_NOEUD*> lstnoeuddirect;
166 lstnoeuddirect.insert(lstnoeuddirect.end(),femnoeud);
171 fem-> ajouter_fem_element0(femele);
177 if (mg_geometrie==NULL)
183 if (mg_geometrie!=NULL)
191 if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==1)))
193 LISTE_MG_SEGMENT::iterator it_seg;
203 if (mg_geometrie!=NULL)
227 if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==2)))
229 LISTE_MG_TRIANGLE::iterator it_tri;
238 if (mg_geometrie!=NULL)
253 LISTE_MG_QUADRANGLE::iterator it_quad;
261 if (mg_geometrie!=NULL)
278 if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==3)))
280 LISTE_MG_TETRA::iterator it_tetra;
293 LISTE_MG_HEXA::iterator it_hex;
310 LISTE_MG_PENTA::iterator it_pen;
332 std::map<long,FEM_ELEMENT3*> map_tet_replace;
333 int size_map_tet_replace=map_tet_replace.size();
338 for (
int passe=0;passe<nbpasse;passe++)
341 sprintf(mess,
" Passe %d",passe+1);
343 LISTE_FEM_ELEMENT3::iterator itele3;
350 if ((dis<dismin-1e-12) || (jmin<0.))
354 for (
int i=1;i<9;i++)
356 if ((i==2) || (i==4))
continue;
357 double* xyzori=tet->get_fem_noeud(i)->get_coord_ori();
358 double* xyz=tet->get_fem_noeud(i)->get_coord();
367 while ((dis<dismin-1e-12)||(jmin<0.))
369 for (
int i=1;i<9;i++)
371 if ((i==2) || (i==4))
continue;
372 double* xyz=tet->get_fem_noeud(i)->get_coord();
373 tet->get_fem_noeud(i)->change_x(depart[i].get_x()-
pas*1./1./nbpas*vec[i].get_x());
374 tet->get_fem_noeud(i)->change_y(depart[i].get_y()-
pas*1./1./nbpas*vec[i].get_y());
375 tet->get_fem_noeud(i)->change_z(depart[i].get_z()-
pas*1./1./nbpas*vec[i].get_z());
381 map_tet_replace.insert(std::pair<long,FEM_ELEMENT3*>(tet->get_id(),tet));
382 if (passe==0) sprintf(mess,
" Tetra %lu replacé à %.2lf%% de sa position optimale\t jmin=%le distorsion=%le",tet->get_id(),100.-(
pas-1.)*1./nbpas*100.,jmin,dis);
383 else sprintf(mess,
" Tetra %lu replacé à %.2lf%% de sa position precedente\t jmin=%le distorsion=%le",tet->get_id(),100.-(
pas-1.)*1./nbpas*100.,jmin,dis);
388 if (size_map_tet_replace!=map_tet_replace.size()) nbpasse++;
389 size_map_tet_replace=map_tet_replace.size();
390 if (nbpasse>nbpassemax) nbpasse=nbpassemax;
394 long nb_tetra_replace = map_tet_replace.size();
396 sprintf(mess,
" Nb tetra replace : %li (%lf%%)",nb_tetra_replace,((
double)nb_tetra_replace/fem->
get_nb_fem_element3())*(
double)100.0);
408 if (mg_geometrie!=NULL)
416 LISTE_MG_NOEUD::iterator it_nd;
419 std::vector<FEM_NOEUD*> lstnoeuddirect;
429 lstnoeuddirect.insert(lstnoeuddirect.end(),femnoeud);
439 if (mg_geometrie==NULL)
448 LISTE_MG_SEGMENT::iterator it_seg;
462 double xori=0.5*(xyz1[0]+xyz2[0]);
463 double yori=0.5*(xyz1[1]+xyz2[1]);
464 double zori=0.5*(xyz1[2]+xyz2[2]);
469 double L3=0,L4=0,j=0.0;
470 double xyz[3]={xori,yori,zori};
479 double t=0.5*(t1+t2);
494 }
while (0.5-(L4/(L3+L4))>=0.0001);
509 }
while (0.5-(L3/(L3+L4))>=0.0001);
524 double L3=0,L4=0,j=0;
525 double xyz[3]={xori,yori,zori};
529 double uv1[2],uv2[2];
555 double uv[2],uv3[2],xyz3[3];
557 milieu[0]=0.5*(xyz1[0]+xyz2[0]);
558 milieu[1]=0.5*(xyz1[1]+xyz2[1]);
559 milieu[2]=0.5*(xyz1[2]+xyz2[2]);
576 double u3=(-u+u1)*j+u;
577 double v3=(-v+v1)*j+v;
584 }
while ( 0.5-(L4/(L3+L4)) >=0.0001);
597 double u3=(-u+u2)*j+u;
598 double v3=(-v+v2)*j+v;
606 }
while (0.5-(L3/(L3+L4)) >=0.0001);
622 double x=0.5*(xyz1[0]+xyz2[0]);
623 double y=0.5*(xyz1[1]+xyz2[1]);
624 double z=0.5*(xyz1[2]+xyz2[2]);
641 lstnoeuddirect.insert(lstnoeuddirect.end(),femnoeud);
644 if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==1)))
656 if (mg_geometrie!=NULL)
672 if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==2)))
674 LISTE_MG_TRIANGLE::iterator it_tri;
683 if (mg_geometrie!=NULL)
701 LISTE_MG_QUADRANGLE::iterator it_quad;
709 if (mg_geometrie!=NULL)
730 if ((mg_geometrie!=NULL) || ( (mg_geometrie==NULL) && (dimsansgeo==3)))
733 LISTE_MG_TETRA::iterator it_tetra;
756 LISTE_MG_HEXA::iterator it_hexa;
785 LISTE_MG_PENTA::iterator it_pen;
823 int nbdernierniveau=dernierniveau.
get_nb();
824 for (
int i=0;i<nbdernierniveau;i++)
833 nbdernierniveau=dernierniveau.
get_nb();
837 else delete graphtmp;
840 for (
int i=0;i<e+1;i++)
843 int nbnoeud=niveau.
get_nb();
844 for (
int j=0;j<nbnoeud;j++)
860 for (
int i=0;i<nbnoeud;i++)
874 LISTE_MG_TETRA::iterator it;
875 LISTE_MG_NOEUD::iterator itn;
876 LISTE_MG_TRIANGLE::iterator itt;
877 LISTE_MG_SEGMENT::iterator its;
880 tet->change_nouveau_numero(0);
881 tet->get_triangle1()->change_nouveau_numero(0);
882 tet->get_triangle2()->change_nouveau_numero(0);
883 tet->get_triangle3()->change_nouveau_numero(0);
884 tet->get_triangle4()->change_nouveau_numero(0);
888 if (tet->get_lien_topologie()!=NULL)
890 if (tet->get_triangle1()->get_nouveau_numero()==0)
891 tet->get_triangle1()->change_nouveau_numero(tet->get_lien_topologie()->get_id());
892 else if (tet->get_triangle1()->get_nouveau_numero()>2)
894 if (tet->get_triangle1()->get_nouveau_numero()==tet->get_lien_topologie()->get_id())
895 tet->get_triangle1()->change_nouveau_numero(2);
897 tet->get_triangle1()->change_nouveau_numero(1);
901 else tet->get_triangle1()->change_nouveau_numero(tet->get_triangle1()->get_nouveau_numero()+1);
903 if (tet->get_lien_topologie()!=NULL)
905 if (tet->get_triangle2()->get_nouveau_numero()==0)
906 tet->get_triangle2()->change_nouveau_numero(tet->get_lien_topologie()->get_id());
907 else if (tet->get_triangle2()->get_nouveau_numero()>2)
909 if (tet->get_triangle2()->get_nouveau_numero()==tet->get_lien_topologie()->get_id())
910 tet->get_triangle2()->change_nouveau_numero(2);
912 tet->get_triangle2()->change_nouveau_numero(1);
916 else tet->get_triangle2()->change_nouveau_numero(tet->get_triangle2()->get_nouveau_numero()+1);
918 if (tet->get_lien_topologie()!=NULL)
920 if (tet->get_triangle3()->get_nouveau_numero()==0)
921 tet->get_triangle3()->change_nouveau_numero(tet->get_lien_topologie()->get_id());
922 else if (tet->get_triangle3()->get_nouveau_numero()>2)
924 if (tet->get_triangle3()->get_nouveau_numero()==tet->get_lien_topologie()->get_id())
925 tet->get_triangle3()->change_nouveau_numero(2);
927 tet->get_triangle3()->change_nouveau_numero(1);
931 else tet->get_triangle3()->change_nouveau_numero(tet->get_triangle3()->get_nouveau_numero()+1);
933 if (tet->get_lien_topologie()!=NULL)
935 if (tet->get_triangle4()->get_nouveau_numero()==0)
936 tet->get_triangle4()->change_nouveau_numero(tet->get_lien_topologie()->get_id());
937 else if (tet->get_triangle4()->get_nouveau_numero()>2)
939 if (tet->get_triangle4()->get_nouveau_numero()==tet->get_lien_topologie()->get_id())
940 tet->get_triangle4()->change_nouveau_numero(2);
942 tet->get_triangle4()->change_nouveau_numero(1);
946 else tet->get_triangle4()->change_nouveau_numero(tet->get_triangle4()->get_nouveau_numero()+1);
951 LISTE_MG_FACE::iterator itf;
954 int nbele=face->get_lien_maillage()->get_nb();
955 for (
int i=0;i<nbele;i++)
964 seg->change_nouveau_numero(0);
967 if (tri->get_nouveau_numero()>2) tri->change_nouveau_numero(1);
968 if (tri->get_lien_topologie()!=NULL)
970 if ((((
MG_FACE_ELEMENT*)tri->get_lien_topologie())->get_nb_contrainte()>0))
980 if (tri->get_nouveau_numero()==1)
982 segaprojete[tri->get_segment1()]=tri->get_segment1();
983 segaprojete[tri->get_segment2()]=tri->get_segment2();
984 segaprojete[tri->get_segment3()]=tri->get_segment3();
1004 std::map<MG_NOEUD*,std::pair<int,int> > etoilesegment;
1005 std::map<MG_NOEUD*,std::pair<MG_TRIANGLE*,MG_TRIANGLE*> > etoilesegmenttriangle;
1016 if (not1==no) {nobase1=not2;nobase2=not3;}
1017 if (not2==no) {nobase1=not3;nobase2=not1;}
1018 if (not3==no) {nobase1=not1;nobase2=not2;}
1019 if (etoilesegment.count(nobase1)==0) etoilesegment[nobase1].first=1;
else etoilesegment[nobase1].second=1;
1020 if (etoilesegment.count(nobase2)==0) etoilesegment[nobase2].first=-1;
else etoilesegment[nobase2].second=-1;
1021 if (etoilesegmenttriangle.count(nobase1)==0) etoilesegmenttriangle[nobase1].first=tri;
else etoilesegmenttriangle[nobase1].second=tri;
1022 if (etoilesegmenttriangle.count(nobase2)==0) etoilesegmenttriangle[nobase2].first=tri;
else etoilesegmenttriangle[nobase2].second=tri;
1024 if (passe==0)
return false;
1026 std::map<MG_NOEUD*,std::pair<int,int> > :: iterator itseg=etoilesegment.begin();
1033 if (etoilesegmenttriangle[segcour].first!=tricour) tricour=etoilesegmenttriangle[segcour].first;
else tricour=etoilesegmenttriangle[segcour].second;
1034 if (etoilesegment[segcour].first*etoilesegment[segcour].second>0) sens=-sens;
1050 while (segcour!=segdepart);
1056 r=PP1*PP1/2./(n*PP1);
1075 if (def1==
false)
return;
1076 if (def2==
false)
return;
1077 double r=0.5*(r1+r2);
1084 dist=fabs(r)-
sqrt(dist);
1085 if (r>0) dist=-dist;
1087 xyz[0]=xyz[0]+dist*n.
get_x();
1088 xyz[1]=xyz[1]+dist*n.
get_y();
1089 xyz[2]=xyz[2]+dist*n.
get_z();
int get_excentricite(void)
TPL_MAP_ENTITE< FEM_NOEUD * > & get_niveau(int num)
TPL_MAP_ENTITE< FEM_NOEUD * > & get_dernier_niveau(void)
double get_distorsion2(class FEM_ELEMENT2 *tri)
double get_jmin(class FEM_ELEMENT2 *tri)
double get_distance_curviligne(double a, double b, double *xyz1, double *xyz, double *xyz2)
void change_param_structure(BOITE_3D btmp, int nxtmp, int nytmp, int nztmp)
MG_MAILLAGE * get_mg_maillage(void)
unsigned int get_nb_fem_element3(void)
FEM_ELEMENT3 * get_suivant_element3(LISTE_FEM_ELEMENT3::iterator &it)
FEM_NOEUD * ajouter_fem_noeud(MG_NOEUD *mgnoeud, unsigned long num=0)
FEM_NOEUD * get_fem_noeud(unsigned int num)
FEM_ELEMENT3 * get_premier_element3(LISTE_FEM_ELEMENT3::iterator &it)
unsigned int get_nb_fem_noeud(void)
int ajouter_fem_element3(FEM_ELEMENT3 *femelement3)
int ajouter_fem_element1(FEM_ELEMENT1 *femsegment)
int ajouter_fem_element2(FEM_ELEMENT2 *femtriangle)
int ajouter_fem_element0(FEM_ELEMENT0 *femnoeud)
void change_numero_opt(int num)
void change_numero(int num)
virtual void affiche(char *mess)
std::map< MG_NOEUD *, OT_VECTEUR_3D > liste_normale
virtual int construire_lineaire(class FEM_MAILLAGE *fem, TPL_MAP_ENTITE< MG_SEGMENT * > &mini, MG_MAILLAGE *maillage, MG_GEOMETRIE *mg_geometrie)
virtual void recherche_connexion_multidimension(TPL_MAP_ENTITE< class MG_SEGMENT * > &mini, class MG_MAILLAGE *maillage, class MG_GEOMETRIE *mg_geometrie)
bool get_courbure_noeud(class MG_NOEUD *no, MG_NOEUD *dirno, class OT_VECTEUR_3D &n, double &r)
virtual int recal_element_quadratique(FEM_MAILLAGE *fem)
virtual int maille(class FEM_MAILLAGE *fem, bool courbure_discrete=false, int num=0)
virtual void get_quad_seg(MG_SEGMENT *seg, bool virtuel, double *xyz)
std::map< MG_SEGMENT *, MG_SEGMENT * > segnonprojete
MAILLEUR_FEM(class OT_CPU *comp=NULL)
virtual int construire_quadratique(class FEM_MAILLAGE *fem, TPL_MAP_ENTITE< MG_SEGMENT * > &mini, MG_MAILLAGE *maillage, MG_GEOMETRIE *mg_geometrie, bool courbure_discrete)
virtual void copie_numerotation_opt(FEM_MAILLAGE *fem)
std::map< MG_NOEUD *, MG_NOEUD * > noeudcourburenulle
virtual void optimise_numerotation(FEM_MAILLAGE *fem)
virtual void prepare_quad_discrete(class MG_MAILLAGE *mai, bool virtuel)
std::map< MG_SEGMENT *, MG_SEGMENT * > segaprojete
virtual void evaluer(double t, double *xyz)
virtual class MG_COURBE * get_courbe(void)
virtual void inverser(double &t, double *xyz, double precision=1e-6)
virtual int est_periodique(void)=0
virtual double get_periode(void)=0
virtual int get_nouveau_numero(void)
MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
virtual void change_nouveau_numero(int num)
virtual int get_dimension(void)=0
virtual void inverser(double *uv, double *xyz, double precision=1e-6)
virtual void evaluer(double *uv, double *xyz)
virtual MG_SURFACE * get_surface(void)
MG_POUTRE * get_suivant_poutre(LISTE_MG_POUTRE::iterator &it)
unsigned int get_nb_mg_poutre(void)
MG_FACE * get_premier_face(LISTE_MG_FACE::iterator &it)
char * get_type_geometrie(void)
MG_POUTRE * get_premier_poutre(LISTE_MG_POUTRE::iterator &it)
unsigned int get_nb_mg_volume(void)
MG_FACE * get_suivant_face(LISTE_MG_FACE::iterator &it)
virtual MG_NOEUD * get_noeud4(void)
virtual MG_NOEUD * get_noeud5(void)
virtual MG_NOEUD * get_noeud6(void)
virtual MG_NOEUD * get_noeud7(void)
virtual MG_NOEUD * get_noeud2(void)
virtual MG_NOEUD * get_noeud8(void)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud3(void)
MG_GEOMETRIE * get_mg_geometrie(void)
MG_TETRA * get_premier_tetra(LISTE_MG_TETRA::iterator &it)
MG_PENTA * get_suivant_penta(LISTE_MG_PENTA::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)
bool get_param_structure(BOITE_3D &btmp, int &nxtmp, int &nytmp, int &nztmp)
unsigned int get_nb_mg_noeud(void)
unsigned int get_nb_mg_hexa(void)
MG_SEGMENT * get_mg_segment(unsigned int num)
unsigned int get_nb_mg_quadrangle(void)
unsigned int get_nb_mg_tetra(void)
MG_PENTA * get_premier_penta(LISTE_MG_PENTA::iterator &it)
MG_QUADRANGLE * get_suivant_quadrangle(LISTE_MG_QUADRANGLE::iterator &it)
virtual double * get_coord(void)
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_triangle(void)
virtual MG_NOEUD * get_noeud5(void)
virtual MG_NOEUD * get_noeud2(void)
virtual MG_NOEUD * get_noeud4(void)
virtual MG_NOEUD * get_noeud6(void)
virtual MG_NOEUD * get_noeud3(void)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_SEGMENT * get_segment2(void)
virtual MG_NOEUD * get_noeud3(void)
virtual MG_SEGMENT * get_segment1(void)
virtual MG_SEGMENT * get_segment3(void)
virtual MG_SEGMENT * get_segment4(void)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud2(void)
virtual MG_NOEUD * get_noeud4(void)
virtual MG_NOEUD * get_noeud1(void)
virtual double get_longueur(void)
virtual MG_NOEUD * get_noeud2(void)
virtual int est_periodique_u(void)=0
virtual double get_periode_u(void)=0
virtual int est_periodique_v(void)=0
virtual double get_periode_v(void)=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)
virtual MG_SEGMENT * get_segment2(void)
virtual MG_SEGMENT * get_segment3(void)
virtual MG_SEGMENT * get_segment1(void)
double decalage_parametre_v(double par, double dpar)
double calcul_decalage_parametre_v(double par)
double calcul_decalage_parametre_u(double par)
double decalage_parametre_u(double par, double dpar)
double get_valeur(std::string chaine, int num=0)
virtual double get_z(void) const
virtual void change_x(double x)
virtual void change_z(double z)
virtual double get_longueur(void) const
virtual double get_y(void) const
virtual double get_x(void) const
virtual void change_y(double y)
virtual X get_premier(ITERATEUR &it)
virtual X get_suivant(ITERATEUR &it)
virtual void ajouter(X x)
double2 sqrt(double2 &val)