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();